4 #ifndef DUNE_PDELAB_ORDERING_GRIDVIEWORDERING_HH 5 #define DUNE_PDELAB_ORDERING_GRIDVIEWORDERING_HH 7 #include <dune/typetree/typetree.hh> 22 template<
typename Codims>
24 :
public TypeTree::TreeVisitor
25 ,
public TypeTree::DynamicTraversal
28 template<
typename Node,
typename TreePath>
29 void leaf(Node& node, TreePath tp)
31 node.collect_used_codims(
codims);
44 :
public TypeTree::TreeVisitor
45 ,
public TypeTree::DynamicTraversal
48 template<
typename Node,
typename TreePath>
49 void leaf(Node& node, TreePath tp)
51 node.update_a_priori_fixed_size();
52 any = any || node._fixed_size;
53 all = all && node._fixed_size;
56 template<
typename Node,
typename TreePath>
57 void pre(Node& node, TreePath tp)
const 59 node._fixed_size =
true;
62 template<
typename Node,
typename Child,
typename TreePath,
typename ChildIndex>
63 void afterChild(Node& node,
const Child& child, TreePath tp, ChildIndex childIndex)
const 65 node._fixed_size = node._fixed_size && child._fixed_size;
81 :
public TypeTree::TreeVisitor
82 ,
public TypeTree::DynamicTraversal
85 template<
typename Node,
typename TreePath>
86 void leaf(Node& node, TreePath tp)
const 90 typedef typename Node::Traits::SizeType size_type;
91 const size_type
dim = ES::dimension;
92 node._codim_used.reset();
93 node._gt_used.assign(GlobalGeometryTypeIndex::size(dim),
false);
94 node._gt_dof_offsets.assign(GlobalGeometryTypeIndex::size(dim),0);
95 for (
const auto& gt : es.indexSet().types())
97 size_type size = node.finiteElementMap().size(gt);
100 node._codim_used[dim - gt.dim()] = node._codim_used[dim - gt.dim()] || (size > 0);
102 node._max_local_size = node.finiteElementMap().maxLocalSize();
106 template<
typename Node,
typename TreePath>
107 void pre(Node& node, TreePath tp)
const 109 if (node._fixed_size)
111 typedef typename Node::Traits::SizeType size_type;
112 const size_type
dim = ES::dimension;
113 node._codim_used.reset();
114 node._gt_used.assign(Dune::GlobalGeometryTypeIndex::size(dim),
false);
115 node._gt_dof_offsets.assign(Dune::GlobalGeometryTypeIndex::size(dim) * TypeTree::degree(node),0);
116 node._max_local_size = 0;
120 template<
typename Node,
typename Child,
typename TreePath,
typename ChildIndex>
121 void afterChild(Node& node,
const Child& child, TreePath tp, ChildIndex childIndex)
const 123 if (node._fixed_size)
125 node._codim_used |= child._codim_used;
127 std::transform(node._gt_used.begin(),
129 child._gt_used.begin(),
130 node._gt_used.begin(),
131 std::logical_or<bool>());
133 node._max_local_size += child._max_local_size;
135 typedef typename Node::Traits::SizeType size_type;
137 const size_type per_gt_size = child._child_count > 0 ? child._child_count : 1;
138 const size_type size_offset = child._child_count > 0 ? child._child_count - 1 : 0;
140 for (size_type gt = 0; gt < Dune::GlobalGeometryTypeIndex::size(ES::dimension); ++gt)
141 node._gt_dof_offsets[gt * TypeTree::degree(node) + childIndex] = child._gt_dof_offsets[gt * per_gt_size + size_offset];
145 template<
typename Node,
typename TreePath>
146 void post(Node& node, TreePath tp)
const 148 if (node._fixed_size)
150 typedef typename std::vector<typename Node::Traits::SizeType>::iterator iterator;
152 iterator next_gt_it = node._gt_dof_offsets.begin() + TypeTree::degree(node);
153 const iterator end_it = node._gt_dof_offsets.end();
155 for (iterator it = node._gt_dof_offsets.begin();
157 it += TypeTree::degree(node), next_gt_it += TypeTree::degree(node))
158 std::partial_sum(it,next_gt_it,it);
172 :
public TypeTree::TreeVisitor
173 ,
public TypeTree::DynamicTraversal
176 template<
typename Node,
typename TreePath>
177 void leaf(Node& node, TreePath tp)
const 179 if (!node._fixed_size)
181 node._codim_used.reset();
182 node._gt_used.assign(Dune::GlobalGeometryTypeIndex::size(
dim),
false);
183 node._gt_dof_offsets.assign(Dune::GlobalGeometryTypeIndex::size(
dim) * std::max(node._child_count,static_cast<std::size_t>(1)),0);
184 node._gt_entity_offsets.assign(Dune::GlobalGeometryTypeIndex::size(
dim) + 1,0);
188 template<
typename Node,
typename TreePath>
189 void pre(Node& node, TreePath tp)
const 203 template<
typename Cell>
205 :
public TypeTree::TreeVisitor
206 ,
public TypeTree::DynamicTraversal
209 template<
typename Node,
typename TreePath>
210 void leaf(Node& node, TreePath tp)
const 212 if (!node._fixed_size)
213 node.collect_used_geometry_types_from_cell(cell);
218 , ref_el(
Dune::ReferenceElements<typename Cell::Geometry::ctype,Cell::dimension>::general(cell_.type()))
222 const Dune::ReferenceElement<typename Cell::Geometry::ctype,Cell::dimension>&
ref_el;
227 template<
typename ES>
229 :
public TypeTree::TreeVisitor
230 ,
public TypeTree::DynamicTraversal
233 template<
typename Node,
typename TreePath>
234 void leaf(Node& node, TreePath tp)
const 236 if (!node._fixed_size)
238 typedef typename Node::Traits::SizeType size_type;
240 for (
const auto& gt : es.indexSet().types())
246 std::partial_sum(node._gt_entity_offsets.begin(),node._gt_entity_offsets.end(),node._gt_entity_offsets.begin());
247 node._entity_dof_offsets.assign(node._gt_entity_offsets.back() * std::max(node._child_count,static_cast<size_type>(1)),0);
248 node.setup_fixed_size_possible();
252 template<
typename Node,
typename Child,
typename TreePath,
typename ChildIndex>
253 void afterChild(Node& node,
const Child& child, TreePath tp, ChildIndex childIndex)
const 255 if (!node._fixed_size)
257 node._codim_used |= child._codim_used;
259 std::transform(node._gt_used.begin(),
261 child._gt_used.begin(),
262 node._gt_used.begin(),
263 std::logical_or<bool>());
267 template<
typename Node,
typename TreePath>
268 void post(Node& node, TreePath tp)
const 282 template<
typename ES>
284 :
public TypeTree::TreeVisitor
285 ,
public TypeTree::DynamicTraversal
288 static const std::size_t
dim = ES::dimension;
289 typedef typename ES::template Codim<0>::Entity
Cell;
292 template<
typename Node,
typename TreePath>
293 void leaf(Node& node, TreePath tp)
295 if (!node._fixed_size)
296 node.extract_per_entity_sizes_from_cell(*cell,gt_sizes);
303 , gt_sizes(
Dune::GlobalGeometryTypeIndex::size(dim),0)
309 ref_el = &(Dune::ReferenceElements<typename ES::Traits::CoordinateField,dim>::general(cell_.type()));
314 const Dune::ReferenceElement<typename ES::Traits::CoordinateField,dim>*
ref_el;
320 template<
typename ES>
322 :
public TypeTree::TreeVisitor
323 ,
public TypeTree::DynamicTraversal
329 template<
typename Node,
typename TreePath>
330 void leaf(Node& node, TreePath tp)
const 332 if (!node._fixed_size)
334 if (node._fixed_size_possible)
336 node._entity_dof_offsets = std::vector<typename Node::Traits::SizeType>();
337 node._fixed_size =
true;
342 template<
typename Node,
typename TreePath>
343 void pre(Node& node, TreePath tp)
const 345 if (!node._fixed_size)
347 node._fixed_size_possible =
true;
348 node._max_local_size = 0;
353 template<
typename Node,
typename Child,
typename TreePath,
typename ChildIndex>
354 void afterChild(Node& node,
const Child& child, TreePath tp, ChildIndex childIndex)
const 356 if (!node._fixed_size)
358 node._fixed_size_possible = node._fixed_size_possible && child._fixed_size;
359 node._max_local_size += child._max_local_size;
364 template<
typename Node,
typename TreePath>
365 void post(Node& node, TreePath tp)
const 367 if (!node._fixed_size)
370 typedef typename Node::Traits::SizeType size_type;
371 const size_type
dim = ES::dimension;
373 if (node._fixed_size_possible)
376 for (size_type gt = 0; gt < GlobalGeometryTypeIndex::size(ES::dimension); ++gt)
378 for (size_type child_index = 0; child_index < TypeTree::degree(node); ++child_index)
380 const size_type per_gt_size = node.childOrdering(child_index)._child_count > 0 ? node.childOrdering(child_index)._child_count : 1;
381 const size_type size_offset = node.childOrdering(child_index)._child_count > 0 ? node.childOrdering(child_index)._child_count - 1 : 0;
383 node._gt_dof_offsets[gt * TypeTree::degree(node) + child_index] = node.childOrdering(child_index)._gt_dof_offsets[gt * per_gt_size + size_offset];
387 typedef typename std::vector<typename Node::Traits::SizeType>::iterator iterator;
389 const iterator end_it = node._gt_dof_offsets.end();
391 for (iterator it = node._gt_dof_offsets.begin();
393 it += TypeTree::degree(node))
394 std::partial_sum(it,it + TypeTree::degree(node),it);
396 node._fixed_size =
true;
400 typedef typename Node::Traits::SizeType size_type;
403 for (size_type geometry_type_index = 0; geometry_type_index < GlobalGeometryTypeIndex::size(dim); ++geometry_type_index)
405 if (!node._gt_used[geometry_type_index])
407 const size_type entity_count = node._gt_entity_offsets[geometry_type_index+1] - node._gt_entity_offsets[geometry_type_index];
408 for (size_type entity_index = 0; entity_index < entity_count; ++entity_index)
411 for (size_type child_index = 0; child_index < TypeTree::degree(node); ++child_index)
412 node._entity_dof_offsets[index++] = (carry += node.childOrdering(child_index).size(geometry_type_index,entity_index));
429 template<
typename LocalOrdering>
431 :
public TypeTree::CompositeNode<LocalOrdering>
433 typename LocalOrdering::Traits::ContainerIndex>
434 ,
public OrderingBase<typename LocalOrdering::Traits::DOFIndex,
435 typename LocalOrdering::Traits::ContainerIndex>
438 typedef typename LocalOrdering::Traits
Traits;
440 static const bool has_dynamic_ordering_children =
false;
442 static const bool consume_tree_index =
false;
446 typedef TypeTree::CompositeNode<LocalOrdering> NodeT;
448 typename LocalOrdering::Traits::DOFIndex,
449 typename LocalOrdering::Traits::ContainerIndex
452 using EntitySet =
typename Traits::EntitySet;
462 : NodeT(local_ordering)
463 , BaseT(*this,container_blocked,gfs_data,this)
464 , _es(localOrdering().entitySet())
468 localOrdering().disable_container_blocking();
477 : NodeT(r.nodeStorage())
480 , _gt_dof_offsets(r._gt_dof_offsets)
481 , _gt_entity_offsets(r._gt_entity_offsets)
482 , _entity_dof_offsets(r._entity_dof_offsets)
484 this->setDelegate(
this);
488 : NodeT(r.nodeStorage())
489 , BaseT(std::move(r))
490 , _es(std::move(r._es))
491 , _gt_dof_offsets(std::move(r._gt_dof_offsets))
492 , _gt_entity_offsets(std::move(r._gt_entity_offsets))
493 , _entity_dof_offsets(std::move(r._entity_dof_offsets))
495 this->setDelegate(
this);
502 return this->
template child<0>();
507 return this->
template child<0>();
510 virtual void map_index_dynamic(
typename Traits::DOFIndexView di,
typename Traits::ContainerIndex& ci)
const 515 typename Traits::ContainerIndex
mapIndex(
const typename Traits::DOFIndex& di)
const 517 typename Traits::ContainerIndex ci;
518 mapIndex(di.view(),ci);
522 void mapIndex(
typename Traits::DOFIndexView di,
typename Traits::ContainerIndex& ci)
const 524 typedef typename Traits::SizeType size_type;
525 const size_type geometry_type_index = Traits::DOFIndexAccessor::geometryType(di);
526 const size_type entity_index = Traits::DOFIndexAccessor::entityIndex(di);
527 localOrdering().map_local_index(geometry_type_index,entity_index,di.treeIndex(),ci);
528 if (_container_blocked)
532 ci.push_back(_gt_dof_offsets[geometry_type_index] + entity_index);
536 ci.push_back(_gt_entity_offsets[geometry_type_index] + entity_index);
543 ci.back() += _gt_dof_offsets[geometry_type_index] + entity_index * localOrdering().size(geometry_type_index,entity_index);
547 ci.back() += _entity_dof_offsets[_gt_entity_offsets[geometry_type_index] + entity_index];
552 template<
typename ItIn,
typename ItOut>
555 typedef typename Traits::SizeType size_type;
556 if (_container_blocked)
559 for (ItIn in = begin; in != end; ++in, ++out)
561 const size_type geometry_type_index = Traits::DOFIndexAccessor::geometryType(*in);
562 const size_type entity_index = Traits::DOFIndexAccessor::entityIndex(*in);
563 out->push_back(_gt_dof_offsets[geometry_type_index] + entity_index);
566 for (ItIn in = begin; in != end; ++in, ++out)
568 const size_type geometry_type_index = Traits::DOFIndexAccessor::geometryType(*in);
569 const size_type entity_index = Traits::DOFIndexAccessor::entityIndex(*in);
570 out->push_back(_gt_entity_offsets[geometry_type_index] + entity_index);
573 else if (_fixed_size)
575 for (ItIn in = begin; in != end; ++in, ++out)
577 const size_type geometry_type_index = Traits::DOFIndexAccessor::geometryType(*in);
578 const size_type entity_index = Traits::DOFIndexAccessor::entityIndex(*in);
579 out->back() += _gt_dof_offsets[geometry_type_index] + entity_index * localOrdering().size(geometry_type_index,entity_index);
584 for (ItIn in = begin; in != end; ++in, ++out)
586 const size_type geometry_type_index = Traits::DOFIndexAccessor::geometryType(*in);
587 const size_type entity_index = Traits::DOFIndexAccessor::entityIndex(*in);
588 out->back() += _entity_dof_offsets[_gt_entity_offsets[geometry_type_index] + entity_index];
593 template<
typename CIOutIterator>
594 typename Traits::SizeType
596 typename Traits::SizeType child_index,
597 CIOutIterator ci_out,
const CIOutIterator ci_end)
const 599 typedef typename Traits::SizeType size_type;
601 const size_type geometry_type_index = Traits::DOFIndexAccessor::GeometryIndex::geometryType(ei);
602 const size_type entity_index = Traits::DOFIndexAccessor::GeometryIndex::entityIndex(ei);
604 if (_container_blocked)
607 for (; ci_out != ci_end; ++ci_out)
609 ci_out->push_back(_gt_dof_offsets[geometry_type_index] + entity_index);
612 for (; ci_out != ci_end; ++ci_out)
614 ci_out->push_back(_gt_entity_offsets[geometry_type_index] + entity_index);
617 else if (_fixed_size)
619 for (; ci_out != ci_end; ++ci_out)
621 ci_out->back() += _gt_dof_offsets[geometry_type_index] + entity_index * localOrdering().size(geometry_type_index,entity_index);
626 for (; ci_out != ci_end; ++ci_out)
628 ci_out->back() += _entity_dof_offsets[_gt_entity_offsets[geometry_type_index] + entity_index];
639 typedef typename Traits::SizeType size_type;
640 using ES =
typename Traits::EntitySet;
641 const size_type
dim = ES::dimension;
643 typename ES::CodimMask
codims;
648 for (
typename ES::dim_type codim = 0; codim <= ES::dimension; ++codim)
649 if (codims.test(codim))
656 TypeTree::applyToTree(localOrdering(),fixed_size_collector);
657 _fixed_size = localOrdering().fixedSize();
659 const size_type gt_index_count = GlobalGeometryTypeIndex::size(ES::dimension);
661 if (fixed_size_collector.
any)
667 if (!fixed_size_collector.
all)
671 using Element =
typename ES::template Codim<0>::Entity;
673 for (
const auto& element : elements(_es))
682 for (
const auto& element : elements(_es))
685 TypeTree::applyToTree(localOrdering(),visitor);
690 _codim_used = localOrdering()._codim_used;
692 if (localOrdering().fixedSize())
695 _gt_dof_offsets.assign(gt_index_count + 1,0);
701 for (
const auto& gt : _es.indexSet().types())
704 size_type gt_size = localOrdering().size(gt_index,0);
705 const size_type gt_entity_count = _es.indexSet().size(gt);
706 _size += gt_size * gt_entity_count;
707 if (_container_blocked)
708 gt_size = gt_size > 0;
709 _gt_dof_offsets[gt_index + 1] = gt_size * gt_entity_count;
712 std::partial_sum(_gt_dof_offsets.begin(),_gt_dof_offsets.end(),_gt_dof_offsets.begin());
713 _block_count = _gt_dof_offsets.back();
715 _codim_fixed_size.set();
720 _gt_entity_offsets.assign(gt_index_count + 1,0);
722 for (
const auto& gt : _es.indexSet().types())
724 if (!localOrdering().contains(gt))
727 _gt_entity_offsets[gt_index + 1] = _es.indexSet().size(gt);
730 std::partial_sum(_gt_entity_offsets.begin(),_gt_entity_offsets.end(),_gt_entity_offsets.begin());
731 _entity_dof_offsets.assign(_gt_entity_offsets.back()+1,0);
736 for (size_type gt_index = 0; gt_index < GlobalGeometryTypeIndex::size(dim); ++gt_index)
738 if (!localOrdering().contains_geometry_type(gt_index))
740 const size_type entity_count = _gt_entity_offsets[gt_index + 1] - _gt_entity_offsets[gt_index];
741 for (size_type entity_index = 0; entity_index < entity_count; ++entity_index)
743 const size_type size = localOrdering().size(gt_index,entity_index);
744 _entity_dof_offsets[++
index] = (carry += size);
745 _block_count += (size > 0);
748 _size = _entity_dof_offsets.back();
750 if (!_container_blocked)
751 _block_count = _size;
753 _codim_fixed_size.reset();
756 _max_local_size = localOrdering().maxLocalSize();
759 using BaseT::fixedSize;
763 using BaseT::_container_blocked;
764 using BaseT::_fixed_size;
765 using BaseT::_max_local_size;
767 using BaseT::_block_count;
768 using BaseT::_codim_used;
769 using BaseT::_codim_fixed_size;
771 typename Traits::EntitySet _es;
772 std::vector<typename Traits::SizeType> _gt_dof_offsets;
773 std::vector<typename Traits::SizeType> _gt_entity_offsets;
774 std::vector<typename Traits::SizeType> _entity_dof_offsets;
783 #endif // DUNE_PDELAB_ORDERING_GRIDVIEWORDERING_HH const Cell * cell
Definition: gridviewordering.hh:313
static const int dim
Definition: adaptivity.hh:83
ES es
Definition: gridviewordering.hh:312
void pre(Node &node, TreePath tp) const
Definition: gridviewordering.hh:107
Definition: gridviewordering.hh:171
pre_collect_used_geometry_types(std::size_t dimension)
Definition: gridviewordering.hh:194
ES es
Definition: gridviewordering.hh:166
post_collect_used_geometry_types(const ES &es_)
Definition: gridviewordering.hh:273
Traits::ContainerIndex mapIndex(const typename Traits::DOFIndex &di) const
Definition: gridviewordering.hh:515
void map_lfs_indices(const ItIn begin, const ItIn end, ItOut out) const
Definition: gridviewordering.hh:553
Traits::SizeType extract_entity_indices(const typename Traits::DOFIndex::EntityIndex &ei, typename Traits::SizeType child_index, CIOutIterator ci_out, const CIOutIterator ci_end) const
Definition: gridviewordering.hh:595
Definition: gridviewordering.hh:430
void pre(Node &node, TreePath tp) const
Definition: gridviewordering.hh:343
void afterChild(Node &node, const Child &child, TreePath tp, ChildIndex childIndex) const
Definition: gridviewordering.hh:354
const Dune::ReferenceElement< typename Cell::Geometry::ctype, Cell::dimension > & ref_el
Definition: gridviewordering.hh:222
void leaf(Node &node, TreePath tp) const
Definition: gridviewordering.hh:330
Definition: gridviewordering.hh:23
void pre(Node &node, TreePath tp) const
Definition: gridviewordering.hh:57
ES::template Codim< 0 >::Entity Cell
Definition: gridviewordering.hh:289
const Cell & cell
Definition: gridviewordering.hh:221
collect_a_priori_fixed_size()
Definition: gridviewordering.hh:68
Definition: gridviewordering.hh:228
void post(Node &node, TreePath tp) const
Definition: gridviewordering.hh:365
Definition: gridviewordering.hh:80
void leaf(Node &node, TreePath tp) const
Definition: gridviewordering.hh:210
Dune::PDELab::impl::GridFunctionSpaceOrderingData< typename Traits::SizeType > GFSData
Definition: orderingbase.hh:32
collect_used_geometry_types_from_cell_visitor(const Cell &cell_)
Definition: gridviewordering.hh:216
const std::size_t dim
Definition: gridviewordering.hh:198
For backward compatibility – Do not use this!
Definition: adaptivity.hh:27
void leaf(Node &node, TreePath tp) const
Definition: gridviewordering.hh:177
Definition: gridviewordering.hh:321
void post(Node &node, TreePath tp) const
Definition: gridviewordering.hh:268
Definition: orderingbase.hh:20
Definition: gridviewordering.hh:204
void leaf(Node &node, TreePath tp)
Definition: gridviewordering.hh:29
Definition: gridviewordering.hh:43
void post(Node &node, TreePath tp) const
Definition: gridviewordering.hh:146
const Dune::ReferenceElement< typename ES::Traits::CoordinateField, dim > * ref_el
Definition: gridviewordering.hh:314
virtual void map_index_dynamic(typename Traits::DOFIndexView di, typename Traits::ContainerIndex &ci) const
Definition: gridviewordering.hh:510
void leaf(Node &node, TreePath tp)
Definition: gridviewordering.hh:293
Definition: gridviewordering.hh:283
ES es
Definition: gridviewordering.hh:424
const LocalOrdering & localOrdering() const
Definition: gridviewordering.hh:505
bool all
Definition: gridviewordering.hh:74
void leaf(Node &node, TreePath tp)
Definition: gridviewordering.hh:49
bool any
Definition: gridviewordering.hh:73
post_extract_per_entity_sizes(const ES &es_)
Definition: gridviewordering.hh:420
Codims & codims
Definition: gridviewordering.hh:38
extract_per_entity_sizes_from_cell_visitor(const ES &es_)
Definition: gridviewordering.hh:299
void mapIndex(typename Traits::DOFIndexView di, typename Traits::ContainerIndex &ci) const
Definition: gridviewordering.hh:522
Definition: ordering/utility.hh:231
ES es
Definition: gridviewordering.hh:277
void pre(Node &node, TreePath tp) const
Definition: gridviewordering.hh:189
collect_used_codims(Codims &codims_)
Definition: gridviewordering.hh:34
GridViewOrdering(const typename NodeT::NodeStorage &local_ordering, bool container_blocked, typename BaseT::GFSData *gfs_data)
Construct ordering object.
Definition: gridviewordering.hh:461
void update()
Definition: gridviewordering.hh:636
void afterChild(Node &node, const Child &child, TreePath tp, ChildIndex childIndex) const
Definition: gridviewordering.hh:253
update_fixed_size(const ES es_)
Definition: gridviewordering.hh:162
void leaf(Node &node, TreePath tp) const
Definition: gridviewordering.hh:86
std::size_t index
Definition: interpolate.hh:118
void set_cell(const Cell &cell_)
Definition: gridviewordering.hh:306
void leaf(Node &node, TreePath tp) const
Definition: gridviewordering.hh:234
std::size_t size_type
Definition: gridviewordering.hh:290
std::vector< GeometryType > GTVector
Definition: gridviewordering.hh:326
std::vector< size_type > gt_sizes
Definition: gridviewordering.hh:315
void afterChild(Node &node, const Child &child, TreePath tp, ChildIndex childIndex) const
Definition: gridviewordering.hh:63
LocalOrdering::Traits Traits
Definition: gridviewordering.hh:438
void afterChild(Node &node, const Child &child, TreePath tp, ChildIndex childIndex) const
Definition: gridviewordering.hh:121
LocalOrdering & localOrdering()
Definition: gridviewordering.hh:500