bordered.hpp utility serif/solver/preconditioner/recipes/coupled.hpp serif/solver/preconditioner/strategies/inverse/dense.hpp src/include/serif/backend/mfem/solver/preconditioner/computations/coupling.hpp src/include/serif/solver/preconditioner/default_preconditioners.hpp serif::solver::preconditioner::ConstraintCoordinates serif::solver::preconditioner::BorderedPreconditioner serif serif::solver serif::solver::preconditioner #pragmaonce #include<utility> #include"serif/solver/preconditioner/recipes/coupled.hpp" #include"serif/solver/preconditioner/strategies/inverse/dense.hpp" namespaceserif::solver::preconditioner { template<utils::dependencies::IsKeyListRowsT,utils::dependencies::IsKeyListValuesT> structConstraintCoordinatesfinal { usingRows=RowsT; usingValues=ValuesT; }; template<typenameFields,typenameConstraints> requiresDisjointSubsystems<Fields, Constraints> structBorderedPreconditionerfinal { usingRows=utils::dependencies::CombinedKeyList<typename Fields::Rows, typename Constraints::Rows>; usingValues=utils::dependencies::CombinedKeyList<typename Fields::Values, typename Constraints::Values>; usingResult=keys::Inverse<Rows, Values>; Fieldsfields; strategies::inverse::DenseDirectconstraint_inverse; }; template<typenameConstraints,typenameFields> requiresDisjointSubsystems<Fields, Constraints> [[nodiscard]]autowith_constraints(Fieldsfields,strategies::inverse::DenseDirectinverse={}) { ifconstexpr(utils::dependencies::key_count_v<typename Constraints::Rows>==0&&utils::dependencies::key_count_v<typename Constraints::Values>==0) { returnfields; } else { returnBorderedPreconditioner<Fields,Constraints>{.fields=std::move(fields),.constraint_inverse=inverse}; } } }//namespaceserif::solver::preconditioner