16#ifndef CABANA_VERLETLIST_HPP
17#define CABANA_VERLETLIST_HPP
23#include <Kokkos_Core.hpp>
24#include <Kokkos_Profiling_ScopedRegion.hpp>
46template <
class MemorySpace,
class LayoutTag>
50template <
class MemorySpace>
57 Kokkos::View<int*, memory_space>
counts;
66 KOKKOS_INLINE_FUNCTION
70 Kokkos::atomic_fetch_add( &
counts( pid ), 1 ) ) = nid;
74 KOKKOS_INLINE_FUNCTION
75 void setNeighbor(
const int pid,
const int nid,
const int new_id )
const
82template <
class MemorySpace>
89 Kokkos::View<int*, memory_space>
counts;
99 KOKKOS_INLINE_FUNCTION
102 std::size_t count = Kokkos::atomic_fetch_add( &
counts( pid ), 1 );
108 KOKKOS_INLINE_FUNCTION
109 void setNeighbor(
const int pid,
const int nid,
const int new_id )
const
126template <
class DeviceType,
class RandomAccessPositionType,
class RadiusType,
127 class AlgorithmTag,
class LayoutTag,
class BuildOpTag,
128 class ArrayType, std::size_t NumSpaceDim>
129struct VerletListBuilder
131 static constexpr std::size_t num_space_dim = NumSpaceDim;
134 using device = DeviceType;
135 using PositionValueType =
typename RandomAccessPositionType::value_type;
136 using memory_space =
typename device::memory_space;
137 using execution_space =
typename device::execution_space;
140 VerletListData<memory_space, LayoutTag> _data;
142 PositionValueType rsqr;
147 RandomAccessPositionType _position;
148 std::size_t pid_begin, pid_end;
151 BinningData<memory_space> bin_data_1d;
152 LinkedCellList<memory_space, PositionValueType, num_space_dim>
163 template <
class PositionType>
164 VerletListBuilder( PositionType positions,
const std::size_t begin,
165 const std::size_t end,
166 const RadiusType neighborhood_radius,
167 const PositionValueType cell_size_ratio,
168 const ArrayType grid_min,
const ArrayType grid_max,
169 const std::size_t max_neigh )
172 , alloc_n( max_neigh )
174 init( positions, neighborhood_radius, cell_size_ratio, grid_min,
178 radius = neighborhood_radius;
183 template <
class PositionType>
184 VerletListBuilder( PositionType positions,
const std::size_t begin,
185 const std::size_t end,
186 const PositionValueType background_radius,
187 const RadiusType neighborhood_radius,
188 const PositionValueType cell_size_ratio,
189 const ArrayType grid_min,
const ArrayType grid_max,
190 const std::size_t max_neigh )
193 , alloc_n( max_neigh )
195 assert(
size( positions ) ==
size( neighborhood_radius ) );
196 init( positions, background_radius, cell_size_ratio, grid_min,
202 radius = neighborhood_radius;
205 template <
class PositionType>
206 void init( PositionType positions,
207 const PositionValueType neighborhood_radius,
208 const PositionValueType cell_size_ratio,
209 const ArrayType grid_min,
const ArrayType grid_max )
215 _data.counts = Kokkos::View<int*, memory_space>(
"num_neighbors",
219 initCounts( LayoutTag() );
222 _position = positions;
224 double grid_size = cell_size_ratio * neighborhood_radius;
225 ArrayType grid_delta;
226 for ( std::size_t d = 0; d < num_space_dim; ++d )
227 grid_delta[d] = grid_size;
235 neighborhood_radius, cell_size_ratio );
236 bin_data_1d = linked_cell_list.binningData();
239 rsqr = neighborhood_radius * neighborhood_radius;
244 KOKKOS_INLINE_FUNCTION
auto withinCutoff( [[maybe_unused]]
const int i,
245 const double dist_sqr )
const
249 if constexpr ( is_slice<RadiusType>::value ||
250 Kokkos::is_view<RadiusType>::value )
251 return dist_sqr <= radius( i ) * radius( i );
254 return dist_sqr <= rsqr;
259 KOKKOS_INLINE_FUNCTION
auto
260 neighborNotWithinCutoff( [[maybe_unused]]
const int j,
261 [[maybe_unused]]
const double dist_sqr )
const
264 if constexpr ( is_slice<RadiusType>::value ||
265 Kokkos::is_view<RadiusType>::value )
267 return dist_sqr >= radius( j ) * radius( j );
277 KOKKOS_INLINE_FUNCTION
auto countNeighbor(
const int i,
const int j,
278 const double dist_sqr )
const
282 if ( withinCutoff( i, dist_sqr ) )
286 if ( neighborNotWithinCutoff( j, dist_sqr ) )
293 KOKKOS_INLINE_FUNCTION
void addNeighbor(
const int i,
const int j,
294 const double dist_sqr )
const
297 if ( withinCutoff( i, dist_sqr ) )
299 _data.addNeighbor( i, j );
302 if ( neighborNotWithinCutoff( j, dist_sqr ) )
303 _data.addNeighbor( j, i );
308 struct CountNeighborsTag
311 using CountNeighborsPolicy =
312 Kokkos::TeamPolicy<execution_space, CountNeighborsTag,
313 Kokkos::IndexType<int>,
314 Kokkos::Schedule<Kokkos::Dynamic>>;
316 KOKKOS_INLINE_FUNCTION
318 operator()(
const CountNeighborsTag&,
319 const typename CountNeighborsPolicy::member_type& team )
const
323 int cell = team.league_rank();
326 Kokkos::Array<int, num_space_dim> min;
327 Kokkos::Array<int, num_space_dim> max;
328 linked_cell_list.getStencilCells( cell, min, max );
331 std::size_t b_offset = bin_data_1d.binOffset( cell );
332 Kokkos::parallel_for(
333 Kokkos::TeamThreadRange( team, 0, bin_data_1d.binSize( cell ) ),
338 std::size_t pid = linked_cell_list.permutation( bi + b_offset );
340 if ( ( pid >= pid_begin ) && ( pid < pid_end ) )
343 Kokkos::Array<PositionValueType, num_space_dim> xp;
344 for ( std::size_t d = 0; d < num_space_dim; ++d )
345 xp[d] = _position( pid, d );
349 linkedcell_stencil_count( team, min, max, xp, pid );
351 Kokkos::single( Kokkos::PerThread( team ), [&]()
352 { _data.counts( pid ) = stencil_count; } );
357 template <
class TeamType, std::
size_t NSD = num_space_dim>
358 KOKKOS_INLINE_FUNCTION std::enable_if_t<3 == NSD, int>
359 linkedcell_stencil_count( TeamType team,
const Kokkos::Array<int, 3> min,
360 const Kokkos::Array<int, 3> max,
361 const Kokkos::Array<PositionValueType, 3> xp,
362 const std::size_t pid )
const
364 int stencil_count = 0;
365 Kokkos::Array<int, 3> ijk;
366 for (
int i = min[0]; i < max[0]; ++i )
367 for (
int j = min[1]; j < max[1]; ++j )
368 for (
int k = min[2]; k < max[2]; ++k )
371 linkedcell_bin( team, ijk, xp, pid, stencil_count );
373 return stencil_count;
376 template <
class TeamType, std::
size_t NSD = num_space_dim>
377 KOKKOS_INLINE_FUNCTION std::enable_if_t<2 == NSD, int>
378 linkedcell_stencil_count( TeamType team,
const Kokkos::Array<int, 2> min,
379 const Kokkos::Array<int, 2> max,
380 const Kokkos::Array<PositionValueType, 2> xp,
381 const std::size_t pid )
const
383 int stencil_count = 0;
384 Kokkos::Array<int, 2> ij;
385 for (
int i = min[0]; i < max[0]; ++i )
386 for (
int j = min[1]; j < max[1]; ++j )
389 linkedcell_bin( team, ij, xp, pid, stencil_count );
391 return stencil_count;
394 template <
class TeamType>
395 KOKKOS_INLINE_FUNCTION
void
396 linkedcell_bin( TeamType team,
const Kokkos::Array<int, num_space_dim> ijk,
397 const Kokkos::Array<PositionValueType, num_space_dim> xp,
398 const std::size_t pid,
int& stencil_count )
const
402 pid, linked_cell_list.cellStencil().grid.minDistanceToPoint(
405 std::size_t n_offset = linked_cell_list.binOffset( ijk );
406 std::size_t num_n = linked_cell_list.binSize( ijk );
411 neighbor_reduce( team, pid, xp, n_offset, num_n, cell_count,
413 stencil_count += cell_count;
418 KOKKOS_INLINE_FUNCTION
void
419 neighbor_reduce(
const typename CountNeighborsPolicy::member_type& team,
420 const std::size_t pid,
421 const Kokkos::Array<double, num_space_dim> xp,
422 const int n_offset,
const int num_n,
int& cell_count,
423 TeamVectorOpTag )
const
425 Kokkos::parallel_reduce(
426 Kokkos::ThreadVectorRange( team, num_n ),
427 [&](
const int n,
int& local_count )
428 { neighbor_kernel( pid, xp, n_offset, n, local_count ); },
433 KOKKOS_INLINE_FUNCTION
434 void neighbor_reduce(
const typename CountNeighborsPolicy::member_type,
435 const std::size_t pid,
436 const Kokkos::Array<double, num_space_dim> xp,
437 const int n_offset,
const int num_n,
int& cell_count,
440 for (
int n = 0; n < num_n; n++ )
441 neighbor_kernel( pid, xp, n_offset, n, cell_count );
445 KOKKOS_INLINE_FUNCTION
446 void neighbor_kernel(
const int pid,
447 const Kokkos::Array<double, num_space_dim> xp,
448 const int n_offset,
const int n,
449 int& local_count )
const
452 std::size_t nid = linked_cell_list.permutation( n_offset + n );
455 Kokkos::Array<double, num_space_dim> xn;
456 for ( std::size_t d = 0; d < num_space_dim; ++d )
457 xn[d] = _position( nid, d );
460 if ( NeighborDiscriminator<AlgorithmTag>::isValid( pid, xp, nid, xn ) )
464 PositionValueType dist_sqr = 0.0;
465 for ( std::size_t d = 0; d < num_space_dim; ++d )
467 PositionValueType dx = xp[d] - xn[d];
472 local_count += countNeighbor( pid, nid, dist_sqr );
478 template <
class KokkosMemorySpace>
481 using kokkos_mem_space = KokkosMemorySpace;
482 Kokkos::View<int*, kokkos_mem_space> counts;
483 Kokkos::View<int*, kokkos_mem_space> offsets;
484 KOKKOS_INLINE_FUNCTION
485 void operator()(
const int i,
int& update,
const bool final_pass )
const
493 void initCounts( VerletLayoutCSR ) {}
495 void initCounts( VerletLayout2D )
501 _data.neighbors = Kokkos::View<int**, memory_space>(
502 Kokkos::ViewAllocateWithoutInitializing(
"neighbors" ),
503 _data.counts.size(), alloc_n );
507 void processCounts( VerletLayoutCSR )
510 _data.offsets = Kokkos::View<int*, memory_space>(
511 Kokkos::ViewAllocateWithoutInitializing(
"neighbor_offsets" ),
512 _data.counts.size() );
515 OffsetScanOp<memory_space> offset_op;
516 offset_op.counts = _data.counts;
517 offset_op.offsets = _data.offsets;
518 int total_num_neighbor;
519 Kokkos::RangePolicy<execution_space> range_policy(
520 0, _data.counts.extent( 0 ) );
521 Kokkos::parallel_scan(
"Cabana::VerletListBuilder::offset_scan",
522 range_policy, offset_op, total_num_neighbor );
526 _data.neighbors = Kokkos::View<int*, memory_space>(
527 Kokkos::ViewAllocateWithoutInitializing(
"neighbors" ),
528 total_num_neighbor );
531 Kokkos::deep_copy( _data.counts, 0 );
536 void processCounts( VerletLayout2D )
539 auto counts = _data.counts;
541 Kokkos::Max<int> max_reduce( max );
542 Kokkos::parallel_reduce(
543 "Cabana::VerletListBuilder::reduce_max",
544 Kokkos::RangePolicy<execution_space>( 0, _data.counts.size() ),
545 KOKKOS_LAMBDA(
const int i,
int& value ) {
546 if ( counts( i ) > value )
551 _data.max_n =
static_cast<std::size_t
>( max );
554 if ( count or _data.max_n > _data.neighbors.extent( 1 ) )
557 Kokkos::deep_copy( _data.counts, 0 );
558 _data.neighbors = Kokkos::View<int**, memory_space>(
559 Kokkos::ViewAllocateWithoutInitializing(
"neighbors" ),
560 _data.counts.size(), _data.max_n );
565 struct FillNeighborsTag
568 using FillNeighborsPolicy =
569 Kokkos::TeamPolicy<execution_space, FillNeighborsTag,
570 Kokkos::IndexType<int>,
571 Kokkos::Schedule<Kokkos::Dynamic>>;
572 KOKKOS_INLINE_FUNCTION
574 operator()(
const FillNeighborsTag&,
575 const typename FillNeighborsPolicy::member_type& team )
const
579 int cell = team.league_rank();
582 Kokkos::Array<int, num_space_dim> min;
583 Kokkos::Array<int, num_space_dim> max;
584 linked_cell_list.getStencilCells( cell, min, max );
587 std::size_t b_offset = bin_data_1d.binOffset( cell );
588 Kokkos::parallel_for(
589 Kokkos::TeamThreadRange( team, 0, bin_data_1d.binSize( cell ) ),
594 std::size_t pid = linked_cell_list.permutation( bi + b_offset );
596 if ( ( pid >= pid_begin ) && ( pid < pid_end ) )
599 Kokkos::Array<PositionValueType, num_space_dim> xp;
600 for ( std::size_t d = 0; d < num_space_dim; ++d )
601 xp[d] = _position( pid, d );
603 linkedcell_stencil_fill( team, min, max, xp, pid );
608 template <
class TeamType, std::
size_t NSD = num_space_dim>
609 KOKKOS_INLINE_FUNCTION std::enable_if_t<3 == NSD, void>
610 linkedcell_stencil_fill( TeamType team,
const Kokkos::Array<int, 3> min,
611 const Kokkos::Array<int, 3> max,
612 const Kokkos::Array<PositionValueType, 3> xp,
613 const std::size_t pid )
const
615 Kokkos::Array<int, 3> ijk;
616 for (
int i = min[0]; i < max[0]; ++i )
617 for (
int j = min[1]; j < max[1]; ++j )
618 for (
int k = min[2]; k < max[2]; ++k )
621 linkedcell_bin( team, ijk, xp, pid );
625 template <
class TeamType, std::
size_t NSD = num_space_dim>
626 KOKKOS_INLINE_FUNCTION std::enable_if_t<2 == NSD, void>
627 linkedcell_stencil_fill( TeamType team,
const Kokkos::Array<int, 2> min,
628 const Kokkos::Array<int, 2> max,
629 const Kokkos::Array<PositionValueType, 2> xp,
630 const std::size_t pid )
const
632 Kokkos::Array<int, 2> ij;
633 for (
int i = min[0]; i < max[0]; ++i )
634 for (
int j = min[1]; j < max[1]; ++j )
637 linkedcell_bin( team, ij, xp, pid );
641 template <
class TeamType>
642 KOKKOS_INLINE_FUNCTION
void
643 linkedcell_bin( TeamType team,
const Kokkos::Array<int, num_space_dim> ijk,
644 const Kokkos::Array<PositionValueType, num_space_dim> xp,
645 const std::size_t pid )
const
649 pid, linked_cell_list.cellStencil().grid.minDistanceToPoint(
653 std::size_t n_offset = linked_cell_list.binOffset( ijk );
654 int num_n = linked_cell_list.binSize( ijk );
655 neighbor_for( team, pid, xp, n_offset, num_n, BuildOpTag() );
660 KOKKOS_INLINE_FUNCTION
void
661 neighbor_for(
const typename FillNeighborsPolicy::member_type& team,
662 const std::size_t pid,
663 const Kokkos::Array<double, num_space_dim> xp,
666 Kokkos::parallel_for( Kokkos::ThreadVectorRange( team, num_n ),
668 { neighbor_kernel( pid, xp, n_offset, n ); } );
672 KOKKOS_INLINE_FUNCTION
673 void neighbor_for(
const typename FillNeighborsPolicy::member_type team,
674 const std::size_t pid,
675 const Kokkos::Array<double, num_space_dim> xp,
676 const int n_offset,
const int num_n,
TeamOpTag )
const
678 for (
int n = 0; n < num_n; n++ )
679 Kokkos::single( Kokkos::PerThread( team ), [&]()
680 { neighbor_kernel( pid, xp, n_offset, n ); } );
684 KOKKOS_INLINE_FUNCTION
685 void neighbor_kernel(
const int pid,
686 const Kokkos::Array<double, num_space_dim> xp,
687 const int n_offset,
const int n )
const
690 std::size_t nid = linked_cell_list.permutation( n_offset + n );
693 Kokkos::Array<double, num_space_dim> xn;
694 for ( std::size_t d = 0; d < num_space_dim; ++d )
695 xn[d] = _position( nid, d );
702 PositionValueType dist_sqr = 0.0;
703 for ( std::size_t d = 0; d < num_space_dim; ++d )
705 PositionValueType dx = xp[d] - xn[d];
711 addNeighbor( pid, nid, dist_sqr );
718template <std::size_t NumSpaceDim,
class DeviceType,
class AlgorithmTag,
719 class LayoutTag,
class BuildOpTag,
class ArrayType,
721auto createVerletListBuilder(
722 PositionType x,
const std::size_t begin,
const std::size_t end,
723 const typename PositionType::value_type radius,
724 const typename PositionType::value_type cell_size_ratio,
725 const ArrayType grid_min,
const ArrayType grid_max,
726 const std::size_t max_neigh,
727 typename std::enable_if<( is_slice<PositionType>::value ),
int>::type* = 0 )
729 using RandomAccessPositionType =
typename PositionType::random_access_slice;
730 return VerletListBuilder<DeviceType, RandomAccessPositionType,
731 typename PositionType::value_type, AlgorithmTag,
732 LayoutTag, BuildOpTag, ArrayType, NumSpaceDim>(
733 x, begin, end, radius, cell_size_ratio, grid_min, grid_max, max_neigh );
736template <std::size_t NumSpaceDim,
class DeviceType,
class AlgorithmTag,
737 class LayoutTag,
class BuildOpTag,
class ArrayType,
739auto createVerletListBuilder(
740 PositionType x,
const std::size_t begin,
const std::size_t end,
741 const typename PositionType::value_type radius,
742 const typename PositionType::value_type cell_size_ratio,
743 const ArrayType grid_min,
const ArrayType grid_max,
744 const std::size_t max_neigh,
745 typename std::enable_if<( Kokkos::is_view<PositionType>::value ),
748 using memory_space =
typename DeviceType::memory_space;
749 using RandomAccessPositionType =
750 Kokkos::View<
typename PositionType::data_type, memory_space,
751 Kokkos::MemoryTraits<Kokkos::RandomAccess>>;
752 return VerletListBuilder<DeviceType, RandomAccessPositionType,
753 typename PositionType::value_type, AlgorithmTag,
754 LayoutTag, BuildOpTag, ArrayType, NumSpaceDim>(
755 x, begin, end, radius, cell_size_ratio, grid_min, grid_max, max_neigh );
758template <std::size_t NumSpaceDim,
class DeviceType,
class AlgorithmTag,
759 class LayoutTag,
class BuildOpTag,
class PositionType,
760 class RadiusType,
class ArrayType>
761auto createVerletListBuilder(
762 PositionType x,
const std::size_t begin,
const std::size_t end,
763 const typename PositionType::value_type background_radius,
764 const RadiusType radius,
765 const typename PositionType::value_type cell_size_ratio,
766 const ArrayType grid_min,
const ArrayType grid_max,
767 const std::size_t max_neigh,
768 typename std::enable_if<( is_slice<PositionType>::value ),
int>::type* = 0 )
770 using RandomAccessPositionType =
typename PositionType::random_access_slice;
771 return VerletListBuilder<DeviceType, RandomAccessPositionType, RadiusType,
772 AlgorithmTag, LayoutTag, BuildOpTag, ArrayType,
773 NumSpaceDim>( x, begin, end, background_radius,
774 radius, cell_size_ratio, grid_min,
775 grid_max, max_neigh );
778template <std::size_t NumSpaceDim,
class DeviceType,
class AlgorithmTag,
779 class LayoutTag,
class BuildOpTag,
class PositionType,
780 class RadiusType,
class ArrayType>
781auto createVerletListBuilder(
782 PositionType x,
const std::size_t begin,
const std::size_t end,
783 const typename PositionType::value_type background_radius,
784 const RadiusType radius,
785 const typename PositionType::value_type cell_size_ratio,
786 const ArrayType grid_min,
const ArrayType grid_max,
787 const std::size_t max_neigh,
788 typename std::enable_if<( Kokkos::is_view<PositionType>::value ),
791 using RandomAccessPositionType =
792 Kokkos::View<
typename PositionType::value_type**, DeviceType,
793 Kokkos::MemoryTraits<Kokkos::RandomAccess>>;
794 return VerletListBuilder<DeviceType, RandomAccessPositionType, RadiusType,
795 AlgorithmTag, LayoutTag, BuildOpTag, ArrayType,
796 NumSpaceDim>( x, begin, end, background_radius,
797 radius, cell_size_ratio, grid_min,
798 grid_max, max_neigh );
824template <
class MemorySpace,
class AlgorithmTag,
class LayoutTag,
825 class BuildTag = TeamVectorOpTag, std::size_t NumSpaceDim = 3>
829 static_assert( Kokkos::is_memory_space<MemorySpace>::value,
"" );
875 template <
class PositionType,
876 template <
class, std::size_t,
class...>
class ArrayType,
879 PositionType x,
const std::size_t begin,
const std::size_t end,
880 const typename PositionType::value_type neighborhood_radius,
881 const typename PositionType::value_type cell_size_ratio,
882#ifdef KOKKOS_ENABLE_DEPRECATED_CODE_4
883 const ArrayType<
typename PositionType::value_type,
num_space_dim,
886 const ArrayType<
typename PositionType::value_type,
num_space_dim,
890 const ArrayType<typename PositionType::value_type, num_space_dim>
892 const ArrayType<typename PositionType::value_type, num_space_dim>
895 const std::size_t max_neigh = 0,
897 Kokkos::is_view<PositionType>::value ),
900 build( x, begin, end, neighborhood_radius, cell_size_ratio, grid_min,
901 grid_max, max_neigh );
931 template <
class PositionType,
932 template <
class, std::size_t,
class...>
class ArrayType,
935 build( PositionType x,
const std::size_t begin,
const std::size_t end,
936 const typename PositionType::value_type neighborhood_radius,
937 const typename PositionType::value_type cell_size_ratio,
938#ifdef KOKKOS_ENABLE_DEPRECATED_CODE_4
939 const ArrayType<
typename PositionType::value_type,
num_space_dim,
942 const ArrayType<
typename PositionType::value_type,
num_space_dim,
946 const ArrayType<typename PositionType::value_type, num_space_dim>
948 const ArrayType<typename PositionType::value_type, num_space_dim>
951 const std::size_t max_neigh = 0,
953 Kokkos::is_view<PositionType>::value ),
958 cell_size_ratio, grid_min, grid_max, max_neigh );
989 template <
class PositionType,
class RadiusType,
990 template <
class, std::size_t,
class...>
class ArrayType,
993 PositionType x,
const std::size_t begin,
const std::size_t end,
994 const typename PositionType::value_type background_radius,
995 RadiusType neighborhood_radius,
996 const typename PositionType::value_type cell_size_ratio,
997#ifdef KOKKOS_ENABLE_DEPRECATED_CODE_4
998 const ArrayType<
typename PositionType::value_type,
num_space_dim,
1001 const ArrayType<
typename PositionType::value_type,
num_space_dim,
1005 const ArrayType<typename PositionType::value_type, num_space_dim>
1007 const ArrayType<typename PositionType::value_type, num_space_dim>
1010 const std::size_t max_neigh = 0,
1012 Kokkos::is_view<PositionType>::value ),
1015 build( x, begin, end, background_radius, neighborhood_radius,
1016 cell_size_ratio, grid_min, grid_max, max_neigh );
1039 template <
class PositionType,
1040 template <
class, std::size_t,
class...>
class ArrayType,
1044 const typename PositionType::value_type neighborhood_radius,
1045 const typename PositionType::value_type cell_size_ratio,
1046#ifdef KOKKOS_ENABLE_DEPRECATED_CODE_4
1047 const ArrayType<
typename PositionType::value_type,
num_space_dim,
1050 const ArrayType<
typename PositionType::value_type,
num_space_dim,
1054 const ArrayType<typename PositionType::value_type, num_space_dim>
1056 const ArrayType<typename PositionType::value_type, num_space_dim>
1059 const std::size_t max_neigh = 0,
1061 Kokkos::is_view<PositionType>::value ),
1064 build( x, neighborhood_radius, cell_size_ratio, grid_min, grid_max,
1072 template <
class PositionType>
1074 PositionType x,
const std::size_t begin,
const std::size_t end,
1075 const typename PositionType::value_type neighborhood_radius,
1076 const typename PositionType::value_type cell_size_ratio,
1077 const typename PositionType::value_type grid_min[
num_space_dim],
1078 const typename PositionType::value_type grid_max[
num_space_dim],
1079 const std::size_t max_neigh = 0,
1081 Kokkos::is_view<PositionType>::value ),
1084 build( x, begin, end, neighborhood_radius, cell_size_ratio, grid_min,
1085 grid_max, max_neigh );
1092 template <
class PositionType>
1095 const typename PositionType::value_type neighborhood_radius,
1096 const typename PositionType::value_type cell_size_ratio,
1097 const typename PositionType::value_type grid_min[
num_space_dim],
1098 const typename PositionType::value_type grid_max[
num_space_dim],
1099 const std::size_t max_neigh = 0,
1101 Kokkos::is_view<PositionType>::value ),
1104 build( x, neighborhood_radius, cell_size_ratio, grid_min, grid_max,
1112 template <
class PositionType,
class RadiusType>
1114 PositionType x,
const std::size_t begin,
const std::size_t end,
1115 const typename PositionType::value_type background_radius,
1116 RadiusType neighborhood_radius,
1117 const typename PositionType::value_type cell_size_ratio,
1118 const typename PositionType::value_type grid_min[
num_space_dim],
1119 const typename PositionType::value_type grid_max[
num_space_dim],
1120 const std::size_t max_neigh = 0,
1122 Kokkos::is_view<PositionType>::value ),
1125 build( x, begin, end, background_radius, neighborhood_radius,
1126 cell_size_ratio, grid_min, grid_max, max_neigh );
1157 template <
class PositionType,
class RadiusType,
1158 template <
class, std::size_t,
class...>
class ArrayType,
1160 void build( PositionType x,
const std::size_t begin,
const std::size_t end,
1161 const typename PositionType::value_type background_radius,
1162 RadiusType neighborhood_radius,
1163 const typename PositionType::value_type cell_size_ratio,
1164#ifdef KOKKOS_ENABLE_DEPRECATED_CODE_4
1165 const ArrayType<
typename PositionType::value_type,
1168 const ArrayType<
typename PositionType::value_type,
1172 const ArrayType<
typename PositionType::value_type,
1175 const ArrayType<
typename PositionType::value_type,
1179 const std::size_t max_neigh = 0 )
1182 neighborhood_radius, cell_size_ratio, grid_min, grid_max,
1206 template <
class PositionType,
1207 template <
class, std::size_t,
class...>
class ArrayType,
1211 const typename PositionType::value_type neighborhood_radius,
1212 const typename PositionType::value_type cell_size_ratio,
1213#ifdef KOKKOS_ENABLE_DEPRECATED_CODE_4
1214 const ArrayType<
typename PositionType::value_type,
num_space_dim,
1217 const ArrayType<
typename PositionType::value_type,
num_space_dim,
1221 const ArrayType<typename PositionType::value_type, num_space_dim>
1223 const ArrayType<typename PositionType::value_type, num_space_dim>
1226 const std::size_t max_neigh = 0,
1228 Kokkos::is_view<PositionType>::value ),
1231 build( x, 0,
size( x ), neighborhood_radius, cell_size_ratio, grid_min,
1232 grid_max, max_neigh );
1239 template <
class PositionType>
1241 build( PositionType x,
const std::size_t begin,
const std::size_t end,
1242 const typename PositionType::value_type neighborhood_radius,
1243 const typename PositionType::value_type cell_size_ratio,
1244 const typename PositionType::value_type grid_min[
num_space_dim],
1245 const typename PositionType::value_type grid_max[
num_space_dim],
1246 const std::size_t max_neigh = 0,
1248 Kokkos::is_view<PositionType>::value ),
1253 cell_size_ratio, grid_min, grid_max, max_neigh );
1260 template <
class PositionType,
class ExecutionSpace>
1262 build( ExecutionSpace exec_space, PositionType x,
const std::size_t begin,
1263 const std::size_t end,
1264 const typename PositionType::value_type neighborhood_radius,
1265 const typename PositionType::value_type cell_size_ratio,
1266 const typename PositionType::value_type grid_min[
num_space_dim],
1267 const typename PositionType::value_type grid_max[
num_space_dim],
1268 const std::size_t max_neigh = 0,
1270 Kokkos::is_view<PositionType>::value ),
1279 build( exec_space, x, begin, end, neighborhood_radius, cell_size_ratio,
1280 kokkos_min, kokkos_max, max_neigh );
1287 template <
class PositionType,
class RadiusType>
1288 void build( PositionType x,
const std::size_t begin,
const std::size_t end,
1289 const typename PositionType::value_type background_radius,
1290 RadiusType neighborhood_radius,
1291 const typename PositionType::value_type cell_size_ratio,
1292 const typename PositionType::value_type grid_min[
num_space_dim],
1293 const typename PositionType::value_type grid_max[
num_space_dim],
1294 const std::size_t max_neigh = 0 )
1298 neighborhood_radius, cell_size_ratio, grid_min, grid_max,
1306 template <
class PositionType>
1309 const typename PositionType::value_type neighborhood_radius,
1310 const typename PositionType::value_type cell_size_ratio,
1311 const typename PositionType::value_type grid_min[
num_space_dim],
1312 const typename PositionType::value_type grid_max[
num_space_dim],
1313 const std::size_t max_neigh = 0,
1315 Kokkos::is_view<PositionType>::value ),
1318 build( x, 0,
size( x ), neighborhood_radius, cell_size_ratio, grid_min,
1319 grid_max, max_neigh );
1326 template <
class PositionType,
class RadiusType,
class ExecutionSpace>
1327 void build( ExecutionSpace exec_space, PositionType x,
1328 const std::size_t begin,
const std::size_t end,
1329 const typename PositionType::value_type background_radius,
1330 RadiusType neighborhood_radius,
1331 const typename PositionType::value_type cell_size_ratio,
1332 const typename PositionType::value_type grid_min[
num_space_dim],
1333 const typename PositionType::value_type grid_max[
num_space_dim],
1334 const std::size_t max_neigh = 0 )
1342 build( exec_space, x, begin, end, background_radius,
1343 neighborhood_radius, cell_size_ratio, kokkos_min, kokkos_max,
1351 template <
class PositionType,
class ExecutionSpace,
1352 template <
class, std::size_t,
class...>
class ArrayType,
1355 build( ExecutionSpace, PositionType x,
const std::size_t begin,
1356 const std::size_t end,
1357 const typename PositionType::value_type neighborhood_radius,
1358 const typename PositionType::value_type cell_size_ratio,
1359#ifdef KOKKOS_ENABLE_DEPRECATED_CODE_4
1360 const ArrayType<
typename PositionType::value_type,
num_space_dim,
1363 const ArrayType<
typename PositionType::value_type,
num_space_dim,
1367 const ArrayType<typename PositionType::value_type, num_space_dim>
1369 const ArrayType<typename PositionType::value_type, num_space_dim>
1372 const std::size_t max_neigh = 0,
1374 Kokkos::is_view<PositionType>::value ),
1377 Kokkos::Profiling::ScopedRegion region(
"Cabana::VerletList::build" );
1381 assert( end >= begin );
1382 assert( end <=
size( x ) );
1384 using device_type = Kokkos::Device<ExecutionSpace, memory_space>;
1388 AlgorithmTag, LayoutTag, BuildTag>(
1389 x, begin, end, neighborhood_radius, cell_size_ratio, grid_min,
1390 grid_max, max_neigh );
1391 buildImpl( builder );
1398 template <
class PositionType,
class RadiusType,
class ExecutionSpace,
1399 template <
class, std::size_t,
class...>
class ArrayType,
1401 void build( ExecutionSpace, PositionType x,
const std::size_t begin,
1402 const std::size_t end,
1403 const typename PositionType::value_type background_radius,
1404 RadiusType neighborhood_radius,
1405 const typename PositionType::value_type cell_size_ratio,
1406#ifdef KOKKOS_ENABLE_DEPRECATED_CODE_4
1407 const ArrayType<
typename PositionType::value_type,
1410 const ArrayType<
typename PositionType::value_type,
1414 const ArrayType<
typename PositionType::value_type,
1417 const ArrayType<
typename PositionType::value_type,
1421 const std::size_t max_neigh = 0 )
1423 Kokkos::Profiling::ScopedRegion region(
"Cabana::VerletList::build" );
1427 assert( end >= begin );
1428 assert( end <=
size( x ) );
1431 using device_type = Kokkos::Device<ExecutionSpace, memory_space>;
1434 AlgorithmTag, LayoutTag, BuildTag>(
1435 x, begin, end, background_radius, neighborhood_radius,
1436 cell_size_ratio, grid_min, grid_max, max_neigh );
1437 buildImpl( builder );
1441 template <
class BuilderType>
1442 void buildImpl( BuilderType builder )
1452 typename BuilderType::FillNeighborsPolicy fill_policy(
1453 builder.bin_data_1d.numBin(), Kokkos::AUTO, 4 );
1454 if ( builder.count )
1456 typename BuilderType::CountNeighborsPolicy count_policy(
1457 builder.bin_data_1d.numBin(), Kokkos::AUTO, 4 );
1458 Kokkos::parallel_for(
"Cabana::VerletList::count_neighbors",
1459 count_policy, builder );
1463 builder.processCounts( LayoutTag() );
1464 Kokkos::parallel_for(
"Cabana::VerletList::fill_neighbors",
1465 fill_policy, builder );
1471 builder.processCounts( LayoutTag() );
1475 if ( builder.count or builder.refill )
1477 Kokkos::parallel_for(
"Cabana::VerletList::fill_neighbors",
1478 fill_policy, builder );
1483 _data = builder._data;
1488 KOKKOS_INLINE_FUNCTION
1490 const std::size_t neighbor_index,
1491 const int new_index )
const
1493 _data.setNeighbor( particle_index, neighbor_index, new_index );
1528template <
class AlgorithmTag,
class LayoutTag,
class BuildTag,
1530 template <
class, std::size_t,
class...>
class ArrayType,
1531 std::size_t NumSpaceDim,
class... Args>
1533 PositionType positions,
const std::size_t begin,
const std::size_t end,
1534 const typename PositionType::value_type radius,
1535 const typename PositionType::value_type cell_size_ratio,
1536#ifdef KOKKOS_ENABLE_DEPRECATED_CODE_4
1537 const ArrayType<typename PositionType::value_type, NumSpaceDim, Args...>
1539 const ArrayType<typename PositionType::value_type, NumSpaceDim, Args...>
1542 const ArrayType<typename PositionType::value_type, NumSpaceDim> grid_min,
1543 const ArrayType<typename PositionType::value_type, NumSpaceDim> grid_max,
1545 const std::size_t max_neigh = 0 )
1547 using memory_space =
typename PositionType::memory_space;
1549 NumSpaceDim>( positions, begin, end, radius,
1550 cell_size_ratio, grid_min, grid_max,
1574template <
class AlgorithmTag,
class LayoutTag,
class BuildTag,
1576 template <
class, std::size_t,
class...>
class ArrayType,
1577 std::size_t NumSpaceDim,
class... Args>
1579 const PositionType& positions,
1580 const typename PositionType::value_type radius,
1581 const typename PositionType::value_type cell_size_ratio,
1582#ifdef KOKKOS_ENABLE_DEPRECATED_CODE_4
1583 const ArrayType<typename PositionType::value_type, NumSpaceDim, Args...>
1585 const ArrayType<typename PositionType::value_type, NumSpaceDim, Args...>
1588 const ArrayType<typename PositionType::value_type, NumSpaceDim> grid_min,
1589 const ArrayType<typename PositionType::value_type, NumSpaceDim> grid_max,
1591 const std::size_t max_neigh = 0 )
1593 using memory_space =
typename PositionType::memory_space;
1595 NumSpaceDim>( positions, radius, cell_size_ratio,
1596 grid_min, grid_max, max_neigh );
1603template <
class MemorySpace,
class AlgorithmTag,
class BuildTag,
1616 KOKKOS_INLINE_FUNCTION
1620 return list.
_data.neighbors.extent( 0 );
1624 KOKKOS_INLINE_FUNCTION
1627 std::size_t num_p = list.
_data.counts.size();
1632 KOKKOS_INLINE_FUNCTION
1634 const std::size_t particle_index )
1636 return list.
_data.counts( particle_index );
1641 KOKKOS_INLINE_FUNCTION
1643 const std::size_t particle_index,
1644 const std::size_t neighbor_index )
1646 return list.
_data.neighbors( list.
_data.offsets( particle_index ) +
1653template <
class MemorySpace,
class AlgorithmTag,
class BuildTag,
1666 KOKKOS_INLINE_FUNCTION
1669 std::size_t num_p = list.
_data.counts.size();
1674 KOKKOS_INLINE_FUNCTION
1678 return list.
_data.max_n;
1682 KOKKOS_INLINE_FUNCTION
1684 const std::size_t particle_index )
1686 return list.
_data.counts( particle_index );
1691 KOKKOS_INLINE_FUNCTION
1693 const std::size_t particle_index,
1694 const std::size_t neighbor_index )
1696 return list.
_data.neighbors( particle_index, neighbor_index );
std::enable_if_t< 3==Array_t::num_space_dim, void > update(Array_t &a, const typename Array_t::value_type alpha, const Array_t &b, const typename Array_t::value_type beta, DecompositionTag tag)
Update two vectors such that a = alpha * a + beta * b. 3D specialization.
Definition Cabana_Grid_Array.hpp:617
KOKKOS_INLINE_FUNCTION std::enable_if_t< 3==SplineDataType::num_space_dim, void > value(const ViewType &view, const SplineDataType &sd, PointDataType &result, typename std::enable_if<(std::rank< PointDataType >::value==0), void * >::type=0)
Interpolate a scalar value to a point. 3D specialization.
Definition Cabana_Grid_Interpolation.hpp:56
Linked cell list binning (spatial sorting) and neighbor iteration.
KOKKOS_INLINE_FUNCTION std::size_t maxNeighbor(const ListType &list, const std::size_t num_particles)
Iterate to find the maximum number of neighbors.
Definition Cabana_NeighborList.hpp:273
KOKKOS_INLINE_FUNCTION std::size_t totalNeighbor(const ListType &list, const std::size_t num_particles)
Iterate to get the total number of neighbors.
Definition Cabana_NeighborList.hpp:261
SIMD and neighbor extension of Kokkos parallel iteration.
Neighborhood discriminator.
Definition Cabana_NeighborList.hpp:63
static KOKKOS_INLINE_FUNCTION std::size_t numNeighbor(const list_type &list, const std::size_t particle_index)
Get the number of neighbors for a given particle index.
Definition Cabana_VerletList.hpp:1683
static KOKKOS_INLINE_FUNCTION std::size_t maxNeighbor(const list_type &list)
Get the maximum number of neighbors per particle.
Definition Cabana_VerletList.hpp:1675
static KOKKOS_INLINE_FUNCTION std::size_t getNeighbor(const list_type &list, const std::size_t particle_index, const std::size_t neighbor_index)
Definition Cabana_VerletList.hpp:1692
static KOKKOS_INLINE_FUNCTION std::size_t totalNeighbor(const list_type &list)
Get the total number of neighbors across all particles.
Definition Cabana_VerletList.hpp:1667
VerletList< MemorySpace, AlgorithmTag, VerletLayout2D, BuildTag, Dim > list_type
Neighbor list type.
Definition Cabana_VerletList.hpp:1662
MemorySpace memory_space
Kokkos memory space.
Definition Cabana_VerletList.hpp:1660
static KOKKOS_INLINE_FUNCTION std::size_t totalNeighbor(const list_type &list)
Get the total number of neighbors across all particles.
Definition Cabana_VerletList.hpp:1617
MemorySpace memory_space
Kokkos memory space.
Definition Cabana_VerletList.hpp:1610
static KOKKOS_INLINE_FUNCTION std::size_t numNeighbor(const list_type &list, const std::size_t particle_index)
Get the number of neighbors for a given particle index.
Definition Cabana_VerletList.hpp:1633
VerletList< MemorySpace, AlgorithmTag, VerletLayoutCSR, BuildTag, Dim > list_type
Neighbor list type.
Definition Cabana_VerletList.hpp:1612
static KOKKOS_INLINE_FUNCTION std::size_t maxNeighbor(const list_type &list)
Get the maximum number of neighbors across all particles.
Definition Cabana_VerletList.hpp:1625
static KOKKOS_INLINE_FUNCTION std::size_t getNeighbor(const list_type &list, const std::size_t particle_index, const std::size_t neighbor_index)
Definition Cabana_VerletList.hpp:1642
Neighbor list interface. Provides an interface callable at the functor level that gives access to nei...
Definition Cabana_NeighborList.hpp:223
Neighbor operations are executed with team parallelism.
Definition Cabana_Parallel.hpp:206
Neighbor operations are executed with team vector parallelism.
Definition Cabana_Parallel.hpp:211
Neighbor list implementation based on binning particles on a Cartesian grid with cells of the same si...
Definition Cabana_VerletList.hpp:827
void build(ExecutionSpace exec_space, PositionType x, const std::size_t begin, const std::size_t end, const typename PositionType::value_type neighborhood_radius, const typename PositionType::value_type cell_size_ratio, const typename PositionType::value_type grid_min[num_space_dim], const typename PositionType::value_type grid_max[num_space_dim], const std::size_t max_neigh=0, typename std::enable_if<(is_slice< PositionType >::value||Kokkos::is_view< PositionType >::value), int >::type *=0)
Given a list of particle positions and a neighborhood radius calculate the neighbor list.
Definition Cabana_VerletList.hpp:1262
typename memory_space::execution_space execution_space
Kokkos default execution space for this memory space.
Definition Cabana_VerletList.hpp:838
VerletList(PositionType x, const std::size_t begin, const std::size_t end, const typename PositionType::value_type neighborhood_radius, const typename PositionType::value_type cell_size_ratio, const ArrayType< typename PositionType::value_type, num_space_dim > grid_min, const ArrayType< typename PositionType::value_type, num_space_dim > grid_max, const std::size_t max_neigh=0, typename std::enable_if<(is_slice< PositionType >::value||Kokkos::is_view< PositionType >::value), int >::type *=0)
Given a list of particle positions and a neighborhood radius calculate the neighbor list.
Definition Cabana_VerletList.hpp:878
VerletList(PositionType x, const std::size_t begin, const std::size_t end, const typename PositionType::value_type background_radius, RadiusType neighborhood_radius, const typename PositionType::value_type cell_size_ratio, const ArrayType< typename PositionType::value_type, num_space_dim > grid_min, const ArrayType< typename PositionType::value_type, num_space_dim > grid_max, const std::size_t max_neigh=0, typename std::enable_if<(is_slice< PositionType >::value||Kokkos::is_view< PositionType >::value), int >::type *=0)
Given a list of particle positions and a neighborhood radius calculate the neighbor list.
Definition Cabana_VerletList.hpp:992
VerletList(PositionType x, const typename PositionType::value_type neighborhood_radius, const typename PositionType::value_type cell_size_ratio, const ArrayType< typename PositionType::value_type, num_space_dim > grid_min, const ArrayType< typename PositionType::value_type, num_space_dim > grid_max, const std::size_t max_neigh=0, typename std::enable_if<(is_slice< PositionType >::value||Kokkos::is_view< PositionType >::value), int >::type *=0)
Given a list of particle positions and a neighborhood radius calculate the neighbor list.
Definition Cabana_VerletList.hpp:1042
VerletList(PositionType x, const std::size_t begin, const std::size_t end, const typename PositionType::value_type background_radius, RadiusType neighborhood_radius, const typename PositionType::value_type cell_size_ratio, const typename PositionType::value_type grid_min[num_space_dim], const typename PositionType::value_type grid_max[num_space_dim], const std::size_t max_neigh=0, typename std::enable_if<(is_slice< PositionType >::value||Kokkos::is_view< PositionType >::value), int >::type *=0)
Given a list of particle positions and a neighborhood radius calculate the neighbor list.
Definition Cabana_VerletList.hpp:1113
void build(ExecutionSpace, PositionType x, const std::size_t begin, const std::size_t end, const typename PositionType::value_type background_radius, RadiusType neighborhood_radius, const typename PositionType::value_type cell_size_ratio, const ArrayType< typename PositionType::value_type, num_space_dim > grid_min, const ArrayType< typename PositionType::value_type, num_space_dim > grid_max, const std::size_t max_neigh=0)
Given a list of particle positions and a neighborhood radius calculate the neighbor list.
Definition Cabana_VerletList.hpp:1401
void build(ExecutionSpace exec_space, PositionType x, const std::size_t begin, const std::size_t end, const typename PositionType::value_type background_radius, RadiusType neighborhood_radius, const typename PositionType::value_type cell_size_ratio, const typename PositionType::value_type grid_min[num_space_dim], const typename PositionType::value_type grid_max[num_space_dim], const std::size_t max_neigh=0)
Given a list of particle positions and a neighborhood radius calculate the neighbor list.
Definition Cabana_VerletList.hpp:1327
void build(PositionType x, const typename PositionType::value_type neighborhood_radius, const typename PositionType::value_type cell_size_ratio, const typename PositionType::value_type grid_min[num_space_dim], const typename PositionType::value_type grid_max[num_space_dim], const std::size_t max_neigh=0, typename std::enable_if<(is_slice< PositionType >::value||Kokkos::is_view< PositionType >::value), int >::type *=0)
Given a list of particle positions and a neighborhood radius calculate the neighbor list.
Definition Cabana_VerletList.hpp:1308
VerletList()=default
Default constructor.
KOKKOS_INLINE_FUNCTION void setNeighbor(const std::size_t particle_index, const std::size_t neighbor_index, const int new_index) const
Modify a neighbor in the list; for example, mark it as a broken bond.
Definition Cabana_VerletList.hpp:1489
VerletListData< memory_space, VerletLayoutCSR > _data
Definition Cabana_VerletList.hpp:841
void build(PositionType x, const std::size_t begin, const std::size_t end, const typename PositionType::value_type neighborhood_radius, const typename PositionType::value_type cell_size_ratio, const typename PositionType::value_type grid_min[num_space_dim], const typename PositionType::value_type grid_max[num_space_dim], const std::size_t max_neigh=0, typename std::enable_if<(is_slice< PositionType >::value||Kokkos::is_view< PositionType >::value), int >::type *=0)
Given a list of particle positions and a neighborhood radius calculate the neighbor list.
Definition Cabana_VerletList.hpp:1241
void build(PositionType x, const std::size_t begin, const std::size_t end, const typename PositionType::value_type background_radius, RadiusType neighborhood_radius, const typename PositionType::value_type cell_size_ratio, const ArrayType< typename PositionType::value_type, num_space_dim > grid_min, const ArrayType< typename PositionType::value_type, num_space_dim > grid_max, const std::size_t max_neigh=0)
Given a list of particle positions and a neighborhood radius calculate the neighbor list.
Definition Cabana_VerletList.hpp:1160
void build(PositionType x, const typename PositionType::value_type neighborhood_radius, const typename PositionType::value_type cell_size_ratio, const ArrayType< typename PositionType::value_type, num_space_dim > grid_min, const ArrayType< typename PositionType::value_type, num_space_dim > grid_max, const std::size_t max_neigh=0, typename std::enable_if<(is_slice< PositionType >::value||Kokkos::is_view< PositionType >::value), int >::type *=0)
VerletList constructor. Given a list of particle positions and a neighborhood radius calculate the ne...
Definition Cabana_VerletList.hpp:1210
void build(PositionType x, const std::size_t begin, const std::size_t end, const typename PositionType::value_type background_radius, RadiusType neighborhood_radius, const typename PositionType::value_type cell_size_ratio, const typename PositionType::value_type grid_min[num_space_dim], const typename PositionType::value_type grid_max[num_space_dim], const std::size_t max_neigh=0)
Given a list of particle positions and a neighborhood radius calculate the neighbor list.
Definition Cabana_VerletList.hpp:1288
VerletList(PositionType x, const std::size_t begin, const std::size_t end, const typename PositionType::value_type neighborhood_radius, const typename PositionType::value_type cell_size_ratio, const typename PositionType::value_type grid_min[num_space_dim], const typename PositionType::value_type grid_max[num_space_dim], const std::size_t max_neigh=0, typename std::enable_if<(is_slice< PositionType >::value||Kokkos::is_view< PositionType >::value), int >::type *=0)
Given a list of particle positions and a neighborhood radius calculate the neighbor list.
Definition Cabana_VerletList.hpp:1073
MemorySpace memory_space
Kokkos memory space in which the neighbor list data resides.
Definition Cabana_VerletList.hpp:835
void build(PositionType x, const std::size_t begin, const std::size_t end, const typename PositionType::value_type neighborhood_radius, const typename PositionType::value_type cell_size_ratio, const ArrayType< typename PositionType::value_type, num_space_dim > grid_min, const ArrayType< typename PositionType::value_type, num_space_dim > grid_max, const std::size_t max_neigh=0, typename std::enable_if<(is_slice< PositionType >::value||Kokkos::is_view< PositionType >::value), int >::type *=0)
Definition Cabana_VerletList.hpp:935
static constexpr std::size_t num_space_dim
Definition Cabana_VerletList.hpp:832
VerletList(PositionType x, const typename PositionType::value_type neighborhood_radius, const typename PositionType::value_type cell_size_ratio, const typename PositionType::value_type grid_min[num_space_dim], const typename PositionType::value_type grid_max[num_space_dim], const std::size_t max_neigh=0, typename std::enable_if<(is_slice< PositionType >::value||Kokkos::is_view< PositionType >::value), int >::type *=0)
Given a list of particle positions and a neighborhood radius calculate the neighbor list....
Definition Cabana_VerletList.hpp:1093
void build(ExecutionSpace, PositionType x, const std::size_t begin, const std::size_t end, const typename PositionType::value_type neighborhood_radius, const typename PositionType::value_type cell_size_ratio, const ArrayType< typename PositionType::value_type, num_space_dim > grid_min, const ArrayType< typename PositionType::value_type, num_space_dim > grid_max, const std::size_t max_neigh=0, typename std::enable_if<(is_slice< PositionType >::value||Kokkos::is_view< PositionType >::value), int >::type *=0)
Given a list of particle positions and a neighborhood radius calculate the neighbor list.
Definition Cabana_VerletList.hpp:1355
Core: particle data structures and algorithms.
Definition Cabana_AoSoA.hpp:36
auto size(SliceType slice, typename std::enable_if< is_slice< SliceType >::value, int >::type *=0)
Check slice size (differs from Kokkos View).
Definition Cabana_Slice.hpp:1019
auto copyArray(const std::array< Scalar, Dim > input)
Copy std::array into Kokkos::Array for potential device use.
Definition Cabana_Utils.hpp:32
auto createLinkedCellList(PositionType positions, const ArrayType< Scalar, NumSpaceDim > grid_delta, const ArrayType< Scalar, NumSpaceDim > grid_min, const ArrayType< Scalar, NumSpaceDim > grid_max)
Creation function for linked cell list.
Definition Cabana_LinkedCellList.hpp:918
auto createVerletList(PositionType positions, const std::size_t begin, const std::size_t end, const typename PositionType::value_type radius, const typename PositionType::value_type cell_size_ratio, const ArrayType< typename PositionType::value_type, NumSpaceDim > grid_min, const ArrayType< typename PositionType::value_type, NumSpaceDim > grid_max, const std::size_t max_neigh=0)
VerletList constructor. Given a list of particle positions and a neighborhood radius calculate the ne...
Definition Cabana_VerletList.hpp:1532
2D array neighbor list layout.
Definition Cabana_VerletList.hpp:40
CSR (compressed sparse row) neighbor list layout.
Definition Cabana_VerletList.hpp:35
KOKKOS_INLINE_FUNCTION void addNeighbor(const int pid, const int nid) const
Add a neighbor to the list.
Definition Cabana_VerletList.hpp:100
MemorySpace memory_space
Kokkos memory space.
Definition Cabana_VerletList.hpp:86
Kokkos::View< int *, memory_space > counts
Number of neighbors per particle.
Definition Cabana_VerletList.hpp:89
Kokkos::View< int **, memory_space > neighbors
Neighbor list.
Definition Cabana_VerletList.hpp:92
KOKKOS_INLINE_FUNCTION void setNeighbor(const int pid, const int nid, const int new_id) const
Modify a neighbor in the list.
Definition Cabana_VerletList.hpp:109
std::size_t max_n
Definition Cabana_VerletList.hpp:96
KOKKOS_INLINE_FUNCTION void setNeighbor(const int pid, const int nid, const int new_id) const
Modify a neighbor in the list.
Definition Cabana_VerletList.hpp:75
Kokkos::View< int *, memory_space > offsets
Offsets into the neighbor list.
Definition Cabana_VerletList.hpp:60
MemorySpace memory_space
Kokkos memory space.
Definition Cabana_VerletList.hpp:54
Kokkos::View< int *, memory_space > counts
Number of neighbors per particle.
Definition Cabana_VerletList.hpp:57
KOKKOS_INLINE_FUNCTION void addNeighbor(const int pid, const int nid) const
Add a neighbor to the list.
Definition Cabana_VerletList.hpp:67
Kokkos::View< int *, memory_space > neighbors
Neighbor list.
Definition Cabana_VerletList.hpp:63
Definition Cabana_VerletList.hpp:47
Definition Cabana_Types.hpp:88
Slice static type checker.
Definition Cabana_Slice.hpp:868