XGC1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
grid.hpp
Go to the documentation of this file.
1 #ifndef GRID_HPP
2 #define GRID_HPP
3 
4 #include "magnetic_field.hpp"
5 #include "grid_structs.hpp"
6 #include "grid_weights.hpp"
7 #include "grid_files.hpp"
8 #include "guess_table.hpp"
9 #include "uniform_range.hpp"
10 #include "guess_list_1d.hpp"
11 #include "plane.hpp"
12 #include "ff_projection.hpp"
13 #include "domain_decomposition.hpp"
14 
15 extern "C" void init_fortran_vols_and_areas(double* tr_area_h, double* tr_vol_h,
16 #ifdef XGC1
17  double* node_vol_ff_h,
18 #endif
19  double* node_vol_nearest_h, double* node_vol_h, double* node_area_h, double* psi00_h, int npsi00);
20 
21 // Volume- and Area-related Host Views. Should find a different location for these so that these unused views aren't sent to GPU
23  View<double*,CLayout,HostType> tr_area_h;
24  View<double*,CLayout,HostType> tr_vol_h;
25  View<double**,CLayout,HostType> node_vol_ff_h;
26  View<double*,CLayout,HostType> node_vol_nearest_h;
27  View<double*,CLayout,HostType> node_vol_h;
28  View<double*,CLayout,HostType> node_area_h;
29  View<double*,CLayout,HostType> vol00_h;
30 
32 
33  VolumesAndAreas(int ntriangle_in, int nnode_in, int npsi00_in)
34  : tr_area_h(NoInit("tr_area"), ntriangle_in),
35  tr_vol_h(NoInit("tr_vol"), ntriangle_in),
36 #ifdef XGC1
37  node_vol_ff_h(NoInit("node_vol_ff"),2, nnode_in),
38 #endif
39  node_vol_nearest_h(NoInit("node_vol_nearest"),nnode_in),
40  node_vol_h(NoInit("node_vol"),nnode_in),
41  node_area_h(NoInit("node_area"),nnode_in),
42  vol00_h(NoInit("vol00_h"), npsi00_in)
43  {}
44 
46 #ifndef NO_FORTRAN_MODULES
47  int npsi00 = vol00_h.size();
49 #ifdef XGC1
50  node_vol_ff_h.data(),
51 #endif
52  node_vol_nearest_h.data(), node_vol_h.data(), node_area_h.data(),
53  vol00_h.data(), npsi00);
54 #endif
55  }
56 };
57 
58 // Grid class
59 template<class Device>
60 class Grid {
61  // This line enables private access between the host and device implementations of this class
62  // i.e. Makes the copy from host to device more straightforward
63  template<class Device2> friend class Grid;
64 
65  public:
66 
67  // Constructor from namelist
69 
70  // Default constructor
71  Grid(){}
72 
73  // Create a mirror with a different device type
74  template<class Device2>
75  inline Grid<Device2> mirror() const{
76  Grid<Device2> m;
77 
79 
80  m.ntriangle = ntriangle;
81  m.nnode = nnode;
82  m.nplanes = nplanes;
84  m.delta_phi = delta_phi;
86  m.nwall = nwall;
87 
91  m.psi00 = psi00;
92 
93  if(axisymmetric){
94  m.midplane = midplane.template mirror<Device2>();
95  m.rplane = m.midplane; // Shallow copy of midplane if axisymmetric
96  m.lplane = m.midplane;
97  }else{
98  m.midplane = midplane.template mirror<Device2>();
99  m.rplane = rplane.template mirror<Device2>();
100  m.lplane = lplane.template mirror<Device2>();
101  }
102 
103  // Set these views to be their midplane equivalents (shallow copy)
104  m.psi = m.midplane.psi;
105  m.bfield = m.midplane.bfield;
106  m.psi_surf2 = m.midplane.psi_surf2;
107  m.wall_nodes = m.midplane.wall_nodes;
108 
109  m.volumes_and_areas = volumes_and_areas; // Doesn't require mirror view since everything is on host
110 
115 
116 #ifdef NO_FORTRAN_MODULES
117  m.gradient_matrices_h = gradient_matrices_h;
118 #endif
119 
120  return m;
121  }
122 
123  void write_to_file() const;
124 
125  KOKKOS_INLINE_FUNCTION void psi_search(double psi,double &wp,int &ip) const;
126 
127  template<PhiInterpType PIT>
128  KOKKOS_INLINE_FUNCTION void nearest_node(const SimdGridWeights<Order::One, PIT>& grid_wts, SimdGridWeights<Order::Zero, PIT>& grid_wts0) const;
129 
130  template<PhiInterpType PIT>
131  KOKKOS_INLINE_FUNCTION void get_grid_weights(const MagneticField<Device> &magnetic_field, const SimdVector &v, const Simd<double>& psi, SimdVector2D &xff,SimdGridWeights<Order::One, PIT>& grid_wts) const;
132 
133  template<PhiInterpType PIT>
134  KOKKOS_INLINE_FUNCTION void get_grid_weights(const MagneticField<Device> &magnetic_field, const SimdVector &v, SimdVector2D &xff, SimdGridWeights<Order::One, PIT>& grid_wts) const;
135 
136  template<PhiInterpType PIT>
137  KOKKOS_INLINE_FUNCTION void get_grid_weights(const MagneticField<Device> &magnetic_field, const SimdVector &v, const Simd<double>& psi_in, SimdGridWeights<Order::Zero, PIT>& grid_wts) const;
138 
139  template<PhiInterpType PIT>
140  KOKKOS_INLINE_FUNCTION void get_grid_weights(const MagneticField<Device> &magnetic_field, const SimdVector &v, const Simd<double>& psi_in, SimdGridWeights<Order::One, PIT>& grid_wts) const;
141 
142  template<PhiInterpType PIT>
143  KOKKOS_INLINE_FUNCTION void get_grid_weights(const MagneticField<Device> &magnetic_field, const SimdVector &v, SimdGridWeights<Order::Zero, PIT>& grid_wts) const;
144 
145  template<PhiInterpType PIT>
146  KOKKOS_INLINE_FUNCTION void get_grid_weights(const MagneticField<Device> &magnetic_field, const SimdVector &v, SimdGridWeights<Order::One, PIT>& grid_wts) const;
147 
148  KOKKOS_INLINE_FUNCTION void get_wall_index(const Simd<bool>& just_left_the_grid,const SimdVector2D &x, const SimdGridWeights<Order::One, PIT_GLOBAL>& grid_wts, Simd<int>& widx) const;
149 
150  KOKKOS_INLINE_FUNCTION void wedge_modulo_phi(Simd<double>& phi_mod) const;
151 
152  KOKKOS_INLINE_FUNCTION double wedge_modulo_phi(double phi) const;
153 
154  KOKKOS_INLINE_FUNCTION bool node_is_inside_psi_range(const MagneticField<Device> &magnetic_field, const int node) const;
155 
156  KOKKOS_INLINE_FUNCTION int get_plane_index(double phi) const;
157 
158  KOKKOS_INLINE_FUNCTION int get_node_index(int triangle_index, int tri_vertex_index) const;
159 
160  KOKKOS_INLINE_FUNCTION double node_area_to_volume(const MagneticField<Device> &magnetic_field, double area, int node_index) const;
161 
162  KOKKOS_INLINE_FUNCTION void get_triangle_area_and_volume(const MagneticField<Device> &magnetic_field, int i, double& area, double& volume) const;
163 
164  KOKKOS_INLINE_FUNCTION bool node_is_in_region_1_or_2_no_wall(const int inode) const;
165 
166  KOKKOS_INLINE_FUNCTION bool node_is_in_private_region_no_wall(const int inode) const;
167 
168  KOKKOS_INLINE_FUNCTION bool node_is_in_included_region(const int inode, const bool exclude_private_region) const;
169 
170  KOKKOS_INLINE_FUNCTION bool node_is_in_region_1_or_2(const MagneticField<Device> &magnetic_field, const int inode) const;
171 
172  KOKKOS_INLINE_FUNCTION int uses_rz_basis(const int inode) const;
173 
174  KOKKOS_INLINE_FUNCTION double get_r(const int inode) const;
175 
176  KOKKOS_INLINE_FUNCTION void get_rz_coordinates(const int inode, double& r, double& z) const;
177 
178  KOKKOS_INLINE_FUNCTION void get_rz_coordinates(const Simd<int>& grid_inds, SimdVector2D& x) const;
179 
180  KOKKOS_INLINE_FUNCTION RZPair get_wall_rz(int i_wall) const;
181 
183 
184  // Planes
188 
189  int ntriangle;
190  int nnode;
191  int nplanes;
192  double wedge_angle;
193  double delta_phi;
194  double inv_delta_phi;
195  int nwall;
196 
201  Kokkos::View<double*,Kokkos::LayoutRight,Device> psi;
202  Kokkos::View<double*,Kokkos::LayoutRight,Device> bfield;
203  Kokkos::View<double*,Kokkos::LayoutRight,Device> psi_surf2;
204  Kokkos::View<int*,Kokkos::LayoutRight,Device> wall_nodes;
205 
206  // Volume- and Area-related Host Views. Should find a different location for these so that these unused views aren't sent to GPU
208 
209  // Projections - reside in host memory for now
214 
215 
216 #ifdef NO_FORTRAN_MODULES
217  GradientMatrices<HostType> gradient_matrices_h;
218 #endif
219 };
220 
221 #include "grid.tpp"
222 #endif
double inv_delta_phi
1/delta_phi
Definition: grid.hpp:194
VolumesAndAreas volumes_and_areas
Definition: grid.hpp:207
VolumesAndAreas(int ntriangle_in, int nnode_in, int npsi00_in)
Definition: grid.hpp:33
KOKKOS_INLINE_FUNCTION RZPair get_wall_rz(int i_wall) const
Definition: grid.tpp:277
Definition: simd.hpp:149
Grid()
Definition: grid.hpp:71
void init_fortran_vols_and_areas(double *tr_area_h, double *tr_vol_h, double *node_vol_ff_h, double *node_vol_nearest_h, double *node_vol_h, double *node_area_h, double *psi00_h, int npsi00)
Definition: gradient_matrices.hpp:9
bool axisymmetric
Definition: grid.hpp:182
void set_fortran_ptrs()
Definition: grid.hpp:45
Definition: grid_weights.hpp:73
Kokkos::View< double *, Kokkos::LayoutRight, Device > bfield
Magnetic field magnitude at nodes.
Definition: grid.hpp:202
int ntriangle
Number of grid triangles.
Definition: grid.hpp:189
double minval_psi_surf2
Definition: grid.hpp:198
View< double *, CLayout, HostType > vol00_h
Definition: grid.hpp:29
KOKKOS_INLINE_FUNCTION bool node_is_in_private_region_no_wall(const int inode) const
Definition: grid.tpp:195
Definition: grid_weights.hpp:47
Definition: NamelistReader.hpp:193
Definition: magnetic_field.hpp:12
Grid< Device2 > mirror() const
Definition: grid.hpp:75
KOKKOS_INLINE_FUNCTION bool node_is_in_included_region(const int inode, const bool exclude_private_region) const
Definition: grid.tpp:208
View< double *, CLayout, HostType > node_area_h
Definition: grid.hpp:28
Definition: grid_files.hpp:613
Definition: grid.hpp:60
KOKKOS_INLINE_FUNCTION void get_triangle_area_and_volume(const MagneticField< Device > &magnetic_field, int i, double &area, double &volume) const
Definition: grid.tpp:177
int nplanes
Number of planes.
Definition: grid.hpp:191
Definition: plane.hpp:17
KOKKOS_INLINE_FUNCTION void get_wall_index(const Simd< bool > &just_left_the_grid, const SimdVector2D &x, const SimdGridWeights< Order::One, PIT_GLOBAL > &grid_wts, Simd< int > &widx) const
Definition: grid.tpp:106
Projection< HostType > half_plane_ff
Definition: grid.hpp:210
KOKKOS_INLINE_FUNCTION int uses_rz_basis(const int inode) const
Definition: grid.tpp:234
Kokkos::View< double *, Kokkos::LayoutRight, Device > psi_surf2
Definition: grid.hpp:203
double wedge_angle
The size of the wedge (the model is periodic in phi, a angle of e.g. pi means half the tokamak is mod...
Definition: grid.hpp:192
int nwall
Definition: grid.hpp:195
Definition: grid_structs.hpp:28
Definition: grid.hpp:22
Kokkos::View< double *, Kokkos::LayoutRight, Device > psi
An array of psi coordinates.
Definition: grid.hpp:201
KOKKOS_INLINE_FUNCTION void get_rz_coordinates(const int inode, double &r, double &z) const
Definition: grid.tpp:267
void write_to_file() const
Projection< HostType > ff_to_midplane
Definition: grid.hpp:213
View< double *, CLayout, HostType > tr_area_h
Definition: grid.hpp:23
int npsi_surf2
Definition: grid.hpp:197
KOKKOS_INLINE_FUNCTION int get_node_index(int triangle_index, int tri_vertex_index) const
Definition: grid.tpp:146
KOKKOS_INLINE_FUNCTION double get_r(const int inode) const
Definition: grid.tpp:246
KOKKOS_INLINE_FUNCTION bool node_is_inside_psi_range(const MagneticField< Device > &magnetic_field, const int node) const
Definition: grid.tpp:120
Projection< HostType > ff_lplane_to_neighbors
Definition: grid.hpp:212
KOKKOS_INLINE_FUNCTION void nearest_node(const SimdGridWeights< Order::One, PIT > &grid_wts, SimdGridWeights< Order::Zero, PIT > &grid_wts0) const
Definition: grid.tpp:64
KOKKOS_INLINE_FUNCTION int get_plane_index(double phi) const
Definition: grid.tpp:133
KOKKOS_INLINE_FUNCTION void wedge_modulo_phi(Simd< double > &phi_mod) const
Definition: grid.tpp:86
View< double *, CLayout, HostType > tr_vol_h
Definition: grid.hpp:24
Projection< HostType > ff_rplane_to_neighbors
Definition: grid.hpp:211
KOKKOS_INLINE_FUNCTION double node_area_to_volume(const MagneticField< Device > &magnetic_field, double area, int node_index) const
Definition: grid.tpp:162
KOKKOS_INLINE_FUNCTION bool node_is_in_region_1_or_2_no_wall(const int inode) const
Definition: grid.tpp:190
Kokkos::View< int *, Kokkos::LayoutRight, Device > wall_nodes
Definition: grid.hpp:204
Definition: grid_weights.hpp:52
View< double *, CLayout, HostType > node_vol_h
Definition: grid.hpp:27
UniformRange psi00
Definition: grid.hpp:200
Definition: magnetic_field.F90:1
Definition: simd.hpp:139
Definition: uniform_range.hpp:6
KOKKOS_INLINE_FUNCTION void get_grid_weights(const MagneticField< Device > &magnetic_field, const SimdVector &v, const Simd< double > &psi, SimdVector2D &xff, SimdGridWeights< Order::One, PIT > &grid_wts) const
Definition: grid.tpp:32
double maxval_psi_surf2
Definition: grid.hpp:199
Plane< Device > midplane
Definition: grid.hpp:185
int nnode
Number of grid nodes.
Definition: grid.hpp:190
Plane< Device > lplane
Definition: grid.hpp:186
double delta_phi
Distance between planes.
Definition: grid.hpp:193
KOKKOS_INLINE_FUNCTION void psi_search(double psi, double &wp, int &ip) const
Definition: grid.tpp:17
Kokkos::ViewAllocateWithoutInitializing NoInit
Definition: space_settings.hpp:68
Plane< Device > rplane
Definition: grid.hpp:187
View< double *, CLayout, HostType > node_vol_nearest_h
Definition: grid.hpp:26
VolumesAndAreas()
Definition: grid.hpp:31
KOKKOS_INLINE_FUNCTION bool node_is_in_region_1_or_2(const MagneticField< Device > &magnetic_field, const int inode) const
Definition: grid.tpp:222
View< double **, CLayout, HostType > node_vol_ff_h
Definition: grid.hpp:25