Skip to content

Commit c70a6c5

Browse files
Code clean-up for binary collisions (#4921)
* code clean-up for binary collisions * fix variable shadowing * pass particle tiles by reference
1 parent ee51424 commit c70a6c5

File tree

4 files changed

+48
-76
lines changed

4 files changed

+48
-76
lines changed

Source/Particles/Collision/BinaryCollision/BinaryCollision.H

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,6 @@ class BinaryCollision final
7575
using ParticleTileType = WarpXParticleContainer::ParticleTileType;
7676
using ParticleTileDataType = ParticleTileType::ParticleTileDataType;
7777
using ParticleBins = amrex::DenseBins<ParticleTileDataType>;
78-
using SoaData_type = WarpXParticleContainer::ParticleTileType::ParticleTileDataType;
7978
using index_type = ParticleBins::index_type;
8079

8180
public:
@@ -298,7 +297,6 @@ public:
298297
auto dV = geom.CellSize(0) * geom.CellSize(1) * geom.CellSize(2);
299298
#endif
300299

301-
302300
/*
303301
The following calculations are only required when creating product particles
304302
*/
@@ -431,7 +429,7 @@ public:
431429
// Create the new product particles and define their initial values
432430
// num_added: how many particles of each product species have been created
433431
const amrex::Vector<int> num_added = m_copy_transform_functor(n_total_pairs,
434-
soa_1, soa_1,
432+
ptile_1, ptile_1,
435433
product_species_vector,
436434
tile_products_data,
437435
m1, m1,
@@ -648,7 +646,7 @@ public:
648646
// Create the new product particles and define their initial values
649647
// num_added: how many particles of each product species have been created
650648
const amrex::Vector<int> num_added = m_copy_transform_functor(n_total_pairs,
651-
soa_1, soa_2,
649+
ptile_1, ptile_2,
652650
product_species_vector,
653651
tile_products_data,
654652
m1, m2,

Source/Particles/Collision/BinaryCollision/BinaryCollisionUtils.H

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,34 @@ namespace BinaryCollisionUtils{
126126
// is calculated here.
127127
lab_to_COM_lorentz_factor = g1_star*g2_star/static_cast<amrex::ParticleReal>(g1*g2);
128128
}
129+
130+
/**
131+
* \brief Subtract given weight from particle and set its ID to invalid
132+
* if the weight reaches zero.
133+
*/
134+
AMREX_GPU_HOST_DEVICE AMREX_INLINE
135+
void remove_weight_from_colliding_particle (
136+
amrex::ParticleReal& weight, uint64_t& idcpu,
137+
const amrex::ParticleReal reaction_weight )
138+
{
139+
// Remove weight from given particle
140+
amrex::Gpu::Atomic::AddNoRet(&weight, -reaction_weight);
141+
142+
// If the colliding particle weight decreases to zero, remove particle by
143+
// setting its id to invalid
144+
if (weight <= std::numeric_limits<amrex::ParticleReal>::min())
145+
{
146+
#if defined(AMREX_USE_OMP)
147+
#pragma omp atomic write
148+
idcpu = amrex::ParticleIdCpus::Invalid;
149+
#else
150+
amrex::Gpu::Atomic::Exch(
151+
(unsigned long long *)&idcpu,
152+
(unsigned long long)amrex::ParticleIdCpus::Invalid
153+
);
154+
#endif
155+
}
156+
}
129157
}
130158

131159
#endif // WARPX_BINARY_COLLISION_UTILS_H_

Source/Particles/Collision/BinaryCollision/DSMC/SplitAndScatterFunc.H

Lines changed: 8 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,7 @@ class SplitAndScatterFunc
2727
using ParticleTileDataType = typename ParticleTileType::ParticleTileDataType;
2828
using ParticleBins = amrex::DenseBins<ParticleTileDataType>;
2929
using index_type = typename ParticleBins::index_type;
30-
using SoaData_type = typename WarpXParticleContainer::ParticleTileType::ParticleTileDataType;
31-
30+
using SoaData_type = WarpXParticleContainer::ParticleTileType::ParticleTileDataType;
3231

3332
public:
3433
/**
@@ -53,8 +52,7 @@ public:
5352
AMREX_INLINE
5453
amrex::Vector<int> operator() (
5554
const index_type& n_total_pairs,
56-
// Tile& ptile1, Tile& ptile2,
57-
const SoaData_type& /*soa_1*/, const SoaData_type& /*soa_2*/,
55+
ParticleTileType& ptile1, ParticleTileType& ptile2,
5856
const amrex::Vector<WarpXParticleContainer*>& pc_products,
5957
ParticleTileType** AMREX_RESTRICT tile_products,
6058
const amrex::ParticleReal m1, const amrex::ParticleReal m2,
@@ -93,9 +91,8 @@ public:
9391
tile_products[i]->resize(products_np[i] + num_added);
9492
}
9593

96-
// this works for DSMC since the colliding particles are also products
97-
const auto soa_1 = tile_products[0]->getParticleTileData();
98-
const auto soa_2 = tile_products[1]->getParticleTileData();
94+
const auto soa_1 = ptile1.getParticleTileData();
95+
const auto soa_2 = ptile2.getParticleTileData();
9996

10097
amrex::ParticleReal* AMREX_RESTRICT w1 = soa_1.m_rdata[PIdx::w];
10198
amrex::ParticleReal* AMREX_RESTRICT w2 = soa_2.m_rdata[PIdx::w];
@@ -155,36 +152,10 @@ public:
155152
soa_products_data[1].m_rdata[PIdx::w][product2_index] = p_pair_reaction_weight[i];
156153

157154
// Remove p_pair_reaction_weight[i] from the colliding particles' weights
158-
amrex::Gpu::Atomic::AddNoRet(&w1[p_pair_indices_1[i]],
159-
-p_pair_reaction_weight[i]);
160-
amrex::Gpu::Atomic::AddNoRet(&w2[p_pair_indices_2[i]],
161-
-p_pair_reaction_weight[i]);
162-
163-
// Note: Particle::atomicSetID should also be provided as a standalone helper function in AMReX
164-
// to replace the following lambda.
165-
auto const atomicSetIdInvalid = [] AMREX_GPU_DEVICE (uint64_t & idcpu)
166-
{
167-
#if defined(AMREX_USE_OMP)
168-
#pragma omp atomic write
169-
idcpu = amrex::ParticleIdCpus::Invalid;
170-
#else
171-
amrex::Gpu::Atomic::Exch(
172-
(unsigned long long *)&idcpu,
173-
(unsigned long long)amrex::ParticleIdCpus::Invalid
174-
);
175-
#endif
176-
};
177-
178-
// If the colliding particle weight decreases to zero, remove particle by
179-
// setting its id to invalid
180-
if (w1[p_pair_indices_1[i]] <= std::numeric_limits<amrex::ParticleReal>::min())
181-
{
182-
atomicSetIdInvalid(idcpu1[p_pair_indices_1[i]]);
183-
}
184-
if (w2[p_pair_indices_2[i]] <= std::numeric_limits<amrex::ParticleReal>::min())
185-
{
186-
atomicSetIdInvalid(idcpu2[p_pair_indices_2[i]]);
187-
}
155+
BinaryCollisionUtils::remove_weight_from_colliding_particle(
156+
w1[p_pair_indices_1[i]], idcpu1[p_pair_indices_1[i]], p_pair_reaction_weight[i]);
157+
BinaryCollisionUtils::remove_weight_from_colliding_particle(
158+
w2[p_pair_indices_2[i]], idcpu2[p_pair_indices_2[i]], p_pair_reaction_weight[i]);
188159

189160
// Set the child particle properties appropriately
190161
auto& ux1 = soa_products_data[0].m_rdata[PIdx::ux][product1_index];

Source/Particles/Collision/BinaryCollision/ParticleCreationFunc.H

Lines changed: 10 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,7 @@ public:
6767
* function specific to the considered binary collision.
6868
*
6969
* @param[in] n_total_pairs how many binary collisions have been performed in this tile
70-
* @param[in, out] soa_1 struct of array data of the first colliding particle species
71-
* @param[in, out] soa_2 struct of array data of the second colliding particle species
70+
* @param[in, out] ptile1,ptile2 the particle tiles of the two colliding species
7271
* @param[out] tile_products array containing tile data of the product particles.
7372
* @param[in] m1 mass of the first colliding particle species
7473
* @param[in] m2 mass of the second colliding particle species
@@ -94,7 +93,7 @@ public:
9493
AMREX_INLINE
9594
amrex::Vector<int> operator() (
9695
const index_type& n_total_pairs,
97-
const SoaData_type& soa_1, const SoaData_type& soa_2,
96+
ParticleTileType& ptile1, ParticleTileType& ptile2,
9897
const amrex::Vector<WarpXParticleContainer*>& pc_products,
9998
ParticleTileType** AMREX_RESTRICT tile_products,
10099
const amrex::ParticleReal& m1, const amrex::ParticleReal& m2,
@@ -129,6 +128,9 @@ public:
129128
tile_products[i]->resize(products_np[i] + num_added);
130129
}
131130

131+
const auto soa_1 = ptile1.getParticleTileData();
132+
const auto soa_2 = ptile2.getParticleTileData();
133+
132134
amrex::ParticleReal* AMREX_RESTRICT w1 = soa_1.m_rdata[PIdx::w];
133135
amrex::ParticleReal* AMREX_RESTRICT w2 = soa_2.m_rdata[PIdx::w];
134136
uint64_t* AMREX_RESTRICT idcpu1 = soa_1.m_idcpu;
@@ -196,37 +198,10 @@ public:
196198
}
197199

