configuration.hpp concepts expected string tuple utility serif/dimensions/type_alias.hpp serif/solver/normalization/scales.hpp serif/utils/dependencies/dependency_context.hpp serif/utils/laneemden/laneemden.hpp src/include/serif/model/normalization/plan.hpp src/include/serif/model/normalization/reference.hpp src/include/serif/solver/normalization/normalization.hpp src/include/serif/utils/serialize/numerics.hpp serif::solver::normalization::FromModel serif::solver::normalization::AutomaticPlan serif::solver::normalization::Dimensionless serif::solver::normalization::LaneEmdenApproximation serif::solver::normalization::NormalizationOptions serif serif::solver serif::solver::normalization #pragmaonce #include<concepts> #include<expected> #include<string> #include<tuple> #include<utility> #include"serif/dimensions/type_alias.hpp" #include"serif/solver/normalization/scales.hpp" #include"serif/utils/dependencies/dependency_context.hpp" #include"serif/utils/laneemden/laneemden.hpp" namespaceserif::solver::normalization{ structFromModelfinal{}; structAutomaticPlanfinal{}; structDimensionlessfinal{}; template<typenameMass=FromModel,typenameCentralDensity=FromModel> requires(std::same_as<Mass,FromModel>||std::same_as<Mass,dimensions::MassValue>)&& (std::same_as<CentralDensity,FromModel>||std::same_as<CentralDensity,dimensions::DensityValue>) structLaneEmdenApproximationfinal{ doublen{3.0}; Massmass; CentralDensitycentral_density; utils::laneemden::IntegrationOptionsintegration{}; }; template<typenameScheme=LaneEmdenApproximation<>,typenameCoordinates=Dimensionless, typenamePlan=AutomaticPlan,typenameSources=utils::dependencies::DependencyContext<>,typenameComputations=std::tuple<>> requiresstd::same_as<Coordinates,Dimensionless>&&utils::dependencies::IsDependencyContext<Sources> structNormalizationOptionsfinal{ Schemescheme; Coordinatescoordinates{}; Planplan; dimensions::QuantityValue<dimensions::GravitationalConstant>gravitational_constant{1.0}; Sourcessources; Computationscomputations; }; template<typenameScheme,typenameCoordinates,typenamePlan,typenameSources,typenameComputations> [[nodiscard]]automake_normalization(NormalizationOptions<Scheme, Coordinates, Plan, Sources, Computations>options){ returnoptions; } [[nodiscard]]inlineautomake_normalization(){ returnNormalizationOptions<>{}; } [[nodiscard]]inlinestd::expected<StellarReferenceScales,std::string>prepare_reference_scales( constLaneEmdenApproximation<dimensions::MassValue,dimensions::DensityValue>&scheme, dimensions::QuantityValue<dimensions::GravitationalConstant>gravitational_constant){ constautosolution=utils::laneemden::solve(scheme.n,scheme.integration); if(!solution){ returnstd::unexpected(solution.error()); } constautoreference=utils::laneemden::scale_from_mass(*solution,scheme.mass,scheme.central_density,gravitational_constant); if(!reference){ returnstd::unexpected(reference.error()); } returnprepare_stellar_reference_scales(reference->mass,reference->radius,gravitational_constant); } [[nodiscard]]inlinestd::expected<StellarReferenceScales,std::string>prepare_reference_scales( constStellarReferenceScales&reference,dimensions::QuantityValue<dimensions::GravitationalConstant>gravitational_constant){ if(reference.gravitational_constant!=gravitational_constant){ returnstd::unexpected("Theexplicitnormalizationreferenceandconfigurationusedifferentgravitationalconstants.SupplyoneGinthemodel'sunits."); } returnprepare_stellar_reference_scales(reference.mass,reference.radius,gravitational_constant); } template<typenameScheme> conceptReferenceScheme=requires(constScheme&scheme,dimensions::QuantityValue<dimensions::GravitationalConstant>gravity){ {prepare_reference_scales(scheme,gravity)}->std::same_as<std::expected<StellarReferenceScales,std::string>>; }; }