-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfilter.h
84 lines (63 loc) · 1.98 KB
/
filter.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#ifndef FILTER_H_
#define FILTER_H_
#include "zpic.h"
#include "vec3grid.h"
namespace Filter {
class Digital {
public:
virtual Digital * clone() const = 0;
virtual void apply( vec3grid<float3> & fld ) = 0;
virtual ~Digital() = default;
};
class None : public Digital {
public:
None * clone() const override { return new None(); };
void apply( vec3grid<float3> & fld ) override { /* do nothing */ };
};
class Binomial : public Digital {
protected:
unsigned int order;
coord::cart dir;
public:
Binomial( coord::cart dir, unsigned int order = 0 ) :
order( (order > 0) ? order: 1 ),
dir(dir) { };
Binomial * clone() const override { return new Binomial ( dir, order); };
void apply( vec3grid<float3> & fld ) override {
switch( dir ) {
case( coord::x ):
for( unsigned i = 0; i < order; i++ )
fld.kernel3_x( 0.25f, 0.5f, 0.25f );
break;
case( coord::y ):
for( unsigned i = 0; i < order; i++ )
fld.kernel3_y( 0.25f, 0.5f, 0.25f );
break;
}
}
};
class Compensated : public Binomial{
public:
Compensated( coord::cart dir, unsigned int order_ = 0 ) : Binomial ( dir, order_ ) {};
Compensated * clone() const override { return new Compensated ( dir, order); };
void apply( vec3grid<float3> & fld ) override {
// Calculate compensator values
float a = -1.0f;
float b = (4.0 + 2.0*order) / order;
float norm = 2*a+b;
switch( dir ) {
case( coord::x ):
for( unsigned i = 0; i < order; i++ )
fld.kernel3_x( 0.25f, 0.5f, 0.25f );
fld.kernel3_x( a/norm, b/norm, a/norm );
break;
case( coord::y ):
for( unsigned i = 0; i < order; i++ )
fld.kernel3_y( 0.25f, 0.5f, 0.25f );
fld.kernel3_y( a/norm, b/norm, a/norm );
break;
}
};
};
}
#endif