8 double* f0_grid_vol_vonly_cpp,
double* f0_n_Ta_cpp,
double* f0_den_cpp,
9 double* f0_flow_cpp,
double* f0_B_B0_cpp);
11 extern "C" void f0_set_ptrs(
int nnode,
double* f0_delta_n_cpp,
double* f0_delta_u_cpp,
double* f0_delta_T_cpp);
12 extern "C" void set_f0_f0g_ptr(
int f0_inode1,
int f0_inode2,
double* f0_f0g_loc);
35 Kokkos::View<double**,Kokkos::LayoutRight, HostType>
f0_T_ev;
37 Kokkos::View<double**,Kokkos::LayoutRight, HostType>
f0_grid_vol;
39 Kokkos::View<double**,Kokkos::LayoutRight, HostType>
f0_n_Ta;
40 Kokkos::View<double**,Kokkos::LayoutRight, HostType>
f0_den;
41 Kokkos::View<double**,Kokkos::LayoutRight, HostType>
f0_flow;
44 Kokkos::View<double*,Kokkos::LayoutRight, HostType>
f0_B_B0;
49 :
f0_T_ev(
"f0_T_ev", nsp, pol_decomp.nnodes),
53 f0_n_Ta(
"f0_n_Ta", nsp, pol_decomp.nnodes),
54 f0_den(
"f0_den", nsp, pol_decomp.nnodes),
55 f0_flow(
"f0_flow", nsp, pol_decomp.nnodes),
56 f0_B_B0(
"f0_B_B0", pol_decomp.nnodes)
76 Kokkos::View<double**,Kokkos::LayoutRight, HostType>
f0_delta_n;
77 Kokkos::View<double**,Kokkos::LayoutRight, HostType>
f0_delta_u;
78 Kokkos::View<double**,Kokkos::LayoutRight, HostType>
f0_delta_T;
112 int i_nonadiabatic_species = 0;
113 for(
int isp = 0; isp<
nspecies; isp++){
116 i_nonadiabatic_species++;
161 printf(
"ISP ERROR in for_all_nonadiabatic_sepcies: isp=%d",isp);
222 max_n_ptl = std::max(max_n_ptl,species.
n_ptl);
234 species.
particles_d = Cabana::AoSoA<ParticleDataTypes,DeviceType,VEC_LEN>();
238 particles_d_has_owner =
false;
247 int f0_species_cnt=0;
249 set_unmanaged_f0_species_view(decomposed_recalculable_f0_arrays.f0_T_ev, f0_species_cnt, species.
f0.temp_ev_h);
260 int nsp = (is_XGCa ? nspecies : n_nonadiabatic_species);
262 f0_delta_n = View<double**,CLayout, HostType>(
"f0_delta_n", nsp, grid_nnode);
263 f0_delta_u = View<double**,CLayout, HostType>(
"f0_delta_u", nsp, grid_nnode);
264 f0_delta_T = View<double**,CLayout, HostType>(
"f0_delta_T", nsp, grid_nnode);
265 f0_set_ptrs(grid_nnode, f0_delta_n.data(), f0_delta_u.data(), f0_delta_T.data());
268 f0_den_global = View<double**,CLayout, HostType>(
"f0_den_global", n_nonadiabatic_species, grid_nnode);
269 f0_temp_global = View<double**,CLayout, HostType>(
"f0_temp_global", n_nonadiabatic_species, grid_nnode);
276 set_unmanaged_f0_species_view(f0_den_global, species.
nonadiabatic_idx, species.
f0.den_global_h);
277 set_unmanaged_f0_species_view(f0_temp_global, species.
nonadiabatic_idx, species.
f0.temp_global_h);
282 template<
typename T_in,
typename T_out>
284 auto view_in_subview =
my_subview(view_in, isp);
285 view_out = T_out(view_in_subview.data(), view_in_subview.layout());
295 int f0_inode2 = f0_inode1 + pol_decomp.
nnodes - 1;
299 int f0_species_cnt=0;
301 set_unmanaged_f0_species_view(f0_f0g.f, f0_species_cnt, species.
f0.f0g_h);
309 if(!particles_d_has_owner){
311 particles_d_owner = isp;
313 all_species[particles_d_owner].particles_d = Cabana::AoSoA<ParticleDataTypes,DeviceType,VEC_LEN>(
"particles_d", 0);
314 all_species[particles_d_owner].owns_particles_d =
true;
315 particles_d_has_owner =
true;
318 if(particles_d_owner == isp)
return;
321 all_species[isp].particles_d = all_species[particles_d_owner].particles_d;
324 all_species[particles_d_owner].particles_d = Cabana::AoSoA<ParticleDataTypes,DeviceType,VEC_LEN>();
325 all_species[particles_d_owner].owns_particles_d =
false;
328 particles_d_owner = isp;
329 all_species[particles_d_owner].owns_particles_d =
true;
334 if((!all_species[isp].is_adiabatic) && device_ptl_opt==UseDevicePtl){
335 if(species_share_particles_d_ownership){
336 transfer_particles_d_ownership(isp);
338 if(!all_species[isp].owns_particles_d){
339 all_species[isp].particles_d = Cabana::AoSoA<ParticleDataTypes,DeviceType,VEC_LEN>(
"particles_d", 0);
340 all_species[isp].owns_particles_d =
true;
345 all_species[isp].resize_device_particles();
Kokkos::View< double **, Kokkos::LayoutRight, HostType > f0_n_Ta
Equilibrium n_Ta at nodes.
Definition: plasma.hpp:39
void for_all_ions(F func, DevicePtlOpt device_ptl_opt=UseDevicePtl)
Definition: plasma.hpp:184
Kokkos::View< double *, Kokkos::LayoutRight, HostType > f0_B_B0
Bfield normalized to B0 at nodes.
Definition: plasma.hpp:44
bool owns_particles_d
Whether the species owns the device particle allocation right now.
Definition: species.hpp:92
View< double **, CLayout, HostType > f0_den_global
Equilibrium density at vertices.
Definition: plasma.hpp:80
Distribution< Device > f0
Species distribution in velocity space on local mesh nodes.
Definition: species.hpp:111
void manage_particle_ownership(int isp, DevicePtlOpt device_ptl_opt)
Definition: plasma.hpp:333
bool is_electron
Whether this species is the electrons.
Definition: species.hpp:70
void f0_set_ptrs(int nnode, double *f0_delta_n_cpp, double *f0_delta_u_cpp, double *f0_delta_T_cpp)
ParticleType
Definition: plasma.hpp:142
void for_one_species(int isp, F func, DevicePtlOpt device_ptl_opt=UseDevicePtl)
Definition: plasma.hpp:207
void update_decomposed_f0_calculations(const DomainDecomposition< DeviceType > &pol_decomp)
Definition: plasma.hpp:243
T get(const string ¶m, const T default_val, int val_ind=0)
Definition: NamelistReader.hpp:353
View< double **, CLayout, HostType > f0_temp_global
Equilibrium temperature at vertices.
Definition: plasma.hpp:81
Definition: velocity_grid.hpp:7
bool particles_d_has_owner
Whether a species owns the device particles allocation.
Definition: plasma.hpp:19
void deallocate_device_ptl()
Definition: plasma.hpp:231
Definition: plasma.hpp:139
Definition: NamelistReader.hpp:163
DecomposedRecalculableF0Arrays decomposed_recalculable_f0_arrays
Contains f0 values that are poloidally decomposed but don't need to be transferred between ranks duri...
Definition: plasma.hpp:73
VGridDistribution< HostType > f0_f0g
Definition: plasma.hpp:29
void for_all_nonadiabatic_species(F func, DevicePtlOpt device_ptl_opt=UseDevicePtl)
Definition: plasma.hpp:158
void f0_initialize_wrap()
int nonadiabatic_idx
Index of species skipping adiabatic species (for compatibility with fortran arrays) ...
Definition: species.hpp:72
bool default_residence_option()
Definition: species.hpp:26
int n_ptl
Number of particles.
Definition: species.hpp:86
Kokkos::View< T *, Kokkos::LayoutRight, Device > my_subview(const Kokkos::View< T ***, Kokkos::LayoutRight, Device > &view, int i, int j)
Definition: my_subview.hpp:8
Kokkos::View< double **, Kokkos::LayoutRight, HostType > f0_delta_n
Flux-surface averaged change of density.
Definition: plasma.hpp:76
std::vector< Species< DeviceType > > all_species
Every particle species in the simulation.
Definition: plasma.hpp:24
void resize_f0_f0g(const DomainDecomposition< DeviceType > &pol_decomp, const VelocityGrid &vgrid)
Definition: plasma.hpp:290
int nnodes
Number of nodes belonging to this MPI rank.
Definition: domain_decomposition.hpp:39
Kokkos::View< double **, Kokkos::LayoutRight, HostType > f0_flow
Equilibrium flow at nodes.
Definition: plasma.hpp:41
Definition: plasma.hpp:143
Cabana::AoSoA< ParticleDataTypes, Device, VEC_LEN > particles_d
Particles on device.
Definition: species.hpp:90
Kokkos::View< double **, Kokkos::LayoutRight, HostType > f0_inv_grid_vol
Inverse grid volume at nodes.
Definition: plasma.hpp:36
void set_unmanaged_f0_species_view(const T_in &view_in, int isp, T_out &view_out)
Definition: plasma.hpp:283
int particles_d_owner
Which species, if any, owns the device particles allocation.
Definition: plasma.hpp:20
void use_namelist(const string &namelist)
Definition: NamelistReader.hpp:322
Kokkos::View< double **, Kokkos::LayoutRight, HostType > f0_grid_vol_vonly
Grid volume (v only) at nodes.
Definition: plasma.hpp:38
void f0_init_global_arrays(double *f0_den_global, double *f0_temp_global)
int largest_n_ptl(bool check_backup)
Definition: plasma.hpp:212
DevicePtlOpt
Definition: plasma.hpp:137
Definition: plasma.hpp:34
int nspecies
Number of species including electrons.
Definition: plasma.hpp:83
void for_all_species(F func, DevicePtlOpt device_ptl_opt=UseDevicePtl)
Definition: plasma.hpp:149
int n_nonadiabatic_species
Number of nonadiabatic species.
Definition: plasma.hpp:84
Kokkos::View< double **, Kokkos::LayoutRight, HostType > f0_T_ev
Equilibrium temperature at nodes.
Definition: plasma.hpp:35
Kokkos::View< double **, Kokkos::LayoutRight, HostType > f0_grid_vol
Grid volume at nodes.
Definition: plasma.hpp:37
void set_f0_f0g_ptr(int f0_inode1, int f0_inode2, double *f0_f0g_loc)
Kokkos::View< double **, Kokkos::LayoutRight, HostType > f0_delta_u
Flux-surface averaged change of parallel flow.
Definition: plasma.hpp:77
bool namelist_present(const string &namelist)
Definition: NamelistReader.hpp:312
void init_global_f0_arrays(int grid_nnode, bool is_XGCa)
Definition: plasma.hpp:257
Definition: plasma.hpp:138
DecomposedRecalculableF0Arrays()
Definition: plasma.hpp:46
void f0_init_decomposed_arrays(double *f0_T_ev_cpp, double *f0_inv_grid_vol_cpp, double *f0_grid_vol_cpp, double *f0_grid_vol_vonly_cpp, double *f0_n_Ta_cpp, double *f0_den_cpp, double *f0_flow_cpp, double *f0_B_B0_cpp)
int n_backup_particles
Definition: species.hpp:108
void for_electrons(F func, DevicePtlOpt device_ptl_opt=UseDevicePtl)
Definition: plasma.hpp:173
double * data()
Definition: vgrid_distribution.hpp:39
Definition: plasma.hpp:15
Kokkos::View< double **, Kokkos::LayoutRight, HostType > f0_den
Equilibrium density at nodes.
Definition: plasma.hpp:40
Definition: plasma.hpp:144
void for_all(ParticleType particle_type, F func, DevicePtlOpt device_ptl_opt=UseDevicePtl)
Definition: plasma.hpp:195
bool species_share_particles_d_ownership
Whether to use the device particles sharing scheme.
Definition: plasma.hpp:18
Plasma()
Definition: plasma.hpp:87
Definition: species.hpp:66
void transfer_particles_d_ownership(int isp)
Definition: plasma.hpp:308
Kokkos::View< double **, Kokkos::LayoutRight, HostType > f0_delta_T
Flux-surface averaged change of temperature.
Definition: plasma.hpp:78
int first_node
First mesh node belonging to this MPI rank.
Definition: domain_decomposition.hpp:38
DecomposedRecalculableF0Arrays(int nsp, const DomainDecomposition< DeviceType > &pol_decomp)
Definition: plasma.hpp:48
Plasma(NLReader::NamelistReader &nlr, bool use_f0_grid, bool allocate_for_adiabatic_electrons, const DomainDecomposition< DeviceType > &pol_decomp, const VelocityGrid &vgrid)
Definition: plasma.hpp:94
Kokkos::View< int *, Kokkos::LayoutRight, HostType > gvid0_pid_h
Which processors get which vertices (host)
Definition: domain_decomposition.hpp:42