8 #ifndef WARPX_SINGLE_NUCLEAR_FUSION_EVENT_H_
9 #define WARPX_SINGLE_NUCLEAR_FUSION_EVENT_H_
52 template <
typename index_type>
55 const amrex::ParticleReal& u1z,
const amrex::ParticleReal& u2x,
56 const amrex::ParticleReal& u2y,
const amrex::ParticleReal& u2z,
57 const amrex::ParticleReal& m1,
const amrex::ParticleReal& m2,
58 amrex::ParticleReal w1, amrex::ParticleReal w2,
59 const amrex::Real&
dt,
const amrex::ParticleReal& dV,
const int& pair_index,
61 amrex::ParticleReal* AMREX_RESTRICT p_pair_reaction_weight,
62 const amrex::ParticleReal& fusion_multiplier,
63 const int& multiplier_ratio,
64 const amrex::ParticleReal& probability_threshold,
65 const amrex::ParticleReal& probability_target_value,
69 amrex::ParticleReal E_coll, v_coll, lab_to_COM_factor;
72 u1x, u1y, u1z, u2x, u2y, u2z, m1, m2,
73 E_coll, v_coll, lab_to_COM_factor);
75 using namespace amrex::literals;
77 const amrex::ParticleReal w_min =
amrex::min(w1, w2);
78 const amrex::ParticleReal w_max =
amrex::max(w1, w2);
81 auto fusion_cross_section = amrex::ParticleReal(0.);
94 amrex::ParticleReal probability_estimate = multiplier_ratio * fusion_multiplier *
95 lab_to_COM_factor * w_max * fusion_cross_section * v_coll *
dt / dV;
98 amrex::ParticleReal fusion_multiplier_eff = fusion_multiplier;
103 if (probability_estimate > probability_threshold)
107 fusion_multiplier_eff =
amrex::max(fusion_multiplier *
108 probability_target_value / probability_estimate , 1._prt);
109 probability_estimate *= fusion_multiplier_eff/fusion_multiplier;
117 const amrex::ParticleReal probability = -std::expm1(-probability_estimate);
120 const amrex::ParticleReal random_number =
amrex::Random(engine);
123 if (random_number < probability)
125 p_mask[pair_index] =
true;
126 p_pair_reaction_weight[pair_index] = w_min/fusion_multiplier_eff;
130 p_mask[pair_index] =
false;
#define AMREX_GPU_HOST_DEVICE
NuclearFusionType
Definition: BinaryCollisionUtils.H:26
@ 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:139
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:54
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
typename ParticleBins::index_type index_type
Definition: ParticleUtils.cpp:35
AMREX_GPU_HOST_DEVICE constexpr AMREX_FORCE_INLINE const T & max(const T &a, const T &b) noexcept
AMREX_GPU_HOST_DEVICE constexpr AMREX_FORCE_INLINE const T & min(const T &a, const T &b) noexcept
float dt
Definition: stencil.py:442