3 #ifndef DUNE_PDELAB_GRIDFUNCTIONSPACE_DATAHANDLEPROVIDER_HH
4 #define DUNE_PDELAB_GRIDFUNCTIONSPACE_DATAHANDLEPROVIDER_HH
9 #include <dune/common/typetraits.hh>
10 #include <dune/common/reservedvector.hh>
11 #include <dune/typetree/visitor.hh>
20 template<
typename EntityIndex>
21 struct get_size_for_entity
22 :
public TypeTree::TreeVisitor
23 ,
public TypeTree::DynamicTraversal
26 template<
typename Ordering,
typename TreePath>
27 void leaf(
const Ordering& ordering, TreePath tp)
29 _size += ordering.size(_entity_index);
32 get_size_for_entity(
const EntityIndex& entity_index)
34 , _entity_index(entity_index)
37 std::size_t size()
const
45 const EntityIndex& _entity_index;
50 template<
typename EntityIndex,
typename OffsetIterator>
51 struct get_leaf_offsets_for_entity
52 :
public TypeTree::TreeVisitor
53 ,
public TypeTree::DynamicTraversal
56 template<
typename Ordering,
typename TreePath>
57 void leaf(
const Ordering& ordering, TreePath tp)
59 *(++_oit) = ordering.size(_entity_index);
62 get_leaf_offsets_for_entity(
const EntityIndex& entity_index, OffsetIterator oit)
64 , _entity_index(entity_index)
68 OffsetIterator offsetIterator()
const
76 const EntityIndex& _entity_index;
81 template<
typename DOFIndex,
typename ContainerIndex, std::
size_t tree_depth,
bool map_dof_indices = false>
82 struct indices_for_entity
83 :
public TypeTree::TreeVisitor
84 ,
public TypeTree::DynamicTraversal
87 typedef std::size_t size_type;
89 typedef typename std::vector<ContainerIndex>::iterator CIIterator;
90 typedef typename std::conditional<
92 typename std::vector<DOFIndex>::iterator,
97 template<
typename Ordering,
typename Child,
typename TreePath,
typename ChildIndex>
98 void beforeChild(
const Ordering& ordering,
const Child& child, TreePath tp, ChildIndex childIndex)
100 _stack.push(std::make_pair(_ci_it,_di_it));
103 template<
typename Ordering,
typename TreePath>
104 void leaf(
const Ordering& ordering, TreePath tp)
106 size_type size = ordering.extract_entity_indices(_entity_index,
118 template<
typename Ordering,
typename Child,
typename TreePath,
typename ChildIndex>
119 void afterChild(
const Ordering& ordering,
const Child& child, TreePath tp, ChildIndex childIndex)
122 ordering.extract_entity_indices(_entity_index,
127 if (Ordering::consume_tree_index)
128 for (DIIterator it = _stack.top().second;
131 it->treeIndex().push_back(childIndex);
137 indices_for_entity(
const EntityIndex& entity_index,
139 DIIterator di_begin = DIIterator())
140 : _entity_index(entity_index)
149 CIIterator ci_end()
const
155 DIIterator di_end()
const
162 const EntityIndex& _entity_index;
186 template<
typename GFS>
201 return gfs().ordering().contains(codim);
207 return gfs().ordering().fixedSize(codim);
234 template<
typename Entity>
237 typedef typename GFS::Ordering Ordering;
239 typedef typename Ordering::Traits::DOFIndex::EntityIndex EntityIndex;
242 Ordering::Traits::DOFIndexAccessor::GeometryIndex::store(
248 get_size_for_entity<EntityIndex> get_size(ei);
249 TypeTree::applyToTree(
gfs().ordering(),get_size);
251 return get_size.size();
254 template<
typename V,
typename EntityIndex>
258 for (
typename V::iterator it = v.begin(),
263 it->treeIndex().clear();
264 it->entityIndex() = ei;
268 template<
typename V,
typename EntityIndex>
285 template<
typename Entity,
typename ContainerIndex,
typename DOFIndex,
typename OffsetIterator,
bool map_dof_indices>
287 std::vector<ContainerIndex>& container_indices,
288 std::vector<DOFIndex>& dof_indices,
290 std::integral_constant<bool,map_dof_indices> map_dof_indices_value
293 typedef typename GFS::Ordering Ordering;
296 "dataHandleContainerIndices() called with invalid ContainerIndex type.");
298 typedef typename Ordering::Traits::DOFIndex::EntityIndex EntityIndex;
301 Ordering::Traits::DOFIndexAccessor::GeometryIndex::store(
307 get_leaf_offsets_for_entity<EntityIndex,OffsetIterator> get_offsets(ei,oit);
308 TypeTree::applyToTree(
gfs().ordering(),get_offsets);
309 OffsetIterator end_oit = oit + (TypeTree::TreeInfo<Ordering>::leafCount + 1);
312 std::partial_sum(oit,end_oit,oit);
313 size_type size = *(oit + TypeTree::TreeInfo<Ordering>::leafCount);
315 container_indices.resize(size);
317 for (
typename std::vector<ContainerIndex>::iterator it = container_indices.begin(),
318 endit = container_indices.end();
328 TypeTree::TreeInfo<Ordering>::depth,
330 > extract_indices(ei,container_indices.begin(),
dof_indices_begin(dof_indices,map_dof_indices_value));
331 TypeTree::applyToTree(
gfs().ordering(),extract_indices);
339 return static_cast<const GFS&
>(*this);
347 #endif // DUNE_PDELAB_GRIDFUNCTIONSPACE_DATAHANDLEPROVIDER_HH