8#ifndef WARPX_BINARY_COLLISION_UTILS_H_
9#define WARPX_BINARY_COLLISION_UTILS_H_
40 MultiParticleContainer
const * mypc);
43 MultiParticleContainer
const * mypc);
54 const amrex::ParticleReal& p1x,
const amrex::ParticleReal& p1y,
55 const amrex::ParticleReal& p1z,
const amrex::ParticleReal& p2x,
56 const amrex::ParticleReal& p2y,
const amrex::ParticleReal& p2z,
57 const amrex::ParticleReal& m1,
const amrex::ParticleReal& m2,
58 amrex::ParticleReal& E_kin_COM, amrex::ParticleReal& v_rel_COM,
59 amrex::ParticleReal& lab_to_COM_lorentz_factor )
65 using namespace amrex::literals;
74 const auto m1_dbl =
static_cast<double>(m1);
75 const auto m2_dbl =
static_cast<double>(m2);
76 const auto p1x_dbl =
static_cast<double>(p1x);
77 const auto p1y_dbl =
static_cast<double>(p1y);
78 const auto p1z_dbl =
static_cast<double>(p1z);
79 const auto p2x_dbl =
static_cast<double>(p2x);
80 const auto p2y_dbl =
static_cast<double>(p2y);
81 const auto p2z_dbl =
static_cast<double>(p2z);
83 const double m1_sq = m1_dbl*m1_dbl;
84 const double m2_sq = m2_dbl*m2_dbl;
87 const double p_total_sq =
powi<2>(p1x_dbl + p2x_dbl) +
powi<2>(p1y_dbl + p2y_dbl) +
powi<2>(p1z_dbl + p2z_dbl);
91 const double E1_lab = std::sqrt( m1_sq * c_sq + p1x_dbl*p1x_dbl + p1y_dbl*p1y_dbl + p1z_dbl*p1z_dbl ) * c;
92 const double E2_lab = std::sqrt( m2_sq * c_sq + p2x_dbl*p2x_dbl + p2y_dbl*p2y_dbl + p2z_dbl*p2z_dbl ) * c;
93 const double E_lab = E1_lab + E2_lab;
96 const double E_star_sq = E_lab*E_lab - c_sq*p_total_sq;
99 const double E_star = std::sqrt(E_star_sq);
102 E_kin_COM =
static_cast<amrex::ParticleReal
>(E_star - (m1_dbl + m2_dbl)*c_sq);
117 if (m1_dbl + m2_dbl == 0) {
118 p_star_sq =
powi<2>( 0.5 * E_star * inv_c );
122 const double E_ratio = E_star/((m1_dbl + m2_dbl)*c_sq);
123 p_star_sq = m1_dbl*m2_dbl*c_sq * (
powi<2>(E_ratio) - 1.0 )
124 +
powi<2>(m1_dbl - m2_dbl)*c_sq/4.0 *
powi<2>( E_ratio - 1.0/E_ratio);
128 const double E1_star = std::sqrt(m1_sq*c_sq + p_star_sq) * c;
129 const double E2_star = std::sqrt(m2_sq*c_sq + p_star_sq) * c;
132 v_rel_COM =
PhysConst::c *
static_cast<amrex::ParticleReal
>(std::sqrt(p_star_sq) * c * (1.0/E1_star + 1.0/E2_star));
140 lab_to_COM_lorentz_factor =
static_cast<amrex::ParticleReal
>(E1_star*E2_star/(E1_lab*E2_lab));
149 amrex::ParticleReal& weight, uint64_t& idcpu,
150 const amrex::ParticleReal reaction_weight )
157 if (weight <= std::numeric_limits<amrex::ParticleReal>::min())
159#if defined(AMREX_USE_OMP)
160#pragma omp atomic write
164 (
unsigned long long *)&idcpu,
#define AMREX_GPU_HOST_DEVICE
CollisionType
Definition BinaryCollisionUtils.H:17
@ LinearBreitWheeler
Definition BinaryCollisionUtils.H:25
@ ProtonBoronToAlphasFusion
Definition BinaryCollisionUtils.H:21
@ Bremsstrahlung
Definition BinaryCollisionUtils.H:22
@ PairwiseCoulomb
Definition BinaryCollisionUtils.H:24
@ DSMC
Definition BinaryCollisionUtils.H:23
@ DeuteriumDeuteriumToProtonTritiumFusion
Definition BinaryCollisionUtils.H:18
@ DeuteriumDeuteriumToNeutronHeliumFusion
Definition BinaryCollisionUtils.H:19
@ DeuteriumTritiumToNeutronHeliumFusion
Definition BinaryCollisionUtils.H:17
@ LinearCompton
Definition BinaryCollisionUtils.H:26
@ DeuteriumHeliumToProtonHeliumFusion
Definition BinaryCollisionUtils.H:20
@ Undefined
Definition BinaryCollisionUtils.H:27
NuclearFusionType
Definition BinaryCollisionUtils.H:29
@ DeuteriumHeliumToProtonHelium
Definition BinaryCollisionUtils.H:33
@ ProtonBoronToAlphas
Definition BinaryCollisionUtils.H:34
@ DeuteriumDeuteriumToProtonTritium
Definition BinaryCollisionUtils.H:31
@ DeuteriumDeuteriumToNeutronHelium
Definition BinaryCollisionUtils.H:32
@ DeuteriumTritiumToNeutronHelium
Definition BinaryCollisionUtils.H:30
Definition BinaryCollisionUtils.cpp:20
CollisionType get_collision_type(const std::string &collision_name, MultiParticleContainer const *const mypc)
Definition BinaryCollisionUtils.cpp:22
CollisionType nuclear_fusion_type_to_collision_type(const NuclearFusionType fusion_type)
Definition BinaryCollisionUtils.cpp:186
AMREX_GPU_HOST_DEVICE AMREX_INLINE void get_collision_parameters(const amrex::ParticleReal &p1x, const amrex::ParticleReal &p1y, const amrex::ParticleReal &p1z, const amrex::ParticleReal &p2x, const amrex::ParticleReal &p2y, const amrex::ParticleReal &p2z, const amrex::ParticleReal &m1, const amrex::ParticleReal &m2, amrex::ParticleReal &E_kin_COM, amrex::ParticleReal &v_rel_COM, amrex::ParticleReal &lab_to_COM_lorentz_factor)
Return (relativistic) collision energy, collision speed and Lorentz factor for transforming between t...
Definition BinaryCollisionUtils.H:53
AMREX_GPU_HOST_DEVICE AMREX_INLINE void remove_weight_from_colliding_particle(amrex::ParticleReal &weight, uint64_t &idcpu, const amrex::ParticleReal reaction_weight)
Subtract given weight from particle and set its ID to invalid if the weight reaches zero.
Definition BinaryCollisionUtils.H:148
NuclearFusionType get_nuclear_fusion_type(const std::string &collision_name, MultiParticleContainer const *const mypc)
Definition BinaryCollisionUtils.cpp:101
static constexpr auto c
vacuum speed of light [m/s]
Definition constant.H:44
__host__ __device__ AMREX_FORCE_INLINE T Exch(T *address, T val) noexcept
__host__ __device__ AMREX_FORCE_INLINE void AddNoRet(T *sum, T value) noexcept
constexpr T powi(T x) noexcept
constexpr std::uint64_t Invalid