stellar_parameters.hpp cmath serif/solver/continuation/parameters.hpp serif/eos/models/polytropic.hpp serif/model/specifications/fixed_angular_momentum.hpp serif/model/specifications/fixed_total_mass.hpp src/include/serif/solver/continuation/polytropic.hpp serif::solver::continuation::PolytropicIndex serif::solver::continuation::PolytropicConstant serif::solver::continuation::AngularMomentum serif::solver::continuation::SpecificationTraits< eos::models::Polytrope > serif::solver::continuation::SpecificationTraits< model::FixedAngularMomentum > serif::solver::continuation::SpecificationTraits< Specification > serif serif::solver serif::solver::continuation #pragmaonce #include<cmath> #include"serif/solver/continuation/parameters.hpp" #include"serif/eos/models/polytropic.hpp" #include"serif/model/specifications/fixed_angular_momentum.hpp" #include"serif/model/specifications/fixed_total_mass.hpp" namespaceserif::solver::continuation{ structPolytropicConstant; structPolytropicIndexfinal{ usingSpecification=eos::models::Polytrope; usingValue=double; usingRequiredDependentParameters=ParameterList<PolytropicConstant>; staticconstexprstd::string_viewname="polytropicindex"; staticconstexprstd::string_viewstable_id="polytrope.index"; [[nodiscard]]staticdoubleread(constSpecification&value)noexcept{returnvalue.polytropic_index();} [[nodiscard]]staticboolvalid(doublevalue)noexcept{returnstd::isfinite(value)&&value>=1.0;} [[nodiscard]]staticdoublestarting_value(double)noexcept{return1.0;} }; structPolytropicConstantfinal{ usingSpecification=eos::models::Polytrope; usingValue=double; staticconstexprstd::string_viewname="polytropicconstant"; staticconstexprstd::string_viewstable_id="polytrope.constant"; [[nodiscard]]staticdoubleread(constSpecification&value)noexcept{returnvalue.polytropic_constant();} [[nodiscard]]staticboolvalid(doublevalue)noexcept{returnstd::isfinite(value)&&value>0.0;} }; structAngularMomentumfinal{ usingSpecification=model::FixedAngularMomentum; usingValue=dimensions::AngularMomentumValue; staticconstexprstd::string_viewname="angularmomentum"; staticconstexprstd::string_viewstable_id="fixed_angular_momentum.target"; [[nodiscard]]staticValueread(constSpecification&value)noexcept{returnvalue.target();} [[nodiscard]]staticboolvalid(Valuevalue)noexcept{returnstd::isfinite(value.value())&&value.value()>=0.0;} [[nodiscard]]staticValuestarting_value(Value)noexcept{returnValue{0.0};} }; template<> structSpecificationTraits<eos::models::Polytrope>{ usingParameters=ParameterList<PolytropicIndex, PolytropicConstant>; [[nodiscard]]staticstd::array<double,2>identity(consteos::models::Polytrope&value)noexcept{ return{value.polytropic_index(),value.polytropic_constant()}; } template<typenameValues> [[nodiscard]]staticeos::models::Polytroperebuild(consteos::models::Polytrope&,constValues&values){ returneos::models::Polytrope{values.get(PolytropicIndex{}),values.get(PolytropicConstant{})}; } [[nodiscard]]staticeos::models::Polytropeclone(consteos::models::Polytrope&value){returnvalue;} }; template<> structSpecificationTraits<model::FixedAngularMomentum>{ usingParameters=ParameterList<AngularMomentum>; [[nodiscard]]staticstd::array<double,7>identity(constmodel::FixedAngularMomentum&value)noexcept{ return{value.target().value(),value.axis()[0],value.axis()[1],value.axis()[2],value.center()[0],value.center()[1],value.center()[2]}; } template<typenameValues> [[nodiscard]]staticmodel::FixedAngularMomentumrebuild(constmodel::FixedAngularMomentum&value,constValues&values){ returnmodel::FixedAngularMomentum{{.angular_momentum=values.get(AngularMomentum{}),.axis=value.axis(),.center=value.center()}}; } [[nodiscard]]staticmodel::FixedAngularMomentumclone(constmodel::FixedAngularMomentum&value){returnvalue;} }; template<typenameSpecification> requiresstd::same_as<Specification,model::FixedTotalMass> structSpecificationTraits<Specification>{ [[nodiscard]]staticstd::array<double,1>identity(constSpecification&value)noexcept{return{value.target().value()};} [[nodiscard]]staticSpecificationclone(constSpecification&value){returnvalue;} }; }