diff --git a/Src/Particle/AMReX_DenseBins.H b/Src/Particle/AMReX_DenseBins.H index a4fdc14e038..67ff2c1c9c5 100644 --- a/Src/Particle/AMReX_DenseBins.H +++ b/Src/Particle/AMReX_DenseBins.H @@ -93,18 +93,12 @@ private: template AMREX_GPU_HOST_DEVICE - static auto call_f(F const& f, const_pointer_input_type v, I& index) - noexcept -> decltype(f(v,index)) - { - return f(v,index); - } - - template - AMREX_GPU_HOST_DEVICE - static auto call_f(F const& f, const_pointer_input_type v, I& index) - noexcept -> decltype(f(v[index])) - { - return f(v[index]); + static auto call_f (F const& f, const_pointer_input_type v, I& index) { + if constexpr (IsCallable::value) { + return f(v, index); + } else { + return f(v[index]); + } } public: diff --git a/Src/Particle/AMReX_ParticleMesh.H b/Src/Particle/AMReX_ParticleMesh.H index 148df384ee1..75d2cdb4838 100644 --- a/Src/Particle/AMReX_ParticleMesh.H +++ b/Src/Particle/AMReX_ParticleMesh.H @@ -6,8 +6,33 @@ #include #include -namespace amrex +namespace amrex { + +namespace particle_detail { + +template class PTDType, int NAR, int NAI> +AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE +auto call_f (F const& f, + const PTDType& p, + const int i, Array4 const& fabarr, + GpuArray const& plo, + GpuArray const& dxi) noexcept { + if constexpr (IsCallable::value) { + return f(p.m_aos[i], fabarr, plo, dxi); + } else if constexpr (IsCallable::value) { + return f(p.m_aos[i], fabarr); + } else if constexpr (IsCallable::value) { + return f(p.getSuperParticle(i), fabarr, plo, dxi); + } else if constexpr (IsCallable::value) { + return f(p.getSuperParticle(i), fabarr); + } else if constexpr (IsCallable::value) { + return f(p, i, fabarr, plo, dxi); + } else { + return f(p, i, fabarr); + } +} +} template ::value, int> foo = 0> void diff --git a/Src/Particle/AMReX_ParticleReduce.H b/Src/Particle/AMReX_ParticleReduce.H index 8a93dba94d7..2c1df48fd0e 100644 --- a/Src/Particle/AMReX_ParticleReduce.H +++ b/Src/Particle/AMReX_ParticleReduce.H @@ -13,8 +13,25 @@ #include -namespace amrex +namespace amrex { + +namespace particle_detail { + +template +AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE +auto call_f (F const& f, + const ConstParticleTileData& p, + const int i) noexcept { + if constexpr (IsCallable::value) { + return f(p.m_aos[i]); + } else if constexpr (IsCallable::value) { + return f(p.getSuperParticle(i)); + } else { + return f(p, i); + } +} +} /** * \brief A general reduction method for the particles in a ParticleContainer that can run on either CPUs or GPUs. diff --git a/Src/Particle/AMReX_ParticleUtil.H b/Src/Particle/AMReX_ParticleUtil.H index 0ddc09b4422..0d7f9af776b 100644 --- a/Src/Particle/AMReX_ParticleUtil.H +++ b/Src/Particle/AMReX_ParticleUtil.H @@ -17,183 +17,7 @@ #include -namespace amrex -{ - -namespace particle_detail { - -// The next several functions are used by ParticleReduce - -// Lambda takes a Particle -template -AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE -auto call_f (F const& f, - const ConstParticleTileData& p, - const int i) noexcept - -> decltype(f(p.m_aos[i])) -{ - return f(p.m_aos[i]); -} - -// Lambda takes a SuperParticle -template ::type = 0> -AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE -auto call_f (F const& f, - const ConstParticleTileData& p, - const int i) noexcept - -> decltype(f(p.getSuperParticle(i))) -{ - return f(p.getSuperParticle(i)); -} - -// Lambda takes a ConstParticleTileData -template -AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE -auto call_f (F const& f, - const ConstParticleTileData& p, - const int i) noexcept - -> decltype(f(p, i)) -{ - return f(p, i); -} - -// These next several functions are used by ParticleToMesh and MeshToParticle - -// Lambda takes a Particle -template -AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE -auto call_f (F const& f, - const ConstParticleTileData& p, - const int i, Array4 const& fabarr, - GpuArray const& plo, - GpuArray const& dxi) noexcept - -> decltype(f(p.m_aos[i], fabarr, plo, dxi)) -{ - return f(p.m_aos[i], fabarr, plo, dxi); -} - -// Lambda takes a Particle -template -AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE -auto call_f (F const& f, - const ConstParticleTileData& p, - const int i, Array4 const& fabarr, - GpuArray const&, - GpuArray const&) noexcept - -> decltype(f(p.m_aos[i], fabarr)) -{ - return f(p.m_aos[i], fabarr); -} - -// Lambda takes a Particle -template -AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE -auto call_f (F const& f, - const ParticleTileData& p, - const int i, Array4 const& fabarr, - GpuArray const& plo, - GpuArray const& dxi) noexcept - -> decltype(f(p.m_aos[i], fabarr, plo, dxi)) -{ - return f(p.m_aos[i], fabarr, plo, dxi); -} - -// Lambda takes a Particle -template -AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE -auto call_f (F const& f, - const ParticleTileData& p, - const int i, Array4 const& fabarr, - GpuArray const&, - GpuArray const&) noexcept - -> decltype(f(p.m_aos[i], fabarr)) -{ - return f(p.m_aos[i], fabarr); -} - -// Lambda takes a SuperParticle -template ::type = 0> -AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE -auto call_f (F const& f, - const ConstParticleTileData& p, - const int i, Array4 const& fabarr, - GpuArray const& plo, - GpuArray const& dxi) noexcept - -> decltype(f(p.getSuperParticle(i), fabarr, plo, dxi)) -{ - return f(p.getSuperParticle(i), fabarr, plo, dxi); -} - -// Lambda takes a SuperParticle -template ::type = 0> -AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE -auto call_f (F const& f, - const ConstParticleTileData& p, - const int i, Array4 const& fabarr, - GpuArray const&, - GpuArray const&) noexcept - -> decltype(f(p.getSuperParticle(i), fabarr)) -{ - return f(p.getSuperParticle(i), fabarr); -} - -// Lambda takes a ConstParticleTileData -template -AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE -auto call_f (F const& f, - const ConstParticleTileData& p, - const int i, Array4 const& fabarr, - GpuArray const&, - GpuArray const&) noexcept - -> decltype(f(p, i, fabarr)) -{ - return f(p, i, fabarr); -} - -// Lambda takes a ConstParticleTileData -template -AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE -auto call_f (F const& f, - const ConstParticleTileData& p, - const int i, Array4 const& fabarr, - GpuArray const& plo, - GpuArray const& dxi) noexcept - -> decltype(f(p, i, fabarr, plo, dxi)) -{ - return f(p, i, fabarr, plo, dxi); -} - -// Lambda takes a ParticleTileData -template -AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE -auto call_f (F const& f, - const ParticleTileData& p, - const int i, Array4 const& fabarr, - GpuArray const& plo, - GpuArray const& dxi) noexcept - -> decltype(f(p, i, fabarr, plo, dxi)) -{ - return f(p, i, fabarr, plo, dxi); -} - -// Lambda takes a ParticleTileData -template -AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE -auto call_f (F const& f, - const ParticleTileData& p, - const int i, Array4 const& fabarr, - GpuArray const&, - GpuArray const&) noexcept - -> decltype(f(p, i, fabarr)) -{ - return f(p, i, fabarr); -} - - -} +namespace amrex { /** * \brief Returns the number of particles that are more than nGrow cells