4 #ifndef DUNE_PDELAB_ORDERING_PERMUTEDORDERING_HH
5 #define DUNE_PDELAB_ORDERING_PERMUTEDORDERING_HH
7 #include <dune/typetree/typetree.hh>
18 #ifndef DOXYGEN // implementation internals
25 std::vector<std::size_t>& permutation()
30 const std::vector<std::size_t>& permutation()
const
37 std::vector<std::size_t> _permutation;
41 template<std::
size_t i>
62 template<
typename OrderingTag>
64 :
public permuted::base_holder<decorated_ordering_tag<Permuted<OrderingTag>,OrderingTag>::level>
79 template<std::
size_t i>
80 const permuted::base_holder<i>&
permuted()
const
85 template<std::
size_t i>
99 template<
typename Ordering>
101 :
public TypeTree::CompositeNode<Ordering>
103 typename Ordering::Traits::ContainerIndex>
104 ,
public OrderingBase<typename Ordering::Traits::DOFIndex,
105 typename Ordering::Traits::ContainerIndex>
108 typedef typename Ordering::Traits
Traits;
116 typedef TypeTree::CompositeNode<Ordering> NodeT;
118 typedef OrderingBase<
typename Ordering::Traits::DOFIndex,
119 typename Ordering::Traits::ContainerIndex>
BaseT;
125 return this->
template child<0>();
130 return this->
template child<0>();
136 ,
BaseT(*this,false,nullptr,this)
141 : NodeT(r.nodeStorage())
149 : NodeT(r.nodeStorage())
150 ,
BaseT(std::move(r))
158 virtual void map_index_dynamic(
typename Traits::DOFIndexView di,
typename Traits::ContainerIndex& ci)
const override
161 ci.back() = _tag.permutation()[ci.back()];
164 template<
typename ItIn,
typename ItOut>
167 for (; in != end; ++in, ++out)
169 out->back() = _tag.permutation()[out->back()];
173 template<
typename CIOutIterator>
174 typename Traits::SizeType
176 typename Traits::SizeType child_index,
177 CIOutIterator ci_out,
const CIOutIterator ci_end)
const
179 for (; ci_out != ci_end; ++ci_out)
181 ci_out->back() = _tag.permutation()[ci_out->back()];
190 if (!_tag.permutation().empty() && _tag.permutation().size() != this->blockCount())
192 "Size of permutation array does not match block count of ordering: "
193 << _tag.permutation().size()
195 << this->blockCount()
199 auto& mutable_tag =
const_cast<ordering::permuted::tag_base&
>(_tag);
200 mutable_tag.permutation().resize(this->
blockCount());
202 mutable_tag.permutation().begin(),
203 mutable_tag.permutation().end(),
211 const ordering::permuted::tag_base& _tag;
219 template<
typename GFS,
typename Transformation,
typename Undecorated,
typename Tag>
228 return transformed_type(make_tuple(undecorated),gfs.orderingTag().template permuted<Tag::level>());
233 return std::make_shared<transformed_type>(make_tuple(undecorated),gfs_pointer->orderingTag().template permuted<Tag::level>());
238 template<
typename GFS,
typename Transformation,
typename Undecorated,
typename GlueTag,
typename UndecoratedTag>
239 gfs_to_permuted<GFS,Transformation,Undecorated,GlueTag>
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>
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>
261 #endif // DUNE_PDELAB_ORDERING_PERMUTEDORDERING_HH