8 #ifndef PARTICLE_CREATION_FUNC_H_
9 #define PARTICLE_CREATION_FUNC_H_
105 const amrex::ParticleReal& m1,
const amrex::ParticleReal& m2,
109 const SmartCopy* AMREX_RESTRICT copy_species1,
110 const SmartCopy* AMREX_RESTRICT copy_species2,
111 const index_type* AMREX_RESTRICT p_pair_indices_1,
112 const index_type* AMREX_RESTRICT p_pair_indices_2,
113 const amrex::ParticleReal* AMREX_RESTRICT p_pair_reaction_weight
131 num_added_vec[
i] = num_added;
132 tile_products[
i]->resize(products_np[
i] + num_added);
142 soa_products.push_back(tile_products[
i]->getParticleTileData());
150 device_soa_products.
begin());
153 device_products_np.
begin());
156 device_products_mass.
begin());
160 const amrex::ParticleReal*
AMREX_RESTRICT products_mass_data = device_products_mass.
data();
164 const amrex::ParticleReal*
AMREX_RESTRICT products_mass_data = products_mass.data();
176 for (
int j = 0; j < t_num_product_species; j++)
178 for (
int k = 0; k < p_num_products_device[j]; k++)
182 const auto product_index = products_np_data[j] +
183 2*(p_offsets[
i]*p_num_products_device[j] + k);
185 copy_species1[j](soa_products_data[j], soa_1, p_pair_indices_1[
i],
186 product_index, engine);
188 copy_species2[j](soa_products_data[j], soa_2, p_pair_indices_2[
i],
189 product_index + 1, engine);
192 soa_products_data[j].m_rdata[
PIdx::w][product_index] =
193 p_pair_reaction_weight[
i]/amrex::ParticleReal(2.);
194 soa_products_data[j].m_rdata[
PIdx::w][product_index + 1] =
195 p_pair_reaction_weight[
i]/amrex::ParticleReal(2.);
201 -p_pair_reaction_weight[
i]);
203 -p_pair_reaction_weight[
i]);
207 constexpr amrex::Long minus_one_long = -1;
208 if (w1[p_pair_indices_1[
i]] <= amrex::ParticleReal(0.))
210 particle_ptr_1[p_pair_indices_1[
i]].atomicSetID(minus_one_long);
212 if (w2[p_pair_indices_2[
i]] <= amrex::ParticleReal(0.))
214 particle_ptr_2[p_pair_indices_2[
i]].atomicSetID(minus_one_long);
221 const index_type product_start_index = products_np_data[0] + 2*p_offsets[
i]*
222 p_num_products_device[0];
223 ProtonBoronFusionInitializeMomentum(soa_1, soa_2, soa_products_data[0],
224 p_pair_indices_1[
i], p_pair_indices_2[
i],
225 product_start_index, m1, m2, engine);
231 amrex::ParticleReal fusion_energy = 0.0_prt;
241 TwoProductFusionInitializeMomentum(soa_1, soa_2,
242 soa_products_data[0], soa_products_data[1],
243 p_pair_indices_1[
i], p_pair_indices_2[
i],
244 products_np_data[0] + 2*p_offsets[
i]*p_num_products_device[0],
245 products_np_data[1] + 2*p_offsets[
i]*p_num_products_device[1],
246 m1, m2, products_mass_data[0], products_mass_data[1], fusion_energy, engine);
254 return num_added_vec;
292 const amrex::ParticleReal& ,
const amrex::ParticleReal& ,
297 const amrex::ParticleReal*
CollisionType
Definition: BinaryCollisionUtils.H:15
@ ProtonBoronToAlphasFusion
@ DeuteriumDeuteriumToProtonTritiumFusion
@ DeuteriumDeuteriumToNeutronHeliumFusion
@ DeuteriumTritiumToNeutronHeliumFusion
Definition: MultiParticleContainer.H:65
This class does nothing and is used as second template parameter for binary collisions that do not cr...
Definition: ParticleCreationFunc.H:273
NoParticleCreationFunc(const std::string, MultiParticleContainer const *const)
Definition: ParticleCreationFunc.H:283
WarpXParticleContainer::ParticleType ParticleType
Definition: ParticleCreationFunc.H:274
NoParticleCreationFunc()=default
ParticleBins::index_type index_type
Definition: ParticleCreationFunc.H:277
AMREX_INLINE amrex::Vector< int > operator()(const index_type &, const SoaData_type, const SoaData_type, ParticleTileType **, ParticleType *, ParticleType *, 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
Definition: ParticleCreationFunc.H:287
This functor creates particles produced from a binary collision and sets their initial properties (po...
Definition: ParticleCreationFunc.H:33
WarpXParticleContainer::ParticleType ParticleType
Definition: ParticleCreationFunc.H:35
CollisionType m_collision_type
Definition: ParticleCreationFunc.H:265
ParticleBins::index_type index_type
Definition: ParticleCreationFunc.H:38
int m_num_product_species
Definition: ParticleCreationFunc.H:259
amrex::Gpu::DeviceVector< int > m_num_products_device
Definition: ParticleCreationFunc.H:263
AMREX_INLINE amrex::Vector< int > operator()(const index_type &n_total_pairs, const SoaData_type soa_1, const SoaData_type soa_2, ParticleTileType **AMREX_RESTRICT tile_products, ParticleType *particle_ptr_1, ParticleType *particle_ptr_2, 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
operator() of the ParticleCreationFunc class. It creates new particles from binary collisions....
Definition: ParticleCreationFunc.H:100
ParticleCreationFunc()=default
Default constructor of the ParticleCreationFunc class.
amrex::Gpu::HostVector< int > m_num_products_host
Definition: ParticleCreationFunc.H:264
iterator begin() noexcept
ParticleTile< ParticleType, NArrayReal, NArrayInt, Allocator > ParticleTileType
T_ParticleType ParticleType
static constexpr auto q_e
elementary charge [C]
Definition: constant.H:50
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
T ExclusiveSum(N n, T const *in, T *out, RetSum a_ret_sum=retSum)
AMREX_ATTRIBUTE_FLATTEN_FOR void ParallelForRNG(T n, L const &f) noexcept
i
Definition: check_interp_points_and_weights.py:174
@ w
weight
Definition: NamedComponentParticleContainer.H:24
This is a functor for performing a "smart copy" that works in both host and device code.
Definition: SmartCopy.H:34
GpuArray< ParticleReal *, NAR > m_rdata
ParticleTileData< StorageParticleType, NArrayReal, NArrayInt > ParticleTileDataType