aboutsummaryrefslogtreecommitdiff
path: root/Source/Particles/WarpXParticleContainer.cpp
diff options
context:
space:
mode:
authorGravatar Andrew Myers <atmyers@lbl.gov> 2020-12-11 11:29:09 -0800
committerGravatar GitHub <noreply@github.com> 2020-12-11 11:29:09 -0800
commitc2d6b90c3b227601b8f2f9bdda59fc0844be079c (patch)
treef89610c85717cfe16db0fe9af6be913bde8c6b45 /Source/Particles/WarpXParticleContainer.cpp
parent8acf0f8a0ae506c10ef68490fa32488b7a87038a (diff)
downloadWarpX-c2d6b90c3b227601b8f2f9bdda59fc0844be079c.tar.gz
WarpX-c2d6b90c3b227601b8f2f9bdda59fc0844be079c.tar.zst
WarpX-c2d6b90c3b227601b8f2f9bdda59fc0844be079c.zip
Do not rely on managed memory in AddNParticles. (#1567)
Diffstat (limited to 'Source/Particles/WarpXParticleContainer.cpp')
-rw-r--r--Source/Particles/WarpXParticleContainer.cpp26
1 files changed, 17 insertions, 9 deletions
diff --git a/Source/Particles/WarpXParticleContainer.cpp b/Source/Particles/WarpXParticleContainer.cpp
index 4c5bd469f..65107f24d 100644
--- a/Source/Particles/WarpXParticleContainer.cpp
+++ b/Source/Particles/WarpXParticleContainer.cpp
@@ -130,6 +130,11 @@ WarpXParticleContainer::AddNParticles (int /*lev*/,
// Redistribute() will move them to proper places.
auto& particle_tile = DefineAndReturnParticleTile(0, 0, 0);
+ using PinnedTile = ParticleTile<NStructReal, NStructInt, NArrayReal, NArrayInt,
+ amrex::PinnedArenaAllocator>;
+ PinnedTile pinned_tile;
+ pinned_tile.define(NumRuntimeRealComps(), NumRuntimeIntComps());
+
std::size_t np = iend-ibegin;
#ifdef WARPX_DIM_RZ
@@ -165,15 +170,15 @@ WarpXParticleContainer::AddNParticles (int /*lev*/,
DefineAndReturnParticleTile(0, 0, 0);
}
- particle_tile.push_back(p);
+ pinned_tile.push_back(p);
}
if (np > 0)
{
- particle_tile.push_back_real(PIdx::w , weight + ibegin, weight + iend);
- particle_tile.push_back_real(PIdx::ux, vx + ibegin, vx + iend);
- particle_tile.push_back_real(PIdx::uy, vy + ibegin, vy + iend);
- particle_tile.push_back_real(PIdx::uz, vz + ibegin, vz + iend);
+ pinned_tile.push_back_real(PIdx::w , weight + ibegin, weight + iend);
+ pinned_tile.push_back_real(PIdx::ux, vx + ibegin, vx + iend);
+ pinned_tile.push_back_real(PIdx::uy, vy + ibegin, vy + iend);
+ pinned_tile.push_back_real(PIdx::uz, vz + ibegin, vz + iend);
if ( (NumRuntimeRealComps()>0) || (NumRuntimeIntComps()>0) ){
DefineAndReturnParticleTile(0, 0, 0);
@@ -183,20 +188,23 @@ WarpXParticleContainer::AddNParticles (int /*lev*/,
{
#ifdef WARPX_DIM_RZ
if (comp == PIdx::theta) {
- particle_tile.push_back_real(comp, theta.data(), theta.data() + np);
+ pinned_tile.push_back_real(comp, theta.data(), theta.data() + np);
}
else {
- particle_tile.push_back_real(comp, np, 0.0);
+ pinned_tile.push_back_real(comp, np, 0.0);
}
#else
- particle_tile.push_back_real(comp, np, 0.0);
+ pinned_tile.push_back_real(comp, np, 0.0);
#endif
}
for (int i = PIdx::nattribs; i < NumRealComps(); ++i)
{
- particle_tile.push_back_real(i, 0.0);
+ pinned_tile.push_back_real(i, 0.0);
}
+
+ particle_tile.resize(pinned_tile.numParticles());
+ amrex::copyParticles(particle_tile, pinned_tile);
}
Redistribute();