1 #ifndef ELECTRIC_FIELD_HPP
2 #define ELECTRIC_FIELD_HPP
22 extern "C" void set_rho_ff_pointers(
int nrho,
int n,
Field<VarType::Scalar,PhiInterpType::None>* pot0,
Field<VarType::Scalar,PhiInterpType::None>* dpot_n0,
Field<VarType::Scalar,PhiInterpType::None>* dpot,
Field<VarType::Scalar,PhiInterpType::Planes>* dpot_ff,
Field<VarType::Scalar,PhiInterpType::Planes>* pot_rho_ff,
Field<VarType::Vector,PhiInterpType::Planes>* E_rho_ff
24 ,
Field<VarType::Scalar,PhiInterpType::None>* Ah,
Field<VarType::Scalar,PhiInterpType::Planes>* Ah_rho_ff,
Field<VarType::Vector,PhiInterpType::Planes>* dAh_rho_ff,
Field<VarType::Scalar,PhiInterpType::None>* As,
Field<VarType::Scalar,PhiInterpType::None>* As_backup,
Field<VarType::Scalar,PhiInterpType::Planes>* As_rho_ff,
Field<VarType::Vector,PhiInterpType::Planes>* dAs_rho_ff,
Field<VarType::Scalar,PhiInterpType::Planes>* E_para_em_rho_ff,
37 extern "C" void set_pot_fort(
int n,
int npsi00,
double* pot0m,
double* pot00_1d);
40 template<
class Device>
93 View<double*,CLayout, HostType>
pot0m;
117 # if defined(DELTAF_CONV) && !defined(EXPLICIT_EM)
160 bool em_mixed_variable = nlr.
get<
bool>(
"sml_em_mixed_variable",
true);
161 bool em_control_variate = nlr.
get<
bool>(
"sml_em_control_variate",
false);
162 int em_pullback_mode = nlr.
get<
int>(
"sml_em_pullback_mode",3);
164 if (!em_mixed_variable)
165 exit_XGC(
"\nError: sml_em_mixed_variable is explicitly set to .false. which is incompatible with EXPLICIT_EM\n");
176 if (em_control_variate){
181 if (em_mixed_variable){
184 if (em_pullback_mode==4){
191 #ifndef NO_FORTRAN_MODULES
211 const double initial_loop_vol = nlr.
get<
double>(
"src_loop_voltage",0.0);
213 for (
int inode=0; inode<
nnode; inode++){
224 template<PhiInterpType PIT>
252 # if defined(DELTAF_CONV) && !defined(EXPLICIT_EM)
260 int n_input_field_planes =
pot0_h.nphi();
261 bool gradient_requested =
true;
262 bool gyroaverage_requested =
false;
264 GPTLstop(
"GET_POT_GRAD_ALLOC_VIEWS");
269 bool potential_is_requested =
false;
271 pfg.
calculate_phi_ff_on_device(sml,grid, magnetic_field, smoothing, gpg_tmp,
my_subview(
dpot_h.f, 2),
pot0_h, gfpack.template get<Label::E>(), unused_pot, potential_is_requested, use_field00, ignore_poloidal_dpot);
291 GPTLstart(
"Copy_rho_ff_fields_to_device");
300 GPTLstop(
"Copy_rho_ff_fields_to_device");
324 template<PhiInterpType PIT>
330 constexpr
int ZERO_PHI = 0;
332 Kokkos::deep_copy(
my_subview(gfpack.template get<Label::Ah>().f,ZERO_PHI),
Ah_cv.f);
337 template<PhiInterpType PIT>
344 constexpr
int ZERO_GYRO = 0;
345 constexpr
int ZERO_PHI = 0;
348 Ah_tmp(inode) =
Ah(inode,ZERO_GYRO);
351 Kokkos::deep_copy(
my_subview(gfpack.template get<Label::Ah>().f,ZERO_PHI), Ah_tmp.f);
361 template<PhiInterpType PIT>
367 const int PLANE_ZERO=0;
387 int n_input_field_planes = Ah_h.nphi();
388 bool gradient_requested =
false;
389 bool gyroaverage_requested =
true;
392 GPTLstop(
"GET_AH_RHO_FF_ALLOC_VIEWS");
398 FieldArgs gpg_field_args(Ah_h.unmanaged());
399 gpg_field_args.request_potential(
Ah);
400 get_field_grad(sml, grid, pol_decomp, magnetic_field, smoothing, gpg_field_args, tmp);
402 GPTLstop(
"GET_AH_RHO_FF_EXCL_DESTR");
422 int n_input_field_planes = dpot_h.nphi();
423 bool gradient_requested =
true;
424 bool gyroaverage_requested =
true;
426 gyroaverage_requested =
false;
431 GPTLstop(
"GET_POT_GRAD_ALLOC_VIEWS");
439 FieldArgs gpg_field_args(dpot_h.unmanaged(), !(turb_efield));
458 get_field_grad(sml, grid, pol_decomp, magnetic_field, smoothing, gpg_field_args, tmp);
468 gpg_field_args = FieldArgs(Ah_h.unmanaged());
473 get_field_grad(sml, grid, pol_decomp, magnetic_field, smoothing, gpg_field_args, tmp);
479 gpg_field_args = FieldArgs(As_h.unmanaged());
484 get_field_grad(sml, grid, pol_decomp, magnetic_field, smoothing, gpg_field_args, tmp);
491 TIMER(
"GET_POT_APAR_CV",
499 View<double*,CLayout,HostType> Er_B2_h(
"Er_B2_h",grid.
nnode);
500 View<double*,CLayout,HostType> Ez_B2_h(
"Ez_B2_h",grid.
nnode);
501 View<double*,CLayout,HostType> u2_E_h(
"u2_E_h",grid.
nnode);
503 TIMER(
"GET_POT_SONIC",
506 gpg_field_args = FieldArgs(Er_B2_h);
508 get_field_grad(sml, grid, pol_decomp, magnetic_field, smoothing, gpg_field_args, tmp);
510 gpg_field_args = FieldArgs(Ez_B2_h);
512 get_field_grad(sml, grid, pol_decomp, magnetic_field, smoothing, gpg_field_args, tmp);
514 gpg_field_args = FieldArgs(u2_E_h);
516 get_field_grad(sml, grid, pol_decomp, magnetic_field, smoothing, gpg_field_args, tmp);
523 GPTLstop(
"GET_POT_GRAD_EXCL_DESTR");
528 int field_n_rho = nlr.
get<
int>(
"sml_grid_nrho", 6);
531 int n_fields = 3 + 1;
535 double host_field_GB_per_vertex = (53 + 8*grid.
nplanes + 11*(field_n_rho + 1))*8*
BYTES_TO_GB;
536 double cpu_memory_usage = grid.
nnode*host_field_GB_per_vertex;
538 double device_field_GB_per_vertex = std::max(n_fields*8*grid.
nplanes, n_fields*8*(field_n_rho+1))*8*
BYTES_TO_GB;
539 double gpu_memory_usage = grid.
nnode*device_field_GB_per_vertex;
541 MemoryPrediction memory_prediction{
"Collisions", cpu_memory_usage, gpu_memory_usage};
543 return memory_prediction;
GridField< HostType, VarType::Scalar, PhiInterpType::Planes, TorType::OnePlane, KinType::DriftKin > ddpotdt
Time derivative of - Not field-following?
Definition: electric_field.hpp:60
bool decompose_fields
Whether to decompose fields.
Definition: domain_decomposition.hpp:55
GridField< HostType, VarType::Scalar, PIT_GLOBAL, TorType::OnePlane, KinType::GyroKin > pot
Definition: electric_field.hpp:74
Definition: field_following_coordinates.hpp:9
static int GPTLstart(const char *name)
Definition: timer_macro.hpp:9
BiasPotential bias_potential
Definition: electric_field.hpp:102
GridField< HostType, VarType::Scalar, PhiInterpType::None, TorType::OnePlane, KinType::DriftKin > jpara_diff_integral_h
Definition: electric_field.hpp:99
Definition: bias_potential.hpp:7
GridField< Device, VarType::Scalar, PIT, TorType::OnePlane, KinType::DriftKin > loop_voltage
Definition: grid_field_pack.hpp:91
int first_plane
First plane belonging to this rank, including ghost planes.
Definition: field_decomposition.hpp:35
void get_potential_grad(const Simulation< DeviceType > &sml, const Grid< DeviceType > &grid, const DomainDecomposition< DeviceType > &pol_decomp, const MagneticField< DeviceType > &magnetic_field, Smoothing &smoothing, const View< double *, CLayout, HostType > &spitzer_resistivity, Species< DeviceType > &species)
Definition: electric_field.hpp:417
GridField< HostType, vec2d_if_axisym< PIT_GLOBAL >), PIT_GLOBAL, TorType::OnePlane, KinType::GyroKin > dAh
Definition: electric_field.hpp:64
void set_rho_ff_pointers(int nrho, int n, Field< VarType::Scalar, PhiInterpType::None > *pot0, Field< VarType::Scalar, PhiInterpType::None > *dpot_n0, Field< VarType::Scalar, PhiInterpType::None > *dpot, Field< VarType::Scalar, PhiInterpType::Planes > *dpot_ff, Field< VarType::Scalar, PhiInterpType::Planes > *pot_rho_ff, Field< VarType::Vector, PhiInterpType::Planes > *E_rho_ff)
T get(const string ¶m, const T default_val, int val_ind=0)
Definition: NamelistReader.hpp:373
Definition: field.hpp:301
constexpr double BYTES_TO_GB
Definition: constants.hpp:12
GridField< HostType, VarType::Scalar, PhiInterpType::None, TorType::OnePlane, KinType::DriftKin > loop_voltage_h
Definition: electric_field.hpp:97
GridField< HostType, VarType::Scalar, PIT_GLOBAL, TorType::OnePlane, KinType::GyroKin > Ah
Definition: electric_field.hpp:65
Definition: field.hpp:145
bool em_mixed_variable
Switch for use of mixed-variable formulation.
Definition: sml.hpp:77
GridField< HostType, VarType::Vector2D, PIT_GLOBAL, TorType::OnePlane, KinType::DriftKin > E00_ff_h
Radial electric field from in field-following format.
Definition: electric_field.hpp:59
View< double *, CLayout, HostType > dpot_es
Definition: electric_field.hpp:91
GridField< HostType, VarType::Scalar, PhiInterpType::Planes, TorType::OnePlane, KinType::DriftKin > dpot_ff_h
Definition: electric_field.hpp:77
static constexpr bool is_XGCa
Equivalent to the preprocessor flag for now.
Definition: sml.hpp:19
static constexpr bool explicit_electromagnetic
Equivalent to the preprocessor flag for now.
Definition: sml.hpp:37
GridField< HostType, VarType::Scalar, PhiInterpType::None, TorType::MultiplePlanes, KinType::DriftKin > As_h
Definition: electric_field.hpp:66
void copy_to_device_if_not_resident()
Definition: gyro_avg_mat.hpp:50
int plane_index
Offset of local plane.
Definition: domain_decomposition.hpp:52
Definition: globals.hpp:89
Definition: plane_field_gatherer.hpp:9
FieldFollowingCoordinates ff
Definition: get_potential_grad.hpp:75
KOKKOS_INLINE_FUNCTION int find_domain_owner(int global_plane_index, int nplanes_total, int global_node_index, int nnodes_total) const
Definition: field_decomposition.hpp:136
int nrho
Definition: electric_field.hpp:48
void get_Ah_rho_ff(const Simulation< DeviceType > &sml, const Grid< DeviceType > &grid, const DomainDecomposition< DeviceType > &pol_decomp, const MagneticField< DeviceType > &magnetic_field, Smoothing &smoothing, Species< DeviceType > &species)
Definition: electric_field.hpp:382
Definition: NamelistReader.hpp:193
Definition: magnetic_field.hpp:14
static MemoryPrediction estimate_memory_usage(NLReader::NamelistReader &nlr, const Grid< DeviceType > &grid)
Definition: electric_field.hpp:526
Definition: get_potential_grad.hpp:285
int phi_offset
Offset for phi_ff field decomposition.
Definition: grid_field_pack.hpp:57
void cnvt_grid_real2ff(const Grid< DeviceType > &grid, const View< double **, CLayout, DeviceType > &input, const View< double **, Kokkos::LayoutRight, DeviceType > &output) const
Definition: field_following_coordinates.hpp:142
Definition: electric_field.hpp:41
void get_field_grad(const Simulation< DeviceType > &sml, const Grid< DeviceType > &grid, const DomainDecomposition< DeviceType > &pol_decomp, const MagneticField< DeviceType > &magnetic_field, Smoothing &smoothing, GetPotGradFieldArgs< DeviceIn, DeviceOut, VT, PIT, TT, KT > &args, GetPotentialGradTemp< DeviceType, DeviceOut > &tmp)
Definition: get_potential_grad.cpp:395
GridField< HostType, VarType::Scalar, PhiInterpType::None, TorType::OnePlane, KinType::DriftKin > pot0_h
Definition: electric_field.hpp:86
int nplanes
Number of planes.
Definition: grid.hpp:157
GridFieldPack< Device, PIT > copy_Ah_ff_to_device(KinType kintype_in, const DomainDecomposition< DeviceType > &pol_decomp, const Grid< DeviceType > &grid) const
Definition: electric_field.hpp:338
static constexpr bool reduced_deltaf
Equivalent to the preprocessor flag for now.
Definition: sml.hpp:25
Definition: grid_field_pack.hpp:21
int node_offset
Offset of first mesh node belonging to this MPI rank.
Definition: domain_decomposition.hpp:59
GridFieldPack< Device, PIT > copy_push_fields_to_device(KinType kintype_in, const Simulation< DeviceType > &sml, const DomainDecomposition< DeviceType > &pol_decomp, const MagneticField< DeviceType > &magnetic_field, const Grid< DeviceType > &grid, Smoothing &smoothing, bool near_field=false) const
Definition: electric_field.hpp:225
Kokkos::LayoutRight CLayout
Definition: space_settings.hpp:67
GradientMatrices< DeviceType > grad_matrices
Definition: get_potential_grad.hpp:74
Projection< HostType > half_plane_ff
Definition: grid.hpp:176
void deallocate_device_matrices_if_not_resident()
Definition: gyro_avg_mat.hpp:56
ElectricField(NLReader::NamelistReader &nlr, const Grid< DeviceType > &grid, int nrho_in, double dt=1.0, double psi_norm=1.0)
Definition: electric_field.hpp:109
View< double ***, CLayout, HostType > save_dpot
Definition: electric_field.hpp:89
void request_para_em(const GridField< DeviceOut, VarType::Scalar, PhiInterpType::Planes, TorType::OnePlane, KinType::GyroKin > &output_field, double em_pullback_dampfac_in, const View< double *, CLayout, HostType > &spitzer_resistivity, bool gyroaverage_requested)
Definition: get_potential_grad.hpp:321
void set_pot_fort(int n, int npsi00, double *pot0m, double *pot00_1d)
int em_pullback_mode
Definition: sml.hpp:79
bool grad_psitheta
Definition: sml.hpp:100
GridField< HostType, VarType::Scalar, PhiInterpType::Planes, TorType::OnePlane, KinType::DriftKin > Ah_cv
Definition: electric_field.hpp:71
ElectricField()
Definition: electric_field.hpp:105
#define TIMER(N, F)
Definition: timer_macro.hpp:24
GridField< HostType, VarType::Scalar, PhiInterpType::None, TorType::MultiplePlanes, KinType::DriftKin > Ah_cv_h
Definition: electric_field.hpp:70
void use_namelist(const string &namelist)
Definition: NamelistReader.hpp:355
constexpr PhiInterpType PIT_GLOBAL
Definition: globals.hpp:103
GridField< HostType, VarType::Scalar, PhiInterpType::None, TorType::MultiplePlanes, KinType::DriftKin > As_h_backup
Definition: electric_field.hpp:67
Definition: memory_prediction.hpp:4
void grid_field_copy(T &dest, const T &src)
Definition: grid_field.hpp:452
Definition: smoothing.hpp:8
GridField< HostType, VarType::Vector2D, PIT_GLOBAL, TorType::OnePlane, KinType::GyroKin > dEz_B2
Gradient of Ez/B^2.
Definition: electric_field.hpp:81
void gather_phi_ff_on_device(View< FT **, CLayout, HostType > &tmp, View< FT *, CLayout, HostType > &tmp_full, const T_h &rho_ff_h, View< FT **, CLayout, DeviceType > &phi_ff)
Definition: plane_field_gatherer.hpp:197
Field00< DeviceType > field00
Definition: get_potential_grad.hpp:292
Definition: globals.hpp:90
GridField< HostType, vec2d_if_axisym< PIT_GLOBAL >), PIT_GLOBAL, TorType::OnePlane, KinType::GyroKin > dAs
Definition: electric_field.hpp:68
void request_potential(const GridField< DeviceOut, VarType::Scalar, PIT, TT, KT > &potential_in)
Definition: get_potential_grad.hpp:311
GridField< HostType, VarType::Scalar, PhiInterpType::None, TorType::MultiplePlanes, KinType::DriftKin > Ah_h
Definition: electric_field.hpp:63
bool E00_efield
Flux-surface averaged potential not used for calculating the electric field if .false.
Definition: electric_field.hpp:55
GridField< HostType, VarType::Vector2D, PIT_GLOBAL, TorType::OnePlane, KinType::GyroKin > dEr_B2
Gradient of Er/B^2.
Definition: electric_field.hpp:80
View< double *, CLayout, HostType > pot00_1d
1D flux-surface averaged potential
Definition: electric_field.hpp:94
int node_offset
Offset for phi_ff field decomposition.
Definition: grid_field_pack.hpp:58
GridField< HostType, VarType::Vector2D, PIT_GLOBAL, TorType::OnePlane, KinType::GyroKin > du2_E
Gradient of the square (dot product) of the E x B drift.
Definition: electric_field.hpp:82
KinType
Definition: globals.hpp:88
GridField< HostType, VarType::Scalar, PhiInterpType::None, TorType::OnePlane, KinType::DriftKin > jpara_diff_previous_h
Definition: electric_field.hpp:98
View< int *, CLayout, HostType > all_first_plane
First plane of each rank.
Definition: field_decomposition.hpp:43
bool namelist_present(const string &namelist)
Definition: NamelistReader.hpp:351
bool electron_on
Use kinetic electrons.
Definition: sml.hpp:63
GridField< HostType, VarType::Scalar, PhiInterpType::Planes, TorType::OnePlane, KinType::GyroKin > Epar_em
Definition: electric_field.hpp:72
GridField< Device, VarType::Scalar, PIT, TorType::OnePlane, KinType::DriftKin > dpot_ff
Definition: grid_field_pack.hpp:79
void get_sonic_fields(const Grid< DeviceType > &grid, const GridField< HostType, vec2d_if_axisym< PIT_GLOBAL >(), PIT_GLOBAL, TorType::OnePlane, KinType::GyroKin > &E, View< double *, CLayout, HostType > &Er_B2_h, View< double *, CLayout, HostType > &Ez_B2_h, View< double *, CLayout, HostType > &u2_E_h)
bool calculate_phi_ff_on_device
Definition: electric_field.hpp:51
void exit_XGC(std::string msg)
Definition: globals.hpp:37
UniformRange psi00
Definition: grid.hpp:166
Kokkos::View< T *, Kokkos::LayoutRight, Device > my_subview(const Kokkos::View< T ****, Kokkos::LayoutRight, Device > &view, int i, int j, int k)
Definition: my_subview.hpp:8
Definition: magnetic_field.F90:1
bool turb_efield
E-field calculated only with if .false., psndpot will still contain all (n=0,|m|>0) and (|n|>0...
Definition: electric_field.hpp:54
Kokkos::Device< ExSpace, MemSpace > DeviceType
Definition: space_settings.hpp:47
View< double *, CLayout, HostType > pot0m
n=0 component of the electrostatic potential before smoothing
Definition: electric_field.hpp:93
View< double ***, CLayout, HostType > save_dpot0
Definition: electric_field.hpp:88
int nphi
Definition: electric_field.hpp:45
GridField< HostType, VarType::Scalar, PIT_GLOBAL, TorType::OnePlane, KinType::GyroKin > As
Definition: electric_field.hpp:69
int nnode
Definition: electric_field.hpp:44
FieldDecomposition< Device > field_decomp
Definition: domain_decomposition.hpp:56
Definition: species.hpp:75
void request_gradient(const GridField< DeviceOut, VT, PIT, TT, KT > &gradient_in)
Definition: get_potential_grad.hpp:316
void get_field_Ah_cv_ff(const Grid< DeviceType > &grid, const DomainDecomposition< DeviceType > &pol_decomp, const GridField< HostType, VarType::Scalar, PhiInterpType::None, TorType::MultiplePlanes, KinType::DriftKin > &Ah_cv_h, const GridField< HostType, VarType::Scalar, PhiInterpType::Planes, TorType::OnePlane, KinType::DriftKin > &Ah_cv_ff)
Definition: get_potential_grad.cpp:7
GridFieldPack< Device, PIT > copy_dpot_to_device(KinType kintype_in) const
Definition: electric_field.hpp:362
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
GridFieldPack< Device, PIT > copy_Ah_cv_to_device_as_Ah(KinType kintype_in, const DomainDecomposition< DeviceType > &pol_decomp, const Grid< DeviceType > &grid) const
Definition: electric_field.hpp:325
void calculate_gradient(const Grid< DeviceType > &grid, const GradientMatrices< DeviceType > &grad_matrices)
Definition: get_potential_grad.hpp:153
GyroAverageMatrices< Device > gyro_avg_matrices
Definition: species.hpp:146
GridField< HostType, VarType::Scalar, PhiInterpType::None, TorType::MultiplePlanes, KinType::DriftKin > dpot_h
Definition: electric_field.hpp:85
int nnode
Number of grid nodes.
Definition: grid.hpp:156
double em_pullback_dampfac
Damping term gamma on -b.grad(phi) in pullback mode 4.
Definition: sml.hpp:85
GridField< HostType, VarType::Scalar, PhiInterpType::None, TorType::OnePlane, KinType::DriftKin > dpot_n0_h
Definition: electric_field.hpp:87
bool n0_m_efield
Definition: electric_field.hpp:56
View< int *, CLayout, HostType > all_first_node
First node of each rank.
Definition: field_decomposition.hpp:41
bool em_control_variate
Switch for use of control variate method.
Definition: sml.hpp:78
int first_node
First mesh node belonging to this rank, including ghost nodes.
Definition: field_decomposition.hpp:32
GridField< HostType, vec2d_if_axisym< PIT_GLOBAL >), PIT_GLOBAL, TorType::OnePlane, KinType::GyroKin > E
Definition: electric_field.hpp:75
void set_field(const Grid< DeviceType > &grid, const FieldFollowingCoordinates &ff, View< Field< VarType::Vector2D, PIT > *, CLayout, DeviceOut > &field00_ff_h)
Definition: get_potential_grad.hpp:169
View< double ***, CLayout, HostType > dpotsave
Definition: electric_field.hpp:90
Definition: field.hpp:234
void calculate_phi_ff_on_device(const Simulation< DeviceType > &sml, const Grid< DeviceType > &grid, const MagneticField< DeviceType > &magnetic_field, Smoothing &smoothing, GetPotentialGradTemp< DeviceType, DeviceType > &tmp, const View< Field< VarType::Scalar, PhiInterpType::None > *, CLayout, HostType > &dpot_h, const GT0 &pot0_h, GT &phi_ff, GT2 &pot_phi_ff, bool potential_is_requested=true, bool use_field00=false, bool ignore_poloidal_dpot=false)
Definition: plane_field_gatherer.hpp:117
static int GPTLstop(const char *name)
Definition: timer_macro.hpp:10
Definition: get_potential_grad.hpp:53