diff --git a/Src/Particle/AMReX_ParticleMesh.H b/Src/Particle/AMReX_ParticleMesh.H index 90b99831850..536804a7bcb 100644 --- a/Src/Particle/AMReX_ParticleMesh.H +++ b/Src/Particle/AMReX_ParticleMesh.H @@ -5,6 +5,7 @@ #include #include #include +#include namespace amrex { @@ -18,9 +19,12 @@ auto call_f (F const& f, GpuArray const& plo, GpuArray const& dxi) noexcept { - if constexpr (IsCallable::value) { + using PTDTypeT = std::remove_const_t>; + if constexpr ( ! T_ParticleType::is_soa_particle && + IsCallable::value) { return f(p.m_aos[i], fabarr, plo, dxi); - } else if constexpr (IsCallable::value) { + } else if constexpr ( ! T_ParticleType::is_soa_particle && + IsCallable::value) { return f(p.m_aos[i], fabarr); } else if constexpr (IsCallable::value) { return f(p.getSuperParticle(i), fabarr, plo, dxi); diff --git a/Src/Particle/AMReX_ParticleReduce.H b/Src/Particle/AMReX_ParticleReduce.H index 2c1df48fd0e..9fafcd5de76 100644 --- a/Src/Particle/AMReX_ParticleReduce.H +++ b/Src/Particle/AMReX_ParticleReduce.H @@ -12,6 +12,7 @@ #include #include +#include namespace amrex { @@ -23,7 +24,8 @@ auto call_f (F const& f, const ConstParticleTileData& p, const int i) noexcept { - if constexpr (IsCallable::value) { + if constexpr ( ! T_ParticleType::is_soa_particle && + IsCallable::value) { return f(p.m_aos[i]); } else if constexpr (IsCallable::value) { return f(p.getSuperParticle(i)); diff --git a/Src/Particle/AMReX_ParticleTile.H b/Src/Particle/AMReX_ParticleTile.H index 1048df8724d..a387c8f26a4 100644 --- a/Src/Particle/AMReX_ParticleTile.H +++ b/Src/Particle/AMReX_ParticleTile.H @@ -11,6 +11,7 @@ #include #include +#include namespace amrex { @@ -30,6 +31,7 @@ struct ParticleTileData static constexpr int NAI = NArrayInt; using ParticleType = T_ParticleType; + using ParticleRefType = T_ParticleType&; using Self = ParticleTileData; static constexpr int NStructReal = ParticleType::NReal; @@ -41,7 +43,9 @@ struct ParticleTileData Long m_size; - ParticleType* AMREX_RESTRICT m_aos; + using AOS_PTR = std::conditional_t; + AOS_PTR AMREX_RESTRICT m_aos; uint64_t* m_idcpu; GpuArray m_rdata; @@ -489,6 +493,7 @@ struct ConstParticleTileData static constexpr int NAR = NArrayReal; static constexpr int NAI = NArrayInt; using ParticleType = T_ParticleType; + using ParticleRefType = T_ParticleType const&; static constexpr int NStructReal = ParticleType::NReal; static constexpr int NStructInt = ParticleType::NInt; @@ -498,7 +503,10 @@ struct ConstParticleTileData static constexpr bool is_particle_tile_data = true; Long m_size; - const ParticleType* AMREX_RESTRICT m_aos; + + using AOS_PTR = std::conditional_t; + AOS_PTR AMREX_RESTRICT m_aos; const uint64_t* m_idcpu; GpuArray m_rdata;