dune-pdelab  2.7-git
permutedordering.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_PERMUTEDORDERING_HH
5 #define DUNE_PDELAB_ORDERING_PERMUTEDORDERING_HH
6 
7 #include <dune/typetree/typetree.hh>
8 
12 
13 namespace Dune {
14  namespace PDELab {
15 
16  namespace ordering {
17 
18 #ifndef DOXYGEN // implementation internals
19 
20  namespace permuted {
21 
22  struct tag_base
23  {
24 
25  std::vector<std::size_t>& permutation()
26  {
27  return _permutation;
28  }
29 
30  const std::vector<std::size_t>& permutation() const
31  {
32  return _permutation;
33  }
34 
35  private:
36 
37  std::vector<std::size_t> _permutation;
38 
39  };
40 
41  template<std::size_t i>
42  struct base_holder
43  : public tag_base
44  {};
45 
46  } // namespace permuted
47 
48 #endif // DOXYGEN
49 
51 
62  template<typename OrderingTag>
63  struct Permuted
64  : public permuted::base_holder<decorated_ordering_tag<Permuted<OrderingTag>,OrderingTag>::level>
65  , public decorated_ordering_tag<Permuted<OrderingTag>,OrderingTag>
66  {
67 
69  {}
70 
71  Permuted(const OrderingTag& tag)
72  : decorated_ordering_tag<Permuted<OrderingTag>,OrderingTag>(tag)
73  {}
74 
75  Permuted(OrderingTag&& tag)
76  : decorated_ordering_tag<Permuted<OrderingTag>,OrderingTag>(std::move(tag))
77  {}
78 
79  template<std::size_t i>
80  const permuted::base_holder<i>& permuted() const
81  {
82  return *this;
83  }
84 
85  template<std::size_t i>
86  permuted::base_holder<i>& permuted()
87  {
88  return *this;
89  }
90 
91  };
92 
93  } // namespace ordering
94 
97 
99  template<typename Ordering>
101  : public TypeTree::CompositeNode<Ordering>
102  , public VirtualOrderingBase<typename Ordering::Traits::DOFIndex,
103  typename Ordering::Traits::ContainerIndex>
104  , public OrderingBase<typename Ordering::Traits::DOFIndex,
105  typename Ordering::Traits::ContainerIndex>
106  {
107  public:
108  typedef typename Ordering::Traits Traits;
109 
110  static const bool has_dynamic_ordering_children = true;
111 
112  static const bool consume_tree_index = false;
113 
114  private:
115 
116  typedef TypeTree::CompositeNode<Ordering> NodeT;
117 
118  typedef OrderingBase<typename Ordering::Traits::DOFIndex,
119  typename Ordering::Traits::ContainerIndex> BaseT;
120 
121  public:
122 
123  Ordering& ordering()
124  {
125  return this->template child<0>();
126  }
127 
128  const Ordering& ordering() const
129  {
130  return this->template child<0>();
131  }
132 
133 
134  PermutedOrdering(const typename NodeT::NodeStorage& ordering, const ordering::permuted::tag_base& tag)
135  : NodeT(ordering)
136  , BaseT(*this,false,nullptr,this)
137  , _tag(tag)
138  {}
139 
141  : NodeT(r.nodeStorage())
142  , BaseT(r)
143  ,_tag(r._tag)
144  {
145  this->setDelegate(this);
146  }
147 
149  : NodeT(r.nodeStorage())
150  , BaseT(std::move(r))
151  ,_tag(r._tag)
152  {
153  this->setDelegate(this);
154  }
155 
156  virtual ~PermutedOrdering() override = default;
157 
158  virtual void map_index_dynamic(typename Traits::DOFIndexView di, typename Traits::ContainerIndex& ci) const override
159  {
160  ordering().mapIndex(di,ci);
161  ci.back() = _tag.permutation()[ci.back()];
162  }
163 
164  template<typename ItIn, typename ItOut>
165  void map_lfs_indices(ItIn in, const ItIn end, ItOut out) const
166  {
167  for (; in != end; ++in, ++out)
168  {
169  out->back() = _tag.permutation()[out->back()];
170  }
171  }
172 
173  template<typename CIOutIterator>
174  typename Traits::SizeType
175  extract_entity_indices(const typename Traits::DOFIndex::EntityIndex& ei,
176  typename Traits::SizeType child_index,
177  CIOutIterator ci_out, const CIOutIterator ci_end) const
178  {
179  for (; ci_out != ci_end; ++ci_out)
180  {
181  ci_out->back() = _tag.permutation()[ci_out->back()];
182  }
183  return 0;
184  }
185 
186  void update()
187  {
188  ordering().update();
189  BaseT::update();
190  if (!_tag.permutation().empty() && _tag.permutation().size() != this->blockCount())
191  DUNE_THROW(PermutedOrderingSizeError,
192  "Size of permutation array does not match block count of ordering: "
193  << _tag.permutation().size()
194  << " != "
195  << this->blockCount()
196  );
197  else
198  {
199  auto& mutable_tag = const_cast<ordering::permuted::tag_base&>(_tag);
200  mutable_tag.permutation().resize(this->blockCount());
201  std::iota(
202  mutable_tag.permutation().begin(),
203  mutable_tag.permutation().end(),
204  0
205  );
206  }
207  }
208 
209  private:
210 
211  const ordering::permuted::tag_base& _tag;
212 
213  };
214 
215  namespace ordering {
216 
217  namespace permuted {
218 
219  template<typename GFS, typename Transformation, typename Undecorated, typename Tag>
221  {
222 
224  typedef std::shared_ptr<transformed_type> transformed_storage_type;
225 
226  static transformed_type transform(const GFS& gfs, const Transformation& t, std::shared_ptr<Undecorated> undecorated)
227  {
228  return transformed_type(make_tuple(undecorated),gfs.orderingTag().template permuted<Tag::level>());
229  }
230 
231  static transformed_storage_type transform_storage(std::shared_ptr<const GFS> gfs_pointer, const Transformation& t, std::shared_ptr<Undecorated> undecorated)
232  {
233  return std::make_shared<transformed_type>(make_tuple(undecorated),gfs_pointer->orderingTag().template permuted<Tag::level>());
234  }
235 
236  };
237 
238  template<typename GFS, typename Transformation, typename Undecorated, typename GlueTag, typename UndecoratedTag>
239  gfs_to_permuted<GFS,Transformation,Undecorated,GlueTag>
240  register_gfs_to_decorator_descriptor(GFS*,Transformation*,Undecorated*,GlueTag*,Permuted<UndecoratedTag>*);
241 
242  } // namespace permuted
243  } // namespace ordering
244 
245 
246  template<typename GFS, typename Transformation, typename U>
247  struct power_gfs_to_local_ordering_descriptor<GFS,Transformation,ordering::Permuted<U> >
248  : public power_gfs_to_local_ordering_descriptor<GFS,Transformation,U>
249  {};
250 
251 
252  template<typename GFS, typename Transformation, typename U>
253  struct composite_gfs_to_local_ordering_descriptor<GFS,Transformation,ordering::Permuted<U> >
254  : public composite_gfs_to_local_ordering_descriptor<GFS,Transformation,U>
255  {};
256 
258  } // namespace PDELab
259 } // namespace Dune
260 
261 #endif // DUNE_PDELAB_ORDERING_PERMUTEDORDERING_HH
For backward compatibility – Do not use this!
Definition: adaptivity.hh:28
gfs_to_permuted< GFS, Transformation, Undecorated, GlueTag > register_gfs_to_decorator_descriptor(GFS *, Transformation *, Undecorated *, GlueTag *, Permuted< UndecoratedTag > *)
A PermutedOrdering got a permutation vector of the wrong size.
Definition: exceptions.hh:51
Definition: orderingbase.hh:21
void update()
Definition: orderingbase.hh:97
void setDelegate(const VirtualOrderingBase< Ordering::Traits::DOFIndex, Ordering::Traits::ContainerIndex > *delegate)
Set the delegate called in mapIndex().
Definition: orderingbase.hh:227
Permute the ordering created from the passed-in tag based on a simple lookup table.
Definition: permutedordering.hh:66
permuted::base_holder< i > & permuted()
Definition: permutedordering.hh:86
Permuted(OrderingTag &&tag)
Definition: permutedordering.hh:75
const permuted::base_holder< i > & permuted() const
Definition: permutedordering.hh:80
Permuted(const OrderingTag &tag)
Definition: permutedordering.hh:71
Permuted()
Definition: permutedordering.hh:68
Ordering that permutes top-level ContainerIndex entries.
Definition: permutedordering.hh:106
static const bool consume_tree_index
Definition: permutedordering.hh:112
Ordering & ordering()
Definition: permutedordering.hh:123
void map_lfs_indices(ItIn in, const ItIn end, ItOut out) const
Definition: permutedordering.hh:165
Ordering::Traits Traits
Definition: permutedordering.hh:108
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: permutedordering.hh:175
virtual void map_index_dynamic(typename Traits::DOFIndexView di, typename Traits::ContainerIndex &ci) const override
Definition: permutedordering.hh:158
PermutedOrdering(const typename NodeT::NodeStorage &ordering, const ordering::permuted::tag_base &tag)
Definition: permutedordering.hh:134
const Ordering & ordering() const
Definition: permutedordering.hh:128
static const bool has_dynamic_ordering_children
Definition: permutedordering.hh:110
PermutedOrdering(PermutedOrdering &&r)
Definition: permutedordering.hh:148
PermutedOrdering(const PermutedOrdering &r)
Definition: permutedordering.hh:140
void update()
Definition: permutedordering.hh:186
virtual ~PermutedOrdering() override=default
Definition: permutedordering.hh:221
static transformed_storage_type transform_storage(std::shared_ptr< const GFS > gfs_pointer, const Transformation &t, std::shared_ptr< Undecorated > undecorated)
Definition: permutedordering.hh:231
static transformed_type transform(const GFS &gfs, const Transformation &t, std::shared_ptr< Undecorated > undecorated)
Definition: permutedordering.hh:226
std::shared_ptr< transformed_type > transformed_storage_type
Definition: permutedordering.hh:224
PermutedOrdering< Undecorated > transformed_type
Definition: permutedordering.hh:223
Definition: ordering/utility.hh:232