quadrature.hpp algorithm array limits mfem/fem/eltrans.hpp mfem/fem/fe/fe_base.hpp serif/backend/mfem/discretization/quadrature/mfem_resolver.hpp serif/operators/plan.hpp src/include/serif/backend/mfem/operators/element_preparation.hpp src/include/serif/backend/mfem/operators/volume_data.hpp serif serif::operators serif::operators::backend serif::operators::backend::mfem #pragmaonce #include<algorithm> #include<array> #include<limits> #include"mfem/fem/eltrans.hpp" #include"mfem/fem/fe/fe_base.hpp" #include"serif/backend/mfem/discretization/quadrature/mfem_resolver.hpp" #include"serif/operators/plan.hpp" namespaceserif::operators::backend::mfem{ template<VolumeEquationRowEquationT,typenameContributionT> [[nodiscard]]const::mfem::IntegrationRule&equation_rule( constContributionT&equation, constdiscretization::quadrature::Policy&policy, ::mfem::ElementTransformation&transformation, const::mfem::FiniteElement&displacement_element, discretization::quadrature::MappingKindmapping_kind=discretization::quadrature::MappingKind::general, intreconstruction_order=0 ){ usingnamespacediscretization::quadrature; usingPlan=EquationPlan<RowEquationT>; constdiscretization::quadrature::backend::mfem::MFEMResolverresolver(policy); constintposition_order=std::max(transformation.Order(),displacement_element.GetOrder()); constintweight_order=transformation.OrderW()+3*std::max(0,displacement_element.GetOrder()-1); intorder=0; Plan::templatefor_each_input<ContributionT>([&]<typenameOperandT>([[maybe_unused]]OperandToperand,std::size_t){ usingnamespaceutils::errors; usingForm=Plan::templateForm<OperandT,ContributionT>; std::arrayextra{equation.additional_order(operand,position_order)}; serif_ensure<SERiFErrorCode::INVALID_QUADRATURE_ORDER,std::invalid_argument>( extra[0]>=0&&reconstruction_order>=0&& extra[0]<=std::numeric_limits<int>::max()-weight_order-discretization::quadrature::backend::mfem::mfem_form_static_order<Form>&& reconstruction_order<=std::numeric_limits<int>::max()-weight_order-discretization::quadrature::backend::mfem::mfem_form_static_order<Form>-extra[0], "Equationquadratureorderexceedsthesupportedrange." ); //Automaticrulesaccountforthenonpolynomialprofile;explicitpolicyordersremainauthoritative. extra[0]+=reconstruction_order; constautoresolved=resolver.templateresolve<Form>({ .geometry=transformation.GetGeometryType(), .geometry_weight_order=weight_order, .dynamic_orders=extra, .domain=equations::SupportOf<ContributionT>{}, .mapping=mapping_kind }); order=std::max(order,resolved.resolution.order); }); return::mfem::IntRules.Get(transformation.GetGeometryType(),order); } }//namespaceserif::operators::backend::mfem