XGCa
fourier_filter.hpp
Go to the documentation of this file.
1 #ifndef FOURIER_FILTER_HPP
2 #define FOURIER_FILTER_HPP
3 
4 #include "grid.hpp"
6 #include "plasma.hpp"
7 #include "complex.hpp"
8 #include "FFT_wrapper.hpp"
10 
11 /* Evaluate a damping factor for the boundary condition of the Fourier filter functions
12  * @param[in] psi Input poloidal flux
13  * @param[in] inpsi Inner filter boundary
14  * @param[in] outpsi Outer filter boundary
15  * @param[in] bd_width Boundary width
16  */
17 KOKKOS_INLINE_FUNCTION double get_damp_fac(double psi, double inpsi, double outpsi, double bd_width){
18  double damp_fac = 0.5*( tanh(2.0*(psi-inpsi )/bd_width)
19  - tanh(2.0*(psi-outpsi)/bd_width) );
20  return (damp_fac>1.0e-6 ? damp_fac : 0.0);
21 }
22 
24  public:
26  BlendWindow=0,
29  };
30 
31  enum class FilterMode{
32  None=0,
33  SingleN,
34  M_Range,
35  N_M_Range,
37  };
38 
39  struct Options{
40  double inpsi;
41  double outpsi;
42  double bd_width;
43  int minm;
44  int maxm;
47  int ntor_real;
49 
50  // For n-m filter
51  bool div_mix;
52  bool bands_on;
53  int nmin;
54  int nmax;
55  int nmin_real;
56  int nmax_real;
57 
59 
60  // For single n
61  int single_n;
62  };
63 
64  private:
65  int nsurf; //
66  View<bool*,CLayout,HostType> run_filter;
68  View<bool*,CLayout,HostType> is_periodic;
69  View<int*,CLayout,DeviceType> nnodes_on_surf;
70  View<int*,CLayout,DeviceType> nfreq_on_surf;
71  View<int*,CLayout,HostType> nuni_on_surf;
72  View<int*,CLayout,DeviceType> node_offsets;
73  View<int*,CLayout,HostType> node_offsets_h;
74  View<int*,CLayout,DeviceType> freq_offsets;
75  View<int*,CLayout,HostType> uni_offsets;
76  View<int*,CLayout,DeviceType> node_surf_map;
77  View<int*,CLayout,DeviceType> freq_surf_map;
78  //View<int*,CLayout,HostType> uni_surf_map;
79 
80  View<double*,CLayout,DeviceType> inv_npt;
81 
82  public: // Because helper function needs them
83  View<int*,CLayout,DeviceType> m_limit;
84  View<double*,CLayout,DeviceType> qsafety;
85  View<int*, CLayout, DeviceType> m_max_surf;
86  int mres_q;
87 
88  private:
89 
90  View<int**,CLayout,DeviceType> m_minmax;
91 
92  // FFT
93  std::vector<FFTWrapper> fft_plan;
94 
95  // Mapping
96  View<int*,CLayout,DeviceType> mapping_all;
97  View<double*,CLayout,DeviceType> theta_all;
98  View<double*,CLayout,HostType> theta_all_h;
99 
100  View<UniformRange*,CLayout,HostType> theta_uniform_range_all;
101 
102  // Window
103  View<double*,CLayout,DeviceType> window_all;
104 
105  // Spline precomputation
106  std::vector<SplinePrecomputations<HostType>> spline_precomputation;
107 
108  // Resonance filter
109  int b_sign;
110  int wedge_n;
111  int nplanes;
112  int get_dir(int ntor_real) const;
113 
114  View<double*,CLayout,DeviceType> psi_surf;
115 
116  // Scratch
117  View<double**, CLayout, DeviceType> x_ordered_all;
118  View<double**, CLayout, HostType> x_ordered_h_view;
119  std::vector<std::vector<View<double*, CLayout, HostType>>> x_ordered_h;
120  View<double**, CLayout, HostType> x_uniform_h_view;
121  std::vector<std::vector<View<double*, CLayout, HostType>>> x_uniform_h;
122  View<Complex**,CLayout,DeviceType> spec_all;
123  View<Complex**,CLayout,HostType> spec_h_view;
124  std::vector<std::vector<View<Complex*, CLayout, HostType>>> spec_h;
125 
126  // Non-aligned vertices
127 #ifdef USE_GPU
128  View<int*, CLayout, DeviceType> non_aligned_vert;
129  View<int**, CLayout, DeviceType> non_aligned_ff_idx;
130  View<double**, CLayout, DeviceType> non_aligned_ff_w;
131 #endif
132  View<int*, CLayout, HostType> grid_non_aligned_vert;
133  View<int**, CLayout, HostType> grid_non_aligned_ff_idx;
134  View<double**, CLayout, HostType> grid_non_aligned_ff_w;
135 
136  void fft_execute(int isurf, const View<double*,CLayout,HostType>& x, const View<Complex*,CLayout,HostType>& spec) const;
137 
138  void set_nonaligned(const View<double**,CLayout,HostType>& x) const;
139 #ifdef USE_GPU
140  void set_nonaligned(const View<double**,CLayout,DeviceType>& x) const;
141 #endif
142 
143  void m_range_one_surf(int isurf, const View<double**,CLayout,HostType>& x,const Options& options) const;
144  void m_range_all_surfs(const View<double**,CLayout,DeviceType>& x,const Options& options) const;
145 
146  int get_n_points(int n_nodes) const;
147  int get_n_frequencies(int n_points) const;
148 
149  public:
150 
152 
154 
155 
156 #ifdef USE_GPU
157  void m_range(const DomainDecomposition<DeviceType>& pol_decomp, const Options& options, const View<double*,CLayout,HostType>& x) const;
158  void m_range(const DomainDecomposition<DeviceType>& pol_decomp, const Options& options, const View<double**,CLayout,HostType>& x) const;
159 #endif
160  void m_range(const DomainDecomposition<DeviceType>& pol_decomp, const Options& options, const View<double*,CLayout,DeviceType>& x) const;
161  void m_range(const DomainDecomposition<DeviceType>& pol_decomp, const Options& options, const View<double**,CLayout,DeviceType>& x) const;
162 
163  static void single_n(const Grid<DeviceType>& grid, const DomainDecomposition<DeviceType>& pol_decomp, const View<double*,CLayout,HostType>& view, const Options& options);
164 
165  static void single_n_flex(const Grid<DeviceType>& grid, const DomainDecomposition<DeviceType>& pol_decomp, const View<double*,CLayout,HostType>& view_in, const View<double**,CLayout,HostType>& result, const Options& options, int ntor_num);
166 
167  void n_m_range(int nplanes, const View<double*,CLayout,HostType>& view, const Options& options) const;
168 
169  void apply(const Grid<DeviceType>& grid, const DomainDecomposition<DeviceType>& pol_decomp, const Options& options, const View<double*,CLayout,HostType>& view) const;
170 
171  void destroy();
172 };
173 
174 
175 #endif
Definition: fourier_filter.hpp:23
View< int *, CLayout, DeviceType > m_limit
Definition: fourier_filter.hpp:83
int nplanes
Definition: fourier_filter.hpp:111
View< int **, CLayout, DeviceType > m_minmax
Definition: fourier_filter.hpp:90
FourierFilter()
Definition: fourier_filter.hpp:151
std::vector< std::vector< View< double *, CLayout, HostType > > > x_uniform_h
Definition: fourier_filter.hpp:121
View< int *, CLayout, HostType > uni_offsets
Definition: fourier_filter.hpp:75
View< int *, CLayout, DeviceType > freq_surf_map
Definition: fourier_filter.hpp:77
int wedge_n
Definition: fourier_filter.hpp:110
int max_n_points
Definition: fourier_filter.hpp:67
View< int *, CLayout, DeviceType > mapping_all
Definition: fourier_filter.hpp:96
View< double **, CLayout, HostType > grid_non_aligned_ff_w
Definition: fourier_filter.hpp:134
View< int *, CLayout, HostType > nuni_on_surf
Definition: fourier_filter.hpp:71
void fft_execute(int isurf, const View< double *, CLayout, HostType > &x, const View< Complex *, CLayout, HostType > &spec) const
Definition: fourier_filter.cpp:446
void m_range_all_surfs(const View< double **, CLayout, DeviceType > &x, const Options &options) const
Definition: fourier_filter.cpp:690
void m_range(const DomainDecomposition< DeviceType > &pol_decomp, const Options &options, const View< double *, CLayout, HostType > &x) const
Definition: fourier_filter.cpp:815
FilterMode
Definition: fourier_filter.hpp:31
View< double **, CLayout, HostType > x_ordered_h_view
Definition: fourier_filter.hpp:118
int get_n_points(int n_nodes) const
Definition: fourier_filter.cpp:66
void set_nonaligned(const View< double **, CLayout, HostType > &x) const
Definition: fourier_filter.cpp:754
std::vector< std::vector< View< Complex *, CLayout, HostType > > > spec_h
Definition: fourier_filter.hpp:124
View< double *, CLayout, DeviceType > inv_npt
Definition: fourier_filter.hpp:80
std::vector< FFTWrapper > fft_plan
Definition: fourier_filter.hpp:93
static void single_n_flex(const Grid< DeviceType > &grid, const DomainDecomposition< DeviceType > &pol_decomp, const View< double *, CLayout, HostType > &view_in, const View< double **, CLayout, HostType > &result, const Options &options, int ntor_num)
Definition: fourier_filter.cpp:881
View< Complex **, CLayout, HostType > spec_h_view
Definition: fourier_filter.hpp:123
std::vector< std::vector< View< double *, CLayout, HostType > > > x_ordered_h
Definition: fourier_filter.hpp:119
View< int *, CLayout, HostType > grid_non_aligned_vert
Definition: fourier_filter.hpp:132
View< double *, CLayout, DeviceType > psi_surf
Definition: fourier_filter.hpp:114
View< int *, CLayout, HostType > node_offsets_h
Definition: fourier_filter.hpp:73
int nsurf
Definition: fourier_filter.hpp:65
void m_range_one_surf(int isurf, const View< double **, CLayout, HostType > &x, const Options &options) const
View< double **, CLayout, DeviceType > non_aligned_ff_w
Definition: fourier_filter.hpp:130
View< int *, CLayout, DeviceType > m_max_surf
Definition: fourier_filter.hpp:85
View< double *, CLayout, DeviceType > theta_all
Definition: fourier_filter.hpp:97
void destroy()
Definition: fourier_filter.cpp:450
View< UniformRange *, CLayout, HostType > theta_uniform_range_all
Definition: fourier_filter.hpp:100
int b_sign
Definition: fourier_filter.hpp:109
View< Complex **, CLayout, DeviceType > spec_all
Definition: fourier_filter.hpp:122
View< int *, CLayout, DeviceType > non_aligned_vert
Definition: fourier_filter.hpp:128
ScrapeOffLayerMethod
Definition: fourier_filter.hpp:25
View< int *, CLayout, DeviceType > freq_offsets
Definition: fourier_filter.hpp:74
View< double *, CLayout, DeviceType > qsafety
Definition: fourier_filter.hpp:84
View< int *, CLayout, DeviceType > node_offsets
Definition: fourier_filter.hpp:72
static void single_n(const Grid< DeviceType > &grid, const DomainDecomposition< DeviceType > &pol_decomp, const View< double *, CLayout, HostType > &view, const Options &options)
Definition: fourier_filter.cpp:849
View< double **, CLayout, DeviceType > x_ordered_all
Definition: fourier_filter.hpp:117
View< bool *, CLayout, HostType > is_periodic
Definition: fourier_filter.hpp:68
View< double **, CLayout, HostType > x_uniform_h_view
Definition: fourier_filter.hpp:120
View< double *, CLayout, HostType > theta_all_h
Definition: fourier_filter.hpp:98
View< double *, CLayout, DeviceType > window_all
Definition: fourier_filter.hpp:103
int mres_q
Definition: fourier_filter.hpp:86
int get_dir(int ntor_real) const
Definition: fourier_filter.cpp:536
void apply(const Grid< DeviceType > &grid, const DomainDecomposition< DeviceType > &pol_decomp, const Options &options, const View< double *, CLayout, HostType > &view) const
Definition: fourier_filter.cpp:915
View< int **, CLayout, HostType > grid_non_aligned_ff_idx
Definition: fourier_filter.hpp:133
int get_n_frequencies(int n_points) const
Definition: fourier_filter.cpp:72
View< int **, CLayout, DeviceType > non_aligned_ff_idx
Definition: fourier_filter.hpp:129
View< int *, CLayout, DeviceType > nfreq_on_surf
Definition: fourier_filter.hpp:70
View< bool *, CLayout, HostType > run_filter
Definition: fourier_filter.hpp:66
std::vector< SplinePrecomputations< HostType > > spline_precomputation
Definition: fourier_filter.hpp:106
View< int *, CLayout, DeviceType > nnodes_on_surf
Definition: fourier_filter.hpp:69
void n_m_range(int nplanes, const View< double *, CLayout, HostType > &view, const Options &options) const
Definition: fourier_filter.cpp:830
View< int *, CLayout, DeviceType > node_surf_map
Definition: fourier_filter.hpp:76
Definition: magnetic_field.hpp:12
Definition: NamelistReader.hpp:193
Definition: plasma.hpp:13
KOKKOS_INLINE_FUNCTION double get_damp_fac(double psi, double inpsi, double outpsi, double bd_width)
Definition: fourier_filter.hpp:17
Definition: magnetic_field.F90:1
subroutine plasma(grid, itr, p, dene_out, deni_out, Te_out, Ti_out, Vparai_out, ignore_vacuum)
Calculate the plasma density, temperature, and parallel velocity for a point in triangle itr using pl...
Definition: neutral_totalf.F90:1548
Definition: fourier_filter.hpp:39
int nmin
Definition: fourier_filter.hpp:53
bool is_spectral
Definition: fourier_filter.hpp:45
int ntor_real
Definition: fourier_filter.hpp:47
int nmax_real
Definition: fourier_filter.hpp:56
double outpsi
Definition: fourier_filter.hpp:41
bool bands_on
Definition: fourier_filter.hpp:52
ScrapeOffLayerMethod sol_method
Definition: fourier_filter.hpp:48
FilterMode mode
Definition: fourier_filter.hpp:58
double inpsi
Definition: fourier_filter.hpp:40
bool is_resonant
Definition: fourier_filter.hpp:46
double bd_width
Definition: fourier_filter.hpp:42
int minm
Definition: fourier_filter.hpp:43
int nmax
Definition: fourier_filter.hpp:54
int nmin_real
Definition: fourier_filter.hpp:55
int single_n
Definition: fourier_filter.hpp:61
int maxm
Definition: fourier_filter.hpp:44
bool div_mix
Definition: fourier_filter.hpp:51