10#ifndef WARPX_DSMC_FUNC_H_
11#define WARPX_DSMC_FUNC_H_
45 using SoaData_type = WarpXParticleContainer::ParticleTileType::ParticleTileDataType;
61 DSMCFunc (
const std::string& collision_name,
130 index_type pair_index = cell_start_pair + coll_idx;
133 const auto multiplier_ratio =
static_cast<int>(
140 for (
index_type k = coll_idx; k < max_N; k += min_N)
149 const int max_process_count = 4;
151 (
m_process_count <= max_process_count),
"Too many scattering processes in DSMC routine (hardcoded to only allow up to 4). Update the max_process_count value in source code to allow more scattering processes."
154 u1x[ I1[i1] ], u1y[ I1[i1] ], u1z[ I1[i1] ],
155 u2x[ I2[i2] ], u2y[ I2[i2] ], u2z[ I2[i2] ],
156 m1, m2, w1[ I1[i1] ], w2[ I2[i2] ],
157 dt, dV,
static_cast<int>(pair_index), p_mask,
158 p_pair_reaction_weight, multiplier_ratio,
162 if (p_mask[pair_index]) {
164 w1[ I1[i1] ], idcpu1[ I1[i1] ], p_pair_reaction_weight[pair_index]);
166 w2[ I2[i2] ], idcpu2[ I2[i2] ], p_pair_reaction_weight[pair_index]);
170 p_pair_indices_1[pair_index] = I1[i1];
171 p_pair_indices_2[pair_index] = I2[i2];
172 if (max_N == NI1) { i1 += min_N; }
173 if (max_N == NI2) { i2 += min_N; }
#define AMREX_ALWAYS_ASSERT_WITH_MESSAGE(EX, MSG)
#define AMREX_GPU_HOST_DEVICE
AMREX_GPU_HOST_DEVICE AMREX_INLINE void CollisionPairFilter(const amrex::ParticleReal u1x, const amrex::ParticleReal u1y, const amrex::ParticleReal u1z, const amrex::ParticleReal u2x, const amrex::ParticleReal u2y, const amrex::ParticleReal u2z, const amrex::ParticleReal m1, const amrex::ParticleReal m2, const amrex::ParticleReal w1, const amrex::ParticleReal w2, const amrex::Real dt, const amrex::ParticleReal dV, const int pair_index, index_type *AMREX_RESTRICT p_mask, amrex::ParticleReal *AMREX_RESTRICT p_pair_reaction_weight, const int multiplier, const int process_count, const ScatteringProcess::Executor *scattering_processes, const amrex::RandomEngine &engine)
This function determines whether a collision occurs for a given pair of particles.
Definition CollisionFilterFunc.H:40
bool use_global_debye_length()
Definition DSMCFunc.H:188
Executor const & executor() const
Definition DSMCFunc.H:186
amrex::Vector< ScatteringProcess > m_scattering_processes
Definition DSMCFunc.H:191
ParticleBins::index_type index_type
Definition DSMCFunc.H:44
Executor m_exe
Definition DSMCFunc.H:196
DSMCFunc()=default
Constructor of the DSMCFunc class.
WarpXParticleContainer::ParticleTileType ParticleTileType
Definition DSMCFunc.H:41
amrex::Gpu::DeviceVector< ScatteringProcess::Executor > m_scattering_processes_exe
Definition DSMCFunc.H:192
WarpXParticleContainer::ParticleType ParticleType
Definition DSMCFunc.H:40
amrex::DenseBins< ParticleTileDataType > ParticleBins
Definition DSMCFunc.H:43
bool m_isSameSpecies
Definition DSMCFunc.H:194
ParticleTileType::ParticleTileDataType ParticleTileDataType
Definition DSMCFunc.H:42
WarpXParticleContainer::ParticleTileType::ParticleTileDataType SoaData_type
Definition DSMCFunc.H:45
Definition MultiParticleContainer.H:69
std::conditional_t< is_rtsoa_pc, ParticleTileRT< typename ParticleType::RealType, typename ParticleType::IntType >, ParticleTile< ParticleType, NArrayReal, NArrayInt, Allocator > > ParticleTileType
T_ParticleType ParticleType
amrex_particle_real ParticleReal
PODVector< T, ArenaAllocator< T > > DeviceVector
__host__ __device__ constexpr const T & min(const T &a, const T &b) noexcept
__host__ __device__ constexpr const T & max(const T &a, const T &b) noexcept
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:210
constexpr std::uint64_t Invalid
bool m_need_product_data
Definition DSMCFunc.H:181
AMREX_GPU_HOST_DEVICE AMREX_INLINE void operator()(index_type const I1s, index_type const I1e, index_type const I2s, index_type const I2e, index_type const *AMREX_RESTRICT I1, index_type const *AMREX_RESTRICT I2, const SoaData_type &soa_1, const SoaData_type &soa_2, GetParticlePosition< PIdx >, GetParticlePosition< PIdx >, amrex::ParticleReal const, amrex::ParticleReal const, amrex::ParticleReal const, amrex::ParticleReal const, amrex::Real const, amrex::ParticleReal const, amrex::ParticleReal const, amrex::ParticleReal const m1, amrex::ParticleReal const m2, amrex::Real const dt, amrex::Real const dV, index_type coll_idx, index_type const cell_start_pair, index_type *AMREX_RESTRICT p_mask, index_type *AMREX_RESTRICT p_pair_indices_1, index_type *AMREX_RESTRICT p_pair_indices_2, amrex::ParticleReal *AMREX_RESTRICT p_pair_reaction_weight, amrex::ParticleReal *, amrex::RandomEngine const &engine) const
Executor of the DSMCFunc class. Performs DSMC collisions at the cell level. Note that this function d...
Definition DSMCFunc.H:93
bool m_isSameSpecies
Definition DSMCFunc.H:182
bool m_computeSpeciesDensities
Definition DSMCFunc.H:179
bool m_computeSpeciesTemperatures
Definition DSMCFunc.H:180
int m_process_count
Definition DSMCFunc.H:178
ScatteringProcess::Executor * m_scattering_processes_data
Definition DSMCFunc.H:183
Functor that can be used to extract the positions of the macroparticles inside a ParallelFor kernel.
Definition GetAndSetPosition.H:75
@ uz
Definition WarpXParticleContainer.H:70
@ w
Definition WarpXParticleContainer.H:70
@ uy
Definition WarpXParticleContainer.H:70
@ ux
Definition WarpXParticleContainer.H:70
Definition ScatteringProcess.H:76