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;
110 static const bool has_dynamic_ordering_children =
true;
112 static const bool consume_tree_index =
false;
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>();
134 PermutedOrdering(
const typename NodeT::NodeStorage& ordering,
const ordering::permuted::tag_base& tag)
136 , BaseT(*this,false,nullptr,this)
141 : NodeT(r.nodeStorage())
145 this->setDelegate(
this);
149 : NodeT(r.nodeStorage())
150 , BaseT(
std::move(r))
153 this->setDelegate(
this);
156 virtual void map_index_dynamic(
typename Traits::DOFIndexView di,
typename Traits::ContainerIndex& ci)
const 158 ordering().mapIndex(di,ci);
159 ci.back() = _tag.permutation()[ci.back()];
162 template<
typename ItIn,
typename ItOut>
165 for (; in != end; ++in, ++out)
167 out->back() = _tag.permutation()[out->back()];
171 template<
typename CIOutIterator>
172 typename Traits::SizeType
174 typename Traits::SizeType child_index,
175 CIOutIterator ci_out,
const CIOutIterator ci_end)
const 177 for (; ci_out != ci_end; ++ci_out)
179 ci_out->back() = _tag.permutation()[ci_out->back()];
188 if (!_tag.permutation().empty() && _tag.permutation().size() != this->blockCount())
190 "Size of permutation array does not match block count of ordering: " 191 << _tag.permutation().size()
193 << this->blockCount()
197 auto& mutable_tag =
const_cast<ordering::permuted::tag_base&
>(_tag);
198 mutable_tag.permutation().resize(this->blockCount());
200 mutable_tag.permutation().begin(),
201 mutable_tag.permutation().end(),
209 const ordering::permuted::tag_base& _tag;
217 template<
typename GFS,
typename Transformation,
typename Undecorated,
typename Tag>
224 static transformed_type
transform(
const GFS& gfs,
const Transformation& t, std::shared_ptr<Undecorated> undecorated)
226 return transformed_type(make_tuple(undecorated),gfs.orderingTag().template permuted<Tag::level>());
229 static transformed_storage_type
transform_storage(std::shared_ptr<const GFS> gfs_pointer,
const Transformation& t, std::shared_ptr<Undecorated> undecorated)
231 return std::make_shared<transformed_type>(make_tuple(undecorated),gfs_pointer->orderingTag().template permuted<Tag::level>());
236 template<
typename GFS,
typename Transformation,
typename Undecorated,
typename GlueTag,
typename UndecoratedTag>
244 template<
typename GFS,
typename Transformation,
typename U>
245 struct power_gfs_to_local_ordering_descriptor<GFS,Transformation,ordering::Permuted<U> >
246 :
public power_gfs_to_local_ordering_descriptor<GFS,Transformation,U>
250 template<
typename GFS,
typename Transformation,
typename U>
251 struct composite_gfs_to_local_ordering_descriptor<GFS,Transformation,ordering::Permuted<U> >
252 :
public composite_gfs_to_local_ordering_descriptor<GFS,Transformation,U>
259 #endif // DUNE_PDELAB_ORDERING_PERMUTEDORDERING_HH static transformed_type transform(const GFS &gfs, const Transformation &t, std::shared_ptr< Undecorated > undecorated)
Definition: permutedordering.hh:224
void map_lfs_indices(ItIn in, const ItIn end, ItOut out) const
Definition: permutedordering.hh:163
A PermutedOrdering got a permutation vector of the wrong size.
Definition: exceptions.hh:49
Permuted(OrderingTag &&tag)
Definition: permutedordering.hh:75
permuted::base_holder< i > & permuted()
Definition: permutedordering.hh:86
Definition: decorator.hh:82
PermutedOrdering(const PermutedOrdering &r)
Definition: permutedordering.hh:140
Definition: adaptivity.hh:27
Ordering that permutes top-level ContainerIndex entries.
Definition: permutedordering.hh:100
PermutedOrdering(const typename NodeT::NodeStorage &ordering, const ordering::permuted::tag_base &tag)
Definition: permutedordering.hh:134
Definition: permutedordering.hh:218
virtual void map_index_dynamic(typename Traits::DOFIndexView di, typename Traits::ContainerIndex &ci) const
Definition: permutedordering.hh:156
Ordering::Traits Traits
Definition: permutedordering.hh:108
Permuted()
Definition: permutedordering.hh:68
const Ordering & ordering() const
Definition: permutedordering.hh:128
PermutedOrdering(PermutedOrdering &&r)
Definition: permutedordering.hh:148
gfs_to_permuted< GFS, Transformation, Undecorated, GlueTag > register_gfs_to_decorator_descriptor(GFS *, Transformation *, Undecorated *, GlueTag *, Permuted< UndecoratedTag > *)
std::shared_ptr< transformed_type > transformed_storage_type
Definition: permutedordering.hh:222
Permute the ordering created from the passed-in tag based on a simple lookup table.
Definition: permutedordering.hh:63
Definition: ordering/utility.hh:231
Permuted(const OrderingTag &tag)
Definition: permutedordering.hh:71
const permuted::base_holder< i > & permuted() const
Definition: permutedordering.hh:80
Definition: orderingbase.hh:20
void update()
Definition: permutedordering.hh:184
PermutedOrdering< Undecorated > transformed_type
Definition: permutedordering.hh:221
Ordering & ordering()
Definition: permutedordering.hh:123
static transformed_storage_type transform_storage(std::shared_ptr< const GFS > gfs_pointer, const Transformation &t, std::shared_ptr< Undecorated > undecorated)
Definition: permutedordering.hh:229
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:173