polytrope.hpp array concepts expected optional string serif/eos/models/polytropic.hpp serif/model/stellar_model.hpp serif/model/specifications/fixed_total_mass.hpp serif/model/specifications/fixed_angular_momentum.hpp serif/utils/laneemden/laneemden.hpp src/compile_time_checks/serif/solver/public_contracts.cpp src/include/serif/solver/seed/fitted.hpp src/include/serif/solver/solver.hpp src/lib/serif/solver/seed/polytrope.cpp serif::solver::seed::PolytropeOptions serif::solver::seed::RadialSeed serif serif::solver serif::solver::seed #pragmaonce #include<array> #include<concepts> #include<expected> #include<optional> #include<string> #include"serif/eos/models/polytropic.hpp" #include"serif/model/stellar_model.hpp" #include"serif/model/specifications/fixed_total_mass.hpp" #include"serif/model/specifications/fixed_angular_momentum.hpp" #include"serif/utils/laneemden/laneemden.hpp" namespaceserif::solver::seed{ structPolytropeOptionsfinal{ dimensions::QuantityValue<dimensions::GravitationalConstant>gravitational_constant{1.0}; std::optional<dimensions::DensityValue>central_density; utils::laneemden::IntegrationOptionsintegration; }; structRadialSeedfinal{ utils::laneemden::Solutionsolution; utils::laneemden::PhysicalScalesscales; doublemoment_of_inertia{}; doubleangular_velocity{}; std::array<double,3>center{}; }; [[nodiscard]]std::expected<RadialSeed,std::string>make_polytropic_seed( consteos::models::Polytrope&equation_of_state,dimensions::MassValuemass,PolytropeOptionsoptions={}); template<model::StellarModelTypeModel> requiresstd::same_as<typenameModel::EquationOfState,eos::models::Polytrope>&&Model::templatecontains_specification<model::FixedTotalMass> [[nodiscard]]std::expected<RadialSeed,std::string>make_polytropic_seed(constModel&model,PolytropeOptionsoptions={}){ autoseed=make_polytropic_seed(model.equation_of_state(),model.templatespecification<model::FixedTotalMass>().target(),options); if(seed){ ifconstexpr(Model::templatecontains_specification<model::FixedAngularMomentum>){ constauto&rotation=model.templatespecification<model::FixedAngularMomentum>(); seed->angular_velocity=rotation.target().value()/seed->moment_of_inertia; seed->center=rotation.center(); } } returnseed; } }