1#ifndef __DUNE_ACFEM_MODELS_SYMMETRY_HH__
2#define __DUNE_ACFEM_MODELS_SYMMETRY_HH__
4#include "../expressions/storage.hh"
5#include "modeltraits.hh"
17 template<class T, std::enable_if_t<!IsPDEModel<T>::value,
int> = 0>
18 constexpr auto isSymmetric(T&&)
23 template<
class T, std::enable_if_t<(IsPDEModel<T>::value
24 && (!IsExpression<T>::value || IsSelfExpression<T>::value)
26 constexpr auto isSymmetric(T&&)
28 return BoolConstant<HasTag<T, SymmetricModel>::value || ModelTraits<T>::isLoad>{};
33 template<
class T, std::size_t... Idx>
34 constexpr auto isSymmetricExpander(T&& t, IndexSequence<Idx...>)
36 return BoolConstant<(... &&
decltype(isSymmetric(std::forward<T>(t).
template operand<Idx>()))::value)>{};
41 template<
class T, std::enable_if_t<(IsPDEModel<T>::value
42 && IsExpression<T>::value
43 && !IsSelfExpression<T>::value
45 constexpr auto isSymmetric(T&& t)
47 if constexpr (HasTag<T, SymmetricModel>::value || ModelTraits<T>::isLoad) {
49 }
else if constexpr (!IsExpression<T>::value || IsSelfExpression<T>::value) {
52 return isSymmetricExpander(std::forward<T>(t),
MakeIndexSequence<Expressions::Arity<T>::value>{});
MakeSequence< std::size_t, N, Offset, Stride, Repeat > MakeIndexSequence
Make a sequence of std::size_t elements.
Definition: generators.hh:34
Constant< bool, V > BoolConstant
Short-cut for integral constant of type bool.
Definition: types.hh:48
BoolConstant< false > FalseType
Alias for std::false_type.
Definition: types.hh:110
BoolConstant< true > TrueType
Alias for std::true_type.
Definition: types.hh:107
Tag structure identifying symmetric models.
Definition: symmetry.hh:15