normalized_system.hpp algorithm cmath expected memory string vector serif/backend/mfem/model/system.hpp serif/backend/mfem/solver/normalization/operators.hpp serif/solver/normalization/scales.hpp serif/utils/error/errors.hpp src/include/serif/backend/mfem/model/normalization/computations.hpp src/include/serif/backend/mfem/model/preconditioned_system.hpp serif::model::backend::mfem::NormalizedSystem serif serif::model serif::model::backend serif::model::backend::mfem #pragmaonce #include<algorithm> #include<cmath> #include<expected> #include<memory> #include<string> #include<vector> #include"serif/backend/mfem/model/system.hpp" #include"serif/backend/mfem/solver/normalization/operators.hpp" #include"serif/solver/normalization/scales.hpp" #include"serif/utils/error/errors.hpp" namespaceserif::model::backend::mfem{ classNormalizedSystemfinal{ public: NormalizedSystem(std::shared_ptr<constPhysicalSystem>physical, solver::normalization::DiagonalNormalizationcoordinates,solver::normalization::StellarReferenceScalesscales): m_physical(checked_physical(std::move(physical))),m_scales(std::move(scales)), m_jacobian(*m_physical->jacobian().action(),std::move(coordinates)),m_residual(m_physical->residual().size()){ m_jacobian.normalization().normalize_residual(m_physical->residual(),m_residual); } [[nodiscard]]conststd::shared_ptr<constPhysicalSystem>&physical()constnoexcept{ returnm_physical; } [[nodiscard]]constsolver::normalization::DiagonalNormalization&coordinates()constnoexcept{ returnm_jacobian.normalization(); } [[nodiscard]]constsolver::normalization::StellarReferenceScales&reference_scales()constnoexcept{ returnm_scales; } [[nodiscard]]conststd::vector<double>&residual()constnoexcept{ returnm_residual; } [[nodiscard]]constsolver::normalization::backend::mfem::ScaledJacobianOperator&jacobian()constnoexcept{ returnm_jacobian; } private: [[nodiscard]]staticstd::shared_ptr<constPhysicalSystem>checked_physical(std::shared_ptr<constPhysicalSystem>physical){ usingnamespaceutils::errors; serif_ensure<SERiFErrorCode::INVALID_ARGUMENT>(physical!=nullptr,"Normalizedcoordinatesrequireanfrozenphysicalsystem.Preparethestellarmodelfirst."); returnphysical; } std::shared_ptr<constPhysicalSystem>m_physical; solver::normalization::StellarReferenceScalesm_scales; solver::normalization::backend::mfem::ScaledJacobianOperatorm_jacobian; std::vector<double>m_residual; }; [[nodiscard]]inlinestd::expected<std::shared_ptr<constNormalizedSystem>,std::string>make_normalized_system( std::shared_ptr<constPhysicalSystem>physical,solver::normalization::DiagonalNormalizationcoordinates, solver::normalization::StellarReferenceScalesreference){ autoresult=std::make_shared<constNormalizedSystem>(std::move(physical),std::move(coordinates),std::move(reference)); if(!std::ranges::all_of(result->residual(),[](doublevalue){returnstd::isfinite(value);})){ returnstd::unexpected("Thenormalizedstellarresidualisnotfinite.Checkthereferencescalesandthephysicalcandidate."); } returnresult; } }