DUNE PDELab (2.7)

leafgridviewordering.hh
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_LEAFGRIDVIEWORDERING_HH
5#define DUNE_PDELAB_ORDERING_LEAFGRIDVIEWORDERING_HH
6
7#include <dune/pdelab/ordering/directleaflocalordering.hh>
8#include <dune/pdelab/ordering/leaforderingbase.hh>
9
10namespace Dune {
11 namespace PDELab {
12
15
17 template<typename LocalOrdering>
19 : public LeafOrderingBase<LocalOrdering>
20 {
21 public:
22 typedef typename LocalOrdering::Traits Traits;
23
24 private:
25
26 using ES = typename Traits::EntitySet;
27
29 typedef typename BaseT::NodeT NodeT;
30
31 public:
32
33 LeafGridViewOrdering(const typename NodeT::NodeStorage& local_ordering, bool container_blocked, typename BaseT::GFSData* gfs_data)
34 : BaseT(local_ordering, container_blocked, gfs_data)
35 , _es(this->template child<0>().entitySet())
36 {}
37
38#ifndef DOXYGEN
39
40// we need to override the default copy / move ctor to fix the delegate pointer, but that is
41// hardly interesting to our users...
42
44 : BaseT(r)
45 , _es(r._es)
46 {}
47
49 : BaseT(std::move(r))
50 , _es(r._es)
51 {}
52
53#endif // DOXYGEN
54
55 virtual ~LeafGridViewOrdering() override = default;
56
57 virtual void update() override
58 {
59 LocalOrdering& lo = this->localOrdering();
60 lo.update_a_priori_fixed_size();
61
62 const std::size_t dim = ES::dimension;
63
64 typename ES::CodimMask codims;
65 codims.set(0); // always need cells
66 lo.collect_used_codims(codims);
67
68 for (typename ES::dim_type codim = 0; codim <= ES::dimension; ++codim)
69 if (codims.test(codim))
70 _es.addCodim(codim);
71
72 _es.update();
73
74 typedef typename Traits::SizeType size_type;
75 auto geom_types = _es.indexSet().types();
76
77 if (lo._fixed_size)
78 {
79 lo.update_fixed_size(geom_types.begin(),geom_types.end());
80 }
81 else
82 {
83 lo.pre_collect_used_geometry_types_from_cell();
84
85 for (const auto& element : elements(_es))
86 {
87 lo.collect_used_geometry_types_from_cell(element);
88 }
89
90 lo.allocate_entity_offset_vector(geom_types.begin(),geom_types.end());
91
92 for (const auto& element : elements(_es))
93 {
94 lo.extract_per_entity_sizes_from_cell(element);
95 }
96
97 // FIXME: handling of blocked containers!
98 lo.finalize_non_fixed_size_update();
99 }
100
101 // we need to re-test here, as the local ordering could have detected a fixed size ordering
102 // and switched its implementation
103 if (lo._fixed_size)
104 {
105 _gt_dof_offsets.assign(GlobalGeometryTypeIndex::size(dim) + 1,0);
106 _size = 0;
107
108 for (auto gt : geom_types)
109 {
110 const size_type gt_index = GlobalGeometryTypeIndex::index(gt);
111 size_type gt_size = lo.size(gt_index,0);
112 size_type entity_count = _es.indexSet().size(gt);
113 _size += gt_size * entity_count;
114 if (_container_blocked)
115 gt_size = gt_size > 0;
116 _gt_dof_offsets[gt_index + 1] = gt_size * entity_count;
117 }
118 std::partial_sum(_gt_dof_offsets.begin(),_gt_dof_offsets.end(),_gt_dof_offsets.begin());
119 _block_count = _gt_dof_offsets.back();
120 _codim_fixed_size.set();
121 }
122 else
123 {
124 _block_count = _size = lo._entity_dof_offsets.back();
125 _codim_fixed_size.reset();
126 }
127
128 _fixed_size = lo._fixed_size;
129 _max_local_size = lo.maxLocalSize();
130
131 _codim_used = lo._codim_used;
132 _codim_fixed_size = lo._codim_fixed_size;
133
134 }
135
136 using BaseT::fixedSize;
137
138 private:
139
140 using BaseT::_max_local_size;
141 using BaseT::_size;
142 using BaseT::_block_count;
143 using BaseT::_container_blocked;
144 using BaseT::_fixed_size;
145 using BaseT::_codim_used;
146 using BaseT::_codim_fixed_size;
147 using BaseT::_gt_dof_offsets;
148
149 typename Traits::EntitySet _es;
150 };
151
152
153 template<typename GFS, typename Transformation>
154 struct direct_leaf_gfs_to_gridview_ordering_descriptor
155 {
156
157 static const bool recursive = false;
158
159 typedef DirectLeafLocalOrdering<typename GFS::Traits::OrderingTag,
160 typename GFS::Traits::FiniteElementMap,
161 typename GFS::Traits::EntitySet,
162 typename Transformation::DOFIndex,
163 typename Transformation::ContainerIndex
164 > LocalOrdering;
165
166 typedef LeafGridViewOrdering<LocalOrdering> GridViewOrdering;
167
168 typedef GridViewOrdering transformed_type;
169 typedef std::shared_ptr<transformed_type> transformed_storage_type;
170
171 static transformed_type transform(const GFS& gfs, const Transformation& t)
172 {
173 return transformed_type(make_tuple(std::make_shared<LocalOrdering>(gfs.finiteElementMapStorage(),gfs.entitySet())),gfs.backend().blocked(gfs),const_cast<GFS*>(&gfs));
174 }
175
176 static transformed_storage_type transform_storage(std::shared_ptr<const GFS> gfs, const Transformation& t)
177 {
178 return std::make_shared<transformed_type>(make_tuple(std::make_shared<LocalOrdering>(gfs->finiteElementMapStorage(),gfs->entitySet())),gfs->backend().blocked(*gfs),const_cast<GFS*>(gfs.get()));
179 }
180
181 };
182
183
184 template<typename GFS, typename Transformation, typename Params>
185 direct_leaf_gfs_to_gridview_ordering_descriptor<GFS,Transformation>
186 register_leaf_gfs_to_ordering_descriptor(GFS*,Transformation*,LeafOrderingTag<Params>*);
187
189 } // namespace PDELab
190} // namespace Dune
191
192#endif // DUNE_PDELAB_ORDERING_LEAFGRIDVIEWORDERING_HH
static constexpr std::size_t index(const GeometryType &gt)
Compute the index for the given geometry type over all dimensions.
Definition: typeindex.hh:133
static constexpr std::size_t size(std::size_t maxdim)
Compute total number of geometry types up to and including the given dimension.
Definition: typeindex.hh:120
Gridview ordering for leaf spaces.
Definition: leafgridviewordering.hh:20
virtual void update() override
Definition: leafgridviewordering.hh:57
Generic infrastructure for orderings for leaf spaces.
Definition: leaforderingbase.hh:27
std::tuple< std::shared_ptr< Children >... > NodeStorage
The type used for storing the children.
Definition: compositenode.hh:33
bool gt(const T &first, const T &second, typename EpsilonType< T >::Type epsilon)
test if first greater than second
Definition: float_cmp.cc:156
Dune namespace.
Definition: alignedallocator.hh:14
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden  |  generated with Hugo v0.111.3 (Jul 15, 22:36, 2024)