7 #ifndef WARPX_PARTICLES_COLLISION_BINARYCOLLISION_H_
8 #define WARPX_PARTICLES_COLLISION_BINARYCOLLISION_H_
31 #include <AMReX_Config.H>
67 template <
typename CollisionFunctorType,
102 " does not produce species. Thus, `product_species` should not be specified in the input script." );
135 for (
int i = 0;
i < n_product_species;
i++)
139 product_species_vector.push_back(&product);
145 copy_species1.push_back(copy_factory_species1[
i].getSmartCopy());
146 copy_species2.push_back(copy_factory_species2[
i].getSmartCopy());
152 copy_species1.end(), device_copy_species1.
begin());
154 copy_species2.end(), device_copy_species2.
begin());
156 auto copy_species1_data = device_copy_species1.
data();
157 auto copy_species2_data = device_copy_species2.
data();
159 auto copy_species1_data = copy_species1.data();
160 auto copy_species2_data = copy_species2.data();
164 species2.defineAllParticleTiles();
172 for (
int lev = 0; lev <=
species1.finestLevel(); ++lev){
179 #pragma omp parallel if (amrex::Gpu::notInLaunchRegion())
189 copy_species1_data, copy_species2_data);
221 using namespace amrex::literals;
232 constexpr
int getpos_offset = 0;
233 for (
int i = 0;
i < n_product_species;
i++)
235 ParticleTileType& ptile_product = product_species_vector[
i]->ParticlesAt(lev, mfi);
236 tile_products.push_back(&ptile_product);
240 products_mass.push_back(product_species_vector[
i]->getMass());
242 auto tile_products_data = tile_products.data();
255 auto const n_cells =
static_cast<int>(bins_1.
numBins());
260 const amrex::ParticleReal q1 = species_1.
getCharge();
261 const amrex::ParticleReal m1 = species_1.
getMass();
268 #if defined WARPX_DIM_1D_Z
270 #elif defined WARPX_DIM_XZ
272 #elif defined WARPX_DIM_RZ
274 const auto lo =
lbound(cbx);
275 const auto hi =
ubound(cbx);
276 int const nz = hi.y-lo.y+1;
279 #elif defined(WARPX_DIM_3D)
287 const int n_cells_products = have_product_species ? n_cells: 0;
297 const auto n_part_in_cell = cell_offsets_1[i_cell+1] - cell_offsets_1[i_cell];
299 p_n_pairs_in_each_cell[i_cell] = (n_part_in_cell == 1)? 0: (n_part_in_cell+1)/2;
305 const index_type n_total_pairs = (n_cells_products == 0) ? 0:
307 p_n_pairs_in_each_cell, pair_offsets.data());
323 pair_reaction_weight.
dataPtr();
335 index_type const cell_start_1 = cell_offsets_1[i_cell];
336 index_type const cell_stop_1 = cell_offsets_1[i_cell+1];
337 index_type const cell_half_1 = (cell_start_1+cell_stop_1)/2;
340 index_type const cell_start_pair = have_product_species?
341 p_pair_offsets[i_cell] : 0;
344 if ( cell_stop_1 - cell_start_1 <= 1 )
return;
348 indices_1, cell_start_1, cell_half_1, engine );
349 #if defined WARPX_DIM_RZ
350 const int ri = (i_cell - i_cell%nz) / nz;
351 auto dV = MathConst::pi*(2.0_prt*ri+1.0_prt)*dr*dr*
dz;
356 binary_collision_functor(
357 cell_start_1, cell_half_1,
358 cell_half_1, cell_stop_1,
359 indices_1, indices_1,
360 soa_1, soa_1, get_position_1, get_position_1,
361 q1, q1, m1, m1,
dt, dV,
362 cell_start_pair, p_mask, p_pair_indices_1, p_pair_indices_2,
363 p_pair_reaction_weight, engine );
370 soa_1, soa_1, tile_products_data,
371 particle_ptr_1, particle_ptr_1, m1, m1,
372 products_mass, p_mask, products_np,
373 copy_species1, copy_species2,
374 p_pair_indices_1, p_pair_indices_2,
375 p_pair_reaction_weight);
377 for (
int i = 0;
i < n_product_species;
i++)
395 auto const n_cells =
static_cast<int>(bins_1.
numBins());
400 const amrex::ParticleReal q1 = species_1.
getCharge();
401 const amrex::ParticleReal m1 = species_1.
getMass();
410 const amrex::ParticleReal q2 = species_2.
getCharge();
411 const amrex::ParticleReal m2 = species_2.
getMass();
418 #if defined WARPX_DIM_1D_Z
420 #elif defined WARPX_DIM_XZ
422 #elif defined WARPX_DIM_RZ
424 const auto lo =
lbound(cbx);
425 const auto hi =
ubound(cbx);
426 int nz = hi.y-lo.y+1;
429 #elif defined(WARPX_DIM_3D)
437 const int n_cells_products = have_product_species ? n_cells: 0;
447 const auto n_part_in_cell_1 = cell_offsets_1[i_cell+1] - cell_offsets_1[i_cell];
448 const auto n_part_in_cell_2 = cell_offsets_2[i_cell+1] - cell_offsets_2[i_cell];
450 if (n_part_in_cell_1 == 0 || n_part_in_cell_2 == 0)
451 p_n_pairs_in_each_cell[i_cell] = 0;
453 p_n_pairs_in_each_cell[i_cell] =
454 amrex::max(n_part_in_cell_1,n_part_in_cell_2);
460 const index_type n_total_pairs = (n_cells_products == 0) ? 0:
462 p_n_pairs_in_each_cell, pair_offsets.data());
478 pair_reaction_weight.
dataPtr();
490 index_type const cell_start_1 = cell_offsets_1[i_cell];
491 index_type const cell_stop_1 = cell_offsets_1[i_cell+1];
493 index_type const cell_start_2 = cell_offsets_2[i_cell];
494 index_type const cell_stop_2 = cell_offsets_2[i_cell+1];
496 index_type const cell_start_pair = have_product_species?
497 p_pair_offsets[i_cell] : 0;
504 if ( cell_stop_1 - cell_start_1 < 1 ||
505 cell_stop_2 - cell_start_2 < 1 )
return;
510 #if defined WARPX_DIM_RZ
511 const int ri = (i_cell - i_cell%nz) / nz;
512 auto dV = MathConst::pi*(2.0_prt*ri+1.0_prt)*dr*dr*
dz;
517 binary_collision_functor(
518 cell_start_1, cell_stop_1, cell_start_2, cell_stop_2,
519 indices_1, indices_2,
520 soa_1, soa_2, get_position_1, get_position_2,
521 q1, q2, m1, m2,
dt, dV,
522 cell_start_pair, p_mask, p_pair_indices_1, p_pair_indices_2,
523 p_pair_reaction_weight, engine );
531 soa_1, soa_2, tile_products_data,
532 particle_ptr_1, particle_ptr_2, m1, m2,
533 products_mass, p_mask, products_np,
534 copy_species1, copy_species2,
535 p_pair_indices_1, p_pair_indices_2,
536 p_pair_reaction_weight);
538 for (
int i = 0;
i < n_product_species;
i++)
AMREX_GPU_HOST_DEVICE AMREX_INLINE void ShuffleFisherYates(T_index *array, T_index const is, T_index const ie, amrex::RandomEngine const &engine)
Definition: ShuffleFisherYates.H:20
void setNewParticleIDs(PTile &ptile, int old_size, int num_added)
Sets the ids of newly created particles to the next values.
Definition: SmartUtils.H:51
#define WARPX_ABORT_WITH_MESSAGE(MSG)
Definition: TextMsg.H:15
This class performs generic binary collisions.
Definition: BinaryCollision.H:71
CopyTransformFunctorType m_copy_transform_functor
Definition: BinaryCollision.H:555
BinaryCollision(BinaryCollision &&)=default
BinaryCollision(BinaryCollision const &)=default
bool m_isSameSpecies
Definition: BinaryCollision.H:549
CollisionFunctorType m_binary_collision_functor
Definition: BinaryCollision.H:553
void doCollisionsWithinTile(amrex::Real dt, int const lev, amrex::MFIter const &mfi, WarpXParticleContainer &species_1, WarpXParticleContainer &species_2, amrex::Vector< WarpXParticleContainer * > product_species_vector, SmartCopy *copy_species1, SmartCopy *copy_species2)
Definition: BinaryCollision.H:213
bool m_have_product_species
Definition: BinaryCollision.H:550
WarpXParticleContainer::ParticleType ParticleType
Definition: BinaryCollision.H:73
ParticleBins::index_type index_type
Definition: BinaryCollision.H:77
amrex::Vector< std::string > m_product_species
Definition: BinaryCollision.H:551
void doCollisions(amrex::Real cur_time, amrex::Real dt, MultiParticleContainer *mypc) override
Definition: BinaryCollision.H:121
BinaryCollision(std::string collision_name, MultiParticleContainer const *const mypc)
Constructor of the BinaryCollision class.
Definition: BinaryCollision.H:87
~BinaryCollision() override=default
BinaryCollision & operator=(BinaryCollision const &)=default
Definition: CollisionBase.H:18
amrex::Vector< std::string > m_species_names
Definition: CollisionBase.H:36
Definition: MultiParticleContainer.H:65
WarpXParticleContainer & GetParticleContainerFromName(const std::string &name) const
Definition: MultiParticleContainer.cpp:410
This class does nothing and is used as second template parameter for binary collisions that do not cr...
Definition: ParticleCreationFunc.H:275
A factory for creating SmartCopy functors.
Definition: SmartCopy.H:132
static WarpX & GetInstance()
Definition: WarpX.cpp:243
static amrex::LayoutData< amrex::Real > * getCosts(int lev)
Definition: WarpX.cpp:2941
static short load_balance_costs_update_algo
Definition: WarpX.H:179
Definition: WarpXParticleContainer.H:104
void defineAllParticleTiles() noexcept
Definition: WarpXParticleContainer.cpp:1293
amrex::ParticleReal getCharge() const
Definition: WarpXParticleContainer.H:353
amrex::ParticleReal getMass() const
Definition: WarpXParticleContainer.H:355
const Vector< Geometry > & Geom() const noexcept
const Real * CellSize() const noexcept
index_type * offsetsPtr() noexcept
index_type * permutationPtr() noexcept
Long numBins() const noexcept
AMREX_GPU_HOST_DEVICE static constexpr AMREX_FORCE_INLINE IntVect TheZeroVector() noexcept
Box tilebox() const noexcept
iterator begin() noexcept
int queryarr(const char *name, std::vector< int > &ref, int start_ix=FIRST, int num_val=ALL) const
ParticleTile< ParticleType, NArrayReal, NArrayInt, Allocator > ParticleTileType
const ParticleTileType & ParticlesAt(int lev, int grid, int tile) const
T_ParticleType ParticleType
Definition: ParticleUtils.cpp:25
ParticleBins findParticlesInEachCell(int const lev, MFIter const &mfi, ParticleTileType const &ptile)
Find the particles and count the particles that are in each cell. More specifically this function ret...
Definition: ParticleUtils.cpp:37
void synchronize() noexcept
void copyAsync(HostToDevice, InIter begin, InIter end, OutIter result) noexcept
static constexpr HostToDevice hostToDevice
void streamSynchronize() noexcept
bool notInLaunchRegion() noexcept
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void Add(T *const sum, T const value) noexcept
T ExclusiveSum(N n, T const *in, T *out, RetSum a_ret_sum=retSum)
void ParallelForRNG(T n, L &&f) noexcept
AMREX_GPU_HOST_DEVICE constexpr AMREX_FORCE_INLINE const T & max(const T &a, const T &b) noexcept
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE Dim3 ubound(Array4< T > const &a) noexcept
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE Dim3 lbound(Array4< T > const &a) noexcept
std::enable_if_t< std::is_integral< T >::value > ParallelFor(TypeList< CTOs... >, std::array< int, sizeof...(CTOs)> const &runtime_options, T N, F &&f)
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void ignore_unused(const Ts &...)
i
Definition: check_interp_points_and_weights.py:174
int dz
Definition: compute_domain.py:36
data
Definition: run_alltests_1node.py:325
float dt
Definition: stencil.py:442
value
Definition: updateAMReX.py:141
string species1
Definition: video_yt.py:35
@ Timers
load balance according to in-code timer-based weights (i.e., with costs)
Definition: WarpXAlgorithmSelection.H:122
This is a functor for performing a "smart copy" that works in both host and device code.
Definition: SmartCopy.H:34
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE int const * dataPtr() const noexcept
MFItInfo & EnableTiling(const IntVect &ts=FabArrayBase::mfiter_tile_size) noexcept
MFItInfo & SetDynamic(bool f) noexcept
ParticleTileData< StorageParticleType, NArrayReal, NArrayInt > ParticleTileDataType
AoS & GetArrayOfStructs()
ParticleTileDataType getParticleTileData()