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)
153 : NodeT(r.nodeStorage())
161 : NodeT(r.nodeStorage())
162 ,
BaseT(std::move(r))
168 virtual void map_index_dynamic(
typename Traits::DOFIndexView di,
typename Traits::ContainerIndex& ci)
const override
171 std::size_t flat_index = ci.back();
172 std::size_t block_index = flat_index / _tag.blockSize();
173 std::size_t inner_index = flat_index % _tag.blockSize();
174 ci.back() = inner_index;
175 ci.push_back(block_index);
178 template<
typename ItIn,
typename ItOut>
181 for (; in != end; ++in, ++out)
183 std::size_t flat_index = out->back();
184 std::size_t block_index = flat_index / _tag.blockSize();
185 std::size_t inner_index = flat_index % _tag.blockSize();
186 out->back() = inner_index;
187 out->push_back(block_index);
191 template<
typename CIOutIterator>
192 typename Traits::SizeType
194 typename Traits::SizeType child_index,
195 CIOutIterator ci_out,
const CIOutIterator ci_end)
const
197 for (; ci_out != ci_end; ++ci_out)
199 std::size_t flat_index = ci_out->back();
200 std::size_t block_index = flat_index / _tag.blockSize();
201 std::size_t inner_index = flat_index % _tag.blockSize();
202 ci_out->back() = inner_index;
203 ci_out->push_back(block_index);
214 "Block size of chunked block ordering does not divide the block count "
215 "of the underlying ordering: "
226 const ordering::chunked::tag_base& _tag;
234 template<
typename GFS,
typename Transformation,
typename Undecorated,
typename Tag>
243 return transformed_type(make_tuple(undecorated),gfs.orderingTag().template chunked<Tag::level>());
248 return std::make_shared<transformed_type>(make_tuple(undecorated),gfs_pointer->orderingTag().template chunked<Tag::level>());
253 template<
typename GFS,
typename Transformation,
typename Undecorated,
typename GlueTag,
typename UndecoratedTag>
254 gfs_to_chunked<GFS,Transformation,Undecorated,GlueTag>
261 template<
typename GFS,
typename Transformation,
typename U>
262 struct power_gfs_to_local_ordering_descriptor<GFS,Transformation,ordering::Chunked<U> >
263 :
public power_gfs_to_local_ordering_descriptor<GFS,Transformation,U>
267 template<
typename GFS,
typename Transformation,
typename U>
268 struct composite_gfs_to_local_ordering_descriptor<GFS,Transformation,ordering::Chunked<U> >
269 :
public composite_gfs_to_local_ordering_descriptor<GFS,Transformation,U>
276 #endif // DUNE_PDELAB_ORDERING_CHUNKEDBLOCKORDERING_HH