FEAT 3
Finite Element Analysis Toolbox
Loading...
Searching...
No Matches
tuple_filter.hpp
1// FEAT3: Finite Element Analysis Toolbox, Version 3
2// Copyright (C) 2010 by Stefan Turek & the FEAT group
3// FEAT3 is released under the GNU General Public License version 3,
4// see the file 'copyright.txt' in the top level directory for details.
5
6#pragma once
7
8// includes, FEAT
9#include <kernel/lafem/tuple_vector.hpp>
10#include <kernel/lafem/meta_element.hpp>
11
12namespace FEAT
13{
14 namespace LAFEM
15 {
30 template<
31 typename First_,
32 typename... Rest_>
34 {
35 template<typename,typename...>
36 friend class TupleFilter;
37
38 typedef TupleFilter<Rest_...> RestClass;
39
40 public:
42 static constexpr int num_blocks = TupleFilter<Rest_...>::num_blocks + 1;
43
45 typedef typename First_::DataType DataType;
47 typedef typename First_::IndexType IndexType;
48
49 // ensure that all sub-vector have the same data-type
50 static_assert(std::is_same<DataType, typename RestClass::DataType>::value,
51 "sub-filters have different data-types");
52 static_assert(std::is_same<IndexType, typename RestClass::IndexType>::value,
53 "sub-filters have different index-types");
54
56 typedef TupleVector<typename First_::VectorType, typename Rest_::VectorType...> VectorType;
57
59 template <typename DT2_ = DataType, typename IT2_ = IndexType>
61 typename First_::template FilterType<DT2_, IT2_>,
62 typename Rest_::template FilterType<DT2_, IT2_>...>;
63
65 template <typename DataType2_, typename IndexType2_>
67
68 protected:
70 First_ _first;
73
75 explicit TupleFilter(First_&& the_first, RestClass&& the_rest) :
76 _first(std::forward<First_>(the_first)),
77 _rest(std::forward<RestClass>(the_rest))
78 {
79 }
80
81 public:
84 {
85 }
86
88 explicit TupleFilter(First_&& the_first, Rest_&&... the_rest) :
89 _first(std::forward<First_>(the_first)),
90 _rest(std::forward<Rest_>(the_rest)...)
91 {
92 }
93
96 _first(std::forward<First_>(other._first)),
97 _rest(std::forward<RestClass>(other._rest))
98 {
99 }
100
103 {
104 if(this != &other)
105 {
106 _first = std::forward<First_>(other._first);
107 _rest = std::forward<RestClass>(other._rest);
108 }
109 return *this;
110 }
111
114 {
115 return TupleFilter(_first.clone(clone_mode), _rest.clone(clone_mode));
116 }
117
119 void clone(const TupleFilter & other, CloneMode clone_mode = CloneMode::Deep)
120 {
121 _first.clone(other._first, clone_mode);
122 _rest.clone(other._rest, clone_mode);
123 }
124
125 template<typename... SubFilter2_>
126 void convert(const TupleFilter<SubFilter2_...>& other)
127 {
128 _first.convert(other._first);
129 _rest.convert(other._rest);
130 }
131
133 std::size_t bytes() const
134 {
135 return _first.bytes() + _rest.bytes();
136 }
137
139 First_& first()
140 {
141 return _first;
142 }
143
144 const First_& first() const
145 {
146 return _first;
147 }
148
149 RestClass& rest()
150 {
151 return _rest;
152 }
153
154 const RestClass& rest() const
155 {
156 return _rest;
157 }
159
160 template<int i_>
161 typename TupleElement<i_, First_, Rest_...>::Type& at()
162 {
163 static_assert((0 <= i_) && (i_ < num_blocks), "invalid sub-filter index");
164 return TupleElement<i_, First_, Rest_...>::get(*this);
165 }
166
168 template<int i_>
169 typename TupleElement<i_, First_, Rest_...>::Type const& at() const
170 {
171 static_assert((0 <= i_) && (i_ < num_blocks), "invalid sub-filter index");
173 }
174
176 void filter_rhs(VectorType& vector) const
177 {
178 first().filter_rhs(vector.first());
179 rest().filter_rhs(vector.rest());
180 }
181
183 void filter_sol(VectorType& vector) const
184 {
185 first().filter_sol(vector.first());
186 rest().filter_sol(vector.rest());
187 }
188
190 void filter_def(VectorType& vector) const
191 {
192 first().filter_def(vector.first());
193 rest().filter_def(vector.rest());
194 }
195
197 void filter_cor(VectorType& vector) const
198 {
199 first().filter_cor(vector.first());
200 rest().filter_cor(vector.rest());
201 }
202 }; // class TupleFilter
203
205 template<typename First_>
206 class TupleFilter<First_>
207 {
208 template<typename,typename...>
209 friend class TupleFilter;
210
211 public:
212 static constexpr int num_blocks = 1;
213
215 typedef typename First_::DataType DataType;
217 typedef typename First_::IndexType IndexType;
218
219 typedef TupleVector<typename First_::VectorType> VectorType;
220
221 template <typename DT2_ = DataType, typename IT2_ = IndexType>
222 using FilterType = TupleFilter<typename First_::template FilterType<DT2_, IT2_> >;
223
225 template <typename DataType2_, typename IndexType2_>
226 using FilterTypeByDI = FilterType<DataType2_, IndexType2_>;
227
228 protected:
230 First_ _first;
231
232 public:
234 TupleFilter()
235 {
236 }
237
239 explicit TupleFilter(First_&& the_first) :
240 _first(std::forward<First_>(the_first))
241 {
242 }
243
245 TupleFilter(TupleFilter&& other) :
246 _first(std::forward<First_>(other._first))
247 {
248 }
249
251 TupleFilter& operator=(TupleFilter&& other)
252 {
253 if(this != &other)
254 {
255 _first = std::forward<First_>(other._first);
256 }
257 return *this;
258 }
259
261 TupleFilter clone(CloneMode clone_mode = CloneMode::Deep) const
262 {
263 return TupleFilter(_first.clone(clone_mode));
264 }
265
267 void clone(const TupleFilter & other, CloneMode clone_mode = CloneMode::Deep)
268 {
269 _first.clone(other._first, clone_mode);
270 }
271
272 template<typename SubFilter2_>
273 void convert(const TupleFilter<SubFilter2_>& other)
274 {
275 _first.convert(other._first);
276 }
277
279 std::size_t bytes() const
280 {
281 return _first.bytes();
282 }
283
284 First_& first()
285 {
286 return _first;
287 }
288
289 const First_& first() const
290 {
291 return _first;
292 }
293
294 template<int i_>
295 typename TupleElement<i_, First_>::Type& at()
296 {
297 static_assert(i_ == 0, "invalid sub-filter index");
298 return first();
299 }
300
301 template<int i_>
302 typename TupleElement<i_, First_>::Type const& at() const
303 {
304 static_assert(i_ == 0, "invalid sub-filter index");
305 return first();
306 }
307
309 void filter_rhs(VectorType& vector) const
310 {
311 first().filter_rhs(vector.first());
312 }
313
315 void filter_sol(VectorType& vector) const
316 {
317 first().filter_sol(vector.first());
318 }
319
321 void filter_def(VectorType& vector) const
322 {
323 first().filter_def(vector.first());
324 }
325
327 void filter_cor(VectorType& vector) const
328 {
329 first().filter_cor(vector.first());
330 }
331 }; // class TupleFilter
333 } // namespace LAFEM
334} // namespace FEAT
TupleVector meta-filter class template.
First_::DataType DataType
sub-filter data-type
void filter_def(VectorType &vector) const
Applies the filter onto a defect vector.
TupleFilter(First_ &&the_first, RestClass &&the_rest)
data-emplacement ctor; this one is protected for a reason
void filter_rhs(VectorType &vector) const
Applies the filter onto the right-hand-side vector.
TupleFilter clone(CloneMode clone_mode=CloneMode::Deep) const
Creates a clone of itself.
TupleFilter & operator=(TupleFilter &&other)
move-assign operator
void clone(const TupleFilter &other, CloneMode clone_mode=CloneMode::Deep)
Clones data from another TupleFilter.
First_ _first
the first sub-filter
First_::IndexType IndexType
sub-filter index-type
TupleFilter< typename First_::template FilterType< DT2_, IT2_ >, typename Rest_::template FilterType< DT2_, IT2_ >... > FilterType
Our 'base' class type.
static constexpr int num_blocks
number of vector blocks
TupleElement< i_, First_, Rest_... >::Type const & at() const
TupleFilter(TupleFilter &&other)
move-ctor
TupleVector< typename First_::VectorType, typename Rest_::VectorType... > VectorType
corresponding vector
FilterType< DataType2_, IndexType2_ > FilterTypeByDI
this typedef lets you create a filter with different Data and Index types
TupleFilter(First_ &&the_first, Rest_ &&... the_rest)
sub-filter emplacement ctor
void filter_sol(VectorType &vector) const
Applies the filter onto the solution vector.
void filter_cor(VectorType &vector) const
Applies the filter onto a correction vector.
RestClass _rest
all remaining sub-filters
std::size_t bytes() const
Returns the total amount of bytes allocated.
Variadic TupleVector class template.
@ other
generic/other permutation strategy
@ rest
restriction (multigrid)
FEAT namespace.
Definition: adjactor.hpp:12
Tuple container element helper class template.