1 #ifndef VARYING_BACKGROUND_HPP
2 #define VARYING_BACKGROUND_HPP
35 View<double**, CLayout, Device>
vol;
36 View<double****, CLayout, Device>
bg;
46 period = nlr.
get<
int>(
"col_vb_period", 1);
47 pin = nlr.
get<
double>(
"col_vb_pin", magnetic_field.
inpsi);
48 pout = nlr.
get<
double>(
"col_vb_pout", std::min(magnetic_field.
outpsi, 1.03));
49 m = nlr.
get<
int>(
"col_vb_m", 50);
50 mtheta = nlr.
get<
int>(
"col_vb_mtheta", 8);
56 double dp = (pout -
pin)/m;
62 bg = View<double****, CLayout, Device>(
NoInit(
"vb_bg"), n_nonadiabatic_species, m+1,
mtheta,
N);
70 KOKKOS_INLINE_FUNCTION
void interp_bg_profile(
double psi,
double theta,
int isp,
double& den,
double& temp,
double& up)
const {
73 j = min(
m-1,max(0,j));
87 View<double***, CLayout, DeviceType> dum(
NoInit(
"dum"),
m+1,
mtheta,
N);
88 Kokkos::deep_copy(
bg, 1.0e-99);
89 Kokkos::deep_copy(dum, 1.0e-99);
111 for (
int i_simd = 0; i_simd<SIMD_SIZE; i_simd++){
112 if(part.
gid[i_simd]>0){
115 double weight = part.
ct.
w0[i_simd];
116 double upar = part.
ph.
rho[i_simd]*Bmag[i_simd]*species.
c_m;
117 double energy = 0.5*species.
mass*upar*upar + part.
ct.
mu[i_simd]*Bmag[i_simd];
119 double tmp = (psi[i_simd] - vb.pin)*vb.inv_dp;
121 j = min(vb.m-1,max(0,j));
122 int l = ((int)(floor(theta[i_simd]*vb.inv_dtheta + 0.5)))%vb.mtheta;
126 Kokkos::atomic_add(&(dum(j,l,
Density1)), weight*aa);
127 Kokkos::atomic_add(&(dum(j,l,
Energy)), weight*energy*aa);
128 Kokkos::atomic_add(&(dum(j,l,
VPara)), weight*upar*aa);
129 Kokkos::atomic_add(&(dum(j+1,l,
Density1)), weight*bb);
130 Kokkos::atomic_add(&(dum(j+1,l,
Energy)), weight*energy*bb);
131 Kokkos::atomic_add(&(dum(j+1,l,
VPara)), weight*upar*bb);
134 j = floor((psi[i_simd]-vb.pin)*vb.inv_dp + 0.5);
135 Kokkos::atomic_add(&(dum(j,l,
VPara2)), weight);
136 Kokkos::atomic_add(&(dum(j,l,
Density2)), weight*upar);
143 TIMER(
"COL_SNAP_RED",
144 MPI_Allreduce(MPI_IN_PLACE, dum.data(), dum.size(), MPI_DOUBLE, MPI_SUM,
SML_COMM_WORLD) );
152 Kokkos::parallel_for(
"snapshot_convert", Kokkos::RangePolicy<ExSpace>(0, n), KOKKOS_LAMBDA(
const int idx){
153 int i = idx%vb.mtheta;
154 int j = idx/vb.mtheta;
155 constexpr
double prefac = 2.0/3.0*
J_2_EV;
156 const double vpara_normed = dum(j,i,
VPara)/dum(j,i,
Density1);
157 const double epara = 0.5*species.
mass*(vpara_normed*vpara_normed);
void array_deep_copy(T *array, const Kokkos::View< T *, Kokkos::LayoutRight, Device > &view)
Definition: array_deep_copy.hpp:11
double inpsi
Boundary condition used in a few spots.
Definition: magnetic_field.hpp:25
MPI_Comm SML_COMM_WORLD
Definition: my_mpi.cpp:4
T get(const string ¶m, const T default_val, int val_ind=0)
Definition: NamelistReader.hpp:373
Definition: varying_background.hpp:13
double c_m
c/m
Definition: species.hpp:85
VaryingBackground()
Definition: varying_background.hpp:42
View< double ****, CLayout, Device > bg
Density, Temperature and velocity of each shell for background update.
Definition: varying_background.hpp:36
Definition: varying_background.hpp:18
KOKKOS_INLINE_FUNCTION VecParticles * ptl() const
Definition: species.hpp:588
int m
Definition: varying_background.hpp:30
Definition: varying_background.hpp:14
Definition: varying_background.hpp:22
View< double **, CLayout, Device > vol
Volume.
Definition: varying_background.hpp:35
Definition: NamelistReader.hpp:193
Definition: magnetic_field.hpp:12
KOKKOS_INLINE_FUNCTION bool is_in_range(const MagneticField< DeviceType > &magnetic_field, double r, double z, double psi) const
Definition: varying_background.hpp:66
int a
The index in the inner array of the AoSoA.
Definition: particles.hpp:120
Equilibrium equil
The object containing information about the magnetic equilibrium.
Definition: magnetic_field.hpp:32
Definition: varying_background.hpp:15
KOKKOS_INLINE_FUNCTION void bmag_interpol(const SimdVector &v, Simd< double > &bmag) const
Definition: magnetic_field.tpp:257
int nonadiabatic_idx
Index of species skipping adiabatic species (for compatibility with fortran arrays) ...
Definition: species.hpp:80
int mtheta
Definition: varying_background.hpp:31
KOKKOS_INLINE_FUNCTION void AoSoA_2_simd(SimdParticles &part_one, const VecParticles *part, int a_vec, int s_vec)
Definition: particles.tpp:91
Simd< double > rho
Definition: particles.hpp:21
Definition: varying_background.hpp:24
KOKKOS_INLINE_FUNCTION void get_psi(const SimdVector2D &x, Simd< double > &psi_out) const
Definition: magnetic_field.tpp:82
Definition: varying_background.hpp:16
constexpr double J_2_EV
Conversion rate J to ev.
Definition: constants.hpp:6
double mass
Particle mass.
Definition: species.hpp:82
void for_all_particles(const std::string label, F lambda_func) const
Definition: species.hpp:413
#define TIMER(N, F)
Definition: timer_macro.hpp:24
double outpsi
Boundary condition used in a few spots.
Definition: magnetic_field.hpp:26
idx
Definition: diag_f0_df_port1.hpp:32
void use_namelist(const string &namelist)
Definition: NamelistReader.hpp:355
Simd< double > r
Definition: particles.hpp:18
KOKKOS_INLINE_FUNCTION SimdVector2D & x()
Definition: particles.hpp:27
KOKKOS_INLINE_FUNCTION SimdVector & v()
Definition: particles.hpp:39
KOKKOS_INLINE_FUNCTION void interp_bg_profile(double psi, double theta, int isp, double &den, double &temp, double &up) const
Definition: varying_background.hpp:70
SimdPhase ph
Definition: particles.hpp:59
Definition: varying_background.hpp:17
double pin
Definition: varying_background.hpp:28
void update(const MagneticField< DeviceType > &magnetic_field, Species< DeviceType > &species)
Definition: varying_background.hpp:86
Definition: particles.hpp:58
int period
Period of background updating.
Definition: varying_background.hpp:40
int s
The index in the outer array of the AoSoA.
Definition: particles.hpp:119
#define FORCE_SIMD
Definition: simd.hpp:9
Simd< double > z
Definition: particles.hpp:19
Definition: varying_background.hpp:23
KOKKOS_INLINE_FUNCTION void get_theta(const SimdVector2D &x, Simd< double > &theta) const
Definition: equil.tpp:149
Simd< long long int > gid
Definition: particles.hpp:61
Simd< double > w0
Definition: particles.hpp:53
Definition: magnetic_field.F90:1
SimdConstants ct
Definition: particles.hpp:60
double xpt_z
z coordinate of 1st X-point
Definition: equil.hpp:88
Definition: species.hpp:74
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
double pout
Definition: varying_background.hpp:29
Simd< double > mu
Definition: particles.hpp:52
Definition: varying_background.hpp:10
double inv_dtheta
Definition: varying_background.hpp:33
double * get_col_vb_vol_loc()
Kokkos::ViewAllocateWithoutInitializing NoInit
Definition: space_settings.hpp:68
constexpr double TWOPI
Definition: constants.hpp:9
Definition: particles.hpp:118
KOKKOS_INLINE_FUNCTION bool is_in_region_1_or_2(double r, double z, double psi) const
Definition: equil.tpp:102
Definition: varying_background.hpp:25
double inv_dp
Definition: varying_background.hpp:32
double xpt_psi
Psi coordinate of 1st X-point.
Definition: equil.hpp:84
VaryingBackground(NLReader::NamelistReader &nlr, const MagneticField< DeviceType > &magnetic_field, int n_nonadiabatic_species)
Definition: varying_background.hpp:44