6 #include <Kokkos_Core.hpp>
7 #include <Kokkos_DualView.hpp>
63 template<
class Device>
70 Kokkos::View<double***,Device>
fhalf;
71 Kokkos::View<double***,Device>
dfdr;
72 Kokkos::View<double***,Device>
dfdz;
73 Kokkos::View<double****,Device>
EDs;
74 Kokkos::View<double******,Device>
M_ab;
75 Kokkos::View<double*****,Device>
M_s;
80 fhalf(
"fhalf",mb_n_nodes,nvz-1,nvr-1),
81 dfdr(
"dfdr",mb_n_nodes,nvz-1,nvr-1),
82 dfdz(
"dfdz",mb_n_nodes,nvz-1,nvr-1),
83 EDs(
"EDs",mb_n_nodes,nvz-1,nvr-1,
ED::
N),
84 M_s(
"M_s",mb_n_nodes,n_vgrids, (nvr-1)*(nvz-1),
ED::
N, nvr-1),
85 M_ab(
"M_ab",mb_n_nodes,n_vgrids, n_vgrids-1, (nvr-1)*(nvz-1), 3, (nvr-1)*(nvz-1)),
89 int mat_loc[16] = {4,5,7,8,
94 for (
int i=0;i<16;i++)
106 if(inner_psi_bound <= grid.
psi(inode) &&
107 outer_psi_bound >= grid.
psi(inode) &&
117 template<
class Device>
174 #if defined(USE_GINKGO) && defined(USE_GPU)
181 batch_size = nlr.
get<
int>(
"mesh_batch_size", default_batch_size);
182 if(nlr.
present(
"collisions_solver")){
183 std::string linalg_backend_str = nlr.
get<std::string>(
"collisions_solver",
"lapack");
189 else exit_XGC(
"\nError: Invalid input option. collisions_solver must be 'lapack' or 'ginkgo'.\n");
212 diag_on = nlr.
get<
bool>(
"diag_col_convergence_stat_on",
false);
215 io_stream = std::make_shared<XGC_IO_Stream>();
235 int n_threads = omp_get_max_threads();
236 int dbs=1;
while ( dbs < n_threads ) dbs*=2;
246 int plasma_nspecies = nlr.
get<
int>(
"ptl_nsp",1);
255 int col_grid_batch_size;
257 col_grid_batch_size = nlr.
get<
int>(
"mesh_batch_size", default_batch_size);
259 double device_col_GB_per_vertex = plasma_nspecies*std::max(plasma_nspecies-1,1)*(vgrid.
nvp*vgrid.
nmu)*(vgrid.
nvp*vgrid.
nmu)*8*
BYTES_TO_GB;
260 double gpu_memory_usage = (col_grid_batch_size*device_col_GB_per_vertex);
264 return memory_prediction;
268 static KOKKOS_INLINE_FUNCTION
double get_maxw_fac(
double mesh_dr,
double mesh_r,
double numeric_vth2) ;
277 static KOKKOS_INLINE_FUNCTION
void LU_matrix_ftn(
int mesh_ind,
int gri,
int grj,
int spi,
int cell_i,
int cell_j,
const CollisionVelocityGrids<Device>& col_vgrids,
int mprl_col,
int mat_pos,
double coeff1,
double coeff2,
const TmpColData<Device>& tcd,
const Kokkos::View<int**,Device>& index_map_LU_d,
typename Collisions::GridMatrix<Device>::values_array_t LU_values);
289 static KOKKOS_INLINE_FUNCTION
void E_and_D_s(
int idx,
int mb_n_nodes,
int nvrm1,
int nvzm1,
const TmpColData<Device>& tcd,
int gri) ;
310 void collision(
const CollisionSpecies<Device>& col_spall,
const VertexList& assigned,
const View<int*,CLayout,HostType>& n_subcycles_local,
double dt,
const VGridDistribution<HostType>& df_out,
const View<int*,CLayout,HostType>& converged_local,
const View<double*,CLayout,HostType>& node_cost)
const;
Definition: col_grid.hpp:118
int ginkgo_max_iterations
Definition: col_grid.hpp:127
void LU_matrix(int mb_n_nodes, int gri, int grj, int spi, const CollisionVelocityGrids< Device > &col_vgrids, const TmpColData< Device > &tcd, Collisions::GridMatrix< Device > *const mtx) const
Definition: col_grid.cpp:1240
static int get_default_batch_size()
Definition: col_grid.hpp:229
View< double *, Device > get_numeric_v_thermal_equil(int mb_n_nodes, int spi, int grj, const CollisionVelocityGrids< Device > &col_vgrids, const CollisionSpecies< Device > &col_spall) const
Definition: col_grid.cpp:1097
bool diag_on
Definition: col_grid.hpp:139
void picard_loop(int vpic_inner_iter_max, const CollisionVelocityGrids< Device > &col_vgrids, const CollisionSpecies< Device > &col_spall, TmpColData< Device > &tcd, const std::unique_ptr< Collisions::GridMatrix< Device >> &matrix, int mb_n_nodes, Kokkos::View< Convergence::Status *, HostType > &convergence_status) const
Definition: col_grid.cpp:628
void f_df(int mb_n_nodes, const CollisionVelocityGrids< Device > &col_vgrids, const CollisionSpecies< Device > &col_spall, int spi, int grj, TmpColData< Device > &tcd) const
Definition: col_grid.cpp:977
VertexList vertices
Definition: col_grid.hpp:135
Collisions::LinAlgBackend labackend
Definition: col_grid.hpp:124
int start_step
starting step for collisions; should be part of step trigger
Definition: col_grid.hpp:129
void angle_avg(int mb_n_nodes, int gri, int grj, CollisionVelocityGrids< Device > &col_vgrids, TmpColData< Device > &tcd) const
Definition: col_grid.cpp:733
CollisionGrid(NLReader::NamelistReader &nlr, const MagneticField< DeviceType > &magnetic_field, const Grid< DeviceType > &grid, bool exclude_private_region, bool overwrite_existing_files)
Definition: col_grid.hpp:145
static KOKKOS_INLINE_FUNCTION void LU_matrix_ftn(int mesh_ind, int gri, int grj, int spi, int cell_i, int cell_j, const CollisionVelocityGrids< Device > &col_vgrids, int mprl_col, int mat_pos, double coeff1, double coeff2, const TmpColData< Device > &tcd, const Kokkos::View< int **, Device > &index_map_LU_d, typename Collisions::GridMatrix< Device >::values_array_t LU_values)
Definition: col_grid.cpp:1195
View< float *, CLayout, HostType > timing_all
Definition: col_grid.hpp:133
std::shared_ptr< XGC_IO_Stream > io_stream
Definition: col_grid.hpp:140
void collision(const CollisionSpecies< Device > &col_spall, const VertexList &assigned, const View< int *, CLayout, HostType > &n_subcycles_local, double dt, const VGridDistribution< HostType > &df_out, const View< int *, CLayout, HostType > &converged_local, const View< double *, CLayout, HostType > &node_cost) const
Definition: col_grid.cpp:19
void E_and_D(int mb_n_nodes, int gri, int grj, const CollisionVelocityGrids< Device > &col_vgrids, TmpColData< Device > &tcd) const
Definition: col_grid.cpp:821
static KOKKOS_INLINE_FUNCTION double get_maxw_fac(double mesh_dr, double mesh_r, double numeric_vth2)
Definition: col_grid.cpp:1077
static KOKKOS_INLINE_FUNCTION void angle_avg_s(int idx, int mb_n_nodes, int nvrm1, int nvzm1, const CollisionVelocityGrids< Device > &col_vgrids, const TmpColData< Device > &tcd, int gri)
Definition: col_grid.cpp:912
int batch_size
Definition: col_grid.hpp:122
Kokkos::View< Convergence::Status *, HostType > core(CollisionVelocityGrids< Device > &col_vgrids, const CollisionSpecies< Device > &col_spall, TmpColData< Device > &tcd, const std::unique_ptr< Collisions::GridMatrix< Device >> &solve_matrix, int mb_n_nodes) const
Definition: col_grid.cpp:516
void core_delta_init(int mb_n_nodes, int gri, int grj, int spi, CollisionVelocityGrids< Device > &col_vgrids, const CollisionSpecies< Device > &col_spall) const
Definition: col_grid.cpp:1134
View< bool[1], CLayout, HostType > timing_available
Definition: col_grid.hpp:134
double ginkgo_residual_reduction
Definition: col_grid.hpp:126
static KOKKOS_INLINE_FUNCTION void E_and_D_s(int idx, int mb_n_nodes, int nvrm1, int nvzm1, const TmpColData< Device > &tcd, int gri)
Definition: col_grid.cpp:1032
CollisionGrid()
Definition: col_grid.hpp:142
bool timing_is_available() const
Definition: col_grid.hpp:225
int max_n_subcycles
Maximum number of subcycles that may be attempted.
Definition: col_grid.hpp:131
bool async_reassign
Definition: col_grid.hpp:137
View< int *, CLayout, HostType > n_subcycles
Number of subcycles for each vertex.
Definition: col_grid.hpp:132
static KOKKOS_INLINE_FUNCTION void angle_avg_ab(int idx, int mb_n_nodes, int nvrm1, int nvzm1, const CollisionVelocityGrids< Device > &col_vgrids, const TmpColData< Device > &tcd, int gri, int grj)
Definition: col_grid.cpp:751
static MemoryPrediction estimate_memory_usage(NLReader::NamelistReader &nlr)
Definition: col_grid.hpp:244
static KOKKOS_INLINE_FUNCTION void E_and_D_ab(int idx, int mb_n_nodes, int nvrm1, int nvzm1, const CollisionVelocityGrids< Device > &col_vgrids, const TmpColData< Device > &tcd, int gri, int grj)
Definition: col_grid.cpp:859
Definition: col_species.hpp:105
Definition: col_grid_matrix.hpp:24
Kokkos::View< value_type ***, Kokkos::LayoutRight, Device, Kokkos::MemoryTraits< Kokkos::Unmanaged > > values_array_t
Definition: col_grid_matrix.hpp:31
Kokkos::View< double *, Kokkos::LayoutRight, Device > psi
An array of psi coordinates.
Definition: grid.hpp:185
KOKKOS_INLINE_FUNCTION bool node_is_in_included_region(const int inode, const bool exclude_private_region) const
Definition: grid.tpp:239
int nnode
Number of grid nodes.
Definition: grid.hpp:174
Definition: magnetic_field.hpp:12
Definition: NamelistReader.hpp:193
T get(const string ¶m, const T default_val, int val_ind=0)
Definition: NamelistReader.hpp:386
void use_namelist(const string &namelist, Options required=Required)
Definition: NamelistReader.hpp:360
@ Optional
Definition: NamelistReader.hpp:287
bool present(const string ¶m)
Definition: NamelistReader.hpp:374
Definition: vertex_list.hpp:53
VertexList vertices_in_range(const MagneticField< DeviceType > &magnetic_field, const Grid< DeviceType > &grid, bool exclude_private_region, double inner_psi_bound, double outer_psi_bound)
Definition: col_grid.hpp:104
constexpr double BYTES_TO_GB
Definition: constants.hpp:13
void exit_XGC(std::string msg)
Definition: globals.hpp:37
bool is_rank_zero()
Definition: globals.hpp:27
MPI_Comm SML_COMM_WORLD
Definition: my_mpi.cpp:4
LinAlgBackend
Definition: col_grid_matrix.hpp:227
Definition: col_grid.hpp:39
Status
Definition: col_grid.hpp:43
@ NaNOrInfFound
Definition: col_grid.hpp:44
@ InProgress
Definition: col_grid.hpp:51
@ TooManyNegValues
Definition: col_grid.hpp:46
@ MaxedIter
Definition: col_grid.hpp:45
@ PosCorrectionFail
Definition: col_grid.hpp:47
@ FirstStepFail
Definition: col_grid.hpp:48
@ NotAttempted
Definition: col_grid.hpp:49
@ Success
Definition: col_grid.hpp:50
bool is_okay(Status convergence_status)
Definition: col_grid.hpp:54
Definition: col_grid.hpp:28
@ ZZ
Definition: col_grid.hpp:32
@ RR
Definition: col_grid.hpp:30
@ EZ
Definition: col_grid.hpp:34
@ N
Definition: col_grid.hpp:35
@ ER
Definition: col_grid.hpp:33
@ RZ
Definition: col_grid.hpp:31
Definition: magnetic_field.F90:1
logical sml_electron_on
Whether to run with adiabatic (.false.) or kinetic (.true.) electrons.
Definition: module.F90:251
Kokkos::ViewAllocateWithoutInitializing NoInit
Definition: space_settings.hpp:69
Definition: col_vgrids.hpp:13
Definition: memory_prediction.hpp:4
Definition: col_grid.hpp:64
Kokkos::DualView< int[4][4], Device > mat_pos_rel_indx
Definition: col_grid.hpp:68
Kokkos::View< double ****, Device > EDs
Definition: col_grid.hpp:73
Kokkos::View< double *****, Device > M_s
Definition: col_grid.hpp:75
Kokkos::View< double ***, Device > dfdz
Definition: col_grid.hpp:72
Kokkos::View< double ***, Device > fhalf
Definition: col_grid.hpp:70
Kokkos::View< double ***, Device > dfdr
Definition: col_grid.hpp:71
Kokkos::View< double ******, Device > M_ab
Definition: col_grid.hpp:74
Kokkos::View< double ***, Device > gammac_spall
Definition: col_grid.hpp:67
Definition: velocity_grid.hpp:8
int nmu
n points in mu (not including zero)
Definition: velocity_grid.hpp:13
int nvp
n points in parallel velocity (not including zero)
Definition: velocity_grid.hpp:9