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
116 using namespace amrex::literals;
133 num_added_vec[
i] =
static_cast<int>(num_added);
134 tile_products[
i]->resize(products_np[
i] + num_added);
144 soa_products.push_back(tile_products[
i]->getParticleTileData());
152 device_soa_products.
begin());
155 device_products_np.
begin());
158 device_products_mass.
begin());
162 const amrex::ParticleReal*
AMREX_RESTRICT products_mass_data = device_products_mass.
data();
166 const amrex::ParticleReal*
AMREX_RESTRICT products_mass_data = products_mass.data();
178 for (
int j = 0; j < t_num_product_species; j++)
180 for (
int k = 0; k < p_num_products_device[j]; k++)
184 const auto product_index = products_np_data[j] +
185 2*(p_offsets[
i]*p_num_products_device[j] + k);
187 copy_species1[j](soa_products_data[j], soa_1,
static_cast<int>(p_pair_indices_1[
i]),
188 static_cast<int>(product_index), engine);
190 copy_species2[j](soa_products_data[j], soa_2,
static_cast<int>(p_pair_indices_2[
i]),
191 static_cast<int>(product_index + 1), engine);
194 soa_products_data[j].m_rdata[
PIdx::w][product_index] =
195 p_pair_reaction_weight[
i]/amrex::ParticleReal(2.);
196 soa_products_data[j].m_rdata[
PIdx::w][product_index + 1] =
197 p_pair_reaction_weight[
i]/amrex::ParticleReal(2.);
203 -p_pair_reaction_weight[
i]);
205 -p_pair_reaction_weight[
i]);
209 constexpr amrex::Long minus_one_long = -1;
210 if (w1[p_pair_indices_1[
i]] <= amrex::ParticleReal(0.))
212 particle_ptr_1[p_pair_indices_1[
i]].atomicSetID(minus_one_long);
214 if (w2[p_pair_indices_2[
i]] <= amrex::ParticleReal(0.))
216 particle_ptr_2[p_pair_indices_2[
i]].atomicSetID(minus_one_long);
223 const index_type product_start_index = products_np_data[0] + 2*p_offsets[
i]*
224 p_num_products_device[0];
225 ProtonBoronFusionInitializeMomentum(soa_1, soa_2, soa_products_data[0],
226 p_pair_indices_1[
i], p_pair_indices_2[
i],
227 product_start_index, m1, m2, engine);
233 amrex::ParticleReal fusion_energy = 0.0_prt;
243 TwoProductFusionInitializeMomentum(soa_1, soa_2,
244 soa_products_data[0], soa_products_data[1],
245 p_pair_indices_1[
i], p_pair_indices_2[
i],
246 products_np_data[0] + 2*p_offsets[
i]*p_num_products_device[0],
247 products_np_data[1] + 2*p_offsets[
i]*p_num_products_device[1],
248 m1, m2, products_mass_data[0], products_mass_data[1], fusion_energy, engine);
256 return num_added_vec;
294 const amrex::ParticleReal& ,
const amrex::ParticleReal& ,
299 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:275
NoParticleCreationFunc(const std::string, MultiParticleContainer const *const)
Definition: ParticleCreationFunc.H:285
WarpXParticleContainer::ParticleType ParticleType
Definition: ParticleCreationFunc.H:276
NoParticleCreationFunc()=default
ParticleBins::index_type index_type
Definition: ParticleCreationFunc.H:279
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:267
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
ParticleBins::index_type index_type
Definition: ParticleCreationFunc.H:38
int m_num_product_species
Definition: ParticleCreationFunc.H:261
amrex::Gpu::DeviceVector< int > m_num_products_device
Definition: ParticleCreationFunc.H:265
ParticleCreationFunc()=default
Default constructor of the ParticleCreationFunc class.
amrex::Gpu::HostVector< int > m_num_products_host
Definition: ParticleCreationFunc.H:266
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)
void ParallelForRNG(T n, L &&f) noexcept
i
Definition: check_interp_points_and_weights.py:174
@ w
weight
Definition: NamedComponentParticleContainer.H:26
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