9 #ifndef WARPX_SPLIT_AND_SCATTER_FUNC_H_
10 #define WARPX_SPLIT_AND_SCATTER_FUNC_H_
58 const amrex::ParticleReal m1,
const amrex::ParticleReal m2,
62 const SmartCopy* AMREX_RESTRICT copy_species1,
63 const SmartCopy* AMREX_RESTRICT copy_species2,
64 const index_type* AMREX_RESTRICT p_pair_indices_1,
65 const index_type* AMREX_RESTRICT p_pair_indices_2,
66 const amrex::ParticleReal* AMREX_RESTRICT p_pair_reaction_weight )
const
68 using namespace amrex::literals;
79 auto const total = amrex::Scan::PrefixSum<index_type>(n_total_pairs,
90 num_added_vec[
i] =
static_cast<int>(num_added);
91 tile_products[
i]->resize(products_np[
i] + num_added);
94 const auto soa_1 = ptile1.getParticleTileData();
95 const auto soa_2 = ptile2.getParticleTileData();
106 soa_products.push_back(tile_products[
i]->getParticleTileData());
114 device_soa_products.
begin());
117 device_products_np.
begin());
138 const auto product1_index = products_np_data[0] +
139 (p_offsets[
i]*p_num_products_device[0] + 0);
141 copy_species1[0](soa_products_data[0], soa_1,
static_cast<int>(p_pair_indices_1[
i]),
142 static_cast<int>(product1_index), engine);
144 soa_products_data[0].m_rdata[
PIdx::w][product1_index] = p_pair_reaction_weight[
i];
146 const auto product2_index = products_np_data[1] +
147 (p_offsets[
i]*p_num_products_device[1] + 0);
149 copy_species2[1](soa_products_data[1], soa_2,
static_cast<int>(p_pair_indices_2[
i]),
150 static_cast<int>(product2_index), engine);
152 soa_products_data[1].m_rdata[
PIdx::w][product2_index] = p_pair_reaction_weight[
i];
156 w1[p_pair_indices_1[
i]], idcpu1[p_pair_indices_1[
i]], p_pair_reaction_weight[
i]);
158 w2[p_pair_indices_2[
i]], idcpu2[p_pair_indices_2[
i]], p_pair_reaction_weight[
i]);
161 auto& ux1 = soa_products_data[0].m_rdata[
PIdx::ux][product1_index];
162 auto& uy1 = soa_products_data[0].m_rdata[
PIdx::uy][product1_index];
163 auto& uz1 = soa_products_data[0].m_rdata[
PIdx::uz][product1_index];
164 auto& ux2 = soa_products_data[1].m_rdata[
PIdx::ux][product2_index];
165 auto& uy2 = soa_products_data[1].m_rdata[
PIdx::uy][product2_index];
166 auto& uz2 = soa_products_data[1].m_rdata[
PIdx::uz][product2_index];
171 auto const uCOM_x = (m1 * ux1 + m2 * ux2) / (m1 + m2);
172 auto const uCOM_y = (m1 * uy1 + m2 * uy2) / (m1 + m2);
173 auto const uCOM_z = (m1 * uz1 + m2 * uz2) / (m1 + m2);
186 ux1, uy1, uz1, std::sqrt(ux1*ux1 + uy1*uy1 + uz1*uz1), engine
190 ux2 = -ux1 * m1 / m2;
191 uy2 = -uy1 * m1 / m2;
192 uz2 = -uz1 * m1 / m2;
202 if (std::abs(m1 - m2) < 1e-28) {
203 auto const temp_ux = ux1;
204 auto const temp_uy = uy1;
205 auto const temp_uz = uz1;
214 amrex::Abort(
"Uneven mass charge-exchange not implemented yet.");
233 const int start_index =
int(products_np[
i]);
234 const int stop_index =
int(products_np[
i] + num_added_vec[
i]);
237 pc_products[
i]->getUserRealAttribs(), pc_products[
i]->getUserIntAttribs(),
238 pc_products[
i]->getParticleComps(), pc_products[
i]->getParticleiComps(),
239 pc_products[
i]->getUserRealAttribParser(),
240 pc_products[
i]->getUserIntAttribParser(),
244 pc_products[
i]->get_breit_wheeler_engine_ptr(),
245 pc_products[
i]->get_quantum_sync_engine_ptr(),
247 pc_products[
i]->getIonizationInitialLevel(),
248 start_index, stop_index);
252 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, ParticleTileType &ptile1, ParticleTileType &ptile2, 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:53
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:257
SplitAndScatterFunc()=default
Default constructor of the SplitAndScatterFunc class.
typename WarpXParticleContainer::ParticleType ParticleType
Definition: SplitAndScatterFunc.H:25
CollisionType m_collision_type
Definition: SplitAndScatterFunc.H:263
typename WarpXParticleContainer::ParticleTileType ParticleTileType
Definition: SplitAndScatterFunc.H:26
amrex::Gpu::HostVector< int > m_num_products_host
Definition: SplitAndScatterFunc.H:262
amrex::Gpu::DeviceVector< int > m_num_products_device
Definition: SplitAndScatterFunc.H:261
iterator begin() noexcept
ParticleTile< ParticleType, NArrayReal, NArrayInt, Allocator > ParticleTileType
T_ParticleType ParticleType
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:135
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
void synchronize() noexcept
void copyAsync(HostToDevice, InIter begin, InIter end, OutIter result) noexcept
static constexpr HostToDevice hostToDevice
void streamSynchronize() noexcept
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