problem.hpp concepts expected functional memory utility serif/model/backend/mfem/system.hpp serif/model/keys.hpp serif/utils/dependencies/computation_cache.hpp serif/utils/error/errors.hpp src/include/serif/model/backend/mfem/equilibrium.hpp serif::model::backend::mfem::StellarProblem serif serif::model serif::model::backend serif::model::backend::mfem #pragmaonce #include<concepts> #include<expected> #include<functional> #include<memory> #include<utility> #include"serif/model/backend/mfem/system.hpp" #include"serif/model/keys.hpp" #include"serif/utils/dependencies/computation_cache.hpp" #include"serif/utils/error/errors.hpp" namespaceserif::model::backend::mfem{ template<typenameGraph,typenameInputs,typenameLayout,typenameFailure> classStellarProblemfinal{ public: usingCache=utils::dependencies::ComputationCache<Graph, Inputs, Failure>; usingInputContext=Inputs; usingPreparationResult=std::expected<typenameCache::Report,typenameCache::Failure>; StellarProblem(Graphgraph,Layoutlayout):m_cache(std::move(graph)),m_layout(std::move(layout)){ } template<utils::dependencies::IsKeyListRequested=utils::dependencies::KeyList<keys::PhysicalSystem>> [[nodiscard]]PreparationResulttry_prepare(constInputs&inputs,Requestedrequested={}, utils::dependencies::PreparationModemode=utils::dependencies::PreparationMode::reuse_unchanged){ constautoresult=m_cache.try_prepare(inputs,requested,mode); if(result&&m_cache.templatecontains<keys::PhysicalSystem>()){ m_accepted=m_cache.templateget<keys::PhysicalSystem>(); } returnresult; } template<typenameInputFactory,utils::dependencies::IsKeyListRequested=utils::dependencies::KeyList<keys::PhysicalSystem>> requiresstd::invocable<InputFactory&>&&std::same_as<std::invoke_result_t<InputFactory&>,std::expected<Inputs,Failure>> [[nodiscard]]PreparationResulttry_prepare_inputs(InputFactory&&make_inputs,Requestedrequested={}, utils::dependencies::PreparationModemode=utils::dependencies::PreparationMode::reuse_unchanged){ m_cache.clear_preparation(); std::expected<Inputs,Failure>inputs=std::invoke(make_inputs); if(!inputs){ returnstd::unexpected(typenameCache::Failure{.computation_index=Graph::size,.error=std::move(inputs.error())}); } returntry_prepare(*inputs,requested,mode); } [[nodiscard]]conststd::shared_ptr<constAcceptedSystem>&accepted()const{ usingnamespaceutils::errors; serif_ensure<SERiFErrorCode::INVALID_ARGUMENT>(m_accepted!=nullptr,"Thestellarproblemhasnoacceptedstate.SuccessfullyprepareaphysicalsystembeforerequestingitsresidualorJacobian."); returnm_accepted; } [[nodiscard]]constLayout&layout()constnoexcept{ returnm_layout; } [[nodiscard]]constCache&cache()constnoexcept{ returnm_cache; } private: Cachem_cache; Layoutm_layout; std::shared_ptr<constAcceptedSystem>m_accepted; }; template<typenameFailure,typenameGraph,typenameInputs,typenameLayout> [[nodiscard]]automake_stellar_problem(Graphgraph,constInputs&,Layoutlayout){ returnStellarProblem<Graph, Inputs, Layout, Failure>(std::move(graph),std::move(layout)); } }