WarpX
Loading...
Searching...
No Matches
SingleNuclearFusionEvent.H
Go to the documentation of this file.
1/* Copyright 2021 Neil Zaim
2 *
3 * This file is part of WarpX.
4 *
5 * License: BSD-3-Clause-LBNL
6 */
7
8#ifndef WARPX_SINGLE_NUCLEAR_FUSION_EVENT_H_
9#define WARPX_SINGLE_NUCLEAR_FUSION_EVENT_H_
10
13
15#include "Utils/WarpXConst.H"
16
17#include <AMReX_Algorithm.H>
18#include <AMReX_Random.H>
19#include <AMReX_REAL.H>
20
21#include <cmath>
22
23
52template <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,
59 const amrex::Real& dt, const amrex::ParticleReal& dV, const int& pair_index,
60 index_type* AMREX_RESTRICT p_mask,
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,
66 const NuclearFusionType& fusion_type,
67 const amrex::RandomEngine& engine)
68{
69 amrex::ParticleReal E_coll, v_coll, lab_to_COM_factor;
70
72 m1*u1x, m1*u1y, m1*u1z, m2*u2x, m2*u2y, m2*u2z, m1, m2,
73 E_coll, v_coll, lab_to_COM_factor);
74
75 using namespace amrex::literals;
76
77 const amrex::ParticleReal w_min = amrex::min(w1, w2);
78 const amrex::ParticleReal w_max = amrex::max(w1, w2);
79
80 // Compute fusion cross section as a function of kinetic energy in the center of mass frame
81 auto fusion_cross_section = amrex::ParticleReal(0.);
83 {
84 fusion_cross_section = ProtonBoronFusionCrossSection(E_coll);
85 }
87 {
88 fusion_cross_section = BoschHaleFusionCrossSection(E_coll, fusion_type, m1, m2);
89 }
90
91 // First estimate of probability to have fusion reaction
92 amrex::ParticleReal probability_estimate = multiplier_ratio * fusion_multiplier *
93 lab_to_COM_factor * w_max * fusion_cross_section * v_coll * dt / dV;
94
95 // Effective fusion multiplier
96 amrex::ParticleReal fusion_multiplier_eff = fusion_multiplier;
97
98 // If the fusion probability is too high and the fusion multiplier greater than one, we risk to
99 // systematically underestimate the fusion yield. In this case, we reduce the fusion multiplier
100 // to reduce the fusion probability
101 if (probability_estimate > probability_threshold)
102 {
103 // We aim for a fusion probability of probability_target_value but take into account
104 // the constraint that the fusion_multiplier cannot be smaller than one
105 fusion_multiplier_eff = amrex::max(fusion_multiplier *
106 probability_target_value / probability_estimate , 1._prt);
107 probability_estimate *= fusion_multiplier_eff/fusion_multiplier;
108 }
109
110 // Compute actual fusion probability that is always between zero and one
111 // In principle this is obtained by computing 1 - exp(-probability_estimate)
112 // However, the computation of this quantity can fail numerically when probability_estimate is
113 // too small (e.g. exp(-probability_estimate) returns 1 and the computation returns 0).
114 // std::expm1 is used since it maintains correctness for small exponent.
115 const amrex::ParticleReal probability = -std::expm1(-probability_estimate);
116
117 // Get a random number
118 const amrex::ParticleReal random_number = amrex::Random(engine);
119
120 // If we have a fusion event, set the mask the true and fill the product weight array
121 if (random_number < probability)
122 {
123 p_mask[pair_index] = true;
124 p_pair_reaction_weight[pair_index] = w_min/fusion_multiplier_eff;
125 }
126 else
127 {
128 p_mask[pair_index] = false;
129 }
130
131}
132#endif // WARPX_SINGLE_NUCLEAR_FUSION_EVENT_H_
#define AMREX_RESTRICT
#define AMREX_INLINE
#define AMREX_GPU_HOST_DEVICE
NuclearFusionType
Definition BinaryCollisionUtils.H:29
@ ProtonBoronToAlphas
Definition BinaryCollisionUtils.H:34
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 using the analytical fit described in A....
Definition ProtonBoronFusionCrossSection.H:140
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_real Real
amrex_particle_real ParticleReal
Real Random()
AMREX_GPU_HOST_DEVICE AMREX_INLINE bool is_two_product_fusion_type(const CollisionType collision_type)
Definition BinaryCollisionUtils.H:77
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:98
__host__ __device__ constexpr const T & min(const T &a, const T &b) noexcept
__host__ __device__ constexpr const T & max(const T &a, const T &b) noexcept