Hermes2D  2.0
filter.h
1 // This file is part of Hermes2D.
2 //
3 // Hermes2D is free software: you can redistribute it and/or modify
4 // it under the terms of the GNU General Public License as published by
5 // the Free Software Foundation, either version 2 of the License, or
6 // (at your option) any later version.
7 //
8 // Hermes2D is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 // GNU General Public License for more details.
12 //
13 // You should have received a copy of the GNU General Public License
14 // along with Hermes2D. If not, see <http://www.gnu.org/licenses/>.
15 
16 #ifndef __H2D_FILTER_H
17 #define __H2D_FILTER_H
18 
19 #include "solution.h"
20 #include <complex>
21 
22 namespace Hermes
23 {
24  namespace Hermes2D
25  {
26  struct UniData;
27 
35  template<typename Scalar>
36  class HERMES_API Filter : public MeshFunction<Scalar>
37  {
38  public:
39  Filter();
40  Filter(const Hermes::vector<MeshFunction<Scalar>*>& solutions);
41  Filter(MeshFunction<Scalar>** solutions, int num);
42  Filter(const Hermes::vector<Solution<Scalar>*>& solutions);
43 
44  virtual ~Filter();
45 
46  virtual void reinit();
47 
49  inline std::string getClassName() const { return "Filter"; }
50 
51  protected:
52  void init(const Hermes::vector<MeshFunction<Scalar>*>& solutions);
53 
54  virtual void set_quad_2d(Quad2D* quad_2d);
55 
56  virtual void set_active_element(Element* e);
57 
58  virtual void free();
59 
60  virtual void push_transform(int son);
61 
62  virtual void pop_transform();
63 
64  virtual void init();
65 
66  int num;
67 
68  MeshFunction<Scalar>* sln[H2D_MAX_COMPONENTS];
69 
70  uint64_t sln_sub[H2D_MAX_COMPONENTS];
71 
79 #ifdef _MSC_VER // For Visual Studio compiler the latter does not compile.
80  std::map<uint64_t, LightArray<Node*>*> tables[H2D_MAX_QUADRATURES];
81 #else
82  std::map<uint64_t, LightArray<struct Filter<Scalar>::Node*>*> tables[H2D_MAX_QUADRATURES];
83 #endif
84 
85  bool unimesh;
86 
87  UniData** unidata;
88 
89  void copy_base(Filter* flt);
90 
91  virtual void setDeleteSolutions();
92  bool deleteSolutions;
93  };
94 
111  template<typename Scalar>
112  class HERMES_API SimpleFilter : public Filter<Scalar>
113  {
114  public:
115  SimpleFilter();
116  virtual ~SimpleFilter();
117 
118  SimpleFilter(const Hermes::vector<MeshFunction<Scalar>*>& solutions, const Hermes::vector<int>& items = Hermes::vector<int>());
119 
120  SimpleFilter(const Hermes::vector<Solution<Scalar>*>& solutions, const Hermes::vector<int>& items = Hermes::vector<int>());
121 
122  virtual Func<Scalar>* get_pt_value(double x, double y);
123 
124  protected:
125  int item[H2D_MAX_COMPONENTS];
126 
127  virtual void filter_fn(int n, Hermes::vector<Scalar*> values, Scalar* result) = 0;
128 
129  void init_components();
130  virtual void precalculate(int order, int mask);
131 
132  };
133 
137  class HERMES_API ComplexFilter : public Filter<double>
138  {
139  public:
140  ComplexFilter(MeshFunction<std::complex<double> >* solution, int item = H2D_FN_VAL_0);
141 
142  virtual ~ComplexFilter();
143  protected:
144  virtual Func<double>* get_pt_value(double x, double y);
145 
146  virtual void set_quad_2d(Quad2D* quad_2d);
147 
148  virtual void set_active_element(Element* e);
149 
150  virtual void push_transform(int son);
151 
152  virtual void pop_transform();
153 
154  virtual void free();
155  MeshFunction<std::complex<double> >* sln_complex;
156 
157  int item;
158 
159  virtual void filter_fn(int n, std::complex<double>* values, double* result) = 0;
160 
161  virtual void precalculate(int order, int mask);
162  };
163 
170  template<typename Scalar>
171  class HERMES_API DXDYFilter : public Filter<Scalar>
172  {
173  public:
174  // one result (rslt), all inputs and result including derivatives
175  DXDYFilter();
176 
177  DXDYFilter(const Hermes::vector<MeshFunction<Scalar>*>& solutions);
178 
179  DXDYFilter(const Hermes::vector<Solution<Scalar>*>& solutions);
180 
181  virtual ~DXDYFilter();
182  protected:
183  void init(const Hermes::vector<MeshFunction<Scalar>*>& solutions);
184 
185  virtual Func<Scalar>* get_pt_value(double x, double y);
186 
187  virtual void filter_fn (int n, Hermes::vector<Scalar *> values, Hermes::vector<Scalar *> dx, Hermes::vector<Scalar *> dy, Scalar* rslt, Scalar* rslt_dx, Scalar* rslt_dy) = 0;
188 
189  void init_components();
190 
191  virtual void precalculate(int order, int mask);
192  };
193 
198  template<typename Scalar>
199  class HERMES_API DXFilter : public DXDYFilter<Scalar>
200  {
201  public:
202  DXFilter(const Hermes::vector<MeshFunction<Scalar>*>& solutions);
203 
204  virtual MeshFunction<Scalar>* clone() const;
205 
206  virtual ~DXFilter();
207  protected:
208  virtual void filter_fn(int n, Hermes::vector<Scalar *> values, Hermes::vector<Scalar *> dx, Hermes::vector<Scalar *> dy, Scalar* rslt, Scalar* rslt_dx, Scalar* rslt_dy);
209  };
210 
215  template<typename Scalar>
216  class HERMES_API MagFilter : public SimpleFilter<Scalar>
217  {
218  public:
219  MagFilter(Hermes::vector<MeshFunction<Scalar>*> solutions, Hermes::vector<int> items = *(new Hermes::vector<int>));
220 
221  MagFilter(MeshFunction<Scalar>* sln1, int item1 = H2D_FN_VAL);
222  virtual MeshFunction<Scalar>* clone() const;
223 
224  virtual ~MagFilter();
225  protected:
226  virtual void filter_fn(int n, Hermes::vector<Scalar*> values, Scalar* result);
227  };
228 
231  class HERMES_API TopValFilter : public SimpleFilter<double>
232  {
233  public:
234  TopValFilter(Hermes::vector<MeshFunction<double>*> solutions, Hermes::vector<double> limits, Hermes::vector<int> items = *(new Hermes::vector<int>));
235 
236  TopValFilter(MeshFunction<double>* sln, double limit, int item = H2D_FN_VAL_0);
237  virtual MeshFunction<double>* clone() const;
238 
239  virtual ~TopValFilter();
240  protected:
241  virtual void filter_fn(int n, Hermes::vector<double*> values, double* result);
242  Hermes::vector<double> limits;
243  };
244 
247  class HERMES_API BottomValFilter : public SimpleFilter<double>
248  {
249  public:
250  BottomValFilter(Hermes::vector<MeshFunction<double>*> solutions, Hermes::vector<double> limits, Hermes::vector<int> items = *(new Hermes::vector<int>));
251 
252  BottomValFilter(MeshFunction<double>* sln, double limit, int item = H2D_FN_VAL_0);
253  virtual MeshFunction<double>* clone() const;
254 
255  virtual ~BottomValFilter();
256  protected:
257  virtual void filter_fn(int n, Hermes::vector<double*> values, double* result);
258  Hermes::vector<double> limits;
259  };
260 
263  class HERMES_API ValFilter : public SimpleFilter<double>
264  {
265  public:
266  ValFilter(Hermes::vector<MeshFunction<double>*> solutions, Hermes::vector<double> low_limits, Hermes::vector<double> high_limits, Hermes::vector<int> items = *(new Hermes::vector<int>));
267 
268  ValFilter(MeshFunction<double>* sln, double low_limit, double high_limit, int item = H2D_FN_VAL_0);
269  virtual MeshFunction<double>* clone() const;
270 
271  virtual ~ValFilter();
272  protected:
273  virtual void filter_fn(int n, Hermes::vector<double*> values, double* result);
274  Hermes::vector<double> low_limits;
275  Hermes::vector<double> high_limits;
276  };
277 
280  template<typename Scalar>
281  class HERMES_API DiffFilter : public SimpleFilter<Scalar>
282  {
283  public:
284  DiffFilter(Hermes::vector<MeshFunction<Scalar>*> solutions, Hermes::vector<int> items = *(new Hermes::vector<int>));
285  virtual MeshFunction<Scalar>* clone() const;
286  virtual ~DiffFilter();
287 
288  protected:
289  virtual void filter_fn(int n, Hermes::vector<Scalar*> values, Scalar* result);
290  };
291 
294  template<typename Scalar>
295  class HERMES_API SumFilter : public SimpleFilter<Scalar>
296  {
297  public:
298  SumFilter(Hermes::vector<MeshFunction<Scalar>*> solutions, Hermes::vector<int> items = *(new Hermes::vector<int>));
299  virtual MeshFunction<Scalar>* clone() const;
300  virtual ~SumFilter();
301 
302  protected:
303  virtual void filter_fn(int n, Hermes::vector<Scalar*> values, Scalar* result);
304  };
305 
308  template<typename Scalar>
309  class HERMES_API SquareFilter : public SimpleFilter<Scalar>
310  {
311  public:
312  SquareFilter(Hermes::vector<MeshFunction<Scalar>*> solutions, Hermes::vector<int> items = *(new Hermes::vector<int>));
313  virtual MeshFunction<Scalar>* clone() const;
314  virtual ~SquareFilter();
315 
316  protected:
317  virtual void filter_fn(int n, Hermes::vector<Scalar*> values, Scalar* result);
318  };
319 
322  class HERMES_API AbsFilter : public SimpleFilter<double>
323  {
324  public:
325  AbsFilter(Hermes::vector<MeshFunction<double>*> solutions, Hermes::vector<int> items = *(new Hermes::vector<int>));
326  AbsFilter(MeshFunction<double>* solution);
327  virtual MeshFunction<double>* clone() const;
328  virtual ~AbsFilter();
329 
330  protected:
331  virtual void filter_fn(int n, Hermes::vector<double*> values, double* result);
332  };
333 
336  class HERMES_API RealFilter : public ComplexFilter
337  {
338  public:
339  RealFilter(MeshFunction<std::complex<double> >* solution, int item = H2D_FN_VAL_0);
340  virtual ~RealFilter();
341 
342  virtual MeshFunction<double>* clone() const;
343 
344  protected:
345  virtual void filter_fn(int n, std::complex<double>* values, double* result);
346  };
347 
351  class HERMES_API ImagFilter : public ComplexFilter
352  {
353  public:
354  ImagFilter(MeshFunction<std::complex<double> >* solution, int item = H2D_FN_VAL_0);
355  virtual ~ImagFilter();
356 
357  virtual MeshFunction<double>* clone() const;
358  protected:
359  virtual void filter_fn(int n, std::complex<double>* values, double* result);
360  };
361 
364  class HERMES_API ComplexAbsFilter : public ComplexFilter
365  {
366  public:
367  ComplexAbsFilter(MeshFunction<std::complex<double> >* solution, int item = H2D_FN_VAL_0);
368  virtual ~ComplexAbsFilter();
369 
370  virtual MeshFunction<double>* clone() const;
371 
372  protected:
373  virtual void filter_fn(int n, std::complex<double>* values, double* result);
374  };
375 
378  class HERMES_API AngleFilter : public SimpleFilter<std::complex<double> >
379  {
380  public:
381  AngleFilter(Hermes::vector<MeshFunction<std::complex<double> >*> solutions, Hermes::vector<int> items = *(new Hermes::vector<int>));
382  virtual ~AngleFilter();
383 
384  protected:
385  virtual void filter_fn(int n, Hermes::vector<std::complex<double>*> values, double* result);
386  };
387 
393  class HERMES_API VonMisesFilter : public Filter<double>
394  {
395  public:
396 
397  VonMisesFilter(Hermes::vector<MeshFunction<double>*> solutions, double lambda, double mu,
398  int cyl = 0, int item1 = H2D_FN_VAL, int item2 = H2D_FN_VAL);
399  VonMisesFilter(MeshFunction<double>** solutions, int num, double lambda, double mu,
400  int cyl = 0, int item1 = H2D_FN_VAL, int item2 = H2D_FN_VAL);
401 
402  virtual Func<double>* get_pt_value(double x, double y);
403 
404  virtual MeshFunction<double>* clone() const;
405  virtual ~VonMisesFilter();
406 
407  protected:
408  double lambda, mu;
409 
410  int cyl, item1, item2;
411 
412  virtual void precalculate(int order, int mask);
413  };
414 
419  template<typename Scalar>
420  class HERMES_API LinearFilter : public Filter<Scalar>
421  {
422  public:
424 
425  LinearFilter(MeshFunction<Scalar>* older, MeshFunction<Scalar>* old, double tau_frac = 1);
426 
427  virtual Func<Scalar>* get_pt_value(double x, double y);
428  virtual MeshFunction<Scalar>* clone() const;
429  virtual ~LinearFilter();
430 
431  protected:
432  double tau_frac;
433 
434  virtual void precalculate(int order, int mask);
435 
436  void init_components();
437 
438  virtual void set_active_element(Element* e);
439  };
440  }
441 }
442 #endif