module; #include export module mean_field:mapping.kelvin; export import :mapping.compactification; export import :mapping.types; export import :mapping.compactification.options; export namespace mean_field::mapping::compactification { class KelvinCompactification final : public ExteriorDomainMap { public: explicit KelvinCompactification(options::KelvinCompactificationOptions options); [[nodiscard]] MappingStatus Evaluate( const ExteriorMapInput &input, ExteriorMapResult &result ) const override; [[nodiscard]] MappingStatus EvaluateVariation( const ExteriorMapInput &input, const ExteriorMapResult &result, const ExteriorMapDirection &direction, ExteriorMapVariation &variation ) const override; [[nodiscard]] std::string_view GetName() const noexcept override; [[nodiscard]] double GetReferenceStellarRadius() const noexcept; [[nodiscard]] double GetReferenceInfinityRadius() const noexcept; [[nodiscard]] double GetCoordinateTolerance() const noexcept; private: struct RadialFactors { double coordinate; double computational_radius; double scale; double scale_derivative; }; [[nodiscard]] MappingStatus ComputeRadialFactors( double compactification_coordinate, RadialFactors &factors ) const; options::KelvinCompactificationOptions m_options; }; } // namespace mean_field::mapping::compactification