#include #include #include #include #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 concept CanScaleMass = requires(const laneemden::Solution &solution, Mass mass, Density density, Gravity gravity) { { laneemden::scale_from_mass(solution, mass, density, gravity) } -> std::same_as>; }; static_assert(CanScaleMass, dimensions::QuantityValue, dimensions::QuantityValue>); static_assert(!CanScaleMass); static_assert(!CanScaleMass, dimensions::QuantityValue, dimensions::QuantityValue>); static_assert(!CanScaleMass, dimensions::QuantityValue, dimensions::QuantityValue>); static_assert(std::same_as>); static_assert(std::equality_comparable); static_assert(std::formattable); static_assert(std::formattable); /** @brief Literal formatting must parse selectors at compile time for both levels of the profile. */ constexpr std::format_string sample_formats{"{} {:all} {:xi} {:theta} {:derivative}"}; constexpr std::format_string solution_formats{"{} {:all} {:xi} {:theta} {:derivative}"}; }