8 #ifndef NUCLEAR_FUSION_FUNC_H_
9 #define NUCLEAR_FUSION_FUNC_H_
59 using namespace amrex::literals;
61 #ifdef AMREX_SINGLE_PRECISION_PARTICLES
62 amrex::Abort(
"Nuclear fusion module does not currently work with single precision");
79 pp_collision_name,
"fusion_probability_target_value",
127 amrex::ParticleReal
const , amrex::ParticleReal
const ,
128 amrex::ParticleReal
const m1, amrex::ParticleReal
const m2,
129 amrex::Real
const dt, amrex::Real
const dV,
132 amrex::ParticleReal* AMREX_RESTRICT p_pair_reaction_weight,
147 const int NI1 = I1e - I1s;
148 const int NI2 = I2e - I2s;
153 int pair_index = cell_start_pair;
164 int multiplier_ratio;
167 multiplier_ratio = 2*max_N - 1;
171 multiplier_ratio = max_N;
174 #if (defined WARPX_DIM_RZ)
179 for (
int k = 0; k < max_N; ++k)
183 const int c1k = (k%NI1 < max_N%NI1) ? c1 + 1: c1;
184 const int c2k = (k%NI2 < max_N%NI2) ? c2 + 1: c2;
186 #if (defined WARPX_DIM_RZ)
195 amrex::ParticleReal
const theta = theta2[I2[i2]]-theta1[I1[i1]];
196 amrex::ParticleReal
const u1xbuf = u1x[I1[i1]];
197 u1x[I1[i1]] = u1xbuf*std::cos(theta) - u1y[I1[i1]]*std::sin(theta);
198 u1y[I1[i1]] = u1xbuf*std::sin(theta) + u1y[I1[i1]]*std::cos(theta);
202 u1x[ I1[i1] ], u1y[ I1[i1] ], u1z[ I1[i1] ],
203 u2x[ I2[i2] ], u2y[ I2[i2] ], u2z[ I2[i2] ],
204 m1, m2, w1[ I1[i1] ]/c1k, w2[ I2[i2] ]/c2k,
205 dt, dV, pair_index, p_mask, p_pair_reaction_weight,
211 #if (defined WARPX_DIM_RZ)
212 amrex::ParticleReal
const u1xbuf_new = u1x[I1[i1]];
213 u1x[I1[i1]] = u1xbuf_new*std::cos(-theta) - u1y[I1[i1]]*std::sin(-theta);
214 u1y[I1[i1]] = u1xbuf_new*std::sin(-theta) + u1y[I1[i1]]*std::cos(-theta);
217 p_pair_indices_1[pair_index] = I1[i1];
218 p_pair_indices_2[pair_index] = I2[i2];
219 ++i1;
if ( i1 ==
static_cast<int>(I1e) ) { i1 = I1s; }
220 ++i2;
if ( i2 ==
static_cast<int>(I2e) ) { i2 = I2s; }
#define AMREX_GPU_HOST_DEVICE
NuclearFusionType
Definition: BinaryCollisionUtils.H:22
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
Definition: MultiParticleContainer.H:65
This functor does binary nuclear fusions on a single cell. Particles of the two reacting species are ...
Definition: NuclearFusionFunc.H:36
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::ParticleType ParticleType
Definition: NuclearFusionFunc.H:38
ParticleBins::index_type index_type
Definition: NuclearFusionFunc.H:40
amrex::ParticleReal m_probability_threshold
Definition: NuclearFusionFunc.H:236
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, SoaData_type soa_1, SoaData_type soa_2, GetParticlePosition, GetParticlePosition, amrex::ParticleReal const, amrex::ParticleReal const, amrex::ParticleReal const m1, amrex::ParticleReal const m2, amrex::Real const dt, amrex::Real const dV, 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::RandomEngine const &engine) const
operator() of the NuclearFusionFunc class. Performs nuclear fusions at the cell level using the algor...
Definition: NuclearFusionFunc.H:120
amrex::ParticleReal m_probability_target_value
Definition: NuclearFusionFunc.H:237
NuclearFusionFunc(const std::string collision_name, MultiParticleContainer const *const mypc, const bool isSameSpecies)
Constructor of the NuclearFusionFunc class.
Definition: NuclearFusionFunc.H:56
NuclearFusionType m_fusion_type
Definition: NuclearFusionFunc.H:238
T_ParticleType ParticleType
NuclearFusionType get_nuclear_fusion_type(const std::string collision_name, MultiParticleContainer const *const mypc)
Definition: BinaryCollisionUtils.cpp:20
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE constexpr const T & max(const T &a, const T &b) noexcept
void Abort(const std::string &msg)
int dt
Definition: stencil.py:440
int queryWithParser(const amrex::ParmParse &a_pp, char const *const str, T &val)
Definition: ParserUtils.H:118
Functor that can be used to extract the positions of the macroparticles inside a ParallelFor kernel.
Definition: GetAndSetPosition.H:53
@ theta
RZ needs all three position components.
Definition: NamedComponentParticleContainer.H:27
@ uz
Definition: NamedComponentParticleContainer.H:25
@ w
weight
Definition: NamedComponentParticleContainer.H:24
@ uy
Definition: NamedComponentParticleContainer.H:25
@ ux
Definition: NamedComponentParticleContainer.H:25
GpuArray< ParticleReal *, NAR > m_rdata
ParticleTileData< StorageParticleType, NArrayReal, NArrayInt > ParticleTileDataType