rules.hpp optional string vector format utility serif/discretization/forms/runtime.hpp src/include/serif/backend/mfem/discretization/quadrature/mfem_resolver.hpp src/include/serif/discretization/quadrature/policy.hpp src/include/serif/discretization/quadrature/query.hpp serif::discretization::quadrature::RuleControl serif::discretization::quadrature::FormRule serif::discretization::quadrature::RuleSet serif::discretization::quadrature::Resolution std::formatter< serif::discretization::quadrature::QuadratureRole > std::formatter< serif::discretization::quadrature::MappingKind > std::formatter< serif::discretization::quadrature::RuleControl > std::formatter< serif::discretization::quadrature::FormRule > std::formatter< serif::discretization::quadrature::RuleSet > serif serif::discretization serif::discretization::quadrature File containing the RuleSet class and related types. The RuleSet class is used to determine the appropriate order and other relevant information for the integration rule based on a given quadrature query. Emily M. Boudreaux #pragmaonce #include<optional> #include<string> #include<vector> #include<format> #include<utility> #include"serif/discretization/forms/runtime.hpp" namespaceserif::discretization::quadrature{ enumclassQuadratureRole{ discretization, preconditioner, diagnostic, projection }; enumclassMappingKind{ none, affine, general, kelvin }; structRuleControl{ std::optional<int>fixed_order; intboost=0; }; structFormRulefinal{ forms::FormDescriptorform; RuleControlcontrol; }; classRuleSet{ public: template<forms::FormFormT> voidset_form_control( constRuleControlcontrol ){ set_form_control(forms::form_descriptor<FormT>,control); } voidset_form_control( constforms::FormDescriptor&form, constRuleControlcontrol ){ for(auto&[formDescriptor,ruleControl]:m_formRules){ if(formDescriptor==form){ ruleControl=control; return; } } m_formRules.push_back(FormRule{.form=form,.control=control}); } [[nodiscard]]constRuleControl*find_form_control( constforms::FormDescriptor&form )constnoexcept{ for(constauto&[formDescriptor,ruleControl]:m_formRules){ if(formDescriptor==form){ return&ruleControl; } } returnnullptr; } voidset_role_control( constQuadratureRolerole, constRuleControlcontrol )noexcept{ switch(role){ caseQuadratureRole::discretization: m_discretizationControl=control; break; caseQuadratureRole::preconditioner: m_preconditionerControl=control; break; caseQuadratureRole::diagnostic: m_diagnosticControl=control; break; caseQuadratureRole::projection: m_projectionControl=control; break; } } [[nodiscard]]constRuleControl&role_control( constQuadratureRolerole )constnoexcept{ switch(role){ caseQuadratureRole::discretization: returnm_discretizationControl; caseQuadratureRole::preconditioner: returnm_preconditionerControl; caseQuadratureRole::diagnostic: returnm_diagnosticControl; caseQuadratureRole::projection: returnm_projectionControl; } std::unreachable(); } voidset_fallback_control( constRuleControlcontrol )noexcept{ m_fallbackControl=control; } [[nodiscard]]constRuleControl&fallback_control()constnoexcept{ returnm_fallbackControl; } autobegin(){ returnm_formRules.begin(); } autoend(){ returnm_formRules.end(); } autobegin()const{ returnm_formRules.begin(); } autoend()const{ returnm_formRules.end(); } private: std::vector<FormRule>m_formRules; RuleControlm_discretizationControl; RuleControlm_preconditionerControl; RuleControlm_diagnosticControl; RuleControlm_projectionControl; RuleControlm_fallbackControl; }; structResolution{ intbase_order; intboost; intorder; boolused_fixed_order; }; } template<> structstd::formatter<serif::discretization::quadrature::QuadratureRole>:std::formatter<std::string_view>{ template<typenameFormatContext> autoformat(constserif::discretization::quadrature::QuadratureRole&role,FormatContext&ctx)const{ std::string_viewroleStr; switch(role){ caseserif::discretization::quadrature::QuadratureRole::discretization: roleStr="discretization"; break; caseserif::discretization::quadrature::QuadratureRole::preconditioner: roleStr="preconditioner"; break; caseserif::discretization::quadrature::QuadratureRole::diagnostic: roleStr="diagnostic"; break; caseserif::discretization::quadrature::QuadratureRole::projection: roleStr="projection"; break; default: roleStr="unknown"; break; } returnstd::formatter<std::string_view>::format(roleStr,ctx); } }; template<> structstd::formatter<serif::discretization::quadrature::MappingKind>:std::formatter<std::string_view>{ template<typenameFormatContext> autoformat(constserif::discretization::quadrature::MappingKind&mk,FormatContext&ctx)const{ std::string_viewmappingKindStr; switch(mk){ caseserif::discretization::quadrature::MappingKind::none: mappingKindStr="none"; break; caseserif::discretization::quadrature::MappingKind::affine: mappingKindStr="affine"; break; caseserif::discretization::quadrature::MappingKind::general: mappingKindStr="general"; break; caseserif::discretization::quadrature::MappingKind::kelvin: mappingKindStr="kelvin"; break; default: mappingKindStr="unknown"; break; } returnstd::formatter<std::string_view>::format(mappingKindStr,ctx); } }; template<> structstd::formatter<serif::discretization::quadrature::RuleControl>:std::formatter<std::string_view>{ template<typenameFormatContext> autoformat(constserif::discretization::quadrature::RuleControl&rc,FormatContext&ctx)const{ returnstd::formatter<std::string_view>::format( std::format("RuleControl(fixed_order={},boost={})",rc.fixed_order.has_value()?std::to_string(rc.fixed_order.value()):"none",rc.boost), ctx); } }; template<> structstd::formatter<serif::discretization::quadrature::FormRule>:std::formatter<std::string_view>{ template<typenameFormatContext> autoformat(constserif::discretization::quadrature::FormRule&fr,FormatContext&ctx)const{ returnstd::formatter<std::string_view>::format( std::format("FormRule(form={},control={})",fr.form,fr.control), ctx); } }; template<> structstd::formatter<serif::discretization::quadrature::RuleSet>:std::formatter<std::string_view>{ template<typenameFormatContext> autoformat(constserif::discretization::quadrature::RuleSet&rs,FormatContext&ctx)const{ std::stringrulesStr; for(constauto&rule:rs){ if(!rulesStr.empty()){ rulesStr+=","; } rulesStr+=std::format("{}",rule); } returnstd::formatter<std::string_view>::format( std::format("RuleSet(formRules=[{}])",rulesStr), ctx); } };