4 #ifndef DUNE_PDELAB_ORDERING_CHUNKEDBLOCKORDERING_HH
5 #define DUNE_PDELAB_ORDERING_CHUNKEDBLOCKORDERING_HH
7 #include <dune/typetree/typetree.hh>
18 #ifndef DOXYGEN // implementation internals
25 tag_base(std::size_t block_size)
26 : _block_size(block_size)
29 std::size_t blockSize()
const
36 const std::size_t _block_size;
40 template<std::
size_t i>
45 base_holder(std::size_t block_size)
46 : tag_base(block_size)
65 template<
typename OrderingTag>
67 :
public chunked::base_holder<decorated_ordering_tag<Chunked<OrderingTag>,OrderingTag>::level>
75 Chunked(std::size_t block_size,
const OrderingTag& tag)
80 Chunked(std::size_t block_size, OrderingTag&& tag)
85 template<std::
size_t i>
86 const chunked::base_holder<i>&
chunked()
const
91 template<std::
size_t i>
99 template<
typename Decorated>
111 template<
typename Ordering>
113 :
public TypeTree::CompositeNode<Ordering>
115 typename Ordering::Traits::ContainerIndex>
116 ,
public OrderingBase<typename Ordering::Traits::DOFIndex,
117 typename Ordering::Traits::ContainerIndex>
120 typedef typename Ordering::Traits
Traits;
126 typedef TypeTree::CompositeNode<Ordering> NodeT;
129 typename Ordering::Traits::DOFIndex,
130 typename Ordering::Traits::ContainerIndex
137 return this->
template child<0>();
142 return this->
template child<0>();
148 , BaseT(*this,true,nullptr,this)
156 : NodeT(r.nodeStorage())
164 : NodeT(r.nodeStorage())
165 , BaseT(
std::move(r))
171 virtual void map_index_dynamic(
typename Traits::DOFIndexView di,
typename Traits::ContainerIndex& ci)
const
174 std::size_t flat_index = ci.back();
175 std::size_t block_index = flat_index / _tag.blockSize();
176 std::size_t inner_index = flat_index % _tag.blockSize();
177 ci.back() = inner_index;
178 ci.push_back(block_index);
181 template<
typename ItIn,
typename ItOut>
184 for (; in != end; ++in, ++out)
186 std::size_t flat_index = out->back();
187 std::size_t block_index = flat_index / _tag.blockSize();
188 std::size_t inner_index = flat_index % _tag.blockSize();
189 out->back() = inner_index;
190 out->push_back(block_index);
194 template<
typename CIOutIterator>
195 typename Traits::SizeType
197 typename Traits::SizeType child_index,
198 CIOutIterator ci_out,
const CIOutIterator ci_end)
const
200 for (; ci_out != ci_end; ++ci_out)
202 std::size_t flat_index = ci_out->back();
203 std::size_t block_index = flat_index / _tag.blockSize();
204 std::size_t inner_index = flat_index % _tag.blockSize();
205 ci_out->back() = inner_index;
206 ci_out->push_back(block_index);
217 "Block size of chunked block ordering does not divide the block count "
218 "of the underlying ordering: "
229 const ordering::chunked::tag_base& _tag;
237 template<
typename GFS,
typename Transformation,
typename Undecorated,
typename Tag>
244 static transformed_type
transform(
const GFS& gfs,
const Transformation& t, std::shared_ptr<Undecorated> undecorated)
246 return transformed_type(make_tuple(undecorated),gfs.orderingTag().template chunked<Tag::level>());
249 static transformed_storage_type
transform_storage(std::shared_ptr<const GFS> gfs_pointer,
const Transformation& t, std::shared_ptr<Undecorated> undecorated)
251 return std::make_shared<transformed_type>(make_tuple(undecorated),gfs_pointer->orderingTag().template chunked<Tag::level>());
256 template<
typename GFS,
typename Transformation,
typename Undecorated,
typename GlueTag,
typename UndecoratedTag>
257 gfs_to_chunked<GFS,Transformation,Undecorated,GlueTag>
264 template<
typename GFS,
typename Transformation,
typename U>
265 struct power_gfs_to_local_ordering_descriptor<GFS,Transformation,ordering::Chunked<U> >
266 :
public power_gfs_to_local_ordering_descriptor<GFS,Transformation,U>
270 template<
typename GFS,
typename Transformation,
typename U>
271 struct composite_gfs_to_local_ordering_descriptor<GFS,Transformation,ordering::Chunked<U> >
272 :
public composite_gfs_to_local_ordering_descriptor<GFS,Transformation,U>
279 #endif // DUNE_PDELAB_ORDERING_CHUNKEDBLOCKORDERING_HH
const Ordering & ordering() const
Definition: chunkedblockordering.hh:140
DUNE_CONSTEXPR bool deactivate_standard_blocking_for_ordering(const Chunked< Decorated > &)
Definition: chunkedblockordering.hh:100
Chunked(std::size_t block_size, const OrderingTag &tag)
Definition: chunkedblockordering.hh:75
std::shared_ptr< transformed_type > transformed_storage_type
Definition: chunkedblockordering.hh:242
Chunked(std::size_t block_size)
Definition: chunkedblockordering.hh:71
Chunked(std::size_t block_size, OrderingTag &&tag)
Definition: chunkedblockordering.hh:80
static transformed_type transform(const GFS &gfs, const Transformation &t, std::shared_ptr< Undecorated > undecorated)
Definition: chunkedblockordering.hh:244
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: chunkedblockordering.hh:196
std::size_t _block_count
Definition: orderingbase.hh:290
Definition: decorator.hh:82
gfs_to_chunked< GFS, Transformation, Undecorated, GlueTag > register_gfs_to_decorator_descriptor(GFS *, Transformation *, Undecorated *, GlueTag *, Chunked< UndecoratedTag > *)
ChunkedBlockOrdering(ChunkedBlockOrdering &&r)
Definition: chunkedblockordering.hh:163
The block size of a ChunkedBlockOrdering does not divide the block count of the underlying ordering...
Definition: exceptions.hh:54
Definition: chunkedblockordering.hh:238
virtual void map_index_dynamic(typename Traits::DOFIndexView di, typename Traits::ContainerIndex &ci) const
Definition: chunkedblockordering.hh:171
static transformed_storage_type transform_storage(std::shared_ptr< const GFS > gfs_pointer, const Transformation &t, std::shared_ptr< Undecorated > undecorated)
Definition: chunkedblockordering.hh:249
const chunked::base_holder< i > & chunked() const
Definition: chunkedblockordering.hh:86
void setPartitionSet(const std::bitset< 6 > &partitions)
Sets the set of contained partitions to the passed-in value.
Definition: partitioninfoprovider.hh:58
Definition: adaptivity.hh:27
static const bool consume_tree_index
Definition: chunkedblockordering.hh:122
Traits::SizeType blockCount() const
Definition: orderingbase.hh:68
ChunkedBlockOrdering(const ChunkedBlockOrdering &r)
Definition: chunkedblockordering.hh:155
static const std::size_t level
Definition: decorator.hh:90
Ordering that permutes top-level ContainerIndex entries.
Definition: chunkedblockordering.hh:112
void setDelegate(const VirtualOrderingBase< Ordering::Traits::DOFIndex, Ordering::Traits::ContainerIndex > *delegate)
Set the delegate called in mapIndex().
Definition: orderingbase.hh:228
void map_lfs_indices(ItIn in, const ItIn end, ItOut out) const
Definition: chunkedblockordering.hh:182
void update()
Definition: chunkedblockordering.hh:211
Definition: ordering/utility.hh:230
Definition: orderingbase.hh:21
Ordering & ordering()
Definition: chunkedblockordering.hh:135
Ordering::Traits Traits
Definition: chunkedblockordering.hh:120
ChunkedBlockOrdering(const typename NodeT::NodeStorage &ordering, const ordering::chunked::tag_base &tag)
Definition: chunkedblockordering.hh:146
chunked::base_holder< i > & chunked()
Definition: chunkedblockordering.hh:92
ChunkedBlockOrdering< Undecorated > transformed_type
Definition: chunkedblockordering.hh:241
Definition: chunkedblockordering.hh:66
void update()
Definition: orderingbase.hh:99