7 #ifndef WARPX_PARTICLES_COLLISION_MCC_SCATTERING_H_ 8 #define WARPX_PARTICLES_COLLISION_MCC_SCATTERING_H_ 15 #include <AMReX_Random.H> 16 #include <AMReX_REAL.H> 33 AMREX_GPU_HOST_DEVICE AMREX_INLINE
35 amrex::ParticleReal&
uz, amrex::ParticleReal uCOM_x,
36 amrex::ParticleReal uCOM_y, amrex::ParticleReal uCOM_z,
37 amrex::RandomEngine
const& engine )
47 amrex::Real
const mag = sqrt(ux*ux + uy*uy + uz*uz);
65 AMREX_GPU_HOST_DEVICE AMREX_INLINE
67 amrex::ParticleReal&
uz,
68 const amrex::ParticleReal uCOM_x,
69 const amrex::ParticleReal uCOM_y,
70 const amrex::ParticleReal uCOM_z)
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;
86 AMREX_GPU_HOST_DEVICE AMREX_INLINE
88 amrex::ParticleReal&
uz,
89 const amrex::ParticleReal ua_x,
90 const amrex::ParticleReal ua_y,
91 const amrex::ParticleReal ua_z)
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){ }
139 template <
typename PData>
140 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
142 const PData& ptd,
int const i, amrex::RandomEngine
const& engine
145 using namespace amrex;
149 if (Random(engine) > m_total_collision_prob)
return false;
153 const ParticleReal uy = ptd.m_rdata[
PIdx::uy][
i];
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);
162 const Real sigma_E = m_mcc_process.getCrossSection(E_coll);
165 const Real nu_i = sigma_E * v_coll / m_nu_max_norm;
168 return (Random(engine) <= nu_i);
174 amrex::Real m_total_collision_prob = 0;
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) { }
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
224 using namespace amrex;
229 auto& uy = src.m_rdata[
PIdx::uy][i_src];
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];
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;
245 amrex::Real E_remaining = E_coll - m_energy_cost;
248 amrex::Real vp = sqrt(
249 2.0_prt / m_mass1 * PhysConst::q_e * E_remaining / 2.0_prt
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);
267 #endif // WARPX_PARTICLES_COLLISION_MCC_SCATTERING_H_
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
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
Definition: WarpXParticleContainer_fwd.H:28
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