mfem_resolver.hpp span format unordered_map mfem/fem/geom.hpp mfem/fem/intrules.hpp serif/discretization/quadrature/rules.hpp serif/backend/mfem/discretization/quadrature/order.hpp serif/discretization/domain/concepts.hpp serif/discretization/quadrature/policy.hpp serif/discretization/quadrature/query.hpp serif/backend/mfem/discretization/quadrature/concepts.hpp serif/backend/mfem/discretization/quadrature/configure.hpp serif/backend/mfem/discretization/quadrature/mfem_static_order.hpp serif/utils/format/strings.hpp src/compile_time_checks/serif/backend/mfem/discretization/quadrature/mfem_resolver.cpp src/include/serif/backend/mfem/operators/quadrature.hpp serif::discretization::quadrature::backend::mfem::MFEMQuadratureContext serif::discretization::quadrature::backend::mfem::MFEMRule serif::discretization::quadrature::backend::mfem::MFEMResolver serif serif::discretization serif::discretization::quadrature serif::discretization::quadrature::backend serif::discretization::quadrature::backend::mfem File containing the MFEMResolver class. This class is used to resolve the appropriate MFEM integration rule for a given quadrature context. Emily M. Boudreaux We may want to consider renaming this file to runtime to stick to convention. The reason I did not initially is that this is more specific than pure runtime projection of compile time invariants (which is what most of the other files named runtime.hpp do). Something to think about. You will see mfem throughout. This is an important syntax to use here since MFEM's code lives in the mfem namespace; however, we also have code living in an mfem namespace. Outside of translation units that include using namespace serif::discretization::quadrature::backend and outside of the serif::discretization::quadrature::backend::mfem namespace itself these two things do not conflict. However, in those two cases there is a degeneracy the compiler cannot resolve between mfem:: and mfem::. Using mfem explicitly tells the compiler that we are looking from the root of the namespace tree not the current namespace. #pragmaonce #include<span> #include<format> #include<unordered_map> #include"mfem/fem/geom.hpp" #include"mfem/fem/intrules.hpp" #include"serif/discretization/quadrature/rules.hpp" #include"serif/backend/mfem/discretization/quadrature/order.hpp" #include"serif/discretization/domain/concepts.hpp" #include"serif/discretization/quadrature/policy.hpp" #include"serif/discretization/quadrature/query.hpp" #include"serif/backend/mfem/discretization/quadrature/concepts.hpp" #include"serif/backend/mfem/discretization/quadrature/configure.hpp" #include"serif/backend/mfem/discretization/quadrature/mfem_static_order.hpp" #include"serif/utils/format/strings.hpp" namespaceserif::discretization::quadrature::backend::mfem{ structMFEMQuadratureContextfinal{ QuadratureRolerole=QuadratureRole::discretization; ::mfem::Geometry::Typegeometry=::mfem::Geometry::INVALID; intgeometry_weight_order=0; std::span<constint>dynamic_orders{}; domain::DomainOrSetdomain=domain::AllDomains{}; MappingKindmapping=MappingKind::none; }; structMFEMRulefinal{ Resolutionresolution{}; const::mfem::IntegrationRule*integration_rule=nullptr; }; classMFEMResolverfinal{ public: explicitMFEMResolver(Policypolicy)noexcept:m_policy(std::move(policy)){}//Doweactuallywanttousemovervaluesemanticshere? template<forms::FormFormT> [[nodiscard]]MFEMRuleresolve(constMFEMQuadratureContext&context)const{ if(context.geometry_weight_order<0){ utils::errors::serif_error<std::invalid_argument, utils::errors::SERiFErrorCode::INVALID_QUADRATURE_ORDER>("MFEMgeometryweightordermustbenon-negative.Receivedanorderof{}",context.geometry_weight_order); } constintdynamic_order=sum_dynamic_orders(context.dynamic_orders); constintbase_order=mfem_form_static_order<FormT>+dynamic_order+context.geometry_weight_order; constQueryquery{ .form=forms::form_descriptor<FormT>, .role=context.role, .domain=context.domain, .mapping=context.mapping, .base_order=base_order }; constResolutionresolution=m_policy.resolve(query); const::mfem::IntegrationRule&integration_rule=::mfem::IntRules.Get(context.geometry,resolution.order); returnMFEMRule{.resolution=resolution,.integration_rule=&integration_rule}; } template<forms::FormFormT,ConfigurableIntegratorIntegratorT> Resolutionconfigure(IntegratorT&integrator,constMFEMQuadratureContext&context)const{ constMFEMRulerule=resolve<FormT>(context); set_integration_rule(integrator,*rule.integration_rule); returnrule.resolution; } private: Policym_policy; }; }