@@ -51,12 +51,13 @@ namespace picongpu
5151 template <typename T_Identifier>
5252 struct RedistributeFilteredParticles
5353 {
54- template <typename FrameType, typename FilterType, typename RemapType >
54+ template <typename FrameType, typename FilterType>
5555 HINLINE void operator ()(
5656 FrameType& frame,
5757 FilterType const & filter,
58- RemapType const & remap,
5958 uint64_t const numParticlesCurrentBatch,
59+ // becomes numParticlesAfterFiltering after this function call
60+ MemIdxType& particleIndexTarget,
6061 char const filterRemove)
6162 {
6263 using Identifier = T_Identifier;
@@ -65,13 +66,14 @@ namespace picongpu
6566
6667 ValueType* dataPtr = frame.getIdentifier (Identifier ()).getPointer ();
6768
68- for (size_t particleIndex = 0 ; particleIndex < numParticlesCurrentBatch; ++particleIndex)
69+ particleIndexTarget = 0 ;
70+ for (MemIdxType particleIndexSrc = 0 ; particleIndexSrc < numParticlesCurrentBatch; ++particleIndexSrc)
6971 {
70- if (filter[particleIndex ] == filterRemove)
72+ if (filter[particleIndexSrc ] == filterRemove)
7173 {
7274 continue ;
7375 }
74- dataPtr[remap[particleIndex]] = dataPtr[particleIndex ];
76+ dataPtr[particleIndexTarget++] = dataPtr[particleIndexSrc ];
7577 }
7678 }
7779 };
@@ -291,17 +293,13 @@ namespace picongpu
291293 manager::Device<HostDevice>::get ().current (),
292294 manager::Device<ComputeDevice>::get ().getPlatform (),
293295 MemSpace<DIM1>(maxChunkSize).toAlpakaMemVec ());
294- auto remap = alpaka::allocMappedBuf<MemIdxType, MemIdxType>(
295- manager::Device<HostDevice>::get ().current (),
296- manager::Device<ComputeDevice>::get ().getPlatform (),
297- MemSpace<DIM1>(maxChunkSize).toAlpakaMemVec ());
298296
299297 loadMatchesGeneric (
300298 partialMatches,
301299 threadParams,
302300 totalNumParticles,
303301 maxChunkSize, /* forEachPatch = */
304- [this , threadParams, &filter, &remap, & patchTotalOffset, &patchExtent, &patchUpperCorner](
302+ [this , threadParams, &filter, &patchTotalOffset, &patchExtent, &patchUpperCorner](
305303 uint64_t loadRound,
306304 uint64_t numParticlesCurrentBatch,
307305 FrameType& mappedFrame,
@@ -330,39 +328,27 @@ namespace picongpu
330328 alpaka::getPtrNative (filter));
331329 eventSystem::getTransactionEvent ().waitForFinished ();
332330
333- // For simplicity, do the remapping on the CPU again
334- MemIdxType remapCurrent = 0 ;
335- for (size_t particleIndex = 0 ; particleIndex < numParticlesCurrentBatch; ++particleIndex)
336- {
337- if (filter[particleIndex] == filterKeep)
338- {
339- remap[particleIndex] = remapCurrent++;
340- }
341- else
342- {
343- remap[particleIndex] = std::numeric_limits<MemIdxType>::max ();
344- }
345- }
346-
331+ MemIdxType numParticlesAfterFiltering = 0 ;
347332 meta::ForEach<
348333 typename NewParticleDescription::ValueTypeSeq,
349334 RedistributeFilteredParticles<boost::mpl::_1>>
350335 redistributeFilteredParticles;
351336 redistributeFilteredParticles (
352337 mappedFrame,
353338 filter,
354- remap,
355339 numParticlesCurrentBatch,
340+ numParticlesAfterFiltering,
356341 filterRemove);
357342
358343 log<picLog::INPUT_OUTPUT>(
359344 " openPMD: Keeping %1% of the current batch's %2% particles after filtering." )
360- % remapCurrent % numParticlesCurrentBatch;
345+ % numParticlesAfterFiltering % numParticlesCurrentBatch;
361346
362347 pmacc::particles::operations::splitIntoListOfFrames (
363348 *speciesTmp,
364349 mappedFrame,
365- remapCurrent, // !! not numParticlesCurrentBatch, filtered vs. unfiltered number
350+ // @attention not numParticlesCurrentBatch, filtered vs. unfiltered number
351+ numParticlesAfterFiltering,
366352 cellOffsetToTotalDomain,
367353 totalCellIdx_,
368354 *threadParams->cellDescription ,
0 commit comments