diff --git a/Src/Extern/SENSEI/AMReX_ParticleDataAdaptorI.H b/Src/Extern/SENSEI/AMReX_ParticleDataAdaptorI.H index bb5a573c11d..262089694ab 100644 --- a/Src/Extern/SENSEI/AMReX_ParticleDataAdaptorI.H +++ b/Src/Extern/SENSEI/AMReX_ParticleDataAdaptorI.H @@ -581,14 +581,14 @@ int ParticleDataAdaptor::GetMeshMetadata( for (const auto& kv : pmap) { // loop over particles in ParticleTile - const auto& aos = kv.second.GetArrayOfStructs(); - const auto &parts = aos(); + auto& particle_tile = kv.second; + auto ptd = particle_tile.getConstParticleTileData(); // visit only the "real" particles, skip the "neighbor" particles. - long long numReal = aos.numRealParticles(); + long long numReal = particle_tile.numRealParticles(); for (long long i = 0; i < numReal; ++i) { - const auto &part = parts[i]; + const auto &part = ptd[i]; if (part.id() > 0) { #if (AMREX_SPACEDIM == 1) @@ -869,7 +869,7 @@ int ParticleDataAdaptor::AddParticlesSOARea for (MyParIter pti(*this->m_particles, level); pti.isValid(); ++pti) { auto& particle_attributes = pti.GetStructOfArrays(); - auto& aos = pti.GetArrayOfStructs(); + auto ptd = pti.GetParticleTile().getParticleTileData(); auto numReal = pti.numParticles(); // shuffle from the AMReX component order @@ -881,7 +881,7 @@ int ParticleDataAdaptor::AddParticlesSOARea for (long long i = 0; i < numReal; ++i) { - const auto &part = aos[i]; + const auto &part = ptd[i]; if (part.id() > 0) { pData[i*nComps + j] = realData[i]; @@ -944,7 +944,7 @@ int ParticleDataAdaptor::AddParticlesSOAInt for (MyParIter pti(*this->m_particles, level); pti.isValid(); ++pti) { auto& particle_attributes = pti.GetStructOfArrays(); - auto& aos = pti.GetArrayOfStructs(); + auto ptd = pti.GetParticleTile().getParticleTileData(); auto numReal = pti.numParticles(); // shuffle from the AMReX component order @@ -953,7 +953,7 @@ int ParticleDataAdaptor::AddParticlesSOAInt for (long long i = 0; i < numReal; ++i) { - const auto &part = aos[i]; + const auto &part = ptd[i]; if (part.id() > 0) { pData[i] = intData[i]; diff --git a/Src/Particle/AMReX_ParticleContainerI.H b/Src/Particle/AMReX_ParticleContainerI.H index 0b8000f6880..b845d130d5c 100644 --- a/Src/Particle/AMReX_ParticleContainerI.H +++ b/Src/Particle/AMReX_ParticleContainerI.H @@ -1653,8 +1653,8 @@ ParticleContainer_implgetParticleTileData(); while (pindex <= last) { - auto ptd = particle_tile->getParticleTileData(); ParticleType p(ptd,pindex); if ((remove_negative == false) && (p.id() < 0)) { @@ -1669,7 +1669,7 @@ ParticleContainer_impl >& not_ours, const auto& src_tile = kv.second; auto& dst_tile = GetParticles(host_lev)[std::make_pair(grid,tile)]; - auto old_size = dst_tile.GetArrayOfStructs().size(); + auto old_size = dst_tile.size(); auto new_size = old_size + src_tile.size(); dst_tile.resize(new_size); - Gpu::copyAsync(Gpu::hostToDevice, - src_tile.begin(), src_tile.end(), - dst_tile.GetArrayOfStructs().begin() + old_size); + if constexpr(! ParticleType::is_soa_particle) { + Gpu::copyAsync(Gpu::hostToDevice, + src_tile.begin(), src_tile.end(), + dst_tile.GetArrayOfStructs().begin() + old_size); + } for (int i = 0; i < NumRealComps(); ++i) { Gpu::copyAsync(Gpu::hostToDevice, diff --git a/Src/Particle/AMReX_ParticleInit.H b/Src/Particle/AMReX_ParticleInit.H index 7a8aa4d4a5d..d2568d5d70e 100644 --- a/Src/Particle/AMReX_ParticleInit.H +++ b/Src/Particle/AMReX_ParticleInit.H @@ -1143,7 +1143,7 @@ InitRandom (Long icount, const auto& src_tile = kv.second; auto& dst_tile = GetParticles(host_lev)[std::make_pair(grid,tile)]; - auto old_size = dst_tile.GetArrayOfStructs().size(); + auto old_size = dst_tile.size(); auto new_size = old_size; if constexpr(!ParticleType::is_soa_particle) { @@ -1286,7 +1286,7 @@ InitRandom (Long icount, const auto& src_tile = kv.second; auto& dst_tile = GetParticles(host_lev)[std::make_pair(grid,tile)]; - auto old_size = dst_tile.GetArrayOfStructs().size(); + auto old_size = dst_tile.size(); auto new_size = old_size; if constexpr(!ParticleType::is_soa_particle) { diff --git a/Src/Particle/AMReX_ParticleTile.H b/Src/Particle/AMReX_ParticleTile.H index 1663fece598..e35af847ec4 100644 --- a/Src/Particle/AMReX_ParticleTile.H +++ b/Src/Particle/AMReX_ParticleTile.H @@ -634,6 +634,12 @@ struct ConstParticleTileData } }; +struct ThisParticleTileHasNoParticleVector {}; + +struct ThisParticleTileHasNoAoS { + using ParticleVector = ThisParticleTileHasNoParticleVector; +}; + template class Allocator=DefaultAllocator> struct ParticleTile @@ -651,7 +657,10 @@ struct ParticleTile using SuperParticleType = Particle; - using AoS = ArrayOfStructs; + using AoS = typename std::conditional< + ParticleType::is_soa_particle, + ThisParticleTileHasNoAoS, + ArrayOfStructs>::type; //using ParticleVector = typename AoS::ParticleVector; using SoA = StructOfArrays; diff --git a/Tests/Particles/RedistributeSOA/main.cpp b/Tests/Particles/RedistributeSOA/main.cpp index eba02904fb7..94715b7d6aa 100644 --- a/Tests/Particles/RedistributeSOA/main.cpp +++ b/Tests/Particles/RedistributeSOA/main.cpp @@ -132,7 +132,7 @@ class TestParticleContainer } auto& particle_tile = DefineAndReturnParticleTile(lev, mfi.index(), mfi.LocalTileIndex()); - auto old_size = particle_tile.GetArrayOfStructs().size(); + auto old_size = particle_tile.size(); auto new_size = old_size + host_real[0].size(); particle_tile.resize(new_size); diff --git a/Tests/Particles/SENSEI_Insitu_SOA/main.cpp b/Tests/Particles/SENSEI_Insitu_SOA/main.cpp index 8f9e8f7f7e6..f2dd2706df5 100644 --- a/Tests/Particles/SENSEI_Insitu_SOA/main.cpp +++ b/Tests/Particles/SENSEI_Insitu_SOA/main.cpp @@ -115,7 +115,7 @@ class TestParticleContainer } auto& particle_tile = DefineAndReturnParticleTile(lev, mfi.index(), mfi.LocalTileIndex()); - auto old_size = particle_tile.GetArrayOfStructs().size(); + auto old_size = particle_tile.size(); auto new_size = old_size + host_real[0].size(); particle_tile.resize(new_size);