equilibrium.hpp serif/backend/mfem/solver/nonlinear/stellar_problem.hpp serif/solver/preconditioner/default_preconditioners.hpp src/include/serif/solver/equilibrium.hpp serif serif::solver serif::solver::backend serif::solver::backend::mfem serif::solver::backend::mfem::detail #pragmaonce #include"serif/backend/mfem/solver/nonlinear/stellar_problem.hpp" #include"serif/solver/preconditioner/default_preconditioners.hpp" namespaceserif::solver::backend::mfem{ namespacedetail{ [[nodiscard]]autosolver_computations(constauto&strategies){ return[&strategies](constauto&bound,constauto&layout,autoresult_key,constauto&existing){ auto[evaluation,linear]=strategies.computations(bound,layout,result_key,existing); returnstd::pair{std::tuple_cat(std::move(evaluation), admissibility::backend::mfem::make_geometry_computations(bound)),std::move(linear)}; }; } template<typenameModel,typenameFiniteElements,typenameNormalization,typenamePreconditioner,typenameLayout> [[nodiscard]]autowith_default_preconditioner(model::DiscretizationOptions<Model, FiniteElements, Normalization, Preconditioner>configuration, constLayout&layout){ ifconstexpr(std::same_as<Preconditioner,model::preconditioning::None>){ static_assert(preconditioner::PrimalPreconditionerLayout<Layout>, "Thisfieldlayouthasnodefaultequilibriuminverse.Supplyapreconditionerrecipeinthediscretizationoptions."); autoinverse=preconditioner::make_primal_preconditioner(layout); returnmodel::DiscretizationOptions{ .model=std::move(configuration.model),.finite_elements=std::move(configuration.finite_elements), .normalization=std::move(configuration.normalization),.preconditioner=std::move(inverse)}; }else{ returnconfiguration; } } } [[nodiscard]]automake_observed_stellar_problem(autoconfiguration,constauto&state,constauto&strategies, operators::backend::mfem::VolumeOptionsvolume_options,autoprescribed,autoobserver_factory,constauto&...geometry){ autoselected=detail::with_default_preconditioner(std::move(configuration),state.layout()); autoevaluator=model::backend::mfem::bind_stellar_model(std::move(selected),state,geometry..., volume_options,prescribed,detail::solver_computations(strategies),std::move(observer_factory)); returnStellarProblem{std::move(evaluator),std::move(prescribed),geometry...}; } }