8#ifndef WARPX_PARTICLE_CREATION_FUNC_H_
9#define WARPX_PARTICLE_CREATION_FUNC_H_
42 using SoaData_type =
typename WarpXParticleContainer::ParticleTileType::ParticleTileDataType;
132 const int products_per_reactant_factor =
138 num_added_vec[i] =
static_cast<int>(num_added);
139 tile_products[i]->resize(products_np[i] + num_added);
142 const auto soa_1 = ptile1.getParticleTileData();
143 const auto soa_2 = ptile2.getParticleTileData();
149 soa_products.push_back(tile_products[i]->getParticleTileData());
157 device_soa_products.
begin());
160 device_products_np.
begin());
163 device_products_mass.
begin());
184 for (
int j = 0; j < t_num_product_species; j++)
186 for (
int k = 0; k < p_num_products_device[j]; k++)
192 const auto product_index = products_np_data[j] +
193 (p_offsets[i]*p_num_products_device[j] + k);
196 copy_species1[j](soa_products_data[j], soa_1,
197 static_cast<int>(p_pair_indices_1[i]),
198 static_cast<int>(product_index), engine);
202 copy_species2[j](soa_products_data[j], soa_2,
203 static_cast<int>(p_pair_indices_2[i]),
204 static_cast<int>(product_index), engine);
206 soa_products_data[j].m_rdata[
PIdx::w][product_index] =
207 p_pair_reaction_weight[i];
212 const auto product_index = products_np_data[j] +
213 2*(p_offsets[i]*p_num_products_device[j] + k);
214 copy_species1[j](soa_products_data[j], soa_1,
215 static_cast<int>(p_pair_indices_1[i]),
216 static_cast<int>(product_index), engine);
217 copy_species2[j](soa_products_data[j], soa_2,
218 static_cast<int>(p_pair_indices_2[i]),
219 static_cast<int>(product_index + 1), engine);
220 soa_products_data[j].m_rdata[
PIdx::w][product_index] =
222 soa_products_data[j].m_rdata[
PIdx::w][product_index + 1] =
232 const index_type product_start_index = products_np_data[0] + 2*p_offsets[i]*
233 p_num_products_device[0];
234 ProtonBoronFusionInitializeMomentum(soa_1, soa_2, soa_products_data[0],
235 p_pair_indices_1[i], p_pair_indices_2[i],
236 product_start_index, m1, m2,
237 t_scattering_angle_model, engine);
244 TwoProductFusionInitializeMomentum(soa_1, soa_2,
245 soa_products_data[0], soa_products_data[1],
246 p_pair_indices_1[i], p_pair_indices_2[i],
247 products_np_data[0] + 2*p_offsets[i]*p_num_products_device[0],
248 products_np_data[1] + 2*p_offsets[i]*p_num_products_device[1],
249 m1, m2, products_mass_data[0], products_mass_data[1], fusion_energy,
250 t_scattering_angle_model, engine);
253 LinearBreitWheelerInitializeMomentum(soa_1, soa_2,
254 soa_products_data[0], soa_products_data[1],
255 p_pair_indices_1[i], p_pair_indices_2[i],
256 products_np_data[0] + 2*p_offsets[i]*p_num_products_device[0],
257 products_np_data[1] + 2*p_offsets[i]*p_num_products_device[1],
261 LinearComptonInitializeMomentum(soa_1, soa_2,
262 soa_products_data[0], soa_products_data[1],
263 p_pair_indices_1[i], p_pair_indices_2[i],
264 products_np_data[0] + p_offsets[i]*p_num_products_device[0],
265 products_np_data[1] + p_offsets[i]*p_num_products_device[1],
274 const auto start_index =
int(products_np[i]);
275 const auto stop_index =
int(products_np[i] + num_added_vec[i]);
277 *pc_products[i], start_index, stop_index);
282 return num_added_vec;
309 using SoaData_type =
typename WarpXParticleContainer::ParticleTileType::ParticleTileDataType;
CollisionType
Definition BinaryCollisionUtils.H:17
@ LinearBreitWheeler
Definition BinaryCollisionUtils.H:25
@ ProtonBoronToAlphasFusion
Definition BinaryCollisionUtils.H:21
@ LinearCompton
Definition BinaryCollisionUtils.H:26
ScatteringAngleModel
For binary collision algorithms, the strategy to determine the scattering angle in the center of mass...
Definition WarpXAlgorithmSelection.H:198
@ Default
Definition WarpXAlgorithmSelection.H:198
Definition MultiParticleContainer.H:69
typename WarpXParticleContainer::ParticleType ParticleType
Definition ParticleCreationFunc.H:304
NoParticleCreationFunc(const std::string &, MultiParticleContainer const *const)
Definition ParticleCreationFunc.H:314
AMREX_INLINE amrex::Vector< int > operator()(const index_type &, ParticleTileType &, ParticleTileType &, amrex::Vector< WarpXParticleContainer * > &, ParticleTileType **, const amrex::ParticleReal &, const amrex::ParticleReal &, const amrex::Vector< amrex::ParticleReal > &, const index_type *, const amrex::Vector< index_type > &, const SmartCopy *, const SmartCopy *, const index_type *, const index_type *, const amrex::ParticleReal *, const amrex::ParticleReal *AMREX_RESTRICT) const
Definition ParticleCreationFunc.H:318
typename ParticleBins::index_type index_type
Definition ParticleCreationFunc.H:308
NoParticleCreationFunc()=default
amrex::DenseBins< ParticleTileDataType > ParticleBins
Definition ParticleCreationFunc.H:307
typename WarpXParticleContainer::ParticleTileType ParticleTileType
Definition ParticleCreationFunc.H:305
typename ParticleTileType::ParticleTileDataType ParticleTileDataType
Definition ParticleCreationFunc.H:306
typename WarpXParticleContainer::ParticleTileType::ParticleTileDataType SoaData_type
Definition ParticleCreationFunc.H:309
CollisionType m_collision_type
Definition ParticleCreationFunc.H:293
amrex::DenseBins< ParticleTileDataType > ParticleBins
Definition ParticleCreationFunc.H:40
int m_num_product_species
Definition ParticleCreationFunc.H:287
amrex::Gpu::DeviceVector< int > m_num_products_device
Definition ParticleCreationFunc.H:291
typename ParticleTileType::ParticleTileDataType ParticleTileDataType
Definition ParticleCreationFunc.H:39
typename WarpXParticleContainer::ParticleType ParticleType
Definition ParticleCreationFunc.H:37
typename ParticleBins::index_type index_type
Definition ParticleCreationFunc.H:41
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 > &products_mass, const index_type *AMREX_RESTRICT p_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 amrex::ParticleReal *) const
operator() of the ParticleCreationFunc class. It creates new particles from binary collisions....
Definition ParticleCreationFunc.H:99
typename WarpXParticleContainer::ParticleTileType ParticleTileType
Definition ParticleCreationFunc.H:38
ParticleCreationFunc()=default
Default constructor of the ParticleCreationFunc class.
typename WarpXParticleContainer::ParticleTileType::ParticleTileDataType SoaData_type
Definition ParticleCreationFunc.H:42
amrex::Gpu::HostVector< int > m_num_products_host
Definition ParticleCreationFunc.H:292
ScatteringAngleModel m_scattering_angle_model
Definition ParticleCreationFunc.H:294
iterator begin() noexcept
std::conditional_t< is_rtsoa_pc, ParticleTileRT< typename ParticleType::RealType, typename ParticleType::IntType >, ParticleTile< ParticleType, NArrayReal, NArrayInt, Allocator > > ParticleTileType
T_ParticleType ParticleType
amrex_particle_real ParticleReal
T ExclusiveSum(N n, T const *in, T *out, RetSum a_ret_sum=retSum)
PinnedVector< T > HostVector
PODVector< T, ArenaAllocator< T > > DeviceVector
AMREX_GPU_HOST_DEVICE AMREX_INLINE bool is_two_product_fusion_type(const CollisionType collision_type)
Definition BinaryCollisionUtils.H:77
void DefaultInitializeRuntimeAttributes(PTile &ptile, const DstPC &pc, int start, int stop, const int n_external_attr_real=0, const int n_external_attr_int=0, const bool do_qed_comps=false)
Default initialize runtime attributes in a tile. This routine does not initialize the first n_externa...
Definition DefaultInitialization.H:111
constexpr auto c2
square of the vacuum speed of light [m^2/s^2]
Definition constant.H:214
void synchronize() noexcept
void copyAsync(HostToDevice, InIter begin, InIter end, OutIter result) noexcept
static constexpr HostToDevice hostToDevice
void streamSynchronize() noexcept
AMREX_ATTRIBUTE_FLATTEN_FOR void ParallelForRNG(T n, L const &f) noexcept
@ w
Definition WarpXParticleContainer.H:70
This is a functor for performing a "smart copy" that works in both host and device code.
Definition SmartCopy.H:34