From c0c85195b35bc1e3e00f99a3c7ca22ac972db01b Mon Sep 17 00:00:00 2001 From: Axel Huebl Date: Tue, 30 Jan 2024 14:45:08 -0800 Subject: [PATCH 1/3] ParticleCopyPlan for SoA Particles Update `ParticleCopyPlan::build` for pure SoA particle layout. --- Src/Particle/AMReX_ParticleCommunication.H | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/Src/Particle/AMReX_ParticleCommunication.H b/Src/Particle/AMReX_ParticleCommunication.H index 9cc7a2cef95..9c9372a192f 100644 --- a/Src/Particle/AMReX_ParticleCommunication.H +++ b/Src/Particle/AMReX_ParticleCommunication.H @@ -220,9 +220,13 @@ struct ParticleCopyPlan if (int_comp_mask[i]) {++num_int_comm_comp;} } - m_superparticle_size = sizeof(typename PC::ParticleType) - + num_real_comm_comp * sizeof(typename PC::ParticleType::RealType) - + num_int_comm_comp * sizeof(int); + if constexpr (PC::ParticleType::is_soa_particle) { + m_superparticle_size = sizeof(uint64_t); // idcpu + } else { + m_superparticle_size = sizeof(typename PC::ParticleType); + } + m_superparticle_size += num_real_comm_comp * sizeof(typename PC::ParticleType::RealType) + + num_int_comm_comp * sizeof(int); buildMPIStart(pc.BufferMap(), m_superparticle_size); } From 11f98db6f8a937773ef0669fc63e5c49a8894d67 Mon Sep 17 00:00:00 2001 From: Andrew Myers Date: Tue, 30 Jan 2024 15:27:33 -0800 Subject: [PATCH 2/3] also fix a couple of the particle transformation functions --- Src/Particle/AMReX_ParticleTransformation.H | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/Src/Particle/AMReX_ParticleTransformation.H b/Src/Particle/AMReX_ParticleTransformation.H index 7ca26cef064..6473082baf7 100644 --- a/Src/Particle/AMReX_ParticleTransformation.H +++ b/Src/Particle/AMReX_ParticleTransformation.H @@ -81,7 +81,11 @@ void copyParticle (const ParticleTileData& dst, AMREX_ASSERT(dst.m_num_runtime_real == src.m_num_runtime_real); AMREX_ASSERT(dst.m_num_runtime_int == src.m_num_runtime_int ); - dst.m_aos[dst_i] = src.m_aos[src_i]; + if constexpr(!T_ParticleType::is_soa_particle) { + dst.m_aos[dst_i] = src.m_aos[src_i]; + } else { + dst.m_idcpu[dst_i] = src.m_idcpu[src_i]; + } for (int j = 0; j < NAR; ++j) { dst.m_rdata[j][dst_i] = src.m_rdata[j][src_i]; } @@ -119,7 +123,11 @@ void swapParticle (const ParticleTileData& dst, AMREX_ASSERT(dst.m_num_runtime_real == src.m_num_runtime_real); AMREX_ASSERT(dst.m_num_runtime_int == src.m_num_runtime_int ); - amrex::Swap(src.m_aos[src_i], dst.m_aos[dst_i]); + if constexpr(!T_ParticleType::is_soa_particle) { + amrex::Swap(src.m_aos[src_i], dst.m_aos[dst_i]); + } else { + amrex::Swap(src.m_idcpu[src_i], dst.m_idcpu[dst_i]); + } for (int j = 0; j < NAR; ++j) { amrex::Swap(dst.m_rdata[j][dst_i], src.m_rdata[j][src_i]); } From b2c02f913dc702764a1d3d4d752e32bfcc6f7789 Mon Sep 17 00:00:00 2001 From: Axel Huebl Date: Tue, 30 Jan 2024 15:52:00 -0800 Subject: [PATCH 3/3] Avoid Negation --- Src/Particle/AMReX_ParticleTransformation.H | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Src/Particle/AMReX_ParticleTransformation.H b/Src/Particle/AMReX_ParticleTransformation.H index 6473082baf7..b55f5211eee 100644 --- a/Src/Particle/AMReX_ParticleTransformation.H +++ b/Src/Particle/AMReX_ParticleTransformation.H @@ -81,10 +81,10 @@ void copyParticle (const ParticleTileData& dst, AMREX_ASSERT(dst.m_num_runtime_real == src.m_num_runtime_real); AMREX_ASSERT(dst.m_num_runtime_int == src.m_num_runtime_int ); - if constexpr(!T_ParticleType::is_soa_particle) { - dst.m_aos[dst_i] = src.m_aos[src_i]; - } else { + if constexpr(T_ParticleType::is_soa_particle) { dst.m_idcpu[dst_i] = src.m_idcpu[src_i]; + } else { + dst.m_aos[dst_i] = src.m_aos[src_i]; } for (int j = 0; j < NAR; ++j) { dst.m_rdata[j][dst_i] = src.m_rdata[j][src_i]; @@ -123,10 +123,10 @@ void swapParticle (const ParticleTileData& dst, AMREX_ASSERT(dst.m_num_runtime_real == src.m_num_runtime_real); AMREX_ASSERT(dst.m_num_runtime_int == src.m_num_runtime_int ); - if constexpr(!T_ParticleType::is_soa_particle) { - amrex::Swap(src.m_aos[src_i], dst.m_aos[dst_i]); - } else { + if constexpr(T_ParticleType::is_soa_particle) { amrex::Swap(src.m_idcpu[src_i], dst.m_idcpu[dst_i]); + } else { + amrex::Swap(src.m_aos[src_i], dst.m_aos[dst_i]); } for (int j = 0; j < NAR; ++j) { amrex::Swap(dst.m_rdata[j][dst_i], src.m_rdata[j][src_i]);