6#include <dune/common/fvector.hh>
7#include <dune/common/tuplevector.hh>
8#include <dune/common/typetraits.hh>
9#include <dune/common/typetree/childaccess.hh>
10#include <dune/common/typetree/nodeconcepts.hh>
12#include <amdis/common/Index.hpp>
13#include <amdis/common/TypeTraits.hpp>
14#include <amdis/typetree/NodeTags.hpp>
19 struct FieldTraits<TupleVector<T...>>
21 using field_type = std::common_type_t<typename FieldTraits<T>::field_type...>;
22 using real_type = std::common_type_t<typename FieldTraits<T>::real_type...>;
30 template <
class Node,
class R,
class NodeTag,
class Default>
34 static type create(Node
const& node)
41 template <
class Node,
class R,
class NodeTag>
42 struct RangeTypeImpl<Node,R,NodeTag,void>
44 static_assert( Dune::AlwaysFalse<NodeTag>::value,
"Unknown node-type for range definition" );
49 template <
class Node,
class R =
double,
class Default =
void>
50 using RangeType = Impl::RangeTypeImpl<Node, R, AMDiS::NodeTag_t<Node>, Default>;
64 template <
class Node,
class R =
double,
class Default =
void>
66 typename Impl::RangeTypeImpl<Node, R, AMDiS::NodeTag_t<Node>, Default>::type;
72 template <
class Node,
class R>
73 struct RangeTypeImpl<Node, R, AMDiS::LeafNodeTag, void>
75 using LocalBasis =
typename Node::FiniteElement::Traits::LocalBasisType;
76 using T =
typename LocalBasis::Traits::RangeType;
77 using type = remove_cvref_t<decltype(std::declval<R>() * std::declval<T>())>;
78 static type create(Node
const& node)
85 template <
class Node,
class R>
86 struct RangeTypeImpl<Node, R, AMDiS::PowerNodeTag, void>
88 using ChildNode = Dune::TypeTree::Child<Node,0>;
90 template <
bool childIsLeaf,
class ChildRangeType>
92 using type = Dune::FieldVector<ChildRangeType,
int(Node::degree())>;
96 struct FlatType<true, Dune::FieldVector<T,1>> {
97 using type = Dune::FieldVector<T,
int(Node::degree())>;
100 using type =
typename FlatType<Dune::TypeTree::Concept::LeafTreeNode<ChildNode>, RangeType_t<ChildNode,R>>::type;
101 static type create(Node
const& node)
103 return Dune::unpackIntegerSequence([&](
auto... indices) {
104 return type{RangeType<ChildNode,R>::create(node.child(indices))...};
105 }, std::make_index_sequence<std::size_t(Node::degree())>());
110 template <
class Node,
class R>
111 struct RangeTypeImpl<Node, R, AMDiS::DynamicPowerNodeTag, void>
113 using ChildNode = Dune::TypeTree::Child<Node,0>;
115 template <
bool childIsLeaf,
class ChildRangeType>
117 using type = Dune::DynamicVector<ChildRangeType>;
121 struct FlatType<true, Dune::FieldVector<T,1>> {
122 using type = Dune::DynamicVector<T>;
125 using type =
typename FlatType<Dune::TypeTree::Concept::LeafTreeNode<ChildNode>, RangeType_t<ChildNode,R>>::type;
126 static type create(Node
const& node)
128 type vector(node.degree());
129 for (std::size_t i = 0; i < std::size_t(node.degree()); ++i)
130 vector[i] = RangeType<ChildNode,R>::create(node.child(i));
136 template <
class Node,
class R>
137 struct RangeTypeImpl<Node, R, AMDiS::CompositeNodeTag, void>
139 template <std::
size_t J>
140 using ChildNode = Dune::TypeTree::Child<Node,J>;
141 template <std::
size_t J>
142 using ChildRange = RangeType<ChildNode<J>,R>;
144 template <
class Idx>
struct RangeTypeGenerator;
145 template <std::size_t... I>
146 struct RangeTypeGenerator<Indices<I...>>
148 using type = Dune::TupleVector<typename ChildRange<I>::type...>;
151 using type =
typename RangeTypeGenerator<std::make_index_sequence<std::size_t(Node::degree())>>::type;
152 static type create(Node
const& node)
154 return Dune::unpackIntegerSequence([&](
auto... indices) {
155 return type{ChildRange<
decltype(indices)::value>::create(node.child(indices))...};
156 }, std::make_index_sequence<std::size_t(Node::degree())>());