Skip to content

Commit

Permalink
Work-around for nvcc not supporting first-capature in if constexpt scope
Browse files Browse the repository at this point in the history
  • Loading branch information
atmyers committed Jul 25, 2023
1 parent e0583fb commit 04bd356
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 5 deletions.
24 changes: 21 additions & 3 deletions Src/Particle/AMReX_ParticleTransformation.H
Original file line number Diff line number Diff line change
Expand Up @@ -392,7 +392,13 @@ auto filterParticles (DstTile& dst, const SrcTile& src, Pred&& p,
amrex::ParallelForRNG(n,
[=] AMREX_GPU_DEVICE (int i, amrex::RandomEngine const& engine) noexcept
{
p_mask[i] = particle_detail::call_f(p, src_data, src_start+i, engine);
amrex::ignore_unused(src_data, src_start);
if constexpr (IsCallable<Pred,decltype(src_data),Index,RandomEngine>::value) {
p_mask[i] = p(src_data, src_start+i, engine);
} else {
amrex::ignore_unused(engine);
p_mask[i] = p(src_data, src_start+i);
}
});
return filterParticles(dst, src, mask.dataPtr(), src_start, dst_start, n);
}
Expand Down Expand Up @@ -558,7 +564,13 @@ int filterAndTransformParticles (DstTile1& dst1, DstTile2& dst2, const SrcTile&
amrex::ParallelForRNG(np,
[=] AMREX_GPU_DEVICE (int i, amrex::RandomEngine const& engine) noexcept
{
p_mask[i] = particle_detail::call_f(p, src_data, i, engine);
amrex::ignore_unused(src_data);
if constexpr (IsCallable<Pred,decltype(src_data),int,RandomEngine>::value) {
p_mask[i] = p(src_data, i, engine);
} else {
amrex::ignore_unused(engine);
p_mask[i] = p(src_data, i);
}
});
return filterAndTransformParticles(dst1, dst2, src, mask.dataPtr(), std::forward<F>(f));
}
Expand Down Expand Up @@ -596,7 +608,13 @@ auto filterAndTransformParticles (DstTile& dst, const SrcTile& src, Pred&& p, F&
amrex::ParallelForRNG(np,
[=] AMREX_GPU_DEVICE (int i, amrex::RandomEngine const& engine) noexcept
{
p_mask[i] = particle_detail::call_f(p, src_data, src_start+i, engine);
amrex::ignore_unused(src_data, src_start);
if constexpr (IsCallable<Pred,decltype(src_data),Index,RandomEngine>::value) {
p_mask[i] = p(src_data, src_start+i, engine);
} else {
amrex::ignore_unused(engine);
p_mask[i] = p(src_data, src_start+i);
}
});
return filterAndTransformParticles(dst, src, mask.dataPtr(), std::forward<F>(f), src_start, dst_start);
}
Expand Down
14 changes: 12 additions & 2 deletions Src/Particle/AMReX_WriteBinaryParticleData.H
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,13 @@ fillFlags (Container<int, Allocator>& pflags, const PTile& ptile, F&& f)
[=] AMREX_GPU_DEVICE (int k, amrex::RandomEngine const& engine) noexcept
{
const auto p = ptd.getSuperParticle(k);
flag_ptr[k] = particle_detail::call_f(f,p,engine);
amrex::ignore_unused(flag_ptr, f);
if constexpr (IsCallable<F,decltype(p),RandomEngine>::value) {
flag_ptr[k] = f(p,engine);
} else {
amrex::ignore_unused(engine);
flag_ptr[k] = f(p);
}
});
}

Expand All @@ -59,7 +65,11 @@ fillFlags (Container<int, Allocator>& pflags, const PTile& ptile, F&& f)
auto flag_ptr = pflags.data();
for (int k = 0; k < np; ++k) {
const auto p = ptd.getSuperParticle(k);
flag_ptr[k] = particle_detail::call_f(f,p,RandomEngine{});
if constexpr (IsCallable<F,decltype(p),RandomEngine>::value) {
flag_ptr[k] = f(p,RandomEngine{});
} else {
flag_ptr[k] = f(p);
}
}
}

Expand Down

0 comments on commit 04bd356

Please sign in to comment.