1#ifndef AMREX_PARTICLETRANSFORMATION_H_
2#define AMREX_PARTICLETRANSFORMATION_H_
3#include <AMReX_Config.H>
29template <
typename T_ParticleType,
int NAR,
int NAI>
33 int src_i,
int dst_i)
noexcept
35 AMREX_ASSERT(dst.m_num_runtime_real == src.m_num_runtime_real);
36 AMREX_ASSERT(dst.m_num_runtime_int == src.m_num_runtime_int );
38 if constexpr(!T_ParticleType::is_soa_particle) {
39 dst.m_aos[dst_i] = src.m_aos[src_i];
41 dst.m_idcpu[dst_i] = src.m_idcpu[src_i];
43 if constexpr(NAR > 0) {
44 for (
int j = 0; j < NAR; ++j) {
45 dst.m_rdata[j][dst_i] = src.m_rdata[j][src_i];
48 for (
int j = 0; j < dst.m_num_runtime_real; ++j) {
49 dst.m_runtime_rdata[j][dst_i] = src.m_runtime_rdata[j][src_i];
51 if constexpr(NAI > 0) {
52 for (
int j = 0; j < NAI; ++j) {
53 dst.m_idata[j][dst_i] = src.m_idata[j][src_i];
56 for (
int j = 0; j < dst.m_num_runtime_int; ++j) {
57 dst.m_runtime_idata[j][dst_i] = src.m_runtime_idata[j][src_i];
75template <
typename T_ParticleType,
int NAR,
int NAI>
79 int src_i,
int dst_i)
noexcept
81 AMREX_ASSERT(dst.m_num_runtime_real == src.m_num_runtime_real);
82 AMREX_ASSERT(dst.m_num_runtime_int == src.m_num_runtime_int );
84 if constexpr(T_ParticleType::is_soa_particle) {
85 dst.m_idcpu[dst_i] = src.m_idcpu[src_i];
87 dst.m_aos[dst_i] = src.m_aos[src_i];
89 for (
int j = 0; j < NAR; ++j) {
90 dst.m_rdata[j][dst_i] = src.m_rdata[j][src_i];
92 for (
int j = 0; j < dst.m_num_runtime_real; ++j) {
93 dst.m_runtime_rdata[j][dst_i] = src.m_runtime_rdata[j][src_i];
95 for (
int j = 0; j < NAI; ++j) {
96 dst.m_idata[j][dst_i] = src.m_idata[j][src_i];
98 for (
int j = 0; j < dst.m_num_runtime_int; ++j) {
99 dst.m_runtime_idata[j][dst_i] = src.m_runtime_idata[j][src_i];
117template <
typename T_ParticleType,
int NAR,
int NAI>
121 int src_i,
int dst_i)
noexcept
123 AMREX_ASSERT(dst.m_num_runtime_real == src.m_num_runtime_real);
124 AMREX_ASSERT(dst.m_num_runtime_int == src.m_num_runtime_int );
126 if constexpr(T_ParticleType::is_soa_particle) {
127 amrex::Swap(src.m_idcpu[src_i], dst.m_idcpu[dst_i]);
131 if constexpr (NAR > 0) {
132 for (
int j = 0; j < NAR; ++j) {
133 amrex::Swap(dst.m_rdata[j][dst_i], src.m_rdata[j][src_i]);
136 for (
int j = 0; j < dst.m_num_runtime_real; ++j) {
137 amrex::Swap(dst.m_runtime_rdata[j][dst_i], src.m_runtime_rdata[j][src_i]);
139 if constexpr (NAI > 0) {
140 for (
int j = 0; j < NAI; ++j) {
141 amrex::Swap(dst.m_idata[j][dst_i], src.m_idata[j][src_i]);
144 for (
int j = 0; j < dst.m_num_runtime_int; ++j) {
145 amrex::Swap(dst.m_runtime_idata[j][dst_i], src.m_runtime_idata[j][src_i]);
160template <
typename DstTile,
typename SrcTile>
163 auto np = src.numParticles();
183template <
typename DstTile,
typename SrcTile,
typename Index,
typename N,
184 std::enable_if_t<std::is_integral_v<Index>,
int> foo = 0>
186 Index src_start, Index dst_start, N n)
noexcept
188 const auto src_data = src.getConstParticleTileData();
189 auto dst_data = dst.getParticleTileData();
193 copyParticle(dst_data, src_data, src_start+i, dst_start+i);
212template <
typename DstTile,
typename SrcTile,
typename F>
215 auto np = src.numParticles();
238template <
typename DstTile,
typename SrcTile,
typename Index,
typename N,
typename F,
239 std::enable_if_t<std::is_integral_v<Index>,
int> foo = 0>
241 Index src_start, Index dst_start, N n,
F const& f)
noexcept
243 const auto src_data = src.getConstParticleTileData();
244 auto dst_data = dst.getParticleTileData();
248 f(dst_data, src_data, src_start+i, dst_start+i);
269template <
typename DstTile1,
typename DstTile2,
typename SrcTile,
typename F>
272 auto np = src.numParticles();
298template <
typename DstTile1,
typename DstTile2,
typename SrcTile,
299 typename Index,
typename N,
typename F,
300 std::enable_if_t<std::is_integral_v<Index>,
int> foo = 0>
302 Index src_start, Index dst1_start, Index dst2_start, N n,
F const& f)
noexcept
304 const auto src_data = src.getConstParticleTileData();
305 auto dst1_data = dst1.getParticleTileData();
306 auto dst2_data = dst2.getParticleTileData();
310 f(dst1_data, dst2_data, src_data, src_start+i, dst1_start+i, dst2_start+i);
328template <
typename DstTile,
typename SrcTile,
typename Index,
typename N,
329 std::enable_if_t<std::is_integral_v<Index>,
int> foo = 0>
352template <
typename DstTile,
typename SrcTile,
typename Index,
typename N,
353 std::enable_if_t<std::is_integral_v<Index>,
int> foo = 0>
355 Index src_start, Index dst_start, N n)
noexcept
360 Index last_mask=0, last_offset=0;
364 auto* p_offsets = offsets.
dataPtr();
366 const auto src_data = src.getConstParticleTileData();
367 auto dst_data = dst.getParticleTileData();
371 if (
mask[i]) {
copyParticle(dst_data, src_data, src_start+i, dst_start+p_offsets[i]); }
375 return last_mask + last_offset;
390template <
typename DstTile,
typename SrcTile,
typename Pred,
391 std::enable_if_t<!std::is_pointer_v<std::decay_t<Pred>>,
int> foo = 0>
394 return filterParticles(dst, src, std::forward<Pred>(p), 0, 0, src.numParticles());
414template <
typename DstTile,
typename SrcTile,
typename Pred,
typename Index,
typename N,
415 std::enable_if_t<!std::is_pointer_v<std::decay_t<Pred>>,Index> nvccfoo = 0>
417 Index src_start, Index dst_start, N n)
noexcept
421 auto* p_mask =
mask.dataPtr();
422 const auto src_data = src.getConstParticleTileData();
429 p_mask[i] = p(src_data, src_start+i, engine);
431 p_mask[i] = p(src_data, src_start+i);
454template <
typename DstTile,
typename SrcTile,
typename Index,
typename F,
455 std::enable_if_t<std::is_integral_v<Index>,
int> foo = 0>
457 Index src_start, Index dst_start)
noexcept
459 auto np = src.numParticles();
463 Index last_mask=0, last_offset=0;
467 auto const* p_offsets = offsets.
dataPtr();
469 const auto src_data = src.getConstParticleTileData();
470 auto dst_data = dst.getParticleTileData();
475 f(dst_data, src_data, src_start+i,
476 dst_start+p_offsets[src_start+i]);
481 return last_mask + last_offset;
499template <
typename DstTile,
typename SrcTile,
typename Index,
typename F,
500 std::enable_if_t<std::is_integral_v<Index>,
int> foo = 0>
521template <
typename DstTile,
typename SrcTile,
typename Pred,
typename F,
522 std::enable_if_t<!std::is_pointer_v<std::decay_t<Pred>>,
int> foo = 0>
545template <
typename DstTile1,
typename DstTile2,
typename SrcTile,
typename Index,
typename F,
546 std::enable_if_t<std::is_integral_v<Index>,
int> foo = 0>
548 const SrcTile& src, Index*
mask,
F const& f)
noexcept
550 auto np = src.numParticles();
554 Index last_mask=0, last_offset=0;
558 auto* p_offsets = offsets.
dataPtr();
560 const auto src_data = src.getConstParticleTileData();
561 auto dst_data1 = dst1.getParticleTileData();
562 auto dst_data2 = dst2.getParticleTileData();
566 if (
mask[i]) { f(dst_data1, dst_data2, src_data, i, p_offsets[i], p_offsets[i]); }
570 return last_mask + last_offset;
590template <
typename DstTile1,
typename DstTile2,
typename SrcTile,
typename Pred,
typename F,
591 std::enable_if_t<!std::is_pointer_v<std::decay_t<Pred>>,
int> foo = 0>
593 Pred
const& p,
F&& f)
noexcept
595 auto np = src.numParticles();
598 auto* p_mask =
mask.dataPtr();
599 const auto src_data = src.getConstParticleTileData();
606 p_mask[i] = p(src_data, i, engine);
608 p_mask[i] = p(src_data, i);
632template <
typename DstTile,
typename SrcTile,
typename Pred,
typename F,
typename Index,
633 std::enable_if_t<!std::is_pointer_v<std::decay_t<Pred>>,Index> nvccfoo = 0>
635 Index src_start, Index dst_start)
noexcept
637 auto np = src.numParticles();
640 auto* p_mask =
mask.dataPtr();
641 const auto src_data = src.getConstParticleTileData();
648 p_mask[i] = p(src_data, src_start+i, engine);
650 p_mask[i] = p(src_data, src_start+i);
672template <
typename PTile,
typename N,
typename Index,
673 std::enable_if_t<std::is_integral_v<Index>,
int> foo = 0>
676 const auto src_data = src.getConstParticleTileData();
677 auto dst_data = dst.getParticleTileData();
702template <
typename PTile,
typename N,
typename Index,
703 std::enable_if_t<std::is_integral_v<Index>,
int> foo = 0>
706 const auto src_data = src.getConstParticleTileData();
707 auto dst_data = dst.getParticleTileData();
#define AMREX_ASSERT(EX)
Definition AMReX_BLassert.H:38
#define AMREX_FORCE_INLINE
Definition AMReX_Extension.H:119
#define AMREX_HOST_DEVICE_FOR_1D(...)
Definition AMReX_GpuLaunchMacrosC.nolint.H:105
#define AMREX_GPU_DEVICE
Definition AMReX_GpuQualifiers.H:18
#define AMREX_GPU_HOST_DEVICE
Definition AMReX_GpuQualifiers.H:20
Array4< int const > mask
Definition AMReX_InterpFaceRegister.cpp:93
Definition AMReX_PODVector.H:297
iterator begin() noexcept
Definition AMReX_PODVector.H:663
T * dataPtr() noexcept
Definition AMReX_PODVector.H:659
T * data() noexcept
Definition AMReX_PODVector.H:655
void copyAsync(HostToDevice, InIter begin, InIter end, OutIter result) noexcept
A host-to-device copy routine. Note this is just a wrapper around memcpy, so it assumes contiguous st...
Definition AMReX_GpuContainers.H:221
OutIter exclusive_scan(InIter begin, InIter end, OutIter result)
Definition AMReX_Scan.H:1415
static constexpr DeviceToHost deviceToHost
Definition AMReX_GpuContainers.H:99
void streamSynchronize() noexcept
Definition AMReX_GpuDevice.H:260
Definition AMReX_Amr.cpp:49
__host__ __device__ void ignore_unused(const Ts &...)
This shuts up the compiler about unused variables.
Definition AMReX.H:138
__host__ __device__ void swapParticle(const ParticleTileData< T_ParticleType, NAR, NAI > &dst, const ParticleTileData< T_ParticleType, NAR, NAI > &src, int src_i, int dst_i) noexcept
A general single particle swapping routine that can run on the GPU.
Definition AMReX_ParticleTransformation.H:119
__host__ __device__ void Swap(T &t1, T &t2) noexcept
Definition AMReX_Algorithm.H:75
__host__ __device__ void copyParticle(const ParticleTileData< T_ParticleType, NAR, NAI > &dst, const ConstParticleTileData< T_ParticleType, NAR, NAI > &src, int src_i, int dst_i) noexcept
A general single particle copying routine that can run on the GPU.
Definition AMReX_ParticleTransformation.H:31
void copyParticles(DstTile &dst, const SrcTile &src) noexcept
Copy particles from src to dst. This version copies all the particles, writing them to the beginning ...
Definition AMReX_ParticleTransformation.H:161
Index filterAndTransformParticles(DstTile &dst, const SrcTile &src, Index *mask, F const &f, Index src_start, Index dst_start) noexcept
Conditionally copy particles from src to dst based on the value of mask. A transformation will also b...
Definition AMReX_ParticleTransformation.H:456
Index filterParticles(DstTile &dst, const SrcTile &src, const Index *mask) noexcept
Conditionally copy particles from src to dst based on the value of mask.
Definition AMReX_ParticleTransformation.H:330
void gatherParticles(PTile &dst, const PTile &src, N np, const Index *inds)
Gather particles copies particles into contiguous order from an arbitrary order. Specifically,...
Definition AMReX_ParticleTransformation.H:674
void transformParticles(DstTile &dst, const SrcTile &src, F &&f) noexcept
Apply the function f to all the particles in src, writing the result to dst. This version does all th...
Definition AMReX_ParticleTransformation.H:213
void scatterParticles(PTile &dst, const PTile &src, N np, const Index *inds)
Scatter particles copies particles from contiguous order into an arbitrary order. Specifically,...
Definition AMReX_ParticleTransformation.H:704
AMREX_ATTRIBUTE_FLATTEN_FOR void ParallelForRNG(T n, L const &f) noexcept
Definition AMReX_GpuLaunchFunctsC.H:1264
Definition AMReX_ParticleTile.H:513
Test if a given type T is callable with arguments of type Args...
Definition AMReX_TypeTraits.H:209
Definition AMReX_ParticleTile.H:32
Definition AMReX_RandomEngine.H:72