XGC1
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 #include "volumes_and_areas.hpp"
16 #include "flux_surface_average.hpp"
17 #include "magnetic_equil_files.hpp"
18 
19 // Grid class
20 template<class Device>
21 class Grid {
22  // This line enables private access between the host and device implementations of this class
23  // i.e. Makes the copy from host to device more straightforward
24  template<class Device2> friend class Grid;
25 
26  public:
27 
28  // Constructor from namelist
30 
31  // Default constructor
32  Grid(){}
33 
34  // Create a mirror with a different device type
35  template<class Device2>
36  inline Grid<Device2> mirror() const{
37  Grid<Device2> m;
38 
40 
41  m.ntriangle = ntriangle;
42  m.nnode = nnode;
43  m.nplanes = nplanes;
45  m.delta_phi = delta_phi;
47  m.nwall = nwall;
48 
52  m.psi00 = psi00;
53 
54  if(axisymmetric){
55  m.midplane = midplane.template mirror<Device2>();
56  m.rplane = m.midplane; // Shallow copy of midplane if axisymmetric
57  m.lplane = m.midplane;
58  // Except plane_phi
59  m.rplane.plane_phi = rplane.plane_phi;
60  m.lplane.plane_phi = lplane.plane_phi;
61  }else{
62  m.midplane = midplane.template mirror<Device2>();
63  m.rplane = rplane.template mirror<Device2>();
64  m.lplane = lplane.template mirror<Device2>();
65  }
66 
67  // Set these views to be their midplane equivalents (shallow copy)
68  m.psi = m.midplane.psi;
69  m.bfield = m.midplane.bfield;
70  m.psi_surf2 = m.midplane.psi_surf2;
71  m.wall_nodes = m.midplane.wall_nodes;
72 
73  m.volumes_and_areas = volumes_and_areas; // Doesn't require mirror view since everything is on host
74 
79 
80 #ifdef NO_FORTRAN_MODULES
81  m.gradient_matrices_h = gradient_matrices_h;
82 #endif
83  m.fsa_matrices = fsa_matrices.template mirror<Device2>();
84  if(flux_surfaces_h.size()>0){
86  for(int isurf=0; isurf<flux_surfaces_h.size(); isurf++) m.flux_surfaces_h(isurf) = flux_surfaces_h(isurf);
87  }
88 
89  return m;
90  }
91 
93 
94  void write_to_file(const DomainDecomposition<DeviceType>& pol_decomp, MagneticEquilFiles::Ptr equil_files_ptr, bool is_stellarator) const;
95 
96  KOKKOS_INLINE_FUNCTION void psi_search(double psi,double &wp,int &ip) const;
97 
98  template<PhiInterpType PIT>
99  KOKKOS_INLINE_FUNCTION void nearest_node(const SimdGridWeights<Order::One, PIT>& grid_wts, SimdGridWeights<Order::Zero, PIT>& grid_wts0) const;
100 
101  template<PhiInterpType PIT>
102  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;
103 
104  template<PhiInterpType PIT>
105  KOKKOS_INLINE_FUNCTION void get_grid_weights(const MagneticField<Device> &magnetic_field, const SimdVector &v, SimdVector2D &xff, SimdGridWeights<Order::One, PIT>& grid_wts) const;
106 
107  template<PhiInterpType PIT>
108  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;
109 
110  template<PhiInterpType PIT>
111  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 Simd<int>& itr_hint) const;
112 
113  template<PhiInterpType PIT>
114  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;
115 
116  template<PhiInterpType PIT>
117  KOKKOS_INLINE_FUNCTION void get_grid_weights(const MagneticField<Device> &magnetic_field, const SimdVector &v, SimdGridWeights<Order::Zero, PIT>& grid_wts) const;
118 
119  template<PhiInterpType PIT>
120  KOKKOS_INLINE_FUNCTION void get_grid_weights(const MagneticField<Device> &magnetic_field, const SimdVector &v, SimdGridWeights<Order::Zero, PIT>& grid_wts, const Simd<int>& itr_hint) const;
121 
122  template<PhiInterpType PIT>
123  KOKKOS_INLINE_FUNCTION void get_grid_weights(const MagneticField<Device> &magnetic_field, const SimdVector &v, SimdGridWeights<Order::One, PIT>& grid_wts) const;
124 
125  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;
126 
127  KOKKOS_INLINE_FUNCTION void wedge_modulo_phi(Simd<double>& phi_mod) const;
128 
129  KOKKOS_INLINE_FUNCTION double wedge_modulo_phi(double phi) const;
130 
131  KOKKOS_INLINE_FUNCTION bool node_is_inside_psi_range(const MagneticField<Device> &magnetic_field, const int node) const;
132 
133  KOKKOS_INLINE_FUNCTION int get_plane_index(double phi) const;
134 
136 
137  KOKKOS_INLINE_FUNCTION int get_node_index(int triangle_index, int tri_vertex_index) const;
138 
139  KOKKOS_INLINE_FUNCTION double node_area_to_volume(const MagneticField<Device> &magnetic_field, double area, int node_index) const;
140 
141  KOKKOS_INLINE_FUNCTION void get_triangle_area_and_volume(const MagneticField<Device> &magnetic_field, int i, double& area, double& volume) const;
142 
143  KOKKOS_INLINE_FUNCTION bool node_is_in_region_1_or_2_no_wall(const int inode) const;
144 
145  KOKKOS_INLINE_FUNCTION bool node_is_in_region_2_or_3_no_wall(const int inode) const;
146 
147  KOKKOS_INLINE_FUNCTION bool node_is_in_private_region_no_wall(const int inode) const;
148 
149  KOKKOS_INLINE_FUNCTION bool node_is_in_included_region(const int inode, const bool exclude_private_region) const;
150 
151  template<class Device2>
152  KOKKOS_INLINE_FUNCTION bool node_is_in_region_1_or_2(const MagneticField<Device2> &magnetic_field, const int inode) const;
153 
154  KOKKOS_INLINE_FUNCTION int uses_rz_basis(const int inode) const;
155 
156  KOKKOS_INLINE_FUNCTION double get_r(const int inode) const;
157 
158  KOKKOS_INLINE_FUNCTION void get_rz_coordinates(const int inode, double& r, double& z) const;
159 
160  KOKKOS_INLINE_FUNCTION void get_rz_coordinates(const Simd<int>& grid_inds, SimdVector2D& x) const;
161 
162  KOKKOS_INLINE_FUNCTION RZPair get_wall_rz(int i_wall) const;
163 
164  KOKKOS_INLINE_FUNCTION int get_ip(const int inode) const;
165 
167 
168  // Planes
172 
173  int ntriangle;
174  int nnode;
175  int nplanes;
176  double wedge_angle;
177  double delta_phi;
178  double inv_delta_phi;
179  int nwall;
180 
185  Kokkos::View<double*,Kokkos::LayoutRight,Device> psi;
186  Kokkos::View<double*,Kokkos::LayoutRight,Device> bfield;
187  Kokkos::View<double*,Kokkos::LayoutRight,Device> psi_surf2;
188  Kokkos::View<int*,Kokkos::LayoutRight,Device> wall_nodes;
189 
190  // Volume- and Area-related Host Views. Should find a different location for these so that these unused views aren't sent to GPU
192 
193  // Projections - reside in host memory for now
198 
199 
200 #ifdef NO_FORTRAN_MODULES
201  GradientMatrices<HostType> gradient_matrices_h;
202 #endif
205 };
206 
207 #include "grid.tpp"
208 #endif
Definition: flux_surface_average.hpp:8
Definition: grid.hpp:21
int npsi_surf2
Definition: grid.hpp:181
KOKKOS_INLINE_FUNCTION void get_grid_weights(const MagneticField< Device > &magnetic_field, const SimdVector &v, SimdVector2D &xff, SimdGridWeights< Order::One, PIT > &grid_wts) const
KOKKOS_INLINE_FUNCTION bool node_is_in_region_1_or_2(const MagneticField< Device2 > &magnetic_field, const int inode) const
Definition: grid.tpp:254
KOKKOS_INLINE_FUNCTION bool node_is_inside_psi_range(const MagneticField< Device > &magnetic_field, const int node) const
Definition: grid.tpp:134
FluxSurfaceAverage< Device > fsa_matrices
Definition: grid.hpp:203
Bounds get_local_wedge_bounds() const
Definition: grid.tpp:159
KOKKOS_INLINE_FUNCTION bool node_is_in_region_2_or_3_no_wall(const int inode) const
Definition: grid.tpp:221
double maxval_psi_surf2
Definition: grid.hpp:183
Grid< Device2 > mirror() const
Definition: grid.hpp:36
bool axisymmetric
Definition: grid.hpp:166
Kokkos::View< double *, Kokkos::LayoutRight, Device > psi
An array of psi coordinates.
Definition: grid.hpp:185
double delta_phi
Distance between planes.
Definition: grid.hpp:177
VolumesAndAreas volumes_and_areas
Definition: grid.hpp:191
Grid()
Definition: grid.hpp:32
KOKKOS_INLINE_FUNCTION double node_area_to_volume(const MagneticField< Device > &magnetic_field, double area, int node_index) const
Definition: grid.tpp:188
Kokkos::View< double *, Kokkos::LayoutRight, Device > psi_surf2
Definition: grid.hpp:187
int nwall
Definition: grid.hpp:179
KOKKOS_INLINE_FUNCTION void get_rz_coordinates(const int inode, double &r, double &z) const
Definition: grid.tpp:299
HostArray< VertexList > flux_surfaces_h
Definition: grid.hpp:204
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:120
KOKKOS_INLINE_FUNCTION int get_plane_index(double phi) const
Definition: grid.tpp:147
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:176
Grid(NLReader::NamelistReader &nlr, const GridFiles &grid_files, const DomainDecomposition< DeviceType > &pol_decomp, const MagneticField< DeviceType > &magnetic_field)
Projection< HostType > ff_to_midplane
Definition: grid.hpp:197
Plane< Device > lplane
Definition: grid.hpp:170
Projection< HostType > half_plane_ff
Definition: grid.hpp:194
KOKKOS_INLINE_FUNCTION void nearest_node(const SimdGridWeights< Order::One, PIT > &grid_wts, SimdGridWeights< Order::Zero, PIT > &grid_wts0) const
Definition: grid.tpp:64
int ntriangle
Number of grid triangles.
Definition: grid.hpp:173
KOKKOS_INLINE_FUNCTION void get_triangle_area_and_volume(const MagneticField< Device > &magnetic_field, int i, double &area, double &volume) const
Definition: grid.tpp:203
KOKKOS_INLINE_FUNCTION double get_r(const int inode) const
Definition: grid.tpp:278
KOKKOS_INLINE_FUNCTION void psi_search(double psi, double &wp, int &ip) const
Definition: grid.tpp:17
Projection< HostType > ff_lplane_to_neighbors
Definition: grid.hpp:196
Kokkos::View< double *, Kokkos::LayoutRight, Device > bfield
Magnetic field magnitude at nodes.
Definition: grid.hpp:186
KOKKOS_INLINE_FUNCTION void wedge_modulo_phi(Simd< double > &phi_mod) const
Definition: grid.tpp:100
void psi_surf_region_check(const MagneticField< DeviceType > &magnetic_field, const PlaneFilesInterface &right_plane_files)
int nplanes
Number of planes.
Definition: grid.hpp:175
Kokkos::View< int *, Kokkos::LayoutRight, Device > wall_nodes
Definition: grid.hpp:188
Projection< HostType > ff_rplane_to_neighbors
Definition: grid.hpp:195
KOKKOS_INLINE_FUNCTION bool node_is_in_private_region_no_wall(const int inode) const
Definition: grid.tpp:226
double inv_delta_phi
1/delta_phi
Definition: grid.hpp:178
void write_to_file(const DomainDecomposition< DeviceType > &pol_decomp, MagneticEquilFiles::Ptr equil_files_ptr, bool is_stellarator) const
double minval_psi_surf2
Definition: grid.hpp:182
Plane< Device > rplane
Definition: grid.hpp:171
KOKKOS_INLINE_FUNCTION bool node_is_in_included_region(const int inode, const bool exclude_private_region) const
Definition: grid.tpp:239
KOKKOS_INLINE_FUNCTION int uses_rz_basis(const int inode) const
Definition: grid.tpp:266
KOKKOS_INLINE_FUNCTION int get_node_index(int triangle_index, int tri_vertex_index) const
Definition: grid.tpp:172
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
KOKKOS_INLINE_FUNCTION bool node_is_in_region_1_or_2_no_wall(const int inode) const
Definition: grid.tpp:216
KOKKOS_INLINE_FUNCTION RZPair get_wall_rz(int i_wall) const
Definition: grid.tpp:309
int nnode
Number of grid nodes.
Definition: grid.hpp:174
UniformRange psi00
Definition: grid.hpp:184
Plane< Device > midplane
Definition: grid.hpp:169
KOKKOS_INLINE_FUNCTION int get_ip(const int inode) const
Definition: grid.tpp:319
size_t size() const
Definition: host_array.hpp:78
Definition: magnetic_field.hpp:12
Definition: NamelistReader.hpp:193
Definition: grid_files.hpp:13
Definition: plane.hpp:17
real(8), parameter phi
Definition: load_balance_constraint_mod.F90:18
Definition: magnetic_field.F90:1
Definition: bounds.hpp:4
Definition: gradient_matrices.hpp:9
Definition: grid_files.hpp:157
std::shared_ptr< MagneticEquilFiles > Ptr
Definition: magnetic_equil_files.hpp:11
Definition: grid_structs.hpp:28
Definition: grid_weights.hpp:73
Definition: grid_weights.hpp:52
Definition: grid_weights.hpp:47
Definition: simd.hpp:139
Definition: simd.hpp:149
Definition: uniform_range.hpp:8
Definition: volumes_and_areas.hpp:8