33 lines
2.1 KiB
C++
33 lines
2.1 KiB
C++
#include <concepts>
|
|
#include <expected>
|
|
#include <format>
|
|
#include <string>
|
|
|
|
#include "serif/utils/laneemden/laneemden.hpp"
|
|
|
|
namespace {
|
|
namespace laneemden = serif::utils::laneemden;
|
|
namespace dimensions = serif::dimensions;
|
|
|
|
/** @brief Physical reference inputs must carry their distinct dimensions. */
|
|
template <typename Mass, typename Density, typename Gravity>
|
|
concept CanScaleMass = requires(const laneemden::Solution &solution, Mass mass, Density density, Gravity gravity) {
|
|
{ laneemden::scale_from_mass(solution, mass, density, gravity) } -> std::same_as<std::expected<laneemden::PhysicalScales, std::string>>;
|
|
};
|
|
|
|
static_assert(CanScaleMass<dimensions::QuantityValue<dimensions::Mass>, dimensions::QuantityValue<dimensions::MassDensity>, dimensions::QuantityValue<dimensions::GravitationalConstant>>);
|
|
static_assert(!CanScaleMass<double, double, double>);
|
|
static_assert(!CanScaleMass<dimensions::QuantityValue<dimensions::Length>, dimensions::QuantityValue<dimensions::MassDensity>, dimensions::QuantityValue<dimensions::GravitationalConstant>>);
|
|
static_assert(!CanScaleMass<dimensions::QuantityValue<dimensions::Mass>, dimensions::QuantityValue<dimensions::Length>, dimensions::QuantityValue<dimensions::GravitationalConstant>>);
|
|
static_assert(std::same_as<decltype(laneemden::solve(3.0)), std::expected<laneemden::Solution, std::string>>);
|
|
static_assert(std::equality_comparable<laneemden::IntegrationOptions>);
|
|
static_assert(std::formattable<laneemden::Sample, char>);
|
|
static_assert(std::formattable<laneemden::Solution, char>);
|
|
|
|
/** @brief Literal formatting must parse selectors at compile time for both levels of the profile. */
|
|
constexpr std::format_string<laneemden::Sample, laneemden::Sample, laneemden::Sample, laneemden::Sample, laneemden::Sample>
|
|
sample_formats{"{} {:all} {:xi} {:theta} {:derivative}"};
|
|
constexpr std::format_string<laneemden::Solution, laneemden::Solution, laneemden::Solution, laneemden::Solution, laneemden::Solution>
|
|
solution_formats{"{} {:all} {:xi} {:theta} {:derivative}"};
|
|
}
|