coupled.hpp utility serif/solver/preconditioner/keys.hpp serif/solver/preconditioner/strategies/coupling/policies.hpp src/include/serif/backend/mfem/solver/preconditioner/computations/coupling.hpp src/include/serif/solver/preconditioner/recipes/bordered.hpp serif::solver::preconditioner::CoupledPreconditioner serif serif::solver serif::solver::preconditioner #pragmaonce #include<utility> #include"serif/solver/preconditioner/keys.hpp" #include"serif/solver/preconditioner/strategies/coupling/policies.hpp" namespaceserif::solver::preconditioner { template<typenameFirst,typenameSecond> conceptDisjointSubsystems= utils::dependencies::key_count_v<utils::dependencies::CombinedKeyList<typename First::Rows, typename Second::Rows>>== utils::dependencies::key_count_v<typename First::Rows>+utils::dependencies::key_count_v<typename Second::Rows>&& utils::dependencies::key_count_v<utils::dependencies::CombinedKeyList<typename First::Values, typename Second::Values>>== utils::dependencies::key_count_v<typename First::Values>+utils::dependencies::key_count_v<typename Second::Values>; template<typenameFirst,typenameSecond,typenamePolicy> requiresDisjointSubsystems<First, Second> structCoupledPreconditionerfinal { usingRows=utils::dependencies::CombinedKeyList<typename First::Rows, typename Second::Rows>; usingValues=utils::dependencies::CombinedKeyList<typename First::Values, typename Second::Values>; usingResult=keys::Inverse<Rows, Values>; Firstfirst; Secondsecond; Policycoupling; }; template<typenameFirst,typenameSecond,typenamePolicy> requiresDisjointSubsystems<First, Second> [[nodiscard]]autocouple(Firstfirst,Secondsecond,Policycoupling) { returnCoupledPreconditioner<First, Second, Policy>{.first=std::move(first),.second=std::move(second),.coupling=coupling}; } }//namespaceserif::solver::preconditioner