8 #ifndef BINARY_COLLISION_UTILS_H_
9 #define BINARY_COLLISION_UTILS_H_
49 const amrex::ParticleReal& u1x,
const amrex::ParticleReal& u1y,
50 const amrex::ParticleReal& u1z,
const amrex::ParticleReal& u2x,
51 const amrex::ParticleReal& u2y,
const amrex::ParticleReal& u2z,
52 const amrex::ParticleReal& m1,
const amrex::ParticleReal& m2,
53 amrex::ParticleReal& E_kin_COM, amrex::ParticleReal& v_rel_COM,
54 amrex::ParticleReal& lab_to_COM_lorentz_factor )
60 using namespace amrex::literals;
63 constexpr
auto one_pr = amrex::ParticleReal(1.);
64 constexpr
auto inv_four_pr = amrex::ParticleReal(1./4.);
66 constexpr
double inv_csq = 1.0 / c_sq;
68 const amrex::ParticleReal m1_sq = m1*m1;
69 const amrex::ParticleReal m2_sq = m2*m2;
72 const double g1 = std::sqrt( 1.0 +
static_cast<double>(u1x*u1x+u1y*u1y+u1z*u1z)*inv_csq );
73 const double g2 = std::sqrt( 1.0 +
static_cast<double>(u2x*u2x+u2y*u2y+u2z*u2z)*inv_csq );
76 const amrex::ParticleReal p1x = u1x * m1;
77 const amrex::ParticleReal p1y = u1y * m1;
78 const amrex::ParticleReal p1z = u1z * m1;
79 const amrex::ParticleReal p2x = u2x * m2;
80 const amrex::ParticleReal p2y = u2y * m2;
81 const amrex::ParticleReal p2z = u2z * m2;
83 const auto p_total_sq =
static_cast<double>(
84 powi<2>(p1x + p2x) + powi<2>(p1y + p2y) + powi<2>(p1z + p2z)
90 const auto m1_dbl =
static_cast<double>(m1);
91 const auto m2_dbl =
static_cast<double>(m2);
92 const double E_lab = (m1_dbl * g1 + m2_dbl * g2) * c_sq;
95 const double E_star_sq = E_lab*E_lab - c_sq*p_total_sq;
98 const double E_star = std::sqrt(E_star_sq);
99 E_kin_COM =
static_cast<amrex::ParticleReal
>(E_star - (m1_dbl + m2_dbl)*c_sq);
105 const auto E_ratio =
static_cast<amrex::ParticleReal
>(E_star/((m1 + m2)*c_sq));
106 const auto p_star_sq =
static_cast<amrex::ParticleReal
>(
107 m1*m2*c_sq * ( powi<2>(E_ratio) - one_pr )
108 + powi<2>(m1 - m2)*c_sq*inv_four_pr * powi<2>( E_ratio - 1._prt/E_ratio)
112 const auto g1_star = std::sqrt(one_pr + p_star_sq /
static_cast<amrex::ParticleReal
>(m1_sq*c_sq));
113 const auto g2_star = std::sqrt(one_pr + p_star_sq /
static_cast<amrex::ParticleReal
>(m2_sq*c_sq));
116 v_rel_COM = std::sqrt(p_star_sq) * (one_pr/(m1*g1_star) + one_pr/(m2*g2_star));
125 lab_to_COM_lorentz_factor = g1_star*g2_star/
static_cast<amrex::ParticleReal
>(g1*g2);
#define AMREX_GPU_HOST_DEVICE
CollisionType
Definition: BinaryCollisionUtils.H:17
@ ProtonBoronToAlphasFusion
@ DeuteriumDeuteriumToProtonTritiumFusion
@ DeuteriumDeuteriumToNeutronHeliumFusion
@ DeuteriumTritiumToNeutronHeliumFusion
@ DeuteriumHeliumToProtonHeliumFusion
NuclearFusionType
Definition: BinaryCollisionUtils.H:24
@ 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:105
CollisionType nuclear_fusion_type_to_collision_type(const NuclearFusionType fusion_type)
Definition: BinaryCollisionUtils.cpp:119
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:48
NuclearFusionType get_nuclear_fusion_type(const std::string collision_name, MultiParticleContainer const *const mypc)
Definition: BinaryCollisionUtils.cpp:20
static constexpr auto c
vacuum speed of light [m/s]
Definition: constant.H:44