89 InitRandom, ExecutionSpace exec_space,
const InitFunctor& create_functor,
90 ParticleListType& particle_list,
const std::size_t num_particles,
91 const ArrayType box_min,
const ArrayType box_max,
92 const std::size_t previous_num_particles = 0,
93 const bool shrink_to_fit =
true,
const uint64_t seed = 342343901,
98 using memory_space =
typename ParticleListType::memory_space;
100 using PoolType = Kokkos::Random_XorShift64_Pool<ExecutionSpace>;
101 using RandomType = Kokkos::Random_XorShift64<ExecutionSpace>;
102 PoolType pool( seed );
105 auto& aosoa = particle_list.aosoa();
106 aosoa.resize( previous_num_particles + num_particles );
109 auto count = Kokkos::View<int*, memory_space>(
"particle_count", 1 );
110 Kokkos::deep_copy( count, previous_num_particles );
116 auto random_coord_op = KOKKOS_LAMBDA(
const int p )
121 auto gen = pool.get_state();
122 auto particle = particle_list.getParticle( p );
123 for (
int d = 0; d < 3; ++d )
124 px[d] = Kokkos::rand<RandomType, double>::draw( gen, kokkos_min[d],
126 pool.free_state( gen );
129 int create = create_functor( count( 0 ), px, 0.0, particle );
134 auto c = Kokkos::atomic_fetch_add( &count( 0 ), 1 );
135 particle_list.setParticle( particle, c );
139 Kokkos::RangePolicy<ExecutionSpace> exec_policy(
140 exec_space, previous_num_particles,
141 previous_num_particles + num_particles );
142 Kokkos::parallel_for( exec_policy, random_coord_op );
146 Kokkos::create_mirror_view_and_copy( Kokkos::HostSpace(), count );
147 aosoa.resize( count_host( 0 ) );
150 return count_host( 0 );
178 ParticleListType& particle_list,
179 const std::size_t num_particles,
const ArrayType box_min,
180 const ArrayType box_max,
181 const std::size_t previous_num_particles = 0,
182 const bool shrink_to_fit =
true,
183 const uint64_t seed = 342343901 )
185 using exec_space =
typename ParticleListType::memory_space::execution_space;
186 return createParticles( tag, exec_space{}, create_functor, particle_list,
187 num_particles, box_min, box_max,
188 previous_num_particles, shrink_to_fit, seed );
205 InitRandom, ExecutionSpace exec_space, PositionType& positions,
206 const std::size_t num_particles,
const ArrayType box_min,
207 const ArrayType box_max,
const std::size_t previous_num_particles = 0,
208 const uint64_t seed = 342343901,
210 Kokkos::is_view<PositionType>::value ),
214 checkSize( positions, num_particles + previous_num_particles );
220 using PoolType = Kokkos::Random_XorShift64_Pool<ExecutionSpace>;
221 using RandomType = Kokkos::Random_XorShift64<ExecutionSpace>;
222 PoolType pool( seed );
223 auto random_coord_op = KOKKOS_LAMBDA(
const int p )
225 auto gen = pool.get_state();
226 for (
int d = 0; d < 3; ++d )
227 positions( p, d ) = Kokkos::rand<RandomType, double>::draw(
228 gen, kokkos_min[d], kokkos_max[d] );
229 pool.free_state( gen );
232 Kokkos::RangePolicy<ExecutionSpace> exec_policy(
233 exec_space, previous_num_particles,
234 previous_num_particles + num_particles );
235 Kokkos::parallel_for( exec_policy, random_coord_op );
253 InitRandom tag, PositionType& positions,
const std::size_t num_particles,
254 const ArrayType box_min,
const ArrayType box_max,
255 const std::size_t previous_num_particles = 0,
256 const uint64_t seed = 342343901,
258 Kokkos::is_view<PositionType>::value ),
261 using exec_space =
typename PositionType::execution_space;
263 box_max, previous_num_particles, seed );
302 const InitFunctor& create_functor, ParticleListType& particle_list,
303 PositionTag position_tag,
const std::size_t num_particles,
304 const double min_dist,
const ArrayType box_min,
const ArrayType box_max,
305 const std::size_t previous_num_particles = 0,
306 const bool shrink_to_fit =
true,
const uint64_t seed = 342343901,
310 double min_dist_sqr = min_dist * min_dist;
313 auto& aosoa = particle_list.aosoa();
314 aosoa.resize( previous_num_particles + num_particles );
316 auto positions = particle_list.slice( position_tag );
319 auto min_distance_op =
320 KOKKOS_LAMBDA(
const int id,
const double px[3],
const double,
321 typename ParticleListType::particle_type& particle )
325 for (
int n = 0; n < id; n++ )
327 double dx = positions( n, 0 ) - px[0];
328 double dy = positions( n, 1 ) - px[1];
329 double dz = positions( n, 2 ) - px[2];
330 double dist = dx * dx + dy * dy + dz * dz;
331 if ( dist < min_dist_sqr )
335 bool create = create_functor(
id, px, 0.0, particle );
340 return createParticles( tag, exec_space, min_distance_op, particle_list,
341 num_particles, box_min, box_max,
342 previous_num_particles, shrink_to_fit, seed );
375 ParticleListType& particle_list, PositionTag position_tag,
376 const std::size_t num_particles,
const double min_dist,
377 const ArrayType box_min,
const ArrayType box_max,
378 const std::size_t previous_num_particles = 0,
379 const bool shrink_to_fit =
true,
380 const uint64_t seed = 342343901 )
382 using exec_space =
typename ParticleListType::memory_space::execution_space;
383 return createParticles( tag, exec_space{}, create_functor, particle_list,
384 position_tag, num_particles, min_dist, box_min,
385 box_max, previous_num_particles, shrink_to_fit,
auto copyArray(ArrayType corner)
Copy array (std, c-array) into Kokkos::Array for potential device use.
Definition Cabana_ParticleInit.hpp:35
Application-level particle storage and single particle access.
int createParticles(InitRandom, ExecutionSpace exec_space, const InitFunctor &create_functor, ParticleListType &particle_list, const std::size_t num_particles, const ArrayType box_min, const ArrayType box_max, const std::size_t previous_num_particles=0, const bool shrink_to_fit=true, const uint64_t seed=342343901, typename std::enable_if< is_particle_list< ParticleListType >::value, int >::type *=0)
Initialize random particles given an initialization functor.
Definition Cabana_ParticleInit.hpp:88
void checkSize(SliceType slice, const std::size_t size, typename std::enable_if< is_slice< SliceType >::value, int >::type *=0)
Check slice size (differs from Kokkos View).
Definition Cabana_Slice.hpp:990
ParticleList static type checker.
Definition Cabana_ParticleList.hpp:282