WarpX
Ionization.H
Go to the documentation of this file.
1 /* Copyright 2019-2020 Andrew Myers, Axel Huebl,
2  * Maxence Thevenet
3  *
4  * This file is part of WarpX.
5  *
6  * License: BSD-3-Clause-LBNL
7  */
8 #ifndef IONIZATION_H_
9 #define IONIZATION_H_
10 
15 #include "Utils/WarpXConst.H"
16 
17 #include <AMReX_Array.H>
18 #include <AMReX_Array4.H>
19 #include <AMReX_Dim3.H>
20 #include <AMReX_Extension.H>
21 #include <AMReX_GpuQualifiers.H>
22 #include <AMReX_IndexType.H>
23 #include <AMReX_REAL.H>
24 #include <AMReX_Random.H>
25 
26 #include <AMReX_BaseFwd.H>
27 
28 #include <cmath>
29 
31 {
33  const amrex::Real* AMREX_RESTRICT m_adk_prefactor;
34  const amrex::Real* AMREX_RESTRICT m_adk_exp_prefactor;
35  const amrex::Real* AMREX_RESTRICT m_adk_power;
36 
37  int comp;
39 
42  amrex::ParticleReal m_Ex_external_particle;
43  amrex::ParticleReal m_Ey_external_particle;
44  amrex::ParticleReal m_Ez_external_particle;
45  amrex::ParticleReal m_Bx_external_particle;
46  amrex::ParticleReal m_By_external_particle;
47  amrex::ParticleReal m_Bz_external_particle;
48 
55 
62 
65 
67  int m_nox;
69 
71 
72  IonizationFilterFunc (const WarpXParIter& a_pti, int lev, amrex::IntVect ngEB,
73  amrex::FArrayBox const& exfab,
74  amrex::FArrayBox const& eyfab,
75  amrex::FArrayBox const& ezfab,
76  amrex::FArrayBox const& bxfab,
77  amrex::FArrayBox const& byfab,
78  amrex::FArrayBox const& bzfab,
79  amrex::Vector<amrex::ParticleReal>& E_external_particle,
80  amrex::Vector<amrex::ParticleReal>& B_external_particle,
81  const amrex::Real* AMREX_RESTRICT a_ionization_energies,
82  const amrex::Real* AMREX_RESTRICT a_adk_prefactor,
83  const amrex::Real* AMREX_RESTRICT a_adk_exp_prefactor,
84  const amrex::Real* AMREX_RESTRICT a_adk_power,
85  int a_comp,
86  int a_atomic_number,
87  int a_offset = 0) noexcept;
88 
89  template <typename PData>
90  AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
91  bool operator() (const PData& ptd, int i, amrex::RandomEngine const& engine) const noexcept
92  {
93  using namespace amrex::literals;
94 
95  const int ion_lev = ptd.m_runtime_idata[comp][i];
96  if (ion_lev < m_atomic_number)
97  {
98  constexpr amrex::Real c = PhysConst::c;
99  constexpr amrex::Real c2_inv = amrex::Real(1.)/c/c;
100 
101  // gather E and B
102  amrex::ParticleReal xp, yp, zp;
103  m_get_position(i, xp, yp, zp);
104 
105  amrex::ParticleReal ex = m_Ex_external_particle;
106  amrex::ParticleReal ey = m_Ey_external_particle;
107  amrex::ParticleReal ez = m_Ez_external_particle;
108  amrex::ParticleReal bx = m_Bx_external_particle;
109  amrex::ParticleReal by = m_By_external_particle;
110  amrex::ParticleReal bz = m_Bz_external_particle;
111  m_get_externalEB(i, ex, ey, ez, bx, by, bz);
112 
113  doGatherShapeN(xp, yp, zp, ex, ey, ez, bx, by, bz,
118  m_get_externalEB(i, ex, ey, ez, bx, by, bz);
119 
120  // Compute electric field amplitude in the particle's frame of
121  // reference (particularly important when in boosted frame).
122  const amrex::ParticleReal ux = ptd.m_rdata[PIdx::ux][i];
123  const amrex::ParticleReal uy = ptd.m_rdata[PIdx::uy][i];
124  const amrex::ParticleReal uz = ptd.m_rdata[PIdx::uz][i];
125 
126  const auto ga = static_cast<amrex::Real>(
127  std::sqrt(1. + (ux*ux + uy*uy + uz*uz) * c2_inv));
128  const amrex::Real E = std::sqrt(
129  - ( ux*ex + uy*ey + uz*ez ) * ( ux*ex + uy*ey + uz*ez ) * c2_inv
130  + ( ga *ex + uy*bz - uz*by ) * ( ga *ex + uy*bz - uz*by )
131  + ( ga *ey + uz*bx - ux*bz ) * ( ga *ey + uz*bx - ux*bz )
132  + ( ga *ez + ux*by - uy*bx ) * ( ga *ez + ux*by - uy*bx )
133  );
134 
135  // Compute probability of ionization p
136  const amrex::Real w_dtau = (E <= 0._rt) ? 0._rt : 1._rt/ ga * m_adk_prefactor[ion_lev] *
137  std::pow(E, m_adk_power[ion_lev]) *
138  std::exp( m_adk_exp_prefactor[ion_lev]/E );
139  const amrex::Real p = 1._rt - std::exp( - w_dtau );
140 
141  const amrex::Real random_draw = amrex::Random(engine);
142  if (random_draw < p)
143  {
144  return true;
145  }
146  }
147  return false;
148  }
149 };
150 
152 {
153  template <typename DstData, typename SrcData>
155  void operator() (DstData& /*dst*/, SrcData& src,
156  int i_src, int /*i_dst*/,
157  amrex::RandomEngine const& /*engine*/) const noexcept
158  {
159  src.m_runtime_idata[0][i_src] += 1;
160  }
161 };
162 
163 #endif
#define AMREX_FORCE_INLINE
#define AMREX_RESTRICT
#define AMREX_GPU_HOST_DEVICE
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void doGatherShapeN(const amrex::ParticleReal xp, const amrex::ParticleReal yp, const amrex::ParticleReal zp, amrex::ParticleReal &Exp, amrex::ParticleReal &Eyp, amrex::ParticleReal &Ezp, amrex::ParticleReal &Bxp, amrex::ParticleReal &Byp, amrex::ParticleReal &Bzp, amrex::Array4< amrex::Real const > const &ex_arr, amrex::Array4< amrex::Real const > const &ey_arr, amrex::Array4< amrex::Real const > const &ez_arr, amrex::Array4< amrex::Real const > const &bx_arr, amrex::Array4< amrex::Real const > const &by_arr, amrex::Array4< amrex::Real const > const &bz_arr, const amrex::IndexType ex_type, const amrex::IndexType ey_type, const amrex::IndexType ez_type, const amrex::IndexType bx_type, const amrex::IndexType by_type, const amrex::IndexType bz_type, const amrex::GpuArray< amrex::Real, 3 > &dx, const amrex::GpuArray< amrex::Real, 3 > &xyzmin, const amrex::Dim3 &lo, const int n_rz_azimuthal_modes)
Field gather for a single particle.
Definition: FieldGather.H:38
Definition: WarpXParticleContainer.H:53
static constexpr auto c
vacuum speed of light [m/s]
Definition: constant.H:44
Real Random()
i
Definition: check_interp_points_and_weights.py:174
Functor class that assigns external field values (E and B) to particles.
Definition: GetExternalFields.H:25
Definition: Ionization.H:31
amrex::ParticleReal m_Ez_external_particle
Definition: Ionization.H:44
amrex::IndexType m_by_type
Definition: Ionization.H:60
amrex::IndexType m_bx_type
Definition: Ionization.H:59
int comp
Definition: Ionization.H:37
amrex::GpuArray< amrex::Real, 3 > m_dx_arr
Definition: Ionization.H:63
amrex::ParticleReal m_Bx_external_particle
Definition: Ionization.H:45
amrex::Array4< const amrex::Real > m_ey_arr
Definition: Ionization.H:50
bool m_galerkin_interpolation
Definition: Ionization.H:66
amrex::Array4< const amrex::Real > m_by_arr
Definition: Ionization.H:53
amrex::ParticleReal m_Ex_external_particle
Definition: Ionization.H:42
amrex::ParticleReal m_Bz_external_particle
Definition: Ionization.H:47
amrex::Array4< const amrex::Real > m_bx_arr
Definition: Ionization.H:52
amrex::Dim3 m_lo
Definition: Ionization.H:70
const amrex::Real *AMREX_RESTRICT m_adk_exp_prefactor
Definition: Ionization.H:34
const amrex::Real *AMREX_RESTRICT m_adk_power
Definition: Ionization.H:35
amrex::Array4< const amrex::Real > m_ex_arr
Definition: Ionization.H:49
amrex::IndexType m_ez_type
Definition: Ionization.H:58
const amrex::Real *AMREX_RESTRICT m_adk_prefactor
Definition: Ionization.H:33
amrex::IndexType m_bz_type
Definition: Ionization.H:61
GetExternalEBField m_get_externalEB
Definition: Ionization.H:41
const amrex::Real *AMREX_RESTRICT m_ionization_energies
Definition: Ionization.H:32
int m_nox
Definition: Ionization.H:67
amrex::Array4< const amrex::Real > m_ez_arr
Definition: Ionization.H:51
amrex::IndexType m_ey_type
Definition: Ionization.H:57
int m_n_rz_azimuthal_modes
Definition: Ionization.H:68
GetParticlePosition< PIdx > m_get_position
Definition: Ionization.H:40
amrex::IndexType m_ex_type
Definition: Ionization.H:56
amrex::ParticleReal m_By_external_particle
Definition: Ionization.H:46
IonizationFilterFunc(const WarpXParIter &a_pti, int lev, amrex::IntVect ngEB, amrex::FArrayBox const &exfab, amrex::FArrayBox const &eyfab, amrex::FArrayBox const &ezfab, amrex::FArrayBox const &bxfab, amrex::FArrayBox const &byfab, amrex::FArrayBox const &bzfab, amrex::Vector< amrex::ParticleReal > &E_external_particle, amrex::Vector< amrex::ParticleReal > &B_external_particle, const amrex::Real *AMREX_RESTRICT a_ionization_energies, const amrex::Real *AMREX_RESTRICT a_adk_prefactor, const amrex::Real *AMREX_RESTRICT a_adk_exp_prefactor, const amrex::Real *AMREX_RESTRICT a_adk_power, int a_comp, int a_atomic_number, int a_offset=0) noexcept
Definition: Ionization.cpp:20
amrex::Array4< const amrex::Real > m_bz_arr
Definition: Ionization.H:54
amrex::ParticleReal m_Ey_external_particle
Definition: Ionization.H:43
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE bool operator()(const PData &ptd, int i, amrex::RandomEngine const &engine) const noexcept
Definition: Ionization.H:91
amrex::GpuArray< amrex::Real, 3 > m_xyzmin_arr
Definition: Ionization.H:64
int m_atomic_number
Definition: Ionization.H:38
Definition: Ionization.H:152
@ uz
Definition: NamedComponentParticleContainer.H:27
@ uy
Definition: NamedComponentParticleContainer.H:27
@ ux
Definition: NamedComponentParticleContainer.H:27