WarpX
MCCScattering.H
Go to the documentation of this file.
1 /* Copyright 2021 Modern Electron
2  *
3  * This file is part of WarpX.
4  *
5  * License: BSD-3-Clause-LBNL
6  */
7 #ifndef WARPX_PARTICLES_COLLISION_MCC_SCATTERING_H_
8 #define WARPX_PARTICLES_COLLISION_MCC_SCATTERING_H_
9 
10 #include "MCCProcess.H"
11 
12 #include "Utils/ParticleUtils.H"
13 #include "Utils/WarpXConst.H"
14 
15 #include <AMReX_Random.H>
16 #include <AMReX_REAL.H>
17 
33 AMREX_GPU_HOST_DEVICE AMREX_INLINE
34 void ElasticScattering ( amrex::ParticleReal& ux, amrex::ParticleReal& uy,
35  amrex::ParticleReal& uz, amrex::ParticleReal uCOM_x,
36  amrex::ParticleReal uCOM_y, amrex::ParticleReal uCOM_z,
37  amrex::RandomEngine const& engine )
38 {
39  using std::sqrt;
40 
41  // transform to center of momentum frame
42  ux -= uCOM_x;
43  uy -= uCOM_y;
44  uz -= uCOM_z;
45 
46  // istropically scatter the particle
47  amrex::Real const mag = sqrt(ux*ux + uy*uy + uz*uz);
48  ParticleUtils::RandomizeVelocity(ux, uy, uz, mag, engine);
49 
50  // transform back to lab frame
51  ux += uCOM_x;
52  uy += uCOM_y;
53  uz += uCOM_z;
54 }
55 
56 
65 AMREX_GPU_HOST_DEVICE AMREX_INLINE
66 void BackScattering ( amrex::ParticleReal& ux, amrex::ParticleReal& uy,
67  amrex::ParticleReal& uz,
68  const amrex::ParticleReal uCOM_x,
69  const amrex::ParticleReal uCOM_y,
70  const amrex::ParticleReal uCOM_z)
71 {
72  // transform to COM frame, reverse particle velocity and transform back
73  using namespace amrex::literals;
74  ux = -1.0_prt * ux + 2.0_prt * uCOM_x;
75  uy = -1.0_prt * uy + 2.0_prt * uCOM_y;
76  uz = -1.0_prt * uz + 2.0_prt * uCOM_z;
77 }
78 
79 
86 AMREX_GPU_HOST_DEVICE AMREX_INLINE
87 void ChargeExchange ( amrex::ParticleReal& ux, amrex::ParticleReal& uy,
88  amrex::ParticleReal& uz,
89  const amrex::ParticleReal ua_x,
90  const amrex::ParticleReal ua_y,
91  const amrex::ParticleReal ua_z)
92 {
93  // swap ion velocity for neutral velocity
94  ux = ua_x;
95  uy = ua_y;
96  uz = ua_z;
97 }
98 
99 
104 {
105 public:
106 
123  MCCProcess const& mcc_process,
124  amrex::Real const mass,
125  amrex::Real const total_collision_prob,
126  amrex::Real const nu_max_norm
127  ) : m_mcc_process(mcc_process.executor()), m_mass(mass),
128  m_total_collision_prob(total_collision_prob),
129  m_nu_max_norm(nu_max_norm){ }
130 
139  template <typename PData>
140  AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
141  bool operator() (
142  const PData& ptd, int const i, amrex::RandomEngine const& engine
143  ) const noexcept
144  {
145  using namespace amrex;
146  using std::sqrt;
147 
148  // determine if this particle should collide
149  if (Random(engine) > m_total_collision_prob) return false;
150 
151  // get the particle velocity
152  const ParticleReal ux = ptd.m_rdata[PIdx::ux][i];
153  const ParticleReal uy = ptd.m_rdata[PIdx::uy][i];
154  const ParticleReal uz = ptd.m_rdata[PIdx::uz][i];
155 
156  // calculate kinetic energy
157  const ParticleReal v_coll2 = ux*ux + uy*uy + uz*uz;
158  const ParticleReal E_coll = 0.5_prt * m_mass * v_coll2 / PhysConst::q_e;
159  const ParticleReal v_coll = sqrt(v_coll2);
160 
161  // get collision cross-section
162  const Real sigma_E = m_mcc_process.getCrossSection(E_coll);
163 
164  // calculate normalized collision frequency
165  const Real nu_i = sigma_E * v_coll / m_nu_max_norm;
166 
167  // check if this collision should be performed
168  return (Random(engine) <= nu_i);
169  }
170 
171 private:
173  amrex::Real m_mass;
174  amrex::Real m_total_collision_prob = 0;
175  amrex::Real m_nu_max_norm;
176 };
177 
178 
183 {
184 public:
185 
200  amrex::Real energy_cost, amrex::Real mass1, amrex::Real ion_vel_std
201  ) : m_energy_cost(energy_cost), m_mass1(mass1),
202  m_ion_vel_std(ion_vel_std) { }
203 
218  template <typename DstData, typename SrcData>
219  AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
220  void operator() (DstData& dst1, DstData& dst2, SrcData& src,
221  int const i_src, int const i_dst1, int const i_dst2,
222  amrex::RandomEngine const& engine) const noexcept
223  {
224  using namespace amrex;
225  using std::sqrt;
226 
227  // get references to the original particle's velocity
228  auto& ux = src.m_rdata[PIdx::ux][i_src];
229  auto& uy = src.m_rdata[PIdx::uy][i_src];
230  auto& uz = src.m_rdata[PIdx::uz][i_src];
231 
232  // get references to the new particles' velocities
233  auto& e_ux = dst1.m_rdata[PIdx::ux][i_dst1];
234  auto& e_uy = dst1.m_rdata[PIdx::uy][i_dst1];
235  auto& e_uz = dst1.m_rdata[PIdx::uz][i_dst1];
236  auto& i_ux = dst2.m_rdata[PIdx::ux][i_dst2];
237  auto& i_uy = dst2.m_rdata[PIdx::uy][i_dst2];
238  auto& i_uz = dst2.m_rdata[PIdx::uz][i_dst2];
239 
240  // calculate kinetic energy
241  const ParticleReal v_coll2 = ux*ux + uy*uy + uz*uz;
242  const ParticleReal E_coll = 0.5_prt * m_mass1 * v_coll2 / PhysConst::q_e;
243 
244  // get the left over energy
245  amrex::Real E_remaining = E_coll - m_energy_cost;
246 
247  // each electron gets half the energy (could change this later)
248  amrex::Real vp = sqrt(
249  2.0_prt / m_mass1 * PhysConst::q_e * E_remaining / 2.0_prt
250  );
251 
252  // isotropically scatter electrons
253  ParticleUtils::RandomizeVelocity(ux, uy, uz, vp, engine);
254  ParticleUtils::RandomizeVelocity(e_ux, e_uy, e_uz, vp, engine);
255 
256  // get velocities for the ion from a Maxwellian distribution
257  i_ux = m_ion_vel_std * RandomNormal(0_prt, 1.0_prt, engine);
258  i_uy = m_ion_vel_std * RandomNormal(0_prt, 1.0_prt, engine);
259  i_uz = m_ion_vel_std * RandomNormal(0_prt, 1.0_prt, engine);
260  }
261 
262 private:
263  amrex::Real m_energy_cost;
264  amrex::Real m_mass1;
265  amrex::Real m_ion_vel_std;
266 };
267 #endif // WARPX_PARTICLES_COLLISION_MCC_SCATTERING_H_
amrex::Real m_ion_vel_std
Definition: MCCScattering.H:265
MCCProcess::Executor m_mcc_process
Definition: MCCScattering.H:172
AMREX_GPU_HOST_DEVICE AMREX_INLINE void ElasticScattering(amrex::ParticleReal &ux, amrex::ParticleReal &uy, amrex::ParticleReal &uz, amrex::ParticleReal uCOM_x, amrex::ParticleReal uCOM_y, amrex::ParticleReal uCOM_z, amrex::RandomEngine const &engine)
Function to perform elastic scattering of a particle in the lab frame. The particle velocities transf...
Definition: MCCScattering.H:34
Definition: WarpXParticleContainer_fwd.H:28
Transform functor for impact ionization.
Definition: MCCScattering.H:182
Filter functor for impact ionization.
Definition: MCCScattering.H:103
ImpactIonizationFilterFunc(MCCProcess const &mcc_process, amrex::Real const mass, amrex::Real const total_collision_prob, amrex::Real const nu_max_norm)
Constructor of the ImpactIonizationFilterFunc functor.
Definition: MCCScattering.H:122
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:67
Definition: MCCProcess.H:24
Definition: WarpXParticleContainer_fwd.H:28
def uz
Definition: read_lab_particles.py:29
ImpactIonizationTransformFunc(amrex::Real energy_cost, amrex::Real mass1, amrex::Real ion_vel_std)
Constructor of the ImpactIonizationTransformFunc functor.
Definition: MCCScattering.H:199
Definition: WarpXParticleContainer_fwd.H:28
amrex::Real m_mass1
Definition: MCCScattering.H:264
i
Definition: check_interp_points_and_weights.py:171
AMREX_GPU_HOST_DEVICE AMREX_INLINE void ChargeExchange(amrex::ParticleReal &ux, amrex::ParticleReal &uy, amrex::ParticleReal &uz, const amrex::ParticleReal ua_x, const amrex::ParticleReal ua_y, const amrex::ParticleReal ua_z)
Function to perform charge exchange of an ion with a neutral particle.
Definition: MCCScattering.H:87
Definition: MCCProcess.H:68
amrex::Real m_nu_max_norm
Definition: MCCScattering.H:175
amrex::Real m_mass
Definition: MCCScattering.H:173
def ux
Definition: read_lab_particles.py:28
Definition: BreitWheelerEngineWrapper.H:35
AMREX_GPU_HOST_DEVICE AMREX_INLINE void BackScattering(amrex::ParticleReal &ux, amrex::ParticleReal &uy, amrex::ParticleReal &uz, const amrex::ParticleReal uCOM_x, const amrex::ParticleReal uCOM_y, const amrex::ParticleReal uCOM_z)
Function to perform back scattering of a particle in the lab frame. The particle velocity is transfor...
Definition: MCCScattering.H:66
amrex::Real m_energy_cost
Definition: MCCScattering.H:263