9 #ifndef WARPX_SPLIT_AND_SCATTER_FUNC_H_
10 #define WARPX_SPLIT_AND_SCATTER_FUNC_H_
60 const amrex::ParticleReal m1,
const amrex::ParticleReal m2,
64 const SmartCopy* AMREX_RESTRICT copy_species1,
65 const SmartCopy* AMREX_RESTRICT copy_species2,
66 const index_type* AMREX_RESTRICT p_pair_indices_1,
67 const index_type* AMREX_RESTRICT p_pair_indices_2,
68 const amrex::ParticleReal* AMREX_RESTRICT p_pair_reaction_weight )
const
70 using namespace amrex::literals;
81 auto const total = amrex::Scan::PrefixSum<index_type>(n_total_pairs,
92 num_added_vec[
i] =
static_cast<int>(num_added);
93 tile_products[
i]->resize(products_np[
i] + num_added);
97 const auto soa_1 = tile_products[0]->getParticleTileData();
98 const auto soa_2 = tile_products[1]->getParticleTileData();
109 soa_products.push_back(tile_products[
i]->getParticleTileData());
117 device_soa_products.
begin());
120 device_products_np.
begin());
141 const auto product1_index = products_np_data[0] +
142 (p_offsets[
i]*p_num_products_device[0] + 0);
144 copy_species1[0](soa_products_data[0], soa_1,
static_cast<int>(p_pair_indices_1[
i]),
145 static_cast<int>(product1_index), engine);
147 soa_products_data[0].m_rdata[
PIdx::w][product1_index] = p_pair_reaction_weight[
i];
149 const auto product2_index = products_np_data[1] +
150 (p_offsets[
i]*p_num_products_device[1] + 0);
152 copy_species2[1](soa_products_data[1], soa_2,
static_cast<int>(p_pair_indices_2[
i]),
153 static_cast<int>(product2_index), engine);
155 soa_products_data[1].m_rdata[
PIdx::w][product2_index] = p_pair_reaction_weight[
i];
159 -p_pair_reaction_weight[
i]);
161 -p_pair_reaction_weight[
i]);
167 #if defined(AMREX_USE_OMP)
168 #pragma omp atomic write
172 (
unsigned long long *)&idcpu,
180 if (w1[p_pair_indices_1[
i]] <= std::numeric_limits<amrex::ParticleReal>::min())
182 atomicSetIdInvalid(idcpu1[p_pair_indices_1[
i]]);
184 if (w2[p_pair_indices_2[
i]] <= std::numeric_limits<amrex::ParticleReal>::min())
186 atomicSetIdInvalid(idcpu2[p_pair_indices_2[
i]]);
190 auto& ux1 = soa_products_data[0].m_rdata[
PIdx::ux][product1_index];
191 auto& uy1 = soa_products_data[0].m_rdata[
PIdx::uy][product1_index];
192 auto& uz1 = soa_products_data[0].m_rdata[
PIdx::uz][product1_index];
193 auto& ux2 = soa_products_data[1].m_rdata[
PIdx::ux][product2_index];
194 auto& uy2 = soa_products_data[1].m_rdata[
PIdx::uy][product2_index];
195 auto& uz2 = soa_products_data[1].m_rdata[
PIdx::uz][product2_index];
200 auto const uCOM_x = (m1 * ux1 + m2 * ux2) / (m1 + m2);
201 auto const uCOM_y = (m1 * uy1 + m2 * uy2) / (m1 + m2);
202 auto const uCOM_z = (m1 * uz1 + m2 * uz2) / (m1 + m2);
215 ux1, uy1, uz1, std::sqrt(ux1*ux1 + uy1*uy1 + uz1*uz1), engine
219 ux2 = -ux1 * m1 / m2;
220 uy2 = -uy1 * m1 / m2;
221 uz2 = -uz1 * m1 / m2;
231 if (std::abs(m1 - m2) < 1e-28) {
232 auto const temp_ux = ux1;
233 auto const temp_uy = uy1;
234 auto const temp_uz = uz1;
243 amrex::Abort(
"Uneven mass charge-exchange not implemented yet.");
262 const int start_index =
int(products_np[
i]);
263 const int stop_index =
int(products_np[
i] + num_added_vec[
i]);
266 pc_products[
i]->getUserRealAttribs(), pc_products[
i]->getUserIntAttribs(),
267 pc_products[
i]->getParticleComps(), pc_products[
i]->getParticleiComps(),
268 pc_products[
i]->getUserRealAttribParser(),
269 pc_products[
i]->getUserIntAttribParser(),
273 pc_products[
i]->get_breit_wheeler_engine_ptr(),
274 pc_products[
i]->get_quantum_sync_engine_ptr(),
276 pc_products[
i]->getIonizationInitialLevel(),
277 start_index, stop_index);
281 return num_added_vec;
CollisionType
Definition: BinaryCollisionUtils.H:17
Definition: MultiParticleContainer.H:66
This class defines an operator to create product particles from DSMC collisions and sets the particle...
Definition: SplitAndScatterFunc.H:23
AMREX_INLINE amrex::Vector< int > operator()(const index_type &n_total_pairs, const SoaData_type &, const SoaData_type &, const amrex::Vector< WarpXParticleContainer * > &pc_products, ParticleTileType **AMREX_RESTRICT tile_products, const amrex::ParticleReal m1, const amrex::ParticleReal m2, const amrex::Vector< amrex::ParticleReal > &, const index_type *AMREX_RESTRICT mask, const amrex::Vector< index_type > &products_np, const SmartCopy *AMREX_RESTRICT copy_species1, const SmartCopy *AMREX_RESTRICT copy_species2, 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) const
Function that performs the particle scattering and injection due to binary collisions.
Definition: SplitAndScatterFunc.H:54
typename ParticleBins::index_type index_type
Definition: SplitAndScatterFunc.H:29
typename ParticleTileType::ParticleTileDataType ParticleTileDataType
Definition: SplitAndScatterFunc.H:27
int m_num_product_species
Definition: SplitAndScatterFunc.H:286
SplitAndScatterFunc()=default
Default constructor of the SplitAndScatterFunc class.
typename WarpXParticleContainer::ParticleType ParticleType
Definition: SplitAndScatterFunc.H:25
CollisionType m_collision_type
Definition: SplitAndScatterFunc.H:292
typename WarpXParticleContainer::ParticleTileType::ParticleTileDataType SoaData_type
Definition: SplitAndScatterFunc.H:30
typename WarpXParticleContainer::ParticleTileType ParticleTileType
Definition: SplitAndScatterFunc.H:26
amrex::Gpu::HostVector< int > m_num_products_host
Definition: SplitAndScatterFunc.H:291
amrex::Gpu::DeviceVector< int > m_num_products_device
Definition: SplitAndScatterFunc.H:290
iterator begin() noexcept
ParticleTile< ParticleType, NArrayReal, NArrayInt, Allocator > ParticleTileType
T_ParticleType ParticleType
void DefaultInitializeRuntimeAttributes(PTile &ptile, const int n_external_attr_real, const int n_external_attr_int, const std::vector< std::string > &user_real_attribs, const std::vector< std::string > &user_int_attribs, const std::map< std::string, int > &particle_comps, const std::map< std::string, int > &particle_icomps, const std::vector< amrex::Parser * > &user_real_attrib_parser, const std::vector< amrex::Parser * > &user_int_attrib_parser, const bool do_qed_comps, BreitWheelerEngine *p_bw_engine, QuantumSynchrotronEngine *p_qs_engine, const int ionization_initial_level, int start, int stop)
Default initialize runtime attributes in a tile. This routine does not initialize the first n_externa...
Definition: DefaultInitialization.H:118
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:162
typename ParticleTileType::ParticleTileDataType ParticleTileDataType
Definition: ParticleUtils.cpp:33
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE T Exch(T *address, T val) noexcept
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void AddNoRet(T *sum, T value) noexcept
void synchronize() noexcept
void copyAsync(HostToDevice, InIter begin, InIter end, OutIter result) noexcept
static constexpr HostToDevice hostToDevice
void streamSynchronize() noexcept
constexpr std::uint64_t Invalid
static constexpr struct amrex::Scan::Type::Exclusive exclusive
static constexpr RetSum retSum
void Abort(const std::string &msg)
AMREX_ATTRIBUTE_FLATTEN_FOR void ParallelForRNG(T n, L const &f) noexcept
i
Definition: check_interp_points_and_weights.py:174
@ uz
Definition: NamedComponentParticleContainer.H:34
@ w
weight
Definition: NamedComponentParticleContainer.H:33
@ uy
Definition: NamedComponentParticleContainer.H:34
@ ux
Definition: NamedComponentParticleContainer.H:34
This is a functor for performing a "smart copy" that works in both host and device code.
Definition: SmartCopy.H:34
ParticleTileData< StorageParticleType, NArrayReal, NArrayInt > ParticleTileDataType