diff options
author | 2020-12-11 11:29:09 -0800 | |
---|---|---|
committer | 2020-12-11 11:29:09 -0800 | |
commit | c2d6b90c3b227601b8f2f9bdda59fc0844be079c (patch) | |
tree | f89610c85717cfe16db0fe9af6be913bde8c6b45 /Source/Particles/WarpXParticleContainer.cpp | |
parent | 8acf0f8a0ae506c10ef68490fa32488b7a87038a (diff) | |
download | WarpX-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.cpp | 26 |
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(); |