coarse.hpp serif/solver/preconditioner/computations/ordering.hpp src/include/serif/solver/preconditioner/graph.hpp serif::solver::preconditioner::keys::Jacobian serif::solver::preconditioner::keys::CoarsePreconditioner serif serif::solver serif::solver::preconditioner serif::solver::preconditioner::keys serif::solver::preconditioner::computations #pragmaonce #include"serif/solver/preconditioner/computations/ordering.hpp" namespaceserif::solver::preconditioner::keys { structJacobian { }; structCoarsePreconditioner { }; }//namespaceserif::solver::preconditioner::keys namespaceserif::solver::preconditioner::computations { template<discretization::blocks::RepresentedValueKindKind,typenameLayout,typename...Coordinates> [[nodiscard]]std::vector<int>coarse_indices(constLayout&layout,utils::dependencies::KeyList<Coordinates...>) { std::vector<int>indices; indices.reserve(selected_size<Kind>(layout,utils::dependencies::KeyList<Coordinates...>{})); constautoappend=[&]<typenameCoordinate>() { conststd::size_toffset=layout.templateoffset<Kind,Coordinate>(); conststd::size_tcount=layout.templatesize<Kind,Coordinate>(); for(std::size_tindex=0;index<count;++index) { indices.push_back(static_cast<int>(offset+index)); } }; (append.templateoperator()<Coordinates>(),...); returnindices; } template<typenameRows,typenameValues,typenameLayout> [[nodiscard]]autocoarse_correction(conststrategies::inverse::DenseDirect&options) { usingnamespaceutils::dependencies; usingKind=discretization::blocks::RepresentedValueKind; returnmake_computation<keys::CoarsePreconditioner,InputList<keys::Preconditioner,keys::Jacobian,keys::Layout>>( [options](constbackend::mfem::Inverse&unbordered,constbackend::mfem::OperatorHandle&jacobian,constLayout&layout)->std::expected<backend::mfem::Inverse,Failure> { if(layout.templatetotal_size<Kind::value>()>static_cast<std::size_t>(std::numeric_limits<int>::max())|| layout.templatetotal_size<Kind::residual>()>static_cast<std::size_t>(std::numeric_limits<int>::max())) { returnstd::unexpected(Failure{utils::errors::SERiFErrorCode::PRECONDITIONER_SIZE_MISMATCH,"CoarsecoordinatesexceedtheMFEMindexrange."}); } returnbackend::mfem::try_coarse_inverse(jacobian,unbordered,coarse_indices<Kind::residual>(layout,Rows{}),coarse_indices<Kind::value>(layout,Values{}),options); }); } }//namespaceserif::solver::preconditioner::computations