plan.hpp tuple serif/utils/dependencies/key_list_operations.hpp serif/discretization/forms/forms.hpp serif/operators/concepts.hpp src/compile_time_checks/serif/operators/plan.cpp src/include/serif/operators/backend/mfem/element_evaluation.hpp src/include/serif/operators/backend/mfem/quadrature.hpp serif::operators::detail::AsKeyList< utils::types::TypeList< T... > > serif::operators::detail::Join serif::operators::detail::ContributionOperands< std::tuple< C... > > serif::operators::detail::Columns< utils::types::TypeList< O... > > serif::operators::detail::CouplingForm serif::operators::EquationPlan< EquationT, utils::types::TypeList< O... > > serif serif::operators serif::operators::detail #pragmaonce #include<tuple> #include"serif/utils/dependencies/key_list_operations.hpp" #include"serif/discretization/forms/forms.hpp" #include"serif/operators/concepts.hpp" namespaceserif::operators{ namespacedetail{ template<typenameListT>structAsKeyList; template<typename...T>structAsKeyList<utils::types::TypeList<T...>>{ usingtype=utils::dependencies::CombinedKeyList<utils::dependencies::KeyList<T>...>; }; template<typename...Lists>structJoin{ usingtype=typenameutils::dependencies::CombinedKeyList<typename AsKeyList<Lists>::type...>::Keys; }; template<typenameTupleT>structContributionOperands; template<typename...C>structContributionOperands<std::tuple<C...>>:Join<typenameC::Operands...>{}; template<typenameListT>structColumns; template<typename...O> structColumns<utils::types::TypeList<O...>>{ usingtype=typenameutils::dependencies::CombinedKeyList<utils::dependencies::KeyList<discretization::forms::Operand<typename O::term_type>>...>::Keys; }; template<typenameInput,typenameTestOperand>structCouplingForm{ usingTrial=typenameInput::term_type; usingTest=typenameTestOperand::term_type; usingtype=std::conditional_t< std::same_as<typenameInput::operation_type,discretization::forms::Operation::Divergence>, discretization::forms::divergence<Trial, Test>, std::conditional_t<std::same_as<typenameTestOperand::operation_type,discretization::forms::Operation::Divergence>, discretization::forms::divergence<Test, Trial>, std::conditional_t<std::same_as<Trial,Test>,discretization::forms::mass<Trial, Test>, discretization::forms::source<Trial, Test>>>>; }; }//namespacedetail template<VolumeEquationEquationT, typenameOperandsT=typenamedetail::ContributionOperands<equations::ContributionsOf<EquationT>>::type> structEquationPlan; template<VolumeEquationEquationT,typename...O>structEquationPlan<EquationT,utils::types::TypeList<O...>>{ usingTest=typenameEquationT::Test; usingSupport=discretization::blocks::SupportOf<Test>; usingOperands=utils::types::TypeList<O...>; usingColumns=typenamedetail::Columns<Operands>::type; staticconstexprstd::size_toperand_count=sizeof...(O); staticconstexprstd::size_tcolumn_count=equations::OperandValues<Columns>::count; staticconstexprintcomponent_count=(discretization::forms::component_count<discretization::forms::OperandValue<O>>+...+0); template<typenameOperandT,typenameContributionT=EquationT> usingForm=typenamedetail::CouplingForm<OperandT, equations::TestOperandOf<ContributionT>>::type; template<typenameOperandT>staticconstevalstd::size_tcolumn_index(){ returnequations::OperandValues<Columns>::templateindex<typenameOperandT::term_type>(); } template<typenameOperandT>staticconstevalintcomponent_offset(){ constexprstd::arraycounts{discretization::forms::component_count<discretization::forms::OperandValue<O>>...}; constexprautoindex=equations::OperandValues<Operands>::templateindex<OperandT>(); intoffset=0; for(std::size_ti=0;i<index;++i){ offset+=counts[i]; } returnoffset; } template<typenameFunctionT>staticvoidfor_each_operand(FunctionT&&function){ (function(O{},equations::OperandValues<Operands>::templateindex<O>()),...); } template<typenameContributionT,typenameFunctionT>staticvoidfor_each_input(FunctionT&&function){ [&]<typename...Input>(utils::types::TypeList<Input...>){ (function(Input{},equations::OperandValues<Operands>::templateindex<Input>()),...); }(typenameContributionT::Operands{}); } template<typenameFunctionT>staticvoidfor_each_column(FunctionT&&function){ [&]<typename...Column>(utils::types::TypeList<Column...>){ (function(Column{},equations::OperandValues<Columns>::templateindex<Column>()),...); }(Columns{}); } }; }//namespaceserif::operators