gravity.hpp serif/solver/preconditioner/recipes/gravity.hpp serif/solver/preconditioner/computations/inverse.hpp serif/solver/preconditioner/backend/mfem/gravity/factorization.hpp serif/solver/preconditioner/backend/mfem/gravity/schur.hpp src/include/serif/solver/preconditioner/graph.hpp serif serif::solver serif::solver::preconditioner serif::solver::preconditioner::computations #pragmaonce #include"serif/solver/preconditioner/recipes/gravity.hpp" #include"serif/solver/preconditioner/computations/inverse.hpp" #include"serif/solver/preconditioner/backend/mfem/gravity/factorization.hpp" #include"serif/solver/preconditioner/backend/mfem/gravity/schur.hpp" namespaceserif::solver::preconditioner::computations { template<typenameGradient,typenamePotential> [[nodiscard]]autogravity_schur() { usingnamespaceutils::dependencies; returnmake_computation<keys::GravitySchur<Gradient,Potential>,InputList<keys::Matrix<KeyList<Potential>,KeyList<Gradient>>,keys::Diagonal<KeyList<Gradient>,KeyList<Gradient>>>>( [](conststd::shared_ptr<const::mfem::SparseMatrix>&divergence,conststd::vector<double>&mass_diagonal) { returnbackend::mfem::try_gravity_schur(*divergence,mass_diagonal); }); } template<typenameGradient,typenamePotential,typenameStrategy> [[nodiscard]]autogravity_potential_inverse(constStrategy&strategy) { usingnamespaceutils::dependencies; returnmake_computation<keys::GravityPotentialInverse<Gradient,Potential>,InputList<keys::GravitySchur<Gradient,Potential>>>( [strategy](conststd::shared_ptr<const::mfem::SparseMatrix>&schur) { returninvert_matrix(schur,strategy); }); } template<typenameGradient,typenamePotential,typenameMassStrategy,typenameSchurStrategy,typenamePolicy> [[nodiscard]]autogravity(constGravityPreconditioner<Gradient,Potential,MassStrategy,SchurStrategy,Policy>&choice) { usingnamespaceutils::dependencies; usingRecipe=GravityPreconditioner<Gradient,Potential,MassStrategy,SchurStrategy,Policy>; returnmake_computation<typenameRecipe::Result,InputList<keys::Inverse<KeyList<Gradient>,KeyList<Gradient>>,keys::GravityPotentialInverse<Gradient,Potential>,keys::Block<KeyList<Potential>,KeyList<Gradient>>,keys::Matrix<KeyList<Potential>,KeyList<Gradient>>>>( [policy=choice.factorization](constbackend::mfem::Inverse&mass,constbackend::mfem::Inverse&potential,constoperators::backend::mfem::LinearizedBlock&physical_divergence,conststd::shared_ptr<const::mfem::SparseMatrix>&divergence) { ifconstexpr(std::same_as<Policy,strategies::gravity::ConsistentSchurLDU>) { if(policy.correction_sweeps>0) { returnbackend::mfem::try_gravity_inverse(mass,potential,divergence,policy); } } returnbackend::mfem::try_gravity_inverse(mass,potential,physical_divergence.action(),policy); }); } }//namespaceserif::solver::preconditioner::computations