7 #ifndef WARPX_PARTICLES_COLLISION_IMPACT_IONIZATION_H_
8 #define WARPX_PARTICLES_COLLISION_IMPACT_IONIZATION_H_
53 amrex::ParticleReal
const total_collision_prob,
54 amrex::ParticleReal
const nu_max,
70 template <
typename PData>
76 using namespace amrex;
83 const auto& p = ptd.getSuperParticle(
i);
92 const ParticleReal ux = ptd.m_rdata[
PIdx::ux][
i];
93 const ParticleReal uy = ptd.m_rdata[
PIdx::uy][
i];
94 const ParticleReal uz = ptd.m_rdata[
PIdx::uz][
i];
97 const ParticleReal u_coll2 = ux*ux + uy*uy + uz*uz;
104 const ParticleReal nu_i = n_a * sigma_E *
sqrt(u_coll2) /
m_nu_max;
107 return (
Random(engine) <= nu_i);
149 amrex::ParticleReal energy_cost,
double mass1, amrex::ParticleReal sqrt_kb_m,
151 ) : m_energy_cost(energy_cost), m_mass1(mass1),
152 m_sqrt_kb_m(sqrt_kb_m), m_T_a_func(T_a_func),
m_t(t) { }
168 template <
typename DstData,
typename SrcData>
171 int const i_src,
int const i_dst1,
int const i_dst2,
174 using namespace amrex;
178 const auto& p = src.getSuperParticle(i_src);
179 ParticleReal
x, y, z;
185 const ParticleReal ion_vel_std = m_sqrt_kb_m * std::sqrt(m_T_a_func(
x, y, z,
m_t));
188 auto& ux = src.m_rdata[
PIdx::ux][i_src];
189 auto& uy = src.m_rdata[
PIdx::uy][i_src];
190 auto& uz = src.m_rdata[
PIdx::uz][i_src];
193 auto& e_ux = dst1.m_rdata[
PIdx::ux][i_dst1];
194 auto& e_uy = dst1.m_rdata[
PIdx::uy][i_dst1];
195 auto& e_uz = dst1.m_rdata[
PIdx::uz][i_dst1];
196 auto& i_ux = dst2.m_rdata[
PIdx::ux][i_dst2];
197 auto& i_uy = dst2.m_rdata[
PIdx::uy][i_dst2];
198 auto& i_uz = dst2.m_rdata[
PIdx::uz][i_dst2];
201 const ParticleReal u_coll2 = ux*ux + uy*uy + uz*uz;
205 const auto E_out =
static_cast<amrex::ParticleReal
>((E_coll - m_energy_cost) / 2.0_prt *
PhysConst::q_e);
209 const auto mc2 = m_mass1*c2;
211 const amrex::ParticleReal up =
sqrt(E_out * (E_out + 2.0_prt*mc2) / c2) / m_mass1;
218 i_ux = ion_vel_std *
RandomNormal(0_prt, 1.0_prt, engine);
219 i_uy = ion_vel_std *
RandomNormal(0_prt, 1.0_prt, engine);
220 i_uz = ion_vel_std *
RandomNormal(0_prt, 1.0_prt, engine);
#define AMREX_FORCE_INLINE
#define AMREX_GPU_HOST_DEVICE
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void get_particle_position(const WarpXParticleContainer::SuperParticleType &p, amrex::ParticleReal &x, amrex::ParticleReal &y, amrex::ParticleReal &z) noexcept
Extract the cartesian position coordinates of the particle p and store them in the variables x,...
Definition: GetAndSetPosition.H:28
Filter functor for impact ionization.
Definition: ImpactIonization.H:27
ImpactIonizationFilterFunc(ScatteringProcess const &mcc_process, double const mass, amrex::ParticleReal const total_collision_prob, amrex::ParticleReal const nu_max, amrex::ParserExecutor< 4 > const &n_a_func, amrex::Real t)
Constructor of the ImpactIonizationFilterFunc functor.
Definition: ImpactIonization.H:50
double m_mass
Definition: ImpactIonization.H:112
amrex::ParticleReal m_nu_max
Definition: ImpactIonization.H:114
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE bool operator()(const PData &ptd, int const i, amrex::RandomEngine const &engine) const noexcept
Functor call. This method determines if a given (electron) particle should undergo an ionization coll...
Definition: ImpactIonization.H:72
amrex::ParticleReal m_total_collision_prob
Definition: ImpactIonization.H:113
amrex::ParserExecutor< 4 > m_n_a_func
Definition: ImpactIonization.H:115
amrex::Real m_t
Definition: ImpactIonization.H:116
ScatteringProcess::Executor m_mcc_process
Definition: ImpactIonization.H:111
Definition: ScatteringProcess.H:27
AMREX_GPU_HOST_DEVICE AMREX_INLINE void getEnergy(amrex::ParticleReal const u2, double const mass, double &energy)
Return (relativistic) particle energy given velocity and mass. Note the use of double since this calc...
Definition: ParticleUtils.H:46
AMREX_GPU_HOST_DEVICE AMREX_INLINE void RandomizeVelocity(amrex::ParticleReal &ux, amrex::ParticleReal &uy, amrex::ParticleReal &uz, const amrex::ParticleReal vp, amrex::RandomEngine const &engine)
Function to perform scattering of a particle that results in a random velocity vector with given magn...
Definition: ParticleUtils.H:162
static constexpr auto c
vacuum speed of light [m/s]
Definition: constant.H:44
static constexpr auto q_e
elementary charge [C]
Definition: constant.H:50
Real RandomNormal(Real mean, Real stddev)
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE GpuComplex< T > sqrt(const GpuComplex< T > &a_z) noexcept
i
Definition: check_interp_points_and_weights.py:174
@ uz
Definition: NamedComponentParticleContainer.H:34
@ uy
Definition: NamedComponentParticleContainer.H:34
@ ux
Definition: NamedComponentParticleContainer.H:34
Definition: ScatteringProcess.H:71
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::ParticleReal getCrossSection(amrex::ParticleReal E_coll) const
Definition: ScatteringProcess.H:81