8 #ifndef WARPX_BINARY_COLLISION_UTILS_H_
9 #define WARPX_BINARY_COLLISION_UTILS_H_
51 const amrex::ParticleReal& u1x,
const amrex::ParticleReal& u1y,
52 const amrex::ParticleReal& u1z,
const amrex::ParticleReal& u2x,
53 const amrex::ParticleReal& u2y,
const amrex::ParticleReal& u2z,
54 const amrex::ParticleReal& m1,
const amrex::ParticleReal& m2,
55 amrex::ParticleReal& E_kin_COM, amrex::ParticleReal& v_rel_COM,
56 amrex::ParticleReal& lab_to_COM_lorentz_factor )
62 using namespace amrex::literals;
66 constexpr
double inv_csq = 1.0 / c_sq;
70 const auto m1_dbl =
static_cast<double>(m1);
71 const auto m2_dbl =
static_cast<double>(m2);
72 const auto u1x_dbl =
static_cast<double>(u1x);
73 const auto u1y_dbl =
static_cast<double>(u1y);
74 const auto u1z_dbl =
static_cast<double>(u1z);
75 const auto u2x_dbl =
static_cast<double>(u2x);
76 const auto u2y_dbl =
static_cast<double>(u2y);
77 const auto u2z_dbl =
static_cast<double>(u2z);
79 const double m1_sq = m1_dbl*m1_dbl;
80 const double m2_sq = m2_dbl*m2_dbl;
83 const double g1 = std::sqrt( 1.0 + (u1x_dbl*u1x_dbl + u1y_dbl*u1y_dbl + u1z_dbl*u1z_dbl)*inv_csq );
84 const double g2 = std::sqrt( 1.0 + (u2x_dbl*u2x_dbl + u2y_dbl*u2y_dbl + u2z_dbl*u2z_dbl)*inv_csq );
87 const double p1x = u1x_dbl * m1_dbl;
88 const double p1y = u1y_dbl * m1_dbl;
89 const double p1z = u1z_dbl * m1_dbl;
90 const double p2x = u2x_dbl * m2_dbl;
91 const double p2y = u2y_dbl * m2_dbl;
92 const double p2z = u2z_dbl * m2_dbl;
95 const double p_total_sq = powi<2>(p1x + p2x) + powi<2>(p1y + p2y) + powi<2>(p1z + p2z);
100 const double E_lab = (m1_dbl*g1 + m2_dbl*g2) * c_sq;
103 const double E_star_sq = E_lab*E_lab - c_sq*p_total_sq;
106 const double E_star = std::sqrt(E_star_sq);
109 E_kin_COM =
static_cast<amrex::ParticleReal
>(E_star - (m1_dbl + m2_dbl)*c_sq);
115 const double E_ratio = E_star/((m1_dbl + m2_dbl)*c_sq);
116 const double p_star_sq = m1_dbl*m2_dbl*c_sq * ( powi<2>(E_ratio) - 1.0 )
117 + powi<2>(m1_dbl - m2_dbl)*c_sq/4.0 * powi<2>( E_ratio - 1.0/E_ratio);
120 const double g1_star = std::sqrt(1.0 + p_star_sq / (m1_sq*c_sq));
121 const double g2_star = std::sqrt(1.0 + p_star_sq / (m2_sq*c_sq));
124 v_rel_COM =
static_cast<amrex::ParticleReal
>(std::sqrt(p_star_sq) * (1.0/(m1_dbl*g1_star) + 1.0/(m2_dbl*g2_star)));
133 lab_to_COM_lorentz_factor =
static_cast<amrex::ParticleReal
>(g1_star*g2_star/(g1*g2));
142 amrex::ParticleReal& weight, uint64_t& idcpu,
143 const amrex::ParticleReal reaction_weight )
150 if (weight <= std::numeric_limits<amrex::ParticleReal>::min())
152 #if defined(AMREX_USE_OMP)
153 #pragma omp atomic write
157 (
unsigned long long *)&idcpu,
#define AMREX_GPU_HOST_DEVICE
CollisionType
Definition: BinaryCollisionUtils.H:17
@ ProtonBoronToAlphasFusion
@ DeuteriumDeuteriumToProtonTritiumFusion
@ DeuteriumDeuteriumToNeutronHeliumFusion
@ DeuteriumTritiumToNeutronHeliumFusion
@ DeuteriumHeliumToProtonHeliumFusion
NuclearFusionType
Definition: BinaryCollisionUtils.H:26
@ DeuteriumHeliumToProtonHelium
@ DeuteriumDeuteriumToProtonTritium
@ DeuteriumDeuteriumToNeutronHelium
@ DeuteriumTritiumToNeutronHelium
Definition: MultiParticleContainer.H:66
Definition: BinaryCollisionUtils.cpp:18
CollisionType get_collision_type(const std::string &collision_name, MultiParticleContainer const *const mypc)
Definition: BinaryCollisionUtils.cpp:20
CollisionType nuclear_fusion_type_to_collision_type(const NuclearFusionType fusion_type)
Definition: BinaryCollisionUtils.cpp:125
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:141
NuclearFusionType get_nuclear_fusion_type(const std::string &collision_name, MultiParticleContainer const *const mypc)
Definition: BinaryCollisionUtils.cpp:40
AMREX_GPU_HOST_DEVICE AMREX_INLINE void get_collision_parameters(const amrex::ParticleReal &u1x, const amrex::ParticleReal &u1y, const amrex::ParticleReal &u1z, const amrex::ParticleReal &u2x, const amrex::ParticleReal &u2y, const amrex::ParticleReal &u2z, 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:50
static constexpr auto c
vacuum speed of light [m/s]
Definition: constant.H:44
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE T Exch(T *address, T val) noexcept
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void AddNoRet(T *sum, T value) noexcept
constexpr std::uint64_t Invalid