8 #ifndef WARPX_PARTICLE_CREATION_FUNC_H_
9 #define WARPX_PARTICLE_CREATION_FUNC_H_
99 const amrex::ParticleReal& m1,
const amrex::ParticleReal& m2,
103 const SmartCopy* AMREX_RESTRICT copy_species1,
104 const SmartCopy* AMREX_RESTRICT copy_species2,
105 const index_type* AMREX_RESTRICT p_pair_indices_1,
106 const index_type* AMREX_RESTRICT p_pair_indices_2,
107 const amrex::ParticleReal* AMREX_RESTRICT p_pair_reaction_weight
110 using namespace amrex::literals;
127 num_added_vec[
i] =
static_cast<int>(num_added);
128 tile_products[
i]->resize(products_np[
i] + num_added);
131 const auto soa_1 = ptile1.getParticleTileData();
132 const auto soa_2 = ptile2.getParticleTileData();
143 soa_products.push_back(tile_products[
i]->getParticleTileData());
151 device_soa_products.
begin());
154 device_products_np.
begin());
157 device_products_mass.
begin());
161 const amrex::ParticleReal*
AMREX_RESTRICT products_mass_data = device_products_mass.
data();
165 const amrex::ParticleReal*
AMREX_RESTRICT products_mass_data = products_mass.data();
177 for (
int j = 0; j < t_num_product_species; j++)
179 for (
int k = 0; k < p_num_products_device[j]; k++)
183 const auto product_index = products_np_data[j] +
184 2*(p_offsets[
i]*p_num_products_device[j] + k);
186 copy_species1[j](soa_products_data[j], soa_1,
static_cast<int>(p_pair_indices_1[
i]),
187 static_cast<int>(product_index), engine);
189 copy_species2[j](soa_products_data[j], soa_2,
static_cast<int>(p_pair_indices_2[
i]),
190 static_cast<int>(product_index + 1), engine);
193 soa_products_data[j].m_rdata[
PIdx::w][product_index] =
194 p_pair_reaction_weight[
i]/amrex::ParticleReal(2.);
195 soa_products_data[j].m_rdata[
PIdx::w][product_index + 1] =
196 p_pair_reaction_weight[
i]/amrex::ParticleReal(2.);
202 w1[p_pair_indices_1[
i]], idcpu1[p_pair_indices_1[
i]], p_pair_reaction_weight[
i]);
204 w2[p_pair_indices_2[
i]], idcpu2[p_pair_indices_2[
i]], p_pair_reaction_weight[
i]);
210 const index_type product_start_index = products_np_data[0] + 2*p_offsets[
i]*
211 p_num_products_device[0];
212 ProtonBoronFusionInitializeMomentum(soa_1, soa_2, soa_products_data[0],
213 p_pair_indices_1[
i], p_pair_indices_2[
i],
214 product_start_index, m1, m2, engine);
220 amrex::ParticleReal fusion_energy = 0.0_prt;
230 TwoProductFusionInitializeMomentum(soa_1, soa_2,
231 soa_products_data[0], soa_products_data[1],
232 p_pair_indices_1[
i], p_pair_indices_2[
i],
233 products_np_data[0] + 2*p_offsets[
i]*p_num_products_device[0],
234 products_np_data[1] + 2*p_offsets[
i]*p_num_products_device[1],
235 m1, m2, products_mass_data[0], products_mass_data[1], fusion_energy, engine);
244 const auto start_index =
int(products_np[
i]);
245 const auto stop_index =
int(products_np[
i] + num_added_vec[
i]);
248 pc_products[
i]->getUserRealAttribs(), pc_products[
i]->getUserIntAttribs(),
249 pc_products[
i]->getParticleComps(), pc_products[
i]->getParticleiComps(),
250 pc_products[
i]->getUserRealAttribParser(),
251 pc_products[
i]->getUserIntAttribParser(),
255 pc_products[
i]->get_breit_wheeler_engine_ptr(),
256 pc_products[
i]->get_quantum_sync_engine_ptr(),
258 pc_products[
i]->getIonizationInitialLevel(),
259 start_index, stop_index);
264 return num_added_vec;
304 const amrex::ParticleReal& ,
const amrex::ParticleReal& ,
309 const amrex::ParticleReal*
CollisionType
Definition: BinaryCollisionUtils.H:17
@ ProtonBoronToAlphasFusion
@ DeuteriumDeuteriumToProtonTritiumFusion
@ DeuteriumDeuteriumToNeutronHeliumFusion
@ DeuteriumTritiumToNeutronHeliumFusion
Definition: MultiParticleContainer.H:66
This class does nothing and is used as second template parameter for binary collisions that do not cr...
Definition: ParticleCreationFunc.H:284
typename WarpXParticleContainer::ParticleType ParticleType
Definition: ParticleCreationFunc.H:285
NoParticleCreationFunc(const std::string &, MultiParticleContainer const *const)
Definition: ParticleCreationFunc.H:295
typename ParticleBins::index_type index_type
Definition: ParticleCreationFunc.H:289
NoParticleCreationFunc()=default
typename WarpXParticleContainer::ParticleTileType ParticleTileType
Definition: ParticleCreationFunc.H:286
typename ParticleTileType::ParticleTileDataType ParticleTileDataType
Definition: ParticleCreationFunc.H:287
typename WarpXParticleContainer::ParticleTileType::ParticleTileDataType SoaData_type
Definition: ParticleCreationFunc.H:290
This functor creates particles produced from a binary collision and sets their initial properties (po...
Definition: ParticleCreationFunc.H:33
CollisionType m_collision_type
Definition: ParticleCreationFunc.H:275
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
operator() of the ParticleCreationFunc class. It creates new particles from binary collisions....
Definition: ParticleCreationFunc.H:94
int m_num_product_species
Definition: ParticleCreationFunc.H:269
amrex::Gpu::DeviceVector< int > m_num_products_device
Definition: ParticleCreationFunc.H:273
typename ParticleTileType::ParticleTileDataType ParticleTileDataType
Definition: ParticleCreationFunc.H:37
typename WarpXParticleContainer::ParticleType ParticleType
Definition: ParticleCreationFunc.H:35
typename ParticleBins::index_type index_type
Definition: ParticleCreationFunc.H:39
typename WarpXParticleContainer::ParticleTileType ParticleTileType
Definition: ParticleCreationFunc.H:36
ParticleCreationFunc()=default
Default constructor of the ParticleCreationFunc class.
typename WarpXParticleContainer::ParticleTileType::ParticleTileDataType SoaData_type
Definition: ParticleCreationFunc.H:40
amrex::Gpu::HostVector< int > m_num_products_host
Definition: ParticleCreationFunc.H:274
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
typename ParticleTileType::ParticleTileDataType ParticleTileDataType
Definition: ParticleUtils.cpp:33
static constexpr auto q_e
elementary charge [C]
Definition: constant.H:50
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:33
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