WarpX
Loading...
Searching...
No Matches
NuclearFusionFunc.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_NUCLEAR_FUSION_FUNC_H_
9#define WARPX_NUCLEAR_FUSION_FUNC_H_
10
12
18#include "Utils/TextMsg.H"
19
20#include <AMReX_Algorithm.H>
21#include <AMReX_DenseBins.H>
22#include <AMReX_ParmParse.H>
23#include <AMReX_Random.H>
24#include <AMReX_REAL.H>
25#include <AMReX_Vector.H>
26
36{
37 // Define shortcuts for frequently-used type names
40 using ParticleTileDataType = ParticleTileType::ParticleTileDataType;
43 using SoaData_type = WarpXParticleContainer::ParticleTileType::ParticleTileDataType;
44
45public:
49 NuclearFusionFunc () = default;
50
58 NuclearFusionFunc (const std::string& collision_name, MultiParticleContainer const * const mypc,
59 const bool isSameSpecies):
60 m_fusion_multiplier{amrex::ParticleReal{1.0}}, // default fusion multiplier
61 m_probability_threshold{amrex::ParticleReal{0.02}}, // default fusion probability threshold
62 m_probability_target_value{amrex::ParticleReal{0.002}}, // default fusion probability target_value
63 m_fusion_type{BinaryCollisionUtils::get_nuclear_fusion_type(collision_name, mypc)},
64 m_isSameSpecies{isSameSpecies}
65 {
66
67#ifdef AMREX_SINGLE_PRECISION_PARTICLES
68 WARPX_ABORT_WITH_MESSAGE("Nuclear fusion module does not currently work with single precision");
69#endif
70
71 const amrex::ParmParse pp_collision_name(collision_name);
73 pp_collision_name, "event_multiplier", m_fusion_multiplier);
75 pp_collision_name, "probability_threshold", m_probability_threshold);
77 pp_collision_name, "probability_target_value",
79
80 m_exe.m_fusion_multiplier = m_fusion_multiplier;
81 m_exe.m_probability_threshold = m_probability_threshold;
82 m_exe.m_probability_target_value = m_probability_target_value;
83 m_exe.m_fusion_type = m_fusion_type;
84 m_exe.m_isSameSpecies = m_isSameSpecies;
85 }
86
87 struct Executor {
127 index_type const I1s, index_type const I1e,
128 index_type const I2s, index_type const I2e,
129 index_type const* AMREX_RESTRICT I1,
130 index_type const* AMREX_RESTRICT I2,
131 const SoaData_type& soa_1, const SoaData_type& soa_2,
132 GetParticlePosition<PIdx> /*get_position_1*/, GetParticlePosition<PIdx> /*get_position_2*/,
133 amrex::ParticleReal const /*n1*/, amrex::ParticleReal const /*n2*/,
134 amrex::ParticleReal const /*T1*/, amrex::ParticleReal const /*T2*/,
135 amrex::Real const /*global_lamdb*/,
136 amrex::ParticleReal const /*q1*/, amrex::ParticleReal const /*q2*/,
137 amrex::ParticleReal const m1, amrex::ParticleReal const m2,
138 amrex::Real const dt, amrex::Real const dV, index_type coll_idx,
139 index_type const cell_start_pair, index_type* AMREX_RESTRICT p_mask,
140 index_type* AMREX_RESTRICT p_pair_indices_1, index_type* AMREX_RESTRICT p_pair_indices_2,
141 amrex::ParticleReal* AMREX_RESTRICT p_pair_reaction_weight,
142 amrex::ParticleReal* /*p_product_data*/,
143 amrex::RandomEngine const& engine) const
144 {
145 amrex::ParticleReal * const AMREX_RESTRICT w1 = soa_1.m_rdata[PIdx::w];
146 amrex::ParticleReal * const AMREX_RESTRICT u1x = soa_1.m_rdata[PIdx::ux];
147 amrex::ParticleReal * const AMREX_RESTRICT u1y = soa_1.m_rdata[PIdx::uy];
148 amrex::ParticleReal * const AMREX_RESTRICT u1z = soa_1.m_rdata[PIdx::uz];
149 uint64_t* AMREX_RESTRICT idcpu1 = soa_1.m_idcpu;
150
151 amrex::ParticleReal * const AMREX_RESTRICT w2 = soa_2.m_rdata[PIdx::w];
152 amrex::ParticleReal * const AMREX_RESTRICT u2x = soa_2.m_rdata[PIdx::ux];
153 amrex::ParticleReal * const AMREX_RESTRICT u2y = soa_2.m_rdata[PIdx::uy];
154 amrex::ParticleReal * const AMREX_RESTRICT u2z = soa_2.m_rdata[PIdx::uz];
155 uint64_t* AMREX_RESTRICT idcpu2 = soa_2.m_idcpu;
156
157 // Number of macroparticles of each species
158 const index_type NI1 = I1e - I1s;
159 const index_type NI2 = I2e - I2s;
160 const index_type max_N = amrex::max(NI1,NI2);
161 const index_type min_N = amrex::min(NI1,NI2);
162
163 index_type pair_index = cell_start_pair + coll_idx;
164
165 // multiplier ratio to take into account unsampled pairs
166 const auto multiplier_ratio = static_cast<int>(
167 m_isSameSpecies ? min_N + max_N - 1 : min_N);
168
169 index_type i1 = I1s + coll_idx;
170 index_type i2 = I2s + coll_idx;
171 // we will start from collision number = coll_idx and then add
172 // stride (smaller set size) until we do all collisions (larger set size)
173 for (index_type k = coll_idx; k < max_N; k += min_N)
174 {
175
176 // do not check for collision if a particle's weight was
177 // reduced to zero from a previous collision
178 if (idcpu1[ I1[i1] ]==amrex::ParticleIdCpus::Invalid ||
179 idcpu2[ I2[i2] ]==amrex::ParticleIdCpus::Invalid ) {
180 p_mask[pair_index] = false;
181 }
182 else {
183
185 u1x[ I1[i1] ], u1y[ I1[i1] ], u1z[ I1[i1] ],
186 u2x[ I2[i2] ], u2y[ I2[i2] ], u2z[ I2[i2] ],
187 m1, m2, w1[ I1[i1] ], w2[ I2[i2] ],
188 dt, dV, static_cast<int>(pair_index), p_mask, p_pair_reaction_weight,
189 m_fusion_multiplier, multiplier_ratio,
192 m_fusion_type, engine);
193
194 // Remove pair reaction weight from the colliding particles' weights
195 if (p_mask[pair_index]) {
197 w1[ I1[i1] ], idcpu1[ I1[i1] ], p_pair_reaction_weight[pair_index]);
199 w2[ I2[i2] ], idcpu2[ I2[i2] ], p_pair_reaction_weight[pair_index]);
200 }
201
202 }
203
204 p_pair_indices_1[pair_index] = I1[i1];
205 p_pair_indices_2[pair_index] = I2[i2];
206 if (max_N == NI1) { i1 += min_N; }
207 if (max_N == NI2) { i2 += min_N; }
208 pair_index += min_N;
209 }
210 }
211
220 };
221
222 [[nodiscard]] Executor const& executor () const { return m_exe; }
223
224 bool use_global_debye_length() { return false; }
225
226private:
227 // Factor used to increase the number of fusion reaction by decreasing the weight of the
228 // produced particles
230 // If the fusion multiplier is too high and results in a fusion probability that approaches
231 // 1, there is a risk of underestimating the total fusion yield. In these cases, we reduce
232 // the fusion multiplier used in a given collision. m_probability_threshold is the fusion
233 // probability threshold above which we reduce the fusion multiplier.
234 // m_probability_target_value is the target probability used to determine by how much
235 // the fusion multiplier should be reduced.
240
242};
243
244#endif // WARPX_NUCLEAR_FUSION_FUNC_H_
#define AMREX_RESTRICT
#define AMREX_INLINE
#define AMREX_GPU_HOST_DEVICE
NuclearFusionType
Definition BinaryCollisionUtils.H:29
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
#define WARPX_ABORT_WITH_MESSAGE(MSG)
Definition TextMsg.H:15
Definition MultiParticleContainer.H:69
NuclearFusionFunc(const std::string &collision_name, MultiParticleContainer const *const mypc, const bool isSameSpecies)
Constructor of the NuclearFusionFunc class.
Definition NuclearFusionFunc.H:58
NuclearFusionFunc()=default
Default constructor of the NuclearFusionFunc class.
amrex::ParticleReal m_fusion_multiplier
Definition NuclearFusionFunc.H:229
bool m_isSameSpecies
Definition NuclearFusionFunc.H:239
WarpXParticleContainer::ParticleTileType ParticleTileType
Definition NuclearFusionFunc.H:39
amrex::DenseBins< ParticleTileDataType > ParticleBins
Definition NuclearFusionFunc.H:41
WarpXParticleContainer::ParticleType ParticleType
Definition NuclearFusionFunc.H:38
ParticleBins::index_type index_type
Definition NuclearFusionFunc.H:42
amrex::ParticleReal m_probability_threshold
Definition NuclearFusionFunc.H:236
WarpXParticleContainer::ParticleTileType::ParticleTileDataType SoaData_type
Definition NuclearFusionFunc.H:43
Executor m_exe
Definition NuclearFusionFunc.H:241
amrex::ParticleReal m_probability_target_value
Definition NuclearFusionFunc.H:237
Executor const & executor() const
Definition NuclearFusionFunc.H:222
bool use_global_debye_length()
Definition NuclearFusionFunc.H:224
NuclearFusionType m_fusion_type
Definition NuclearFusionFunc.H:238
ParticleTileType::ParticleTileDataType ParticleTileDataType
Definition NuclearFusionFunc.H:40
std::conditional_t< is_rtsoa_pc, ParticleTileRT< typename ParticleType::RealType, typename ParticleType::IntType >, ParticleTile< ParticleType, NArrayReal, NArrayInt, Allocator > > ParticleTileType
amrex_real Real
amrex_particle_real ParticleReal
Definition BinaryCollisionUtils.cpp:23
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:193
constexpr std::uint64_t Invalid
__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
int queryWithParser(const amrex::ParmParse &a_pp, char const *const str, T &val)
Definition ParserUtils.H:102
Functor that can be used to extract the positions of the macroparticles inside a ParallelFor kernel.
Definition GetAndSetPosition.H:75
Definition NuclearFusionFunc.H:87
NuclearFusionType m_fusion_type
Definition NuclearFusionFunc.H:215
amrex::ParticleReal m_probability_target_value
Definition NuclearFusionFunc.H:214
bool m_computeSpeciesTemperatures
Definition NuclearFusionFunc.H:217
bool m_computeSpeciesDensities
Definition NuclearFusionFunc.H:216
bool m_isSameSpecies
Definition NuclearFusionFunc.H:219
amrex::ParticleReal m_probability_threshold
Definition NuclearFusionFunc.H:213
AMREX_GPU_HOST_DEVICE AMREX_INLINE void operator()(index_type const I1s, index_type const I1e, index_type const I2s, index_type const I2e, index_type const *AMREX_RESTRICT I1, index_type const *AMREX_RESTRICT I2, const SoaData_type &soa_1, const SoaData_type &soa_2, GetParticlePosition< PIdx >, GetParticlePosition< PIdx >, amrex::ParticleReal const, amrex::ParticleReal const, amrex::ParticleReal const, amrex::ParticleReal const, amrex::Real const, amrex::ParticleReal const, amrex::ParticleReal const, amrex::ParticleReal const m1, amrex::ParticleReal const m2, amrex::Real const dt, amrex::Real const dV, index_type coll_idx, index_type const cell_start_pair, index_type *AMREX_RESTRICT p_mask, index_type *AMREX_RESTRICT p_pair_indices_1, index_type *AMREX_RESTRICT p_pair_indices_2, amrex::ParticleReal *AMREX_RESTRICT p_pair_reaction_weight, amrex::ParticleReal *, amrex::RandomEngine const &engine) const
Executor of the NuclearFusionFunc class. Performs nuclear fusions at the cell level using the algorit...
Definition NuclearFusionFunc.H:126
bool m_need_product_data
Definition NuclearFusionFunc.H:218
amrex::ParticleReal m_fusion_multiplier
Definition NuclearFusionFunc.H:212
@ uz
Definition WarpXParticleContainer.H:70
@ w
Definition WarpXParticleContainer.H:70
@ uy
Definition WarpXParticleContainer.H:70
@ ux
Definition WarpXParticleContainer.H:70