16#ifndef CABANA_LINKEDCELLLIST_HPP
17#define CABANA_LINKEDCELLLIST_HPP
23#include <impl/Cabana_CartesianGrid.hpp>
25#include <Kokkos_Core.hpp>
26#include <Kokkos_Profiling_ScopedRegion.hpp>
27#include <Kokkos_ScatterView.hpp>
36template <
class Scalar, std::
size_t NumSpaceDim = 3>
43 Impl::CartesianGrid<Scalar, num_space_dim>
grid;
55 template <
class ArrayType>
57 const Scalar cell_size_ratio,
const ArrayType& grid_min,
58 const ArrayType& grid_max )
60 Scalar dx = neighborhood_radius * cell_size_ratio;
61 grid = Impl::CartesianGrid<Scalar, num_space_dim>( grid_min, grid_max,
70 const Scalar cell_size_ratio,
74 Scalar dx = neighborhood_radius * cell_size_ratio;
75 grid = Impl::CartesianGrid<Scalar, num_space_dim>( grid_min, grid_max,
83 template <std::
size_t NSD = num_space_dim>
84 KOKKOS_INLINE_FUNCTION std::enable_if_t<3 == NSD, void>
85 getCells(
const int cell,
int& imin,
int& imax,
int& jmin,
int& jmax,
86 int& kmin,
int& kmax )
const
89 grid.ijkBinIndex( cell, i, j, k );
105 KOKKOS_INLINE_FUNCTION
void
106 getCells(
const int cell, Kokkos::Array<int, num_space_dim>& min,
107 Kokkos::Array<int, num_space_dim>& max )
const
109 Kokkos::Array<int, num_space_dim> ijk;
110 grid.ijkBinIndex( cell, ijk );
128template <
class MemorySpace,
class Scalar =
double, std::
size_t NumSpaceDim = 3>
134 static_assert( Kokkos::is_memory_space<MemorySpace>() );
166 template <
class PositionType,
167 template <
class, std::size_t,
class...>
class ArrayType,
170 PositionType positions,
171#ifdef KOKKOS_ENABLE_DEPRECATED_CODE_4
172 const ArrayType<Scalar, num_space_dim, Args...> grid_delta,
173 const ArrayType<Scalar, num_space_dim, Args...> grid_min,
174 const ArrayType<Scalar, num_space_dim, Args...> grid_max,
176 const ArrayType<Scalar, num_space_dim> grid_delta,
177 const ArrayType<Scalar, num_space_dim> grid_min,
178 const ArrayType<Scalar, num_space_dim> grid_max,
181 Kokkos::is_view<PositionType>::value ),
184 , _end(
size( positions ) )
185 , _grid( grid_min, grid_max, grid_delta )
186 , _cell_stencil( grid_delta[0], 1.0, grid_min, grid_max )
189 std::size_t np =
size( positions );
191 build( positions, 0, np );
210 template <
class PositionType,
211 template <
class, std::size_t,
class...>
class ArrayType,
214 PositionType positions,
const std::size_t begin,
const std::size_t end,
215#ifdef KOKKOS_ENABLE_DEPRECATED_CODE_4
216 const ArrayType<Scalar, num_space_dim, Args...> grid_delta,
217 const ArrayType<Scalar, num_space_dim, Args...> grid_min,
218 const ArrayType<Scalar, num_space_dim, Args...> grid_max,
220 const ArrayType<Scalar, num_space_dim> grid_delta,
221 const ArrayType<Scalar, num_space_dim> grid_min,
222 const ArrayType<Scalar, num_space_dim> grid_max,
225 Kokkos::is_view<PositionType>::value ),
229 , _grid( grid_min, grid_max, grid_delta )
230 , _cell_stencil( grid_delta[0], 1.0, grid_min, grid_max )
234 build( positions, begin, end );
249 template <
class PositionType,
250 template <
class, std::size_t,
class...>
class ArrayType,
253 PositionType positions,
254#ifdef KOKKOS_ENABLE_DEPRECATED_CODE_4
255 const ArrayType<Scalar, num_space_dim, Args...> grid_delta,
256 const ArrayType<Scalar, num_space_dim, Args...> grid_min,
257 const ArrayType<Scalar, num_space_dim, Args...> grid_max,
259 const ArrayType<Scalar, num_space_dim> grid_delta,
260 const ArrayType<Scalar, num_space_dim> grid_min,
261 const ArrayType<Scalar, num_space_dim> grid_max,
263 const Scalar neighborhood_radius,
const Scalar cell_size_ratio = 1,
265 Kokkos::is_view<PositionType>::value ),
268 , _end(
size( positions ) )
269 , _grid( grid_min, grid_max, grid_delta )
270 , _cell_stencil( neighborhood_radius, cell_size_ratio, grid_min,
274 std::size_t np =
size( positions );
276 build( positions, 0, np );
297 template <
class PositionType,
298 template <
class, std::size_t,
class...>
class ArrayType,
301 PositionType positions,
const std::size_t begin,
const std::size_t end,
302#ifdef KOKKOS_ENABLE_DEPRECATED_CODE_4
303 const ArrayType<Scalar, num_space_dim, Args...> grid_delta,
304 const ArrayType<Scalar, num_space_dim, Args...> grid_min,
305 const ArrayType<Scalar, num_space_dim, Args...> grid_max,
307 const ArrayType<Scalar, num_space_dim> grid_delta,
308 const ArrayType<Scalar, num_space_dim> grid_min,
309 const ArrayType<Scalar, num_space_dim> grid_max,
311 const Scalar neighborhood_radius,
const Scalar cell_size_ratio = 1,
313 Kokkos::is_view<PositionType>::value ),
317 , _grid( grid_min, grid_max, grid_delta )
318 , _cell_stencil( neighborhood_radius, cell_size_ratio, grid_min,
323 build( positions, begin, end );
336 template <
class PositionType>
338 PositionType positions,
const Scalar grid_delta[
num_space_dim],
342 Kokkos::is_view<PositionType>::value ),
345 , _end(
size( positions ) )
346 , _grid( grid_min, grid_max, grid_delta )
347 , _cell_stencil( grid_delta[0], 1.0, grid_min, grid_max )
350 std::size_t np =
size( positions );
352 build( positions, 0, np );
371 template <
class PositionType>
373 PositionType positions,
const std::size_t begin,
const std::size_t end,
378 Kokkos::is_view<PositionType>::value ),
382 , _grid( grid_min, grid_max, grid_delta )
383 , _cell_stencil( grid_delta[0], 1.0, grid_min, grid_max )
387 build( positions, begin, end );
402 template <
class PositionType>
404 PositionType positions,
const Scalar grid_delta[
num_space_dim],
406 const Scalar grid_max[
num_space_dim],
const Scalar neighborhood_radius,
407 const Scalar cell_size_ratio = 1,
409 Kokkos::is_view<PositionType>::value ),
412 , _end(
size( positions ) )
413 , _grid( grid_min, grid_max, grid_delta )
414 , _cell_stencil( neighborhood_radius, cell_size_ratio, grid_min,
418 std::size_t np =
size( positions );
420 build( positions, 0, np );
441 template <
class PositionType>
443 PositionType positions,
const std::size_t begin,
const std::size_t end,
446 const Scalar grid_max[
num_space_dim],
const Scalar neighborhood_radius,
447 const Scalar cell_size_ratio = 1,
449 Kokkos::is_view<PositionType>::value ),
453 , _grid( grid_min, grid_max, grid_delta )
454 , _cell_stencil( neighborhood_radius, cell_size_ratio, grid_min,
459 build( positions, begin, end );
463 KOKKOS_INLINE_FUNCTION
467 KOKKOS_INLINE_FUNCTION
471 KOKKOS_INLINE_FUNCTION
478 KOKKOS_INLINE_FUNCTION
486 KOKKOS_INLINE_FUNCTION
487 int numBin(
const int dim )
const {
return _grid.numBin( dim ); }
499 template <std::
size_t NSD = num_space_dim>
500 KOKKOS_INLINE_FUNCTION std::enable_if_t<3 == NSD, size_type>
503 return _grid.cardinalCellIndex( i, j, k );
514 KOKKOS_INLINE_FUNCTION
518 return _grid.cardinalCellIndex( ijk );
531 KOKKOS_INLINE_FUNCTION
532 void ijkBinIndex(
const int cardinal,
int& i,
int& j,
int& k )
const
534 _grid.ijkBinIndex( cardinal, i, j, k );
545 KOKKOS_INLINE_FUNCTION
547 Kokkos::Array<int, num_space_dim>& ijk )
const
549 _grid.ijkBinIndex( cardinal, ijk );
557 KOKKOS_INLINE_FUNCTION
558 int binSize(
const Kokkos::Array<int, num_space_dim> ijk )
const
570 KOKKOS_INLINE_FUNCTION
571 int binSize(
const int i,
const int j,
const int k )
const
583 KOKKOS_INLINE_FUNCTION
594 KOKKOS_INLINE_FUNCTION
606 KOKKOS_INLINE_FUNCTION
609 return _bin_data.permutation( particle_id );
615 KOKKOS_INLINE_FUNCTION
616 std::size_t
rangeBegin()
const {
return _bin_data.rangeBegin(); }
621 KOKKOS_INLINE_FUNCTION
622 std::size_t
rangeEnd()
const {
return _bin_data.rangeEnd(); }
628 KOKKOS_INLINE_FUNCTION
651 template <
class ExecutionSpace,
class PositionType>
652 void build( ExecutionSpace, PositionType positions,
const std::size_t begin,
653 const std::size_t end )
655 Kokkos::Profiling::ScopedRegion region(
656 "Cabana::LinkedCellList::build" );
659 assert( end >= begin );
660 assert( end <=
size( positions ) );
665 if ( _counts.extent( 0 ) != ncell )
667 Kokkos::resize( _counts, ncell );
668 Kokkos::resize( _offsets, ncell );
670 std::size_t nparticles = end - begin;
671 if ( _permutes.extent( 0 ) != nparticles )
673 Kokkos::resize( _permutes, nparticles );
678 auto counts = _counts;
679 auto offsets = _offsets;
680 auto permutes = _permutes;
683 Kokkos::RangePolicy<ExecutionSpace> particle_range( begin, end );
684 Kokkos::deep_copy( _counts, 0 );
685 auto counts_sv = Kokkos::Experimental::create_scatter_view( _counts );
686 auto cell_count = KOKKOS_LAMBDA(
const std::size_t p )
688 Kokkos::Array<int, num_space_dim> ijk;
689 Kokkos::Array<Scalar, num_space_dim> pos;
691 pos[d] = positions( p, d );
692 grid.locatePoint( pos, ijk );
693 auto counts_data = counts_sv.access();
694 counts_data( grid.cardinalCellIndex( ijk ) ) += 1;
696 Kokkos::parallel_for(
"Cabana::LinkedCellList::build::cell_count",
697 particle_range, cell_count );
699 Kokkos::Experimental::contribute( _counts, counts_sv );
702 Kokkos::RangePolicy<ExecutionSpace> cell_range( 0, ncell );
703 auto offset_scan = KOKKOS_LAMBDA(
const std::size_t c,
int&
update,
704 const bool final_pass )
710 Kokkos::parallel_scan(
"Cabana::LinkedCellList::build::offset_scan",
711 cell_range, offset_scan );
715 Kokkos::deep_copy( _counts, 0 );
718 auto create_permute = KOKKOS_LAMBDA(
const std::size_t p )
720 Kokkos::Array<int, num_space_dim> ijk;
721 Kokkos::Array<Scalar, num_space_dim> pos;
723 pos[d] = positions( p, d );
724 grid.locatePoint( pos, ijk );
725 auto cell_id = grid.cardinalCellIndex( ijk );
726 int c = Kokkos::atomic_fetch_add( &counts( cell_id ), 1 );
727 permutes( offsets( cell_id ) + c ) = p;
729 Kokkos::parallel_for(
"Cabana::LinkedCellList::build::create_permute",
730 particle_range, create_permute );
754 template <
class PositionType>
755 void build( PositionType positions,
const std::size_t begin,
756 const std::size_t end )
769 template <
class PositionType>
770 void build( PositionType positions )
772 build( positions, 0,
size( positions ) );
780 Kokkos::parallel_for(
781 "Cabana::LinkedCellList::storeBinIndices",
782 Kokkos::RangePolicy<execution_space>( 0,
totalBins() ), *
this );
794 KOKKOS_INLINE_FUNCTION
797 assert( particle_index >=
static_cast<int>( _begin ) );
798 assert( particle_index <
static_cast<int>( _end ) );
799 return _particle_bins( particle_index - _begin );
808 Kokkos::Array<int, num_space_dim> bin_ijk;
812 for (
size_t p = offset; p < offset +
size; ++p )
816 _particle_bins( p ) = i;
834 KOKKOS_INLINE_FUNCTION
840 template <std::
size_t NSD = num_space_dim>
841 KOKKOS_INLINE_FUNCTION std::enable_if_t<3 == NSD, void>
843 int& kmin,
int& kmax )
const
845 _cell_stencil.getCells( cell, imin, imax, jmin, jmax, kmin, kmax );
851 KOKKOS_INLINE_FUNCTION
853 Kokkos::Array<int, num_space_dim>& min,
854 Kokkos::Array<int, num_space_dim>& max )
const
856 _cell_stencil.getCells( cell, min, max );
863 KOKKOS_INLINE_FUNCTION
880 Impl::CartesianGrid<Scalar, num_space_dim> _grid;
892 void allocate(
const int ncell,
const int nparticles )
895 Kokkos::view_alloc( Kokkos::WithoutInitializing,
"counts" ),
898 Kokkos::view_alloc( Kokkos::WithoutInitializing,
"offsets" ),
901 Kokkos::view_alloc( Kokkos::WithoutInitializing,
"permutes" ),
906 Kokkos::view_alloc( Kokkos::WithoutInitializing,
"counts" ),
915template <
class PositionType,
916 template <
class, std::size_t,
class...>
class ArrayType,
917 class... Args,
class Scalar, std::size_t NumSpaceDim>
919 PositionType positions,
920#ifdef KOKKOS_ENABLE_DEPRECATED_CODE_4
921 const ArrayType<Scalar, NumSpaceDim, Args...> grid_delta,
922 const ArrayType<Scalar, NumSpaceDim, Args...> grid_min,
923 const ArrayType<Scalar, NumSpaceDim, Args...> grid_max
925 const ArrayType<Scalar, NumSpaceDim> grid_delta,
926 const ArrayType<Scalar, NumSpaceDim> grid_min,
927 const ArrayType<Scalar, NumSpaceDim> grid_max
931 using memory_space =
typename PositionType::memory_space;
932 using scalar_type =
typename PositionType::value_type;
934 positions, grid_delta, grid_min, grid_max );
941template <
class PositionType,
942 template <
class, std::size_t,
class...>
class ArrayType,
943 class... Args,
class Scalar, std::size_t NumSpaceDim>
945 PositionType positions,
const std::size_t begin,
const std::size_t end,
946#ifdef KOKKOS_ENABLE_DEPRECATED_CODE_4
947 const ArrayType<Scalar, NumSpaceDim, Args...> grid_delta,
948 const ArrayType<Scalar, NumSpaceDim, Args...> grid_min,
949 const ArrayType<Scalar, NumSpaceDim, Args...> grid_max
951 const ArrayType<Scalar, NumSpaceDim> grid_delta,
952 const ArrayType<Scalar, NumSpaceDim> grid_min,
953 const ArrayType<Scalar, NumSpaceDim> grid_max
957 using memory_space =
typename PositionType::memory_space;
958 using scalar_type =
typename PositionType::value_type;
960 positions, begin, end, grid_delta, grid_min, grid_max );
968template <
class PositionType,
969 template <
class, std::size_t,
class...>
class ArrayType,
970 class... Args,
class Scalar, std::size_t NumSpaceDim>
972 PositionType positions,
973#ifdef KOKKOS_ENABLE_DEPRECATED_CODE_4
974 const ArrayType<Scalar, NumSpaceDim, Args...> grid_delta,
975 const ArrayType<Scalar, NumSpaceDim, Args...> grid_min,
976 const ArrayType<Scalar, NumSpaceDim, Args...> grid_max,
978 const ArrayType<Scalar, NumSpaceDim> grid_delta,
979 const ArrayType<Scalar, NumSpaceDim> grid_min,
980 const ArrayType<Scalar, NumSpaceDim> grid_max,
982 const typename PositionType::value_type neighborhood_radius,
983 const typename PositionType::value_type cell_size_ratio = 1.0 )
985 using memory_space =
typename PositionType::memory_space;
986 using scalar_type =
typename PositionType::value_type;
988 positions, grid_delta, grid_min, grid_max, neighborhood_radius,
997template <
class PositionType,
998 template <
class, std::size_t,
class...>
class ArrayType,
999 class... Args,
class Scalar, std::size_t NumSpaceDim>
1001 PositionType positions,
const std::size_t begin,
const std::size_t end,
1002#ifdef KOKKOS_ENABLE_DEPRECATED_CODE_4
1003 const ArrayType<Scalar, NumSpaceDim, Args...> grid_delta,
1004 const ArrayType<Scalar, NumSpaceDim, Args...> grid_min,
1005 const ArrayType<Scalar, NumSpaceDim, Args...> grid_max,
1007 const ArrayType<Scalar, NumSpaceDim> grid_delta,
1008 const ArrayType<Scalar, NumSpaceDim> grid_min,
1009 const ArrayType<Scalar, NumSpaceDim> grid_max,
1011 const typename PositionType::value_type neighborhood_radius,
1012 const typename PositionType::value_type cell_size_ratio = 1.0 )
1014 using memory_space =
typename PositionType::memory_space;
1015 using scalar_type =
typename PositionType::value_type;
1017 positions, begin, end, grid_delta, grid_min, grid_max,
1018 neighborhood_radius, cell_size_ratio );
1025template <
class PositionType>
1027 PositionType positions,
1028 const typename PositionType::value_type grid_delta[3],
1029 const typename PositionType::value_type grid_min[3],
1030 const typename PositionType::value_type grid_max[3] )
1032 using memory_space =
typename PositionType::memory_space;
1033 using scalar_type =
typename PositionType::value_type;
1035 grid_min, grid_max );
1042template <
class PositionType>
1044 PositionType positions,
const std::size_t begin,
const std::size_t end,
1045 const typename PositionType::value_type grid_delta[3],
1046 const typename PositionType::value_type grid_min[3],
1047 const typename PositionType::value_type grid_max[3] )
1049 using memory_space =
typename PositionType::memory_space;
1050 using scalar_type =
typename PositionType::value_type;
1052 positions, begin, end, grid_delta, grid_min, grid_max );
1060template <
class PositionType>
1062 PositionType positions,
1063 const typename PositionType::value_type grid_delta[3],
1064 const typename PositionType::value_type grid_min[3],
1065 const typename PositionType::value_type grid_max[3],
1066 const typename PositionType::value_type neighborhood_radius,
1067 const typename PositionType::value_type cell_size_ratio = 1.0 )
1069 using memory_space =
typename PositionType::memory_space;
1070 using scalar_type =
typename PositionType::value_type;
1072 positions, grid_delta, grid_min, grid_max, neighborhood_radius,
1081template <
class PositionType>
1083 PositionType positions,
const std::size_t begin,
const std::size_t end,
1084 const typename PositionType::value_type grid_delta[3],
1085 const typename PositionType::value_type grid_min[3],
1086 const typename PositionType::value_type grid_max[3],
1087 const typename PositionType::value_type neighborhood_radius,
1088 const typename PositionType::value_type cell_size_ratio = 1.0 )
1090 using memory_space =
typename PositionType::memory_space;
1091 using scalar_type =
typename PositionType::value_type;
1093 positions, begin, end, grid_delta, grid_min, grid_max,
1094 neighborhood_radius, cell_size_ratio );
1100struct is_linked_cell_list_impl :
public std::false_type
1104template <
typename MemorySpace,
typename Scalar, std::
size_t Dim>
1105struct is_linked_cell_list_impl<
LinkedCellList<MemorySpace, Scalar, Dim>>
1106 :
public std::true_type
1114 :
public is_linked_cell_list_impl<typename std::remove_cv<T>::type>::type
1130template <
class LinkedCellListType,
class PositionType>
1132 LinkedCellListType& linked_cell_list, PositionType& positions,
1136 Kokkos::is_view<PositionType>::value ) ),
1139 permute( linked_cell_list.binningData(), positions );
1142 linked_cell_list.update(
true );
1144 linked_cell_list.storeParticleBins();
1149template <
class MemorySpace,
typename Scalar, std::
size_t NumSpaceDim>
1161 KOKKOS_INLINE_FUNCTION
static std::size_t
1164 std::size_t total_n = 0;
1173 KOKKOS_INLINE_FUNCTION
1176 std::size_t max_n = 0;
1186 template <std::
size_t NSD = num_space_dim>
1187 KOKKOS_INLINE_FUNCTION
static std::enable_if_t<3 == NSD, std::size_t>
1190 int total_count = 0;
1191 Kokkos::Array<int, 3> min;
1192 Kokkos::Array<int, 3> max;
1195 Kokkos::Array<int, 3> ijk;
1196 for (
int i = min[0]; i < max[0]; ++i )
1197 for (
int j = min[1]; j < max[1]; ++j )
1198 for (
int k = min[2]; k < max[2]; ++k )
1201 total_count += list.
binSize( ijk );
1208 template <std::
size_t NSD = num_space_dim>
1209 KOKKOS_INLINE_FUNCTION
static std::enable_if_t<2 == NSD, std::size_t>
1212 int total_count = 0;
1213 Kokkos::Array<int, 2> min;
1214 Kokkos::Array<int, 2> max;
1217 Kokkos::Array<int, 2> ij;
1218 for (
int i = min[0]; i < max[0]; ++i )
1219 for (
int j = min[1]; j < max[1]; ++j )
1222 total_count += list.
binSize( ij );
1230 template <std::
size_t NSD = num_space_dim>
1231 KOKKOS_INLINE_FUNCTION
static std::enable_if_t<3 == NSD, std::size_t>
1233 const std::size_t neighbor_index )
1235 std::size_t total_count = 0;
1236 std::size_t previous_count = 0;
1237 Kokkos::Array<int, 3> min;
1238 Kokkos::Array<int, 3> max;
1241 Kokkos::Array<int, 3> ijk;
1242 for (
int i = min[0]; i < max[0]; ++i )
1243 for (
int j = min[1]; j < max[1]; ++j )
1244 for (
int k = min[2]; k < max[2]; ++k )
1248 total_count += list.
binSize( ijk );
1250 if ( total_count > neighbor_index )
1252 int particle_id = list.
binOffset( ijk ) +
1253 ( neighbor_index - previous_count );
1257 previous_count = total_count;
1268 template <std::
size_t NSD = num_space_dim>
1269 KOKKOS_INLINE_FUNCTION
static std::enable_if_t<2 == NSD, std::size_t>
1271 const std::size_t neighbor_index )
1273 std::size_t total_count = 0;
1274 std::size_t previous_count = 0;
1275 Kokkos::Array<int, 2> min;
1276 Kokkos::Array<int, 2> max;
1280 Kokkos::Array<int, 2> ij;
1281 for (
int i = min[0]; i < max[0]; ++i )
1282 for (
int j = min[1]; j < max[1]; ++j )
1286 total_count += list.
binSize( ij );
1288 if ( total_count > neighbor_index )
1290 int particle_id = list.
binOffset( ij ) +
1291 ( neighbor_index - previous_count );
1295 previous_count = total_count;
Slice a single particle property from an AoSoA.
Sorting and binning built on Kokkos BinSort.
Data describing the bin sizes and offsets resulting from a binning operation.
Definition Cabana_Sort.hpp:39
Data describing the bin sizes and offsets resulting from a binning operation on a 3d regular Cartesia...
Definition Cabana_LinkedCellList.hpp:130
LinkedCellStencil< Scalar, NumSpaceDim > stencil_type
Stencil type.
Definition Cabana_LinkedCellList.hpp:146
KOKKOS_INLINE_FUNCTION int binSize(const int i, const int j, const int k) const
Given a bin get the number of particles it contains.
Definition Cabana_LinkedCellList.hpp:571
KOKKOS_INLINE_FUNCTION int totalBins() const
Get the total number of bins.
Definition Cabana_LinkedCellList.hpp:479
KOKKOS_INLINE_FUNCTION size_type permutation(const int particle_id) const
Given a local particle id in the binned layout, get the id of the particle in the old (unbinned) layo...
Definition Cabana_LinkedCellList.hpp:607
KOKKOS_INLINE_FUNCTION stencil_type cellStencil() const
Get the linked cell stencil.
Definition Cabana_LinkedCellList.hpp:629
Kokkos::View< size_type *, memory_space > OffsetView
Offset view type.
Definition Cabana_LinkedCellList.hpp:144
KOKKOS_INLINE_FUNCTION size_type cardinalBinIndex(const Kokkos::Array< int, num_space_dim > &ijk) const
Given the ijk index of a bin get its cardinal index.
Definition Cabana_LinkedCellList.hpp:516
KOKKOS_INLINE_FUNCTION std::size_t getParticleEnd() const
End of binned range.
Definition Cabana_LinkedCellList.hpp:472
KOKKOS_INLINE_FUNCTION auto getParticle(const int offset) const
Get a candidate neighbor particle at a given binned offset.
Definition Cabana_LinkedCellList.hpp:864
LinkedCellList(PositionType positions, const Scalar grid_delta[num_space_dim], const Scalar grid_min[num_space_dim], const Scalar grid_max[num_space_dim], typename std::enable_if<(is_slice< PositionType >::value||Kokkos::is_view< PositionType >::value), int >::type *=0)
Simple constructor.
Definition Cabana_LinkedCellList.hpp:337
KOKKOS_INLINE_FUNCTION size_type binOffset(const int i, const int j, const int k) const
Given a bin get the particle index at which it sorts.
Definition Cabana_LinkedCellList.hpp:584
KOKKOS_FUNCTION void operator()(const int i) const
Determines which particles belong to bin i.
Definition Cabana_LinkedCellList.hpp:806
KOKKOS_INLINE_FUNCTION std::size_t rangeBegin() const
The beginning particle index binned by the linked cell list.
Definition Cabana_LinkedCellList.hpp:616
LinkedCellList(PositionType positions, const ArrayType< Scalar, num_space_dim > grid_delta, const ArrayType< Scalar, num_space_dim > grid_min, const ArrayType< Scalar, num_space_dim > grid_max, const Scalar neighborhood_radius, const Scalar cell_size_ratio=1, typename std::enable_if<(is_slice< PositionType >::value||Kokkos::is_view< PositionType >::value), int >::type *=0)
Explicit stencil constructor.
Definition Cabana_LinkedCellList.hpp:252
LinkedCellList(PositionType positions, const std::size_t begin, const std::size_t end, const ArrayType< Scalar, num_space_dim > grid_delta, const ArrayType< Scalar, num_space_dim > grid_min, const ArrayType< Scalar, num_space_dim > grid_max, const Scalar neighborhood_radius, const Scalar cell_size_ratio=1, typename std::enable_if<(is_slice< PositionType >::value||Kokkos::is_view< PositionType >::value), int >::type *=0)
Explicit stencil and partial range constructor.
Definition Cabana_LinkedCellList.hpp:300
void build(ExecutionSpace, PositionType positions, const std::size_t begin, const std::size_t end)
Build the linked cell list with a subset of particles.
Definition Cabana_LinkedCellList.hpp:652
Kokkos::View< int *, memory_space > CountView
Binning view type.
Definition Cabana_LinkedCellList.hpp:142
typename memory_space::size_type size_type
Memory space size type.
Definition Cabana_LinkedCellList.hpp:139
void build(PositionType positions, const std::size_t begin, const std::size_t end)
Build the linked cell list with a subset of particles.
Definition Cabana_LinkedCellList.hpp:755
void storeParticleBins()
Store the bin cell index for each binned particle.
Definition Cabana_LinkedCellList.hpp:778
void build(PositionType positions)
Build the linked cell list with all particles.
Definition Cabana_LinkedCellList.hpp:770
KOKKOS_INLINE_FUNCTION std::enable_if_t< 3==NSD, void > getStencilCells(const int cell, int &imin, int &imax, int &jmin, int &jmax, int &kmin, int &kmax) const
Get the cell indices for the stencil about cell.
Definition Cabana_LinkedCellList.hpp:842
KOKKOS_INLINE_FUNCTION auto sorted() const
Definition Cabana_LinkedCellList.hpp:835
KOKKOS_INLINE_FUNCTION std::size_t rangeEnd() const
The ending particle index binned by the linked cell list.
Definition Cabana_LinkedCellList.hpp:622
KOKKOS_INLINE_FUNCTION size_type binOffset(const Kokkos::Array< int, num_space_dim > ijk) const
Given a bin get the particle index at which it sorts.
Definition Cabana_LinkedCellList.hpp:595
KOKKOS_INLINE_FUNCTION std::size_t getParticleBegin() const
Beginning of binned range.
Definition Cabana_LinkedCellList.hpp:468
MemorySpace memory_space
Kokkos memory space.
Definition Cabana_LinkedCellList.hpp:133
static constexpr std::size_t num_space_dim
Definition Cabana_LinkedCellList.hpp:149
typename memory_space::execution_space execution_space
Default execution space.
Definition Cabana_LinkedCellList.hpp:137
KOKKOS_INLINE_FUNCTION void ijkBinIndex(const int cardinal, Kokkos::Array< int, num_space_dim > &ijk) const
Given the cardinal index of a bin get its ijk indices.
Definition Cabana_LinkedCellList.hpp:546
LinkedCellList(PositionType positions, const std::size_t begin, const std::size_t end, const ArrayType< Scalar, num_space_dim > grid_delta, const ArrayType< Scalar, num_space_dim > grid_min, const ArrayType< Scalar, num_space_dim > grid_max, typename std::enable_if<(is_slice< PositionType >::value||Kokkos::is_view< PositionType >::value), int >::type *=0)
Partial range constructor.
Definition Cabana_LinkedCellList.hpp:213
LinkedCellList(PositionType positions, const std::size_t begin, const std::size_t end, const Scalar grid_delta[num_space_dim], const Scalar grid_min[num_space_dim], const Scalar grid_max[num_space_dim], const Scalar neighborhood_radius, const Scalar cell_size_ratio=1, typename std::enable_if<(is_slice< PositionType >::value||Kokkos::is_view< PositionType >::value), int >::type *=0)
Explicit stencil and partial range constructor.
Definition Cabana_LinkedCellList.hpp:442
KOKKOS_INLINE_FUNCTION int numParticles() const
Number of binned particles.
Definition Cabana_LinkedCellList.hpp:464
LinkedCellList(PositionType positions, const Scalar grid_delta[num_space_dim], const Scalar grid_min[num_space_dim], const Scalar grid_max[num_space_dim], const Scalar neighborhood_radius, const Scalar cell_size_ratio=1, typename std::enable_if<(is_slice< PositionType >::value||Kokkos::is_view< PositionType >::value), int >::type *=0)
Explicit stencil constructor.
Definition Cabana_LinkedCellList.hpp:403
auto getParticleBins() const
Get the bin cell index for each binned particle.
Definition Cabana_LinkedCellList.hpp:789
KOKKOS_INLINE_FUNCTION int binSize(const Kokkos::Array< int, num_space_dim > ijk) const
Given a bin get the number of particles it contains.
Definition Cabana_LinkedCellList.hpp:558
LinkedCellList(PositionType positions, const std::size_t begin, const std::size_t end, const Scalar grid_delta[num_space_dim], const Scalar grid_min[num_space_dim], const Scalar grid_max[num_space_dim], typename std::enable_if<(is_slice< PositionType >::value||Kokkos::is_view< PositionType >::value), int >::type *=0)
Partial range constructor.
Definition Cabana_LinkedCellList.hpp:372
void update(const bool sorted)
Definition Cabana_LinkedCellList.hpp:829
BinningData< MemorySpace > binningData() const
Get the 1d bin data.
Definition Cabana_LinkedCellList.hpp:635
LinkedCellList()=default
Default constructor.
KOKKOS_INLINE_FUNCTION void ijkBinIndex(const int cardinal, int &i, int &j, int &k) const
Given the cardinal index of a bin get its ijk indices.
Definition Cabana_LinkedCellList.hpp:532
LinkedCellList(PositionType positions, const ArrayType< Scalar, num_space_dim > grid_delta, const ArrayType< Scalar, num_space_dim > grid_min, const ArrayType< Scalar, num_space_dim > grid_max, typename std::enable_if<(is_slice< PositionType >::value||Kokkos::is_view< PositionType >::value), int >::type *=0)
Simple constructor.
Definition Cabana_LinkedCellList.hpp:169
KOKKOS_INLINE_FUNCTION void getStencilCells(const int cell, Kokkos::Array< int, num_space_dim > &min, Kokkos::Array< int, num_space_dim > &max) const
Get the cell indices for the stencil about cell.
Definition Cabana_LinkedCellList.hpp:852
KOKKOS_INLINE_FUNCTION auto getParticleBin(const int particle_index) const
Get the bin cell index of the input particle.
Definition Cabana_LinkedCellList.hpp:795
KOKKOS_INLINE_FUNCTION int numBin(const int dim) const
Get the number of bins in a given dimension.
Definition Cabana_LinkedCellList.hpp:487
KOKKOS_INLINE_FUNCTION std::enable_if_t< 3==NSD, size_type > cardinalBinIndex(const int i, const int j, const int k) const
Given the ijk index of a bin get its cardinal index.
Definition Cabana_LinkedCellList.hpp:501
static KOKKOS_INLINE_FUNCTION std::enable_if_t< 2==NSD, std::size_t > getNeighbor(const list_type &list, const std::size_t particle_index, const std::size_t neighbor_index)
Definition Cabana_LinkedCellList.hpp:1270
static KOKKOS_INLINE_FUNCTION std::enable_if_t< 2==NSD, 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_LinkedCellList.hpp:1210
static KOKKOS_INLINE_FUNCTION std::size_t totalNeighbor(const list_type &list)
Get the total number of neighbors across all particles.
Definition Cabana_LinkedCellList.hpp:1162
static constexpr std::size_t num_space_dim
Spatial dimension.
Definition Cabana_LinkedCellList.hpp:1158
MemorySpace memory_space
Kokkos memory space.
Definition Cabana_LinkedCellList.hpp:1154
static KOKKOS_INLINE_FUNCTION std::enable_if_t< 3==NSD, 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_LinkedCellList.hpp:1188
LinkedCellList< MemorySpace, Scalar, NumSpaceDim > list_type
Neighbor list type.
Definition Cabana_LinkedCellList.hpp:1156
static KOKKOS_INLINE_FUNCTION std::enable_if_t< 3==NSD, std::size_t > getNeighbor(const list_type &list, const std::size_t particle_index, const std::size_t neighbor_index)
Definition Cabana_LinkedCellList.hpp:1232
static KOKKOS_INLINE_FUNCTION std::size_t maxNeighbor(const list_type &list)
Get the maximum number of neighbors per particles.
Definition Cabana_LinkedCellList.hpp:1174
Neighbor list interface. Provides an interface callable at the functor level that gives access to nei...
Definition Cabana_NeighborList.hpp:223
static KOKKOS_INLINE_FUNCTION std::size_t numNeighbor(const NeighborListType &list, const std::size_t particle_index)
Get the number of neighbors for a given particle index.
static KOKKOS_INLINE_FUNCTION std::size_t totalNeighbor(const NeighborListType &list)
Get the total number of neighbors across all particles.
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
void permute(LinkedCellListType &linked_cell_list, PositionType &positions, typename std::enable_if<(is_linked_cell_list< LinkedCellListType >::value &&(is_aosoa< PositionType >::value||is_slice< PositionType >::value||Kokkos::is_view< PositionType >::value)), int >::type *=0)
Given a linked cell list permute positions.
Definition Cabana_LinkedCellList.hpp:1131
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
Stencil of cells surrounding each cell.
Definition Cabana_LinkedCellList.hpp:38
int max_cells
Definition Cabana_LinkedCellList.hpp:47
LinkedCellStencil(const Scalar neighborhood_radius, const Scalar cell_size_ratio, const ArrayType &grid_min, const ArrayType &grid_max)
Array Constructor.
Definition Cabana_LinkedCellList.hpp:56
LinkedCellStencil(const Scalar neighborhood_radius, const Scalar cell_size_ratio, const Scalar grid_min[num_space_dim], const Scalar grid_max[num_space_dim])
Constructor.
Definition Cabana_LinkedCellList.hpp:69
int max_cells_dir
Definition Cabana_LinkedCellList.hpp:45
static constexpr std::size_t num_space_dim
Definition Cabana_LinkedCellList.hpp:40
KOKKOS_INLINE_FUNCTION std::enable_if_t< 3==NSD, void > getCells(const int cell, int &imin, int &imax, int &jmin, int &jmax, int &kmin, int &kmax) const
Given a cell, get the index bounds of the cell stencil.
Definition Cabana_LinkedCellList.hpp:85
KOKKOS_INLINE_FUNCTION void getCells(const int cell, Kokkos::Array< int, num_space_dim > &min, Kokkos::Array< int, num_space_dim > &max) const
Given a cell, get the index bounds of the cell stencil.
Definition Cabana_LinkedCellList.hpp:106
LinkedCellStencil()=default
Default Constructor.
Impl::CartesianGrid< Scalar, num_space_dim > grid
Definition Cabana_LinkedCellList.hpp:43
int cell_range
Definition Cabana_LinkedCellList.hpp:49
Definition Cabana_Types.hpp:88
AoSoA static type checker.
Definition Cabana_AoSoA.hpp:61
LinkedCellList static type checker.
Definition Cabana_LinkedCellList.hpp:1115
Slice static type checker.
Definition Cabana_Slice.hpp:868