XGC1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
col_vgrids.hpp
Go to the documentation of this file.
1 #ifndef COL_VGRIDS_HPP
2 #define COL_VGRIDS_HPP
3 
4 #include <vector>
5 #include <stdio.h>
6 #include <Kokkos_Core.hpp>
7 #include <Kokkos_DualView.hpp>
8 
9 #include "col_species.hpp"
10 
11 
12 template<class Device>
14  Kokkos::DualView<int*,CLayout,Device> nspecies_in_grid;
15  const int n;
16  const int mb_n_nodes;
17  const int n_species;
18  const int nvr;
19  const int nvz;
20  View<double***,CLayout,HostType> mesh_r;
21  View<double***,CLayout,HostType> mesh_z;
22  View<double***,CLayout,Device> vol;
23  View<double***,CLayout,HostType> vol_h;
24  View<double****,Device> delta_r;
25  View<double****,Device> delta_z;
26  View<double**,Kokkos::LayoutLeft,HostType> vpar_beg_h;
27  View<double**,Kokkos::LayoutLeft,HostType> mesh_dz_h;
28  View<double**,Kokkos::LayoutLeft,HostType> mesh_dr_h;
29 
30  View<double**,Kokkos::LayoutLeft,Device> vpar_beg;
31  View<double**,Kokkos::LayoutLeft,Device> mesh_dz;
32  View<double**,Kokkos::LayoutLeft,Device> mesh_dr;
33 
34  Kokkos::DualView<int**,CLayout,Device> map_grid_to_species;
35 
36  // Count how many species are using each grid
37  inline Kokkos::DualView<int*,CLayout,Device> count_species_in_grid(const CollisionSpecies<Device>& col_spall) const{
38  Kokkos::DualView<int*,CLayout,Device> nspecies_in_grid_tmp("nspecies_in_grid", col_spall.s.h_view.extent(0));
39  // Loop over species and set up mapping
40  for (int isp = 0; isp < col_spall.s.h_view.extent(0); isp++){
41  int gri = col_spall.s.h_view(isp,0).grid_index; // Which grid this species is on
42  nspecies_in_grid_tmp.h_view(gri)++;
43  }
44  return nspecies_in_grid_tmp;
45  }
46 
47  // Count how many grids are used
48  inline int count_grids() const{
49  int ngrids=0;
50  for(int i=0; i<nspecies_in_grid.h_view.size(); i++){
51  if(nspecies_in_grid.h_view(i)>0) ngrids++;
52  }
53  return ngrids;
54  }
55 
57 
60  n(count_grids()),
61  mb_n_nodes(col_spall.pdf_n.h_view.extent(0)), // Use pdf_n dimensions: mb_n_nodes, n_species, nvz, nvr
62  n_species(col_spall.pdf_n.h_view.extent(1)),
63  nvz(col_spall.pdf_n.h_view.extent(2)),
64  nvr(col_spall.pdf_n.h_view.extent(3)),
65  map_grid_to_species("map_grid_to_species",n,n_species), // n_species is the max possible
66  mesh_dr("mesh_dr", mb_n_nodes, n),
67  mesh_dz("mesh_dz", mb_n_nodes, n),
68  vpar_beg("vpar_beg", mb_n_nodes, n),
69  mesh_dr_h("mesh_dr_h", mb_n_nodes, n),
70  mesh_dz_h("mesh_dz_h", mb_n_nodes, n),
71  vpar_beg_h("vpar_beg_h", mb_n_nodes, n),
72  mesh_r("mesh_r", mb_n_nodes, n, nvr),
73  mesh_z("mesh_z", mb_n_nodes, n, nvz),
74  vol("vol",nvr,n, mb_n_nodes),
75  vol_h("vol_h",mb_n_nodes,n, nvr), // Must have nvr fastest index for passing into fortran negative_f_correction routine
76  delta_r("delta_r",n,nvr-1,n_species, mb_n_nodes),
77  delta_z("delta_z",n,nvz-1,n_species, mb_n_nodes)
78  {
79  // Loop over species and set up mapping
80  int isp_in_grid=0;
81  int gri=0;
82  for (int isp = 0; isp < n_species; isp++){
83  // Move to next species or to next grid
84  if(gri!=col_spall.s.h_view(isp,0).grid_index) isp_in_grid=0;
85 
86  gri = col_spall.s.h_view(isp,0).grid_index; // Which grid this species is on
87  map_grid_to_species.h_view(gri,isp_in_grid) = isp;
88  isp_in_grid++;
89  }
90 
91 #ifdef USE_GPU
92  // Copy mapping views to device
93  Kokkos::deep_copy(map_grid_to_species.d_view, map_grid_to_species.h_view);
94  Kokkos::deep_copy(nspecies_in_grid.d_view, nspecies_in_grid.h_view);
95 #endif
96  }
97 
98  //> Convert the distribution function to the units used
99  // internally by the collision operator
100  // The distribution function set up with f0_module is in normalized velocity space
101  // whereas the collision operator uses SI units.
102  void setup_one(int isp, int mesh_ind, double vth, double dsmu, double dvp, double vp_max) {
103 
104  // vol
105  double pi4bb0vth3_dd = TWOPI*vth*vth*vth*dsmu*dvp;
106 
107  // --- 0th component
108  double smu_n = dsmu/3.0;
109  vol_h(mesh_ind,isp,0) = 0.5*pi4bb0vth3_dd*smu_n;
110  // --- 1st to (last-1)
111  for (int imu = 1; imu < nvr-1; imu++){
112  smu_n = dsmu*imu;
113  vol_h(mesh_ind,isp,imu) = pi4bb0vth3_dd*smu_n;
114  }
115  // --- last component
116  //smu_n = dsmu*((nvr-1)-1.0/3.0);//rh imu or f0_nmu???
117  smu_n = dsmu*(nvr-1);
118  vol_h(mesh_ind,isp,nvr-1) = 0.5*pi4bb0vth3_dd*smu_n;
119 
120  //vth_par = sqrt(sp_t_par(i) * UNIT_CHARGE / mass)
121  //vth_perp = sqrt(sp_t_perp(i) * UNIT_CHARGE / mass)
122 
123  // < Mesh-related quantities>
124  double vpar_beg_l = -vp_max*vth;// ( = dlx)
125  double mesh_dz_l = dvp*vth;// ( = mesh_dz)
126  double mesh_dr_l = dsmu*vth;// ( = mesh_dr)
127 
128  vpar_beg_h(mesh_ind, isp) = vpar_beg_l;
129  mesh_dz_h(mesh_ind, isp) = mesh_dz_l;
130  mesh_dr_h(mesh_ind, isp) = mesh_dr_l;
131 
132  // mesh_r, mesh_z
133  for (int j = 0; j < nvr-1; j++){
134  mesh_r(mesh_ind,isp,j) = mesh_dr_l*j;
135  }
136  mesh_r(mesh_ind,isp,nvr-1) = mesh_dr_l*(nvr-1);
137  for (int j = 0; j < nvz-1; j++){
138  mesh_z(mesh_ind,isp,j) = vpar_beg_l + mesh_dz_l*j;
139  }
140  mesh_z(mesh_ind,isp,nvz-1) = vpar_beg_l + mesh_dz_l*(nvz-1);
141  }
142 
143  KOKKOS_INLINE_FUNCTION double mesh_r_half(int ibatch, int igrid, int j) const{
144  return mesh_dr(ibatch, igrid)*(j+0.5);
145  }
146 
147  KOKKOS_INLINE_FUNCTION double mesh_z_half(int ibatch, int igrid, int j) const{
148  return vpar_beg(ibatch, igrid) + mesh_dz(ibatch, igrid)*(j+0.5);
149  }
150 
151  KOKKOS_INLINE_FUNCTION double local_center_volume(int ibatch, int igrid, int j) const{
152  return mesh_r_half(ibatch,igrid,j)*mesh_dr(ibatch, igrid)*mesh_dz(ibatch, igrid);
153  }
154 
155  void setup_all(const std::vector<Species<Device>>& all_species, const CollisionSpecies<Device>& col_species,
156  const View<int**,HostType>& mesh_nodes, int mesh_batch_ind){
157 
158  for (int mesh_ind = 0; mesh_ind<col_species.s.h_view.extent(1); mesh_ind++){
159  for (int gri = 0; gri < n; gri++){
160  const int FIRST_SPECIES_OF_GRID = 0; // Initialize grid using the first species assigned to the grid
161  int isp = map_grid_to_species.h_view(gri,FIRST_SPECIES_OF_GRID);
162 
163  // Use equilibrium thermal velocity to construct velocity grid
164  int inode = mesh_nodes(mesh_batch_ind,mesh_ind);
165  double vth = 1.0/all_species[col_species.s.h_view(isp,mesh_ind).gid].f0.fg_vth_inv_h(inode); // .get_f0_eq_thermal_velocity_lnode_h(inode);
166  setup_one(isp, mesh_ind, vth, col_species.f.dsmu, col_species.f.dvp, col_species.f.vp_max);
167  }
168  }
169 
170  // Copy to device
171  Kokkos::deep_copy(mesh_dr, mesh_dr_h);
172  Kokkos::deep_copy(mesh_dz, mesh_dz_h);
173  Kokkos::deep_copy(vpar_beg, vpar_beg_h);
174 
175  // Transpose vol
176  // First create a mirror on device of vol_h
177  View<double***,CLayout,Device> vol_tmp("vol_tmp",vol_h.extent(0),vol_h.extent(1),vol_h.extent(2));
178  // Deep copy that
179  Kokkos::deep_copy(vol_tmp, vol_h);
180 
181  // Make a local copy of the View itself for the lambda function to copy to device
182  View<double***,CLayout,Device> lvol = vol;
183 
184  // Naive transpose copy on device - unoptimized, should be small though
185  int n2 = vol_h.extent(1)*nvr;
186  int nvr_loc = nvr;
187  Kokkos::parallel_for("transpose_vol", Kokkos::RangePolicy<ExSpace>( 0, n2*vol_h.extent(0)), KOKKOS_LAMBDA (const int idx){
188  int i0 = idx/n2; // slowest index
189  int rem = idx%n2;
190  int i1 = rem/nvr_loc;
191  int i2 = rem%nvr_loc; // fastest index
192  lvol(i2,i1,i0) = vol_tmp(i0,i1,i2);
193  });
194  Kokkos::fence();
195  }
196 };
197 
198 #endif
View< double **, Kokkos::LayoutLeft, Device > vpar_beg
Definition: col_vgrids.hpp:30
const int n
Number of velocity grids.
Definition: col_vgrids.hpp:15
View< double **, Kokkos::LayoutLeft, HostType > vpar_beg_h
Definition: col_vgrids.hpp:26
Kokkos::DualView< int *, CLayout, Device > nspecies_in_grid
Definition: col_vgrids.hpp:14
KOKKOS_INLINE_FUNCTION double mesh_z_half(int ibatch, int igrid, int j) const
Definition: col_vgrids.hpp:147
View< double ****, Device > delta_z
Definition: col_vgrids.hpp:25
View< double ****, Device > delta_r
Definition: col_vgrids.hpp:24
double dvp
grid spacing in parallel velocity
Definition: vgrid_distribution.hpp:27
const int nvz
grid points in z
Definition: col_vgrids.hpp:19
Kokkos::DualView< CollisionSpeciesScalars **, Device > s
Definition: col_species.hpp:85
Definition: col_vgrids.hpp:13
const int nvr
grid points in r
Definition: col_vgrids.hpp:18
View< double ***, CLayout, Device > vol
Definition: col_vgrids.hpp:22
View< double ***, CLayout, HostType > mesh_r
Definition: col_vgrids.hpp:20
View< double **, Kokkos::LayoutLeft, Device > mesh_dz
Definition: col_vgrids.hpp:31
const int mb_n_nodes
Batch size.
Definition: col_vgrids.hpp:16
void setup_one(int isp, int mesh_ind, double vth, double dsmu, double dvp, double vp_max)
Definition: col_vgrids.hpp:102
const int n_species
Number of species total.
Definition: col_vgrids.hpp:17
Kokkos::DualView< int *, CLayout, Device > count_species_in_grid(const CollisionSpecies< Device > &col_spall) const
Definition: col_vgrids.hpp:37
double dsmu
grid spacing in mu
Definition: vgrid_distribution.hpp:29
Kokkos::DualView< int **, CLayout, Device > map_grid_to_species
Definition: col_vgrids.hpp:34
View< double ***, CLayout, HostType > mesh_z
Definition: col_vgrids.hpp:21
KOKKOS_INLINE_FUNCTION double mesh_r_half(int ibatch, int igrid, int j) const
Definition: col_vgrids.hpp:143
KOKKOS_INLINE_FUNCTION double local_center_volume(int ibatch, int igrid, int j) const
Definition: col_vgrids.hpp:151
View< double **, Kokkos::LayoutLeft, HostType > mesh_dr_h
Definition: col_vgrids.hpp:28
const VGridDistribution< HostType > f
Definition: col_species.hpp:83
View< double **, Kokkos::LayoutLeft, Device > mesh_dr
Definition: col_vgrids.hpp:32
View< double ***, CLayout, HostType > vol_h
Definition: col_vgrids.hpp:23
Definition: species.hpp:75
void parallel_for(const std::string name, int n_ptl, Function func, Option option, HostAoSoA aosoa_h, DeviceAoSoA aosoa_d)
Definition: streamed_parallel_for.hpp:252
void setup_all(const std::vector< Species< Device >> &all_species, const CollisionSpecies< Device > &col_species, const View< int **, HostType > &mesh_nodes, int mesh_batch_ind)
Definition: col_vgrids.hpp:155
int count_grids() const
Definition: col_vgrids.hpp:48
Definition: col_species.hpp:81
constexpr double TWOPI
Definition: constants.hpp:9
View< double **, Kokkos::LayoutLeft, HostType > mesh_dz_h
Definition: col_vgrids.hpp:27
double vp_max
max parallel velocity
Definition: vgrid_distribution.hpp:26