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