8 #ifndef SINGLE_NUCLEAR_FUSION_EVENT_H_
9 #define SINGLE_NUCLEAR_FUSION_EVENT_H_
53 template <
typename index_type>
56 const amrex::ParticleReal& u1z,
const amrex::ParticleReal& u2x,
57 const amrex::ParticleReal& u2y,
const amrex::ParticleReal& u2z,
58 const amrex::ParticleReal& m1,
const amrex::ParticleReal& m2,
59 amrex::ParticleReal w1, amrex::ParticleReal w2,
60 const amrex::Real&
dt,
const amrex::ParticleReal& dV,
const int& pair_index,
62 amrex::ParticleReal* AMREX_RESTRICT p_pair_reaction_weight,
63 const amrex::ParticleReal& fusion_multiplier,
64 const int& multiplier_ratio,
65 const amrex::ParticleReal& probability_threshold,
66 const amrex::ParticleReal& probability_target_value,
74 using namespace amrex::literals;
77 const amrex::ParticleReal w_min =
amrex::min(w1, w2);
78 const amrex::ParticleReal w_max =
amrex::max(w1, w2);
80 constexpr
auto one_pr = amrex::ParticleReal(1.);
81 constexpr
auto inv_four_pr = amrex::ParticleReal(1./4.);
83 constexpr amrex::ParticleReal inv_csq = one_pr / ( c_sq );
85 const amrex::ParticleReal m1_sq = m1*m1;
86 const amrex::ParticleReal m2_sq = m2*m2;
89 const amrex::ParticleReal g1 = std::sqrt( one_pr + (u1x*u1x+u1y*u1y+u1z*u1z)*inv_csq );
90 const amrex::ParticleReal g2 = std::sqrt( one_pr + (u2x*u2x+u2y*u2y+u2z*u2z)*inv_csq );
93 const amrex::ParticleReal p1x = u1x * m1;
94 const amrex::ParticleReal p1y = u1y * m1;
95 const amrex::ParticleReal p1z = u1z * m1;
96 const amrex::ParticleReal p2x = u2x * m2;
97 const amrex::ParticleReal p2y = u2y * m2;
98 const amrex::ParticleReal p2z = u2z * m2;
100 const amrex::ParticleReal p_total_sq = powi<2>(p1x + p2x) +
105 const amrex::ParticleReal E_lab = (m1 * g1 + m2 * g2) * c_sq;
108 const amrex::ParticleReal E_star_sq = E_lab*E_lab - c_sq*p_total_sq;
111 const amrex::ParticleReal E_star = std::sqrt(E_star_sq);
112 const amrex::ParticleReal E_kin_star = E_star - (m1 + m2)*c_sq;
115 auto fusion_cross_section = amrex::ParticleReal(0.);
131 const amrex::ParticleReal E_ratio = E_star/((m1 + m2)*c_sq);
132 const amrex::ParticleReal p_star_sq = m1*m2*c_sq * ( powi<2>(E_ratio) - one_pr )
133 + powi<2>(m1 - m2)*c_sq*inv_four_pr * powi<2>( E_ratio - 1._prt/E_ratio );
136 const amrex::ParticleReal g1_star = std::sqrt(one_pr + p_star_sq / (m1_sq*c_sq));
137 const amrex::ParticleReal g2_star = std::sqrt(one_pr + p_star_sq / (m2_sq*c_sq));
140 const amrex::ParticleReal v_rel = std::sqrt(p_star_sq) * (one_pr/(m1*g1_star) +
141 one_pr/(m2*g2_star));
148 const amrex::ParticleReal lab_to_COM_factor = g1_star*g2_star/(g1*g2);
151 amrex::ParticleReal probability_estimate = multiplier_ratio * fusion_multiplier *
152 lab_to_COM_factor * w_max * fusion_cross_section * v_rel *
dt / dV;
155 amrex::ParticleReal fusion_multiplier_eff = fusion_multiplier;
160 if (probability_estimate > probability_threshold)
164 fusion_multiplier_eff =
amrex::max(fusion_multiplier *
165 probability_target_value / probability_estimate , one_pr);
166 probability_estimate *= fusion_multiplier_eff/fusion_multiplier;
178 #ifdef AMREX_SINGLE_PRECISION_PARTICLES
179 constexpr
auto exp_threshold = amrex::ParticleReal(1.e-3);
181 constexpr
auto exp_threshold = amrex::ParticleReal(5.e-8);
183 const amrex::ParticleReal probability = (probability_estimate < exp_threshold) ?
184 probability_estimate: one_pr - std::exp(-probability_estimate);
190 if (random_number < probability)
192 p_mask[pair_index] =
true;
193 p_pair_reaction_weight[pair_index] = w_min/fusion_multiplier_eff;
197 p_mask[pair_index] =
false;
#define AMREX_GPU_HOST_DEVICE
NuclearFusionType
Definition: BinaryCollisionUtils.H:22
@ DeuteriumDeuteriumToProtonTritium
@ DeuteriumDeuteriumToNeutronHelium
@ DeuteriumTritiumToNeutronHelium
AMREX_GPU_HOST_DEVICE AMREX_INLINE amrex::ParticleReal BoschHaleFusionCrossSection(const amrex::ParticleReal &E_kin_star, const NuclearFusionType &fusion_type, const amrex::ParticleReal &m1, const amrex::ParticleReal &m2)
Computes the fusion cross section, using the analytical fits given in H.-S. Bosch and G....
Definition: BoschHaleFusionCrossSection.H:29
AMREX_GPU_HOST_DEVICE AMREX_INLINE amrex::ParticleReal ProtonBoronFusionCrossSection(const amrex::ParticleReal &E_kin_star)
Computes the total proton-boron fusion cross section. When E_kin_star < 3.5 MeV, we use the analytica...
Definition: ProtonBoronFusionCrossSection.H:138
AMREX_GPU_HOST_DEVICE AMREX_INLINE void SingleNuclearFusionEvent(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 w1, amrex::ParticleReal w2, const amrex::Real &dt, const amrex::ParticleReal &dV, const int &pair_index, index_type *AMREX_RESTRICT p_mask, amrex::ParticleReal *AMREX_RESTRICT p_pair_reaction_weight, const amrex::ParticleReal &fusion_multiplier, const int &multiplier_ratio, const amrex::ParticleReal &probability_threshold, const amrex::ParticleReal &probability_target_value, const NuclearFusionType &fusion_type, const amrex::RandomEngine &engine)
This function computes whether the collision between two particles result in a nuclear fusion event,...
Definition: SingleNuclearFusionEvent.H:55
ParticleBins::index_type index_type
Definition: ParticleUtils.cpp:32
static constexpr auto c
vacuum speed of light [m/s]
Definition: constant.H:44
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE constexpr const T & min(const T &a, const T &b) noexcept
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE constexpr const T & max(const T &a, const T &b) noexcept
int dt
Definition: stencil.py:440