3 #ifndef DUNE_PDELAB_ORDERING_INTERLEAVEDORDERING_HH
4 #define DUNE_PDELAB_ORDERING_INTERLEAVEDORDERING_HH
8 #include <dune/typetree/compositenodemacros.hh>
9 #include <dune/typetree/powernode.hh>
23 namespace interleaved_ordering {
26 template<
typename DI,
typename CI,
typename Node>
48 :
BaseT(node,container_blocked,ordering_tag.offsets(),gfs_data,nullptr)
53 if (node.CHILDREN != ordering_tag.
offsets().size() - 1)
55 "Invalid block structure for InterleavedOrdering: "
56 << node.CHILDREN <<
" children, but "
57 << (ordering_tag.
offsets().size() - 1) <<
" block sizes.");
60 template<
typename ItIn,
typename ItOut>
66 for (ItIn in = begin; in != end; ++in, ++out)
68 size_type child_index = in->treeIndex().back();
71 size_type index = out->back();
72 size_type block_index = index / child_block_size;
73 size_type
offset = index % child_block_size;
74 out->back() = child_block_offset +
offset;
75 out->push_back(block_index);
80 for (ItIn in = begin; in != end; ++in, ++out)
82 size_type child_index = in->treeIndex().back();
86 size_type index = out->back();
87 size_type block_index = index / child_block_size;
88 size_type
offset = index % child_block_size;
89 out->back() = block_index * block_size + child_block_offset +
offset;
94 template<
typename CIOutIterator,
typename DIOutIterator = DummyDOFIndexIterator>
98 CIOutIterator ci_out,
const CIOutIterator ci_end)
const
103 for (; ci_out != ci_end; ++ci_out)
107 size_type index = ci_out->back();
108 size_type block_index = index / child_block_size;
109 size_type
offset =index % child_block_size;
110 ci_out->back() = child_block_offset +
offset;
111 ci_out->push_back(block_index);
116 for (; ci_out != ci_end; ++ci_out)
121 size_type index = ci_out->back();
122 size_type block_index = index / child_block_size;
123 size_type
offset =index % child_block_size;
124 ci_out->back() = block_index * block_size + child_block_offset +
offset;
137 template<
typename DI,
typename CI,
typename Child, std::
size_t k>
139 :
public TypeTree::PowerNode<Child, k>
142 PowerInterleavedOrdering<DI,CI,Child,k>
145 typedef TypeTree::PowerNode<Child, k> Node;
165 ,
Base(*this,container_blocked,ordering_tag,gfs_data)
170 for (std::size_t i = 0; i < Node::CHILDREN; ++i)
172 this->child(i).update();
177 std::string
name()
const {
return "PowerInterleavedOrdering"; }
181 template<
typename GFS,
typename Transformation>
187 template<
typename TC>
192 typename Transformation::DOFIndex,
193 typename Transformation::ContainerIndex,
202 template<
typename TC>
203 static typename result<TC>::type transform(
const GFS& gfs,
const Transformation& t,
const array<shared_ptr<TC>,GFS::CHILDREN>& children)
205 return typename result<TC>::type(gfs.backend().blocked(gfs),gfs.orderingTag(),children,
const_cast<GFS*
>(&gfs));
208 template<
typename TC>
211 return make_shared<typename result<TC>::type>(gfs->backend().blocked(*gfs),gfs->orderingTag(),children,
const_cast<GFS*
>(gfs.get()));
216 template<
typename GFS,
typename Transformation>
217 power_gfs_to_interleaved_ordering_descriptor<GFS,Transformation>
222 template<
typename DI,
typename CI, DUNE_TYPETREE_COMPOSITENODE_TEMPLATE_CHILDREN>
224 public DUNE_TYPETREE_COMPOSITENODE_BASETYPE,
227 CompositeInterleavedOrdering<
230 DUNE_TYPETREE_COMPOSITENODE_CHILDTYPES
234 typedef DUNE_TYPETREE_COMPOSITENODE_BASETYPE Node;
242 DUNE_TYPETREE_COMPOSITENODE_CHILDTYPES
257 : Node(DUNE_TYPETREE_COMPOSITENODE_CHILDVARIABLES)
258 ,
Base(*this,backend_blocked,ordering_tag,gfs_data)
261 std::string
name()
const {
return "CompositeInterleavedOrdering"; }
265 TypeTree::applyToTree(*
this,ordering::update_direct_children());
270 #if HAVE_VARIADIC_TEMPLATES
272 template<
typename GFS,
typename Transformation>
273 struct composite_gfs_to_interleaved_ordering_descriptor
278 template<
typename... TC>
282 typedef CompositeInterleavedOrdering<
283 typename Transformation::DOFIndex,
284 typename Transformation::ContainerIndex,
292 template<
typename... TC>
293 static typename result<TC...>::type
transform(
const GFS& gfs,
const Transformation& t, shared_ptr<TC>... children)
295 return typename result<TC...>::type(gfs.backend().blocked(gfs),gfs.orderingTag(),
const_cast<GFS*
>(&gfs),children...);
298 template<
typename... TC>
299 static typename result<TC...>::storage_type
transform_storage(shared_ptr<const GFS> gfs,
const Transformation& t, shared_ptr<TC>... children)
301 return make_shared<
typename result<TC...>::type>(gfs->backend().blocked(*gfs),gfs.orderingTag(),
const_cast<GFS*
>(gfs.get()),children...);
306 #else // HAVE_VARIADIC_TEMPLATES
309 template<
typename GFS,
typename Transformation>
315 template<
typename TC0,
329 TC0,TC1,TC2,TC3,TC4,TC5,TC6,TC7,TC8,TC9>
type;
333 template<
typename TC0,
345 const Transformation& t,
357 return typename result<TC0,TC1,TC2,TC3,TC4,TC5,TC6,TC7,TC8,TC9>::type(gfs.backend().blocked(gfs),gfs.orderingTag(),c0,c1,c2,c3,c4,c5,c6,c7,c8,c9);
360 template<
typename TC0,
370 static typename result<TC0,TC1,TC2,TC3,TC4,TC5,TC6,TC7,TC8,TC9>::storage_type
372 const Transformation& t,
384 return make_shared<typename result<TC0,TC1,TC2,TC3,TC4,TC5,TC6,TC7,TC8,TC9>::type>(gfs->backend().blocked(*gfs),gfs->orderingTag(),c0,c1,c2,c3,c4,c5,c6,c7,c8,c9);
389 #endif // HAVE_VARIADIC_TEMPLATES
391 template<
typename GFS,
typename Transformation>
392 composite_gfs_to_interleaved_ordering_descriptor<GFS,Transformation>
399 #endif // DUNE_PDELAB_ORDERING_LEXICOGRAPHICORDERING_HH
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: interleavedordering.hh:96
Definition: interleavedordering.hh:325
PowerInterleavedOrdering< typename Transformation::DOFIndex, typename Transformation::ContainerIndex, TC, GFS::CHILDREN > type
Definition: interleavedordering.hh:196
shared_ptr< type > storage_type
Definition: interleavedordering.hh:330
static result< TC >::type transform(const GFS &gfs, const Transformation &t, const array< shared_ptr< TC >, GFS::CHILDREN > &children)
Definition: interleavedordering.hh:203
Definition: interleavedordering.hh:223
std::string name() const
Definition: interleavedordering.hh:177
DI::size_type SizeType
Definition: ordering/utility.hh:201
Interface for merging index spaces.
Definition: interleavedordering.hh:27
Definition: interleavedordering.hh:138
PDELab-specific exceptions.
static const bool recursive
Definition: interleavedordering.hh:185
static const bool recursive
Definition: interleavedordering.hh:313
composite_gfs_to_entityblocked_ordering_descriptor< GFS, Transformation > register_composite_gfs_to_ordering_descriptor(GFS *, Transformation *, EntityBlockedOrderingTag *)
power_gfs_to_entityblocked_ordering_descriptor< GFS, Transformation > register_power_gfs_to_ordering_descriptor(GFS *, Transformation *, EntityBlockedOrderingTag *)
Definition: orderingbase.hh:22
void map_lfs_indices(const ItIn begin, const ItIn end, ItOut out) const
Definition: interleavedordering.hh:61
PowerInterleavedOrdering(bool container_blocked, const InterleavedOrderingTag &ordering_tag, const typename Node::NodeStorage &children, typename Base::GFSData *gfs_data)
Construct ordering object.
Definition: interleavedordering.hh:163
void update()
Definition: interleavedordering.hh:263
static const bool consume_tree_index
Definition: interleavedordering.hh:39
Node transformation descriptor for CompositeGridFunctionSpace -> LexicographicOrdering (without varia...
Definition: interleavedordering.hh:310
OrderingBase< DI, CI >::Traits Traits
Definition: interleavedordering.hh:35
Definition: ordering/utility.hh:186
const std::size_t offset
Definition: localfunctionspace.hh:74
static result< TC >::storage_type transform_storage(shared_ptr< const GFS > gfs, const Transformation &t, const array< shared_ptr< TC >, GFS::CHILDREN > &children)
Definition: interleavedordering.hh:209
Indicate interleaved ordering of the unknowns of non-leaf grid function spaces according to a given b...
Definition: gridfunctionspace/tags.hh:74
Definition: interleavedordering.hh:182
InterleavedOrderingTag OrderingTag
Definition: interleavedordering.hh:37
std::vector< typename Traits::SizeType > _child_block_merge_offsets
Definition: orderingbase.hh:283
static result< TC0, TC1, TC2, TC3, TC4, TC5, TC6, TC7, TC8, TC9 >::type transform(const GFSNode &gfs, const Transformation &t, shared_ptr< TC0 > c0, shared_ptr< TC1 > c1, shared_ptr< TC2 > c2, shared_ptr< TC3 > c3, shared_ptr< TC4 > c4, shared_ptr< TC5 > c5, shared_ptr< TC6 > c6, shared_ptr< TC7 > c7, shared_ptr< TC8 > c8, shared_ptr< TC9 > c9)
Definition: interleavedordering.hh:344
Definition: interleavedordering.hh:188
static result< TC0, TC1, TC2, TC3, TC4, TC5, TC6, TC7, TC8, TC9 >::storage_type transform_storage(shared_ptr< const GFSNode > gfs, const Transformation &t, shared_ptr< TC0 > c0, shared_ptr< TC1 > c1, shared_ptr< TC2 > c2, shared_ptr< TC3 > c3, shared_ptr< TC4 > c4, shared_ptr< TC5 > c5, shared_ptr< TC6 > c6, shared_ptr< TC7 > c7, shared_ptr< TC8 > c8, shared_ptr< TC9 > c9)
Definition: interleavedordering.hh:371
std::string name() const
Definition: interleavedordering.hh:261
Error related to the logical structure of an Ordering.
Definition: exceptions.hh:44
void update()
Definition: orderingbase.hh:100
CompositeInterleavedOrdering< typename Transformation::GridFunctionSpace::Traits::SizeType, TC0, TC1, TC2, TC3, TC4, TC5, TC6, TC7, TC8, TC9 > type
Definition: interleavedordering.hh:329
void update()
Definition: interleavedordering.hh:168
shared_ptr< type > storage_type
Definition: interleavedordering.hh:198
const bool _container_blocked
Definition: orderingbase.hh:275
CompositeInterleavedOrdering(bool backend_blocked, const InterleavedOrderingTag &ordering_tag, typename Base::GFSData *gfs_data, DUNE_TYPETREE_COMPOSITENODE_STORAGE_CONSTRUCTOR_SIGNATURE)
Construct ordering object.
Definition: interleavedordering.hh:256
Dune::PDELab::impl::GridFunctionSpaceOrderingData< typename Traits::SizeType > GFSData
Definition: orderingbase.hh:35
Base(Node &node, bool container_blocked, const OrderingTag &ordering_tag, typename BaseT::GFSData *gfs_data)
Construct ordering object.
Definition: interleavedordering.hh:47
const std::vector< std::size_t > & offsets() const
Returns a list of offsets for the child blocks.
Definition: gridfunctionspace/tags.hh:115