FEAT 3
Finite Element Analysis Toolbox
Loading...
Searching...
No Matches
mean_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/dense_vector.hpp>
10#include <kernel/util/dist.hpp>
11
12namespace FEAT
13{
14 namespace Global
15 {
21 template<typename DT_, typename IT_>
23 {
24 public:
31
33 template<typename DT2_, typename IT2_>
35
37 template <typename DataType2_, typename IndexType2_>
39
40 protected:
51
52 public:
53 // default CTOR
54 MeanFilter() :
55 _comm(nullptr),
56 _vec_prim(),
57 _vec_dual(),
58 _vec_freq(),
60 {
61 }
62
72 explicit MeanFilter(VectorType&& vec_prim, VectorType&& vec_dual, VectorType&& vec_freq, const Dist::Comm* comm) :
73 _comm(comm),
74 _vec_prim(std::forward<VectorType>(vec_prim)),
75 _vec_dual(std::forward<VectorType>(vec_dual)),
76 _vec_freq(std::forward<VectorType>(vec_freq)),
77 _volume()
78 {
79 if((!_vec_freq.empty()) && (_comm != nullptr))
80 {
82 _comm->allreduce(&_volume, &_volume, std::size_t(1), Dist::op_sum);
83 }
84 else
86
87 //XASSERTM(_volume > Math::eps<DataType>(), "domain volume must not be zero");
88 }
89
92 _comm(other._comm),
93 _vec_prim(std::move(other._vec_prim)),
94 _vec_dual(std::move(other._vec_dual)),
95 _vec_freq(std::move(other._vec_freq)),
96 _volume(other._volume)
97 {
98 }
99
102 {
103 if(this != &other)
104 {
105 _comm = other._comm;
106 _vec_prim = std::move(other._vec_prim);
107 _vec_dual = std::move(other._vec_dual);
108 _vec_freq = std::move(other._vec_freq);
109 _volume = other._volume;
110 }
111 return *this;
112 }
113
115 virtual ~MeanFilter()
116 {
117 }
118
124 {
125 return MeanFilter(_vec_prim.clone(clone_mode), _vec_dual.clone(clone_mode), _vec_freq.clone(clone_mode), _comm);
126 }
127
132 void clone(const MeanFilter & other, LAFEM::CloneMode clone_mode = LAFEM::CloneMode::Deep)
133 {
134 if(this == &other)
135 return;
136
137 _comm = other.get_comm();
138 _vec_prim.clone(other.get_vec_prim(), clone_mode);
139 _vec_dual.clone(other.get_vec_dual(), clone_mode);
140 _vec_freq.clone(other.get_vec_freq(), clone_mode);
141 _volume = other.get_volume();
142 }
143
145 template<typename DT2_, typename IT2_>
147 {
148 if((void*)this == (void*)&other)
149 return;
150
151 _comm = other.get_comm();
152 _vec_prim.convert(other.get_vec_prim());
153 _vec_dual.convert(other.get_vec_dual());
154 _vec_freq.convert(other.get_vec_freq());
155 _volume = DataType(other.get_volume());
156 }
157
159 VectorType & get_vec_prim()
160 {
161 return _vec_prim;
162 }
163
164 const VectorType & get_vec_prim() const
165 {
166 return _vec_prim;
167 }
168
169 VectorType & get_vec_dual()
170 {
171 return _vec_dual;
172 }
173
174 const VectorType & get_vec_dual() const
175 {
176 return _vec_dual;
177 }
178
179 VectorType & get_vec_freq()
180 {
181 return _vec_freq;
182 }
183
184 const VectorType & get_vec_freq() const
185 {
186 return _vec_freq;
187 }
188
189 DataType get_volume() const
190 {
191 return _volume;
192 }
193
194 const Dist::Comm* get_comm() const
195 {
196 return _comm;
197 }
199
200 std::size_t bytes() const
201 {
202 return _vec_prim.bytes() + _vec_dual.bytes();
203 }
204
205 bool empty() const
206 {
207 return _vec_prim.empty();
208 }
209
216 void filter_rhs(VectorType& vector) const
217 {
218 if(empty())
219 return;
220
221 // compute dual integral
222 DataType integ = DataType(0);
223 if(_vec_freq.empty() || (_comm == nullptr))
224 integ = vector.dot(_vec_prim);
225 else
226 {
227 integ = _vec_freq.triple_dot(vector, _vec_prim);
228 _comm->allreduce(&integ, &integ, std::size_t(1), Dist::op_sum);
229 }
230 // subtract mean
231 vector.axpy(_vec_dual, -integ / _volume);
232 }
233
240 void filter_sol(VectorType& vector) const
241 {
242 if(empty())
243 return;
244 // compute primal integral
245 DataType integ = DataType(0);
246 if(_vec_freq.empty() || (_comm == nullptr))
247 integ = vector.dot(_vec_dual);
248 else
249 {
250 integ = _vec_freq.triple_dot(vector, _vec_dual);
251 _comm->allreduce(&integ, &integ, std::size_t(1), Dist::op_sum);
252 }
253 // subtract mean
254 vector.axpy(_vec_prim, -integ / _volume);
255 }
256
263 void filter_def(VectorType& vector) const
264 {
265 // same as rhs
266 filter_rhs(vector);
267 }
268
275 void filter_cor(VectorType& vector) const
276 {
277 // same as sol
278 filter_sol(vector);
279 }
280 }; // class MeanFilter<...>
281 } // namespace Global
282} // namespace FEAT
Communicator class.
Definition: dist.hpp:1349
void allreduce(const void *sendbuf, void *recvbuf, std::size_t count, const Datatype &datatype, const Operation &op) const
Blocking All-Reduce.
Definition: dist.cpp:655
Mean Filter class template.
Definition: mean_filter.hpp:23
void filter_rhs(VectorType &vector) const
Applies the filter onto the right-hand-side vector.
virtual ~MeanFilter()
virtual destructor
const Dist::Comm * _comm
communicator
Definition: mean_filter.hpp:42
DataType _volume
weight volume
Definition: mean_filter.hpp:50
VectorType _vec_prim
primal weighting vector
Definition: mean_filter.hpp:44
MeanFilter & operator=(MeanFilter &&other)
move-assign operator
VectorType _vec_freq
frequency vector
Definition: mean_filter.hpp:48
void clone(const MeanFilter &other, LAFEM::CloneMode clone_mode=LAFEM::CloneMode::Deep)
Clones data from another MeanFilter.
VectorType::IndexType IndexType
index-type typedef
Definition: mean_filter.hpp:30
void convert(const MeanFilter< DT2_, IT2_ > &other)
Conversion method.
VectorType _vec_dual
dual weighting vector
Definition: mean_filter.hpp:46
void filter_cor(VectorType &vector) const
Applies the filter onto a correction vector.
void filter_def(VectorType &vector) const
Applies the filter onto a defect vector.
void filter_sol(VectorType &vector) const
Applies the filter onto the solution vector.
MeanFilter(VectorType &&vec_prim, VectorType &&vec_dual, VectorType &&vec_freq, const Dist::Comm *comm)
Constructor.
Definition: mean_filter.hpp:72
LAFEM::DenseVector< DT_, IT_ > VectorType
vector-type typedef
Definition: mean_filter.hpp:26
MeanFilter clone(LAFEM::CloneMode clone_mode=LAFEM::CloneMode::Deep) const
Creates a clone of itself.
VectorType::DataType DataType
data-type typedef
Definition: mean_filter.hpp:28
MeanFilter(MeanFilter &&other)
move ctor
Definition: mean_filter.hpp:91
std::size_t bytes() const
Returns the total amount of bytes allocated.
Definition: container.hpp:1042
bool empty() const
Checks whether the container is empty.
Definition: container.hpp:1165
Dense data vector class template.
void convert(const DenseVector< DT2_, IT2_ > &other)
Conversion method.
DataType dot(const DenseVector &x) const
Calculate .
DataType triple_dot(const DenseVector &x, const DenseVector &y) const
Calculate .
void axpy(const DenseVector &x, const DT_ alpha=DT_(1))
Calculate .
DenseVector clone(CloneMode clone_mode=CloneMode::Deep) const
Clone operation.
const Operation op_sum(MPI_SUM)
Operation wrapper for MPI_SUM.
Definition: dist.hpp:271
FEAT namespace.
Definition: adjactor.hpp:12