6 #include <Kokkos_Core.hpp>
7 #include <Kokkos_DualView.hpp>
42 namespace Convergence{
78 template<
class Device>
84 int gri = cs.
s.h_view(isp, mesh_ind).grid_index;
86 for (
int index_i = 0; index_i<cvg.
mesh_z.extent(2); index_i++){
87 double mesh_z2 = cvg.
mesh_z(mesh_ind,gri,index_i)*cvg.
mesh_z(mesh_ind,gri,index_i);
89 for (
int index_j = 0; index_j<cvg.
mesh_r.extent(2); index_j++){
90 double mesh_r2 = cvg.
mesh_r(mesh_ind,gri,index_j)*cvg.
mesh_r(mesh_ind,gri,index_j);
91 double vpic_dfc = (cs.
pdf_np1.h_view(mesh_ind,isp,index_i,index_j) - cs.
pdf_n.h_view(mesh_ind,isp,index_i,index_j))
92 *cvg.
vol_h(mesh_ind,gri,index_j)*vp_vol_fac;
95 vpic_dw += vpic_dfc*(mesh_z2 + mesh_r2);
96 vpic_dp += vpic_dfc*cvg.
mesh_z(mesh_ind,gri,index_i);
100 dw = vpic_dw*cs.
s.h_view(isp,mesh_ind).mass;
101 dp = vpic_dp*cs.
s.h_view(isp,mesh_ind).mass;
102 dn_n = std::abs(vpic_dn/cs.
s.h_view(isp,mesh_ind).dens);
107 template<
class Device>
112 for (
int spi = 0; spi<col_spall.
n(); spi++){
113 w_sum += col_spall.
s.h_view(spi,mesh_ind).ens;
114 p_sum += col_spall.
s.h_view(spi,mesh_ind).mom;
115 min_p_thres = std::min( col_spall.
s.h_view(spi,mesh_ind).mass*col_spall.
s.h_view(spi,mesh_ind).dens*sqrt(col_spall.
s.h_view(spi,mesh_ind).numeric_vth2),
120 template<
class Device>
127 for (
int spi = 0; spi<col_spall.
n(); spi++){
130 eval(spi, mesh_ind, col_vgrids, col_spall,dw,dp,dn_n);
138 values_are_all_finite = (std::isfinite(
dw_sum) && std::isfinite(
dp_sum) && std::isfinite(
dn_n_max));
144 double mass_use = (col_spall.
s.h_view(0,mesh_ind).is_electron ? col_spall.
s.h_view(1,mesh_ind).mass : col_spall.
s.h_view(0,mesh_ind).mass);
145 mom_exit_ok = std::abs(
dp_sum)/(std::max(std::abs(
p_sum),1e-3*mass_use*col_spall.
s.h_view(0,mesh_ind).dens)) <= 1.0e-7;
154 template<
class Device>
161 Kokkos::View<double***,Device>
fhalf;
162 Kokkos::View<double***,Device>
dfdr;
163 Kokkos::View<double***,Device>
dfdz;
164 Kokkos::View<double****,Device>
EDs;
165 Kokkos::View<double******,Device>
M_ab;
166 Kokkos::View<double*****,Device>
M_s;
171 fhalf(
"fhalf",mb_n_nodes,nvz-1,nvr-1),
172 dfdr(
"dfdr",mb_n_nodes,nvz-1,nvr-1),
173 dfdz(
"dfdz",mb_n_nodes,nvz-1,nvr-1),
174 EDs(
"EDs",mb_n_nodes,nvz-1,nvr-1,
ED::N),
175 M_s(
"M_s",mb_n_nodes,n_vgrids, (nvr-1)*(nvz-1),
ED::N, nvr-1),
176 M_ab(
"M_ab",mb_n_nodes,n_vgrids, n_vgrids-1, (nvr-1)*(nvz-1), 3, (nvr-1)*(nvz-1)),
180 int mat_loc[16] = {4,5,7,8,
185 for (
int i=0;i<16;i++)
197 if(inner_psi_bound <= grid.
psi(inode) &&
198 outer_psi_bound >= grid.
psi(inode) &&
208 template<
class Device>
236 double inner_psi_bound = nlr.
get<
double>(
"col_pin",magnetic_field.
inpsi);
237 double outer_psi_bound = nlr.
get<
double>(
"col_pout",magnetic_field.
outpsi);
241 if(nlr.
present(
"col_pin")) inner_psi_bound *= magnetic_field.
psi_norm();
242 if(nlr.
present(
"col_pout")) outer_psi_bound *= magnetic_field.
psi_norm();
255 int default_batch_size = 64;
257 int default_batch_size = 1;
261 #if defined(USE_GINKGO) && defined(USE_GPU)
269 batch_size = nlr.
get<
int>(
"mesh_batch_size", default_batch_size);
270 if(nlr.
present(
"collisions_solver")){
271 std::string linalg_backend_str = nlr.
get<std::string>(
"collisions_solver",
"lapack");
276 else exit_XGC(
"\nError: Invalid input option. collisions_solver must be 'lapack' or 'ginkgo'.\n");
303 diag_on = nlr.
get<
bool>(
"diag_col_convergence_stat_on",
false);
306 io_stream = std::make_shared<XGC_IO_Stream>();
322 int plasma_nspecies = nlr.
get<
int>(
"ptl_nsp",1);
325 bool sml_electron_on = nlr.
get<
bool>(
"sml_electron_on",
false);
326 if(sml_electron_on) plasma_nspecies += 1;
330 int default_batch_size = 64;
332 int default_batch_size = 1;
334 int col_grid_batch_size;
337 col_grid_batch_size = nlr.
get<
int>(
"mesh_batch_size", default_batch_size);
339 col_grid_batch_size = default_batch_size;
342 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;
343 double gpu_memory_usage = (col_grid_batch_size*device_col_GB_per_vertex);
347 return memory_prediction;
354 static KOKKOS_INLINE_FUNCTION
double get_maxw_fac(
double mesh_dr,
double mesh_r,
double numeric_vth2) ;
363 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);
375 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) ;
396 void collision(std::vector<
Species<DeviceType>> &all_species,
const Moments& moments,
const DomainDecomposition<DeviceType>& pol_decomp,
const VertexList& assigned,
const VGridDistribution<HostType>& f0_f,
VGridDistribution<HostType>& df_out,
double dt, View<int*,CLayout,HostType>& converged_all, View<double*,CLayout,HostType>& node_cost)
const;
double min_p_thres
Definition: col_grid.hpp:67
double inpsi
Boundary condition used in a few spots.
Definition: magnetic_field.hpp:42
void collision(std::vector< Species< DeviceType >> &all_species, const Moments &moments, const DomainDecomposition< DeviceType > &pol_decomp, const VertexList &assigned, const VGridDistribution< HostType > &f0_f, VGridDistribution< HostType > &df_out, double dt, View< int *, CLayout, HostType > &converged_all, View< double *, CLayout, HostType > &node_cost) const
Definition: col_grid.tpp:22
Definition: col_grid_matrix.hpp:23
double w_sum
Definition: col_grid.hpp:65
int nmu
n points in mu (not including zero)
Definition: velocity_grid.hpp:13
bool is_rank_zero()
Definition: globals.hpp:27
MPI_Comm SML_COMM_WORLD
Definition: my_mpi.cpp:4
int nvp
n points in parallel velocity (not including zero)
Definition: velocity_grid.hpp:9
Kokkos::View< double ******, Device > M_ab
Definition: col_grid.hpp:165
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.tpp:836
int batch_size
Definition: col_grid.hpp:213
T get(const string ¶m, const T default_val, int val_ind=0)
Definition: NamelistReader.hpp:373
constexpr double BYTES_TO_GB
Definition: constants.hpp:12
Kokkos::View< Convergence::Status *, HostType > core(CollisionVelocityGrids< Device > &col_vgrids, CollisionSpecies< Device > &col_spall, TmpColData< Device > &tcd, int mb_n_nodes) const
Definition: col_grid.tpp:112
Kokkos::View< double *****, Device > M_s
Definition: col_grid.hpp:166
Definition: col_grid.hpp:209
Kokkos::DualView< double ****, Kokkos::LayoutRight, Device > pdf_np1
Definition: col_species.hpp:88
Definition: velocity_grid.hpp:8
void set(int mesh_ind, const CollisionSpecies< Device > &col_spall)
Definition: col_grid.hpp:108
bool present(const string ¶m)
Definition: NamelistReader.hpp:363
Definition: col_grid.hpp:47
Kokkos::View< double ***, Device > fhalf
Definition: col_grid.hpp:161
Status
Definition: col_grid.hpp:46
Definition: col_grid.hpp:52
Collisions::LinAlgBackend labackend
Definition: col_grid.hpp:215
double p_sum
Definition: col_grid.hpp:66
Kokkos::View< value_type ***, Kokkos::LayoutRight, Device, Kokkos::MemoryTraits< Kokkos::Unmanaged >> values_array_t
Definition: col_grid_matrix.hpp:31
Kokkos::View< double ***, Device > gammac_spall
Definition: col_grid.hpp:158
Definition: NamelistReader.hpp:193
Definition: magnetic_field.hpp:12
Definition: moments.hpp:9
KOKKOS_INLINE_FUNCTION bool node_is_in_included_region(const int inode, const bool exclude_private_region) const
Definition: grid.tpp:225
bool en_exit_ok
Definition: col_grid.hpp:74
Definition: col_grid.hpp:30
Kokkos::DualView< CollisionSpeciesScalars **, Device > s
Definition: col_species.hpp:85
double dn_n_max
Definition: col_grid.hpp:72
CollisionGrid()
Definition: col_grid.hpp:229
int ginkgo_max_iterations
Definition: col_grid.hpp:218
T::value_type max_view(const T &view)
Definition: view_arithmetic.hpp:118
KOKKOS_INLINE_FUNCTION double psi_norm() const
Definition: magnetic_field.tpp:3
Definition: col_vgrids.hpp:13
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.tpp:775
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.tpp:743
KOKKOS_INLINE_FUNCTION double vp_vol_fac(int ivz) const
Definition: col_vgrids.hpp:107
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.tpp:513
Definition: col_grid.hpp:48
VertexList vertices
Definition: col_grid.hpp:224
Definition: col_grid.hpp:155
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:195
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.tpp:881
const int vpic_inner_iter_max
Definition: col_grid.hpp:40
Kokkos::View< double *, Kokkos::LayoutRight, Device > psi
An array of psi coordinates.
Definition: grid.hpp:176
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.tpp:682
View< double ***, CLayout, HostType > mesh_r
Definition: col_vgrids.hpp:20
void core_init(int isp, int mesh_ind, const CollisionVelocityGrids< Device > &col_vgrids, const CollisionSpecies< Device > &col_spall) const
Definition: col_grid.tpp:339
double dw_sum
Definition: col_grid.hpp:70
double outpsi
Boundary condition used in a few spots.
Definition: magnetic_field.hpp:43
Kokkos::DualView< double ****, Kokkos::LayoutRight, Device > pdf_n
Definition: col_species.hpp:87
void use_namelist(const string &namelist)
Definition: NamelistReader.hpp:355
Definition: col_grid.hpp:63
Definition: col_grid.hpp:32
Definition: memory_prediction.hpp:4
void eval(int isp, int mesh_ind, const CollisionVelocityGrids< Device > &cvg, const CollisionSpecies< Device > &cs, double &dw, double &dp, double &dn_n) const
Definition: col_grid.hpp:79
void E_and_D(int mb_n_nodes, int gri, int grj, const CollisionVelocityGrids< Device > &col_vgrids, TmpColData< Device > &tcd) const
Definition: col_grid.tpp:475
Definition: col_grid.hpp:49
Kokkos::View< double ***, Device > dfdz
Definition: col_grid.hpp:163
void picard_loop(int vpic_inner_iter_max, const CollisionVelocityGrids< Device > &col_vgrids, CollisionSpecies< Device > &col_spall, TmpColData< Device > &tcd, int mb_n_nodes, Kokkos::View< Convergence::Status *, HostType > &convergence_status, Kokkos::View< Convergence::Moments *, HostType > &moments) const
Definition: col_grid.tpp:222
View< int *, CLayout, HostType > n_subcycles
Number of subcycles for each vertex.
Definition: col_grid.hpp:223
Definition: col_grid.hpp:35
double ginkgo_residual_reduction
Definition: col_grid.hpp:217
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.tpp:566
bool dens_exit_ok
Definition: col_grid.hpp:73
bool namelist_present(const string &namelist)
Definition: NamelistReader.hpp:351
Definition: col_grid.hpp:31
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:232
View< double ***, CLayout, HostType > mesh_z
Definition: col_vgrids.hpp:21
Kokkos::View< double ****, Device > EDs
Definition: col_grid.hpp:164
Definition: col_grid.hpp:33
void exit_XGC(std::string msg)
Definition: globals.hpp:37
Definition: col_grid.hpp:54
Definition: magnetic_field.F90:1
LinAlgBackend
Definition: col_grid_matrix.hpp:221
int n() const
Definition: col_species.hpp:181
Definition: col_grid.hpp:51
Kokkos::View< double ***, Device > dfdr
Definition: col_grid.hpp:162
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.tpp:405
int start_step
starting step for collisions; should be part of step trigger
Definition: col_grid.hpp:220
Definition: vertex_list.hpp:53
bool mom_exit_ok
Definition: col_grid.hpp:75
View< double ***, CLayout, HostType > vol_h
Definition: col_vgrids.hpp:23
Definition: species.hpp:75
static MemoryPrediction estimate_memory_usage(NLReader::NamelistReader &nlr)
Definition: col_grid.hpp:320
std::shared_ptr< XGC_IO_Stream > io_stream
Definition: col_grid.hpp:227
Definition: col_species.hpp:81
int nnode
Number of grid nodes.
Definition: grid.hpp:165
Kokkos::DualView< int[4][4], Device > mat_pos_rel_indx
Definition: col_grid.hpp:159
void angle_avg(int mb_n_nodes, int gri, int grj, CollisionVelocityGrids< Device > &col_vgrids, TmpColData< Device > &tcd) const
Definition: col_grid.tpp:387
bool is_okay(Status convergence_status)
Definition: col_grid.hpp:57
Definition: col_grid.hpp:53
double dp_sum
Definition: col_grid.hpp:71
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.tpp:631
int largest_n_subcycles() const
Definition: col_grid.hpp:316
Kokkos::ViewAllocateWithoutInitializing NoInit
Definition: space_settings.hpp:69
static KOKKOS_INLINE_FUNCTION double get_maxw_fac(double mesh_dr, double mesh_r, double numeric_vth2)
Definition: col_grid.tpp:727
Definition: col_grid.hpp:50
bool evaluate_conservation(int mesh_ind, const CollisionVelocityGrids< Device > &col_vgrids, const CollisionSpecies< Device > &col_spall, bool &values_are_all_finite)
Definition: col_grid.hpp:121
bool diag_on
Definition: col_grid.hpp:226
Definition: col_grid.hpp:34
int max_n_subcycles
Maximum number of subcycles that may be attempted.
Definition: col_grid.hpp:222