reference.hpp utility serif/model/description.hpp serif/solver/normalization/configuration.hpp src/include/serif/model/configured_discretization.hpp serif serif::model serif::model::normalization serif::model::normalization::detail #pragmaonce #include<utility> #include"serif/model/description.hpp" #include"serif/solver/normalization/configuration.hpp" namespaceserif::model::normalization{ namespacedetail{ template<typenameSource,typenameModel,typenameSpecification> conceptReferenceAvailable=!std::same_as<Source,solver::normalization::FromModel>||Model::templatecontains_specification<Specification>; template<typenameSpecification,typenameSource,typenameModel> requiresReferenceAvailable<Source, Model, Specification> [[nodiscard]]autoreference_value(constSource&source,constModel&model){ ifconstexpr(std::same_as<Source,solver::normalization::FromModel>){ returnmodel.templatespecification<Specification>().target(); }else{ returnsource; } } } template<typenameMass,typenameDensity,StellarModelTypeModel> requiresdetail::ReferenceAvailable<Mass, Model, FixedTotalMass>&&std::same_as<Density,dimensions::DensityValue> [[nodiscard]]autoresolve_reference(constsolver::normalization::LaneEmdenApproximation<Mass, Density>&scheme,constModel&model){ returnsolver::normalization::LaneEmdenApproximation<dimensions::MassValue, dimensions::DensityValue>{ .n=scheme.n, .mass=detail::reference_value<FixedTotalMass>(scheme.mass,model), .central_density=scheme.central_density, .integration=scheme.integration }; } template<solver::normalization::ReferenceSchemeScheme,StellarModelTypeModel> [[nodiscard]]Schemeresolve_reference(constScheme&scheme,constModel&){ returnscheme; } template<typenameOptions,typenameModel> conceptReferenceResolvable=requires(constOptions&options,constModel&model){ resolve_reference(options.scheme,model); }; template<typenameOptions,StellarModelTypeModel> requiresReferenceResolvable<Options, Model> [[nodiscard]]autoresolve_configuration(Optionsoptions,constModel&model){ returnsolver::normalization::NormalizationOptions{ .scheme=resolve_reference(options.scheme,model), .coordinates=options.coordinates, .plan=options.plan, .gravitational_constant=options.gravitational_constant, .sources=std::move(options.sources), .computations=std::move(options.computations) }; } }