default_preconditioners.hpp concepts type_traits serif/discretization/blocks/concepts.hpp serif/discretization/blocks/fields.hpp serif/discretization/blocks/system_layout.hpp serif/solver/preconditioner/recipes/bordered.hpp serif/solver/preconditioner/recipes/block.hpp serif/solver/preconditioner/strategies/inverse/diagonal.hpp serif/solver/preconditioner/strategies/inverse/fixed_amg.hpp serif/solver/preconditioner/strategies/inverse/sparse_direct.hpp src/compile_time_checks/serif/backend_independent.cpp src/compile_time_checks/serif/solver/preconditioner/layout.cpp src/include/serif/backend/mfem/solver/equilibrium.hpp src/include/serif/solver/preconditioner/preconditioner.hpp src/include/serif/utils/serialize/numerics.hpp serif::solver::preconditioner::detail::PrimalCoordinates< utils::dependencies::KeyList< Coordinates... >, Shape > serif serif::solver serif::solver::preconditioner serif::solver::preconditioner::detail #pragmaonce #include<concepts> #include<type_traits> #include"serif/discretization/blocks/concepts.hpp" #include"serif/discretization/blocks/fields.hpp" #include"serif/discretization/blocks/system_layout.hpp" #include"serif/solver/preconditioner/recipes/bordered.hpp" #include"serif/solver/preconditioner/recipes/block.hpp" #include"serif/solver/preconditioner/strategies/inverse/diagonal.hpp" #include"serif/solver/preconditioner/strategies/inverse/fixed_amg.hpp" #include"serif/solver/preconditioner/strategies/inverse/sparse_direct.hpp" namespaceserif::solver::preconditioner{ namespacedetail{ usingPrimalFields=utils::dependencies::KeyList<discretization::blocks::density::mass,discretization::blocks::gravity::potential>; template<typenameCoordinates,typenameShape> structPrimalCoordinates; template<typename...Coordinates,typenameShape> structPrimalCoordinates<utils::dependencies::KeyList<Coordinates...>,Shape>{ usingFields=PrimalFields; usingScalars=utils::dependencies::CombinedKeyList<std::conditional_t<discretization::blocks::GlobalScalarTerm<Coordinates>, utils::dependencies::KeyList<Coordinates>,utils::dependencies::KeyList<>>...>; usingBorder=utils::dependencies::CombinedKeyList<std::conditional_t< discretization::blocks::GlobalScalarTerm<Coordinates>||std::same_as<Coordinates,Shape>, utils::dependencies::KeyList<Coordinates>,utils::dependencies::KeyList<>>...>; staticconstexprboolsupported= utils::dependencies::key_count_v<utils::dependencies::CombinedKeyList<Fields,utils::dependencies::KeyList<Coordinates...>>>==sizeof...(Coordinates)&& ((utils::dependencies::ContainsKey<Coordinates, Fields>||discretization::blocks::GlobalScalarTerm<Coordinates>||std::same_as<Coordinates,Shape>)&&...); staticconstexprboolhas_shape=(std::same_as<Coordinates,Shape>||...); }; template<typenameLayout> usingPrimalValues=PrimalCoordinates<typename std::remove_cvref_t<Layout>::Values,discretization::blocks::surface_deformation::coefficients>; template<typenameLayout> usingPrimalRows=PrimalCoordinates<typename std::remove_cvref_t<Layout>::Residuals,discretization::blocks::surface_deformation::shape_equilibrium>; } template<typenameLayout> conceptPrimalPreconditionerLayout=discretization::blocks::SystemLayoutType<Layout>&& detail::PrimalValues<Layout>::supported&&detail::PrimalRows<Layout>::supported&& detail::PrimalValues<Layout>::has_shape==detail::PrimalRows<Layout>::has_shape&& utils::dependencies::key_count_v<typename detail::PrimalValues<Layout>::Scalars>== utils::dependencies::key_count_v<typename detail::PrimalRows<Layout>::Scalars>; template<PrimalPreconditionerLayoutLayout,typenamePotentialInverse=strategies::inverse::FixedAMG> [[nodiscard]]automake_primal_preconditioner(constLayout&,PotentialInversepotential_inverse=strategies::inverse::FixedAMG{.cycles=3}){ namespaceblocks=discretization::blocks; usingConstraints=ConstraintCoordinates<typename detail::PrimalRows<Layout>::Border,typenamedetail::PrimalValues<Layout>::Border>; constautodensity=make_preconditioner<blocks::density::mass>(strategies::inverse::Diagonal{}); constautopotential=make_preconditioner<blocks::gravity::potential>(potential_inverse); constautofields=couple(density,potential,strategies::coupling::SecondThenFirst{}); returnwith_constraints<Constraints>(fields); } }