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();
51 if ( num_particles == num_particles_ignore + num_keep )
57 Kokkos::View<int*, memory_space> indices(
58 Kokkos::ViewAllocateWithoutInitializing(
"empty_or_filled" ),
59 std::min( num_particles - num_particles_ignore - num_keep, num_keep ) );
61 int new_num_particles = num_particles_ignore + num_keep;
65 Kokkos::parallel_scan(
66 "Cabana::remove::FindEmpty",
67 Kokkos::RangePolicy<ExecutionSpace>( exec_space, 0, num_keep ),
68 KOKKOS_LAMBDA(
const int i,
int& count,
const bool final_pass ) {
69 if ( !keep_particle( i ) )
73 indices( count ) = i + num_particles_ignore;
81 Kokkos::parallel_scan(
82 "Cabana::remove::RemoveEmpty",
83 Kokkos::RangePolicy<ExecutionSpace>( exec_space, new_num_particles,
85 KOKKOS_LAMBDA(
const int i,
int& count,
const bool final_pass ) {
86 if ( keep_particle( i - num_particles_ignore ) )
90 particles.setTuple( indices( count ),
91 particles.getTuple( i ) );
98 particles.resize( new_num_particles );
100 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