4#ifndef DUNE_PDELAB_ORDERING_LEAFGRIDVIEWORDERING_HH
5#define DUNE_PDELAB_ORDERING_LEAFGRIDVIEWORDERING_HH
17 template<
typename LocalOrdering>
22 typedef typename LocalOrdering::Traits
Traits;
26 using ES =
typename Traits::EntitySet;
34 :
BaseT(local_ordering, container_blocked, gfs_data)
35 , _es(this->template child<0>().entitySet())
48 LeafGridViewOrdering(LeafGridViewOrdering&& r)
65 typename Traits::SizeType
size(
typename Traits::ContainerIndex suffix)
const
71 using size_type =
typename Traits::SizeType;
72 if (suffix.size() == Traits::ContainerIndex::max_depth)
74 if (suffix.size() == 0)
78 typename Traits::DOFIndex::EntityIndex entity_index;
81 auto back_index = suffix.back();
84 auto& _gt_entity_offsets = this->
localOrdering()._gt_entity_offsets;
85 auto& _entity_dof_offsets = this->
localOrdering()._entity_dof_offsets;
90 auto gt_begin =
_fixed_size ? _gt_dof_offsets.begin() : _gt_entity_offsets.begin();
91 auto gt_end =
_fixed_size ? _gt_dof_offsets.end() : _gt_entity_offsets.end();
92 auto gt_it = std::prev(std::upper_bound(gt_begin, gt_end, back_index));
93 size_type gt = std::distance(gt_begin, gt_it);
94 assert(back_index >= *gt_it);
95 size_type ei = back_index - *gt_it;
96 Traits::DOFIndexAccessor::GeometryIndex::store(entity_index,gt,ei);
98 auto dof_begin =
_fixed_size ? _gt_dof_offsets.begin() : _entity_dof_offsets.begin();
99 auto dof_end =
_fixed_size ? _gt_dof_offsets.end() : _entity_dof_offsets.end();
100 auto dof_it = std::prev(std::upper_bound(dof_begin, dof_end, back_index));
101 size_type dof_dist = std::distance(dof_begin, dof_it);
104 Traits::DOFIndexAccessor::GeometryIndex::store(entity_index,dof_dist,~size_type{0});
106 auto gt_begin = _gt_entity_offsets.begin();
107 auto gt_end = _gt_entity_offsets.end();
108 auto gt_it = std::prev(std::upper_bound(gt_begin, gt_end, dof_dist));
109 size_type gt = std::distance(gt_begin, gt_it);
110 assert(dof_dist >= *gt_it);
111 size_type ei = dof_dist - *gt_it;
112 Traits::DOFIndexAccessor::GeometryIndex::store(entity_index,gt,ei);
123 lo.update_a_priori_fixed_size();
125 const std::size_t
dim = ES::dimension;
127 typename ES::CodimMask codims;
129 lo.collect_used_codims(codims);
131 for (
typename ES::dim_type codim = 0; codim <= ES::dimension; ++codim)
132 if (codims.test(codim))
137 typedef typename Traits::SizeType size_type;
138 auto geom_types = _es.indexSet().types();
142 lo.update_fixed_size(geom_types.begin(),geom_types.end());
146 lo.pre_collect_used_geometry_types_from_cell();
148 for (
const auto& element : elements(_es))
150 lo.collect_used_geometry_types_from_cell(element);
153 lo.allocate_entity_offset_vector(geom_types.begin(),geom_types.end());
155 for (
const auto& element : elements(_es))
157 lo.extract_per_entity_sizes_from_cell(element);
161 lo.finalize_non_fixed_size_update();
168 _gt_dof_offsets.assign(GlobalGeometryTypeIndex::size(
dim) + 1,0);
171 for (
auto gt : geom_types)
173 const size_type gt_index = GlobalGeometryTypeIndex::index(gt);
174 size_type gt_size = lo.size(gt_index,0);
175 size_type entity_count = _es.indexSet().size(gt);
176 _size += gt_size * entity_count;
178 gt_size = gt_size > 0;
179 _gt_dof_offsets[gt_index + 1] = gt_size * entity_count;
181 std::partial_sum(_gt_dof_offsets.begin(),_gt_dof_offsets.end(),_gt_dof_offsets.begin());
212 typename Traits::EntitySet _es;
216 template<
typename GFS,
typename Transformation>
223 typename GFS::Traits::FiniteElementMap,
224 typename GFS::Traits::EntitySet,
225 typename Transformation::DOFIndex,
226 typename Transformation::ContainerIndex
236 return transformed_type(make_tuple(std::make_shared<LocalOrdering>(gfs.finiteElementMapStorage(),gfs.entitySet())),gfs.backend().blocked(gfs),
const_cast<GFS*
>(&gfs));
241 return std::make_shared<transformed_type>(make_tuple(std::make_shared<LocalOrdering>(gfs->finiteElementMapStorage(),gfs->entitySet())),gfs->backend().blocked(*gfs),
const_cast<GFS*
>(gfs.get()));
247 template<
typename GFS,
typename Transformation,
typename Params>
248 direct_leaf_gfs_to_gridview_ordering_descriptor<GFS,Transformation>
static const int dim
Definition: adaptivity.hh:84
direct_leaf_gfs_to_gridview_ordering_descriptor< GFS, Transformation > register_leaf_gfs_to_ordering_descriptor(GFS *, Transformation *, LeafOrderingTag< Params > *)
For backward compatibility – Do not use this!
Definition: adaptivity.hh:28
Tag indicating a standard ordering for a leaf GridfunctionSpace.
Definition: gridfunctionspace/tags.hh:185
Definition: directleaflocalordering.hh:27
Gridview ordering for leaf spaces.
Definition: leafgridviewordering.hh:20
virtual ~LeafGridViewOrdering() override=default
virtual void update() override
Definition: leafgridviewordering.hh:120
LeafGridViewOrdering(const typename NodeT::NodeStorage &local_ordering, bool container_blocked, typename BaseT::GFSData *gfs_data)
Definition: leafgridviewordering.hh:33
Traits::SizeType size(typename Traits::ContainerIndex suffix) const
Gives the size for a given suffix.
Definition: leafgridviewordering.hh:65
LocalOrdering::Traits Traits
Definition: leafgridviewordering.hh:22
Definition: leafgridviewordering.hh:218
static transformed_type transform(const GFS &gfs, const Transformation &t)
Definition: leafgridviewordering.hh:234
static const bool recursive
Definition: leafgridviewordering.hh:220
static transformed_storage_type transform_storage(std::shared_ptr< const GFS > gfs, const Transformation &t)
Definition: leafgridviewordering.hh:239
GridViewOrdering transformed_type
Definition: leafgridviewordering.hh:231
std::shared_ptr< transformed_type > transformed_storage_type
Definition: leafgridviewordering.hh:232
DirectLeafLocalOrdering< typename GFS::Traits::OrderingTag, typename GFS::Traits::FiniteElementMap, typename GFS::Traits::EntitySet, typename Transformation::DOFIndex, typename Transformation::ContainerIndex > LocalOrdering
Definition: leafgridviewordering.hh:227
LeafGridViewOrdering< LocalOrdering > GridViewOrdering
Definition: leafgridviewordering.hh:229
Generic infrastructure for orderings for leaf spaces.
Definition: leaforderingbase.hh:27
LocalOrdering & localOrdering()
Definition: leaforderingbase.hh:44
Traits::CodimFlag _codim_fixed_size
Definition: orderingbase.hh:285
bool fixedSize() const
Definition: orderingbase.hh:209
Traits::CodimFlag _codim_used
Definition: orderingbase.hh:284
std::size_t _size
Definition: orderingbase.hh:288
std::size_t _max_local_size
Definition: orderingbase.hh:287
std::size_t _block_count
Definition: orderingbase.hh:289
std::vector< typename Traits::SizeType > _gt_dof_offsets
Definition: leaforderingbase.hh:281
TypeTree::CompositeNode< LocalOrdering > NodeT
Definition: leaforderingbase.hh:37
bool _fixed_size
Definition: orderingbase.hh:274
const bool _container_blocked
Definition: orderingbase.hh:275
Dune::PDELab::impl::GridFunctionSpaceOrderingData< typename Traits::SizeType > GFSData
Definition: orderingbase.hh:32
Traits::SizeType size() const
Definition: orderingbase.hh:61