order.hpp type_traits serif/discretization/functional_space/space.hpp serif/discretization/blocks/concepts.hpp serif/discretization/forms/operands.hpp serif/utils/error/errors.hpp src/compile_time_checks/serif/discretization/fields_meanfield.cpp src/compile_time_checks/serif/operators/plan.cpp src/include/serif/discretization/quadrature/backend/mfem/mfem_resolver.hpp src/include/serif/discretization/quadrature/backend/mfem/mfem_static_order.hpp serif::discretization::quadrature::backend::mfem::DiscreteFunctionalSpaceTraits< functional_space::DiscreteFunctionalSpace< SpaceV, OrderV, RankV > > serif serif::discretization serif::discretization::quadrature serif::discretization::quadrature::backend serif::discretization::quadrature::backend::mfem File containing the resolve_operand_order function and related utilities. These are used to determine the static order of an integrator for a given operand or form type. Emily M. Boudreaux #pragmaonce #include<type_traits> #include"serif/discretization/functional_space/space.hpp" #include"serif/discretization/blocks/concepts.hpp" #include"serif/discretization/forms/operands.hpp" #include"serif/utils/error/errors.hpp" namespaceserif::discretization::quadrature::backend::mfem{ template<typenameFunctionalSpaceT> structDiscreteFunctionalSpaceTraits; template<autoSpaceV,autoOrderV,autoRankV> structDiscreteFunctionalSpaceTraits<functional_space::DiscreteFunctionalSpace<SpaceV,OrderV,RankV>>final{ staticconstexprautospace=SpaceV; staticconstexprautoorder=static_cast<int>(OrderV); staticconstexprstd::size_trank=static_cast<std::size_t>(RankV); }; template<blocks::HasFunctionalSpaceTermT> usingFunctionalSpaceTraits=DiscreteFunctionalSpaceTraits<typename TermT::FunctionalSpace>; template<forms::IsOperandOperandT> [[nodiscard]]constevalintresolve_operand_order()noexcept{ usingOperand=std::remove_cvref_t<OperandT>; usingTerm=Operand::term_type; usingOperation=Operand::operation_type; ifconstexpr(!blocks::HasFunctionalSpace<Term>){ static_assert(std::same_as<Operation,forms::Operation::Value>,"Non-Spatialtermsonlysupportthevalueoperationatthemoment."); return0; }else{ usingSpace=FunctionalSpaceTraits<Term>; constexprautofamily=Space::space.family; constexprintorder=Space::order; ifconstexpr(std::same_as<Operation,forms::Operation::Value>){ ifconstexpr(family==functional_space::Family::hdiv){ returnorder+1; }else{ returnorder; } }elseifconstexpr(std::same_as<Operation,forms::Operation::Gradient>){ static_assert(family==functional_space::Family::h1,"OnlyH1spacessupportthegradientoperationatthemoment."); returnorder>0?order-1:0; }elseifconstexpr(std::same_as<Operation,forms::Operation::Divergence>){ static_assert(Space::rank==1&&(family==functional_space::Family::hdiv||family==functional_space::Family::h1),"DivergencerequiresavectorH1orH(div)term."); ifconstexpr(family==functional_space::Family::hdiv){ returnorder; }else{ returnorder>0?order-1:0; } }elseifconstexpr(std::same_as<Operation,forms::Operation::Curl>){ static_assert(family==functional_space::Family::hcurl,"OnlyH(curl)spacessupportthecurloperationatthemoment."); returnorder>0?order-1:0; }elseifconstexpr(std::same_as<Operation,forms::Operation::NormalTrace>){ static_assert(family==functional_space::Family::hdiv,"OnlyH(div)spacessupportthenormaltraceoperationatthemoment."); returnorder; }else{ static_assert(false,"Unsupportedoperationtype.Thisindicatesthatanoperationwasusedwhichisnotcurrentlyregisteredintheoperandconfigurationsystem.Ifyouareadeveloperandyouareseeingthiserror,pleaseregisteryouroperationintheresolve_operand_orderfunctionindiscretization/quadrature/detail.hpp.Ifyouareauserandyouareseeingthiserror,pleasereportittotheSERiFdevelopers."); return0; } } } [[nodiscard]]inlineintsum_dynamic_orders(conststd::span<constint>dynamic_orders){ inttotal=0; for(constintorder:dynamic_orders){ if(order<0){ utils::errors::serif_error<std::invalid_argument, utils::errors::SERiFErrorCode::INVALID_QUADRATURE_ORDER>("Dynamicquadratureordercannotbenegative.Received{}.",order); } total+=order; } returntotal; } }