polytropic.hpp serif/solver/continuation/family.hpp serif/solver/continuation/stellar_parameters.hpp src/compile_time_checks/serif/solver/continuation.cpp src/include/serif/solver/continuation/continuation.hpp serif::solver::continuation::PreservePressureAtReferenceDensity serif serif::solver serif::solver::continuation #pragmaonce #include"serif/solver/continuation/family.hpp" #include"serif/solver/continuation/stellar_parameters.hpp" namespaceserif::solver::continuation{ classPreservePressureAtReferenceDensityfinal{ public: usingOutputParameter=PolytropicConstant; usingDependencyParameters=ParameterList<PolytropicIndex>; explicitPreservePressureAtReferenceDensity(dimensions::DensityValuedensity):m_density(density){ utils::errors::serif_ensure<utils::errors::SERiFErrorCode::INVALID_ARGUMENT, std::invalid_argument>( std::isfinite(density.value())&&density.value()>0.0,"Pressure-referencedensitymustbefiniteandpositive."); } template<model::StellarModelTypeModel> requiresModel::templatecontains_specification<eos::models::Polytrope> [[nodiscard]]autobind(constModel&target)const{ constauto&eos=target.templatespecification<eos::models::Polytrope>(); constdoubleindex=eos.polytropic_index(); constdoubleconstant=eos.polytropic_constant(); constdoubledensity=m_density.value(); constdoublepressure=eos.evaluate(eos::relations::PressureFromDensity{},m_density).value(); utils::errors::serif_ensure<utils::errors::SERiFErrorCode::INVALID_ARGUMENT, std::invalid_argument>( std::isfinite(pressure)&&pressure>0.0,"Thetargetpressureatthereferencedensitymustbefiniteandpositive."); returnlaw(PolytropicConstant{},depends_on(PolytropicIndex{}),[index,constant,density](doublecandidate){ if(candidate==index){ returnconstant; } returnstd::exp(std::log(constant)+(1.0/index-1.0/candidate)*std::log(density)); }); } private: dimensions::DensityValuem_density; }; [[nodiscard]]inlineautopreserve_pressure_at_reference_density(dimensions::DensityValuedensity){ returnPreservePressureAtReferenceDensity{density}; } }