40void remove(
const ExecutionSpace& exec_space,
const int num_keep,
41 const KeepView& keep_particle, ParticleAoSoA& particles,
42 const int num_particles_ignore = 0,
43 const bool shrink_to_fit =
true )
45 using memory_space =
typename KeepView::memory_space;
48 int num_particles = particles.size();
52 Kokkos::View<int*, memory_space> indices(
53 Kokkos::ViewAllocateWithoutInitializing(
"empty_or_filled" ),
54 std::min( num_particles - num_particles_ignore - num_keep, num_keep ) );
56 int new_num_particles = num_particles_ignore + num_keep;
60 Kokkos::parallel_scan(
61 "Cabana::remove::FindEmpty",
62 Kokkos::RangePolicy<ExecutionSpace>( exec_space, 0, num_keep ),
63 KOKKOS_LAMBDA(
const int i,
int& count,
const bool final_pass ) {
64 if ( !keep_particle( i ) )
68 indices( count ) = i + num_particles_ignore;
76 Kokkos::parallel_scan(
77 "Cabana::remove::RemoveEmpty",
78 Kokkos::RangePolicy<ExecutionSpace>( exec_space, new_num_particles,
80 KOKKOS_LAMBDA(
const int i,
int& count,
const bool final_pass ) {
81 if ( keep_particle( i - num_particles_ignore ) )
85 particles.setTuple( indices( count ),
86 particles.getTuple( i ) );
93 particles.resize( new_num_particles );
95 particles.shrinkToFit();
void remove(const ExecutionSpace &exec_space, const int num_keep, const KeepView &keep_particle, ParticleAoSoA &particles, const int num_particles_ignore=0, const bool shrink_to_fit=true)
Filter out empty/unneeded particles.
Definition Cabana_Remove.hpp:40