From b364becad939a490bca4e7f8b23f7392c558a311 Mon Sep 17 00:00:00 2001 From: Andrew Myers Date: Tue, 18 Feb 2025 13:29:13 -0800 Subject: [PATCH] Fix new bug in pure soa communication (#4337) This fixes an issue introduced in PR #4333. The proposed changes: - [x] fix a bug or incorrect behavior in AMReX - [ ] add new capabilities to AMReX - [ ] changes answers in the test suite to more than roundoff level - [ ] are likely to significantly affect the results of downstream AMReX users - [ ] include documentation in the code and/or rst files, if appropriate --- Src/Particle/AMReX_ParticleCommunication.H | 6 +++++- Src/Particle/AMReX_ParticleTile.H | 21 +++++++++++++++------ 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/Src/Particle/AMReX_ParticleCommunication.H b/Src/Particle/AMReX_ParticleCommunication.H index 147b74a68ff..9e6e6a8a221 100644 --- a/Src/Particle/AMReX_ParticleCommunication.H +++ b/Src/Particle/AMReX_ParticleCommunication.H @@ -244,7 +244,11 @@ struct ParticleCopyPlan int NStructInt = PC::ParticleContainerType::NStructInt; int num_real_comm_comp = 0; - for (int i = AMREX_SPACEDIM + NStructReal; i < real_comp_mask.size(); ++i) { + int comm_comps_start = 0; + if constexpr (!PC::ParticleType::is_soa_particle) { + comm_comps_start += AMREX_SPACEDIM + NStructReal; + } + for (int i = comm_comps_start; i < real_comp_mask.size(); ++i) { if (real_comp_mask[i]) {++num_real_comm_comp;} } diff --git a/Src/Particle/AMReX_ParticleTile.H b/Src/Particle/AMReX_ParticleTile.H index 7546ff8a216..08985a1cd51 100644 --- a/Src/Particle/AMReX_ParticleTile.H +++ b/Src/Particle/AMReX_ParticleTile.H @@ -134,7 +134,10 @@ struct ParticleTileData memcpy(dst, m_idcpu + src_index, sizeof(uint64_t)); dst += sizeof(uint64_t); } - int array_start_index = AMREX_SPACEDIM + NStructReal; + int array_start_index = 0; + if constexpr (!ParticleType::is_soa_particle) { + array_start_index = AMREX_SPACEDIM + NStructReal; + } for (int i = 0; i < NAR; ++i) { if (comm_real[array_start_index + i]) @@ -143,7 +146,7 @@ struct ParticleTileData dst += sizeof(ParticleReal); } } - int runtime_start_index = AMREX_SPACEDIM + NStructReal + NAR; + int runtime_start_index = array_start_index + NAR; for (int i = 0; i < m_num_runtime_real; ++i) { if (comm_real[runtime_start_index + i]) @@ -185,7 +188,10 @@ struct ParticleTileData memcpy(m_idcpu + dst_index, src, sizeof(uint64_t)); src += sizeof(uint64_t); } - int array_start_index = AMREX_SPACEDIM + NStructReal; + int array_start_index = 0; + if constexpr (!ParticleType::is_soa_particle) { + array_start_index = AMREX_SPACEDIM + NStructReal; + } for (int i = 0; i < NAR; ++i) { if (comm_real[array_start_index + i]) @@ -194,7 +200,7 @@ struct ParticleTileData src += sizeof(ParticleReal); } } - int runtime_start_index = AMREX_SPACEDIM + NStructReal + NAR; + int runtime_start_index = array_start_index + NAR; for (int i = 0; i < m_num_runtime_real; ++i) { if (comm_real[runtime_start_index + i]) @@ -595,7 +601,10 @@ struct ConstParticleTileData memcpy(dst, m_idcpu + src_index, sizeof(uint64_t)); dst += sizeof(uint64_t); } - int array_start_index = AMREX_SPACEDIM + NStructReal; + int array_start_index = 0; + if constexpr (!ParticleType::is_soa_particle) { + array_start_index = AMREX_SPACEDIM + NStructReal; + } for (int i = 0; i < NArrayReal; ++i) { if (comm_real[array_start_index + i]) @@ -604,7 +613,7 @@ struct ConstParticleTileData dst += sizeof(ParticleReal); } } - int runtime_start_index = AMREX_SPACEDIM + NStructReal + NArrayReal; + int runtime_start_index = array_start_index + NArrayReal; for (int i = 0; i < m_num_runtime_real; ++i) { if (comm_real[runtime_start_index + i])