8 #ifndef WARPX_PARTICLE_CREATION_FUNC_H_
9 #define WARPX_PARTICLE_CREATION_FUNC_H_
100 const amrex::ParticleReal& m1,
const amrex::ParticleReal& m2,
104 const SmartCopy* AMREX_RESTRICT copy_species1,
105 const SmartCopy* AMREX_RESTRICT copy_species2,
106 const index_type* AMREX_RESTRICT p_pair_indices_1,
107 const index_type* AMREX_RESTRICT p_pair_indices_2,
108 const amrex::ParticleReal* AMREX_RESTRICT p_pair_reaction_weight
111 using namespace amrex::literals;
128 num_added_vec[
i] =
static_cast<int>(num_added);
129 tile_products[
i]->resize(products_np[
i] + num_added);
141 soa_products.push_back(tile_products[
i]->getParticleTileData());
149 device_soa_products.
begin());
152 device_products_np.
begin());
155 device_products_mass.
begin());
159 const amrex::ParticleReal*
AMREX_RESTRICT products_mass_data = device_products_mass.
data();
163 const amrex::ParticleReal*
AMREX_RESTRICT products_mass_data = products_mass.data();
175 for (
int j = 0; j < t_num_product_species; j++)
177 for (
int k = 0; k < p_num_products_device[j]; k++)
181 const auto product_index = products_np_data[j] +
182 2*(p_offsets[
i]*p_num_products_device[j] + k);
184 copy_species1[j](soa_products_data[j], soa_1,
static_cast<int>(p_pair_indices_1[
i]),
185 static_cast<int>(product_index), engine);
187 copy_species2[j](soa_products_data[j], soa_2,
static_cast<int>(p_pair_indices_2[
i]),
188 static_cast<int>(product_index + 1), engine);
191 soa_products_data[j].m_rdata[
PIdx::w][product_index] =
192 p_pair_reaction_weight[
i]/amrex::ParticleReal(2.);
193 soa_products_data[j].m_rdata[
PIdx::w][product_index + 1] =
194 p_pair_reaction_weight[
i]/amrex::ParticleReal(2.);
200 -p_pair_reaction_weight[
i]);
202 -p_pair_reaction_weight[
i]);
208 #if defined(AMREX_USE_OMP)
209 #pragma omp atomic write
213 (
unsigned long long *)&idcpu,
221 if (w1[p_pair_indices_1[
i]] <= std::numeric_limits<amrex::ParticleReal>::min())
223 atomicSetIdInvalid(idcpu1[p_pair_indices_1[
i]]);
226 if (w2[p_pair_indices_2[
i]] <= std::numeric_limits<amrex::ParticleReal>::min())
228 atomicSetIdInvalid(idcpu2[p_pair_indices_2[
i]]);
235 const index_type product_start_index = products_np_data[0] + 2*p_offsets[
i]*
236 p_num_products_device[0];
237 ProtonBoronFusionInitializeMomentum(soa_1, soa_2, soa_products_data[0],
238 p_pair_indices_1[
i], p_pair_indices_2[
i],
239 product_start_index, m1, m2, engine);
245 amrex::ParticleReal fusion_energy = 0.0_prt;
255 TwoProductFusionInitializeMomentum(soa_1, soa_2,
256 soa_products_data[0], soa_products_data[1],
257 p_pair_indices_1[
i], p_pair_indices_2[
i],
258 products_np_data[0] + 2*p_offsets[
i]*p_num_products_device[0],
259 products_np_data[1] + 2*p_offsets[
i]*p_num_products_device[1],
260 m1, m2, products_mass_data[0], products_mass_data[1], fusion_energy, engine);
269 const auto start_index =
int(products_np[
i]);
270 const auto stop_index =
int(products_np[
i] + num_added_vec[
i]);
273 pc_products[
i]->getUserRealAttribs(), pc_products[
i]->getUserIntAttribs(),
274 pc_products[
i]->getParticleComps(), pc_products[
i]->getParticleiComps(),
275 pc_products[
i]->getUserRealAttribParser(),
276 pc_products[
i]->getUserIntAttribParser(),
280 pc_products[
i]->get_breit_wheeler_engine_ptr(),
281 pc_products[
i]->get_quantum_sync_engine_ptr(),
283 pc_products[
i]->getIonizationInitialLevel(),
284 start_index, stop_index);
289 return num_added_vec;
329 const amrex::ParticleReal& ,
const amrex::ParticleReal& ,
334 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:309
typename WarpXParticleContainer::ParticleType ParticleType
Definition: ParticleCreationFunc.H:310
NoParticleCreationFunc(const std::string &, MultiParticleContainer const *const)
Definition: ParticleCreationFunc.H:320
typename ParticleBins::index_type index_type
Definition: ParticleCreationFunc.H:314
NoParticleCreationFunc()=default
typename WarpXParticleContainer::ParticleTileType ParticleTileType
Definition: ParticleCreationFunc.H:311
typename ParticleTileType::ParticleTileDataType ParticleTileDataType
Definition: ParticleCreationFunc.H:312
typename WarpXParticleContainer::ParticleTileType::ParticleTileDataType SoaData_type
Definition: ParticleCreationFunc.H:315
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:300
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, 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:95
int m_num_product_species
Definition: ParticleCreationFunc.H:294
amrex::Gpu::DeviceVector< int > m_num_products_device
Definition: ParticleCreationFunc.H:298
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:299
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
typename ParticleTileType::ParticleTileDataType ParticleTileDataType
Definition: ParticleUtils.cpp:33
static constexpr auto q_e
elementary charge [C]
Definition: constant.H:50
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE T Exch(T *address, T val) noexcept
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
constexpr std::uint64_t Invalid
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