8 #ifndef PARTICLE_CREATION_FUNC_H_
9 #define PARTICLE_CREATION_FUNC_H_
106 const amrex::ParticleReal& m1,
const amrex::ParticleReal& m2,
110 const SmartCopy* AMREX_RESTRICT copy_species1,
111 const SmartCopy* AMREX_RESTRICT copy_species2,
112 const index_type* AMREX_RESTRICT p_pair_indices_1,
113 const index_type* AMREX_RESTRICT p_pair_indices_2,
114 const amrex::ParticleReal* AMREX_RESTRICT p_pair_reaction_weight
117 using namespace amrex::literals;
134 num_added_vec[
i] =
static_cast<int>(num_added);
135 tile_products[
i]->resize(products_np[
i] + num_added);
145 soa_products.push_back(tile_products[
i]->getParticleTileData());
153 device_soa_products.
begin());
156 device_products_np.
begin());
159 device_products_mass.
begin());
163 const amrex::ParticleReal*
AMREX_RESTRICT products_mass_data = device_products_mass.
data();
167 const amrex::ParticleReal*
AMREX_RESTRICT products_mass_data = products_mass.data();
179 for (
int j = 0; j < t_num_product_species; j++)
181 for (
int k = 0; k < p_num_products_device[j]; k++)
185 const auto product_index = products_np_data[j] +
186 2*(p_offsets[
i]*p_num_products_device[j] + k);
188 copy_species1[j](soa_products_data[j], soa_1,
static_cast<int>(p_pair_indices_1[
i]),
189 static_cast<int>(product_index), engine);
191 copy_species2[j](soa_products_data[j], soa_2,
static_cast<int>(p_pair_indices_2[
i]),
192 static_cast<int>(product_index + 1), engine);
195 soa_products_data[j].m_rdata[
PIdx::w][product_index] =
196 p_pair_reaction_weight[
i]/amrex::ParticleReal(2.);
197 soa_products_data[j].m_rdata[
PIdx::w][product_index + 1] =
198 p_pair_reaction_weight[
i]/amrex::ParticleReal(2.);
204 -p_pair_reaction_weight[
i]);
206 -p_pair_reaction_weight[
i]);
210 constexpr amrex::Long minus_one_long = -1;
211 if (w1[p_pair_indices_1[
i]] <= amrex::ParticleReal(0.))
213 particle_ptr_1[p_pair_indices_1[
i]].atomicSetID(minus_one_long);
215 if (w2[p_pair_indices_2[
i]] <= amrex::ParticleReal(0.))
217 particle_ptr_2[p_pair_indices_2[
i]].atomicSetID(minus_one_long);
224 const index_type product_start_index = products_np_data[0] + 2*p_offsets[
i]*
225 p_num_products_device[0];
226 ProtonBoronFusionInitializeMomentum(soa_1, soa_2, soa_products_data[0],
227 p_pair_indices_1[
i], p_pair_indices_2[
i],
228 product_start_index, m1, m2, engine);
234 amrex::ParticleReal fusion_energy = 0.0_prt;
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, engine);
258 int start_index =
int(products_np[
i]);
259 int stop_index =
int(products_np[
i] + num_added_vec[
i]);
262 pc_products[
i]->getUserRealAttribs(), pc_products[
i]->getUserIntAttribs(),
263 pc_products[
i]->getParticleComps(), pc_products[
i]->getParticleiComps(),
264 pc_products[
i]->getUserRealAttribParser(),
265 pc_products[
i]->getUserIntAttribParser(),
269 pc_products[
i]->get_breit_wheeler_engine_ptr(),
270 pc_products[
i]->get_quantum_sync_engine_ptr(),
272 pc_products[
i]->getIonizationInitialLevel(),
273 start_index, stop_index);
278 return num_added_vec;
317 const amrex::ParticleReal& ,
const amrex::ParticleReal& ,
322 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:297
NoParticleCreationFunc(const std::string, MultiParticleContainer const *const)
Definition: ParticleCreationFunc.H:307
WarpXParticleContainer::ParticleType ParticleType
Definition: ParticleCreationFunc.H:298
NoParticleCreationFunc()=default
ParticleBins::index_type index_type
Definition: ParticleCreationFunc.H:301
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
AMREX_INLINE amrex::Vector< int > operator()(const index_type &n_total_pairs, const SoaData_type &soa_1, const SoaData_type &soa_2, const amrex::Vector< WarpXParticleContainer * > &pc_products, 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
CollisionType m_collision_type
Definition: ParticleCreationFunc.H:289
ParticleBins::index_type index_type
Definition: ParticleCreationFunc.H:38
int m_num_product_species
Definition: ParticleCreationFunc.H:283
amrex::Gpu::DeviceVector< int > m_num_products_device
Definition: ParticleCreationFunc.H:287
ParticleCreationFunc()=default
Default constructor of the ParticleCreationFunc class.
amrex::Gpu::HostVector< int > m_num_products_host
Definition: ParticleCreationFunc.H:288
iterator begin() noexcept
ParticleTile< ParticleType, NArrayReal, NArrayInt, Allocator > ParticleTileType
T_ParticleType ParticleType
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
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