4#ifndef DUNE_PDELAB_ORDERING_PERMUTEDORDERING_HH
5#define DUNE_PDELAB_ORDERING_PERMUTEDORDERING_HH
7#include <dune/typetree/typetree.hh>
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())
160 typename Traits::SizeType
size(
typename Traits::ContainerIndex suffix)
const {
161 if (suffix.size() == 0)
164 suffix.back() = _tag.permutation()[suffix.back()];
168 virtual void map_index_dynamic(
typename Traits::DOFIndexView di,
typename Traits::ContainerIndex& ci)
const override
171 ci.back() = _tag.permutation()[ci.back()];
174 template<
typename ItIn,
typename ItOut>
177 for (; in != end; ++in, ++out)
179 out->back() = _tag.permutation()[out->back()];
183 template<
typename CIOutIterator>
184 typename Traits::SizeType
186 typename Traits::SizeType child_index,
187 CIOutIterator ci_out,
const CIOutIterator ci_end)
const
189 for (; ci_out != ci_end; ++ci_out)
191 ci_out->back() = _tag.permutation()[ci_out->back()];
200 if (!_tag.permutation().empty() && _tag.permutation().size() != this->blockCount())
202 "Size of permutation array does not match block count of ordering: "
203 << _tag.permutation().size()
205 << this->blockCount()
209 auto& mutable_tag =
const_cast<ordering::permuted::tag_base&
>(_tag);
210 mutable_tag.permutation().resize(this->
blockCount());
212 mutable_tag.permutation().begin(),
213 mutable_tag.permutation().end(),
221 const ordering::permuted::tag_base& _tag;
229 template<
typename GFS,
typename Transformation,
typename Undecorated,
typename Tag>
238 return transformed_type(make_tuple(undecorated),gfs.orderingTag().template permuted<Tag::level>());
243 return std::make_shared<transformed_type>(make_tuple(undecorated),gfs_pointer->orderingTag().template permuted<Tag::level>());
248 template<
typename GFS,
typename Transformation,
typename Undecorated,
typename GlueTag,
typename UndecoratedTag>
249 gfs_to_permuted<GFS,Transformation,Undecorated,GlueTag>
256 template<
typename GFS,
typename Transformation,
typename U>
257 struct power_gfs_to_local_ordering_descriptor<GFS,Transformation,ordering::Permuted<U> >
258 :
public power_gfs_to_local_ordering_descriptor<GFS,Transformation,U>
262 template<
typename GFS,
typename Transformation,
typename U>
263 struct composite_gfs_to_local_ordering_descriptor<GFS,Transformation,ordering::Permuted<U> >
264 :
public composite_gfs_to_local_ordering_descriptor<GFS,Transformation,U>
For backward compatibility – Do not use this!
Definition: adaptivity.hh:28
A PermutedOrdering got a permutation vector of the wrong size.
Definition: exceptions.hh:51
Definition: decorator.hh:87
Definition: orderingbase.hh:21
void update()
Definition: orderingbase.hh:97
Traits::SizeType blockCount() const
Definition: orderingbase.hh:66
void setDelegate(const VirtualOrderingBase< Ordering::Traits::DOFIndex, Ordering::Traits::ContainerIndex > *delegate)
Set the delegate called in mapIndex().
Definition: orderingbase.hh:227
Traits::SizeType size() const
Definition: orderingbase.hh:61
Permute the ordering created from the passed-in tag based on a simple lookup table.
Definition: permutedordering.hh:66
const permuted::base_holder< i > & permuted() const
Definition: permutedordering.hh:80
Permuted(OrderingTag &&tag)
Definition: permutedordering.hh:75
permuted::base_holder< i > & permuted()
Definition: permutedordering.hh:86
Permuted(const OrderingTag &tag)
Definition: permutedordering.hh:71
Permuted()
Definition: permutedordering.hh:68
Ordering that permutes top-level ContainerIndex entries.
Definition: permutedordering.hh:106
const Ordering & ordering() const
Definition: permutedordering.hh:128
Ordering & ordering()
Definition: permutedordering.hh:123
static const bool consume_tree_index
Definition: permutedordering.hh:112
void map_lfs_indices(ItIn in, const ItIn end, ItOut out) const
Definition: permutedordering.hh:175
Ordering::Traits Traits
Definition: permutedordering.hh:108
Traits::SizeType size(typename Traits::ContainerIndex suffix) const
Definition: permutedordering.hh:160
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:185
virtual void map_index_dynamic(typename Traits::DOFIndexView di, typename Traits::ContainerIndex &ci) const override
Definition: permutedordering.hh:168
PermutedOrdering(const typename NodeT::NodeStorage &ordering, const ordering::permuted::tag_base &tag)
Definition: permutedordering.hh:134
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:196
virtual ~PermutedOrdering() override=default
Definition: permutedordering.hh:231
static transformed_storage_type transform_storage(std::shared_ptr< const GFS > gfs_pointer, const Transformation &t, std::shared_ptr< Undecorated > undecorated)
Definition: permutedordering.hh:241
static transformed_type transform(const GFS &gfs, const Transformation &t, std::shared_ptr< Undecorated > undecorated)
Definition: permutedordering.hh:236
std::shared_ptr< transformed_type > transformed_storage_type
Definition: permutedordering.hh:234
PermutedOrdering< Undecorated > transformed_type
Definition: permutedordering.hh:233
Definition: ordering/utility.hh:243