dune-pdelab  2.7-git
entityblockedlocalordering.hh
Go to the documentation of this file.
1 // -*- tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2 // vi: set et ts=8 sw=2 sts=2:
3 
4 #ifndef DUNE_PDELAB_ORDERING_ENTITYBLOCKEDLOCALORDERING_HH
5 #define DUNE_PDELAB_ORDERING_ENTITYBLOCKEDLOCALORDERING_HH
6 
7 #include <cstddef>
8 #include <ostream>
9 #include <string>
10 
11 #include <dune/common/classname.hh>
12 #include <dune/common/exceptions.hh>
13 #include <dune/common/stdstreams.hh>
14 #include <dune/common/typetraits.hh>
15 #include <dune/common/deprecated.hh>
16 #include <dune/common/hybridutilities.hh>
17 
18 #include <dune/typetree/compositenode.hh>
19 #include <dune/typetree/powernode.hh>
20 #include <dune/typetree/traversal.hh>
21 #include <dune/typetree/visitor.hh>
22 #include <dune/typetree/typetraits.hh>
23 
25 
26 namespace Dune {
27  namespace PDELab {
28 
31 
32  template<typename ChildOrdering, std::size_t k>
34  : public TypeTree::PowerNode<ChildOrdering,k>
35  , public LocalOrderingBase<typename ChildOrdering::Traits::EntitySet,
36  typename ChildOrdering::Traits::DOFIndex,
37  typename ChildOrdering::Traits::ContainerIndex>
38  {
39 
40  typedef TypeTree::PowerNode<ChildOrdering,k> NodeT;
41  typedef LocalOrderingBase<typename ChildOrdering::Traits::EntitySet,
42  typename ChildOrdering::Traits::DOFIndex,
43  typename ChildOrdering::Traits::ContainerIndex> BaseT;
44 
45  public:
46 
47  static const bool consume_tree_index = true;
48 
49  typedef typename BaseT::Traits Traits;
50 
51  PowerEntityBlockedLocalOrdering(const typename NodeT::NodeStorage& child_storage, bool container_blocked)
52  : NodeT(child_storage)
53  , BaseT(*this,container_blocked,nullptr)
54  {}
55 
56  using BaseT::size;
57 
64  typename Traits::SizeType
65  size(const typename Traits::ContainerIndex& suffix,
66  const typename Traits::DOFIndex::EntityIndex &index) const {
67  return this->node_size(*this,suffix,index);
68  }
69  };
70 
71 
72  template<typename GFS, typename Transformation>
73  struct power_gfs_to_local_ordering_descriptor<GFS,Transformation,EntityBlockedOrderingTag>
74  {
75 
76  static const bool recursive = true;
77 
78  template<typename TC>
79  struct result
80  {
82  typedef std::shared_ptr<type> storage_type;
83  };
84 
85  template<typename TC>
86  static typename result<TC>::type transform(const GFS& gfs, const Transformation& t, const std::array<std::shared_ptr<TC>,TypeTree::StaticDegree<GFS>::value>& children)
87  {
88  return typename result<TC>::type(children,gfs.backend().blocked(gfs));
89  }
90 
91  template<typename TC>
92  static typename result<TC>::storage_type transform_storage(std::shared_ptr<const GFS> gfs, const Transformation& t, const std::array<std::shared_ptr<TC>,TypeTree::StaticDegree<GFS>::value>& children)
93  {
94  return std::make_shared<typename result<TC>::type>(children,gfs->backend().blocked(*gfs));
95  }
96 
97  };
98 
99 
100 
101  template<typename GFS, typename Transformation>
103  {
104 
105  static const bool recursive = false;
106 
107  typedef TypeTree::TransformTree<GFS,gfs_to_local_ordering<Transformation> > LocalOrderingTransformation;
108  typedef typename LocalOrderingTransformation::Type LocalOrdering;
109 
111 
112  typedef std::shared_ptr<transformed_type> transformed_storage_type;
113 
114  using EntitySet = typename GFS::Traits::EntitySet;
115 
116  static transformed_type transform(const GFS& gfs, const Transformation& t)
117  {
118  // check and extract common entity set on leaf nodes
119  auto es_visitor = impl::common_entity_set<EntitySet>{};
120  TypeTree::applyToTree(gfs, es_visitor);
121  assert(es_visitor._entity_set);
122  auto& es = *es_visitor._entity_set;
123  // build local ordering tree
124  auto local_ordering = std::make_shared<LocalOrdering>(LocalOrderingTransformation::transform(gfs,gfs_to_local_ordering<Transformation>()));
125  bool blocked = gfs.backend().blocked(gfs);
126  // create grid view ordering
127  transformed_type r(make_tuple(std::move(local_ordering)),blocked,const_cast<GFS*>(&gfs),es);
128  return r;
129  }
130 
131  static transformed_storage_type transform_storage(std::shared_ptr<const GFS> gfs, const Transformation& t)
132  {
133  // check and extract common entity set on leaf nodes
134  auto es_visitor = impl::common_entity_set<EntitySet>{};
135  TypeTree::applyToTree(*gfs, es_visitor);
136  assert(es_visitor._entity_set);
137  auto& es = *es_visitor._entity_set;
138  // build local ordering tree
139  auto local_ordering = LocalOrderingTransformation::transform_storage(gfs,gfs_to_local_ordering<Transformation>());
140  bool blocked = gfs->backend().blocked(*gfs);
141  // create grid view ordering
142  transformed_storage_type r(std::make_shared<transformed_type>(make_tuple(std::move(local_ordering)),blocked,const_cast<GFS*>(gfs.get()),es));
143  return r;
144  }
145 
146  };
147 
148  template<typename GFS, typename Transformation>
149  power_gfs_to_entityblocked_ordering_descriptor<GFS,Transformation>
151 
152 
153 
154  template<typename... Children>
156  : public TypeTree::CompositeNode<Children...>
157  , public LocalOrderingBase<typename first_type<Children...>::type::Traits::EntitySet,
158  typename first_type<Children...>::type::Traits::DOFIndex,
159  typename first_type<Children...>::type::Traits::ContainerIndex>
160  {
161 
162  typedef TypeTree::CompositeNode<Children...> Node;
163  typedef LocalOrderingBase<typename first_type<Children...>::type::Traits::EntitySet,
164  typename first_type<Children...>::type::Traits::DOFIndex,
165  typename first_type<Children...>::type::Traits::ContainerIndex> Base;
166 
167  public:
168 
169  typedef typename Base::Traits Traits;
170 
171  static const bool consume_tree_index = true;
172 
173  CompositeEntityBlockedLocalOrdering(bool container_blocked, std::shared_ptr<Children>... children)
174  : Node(children...)
175  , Base(*this,container_blocked,nullptr)
176  {}
177 
178  using Base::size;
179 
189  typename Traits::SizeType
190  size(const typename Traits::ContainerIndex &suffix,
191  const typename Traits::DOFIndex::EntityIndex &index) const {
192  return this->node_size(*this,suffix,index);
193  }
194 
195  };
196 
197 
198  template<typename GFS, typename Transformation>
199  struct composite_gfs_to_local_ordering_descriptor<GFS,Transformation,EntityBlockedOrderingTag>
200  {
201 
202  static const bool recursive = true;
203 
204  template<typename... TC>
205  struct result
206  {
208  typedef std::shared_ptr<type> storage_type;
209  };
210 
211  template<typename... TC>
212  static typename result<TC...>::type transform(const GFS& gfs, const Transformation& t, std::shared_ptr<TC>... children)
213  {
214  return typename result<TC...>::type(gfs.backend().blocked(gfs),children...);
215  }
216 
217  template<typename... TC>
218  static typename result<TC...>::storage_type transform_storage(std::shared_ptr<const GFS> gfs, const Transformation& t, std::shared_ptr<TC>... children)
219  {
220  return std::make_shared<typename result<TC...>::type>(gfs->backend().blocked(*gfs),children...);
221  }
222 
223  };
224 
225  template<typename GFS, typename Transformation>
227  {
228  static const bool recursive = false;
229 
230  typedef TypeTree::TransformTree<GFS,gfs_to_local_ordering<Transformation> > LocalOrderingTransformation;
231  typedef typename LocalOrderingTransformation::Type LocalOrdering;
232 
234 
235  typedef std::shared_ptr<transformed_type> transformed_storage_type;
236 
237  using EntitySet = typename GFS::Traits::EntitySet;
238 
239  static transformed_type transform(const GFS& gfs, const Transformation& t)
240  {
241  // check and extract common entity set on leaf nodes
242  auto es_visitor = impl::common_entity_set<EntitySet>{};
243  TypeTree::applyToTree(gfs, es_visitor);
244  assert(es_visitor._entity_set);
245  auto& es = *es_visitor._entity_set;
246  bool blocked = gfs.backend().blocked(gfs);
247  // build local ordering tree
248  auto local_ordering = std::make_shared<LocalOrdering>(LocalOrderingTransformation::transform(gfs,gfs_to_local_ordering<Transformation>()));
249  // create grid view ordering
250  transformed_type r(make_tuple(std::move(local_ordering)),blocked,const_cast<GFS*>(&gfs),es);
251  return r;
252  }
253 
254  static transformed_storage_type transform_storage(std::shared_ptr<const GFS> gfs, const Transformation& t)
255  {
256  // check and extract common entity set on leaf nodes
257  auto es_visitor = impl::common_entity_set<EntitySet>{};
258  TypeTree::applyToTree(*gfs, es_visitor);
259  assert(es_visitor._entity_set);
260  auto& es = *es_visitor._entity_set;
261  bool blocked = gfs->backend().blocked(*gfs);
262  // build local ordering tree
263  auto local_ordering = make_tuple(LocalOrderingTransformation::transform_storage(gfs,gfs_to_local_ordering<Transformation>()));
264  // create grid view ordering
265  transformed_storage_type r(std::make_shared<transformed_type>(std::move(local_ordering),blocked,const_cast<GFS*>(gfs.get()),es));
266  return r;
267  }
268 
269  };
270 
271  template<typename GFS, typename Transformation>
272  composite_gfs_to_entityblocked_ordering_descriptor<GFS,Transformation>
274 
275 
277  } // namespace PDELab
278 } // namespace Dune
279 
280 #endif // DUNE_PDELAB_ORDERING_ENTITYBLOCKEDLOCALORDERING_HH
std::size_t index
Definition: interpolate.hh:97
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 *)
For backward compatibility – Do not use this!
Definition: adaptivity.hh:28
Indicate blocking of the unknowns by grid entity.
Definition: gridfunctionspace/tags.hh:53
Definition: entityblockedlocalordering.hh:38
BaseT::Traits Traits
Definition: entityblockedlocalordering.hh:49
static const bool consume_tree_index
Definition: entityblockedlocalordering.hh:47
PowerEntityBlockedLocalOrdering(const typename NodeT::NodeStorage &child_storage, bool container_blocked)
Definition: entityblockedlocalordering.hh:51
Traits::SizeType size(const typename Traits::ContainerIndex &suffix, const typename Traits::DOFIndex::EntityIndex &index) const
Returns the size for a given suffix.
Definition: entityblockedlocalordering.hh:65
static result< TC >::type transform(const GFS &gfs, const Transformation &t, const std::array< std::shared_ptr< TC >, TypeTree::StaticDegree< GFS >::value > &children)
Definition: entityblockedlocalordering.hh:86
static result< TC >::storage_type transform_storage(std::shared_ptr< const GFS > gfs, const Transformation &t, const std::array< std::shared_ptr< TC >, TypeTree::StaticDegree< GFS >::value > &children)
Definition: entityblockedlocalordering.hh:92
PowerEntityBlockedLocalOrdering< TC, TypeTree::StaticDegree< GFS >::value > type
Definition: entityblockedlocalordering.hh:81
Definition: entityblockedlocalordering.hh:103
GridViewOrdering< LocalOrdering > transformed_type
Definition: entityblockedlocalordering.hh:110
static transformed_storage_type transform_storage(std::shared_ptr< const GFS > gfs, const Transformation &t)
Definition: entityblockedlocalordering.hh:131
TypeTree::TransformTree< GFS, gfs_to_local_ordering< Transformation > > LocalOrderingTransformation
Definition: entityblockedlocalordering.hh:107
LocalOrderingTransformation::Type LocalOrdering
Definition: entityblockedlocalordering.hh:108
static transformed_type transform(const GFS &gfs, const Transformation &t)
Definition: entityblockedlocalordering.hh:116
std::shared_ptr< transformed_type > transformed_storage_type
Definition: entityblockedlocalordering.hh:112
typename GFS::Traits::EntitySet EntitySet
Definition: entityblockedlocalordering.hh:114
static const bool recursive
Definition: entityblockedlocalordering.hh:105
Definition: entityblockedlocalordering.hh:160
Traits::SizeType size(const typename Traits::ContainerIndex &suffix, const typename Traits::DOFIndex::EntityIndex &index) const
Returns the size for a given suffix.
Definition: entityblockedlocalordering.hh:190
static const bool consume_tree_index
Definition: entityblockedlocalordering.hh:171
CompositeEntityBlockedLocalOrdering(bool container_blocked, std::shared_ptr< Children >... children)
Definition: entityblockedlocalordering.hh:173
Base::Traits Traits
Definition: entityblockedlocalordering.hh:169
static result< TC... >::storage_type transform_storage(std::shared_ptr< const GFS > gfs, const Transformation &t, std::shared_ptr< TC >... children)
Definition: entityblockedlocalordering.hh:218
static result< TC... >::type transform(const GFS &gfs, const Transformation &t, std::shared_ptr< TC >... children)
Definition: entityblockedlocalordering.hh:212
CompositeEntityBlockedLocalOrdering< TC... > type
Definition: entityblockedlocalordering.hh:207
Definition: entityblockedlocalordering.hh:227
GridViewOrdering< LocalOrdering > transformed_type
Definition: entityblockedlocalordering.hh:233
typename GFS::Traits::EntitySet EntitySet
Definition: entityblockedlocalordering.hh:237
static transformed_type transform(const GFS &gfs, const Transformation &t)
Definition: entityblockedlocalordering.hh:239
TypeTree::TransformTree< GFS, gfs_to_local_ordering< Transformation > > LocalOrderingTransformation
Definition: entityblockedlocalordering.hh:230
static transformed_storage_type transform_storage(std::shared_ptr< const GFS > gfs, const Transformation &t)
Definition: entityblockedlocalordering.hh:254
static const bool recursive
Definition: entityblockedlocalordering.hh:228
LocalOrderingTransformation::Type LocalOrdering
Definition: entityblockedlocalordering.hh:231
std::shared_ptr< transformed_type > transformed_storage_type
Definition: entityblockedlocalordering.hh:235
Transforms a local ordering (entity-wise order) into a global ordering.
Definition: gridviewordering.hh:440
Entity-wise orderings.
Definition: localorderingbase.hh:30
Traits::SizeType node_size(const Node &node, typename Traits::ContainerIndex suffix, const typename Traits::DOFIndex::EntityIndex &index) const
Gives the size for a given entity and suffix.
Definition: localorderingbase.hh:287
Traits::SizeType size(const typename Traits::DOFIndex::EntityIndex &index) const
Definition: localorderingbase.hh:229
CI ContainerIndex
Definition: ordering/utility.hh:176
DI::size_type SizeType
Definition: ordering/utility.hh:218
Definition: ordering/utility.hh:224
static const unsigned int value
Definition: gridfunctionspace/tags.hh:139