198200
// Remove p_pair_reaction_weight[i] from the colliding particles' weights
199-
amrex::Gpu::Atomic::AddNoRet(&w1[p_pair_indices_1[i]],
200-
-p_pair_reaction_weight[i]);
201-
amrex::Gpu::Atomic::AddNoRet(&w2[p_pair_indices_2[i]],
202-
-p_pair_reaction_weight[i]);
203-
204-
// Note: Particle::atomicSetID should also be provided as a standalone helper function in AMReX
205-
// to replace the following lambda.
206-
auto const atomicSetIdInvalid = [] AMREX_GPU_DEVICE (uint64_t & idcpu)
207-
{
208-
#if defined(AMREX_USE_OMP)
209-
#pragma omp atomic write
210-
idcpu = amrex::ParticleIdCpus::Invalid;
211-
#else
212-
amrex::Gpu::Atomic::Exch(
213-
(unsigned long long *)&idcpu,
214-
(unsigned long long)amrex::ParticleIdCpus::Invalid
215-
);
216-
#endif
217-
};
218-
219-
// If the colliding particle weight decreases to zero, remove particle by
220-
// setting its id to invalid
221-
if (w1[p_pair_indices_1[i]] <= std::numeric_limits<amrex::ParticleReal>::min())
222-
{
223-
atomicSetIdInvalid(idcpu1[p_pair_indices_1[i]]);
224-
225-
}
226-
if (w2[p_pair_indices_2[i]] <= std::numeric_limits<amrex::ParticleReal>::min())
227-
{
228-
atomicSetIdInvalid(idcpu2[p_pair_indices_2[i]]);
229-
}
201+
BinaryCollisionUtils::remove_weight_from_colliding_particle(
202+
w1[p_pair_indices_1[i]], idcpu1[p_pair_indices_1[i]], p_pair_reaction_weight[i]);
203+
BinaryCollisionUtils::remove_weight_from_colliding_particle(
204+
w2[p_pair_indices_2[i]], idcpu2[p_pair_indices_2[i]], p_pair_reaction_weight[i]);
230205

231206
// Initialize the product particles' momentum, using a function depending on the
232207
// specific collision type
@@ -323,7 +298,7 @@ public:
323298
AMREX_INLINE
324299
amrex::Vector<int> operator() (
325300
const index_type& /*n_total_pairs*/,
326-
const SoaData_type& /*soa_1*/, const SoaData_type& /*soa_2*/,
301+
ParticleTileType& /*ptile1*/, ParticleTileType& /*ptile2*/,
327302
amrex::Vector<WarpXParticleContainer*>& /*pc_products*/,
328303
ParticleTileType** /*tile_products*/,
329304
const amrex::ParticleReal& /*m1*/, const amrex::ParticleReal& /*m2*/,

0 commit comments

Comments
 (0)