concepts.hpp concepts type_traits serif/discretization/blocks/traits.hpp serif/discretization/functional_space/space.hpp serif/equations/concepts.hpp src/include/serif/backend/mfem/operators/operand_evaluation.hpp src/include/serif/model/equilibrium_plan.hpp src/include/serif/operators/plan.hpp serif::operators::HasScalarVolumeOperands serif::operators::HasScalarVolumeOperands< EquationT, utils::types::TypeList< Operands... > > serif::operators::VolumeOperands serif::operators::VolumeOperands< C, utils::types::TypeList< O... > > serif::operators::VolumeContributions serif::operators::VolumeContributions< std::tuple< C... > > serif serif::operators #pragmaonce #include<concepts> #include<type_traits> #include"serif/discretization/blocks/traits.hpp" #include"serif/discretization/functional_space/space.hpp" #include"serif/equations/concepts.hpp" namespaceserif::operators{ //Theserestrictionsdescribetheexistingvolumeimplementation, //notwhichphysicalequationsmaybedeclaredinserif::equations. template<typenameTermT> conceptScalarValueTerm= discretization::blocks::GlobalScalarTerm<TermT>|| (discretization::blocks::SpatialTerm<TermT>&& discretization::blocks::SpatialTermTraits<TermT>::rank==0&& ( discretization::blocks::SpatialTermTraits<TermT>::family==discretization::functional_space::Family::h1|| discretization::blocks::SpatialTermTraits<TermT>::family==discretization::functional_space::Family::l2 )); template<typenameOperandT> conceptScalarValueOperand= discretization::forms::IsOperand<OperandT>&& ScalarValueTerm<typename OperandT::term_type>&& std::same_as<typenameOperandT::operation_type,discretization::forms::Operation::Value>; template<typenameOperandT> conceptScalarGradientOperand= discretization::forms::IsOperand<OperandT>&& discretization::blocks::SpatialTerm<typename OperandT::term_type>&& discretization::blocks::SpatialTermTraits<typename OperandT::term_type>::rank==0&& discretization::blocks::SpatialTermTraits<typename OperandT::term_type>::family==discretization::functional_space::Family::h1&& std::same_as<typenameOperandT::operation_type,discretization::forms::Operation::Gradient>; template<typenameOperandT> conceptVectorGradientOperand= discretization::forms::IsOperand<OperandT>&& discretization::blocks::SpatialTerm<typename OperandT::term_type>&& discretization::blocks::SpatialTermTraits<typename OperandT::term_type>::rank==1&& discretization::blocks::SpatialTermTraits<typename OperandT::term_type>::family==discretization::functional_space::Family::h1&& std::same_as<typenameOperandT::operation_type,discretization::forms::Operation::Gradient>; template<typenameEquationT,typenameOperandsT> structHasScalarVolumeOperands:std::false_type{}; template<typenameEquationT,typename...Operands> structHasScalarVolumeOperands<EquationT,utils::types::TypeList<Operands...>>: std::bool_constant< sizeof...(Operands)!=0&& (ScalarValueOperand<Operands>&&...)&& (requires(constEquationT&equation,Operandsoperand){ {equation.additional_order(operand,1)}->std::same_as<int>; }&&...)>{}; template<typenameEquationT> conceptScalarVolumeEquation= equations::Equation<EquationT>&& ScalarValueTerm<typename EquationT::Test>&& HasScalarVolumeOperands<EquationT, typename EquationT::Operands>::value; template<typenameOperandT> conceptMappedOperand= discretization::forms::IsOperand<OperandT>&& ( ScalarValueOperand<OperandT>||ScalarGradientOperand<OperandT>||VectorGradientOperand<OperandT>|| ( discretization::blocks::SpatialTerm<typename OperandT::term_type>&& discretization::blocks::SpatialTermTraits<typename OperandT::term_type>::rank==1&& discretization::blocks::SpatialTermTraits<typename OperandT::term_type>::family==discretization::functional_space::Family::h1&& ( std::same_as<typenameOperandT::operation_type,discretization::forms::Operation::Value>|| std::same_as<typenameOperandT::operation_type,discretization::forms::Operation::Divergence> ) ) ); template<typenameC,typenameListT>structVolumeOperands:std::false_type{}; template<typenameC,typename...O> structVolumeOperands<C,utils::types::TypeList<O...>>:std::bool_constant< sizeof...(O)!=0&&(MappedOperand<O>&&...)&& (requires(constC&contribution,Ooperand){ {contribution.additional_order(operand,1)}->std::same_as<int>;}&&...)>{}; template<typenameTupleT>structVolumeContributions:std::false_type{}; template<typename...C> structVolumeContributions<std::tuple<C...>> :std::bool_constant<((discretization::domain::IsDomainOrSet<equations::SupportOf<C>>&& MappedOperand<equations::TestOperandOf<C>>&&VolumeOperands<C,typenameC::Operands>::value)&& ...)>{}; template<typenameT> conceptVolumeEquation=equations::Equation<T>&&VolumeContributions<equations::ContributionsOf<T>>::value; }//namespaceserif::operators