aboutsummaryrefslogtreecommitdiff
path: root/Source/Particles/WarpXParticleContainer.cpp
diff options
context:
space:
mode:
authorGravatar grote <dpgrote@lbl.gov> 2019-12-23 15:29:25 -0800
committerGravatar grote <dpgrote@lbl.gov> 2019-12-23 15:29:25 -0800
commitceb15878fde2e35958f39c513f5a8dd776c4baaa (patch)
tree005759e1216dc61246305fd82ddd3cd30636572b /Source/Particles/WarpXParticleContainer.cpp
parentdb13c6aa943753b514479aa7e0049921937c8846 (diff)
downloadWarpX-ceb15878fde2e35958f39c513f5a8dd776c4baaa.tar.gz
WarpX-ceb15878fde2e35958f39c513f5a8dd776c4baaa.tar.zst
WarpX-ceb15878fde2e35958f39c513f5a8dd776c4baaa.zip
Fixed loops for RZ in get and set position
Diffstat (limited to 'Source/Particles/WarpXParticleContainer.cpp')
-rw-r--r--Source/Particles/WarpXParticleContainer.cpp45
1 files changed, 27 insertions, 18 deletions
diff --git a/Source/Particles/WarpXParticleContainer.cpp b/Source/Particles/WarpXParticleContainer.cpp
index e6c6d31bd..e6a719ec5 100644
--- a/Source/Particles/WarpXParticleContainer.cpp
+++ b/Source/Particles/WarpXParticleContainer.cpp
@@ -26,41 +26,50 @@ WarpXParIter::WarpXParIter (ContainerType& pc, int level)
#if (AMREX_SPACEDIM == 2)
void
-WarpXParIter::GetPosition (Gpu::ManagedDeviceVector<ParticleReal>& x,
- Gpu::ManagedDeviceVector<ParticleReal>& y,
- Gpu::ManagedDeviceVector<ParticleReal>& z) const
+WarpXParIter::GetPosition (Gpu::ManagedDeviceVector<ParticleReal>& xp,
+ Gpu::ManagedDeviceVector<ParticleReal>& yp,
+ Gpu::ManagedDeviceVector<ParticleReal>& zp) const
{
- amrex::ParIter<0,0,PIdx::nattribs>::GetPosition(x, z);
+ amrex::ParIter<0,0,PIdx::nattribs>::GetPosition(xp, zp);
#ifdef WARPX_DIM_RZ
const auto& attribs = GetAttribs();
- const auto& theta = attribs[PIdx::theta];
- y.resize(x.size());
- for (unsigned int i=0 ; i < x.size() ; i++) {
+ const auto& thetap = attribs[PIdx::theta];
+ yp.resize(xp.size());
+ ParticleReal* const AMREX_RESTRICT x = xp.dataPtr();
+ ParticleReal* const AMREX_RESTRICT y = yp.dataPtr();
+ const ParticleReal* const AMREX_RESTRICT theta = thetap.dataPtr();
+ amrex::ParallelFor( xp.size(),
+ [=] AMREX_GPU_DEVICE (long i) {
// The x stored in the particles is actually the radius
y[i] = x[i]*std::sin(theta[i]);
x[i] = x[i]*std::cos(theta[i]);
- }
+ });
#else
- y.resize(x.size(), std::numeric_limits<ParticleReal>::quiet_NaN());
+ yp.resize(xp.size(), std::numeric_limits<ParticleReal>::quiet_NaN());
#endif
}
void
-WarpXParIter::SetPosition (const Gpu::ManagedDeviceVector<ParticleReal>& x,
- const Gpu::ManagedDeviceVector<ParticleReal>& y,
- const Gpu::ManagedDeviceVector<ParticleReal>& z)
+WarpXParIter::SetPosition (const Gpu::ManagedDeviceVector<ParticleReal>& xp,
+ const Gpu::ManagedDeviceVector<ParticleReal>& yp,
+ const Gpu::ManagedDeviceVector<ParticleReal>& zp)
{
#ifdef WARPX_DIM_RZ
auto& attribs = GetAttribs();
- auto& theta = attribs[PIdx::theta];
- Gpu::ManagedDeviceVector<ParticleReal> r(x.size());
- for (unsigned int i=0 ; i < x.size() ; i++) {
+ auto& thetap = attribs[PIdx::theta];
+ Gpu::ManagedDeviceVector<ParticleReal> rp(xp.size());
+ const ParticleReal* const AMREX_RESTRICT x = xp.dataPtr();
+ const ParticleReal* const AMREX_RESTRICT y = yp.dataPtr();
+ ParticleReal* const AMREX_RESTRICT r = rp.dataPtr();
+ ParticleReal* const AMREX_RESTRICT theta = thetap.dataPtr();
+ amrex::ParallelFor( xp.size(),
+ [=] AMREX_GPU_DEVICE (long i) {
theta[i] = std::atan2(y[i], x[i]);
r[i] = std::sqrt(x[i]*x[i] + y[i]*y[i]);
- }
- amrex::ParIter<0,0,PIdx::nattribs>::SetPosition(r, z);
+ });
+ amrex::ParIter<0,0,PIdx::nattribs>::SetPosition(rp, zp);
#else
- amrex::ParIter<0,0,PIdx::nattribs>::SetPosition(x, z);
+ amrex::ParIter<0,0,PIdx::nattribs>::SetPosition(xp, zp);
#endif
}
#endif