WarpX
Loading...
Searching...
No Matches
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 WARPX_IONIZATION_H_
9#define WARPX_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;
35 const amrex::Real* AMREX_RESTRICT m_adk_power;
37
38 int comp;
41
44 amrex::ParticleReal m_Ex_external_particle;
45 amrex::ParticleReal m_Ey_external_particle;
46 amrex::ParticleReal m_Ez_external_particle;
47 amrex::ParticleReal m_Bx_external_particle;
48 amrex::ParticleReal m_By_external_particle;
49 amrex::ParticleReal m_Bz_external_particle;
50
57
64
67
69 int m_nox;
71
73
74 IonizationFilterFunc (const WarpXParIter& a_pti, int lev, amrex::IntVect ngEB,
75 amrex::FArrayBox const& exfab,
76 amrex::FArrayBox const& eyfab,
77 amrex::FArrayBox const& ezfab,
78 amrex::FArrayBox const& bxfab,
79 amrex::FArrayBox const& byfab,
80 amrex::FArrayBox const& bzfab,
81 amrex::Vector<amrex::ParticleReal>& E_external_particle,
82 amrex::Vector<amrex::ParticleReal>& B_external_particle,
83 const amrex::Real* AMREX_RESTRICT a_ionization_energies,
84 const amrex::Real* AMREX_RESTRICT a_adk_prefactor,
85 const amrex::Real* AMREX_RESTRICT a_adk_exp_prefactor,
86 const amrex::Real* AMREX_RESTRICT a_adk_power,
87 const amrex::Real* AMREX_RESTRICT a_adk_correction_factors,
88 int a_comp,
89 int a_atomic_number,
90 int a_do_adk_correction,
91 int a_offset = 0) noexcept;
92
93 template <typename PData>
95 bool operator() (const PData& ptd, int i, amrex::RandomEngine const& engine) const noexcept
96 {
97 using namespace amrex::literals;
98
99 const int ion_lev = ptd.m_runtime_idata[comp][i];
100 if (ion_lev < m_atomic_number)
101 {
102 constexpr amrex::Real c = PhysConst::c;
103 constexpr amrex::Real c2_inv = amrex::Real(1.)/c/c;
104
105 // gather E and B
106 amrex::ParticleReal xp, yp, zp;
107 m_get_position(i, xp, yp, zp);
108
109 amrex::ParticleReal ex = m_Ex_external_particle;
110 amrex::ParticleReal ey = m_Ey_external_particle;
111 amrex::ParticleReal ez = m_Ez_external_particle;
112 amrex::ParticleReal bx = m_Bx_external_particle;
113 amrex::ParticleReal by = m_By_external_particle;
114 amrex::ParticleReal bz = m_Bz_external_particle;
115 m_get_externalEB(i, ex, ey, ez, bx, by, bz);
116
117 doGatherShapeN(xp, yp, zp, ex, ey, ez, bx, by, bz,
122
123 // Compute electric field amplitude in the particle's frame of
124 // reference (particularly important when in boosted frame).
125 const amrex::ParticleReal ux = ptd.m_rdata[PIdx::ux][i];
126 const amrex::ParticleReal uy = ptd.m_rdata[PIdx::uy][i];
127 const amrex::ParticleReal uz = ptd.m_rdata[PIdx::uz][i];
128
129 const auto ga = static_cast<amrex::Real>(
130 std::sqrt(1. + (ux*ux + uy*uy + uz*uz) * c2_inv));
131 const amrex::Real E = std::sqrt(
132 - ( ux*ex + uy*ey + uz*ez ) * ( ux*ex + uy*ey + uz*ez ) * c2_inv
133 + ( ga *ex + uy*bz - uz*by ) * ( ga *ex + uy*bz - uz*by )
134 + ( ga *ey + uz*bx - ux*bz ) * ( ga *ey + uz*bx - ux*bz )
135 + ( ga *ez + ux*by - uy*bx ) * ( ga *ez + ux*by - uy*bx )
136 );
137
138 // Compute probability of ionization p
139 amrex::Real w_dtau = (E <= 0._rt) ? 0._rt : 1._rt/ ga * m_adk_prefactor[ion_lev] *
140 std::pow(E, m_adk_power[ion_lev]) *
141 std::exp( m_adk_exp_prefactor[ion_lev]/E );
142 // if requested, do Zhang's correction of ADK
144 const amrex::Real r = E / m_adk_correction_factors[3];
145 w_dtau *= std::exp(m_adk_correction_factors[0]*r*r+m_adk_correction_factors[1]*r+
147 }
148
149 const amrex::Real p = 1._rt - std::exp( - w_dtau );
150
151 const amrex::Real random_draw = amrex::Random(engine);
152 if (random_draw < p)
153 {
154 return true;
155 }
156 }
157 return false;
158 }
159};
160
162{
163 template <typename DstData, typename SrcData>
165 void operator() (DstData& /*dst*/, SrcData& src,
166 int i_src, int /*i_dst*/,
167 amrex::RandomEngine const& /*engine*/) const noexcept
168 {
169 src.m_runtime_idata[0][i_src] += 1;
170 }
171};
172
173#endif //WARPX_IONIZATION_H_
#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::XDim3 &dinv, const amrex::XDim3 &xyzmin, const amrex::Dim3 &lo, const int n_rz_azimuthal_modes)
Field gather for a single particle.
Definition FieldGather.H:349
Definition WarpXParticleContainer.H:112
constexpr auto c
vacuum speed of light [m/s]
Definition constant.H:149
Real Random()
IndexTypeND< 3 > IndexType
IntVectND< 3 > IntVect
Functor class that assigns external field values (E and B) to particles.
Definition GetExternalFields.H:23
Functor that can be used to extract the positions of the macroparticles inside a ParallelFor kernel.
Definition GetAndSetPosition.H:75
amrex::ParticleReal m_Ez_external_particle
Definition Ionization.H:46
amrex::IndexType m_by_type
Definition Ionization.H:62
int m_do_adk_correction
Definition Ionization.H:40
amrex::IndexType m_bx_type
Definition Ionization.H:61
int comp
Definition Ionization.H:38
amrex::ParticleReal m_Bx_external_particle
Definition Ionization.H:47
amrex::Array4< const amrex::Real > m_ey_arr
Definition Ionization.H:52
bool m_galerkin_interpolation
Definition Ionization.H:68
amrex::Array4< const amrex::Real > m_by_arr
Definition Ionization.H:55
amrex::ParticleReal m_Ex_external_particle
Definition Ionization.H:44
amrex::ParticleReal m_Bz_external_particle
Definition Ionization.H:49
amrex::Array4< const amrex::Real > m_bx_arr
Definition Ionization.H:54
amrex::Dim3 m_lo
Definition Ionization.H:72
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, const amrex::Real *AMREX_RESTRICT a_adk_correction_factors, int a_comp, int a_atomic_number, int a_do_adk_correction, int a_offset=0) noexcept
Definition Ionization.cpp:20
const amrex::Real *AMREX_RESTRICT m_adk_exp_prefactor
Definition Ionization.H:34
amrex::XDim3 m_dinv
Definition Ionization.H:65
const amrex::Real *AMREX_RESTRICT m_adk_power
Definition Ionization.H:35
const amrex::Real *AMREX_RESTRICT m_adk_correction_factors
Definition Ionization.H:36
amrex::Array4< const amrex::Real > m_ex_arr
Definition Ionization.H:51
amrex::IndexType m_ez_type
Definition Ionization.H:60
const amrex::Real *AMREX_RESTRICT m_adk_prefactor
Definition Ionization.H:33
amrex::IndexType m_bz_type
Definition Ionization.H:63
GetExternalEBField m_get_externalEB
Definition Ionization.H:43
const amrex::Real *AMREX_RESTRICT m_ionization_energies
Definition Ionization.H:32
amrex::XDim3 m_xyzmin
Definition Ionization.H:66
int m_nox
Definition Ionization.H:69
amrex::Array4< const amrex::Real > m_ez_arr
Definition Ionization.H:53
amrex::IndexType m_ey_type
Definition Ionization.H:59
int m_n_rz_azimuthal_modes
Definition Ionization.H:70
GetParticlePosition< PIdx > m_get_position
Definition Ionization.H:42
amrex::IndexType m_ex_type
Definition Ionization.H:58
amrex::ParticleReal m_By_external_particle
Definition Ionization.H:48
amrex::Array4< const amrex::Real > m_bz_arr
Definition Ionization.H:56
amrex::ParticleReal m_Ey_external_particle
Definition Ionization.H:45
int m_atomic_number
Definition Ionization.H:39
Definition Ionization.H:162
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void operator()(DstData &, SrcData &src, int i_src, int, amrex::RandomEngine const &) const noexcept
Definition Ionization.H:165
@ uz
Definition WarpXParticleContainer.H:70
@ uy
Definition WarpXParticleContainer.H:70
@ ux
Definition WarpXParticleContainer.H:70