XGC1
loop_voltage.hpp
Go to the documentation of this file.
1 #ifndef LOOP_VOLTAGE_HPP
2 #define LOOP_VOLTAGE_HPP
3 
4 #include "grid.hpp"
5 #include "globals.hpp"
6 
7 
20 template<class Device,typename GFPT>
21 KOKKOS_INLINE_FUNCTION void add_loop_voltage(const Grid<Device>& grid, const MagneticField<Device>& magnetic_field, const GridFieldPack<Device,GFPT>& gfpack, const Species<Device>& species, const SimdParticles& part, const Simd<double>& B_mag, const Simd<double>& psi, SimdVector& efield, SimdGridWeights<Order::One, PIT_GLOBAL>& grid_wts, double psimax){
22 
24 
25 //#ifdef XGC1
26 // // Must use non-field-following coordinates
27 // SimdGridWeights<Order::One, PhiInterpType::None> grid_wts_no_ff;
28 // grid.get_grid_weights(magnetic_field, part.ph.v(), grid_wts_no_ff);
29 // gfpack.loop_voltage.gather(grid,grid_wts_no_ff,loop_voltage)
30 //#else
31  gfpack.loop_voltage.gather(grid,grid_wts,part.ph.phi,loop_voltage);
32 //#endif
33 
34  for (int i_simd = 0; i_simd<SIMD_SIZE; i_simd++){
35  double cmrhoB = species.c_m*part.ph.rho[i_simd]*B_mag[i_simd];
36  double f0_T_ev = species.eq_temp.value(magnetic_field, psi[i_simd],part.ph.r[i_simd],part.ph.z[i_simd]);
37 
38  // Add loop voltage if particle is within specified psi range and isn't beyond the energy threshold
39  constexpr double LOOP_VOLTAGE_HIGH_E_LIMIT_FACTOR = 16.0;
40  bool loop_voltage_on = (psi[i_simd]<psimax) &&
41  (magnetic_field.is_in_region_1_or_2(part.ph.r[i_simd],part.ph.z[i_simd],psi[i_simd])) &&
42  ((part.ct.mu[i_simd]*2.0*B_mag[i_simd] + cmrhoB*cmrhoB*species.mass)*J_2_EV<(LOOP_VOLTAGE_HIGH_E_LIMIT_FACTOR*f0_T_ev));
43  if(loop_voltage_on) efield.phi[i_simd] += loop_voltage[i_simd]/(TWOPI*part.ph.r[i_simd]);
44  }
45 }
46 
47 #endif
Definition: grid.hpp:21
Definition: magnetic_field.hpp:12
Definition: species.hpp:75
double c_m
c/m
Definition: species.hpp:86
double mass
Particle mass.
Definition: species.hpp:83
Eq::Profile< Device > eq_temp
Definition: species.hpp:136
constexpr double J_2_EV
Conversion rate J to ev.
Definition: constants.hpp:6
constexpr double TWOPI
Definition: constants.hpp:10
@ loop_voltage
KOKKOS_INLINE_FUNCTION void add_loop_voltage(const Grid< Device > &grid, const MagneticField< Device > &magnetic_field, const GridFieldPack< Device, GFPT > &gfpack, const Species< Device > &species, const SimdParticles &part, const Simd< double > &B_mag, const Simd< double > &psi, SimdVector &efield, SimdGridWeights< Order::One, PIT_GLOBAL > &grid_wts, double psimax)
Definition: loop_voltage.hpp:21
Definition: magnetic_field.F90:1
Definition: grid_field_pack.hpp:24
GridField< Device, VarType::Scalar, PIT_GLOBAL, TorType::OnePlane, KinType::DriftKin > loop_voltage
Definition: grid_field_pack.hpp:49
Simd< double > mu
m*v_perp^2/(2B)
Definition: particles.hpp:52
Definition: grid_weights.hpp:47
Definition: particles.hpp:61
SimdPhase ph
Definition: particles.hpp:62
SimdConstants ct
Definition: particles.hpp:63
Simd< double > rho
m*v_para/(q*B) - A_para^h/B (should it be plus or minus?)
Definition: particles.hpp:21
Simd< double > z
Cylindrical coordinate Z.
Definition: particles.hpp:19
Simd< double > r
Cylindrical coordinate R (major radial direction)
Definition: particles.hpp:18
Simd< double > phi
Cylindrical coordinate phi (toroidal direction)
Definition: particles.hpp:20
Definition: simd.hpp:149
Simd< double > phi
Definition: simd.hpp:152