9 #ifndef SPLIT_AND_SCATTER_FUNC_H_
10 #define SPLIT_AND_SCATTER_FUNC_H_
20 template <
typename index_type,
typename Tile,
typename Index,
typename CopyFunc,
24 Tile& ptile1, Tile& ptile2,
25 const Index* AMREX_RESTRICT mask,
26 CopyFunc&& copy1, CopyFunc&& copy2,
27 const amrex::ParticleReal m1,
const amrex::ParticleReal m2,
28 const index_type* AMREX_RESTRICT p_pair_indices_1,
29 const index_type* AMREX_RESTRICT p_pair_indices_2,
30 const amrex::ParticleReal* AMREX_RESTRICT p_pair_reaction_weight ) noexcept
32 using namespace amrex;
34 if (n_total_pairs == 0) {
44 auto const num_added = amrex::Scan::PrefixSum<Index>(n_total_pairs,
50 const auto ptile1_index = ptile1.numParticles();
51 const auto ptile2_index = ptile2.numParticles();
52 ptile1.resize(ptile1_index + num_added);
53 ptile2.resize(ptile2_index + num_added);
55 const auto ptile1_data = ptile1.getParticleTileData();
56 const auto ptile2_data = ptile2.getParticleTileData();
58 const Long minus_one_long = -1;
66 copy1(ptile1_data, ptile1_data, p_pair_indices_1[
i], p_offsets[
i] + ptile1_index, engine);
67 copy2(ptile2_data, ptile2_data, p_pair_indices_2[
i], p_offsets[
i] + ptile2_index, engine);
71 auto& w1 = ptile1_data.m_rdata[
PIdx::w][p_pair_indices_1[
i]];
72 auto& w2 = ptile2_data.m_rdata[
PIdx::w][p_pair_indices_2[
i]];
79 auto& p = ptile1_data.m_aos[p_pair_indices_1[
i]];
80 p.atomicSetID(minus_one_long);
85 auto& p = ptile2_data.m_aos[p_pair_indices_2[
i]];
86 p.atomicSetID(minus_one_long);
90 ptile1_data.m_rdata[
PIdx::w][p_offsets[
i] + ptile1_index] = p_pair_reaction_weight[
i];
91 ptile2_data.m_rdata[
PIdx::w][p_offsets[
i] + ptile2_index] = p_pair_reaction_weight[
i];
93 auto& ux1 = ptile1_data.m_rdata[
PIdx::ux][p_offsets[
i] + ptile1_index];
94 auto& uy1 = ptile1_data.m_rdata[
PIdx::uy][p_offsets[
i] + ptile1_index];
95 auto& uz1 = ptile1_data.m_rdata[
PIdx::uz][p_offsets[
i] + ptile1_index];
96 auto& ux2 = ptile2_data.m_rdata[
PIdx::ux][p_offsets[
i] + ptile2_index];
97 auto& uy2 = ptile2_data.m_rdata[
PIdx::uy][p_offsets[
i] + ptile2_index];
98 auto& uz2 = ptile2_data.m_rdata[
PIdx::uz][p_offsets[
i] + ptile2_index];
103 auto const uCOM_x = (m1 * ux1 + m2 * ux2) / (m1 + m2);
104 auto const uCOM_y = (m1 * uy1 + m2 * uy2) / (m1 + m2);
105 auto const uCOM_z = (m1 * uz1 + m2 * uz2) / (m1 + m2);
118 ux1, uy1, uz1, std::sqrt(ux1*ux1 + uy1*uy1 + uz1*uz1), engine
122 ux2 = -ux1 * m1 / m2;
123 uy2 = -uy1 * m1 / m2;
124 uz2 = -uz1 * m1 / m2;
135 auto const temp_ux = ux1;
136 auto const temp_uy = uy1;
137 auto const temp_uz = uz1;
146 Abort(
"Uneven mass charge-exchange not implemented yet.");
150 Abort(
"Unknown scattering process.");
163 return static_cast<int>(num_added);
int splitScatteringParticles(const index_type &n_total_pairs, Tile &ptile1, Tile &ptile2, const Index *AMREX_RESTRICT mask, CopyFunc &©1, CopyFunc &©2, const amrex::ParticleReal m1, const amrex::ParticleReal m2, const index_type *AMREX_RESTRICT p_pair_indices_1, const index_type *AMREX_RESTRICT p_pair_indices_2, const amrex::ParticleReal *AMREX_RESTRICT p_pair_reaction_weight) noexcept
Function that performs the particle scattering and injection due to binary collisions.
Definition: SplitAndScatterFunc.H:22
AMREX_GPU_HOST_DEVICE AMREX_INLINE void RandomizeVelocity(amrex::ParticleReal &ux, amrex::ParticleReal &uy, amrex::ParticleReal &uz, const amrex::ParticleReal vp, amrex::RandomEngine const &engine)
Function to perform scattering of a particle that results in a random velocity vector with given magn...
Definition: ParticleUtils.H:161
ParticleBins::index_type index_type
Definition: ParticleUtils.cpp:32
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void AddNoRet(T *sum, T value) noexcept
void synchronize() noexcept
static constexpr struct amrex::Scan::Type::Exclusive exclusive
static constexpr RetSum retSum
void ParallelForRNG(T n, L &&f) noexcept
typename std::enable_if< B, T >::type EnableIf_t
void Abort(const std::string &msg)
i
Definition: check_interp_points_and_weights.py:174
s
Definition: plot_results.py:104
@ uz
Definition: NamedComponentParticleContainer.H:27
@ w
weight
Definition: NamedComponentParticleContainer.H:26
@ uy
Definition: NamedComponentParticleContainer.H:27
@ ux
Definition: NamedComponentParticleContainer.H:27