module; #include #include export module mean_field:model.structure.polytropic; export import :eos.polytrope; export import :model.structure.base; import :utils.misc; export namespace mean_field::models::structure { class PolytropicStructure final : public StructureBase { public: explicit PolytropicStructure( eos::Polytrope equationOfState, double targetMass ); [[nodiscard]] const eos::EquationOfState &equationOfState() const noexcept override; [[nodiscard]] double targetMass() const noexcept override; [[nodiscard]] StructureSeed makeInitialSeed(const StructureSeedRequest &request) const override; void validate() const override; private: struct LaneEmdenPoint { double coordinate{0.0}; double value{0.0}; double derivative{0.0}; }; struct LaneEmdenDerivative { double value{0.0}; double derivative{0.0}; }; static void validateSeedRequest(const StructureSeedRequest &request); [[nodiscard]] static LaneEmdenDerivative evaluateLaneEmdenRhs( double coordinate, double value, double derivative, double polytropicIndex ); [[nodiscard]] static LaneEmdenPoint takeLaneEmdenStep( const LaneEmdenPoint &point, double step, double polytropicIndex ); [[nodiscard]] static std::vector solveLaneEmden(double polytropicIndex); [[nodiscard]] static double interpolateLaneEmdenValue( const std::vector &solution, double coordinate, std::size_t &lowerIndex ); eos::Polytrope m_equationOfState; double m_targetMass; }; } // namespace mean_field::models::structure