scales.hpp cmath concepts expected string serif/dimensions/dimensions.hpp src/compile_time_checks/serif/solver/normalization/algebra.cpp src/include/serif/backend/mfem/model/normalized_system.hpp src/include/serif/solver/normalization/configuration.hpp src/include/serif/solver/normalization/detail/factor_computations.hpp src/include/serif/solver/normalization/normalization.hpp src/lib/serif/solver/normalization/scales.cpp serif::solver::normalization::StellarReferenceScales serif serif::solver serif::solver::normalization #pragmaonce #include<cmath> #include<concepts> #include<expected> #include<string> #include"serif/dimensions/dimensions.hpp" namespaceserif::solver::normalization { structStellarReferenceScalesfinal { dimensions::QuantityValue<dimensions::Mass>mass; dimensions::QuantityValue<dimensions::Length>radius; dimensions::QuantityValue<dimensions::GravitationalConstant>gravitational_constant; dimensions::QuantityValue<dimensions::MassDensity>density; dimensions::QuantityValue<dimensions::Acceleration>acceleration; dimensions::QuantityValue<dimensions::InverseTimeSquared>inverse_time_squared; dimensions::QuantityValue<dimensions::SpecificEnergy>specific_energy; dimensions::QuantityValue<dimensions::Pressure>pressure; dimensions::QuantityValue<dimensions::AngularVelocity>angular_velocity; dimensions::QuantityValue<dimensions::AngularMomentum>angular_momentum; dimensions::QuantityValue<dimensions::Force>force; friendbooloperator==(constStellarReferenceScales&,constStellarReferenceScales&)=default; }; [[nodiscard]]std::expected<StellarReferenceScales,std::string>prepare_stellar_reference_scales( dimensions::QuantityValue<dimensions::Mass>mass, dimensions::QuantityValue<dimensions::Length>radius, dimensions::QuantityValue<dimensions::GravitationalConstant>gravitational_constant=dimensions::QuantityValue<dimensions::GravitationalConstant>{1.0}); template<typenameQuantity> conceptStellarScaleQuantity=std::same_as<Quantity,dimensions::Dimensionless>||std::same_as<Quantity,dimensions::Mass>|| std::same_as<Quantity,dimensions::Length>||std::same_as<Quantity,dimensions::MassDensity>|| std::same_as<Quantity,dimensions::Acceleration>||std::same_as<Quantity,dimensions::InverseTimeSquared>|| std::same_as<Quantity,dimensions::SpecificEnergy>||std::same_as<Quantity,dimensions::SpecificEnthalpy>|| std::same_as<Quantity,dimensions::BarotropicPressurePotential>|| std::same_as<Quantity,dimensions::GravitationalPotential>||std::same_as<Quantity,dimensions::Pressure>|| std::same_as<Quantity,dimensions::AngularVelocity>||std::same_as<Quantity,dimensions::AngularAcceleration>||std::same_as<Quantity,dimensions::AngularMomentum>|| std::same_as<Quantity,dimensions::Force>||std::same_as<Quantity,dimensions::PressureLaplacian>|| std::same_as<Quantity,dimensions::Velocity>||std::same_as<Quantity,dimensions::MassDensityRate>||std::same_as<Quantity,dimensions::ForceDensity>; template<StellarScaleQuantityQuantity> [[nodiscard]]dimensions::QuantityValue<Quantity>characteristic_scale(constStellarReferenceScales&scales,Quantity) { ifconstexpr(std::same_as<Quantity,dimensions::Dimensionless>) { returndimensions::QuantityValue<Quantity>{1.0}; } elseifconstexpr(std::same_as<Quantity,dimensions::Mass>) { returnscales.mass; } elseifconstexpr(std::same_as<Quantity,dimensions::Length>) { returnscales.radius; } elseifconstexpr(std::same_as<Quantity,dimensions::MassDensity>) { returnscales.density; } elseifconstexpr(std::same_as<Quantity,dimensions::Acceleration>) { returnscales.acceleration; } elseifconstexpr(std::same_as<Quantity,dimensions::InverseTimeSquared>||std::same_as<Quantity,dimensions::AngularAcceleration>) { returndimensions::QuantityValue<Quantity>{scales.inverse_time_squared.value()}; } elseifconstexpr(std::same_as<Quantity,dimensions::SpecificEnergy>||std::same_as<Quantity,dimensions::SpecificEnthalpy>|| std::same_as<Quantity,dimensions::BarotropicPressurePotential>||std::same_as<Quantity,dimensions::GravitationalPotential>) { returndimensions::QuantityValue<Quantity>{scales.specific_energy.value()}; } elseifconstexpr(std::same_as<Quantity,dimensions::Pressure>) { returnscales.pressure; } elseifconstexpr(std::same_as<Quantity,dimensions::Velocity>) { returndimensions::QuantityValue<Quantity>{std::sqrt(scales.specific_energy.value())}; } elseifconstexpr(std::same_as<Quantity,dimensions::MassDensityRate>) { returndimensions::QuantityValue<Quantity>{scales.density.value()*scales.angular_velocity.value()}; } elseifconstexpr(std::same_as<Quantity,dimensions::ForceDensity>) { returndimensions::QuantityValue<Quantity>{scales.density.value()*scales.acceleration.value()}; } elseifconstexpr(std::same_as<Quantity,dimensions::PressureLaplacian>) { returndimensions::QuantityValue<Quantity>{scales.pressure.value()/(scales.radius.value()*scales.radius.value())}; } elseifconstexpr(std::same_as<Quantity,dimensions::AngularVelocity>) { returnscales.angular_velocity; } elseifconstexpr(std::same_as<Quantity,dimensions::AngularMomentum>) { returnscales.angular_momentum; } else { returnscales.force; } } }