6 #include <Kokkos_Core.hpp>
7 #include <Kokkos_DualView.hpp>
41 namespace Convergence{
77 template<
class Device>
83 int gri = cs.
s.h_view(isp, mesh_ind).grid_index;
85 for (
int index_i = 0; index_i<cvg.
mesh_z.extent(2); index_i++){
86 double mesh_z2 = cvg.
mesh_z(mesh_ind,gri,index_i)*cvg.
mesh_z(mesh_ind,gri,index_i);
87 for (
int index_j = 0; index_j<cvg.
mesh_r.extent(2); index_j++){
88 double mesh_r2 = cvg.
mesh_r(mesh_ind,gri,index_j)*cvg.
mesh_r(mesh_ind,gri,index_j);
89 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)) * cvg.
vol_h(mesh_ind,gri,index_j);
92 vpic_dw += vpic_dfc*(mesh_z2 + mesh_r2);
93 vpic_dp += vpic_dfc*cvg.
mesh_z(mesh_ind,gri,index_i);
97 dw = vpic_dw*cs.
s.h_view(isp,mesh_ind).mass;
98 dp = vpic_dp*cs.
s.h_view(isp,mesh_ind).mass;
99 dn_n = std::abs(vpic_dn/cs.
s.h_view(isp,mesh_ind).dens);
104 template<
class Device>
109 for (
int spi = 0; spi<col_spall.
n(); spi++){
110 w_sum += col_spall.
s.h_view(spi,mesh_ind).ens;
111 p_sum += col_spall.
s.h_view(spi,mesh_ind).mom;
112 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),
117 template<
class Device>
124 for (
int spi = 0; spi<col_spall.
n(); spi++){
127 eval(spi, mesh_ind, col_vgrids, col_spall,dw,dp,dn_n);
135 values_are_all_finite = (std::isfinite(
dw_sum) && std::isfinite(
dp_sum) && std::isfinite(
dn_n_max));
141 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);
142 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;
151 template<
class Device>
158 Kokkos::View<double***,Device>
fhalf;
159 Kokkos::View<double***,Device>
dfdr;
160 Kokkos::View<double***,Device>
dfdz;
161 Kokkos::View<double****,Device>
EDs;
162 Kokkos::View<double******,Device>
M_ab;
163 Kokkos::View<double*****,Device>
M_s;
168 fhalf(
"fhalf",mb_n_nodes,nvz-1,nvr-1),
169 dfdr(
"dfdr",mb_n_nodes,nvz-1,nvr-1),
170 dfdz(
"dfdz",mb_n_nodes,nvz-1,nvr-1),
171 EDs(
"EDs",mb_n_nodes,nvz-1,nvr-1,
ED::N),
172 M_s(
"M_s",mb_n_nodes,n_vgrids, (nvr-1)*(nvz-1),
ED::N, nvr-1),
173 M_ab(
"M_ab",mb_n_nodes,n_vgrids, n_vgrids-1, (nvr-1)*(nvz-1), 3, (nvr-1)*(nvz-1)),
177 int mat_loc[16] = {4,5,7,8,
182 for (
int i=0;i<16;i++)
192 template<
class Device>
228 int default_batch_size = 64;
230 int default_batch_size = 1;
232 std::string linalg_backend_str;
235 batch_size = nlr.
get<
int>(
"mesh_batch_size", default_batch_size);
236 linalg_backend_str = nlr.
get<std::string>(
"collisions_solver",
"lapack");
241 linalg_backend_str =
"lapack";
251 int plasma_nspecies = nlr.
get<
int>(
"ptl_nsp",1);
254 int sml_special = nlr.
get<
int>(
"sml_special", 0);
255 bool sml_electron_on = nlr.
get<
bool>(
"sml_electron_on",
false);
256 if(sml_special==4) sml_electron_on =
false;
257 if(sml_electron_on) plasma_nspecies += 1;
261 int default_batch_size = 64;
263 int default_batch_size = 1;
265 int col_grid_batch_size;
268 col_grid_batch_size = nlr.
get<
int>(
"mesh_batch_size", default_batch_size);
270 col_grid_batch_size = default_batch_size;
273 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;
274 double gpu_memory_usage = (col_grid_batch_size*device_col_GB_per_vertex);
278 return memory_prediction;
285 static KOKKOS_INLINE_FUNCTION
double get_maxw_fac(
double mesh_dr,
double mesh_r,
double numeric_vth2) ;
294 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);
327 void collision(std::vector<
Species<DeviceType>> &all_species,
const Moments& moments,
const DomainDecomposition<DeviceType>& pol_decomp,
const View<bool*, HostType>& in_range,
bool symmetric_f,
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:66
double inpsi
Boundary condition used in a few spots.
Definition: magnetic_field.hpp:25
Definition: col_grid_matrix.hpp:23
double w_sum
Definition: col_grid.hpp:64
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
Kokkos::View< double ******, Device > M_ab
Definition: col_grid.hpp:162
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:838
int batch_size
Definition: col_grid.hpp:197
Kokkos::View< double ***, Kokkos::LayoutRight, HostType > mesh_z
Definition: col_vgrids.hpp:21
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:138
Kokkos::View< double *****, Device > M_s
Definition: col_grid.hpp:163
Definition: col_grid.hpp:193
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:105
bool present(const string ¶m)
Definition: NamelistReader.hpp:363
Definition: col_grid.hpp:46
Kokkos::View< double ***, Device > fhalf
Definition: col_grid.hpp:158
Status
Definition: col_grid.hpp:45
Definition: col_grid.hpp:51
void collision(std::vector< Species< DeviceType >> &all_species, const Moments &moments, const DomainDecomposition< DeviceType > &pol_decomp, const View< bool *, HostType > &in_range, bool symmetric_f, 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
Collisions::LinAlgBackend labackend
Definition: col_grid.hpp:199
double p_sum
Definition: col_grid.hpp:65
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:155
Definition: NamelistReader.hpp:193
Definition: magnetic_field.hpp:12
Definition: moments.hpp:13
Equilibrium equil
The object containing information about the magnetic equilibrium.
Definition: magnetic_field.hpp:32
Kokkos::View< double ***, Kokkos::LayoutRight, HostType > vol_h
Definition: col_vgrids.hpp:23
bool en_exit_ok
Definition: col_grid.hpp:73
Definition: col_grid.hpp:29
CollisionGrid(NLReader::NamelistReader &nlr, const MagneticField< DeviceType > &magnetic_field)
Definition: col_grid.hpp:212
Kokkos::DualView< CollisionSpeciesScalars **, Device > s
Definition: col_species.hpp:85
double dn_n_max
Definition: col_grid.hpp:71
CollisionGrid()
Definition: col_grid.hpp:209
int ginkgo_max_iterations
Definition: col_grid.hpp:202
double inner_psi_bound
Inner psi bound; collisions skipped below this.
Definition: col_grid.hpp:204
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:777
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:745
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:515
Definition: col_grid.hpp:47
Definition: col_grid.hpp:152
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:883
const int vpic_inner_iter_max
Definition: col_grid.hpp:39
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:684
void core_init(int isp, int mesh_ind, const CollisionVelocityGrids< Device > &col_vgrids, const CollisionSpecies< Device > &col_spall) const
Definition: col_grid.tpp:356
double dw_sum
Definition: col_grid.hpp:69
double outpsi
Boundary condition used in a few spots.
Definition: magnetic_field.hpp:26
idx
Definition: diag_f0_df_port1.hpp:32
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:62
Definition: col_grid.hpp:31
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:78
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:491
Definition: col_grid.hpp:48
Kokkos::View< double ***, Device > dfdz
Definition: col_grid.hpp:160
double outer_psi_bound
Outer psi bound; collisions skipped above this.
Definition: col_grid.hpp:205
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:239
Definition: col_grid.hpp:34
double ginkgo_residual_reduction
Definition: col_grid.hpp:201
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:568
bool dens_exit_ok
Definition: col_grid.hpp:72
bool namelist_present(const string &namelist)
Definition: NamelistReader.hpp:351
Definition: col_grid.hpp:30
Kokkos::View< double ****, Device > EDs
Definition: col_grid.hpp:161
Definition: col_grid.hpp:32
Definition: col_grid.hpp:53
Definition: magnetic_field.F90:1
LinAlgBackend
Definition: col_grid_matrix.hpp:221
int n() const
Definition: col_species.hpp:181
Definition: col_grid.hpp:50
Kokkos::View< double ***, Device > dfdr
Definition: col_grid.hpp:159
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:421
int start_step
starting step for collisions; should be part of step trigger
Definition: col_grid.hpp:207
bool mom_exit_ok
Definition: col_grid.hpp:74
Definition: species.hpp:75
static MemoryPrediction estimate_memory_usage(NLReader::NamelistReader &nlr)
Definition: col_grid.hpp:249
Definition: col_species.hpp:81
Kokkos::DualView< int[4][4], Device > mat_pos_rel_indx
Definition: col_grid.hpp:156
void angle_avg(int mb_n_nodes, int gri, int grj, CollisionVelocityGrids< Device > &col_vgrids, TmpColData< Device > &tcd) const
Definition: col_grid.tpp:403
bool is_okay(Status convergence_status)
Definition: col_grid.hpp:56
Definition: col_grid.hpp:52
double dp_sum
Definition: col_grid.hpp:70
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:633
Kokkos::View< double ***, Kokkos::LayoutRight, HostType > mesh_r
Definition: col_vgrids.hpp:20
static KOKKOS_INLINE_FUNCTION double get_maxw_fac(double mesh_dr, double mesh_r, double numeric_vth2)
Definition: col_grid.tpp:729
Definition: col_grid.hpp:49
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:118
double xpt_psi
Psi coordinate of 1st X-point.
Definition: equil.hpp:84
Definition: col_grid.hpp:33