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
11namespace FEAT
12{
13 namespace LAFEM
14 {
20 template<typename DT_, typename IT_>
22 {
23 public:
30
32 template <typename DT2_ = DT_, typename IT2_ = IT_>
34
36 template <typename DataType2_, typename IndexType2_>
38
39 protected:
48
49 public:
50 // default CTOR
51 MeanFilter() :
52 _vec_prim(),
53 _vec_dual(),
54 _volume(),
55 _sol_mean()
56 {
57 }
58
68 explicit MeanFilter(VectorType && vec_prim, VectorType && vec_dual, DataType sol_mean = DataType(0)) :
69 _vec_prim(std::forward<VectorType>(vec_prim)),
70 _vec_dual(std::forward<VectorType>(vec_dual)),
72 _sol_mean(sol_mean)
73 {
74 if(!_vec_prim.empty())
75 {
76 XASSERTM(_volume > Math::eps<DataType>(), "domain volume must not be zero");
77 }
78 }
79
92 explicit MeanFilter(VectorType && vec_prim, VectorType && vec_dual, DataType sol_mean, DataType volume) :
93 _vec_prim(std::forward<VectorType>(vec_prim)),
94 _vec_dual(std::forward<VectorType>(vec_dual)),
95 _volume(volume),
96 _sol_mean(sol_mean)
97 {
98 if(!_vec_prim.empty())
99 {
100 XASSERTM(_volume > Math::eps<DataType>(), "domain volume must not be zero");
101 }
102 }
103
106 _vec_prim(std::move(other._vec_prim)),
107 _vec_dual(std::move(other._vec_dual)),
108 _volume(other._volume),
109 _sol_mean(other._sol_mean)
110 {
111 }
112
115 {
116 if(this != &other)
117 {
118 _vec_prim = std::forward<VectorType>(other._vec_prim);
119 _vec_dual = std::forward<VectorType>(other._vec_dual);
120 _volume = other._volume;
121 _sol_mean = other._sol_mean;
122 }
123 return *this;
124 }
125
127 virtual ~MeanFilter()
128 {
129 }
130
136 {
137 return MeanFilter(_vec_prim.clone(clone_mode), _vec_dual.clone(clone_mode), _sol_mean, _volume);
138 }
139
144 void clone(const MeanFilter & other, CloneMode clone_mode = CloneMode::Deep)
145 {
146 _vec_prim.clone(other.get_vec_prim(), clone_mode);
147 _vec_dual.clone(other.get_vec_dual(), clone_mode);
148 _volume = other._volume;
149 _sol_mean = other._sol_mean;
150 }
151
153 template<typename DT2_, typename IT2_>
155 {
156 _vec_prim.convert(other.get_vec_prim());
157 _vec_dual.convert(other.get_vec_dual());
158 _volume = DataType(other.get_volume());
159 _sol_mean = DataType(other.get_sol_mean());
160 if(!_vec_prim.empty())
161 {
162 XASSERTM(_volume > Math::eps<DataType>(), "domain volume must not be zero");
163 }
164 }
165
167 void clear()
168 {
172 }
173
175 VectorType & get_vec_prim()
176 {
177 return _vec_prim;
178 }
179
180 const VectorType & get_vec_prim() const
181 {
182 return _vec_prim;
183 }
184
185 VectorType & get_vec_dual()
186 {
187 return _vec_dual;
188 }
189
190 const VectorType & get_vec_dual() const
191 {
192 return _vec_dual;
193 }
194
195 DataType get_volume() const
196 {
197 return _volume;
198 }
199
200 DataType get_sol_mean() const
201 {
202 return _sol_mean;
203 }
205
212 void filter_rhs(VectorType& vector) const
213 {
214 // subtract to dual integral mean zero
215 if(!_vec_prim.empty())
216 vector.axpy(_vec_dual, -vector.dot(_vec_prim) / _volume);
217 }
218
225 void filter_sol(VectorType& vector) const
226 {
227 // given: v=vec_prim, w=vec_dual, vol=v*w, input: x
228 // note that int(v) = v*w and int(x) = x*w
229 // we want:
230 // 1/vol * int (x + alpha*v) = sol_mean
231 // <==> int(x) + alpha*int(v) = sol_mean*vol
232 // <==> x*w + alpha*v*w = sol_mean*v*w
233 // <==> alpha*v*w = sol_mean*v*w - x*w
234 // <==> alpha = sol_mean - (x*w/v*w)
235 if(!_vec_prim.empty())
236 vector.axpy(_vec_prim, _sol_mean - vector.dot(_vec_dual) / _volume);
237 }
238
245 void filter_def(VectorType& vector) const
246 {
247 // same as rhs
248 filter_rhs(vector);
249 }
250
257 void filter_cor(VectorType& vector) const
258 {
259 // subtract to primal integral mean zero
260 if(!_vec_prim.empty())
261 vector.axpy(_vec_prim, -vector.dot(_vec_dual) / _volume);
262 }
263
270 template<typename MT_>
271 void filter_mat(MT_& DOXY(matrix)) const
272 {
273 // nothing to do here
274 }
275 }; // class MeanFilter<...>
276 } // namespace LAFEM
277} // namespace FEAT
#define XASSERTM(expr, msg)
Assertion macro definition with custom message.
Definition: assertion.hpp:263
bool empty() const
Checks whether the container is empty.
Definition: container.hpp:1165
virtual void clear()
Free all allocated arrays.
Definition: container.hpp:875
Dense data vector class template.
void convert(const DenseVector< DT2_, IT2_ > &other)
Conversion method.
DataType dot(const DenseVector &x) const
Calculate .
void axpy(const DenseVector &x, const DT_ alpha=DT_(1))
Calculate .
DenseVector clone(CloneMode clone_mode=CloneMode::Deep) const
Clone operation.
Mean Filter class template.
Definition: mean_filter.hpp:22
VectorType _vec_prim
primal weighting vector
Definition: mean_filter.hpp:41
MeanFilter clone(CloneMode clone_mode=CloneMode::Deep) const
Creates a clone of itself.
VectorType::DataType DataType
data-type typedef
Definition: mean_filter.hpp:27
void filter_sol(VectorType &vector) const
Applies the filter onto the solution vector.
void filter_mat(MT_ &matrix) const
Applies the filter onto a system matrix.
MeanFilter(MeanFilter &&other)
move ctor
DataType _sol_mean
desired solution vector mean
Definition: mean_filter.hpp:47
void filter_rhs(VectorType &vector) const
Applies the filter onto the right-hand-side vector.
void filter_cor(VectorType &vector) const
Applies the filter onto a correction vector.
MeanFilter(VectorType &&vec_prim, VectorType &&vec_dual, DataType sol_mean, DataType volume)
Constructor.
Definition: mean_filter.hpp:92
MeanFilter & operator=(MeanFilter &&other)
move-assign operator
DenseVector< DT_, IT_ > VectorType
vector-type typedef
Definition: mean_filter.hpp:25
virtual ~MeanFilter()
virtual destructor
void clear()
Clears this filter.
DataType _volume
weight volume
Definition: mean_filter.hpp:45
void convert(const MeanFilter< DT2_, IT2_ > &other)
Conversion method.
MeanFilter(VectorType &&vec_prim, VectorType &&vec_dual, DataType sol_mean=DataType(0))
Constructor.
Definition: mean_filter.hpp:68
void clone(const MeanFilter &other, CloneMode clone_mode=CloneMode::Deep)
Clones data from another MeanFilter.
void filter_def(VectorType &vector) const
Applies the filter onto a defect vector.
VectorType::IndexType IndexType
index-type typedef
Definition: mean_filter.hpp:29
VectorType _vec_dual
dual weighting vector
Definition: mean_filter.hpp:43
FEAT namespace.
Definition: adjactor.hpp:12