XGCa
perturbed_B_field.hpp
Go to the documentation of this file.
1 #ifndef PTB_3DB_HPP
2 #define PTB_3DB_HPP
3 #include "NamelistReader.hpp"
4 #include "grid.hpp"
5 #include "grid_field.hpp"
6 #include "smoothing.hpp"
7 
9 
10 // Perturbed magnetic field class
11 template<class Device>
13  public:
14 
15  // Field variables
16  bool rampup_vac;
17  int num_ntor;
19  int start_time;
20  int mode;
21  bool full_spec_on;
22 
23  double rampup_fac;
24  double rampup_fac0;
25 
26  // RMP penetration calculation
27  int dasdt_opt;
28  int mstep_es;
29  int mstep_em;
31 
32  bool active;
33 
34  // Field arrays
35  View<int*,CLayout,Device> ntor;
36  View<Field<VarType::Vector,PhiInterpType::None>**,CLayout,Device> bfield_im_vac;
37  View<Field<VarType::Vector,PhiInterpType::None>**,CLayout,Device> bfield_re_vac;
38 
39  private:
40  View<double**,CLayout,HostType> jpar0; // Backup of total parallel current for sliding time average
41  View<double***,CLayout,HostType> cden0; // Backup of total charge for sliding time average
42  View<double**,CLayout,HostType> As_vac; // Vacuum RMP field
43  View<double***,CLayout,HostType> Ah_rmp; // Backup of Ah for RMP penetration; used to approximate dAs/dt
44 
45  public:
46 
47  // Constructor
48  PerturbedBField(NLReader::NamelistReader& nlr, const DomainDecomposition<DeviceType>& pol_decomp, const MagneticField<DeviceType>& magnetic_field, const Grid<DeviceType>& grid, const Smoothing& smoothing, bool explicit_em);
49 
50  // Null constructor if ptb_3db is off
52  : mode(0), active(false) {}
53 
54  void initialize(NLReader::NamelistReader& nlr, const DomainDecomposition<DeviceType>& pol_decomp, const MagneticField<DeviceType>& magnetic_field, const Grid<DeviceType>& grid, const Smoothing& smoothing, bool explicit_em);
55 
56  void read_3db_xgc_mesh(const std::string& input_dir, const std::string& filename, const Grid<DeviceType>& grid);
57 
59 #ifndef NO_FORTRAN_MODULES
63 
66 #endif
67  }
68 
69  void copy_to_device_if_on(int gstep){
70  if(is_triggered(gstep)){
72  active = true;
73  }else{
74  active = false;
75  }
76  }
77 
79  void replace_B_grad_phi(const View<double**,CLayout,HostType>& view, int gstep, double dt) const;
80  void ramp_up_As(int ipc, int gstep, double dt, double dt_full, const View<double*,CLayout,HostType>& As_local);
81  void update_rampup_and_write(bool explicit_electromagnetic, int gstep, double time);
83  void subtract_As_vac_fac(const View<double*,CLayout,HostType>& rhs2) const;
84 
85  void save_rhs_poisson(int iflag, int ipc, bool em_es_step, const View<double*,CLayout,HostType>& rhs) const;
87 
88  void write_checkpoint_files(const Grid<DeviceType>& grid, const DomainDecomposition<DeviceType>& pol_decomp, const XGC_IO_Stream& stream) const;
89  void read_checkpoint_files(const Grid<DeviceType>& grid, const DomainDecomposition<DeviceType>& pol_decomp, const XGC_IO_Stream& stream, const XGC_IO_Stream& em_stream);
90 
91  KOKKOS_INLINE_FUNCTION bool is_triggered(int gstep) const;
92  KOKKOS_INLINE_FUNCTION bool rampup_is_triggered(int gstep) const;
93 
94  // Get perturbed b-field
95  template<Order OT>
96  KOKKOS_INLINE_FUNCTION void get_delta_b(const Grid<Device> &grid, const Simd<double>& phi, const SimdGridWeights<OT, PhiInterpType::None>& grid_wts, SimdVector &tdb) const;
97 
98 };
99 
100 #include "perturbed_B_field.tpp"
101 #endif
void array_deep_copy(T *array, const Kokkos::View< T *, Kokkos::LayoutRight, Device > &view)
Definition: array_deep_copy.hpp:11
Definition: magnetic_field.hpp:12
Definition: NamelistReader.hpp:193
Definition: perturbed_B_field.hpp:12
View< Field< VarType::Vector, PhiInterpType::None > **, CLayout, Device > bfield_im_vac
perturbed vacuum field on XGC mesh, imaginary part
Definition: perturbed_B_field.hpp:36
bool full_spec_on
whether to retain the full RMP spectrum from M3D-C1 or only |m/q-n|<=sml_mode_select_mres_q ; Always ...
Definition: perturbed_B_field.hpp:21
View< double ***, CLayout, HostType > cden0
Definition: perturbed_B_field.hpp:41
View< double ***, CLayout, HostType > Ah_rmp
Definition: perturbed_B_field.hpp:43
int mode
Mode of RMP operation (details in XGC_core/module_ptb_3db.F90 --> ptb_3db_mode)
Definition: perturbed_B_field.hpp:20
void write_checkpoint_files(const Grid< DeviceType > &grid, const DomainDecomposition< DeviceType > &pol_decomp, const XGC_IO_Stream &stream) const
void copy_to_device_if_on(int gstep)
Definition: perturbed_B_field.hpp:69
void save_rhs_ampere(const Simulation< DeviceType > &sml, const MagneticField< DeviceType > &magnetic_field, const Grid< DeviceType > &grid, const DomainDecomposition< DeviceType > &pol_decomp, Plasma &plasma, const GridField< HostType, VarType::Scalar, PhiInterpType::None, TorType::MultiplePlanes, KinType::DriftKin > &dpot_h, const View< double *, CLayout, HostType > &rhs, int ipc) const
bool active
Whether the field is in device memory and should be used in the push etc. Could be renamed for clarit...
Definition: perturbed_B_field.hpp:32
bool rampup_vac
(.true.) Ramp up perturbed field slowly, (.false.) turn on perturbed field abruptly
Definition: perturbed_B_field.hpp:16
int dasdt_opt
Selector for how to compute dAs/dt for RMP penetration.
Definition: perturbed_B_field.hpp:27
PerturbedBField(NLReader::NamelistReader &nlr, const DomainDecomposition< DeviceType > &pol_decomp, const MagneticField< DeviceType > &magnetic_field, const Grid< DeviceType > &grid, const Smoothing &smoothing, bool explicit_em)
void save_Ah(const GridField< HostType, VarType::Scalar, PhiInterpType::None, TorType::MultiplePlanes, KinType::DriftKin > &Ah) const
void ramp_up_As(int ipc, int gstep, double dt, double dt_full, const View< double *, CLayout, HostType > &As_local)
double rampup_fac
The current relative amplitude of the vacuum vector potential (if ptb_3db_mode==2) - this is updated ...
Definition: perturbed_B_field.hpp:23
View< Field< VarType::Vector, PhiInterpType::None > **, CLayout, Device > bfield_re_vac
perturbed vacuum field on XGC mesh, real part, dimensions: (grid vertex, R-Z-phi components,...
Definition: perturbed_B_field.hpp:37
PerturbedBField()
Definition: perturbed_B_field.hpp:51
int num_ntor
Number of toroidal mode numbers (<= sml_nphi_total)
Definition: perturbed_B_field.hpp:17
void read_checkpoint_files(const Grid< DeviceType > &grid, const DomainDecomposition< DeviceType > &pol_decomp, const XGC_IO_Stream &stream, const XGC_IO_Stream &em_stream)
void subtract_As_vac_fac(const View< double *, CLayout, HostType > &rhs2) const
void read_3db_xgc_mesh(const std::string &input_dir, const std::string &filename, const Grid< DeviceType > &grid)
void save_rhs_poisson(int iflag, int ipc, bool em_es_step, const View< double *, CLayout, HostType > &rhs) const
int es_to_em_dt_ratio
Ratio of EM to ES time step size in RMP penetration calculation.
Definition: perturbed_B_field.hpp:30
int start_time
Time step in which perturbed field is switched on.
Definition: perturbed_B_field.hpp:19
View< double **, CLayout, HostType > As_vac
Definition: perturbed_B_field.hpp:42
double rampup_fac0
The previous (backup) relative amplitude of the vacuum vector potential (if ptb_3db_mode==2)
Definition: perturbed_B_field.hpp:24
void update_rampup_and_write(bool explicit_electromagnetic, int gstep, double time)
KOKKOS_INLINE_FUNCTION bool is_triggered(int gstep) const
Definition: perturbed_B_field.tpp:6
KOKKOS_INLINE_FUNCTION bool rampup_is_triggered(int gstep) const
Definition: perturbed_B_field.tpp:11
View< int *, CLayout, Device > ntor
Array to store the toroidal mode numbers.
Definition: perturbed_B_field.hpp:35
void replace_B_grad_phi(const View< double **, CLayout, HostType > &view, int gstep, double dt) const
View< double **, CLayout, HostType > jpar0
Definition: perturbed_B_field.hpp:40
KOKKOS_INLINE_FUNCTION void get_delta_b(const Grid< Device > &grid, const Simd< double > &phi, const SimdGridWeights< OT, PhiInterpType::None > &grid_wts, SimdVector &tdb) const
Definition: perturbed_B_field.tpp:22
void initialize(NLReader::NamelistReader &nlr, const DomainDecomposition< DeviceType > &pol_decomp, const MagneticField< DeviceType > &magnetic_field, const Grid< DeviceType > &grid, const Smoothing &smoothing, bool explicit_em)
int rampup_time
Number of time steps over which the perturbed field is ramped up.
Definition: perturbed_B_field.hpp:18
int mstep_es
Definition: perturbed_B_field.hpp:28
void copy_bfield_from_fortran() const
Definition: perturbed_B_field.hpp:58
void set_to_As_vac(const GridField< HostType, VarType::Scalar, PhiInterpType::None, TorType::MultiplePlanes, KinType::DriftKin > &As) const
int mstep_em
Definition: perturbed_B_field.hpp:29
Definition: plasma.hpp:13
Definition: sml.hpp:9
Definition: xgc_io.hpp:24
real(8), parameter phi
Definition: load_balance_constraint_mod.F90:18
Definition: magnetic_field.F90:1
real(kind=8), dimension(:,:,:), allocatable, target ptb_3db_bfield_im_vac
perturbed vacuum field on XGC mesh, imaginary part
Definition: module_ptb_3db.F90:57
real(kind=8), dimension(:,:,:), allocatable, target ptb_3db_bfield_re_vac
perturbed vacuum field on XGC mesh, real part, dimensions: (grid vertex, R-Z-phi components,...
Definition: module_ptb_3db.F90:55
logical false
Definition: module.F90:102
subroutine plasma(grid, itr, p, dene_out, deni_out, Te_out, Ti_out, Vparai_out, ignore_vacuum)
Calculate the plasma density, temperature, and parallel velocity for a point in triangle itr using pl...
Definition: neutral_totalf.F90:1548
void get_ptb_3db_arrays(Field< VarType::Vector, PhiInterpType::None > **ptb_3db_bfield_re_vac, Field< VarType::Vector, PhiInterpType::None > **ptb_3db_bfield_im_vac)
Kokkos::LayoutRight CLayout
Definition: space_settings.hpp:68
Definition: grid_weights.hpp:47
Definition: simd.hpp:149
Definition: smoothing.hpp:10