1
+ //
2
+ // Created by Luka on 11/2/2024.
3
+ //
4
+
5
+ #include " Filter.hpp"
6
+ namespace ahr {
7
+ void HouLiFilter::operator ()(Grid::View::C_XY view) {
8
+ grid.for_each_kxky ([&](Dim kx, Dim ky) {
9
+ view (kx, ky) *=
10
+ exp (-36.0 * pow (kx_ (kx) / grid.KX , 36.0 )) * exp (-36.0 * pow (ky_ (ky) / grid.KY , 36.0 ));
11
+ });
12
+ }
13
+
14
+ HouLiFilterCached::HouLiFilterCached (Grid const &grid)
15
+ : HouLiFilter(grid), factors(std::array{grid.KX , grid.KY }) {
16
+ grid.for_each_kxky ([&](Dim kx, Dim ky) {
17
+ factors (kx, ky) =
18
+ exp (-36.0 * pow (kx_ (kx) / grid.KX , 36.0 )) * exp (-36.0 * pow (ky_ (ky) / grid.KY , 36.0 ));
19
+ });
20
+ }
21
+
22
+ void HouLiFilterCached::operator ()(Grid::View::C_XY view) {
23
+ grid.for_each_kxky ([&](Dim kx, Dim ky) { view (kx, ky) *= factors (kx, ky); });
24
+ }
25
+
26
+ HouLiFilterCached1D::HouLiFilterCached1D (Grid const &grid)
27
+ : HouLiFilter(grid), factors_x(grid.KX), factors_y(grid.KY) {
28
+ for (Dim kx = 0 ; kx < grid.KX ; ++kx) {
29
+ factors_x.at (kx) = exp (-36.0 * pow (kx_ (kx) / grid.KX , 36.0 ));
30
+ }
31
+ for (Dim ky = 0 ; ky < grid.KY ; ++ky) {
32
+ factors_y.at (ky) = exp (-36.0 * pow (ky_ (ky) / grid.KY , 36.0 ));
33
+ }
34
+ }
35
+
36
+ void HouLiFilterCached1D::operator ()(Grid::View::C_XY view) {
37
+ grid.for_each_kxky ([&](Dim kx, Dim ky) {
38
+ // Extra multiplication at runtime for lower memory cost
39
+ view (kx, ky) *= factors_x[kx] * factors_y[ky];
40
+ });
41
+ }
42
+ } // namespace ahr
0 commit comments