Cabana 0.8.0-dev
 
Loading...
Searching...
No Matches
Cabana_LinkedCellList.hpp
Go to the documentation of this file.
1/****************************************************************************
2 * Copyright (c) 2018-2023 by the Cabana authors *
3 * All rights reserved. *
4 * *
5 * This file is part of the Cabana library. Cabana is distributed under a *
6 * BSD 3-clause license. For the licensing terms see the LICENSE file in *
7 * the top-level directory. *
8 * *
9 * SPDX-License-Identifier: BSD-3-Clause *
10 ****************************************************************************/
11
16#ifndef CABANA_LINKEDCELLLIST_HPP
17#define CABANA_LINKEDCELLLIST_HPP
18
20#include <Cabana_Slice.hpp>
21#include <Cabana_Sort.hpp>
22#include <Cabana_Utils.hpp>
23#include <impl/Cabana_CartesianGrid.hpp>
24
25#include <Kokkos_Core.hpp>
26#include <Kokkos_Profiling_ScopedRegion.hpp>
27#include <Kokkos_ScatterView.hpp>
28
29#include <cassert>
30
31namespace Cabana
32{
33//---------------------------------------------------------------------------//
35
36template <class Scalar, std::size_t NumSpaceDim = 3>
38{
40 static constexpr std::size_t num_space_dim = NumSpaceDim;
41
43 Impl::CartesianGrid<Scalar, num_space_dim> grid;
50
52 LinkedCellStencil() = default;
53
55 template <class ArrayType>
56 LinkedCellStencil( const Scalar neighborhood_radius,
57 const Scalar cell_size_ratio, const ArrayType& grid_min,
58 const ArrayType& grid_max )
59 {
60 Scalar dx = neighborhood_radius * cell_size_ratio;
61 grid = Impl::CartesianGrid<Scalar, num_space_dim>( grid_min, grid_max,
62 dx );
63 cell_range = std::ceil( 1 / cell_size_ratio );
64 max_cells_dir = 2 * cell_range + 1;
66 }
67
69 LinkedCellStencil( const Scalar neighborhood_radius,
70 const Scalar cell_size_ratio,
71 const Scalar grid_min[num_space_dim],
72 const Scalar grid_max[num_space_dim] )
73 {
74 Scalar dx = neighborhood_radius * cell_size_ratio;
75 grid = Impl::CartesianGrid<Scalar, num_space_dim>( grid_min, grid_max,
76 dx );
77 cell_range = std::ceil( 1 / cell_size_ratio );
78 max_cells_dir = 2 * cell_range + 1;
80 }
81
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
87 {
88 int i, j, k;
89 grid.ijkBinIndex( cell, i, j, k );
90
91 kmin = ( k - cell_range > 0 ) ? k - cell_range : 0;
92 kmax = ( k + cell_range + 1 < grid._nx[2] ) ? k + cell_range + 1
93 : grid._nx[2];
94
95 jmin = ( j - cell_range > 0 ) ? j - cell_range : 0;
96 jmax = ( j + cell_range + 1 < grid._nx[1] ) ? j + cell_range + 1
97 : grid._nx[1];
98
99 imin = ( i - cell_range > 0 ) ? i - cell_range : 0;
100 imax = ( i + cell_range + 1 < grid._nx[0] ) ? i + cell_range + 1
101 : grid._nx[0];
102 }
103
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
108 {
109 Kokkos::Array<int, num_space_dim> ijk;
110 grid.ijkBinIndex( cell, ijk );
111
112 for ( std::size_t d = 0; d < num_space_dim; ++d )
113 {
114 min[d] = ( ijk[d] - cell_range > 0 ) ? ijk[d] - cell_range : 0;
115 max[d] = ( ijk[d] + cell_range + 1 < grid._nx[d] )
116 ? ijk[d] + cell_range + 1
117 : grid._nx[d];
118 }
119 }
120};
121
122//---------------------------------------------------------------------------//
128template <class MemorySpace, class Scalar = double, std::size_t NumSpaceDim = 3>
130{
131 public:
133 using memory_space = MemorySpace;
134 static_assert( Kokkos::is_memory_space<MemorySpace>() );
135
137 using execution_space = typename memory_space::execution_space;
139 using size_type = typename memory_space::size_type;
140
142 using CountView = Kokkos::View<int*, memory_space>;
144 using OffsetView = Kokkos::View<size_type*, memory_space>;
147
149 static constexpr std::size_t num_space_dim = NumSpaceDim;
150
154 LinkedCellList() = default;
155
166 template <class PositionType,
167 template <class, std::size_t, class...> class ArrayType,
168 class... Args>
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,
175#else
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,
179#endif
180 typename std::enable_if<( is_slice<PositionType>::value ||
181 Kokkos::is_view<PositionType>::value ),
182 int>::type* = 0 )
183 : _begin( 0 )
184 , _end( size( positions ) )
185 , _grid( grid_min, grid_max, grid_delta )
186 , _cell_stencil( grid_delta[0], 1.0, grid_min, grid_max )
187 , _sorted( false )
188 {
189 std::size_t np = size( positions );
190 allocate( totalBins(), np );
191 build( positions, 0, np );
192 }
193
210 template <class PositionType,
211 template <class, std::size_t, class...> class ArrayType,
212 class... Args>
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,
219#else
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,
223#endif
224 typename std::enable_if<( is_slice<PositionType>::value ||
225 Kokkos::is_view<PositionType>::value ),
226 int>::type* = 0 )
227 : _begin( begin )
228 , _end( end )
229 , _grid( grid_min, grid_max, grid_delta )
230 , _cell_stencil( grid_delta[0], 1.0, grid_min, grid_max )
231 , _sorted( false )
232 {
233 allocate( totalBins(), end - begin );
234 build( positions, begin, end );
235 }
236
249 template <class PositionType,
250 template <class, std::size_t, class...> class ArrayType,
251 class... Args>
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,
258#else
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,
262#endif
263 const Scalar neighborhood_radius, const Scalar cell_size_ratio = 1,
264 typename std::enable_if<( is_slice<PositionType>::value ||
265 Kokkos::is_view<PositionType>::value ),
266 int>::type* = 0 )
267 : _begin( 0 )
268 , _end( size( positions ) )
269 , _grid( grid_min, grid_max, grid_delta )
270 , _cell_stencil( neighborhood_radius, cell_size_ratio, grid_min,
271 grid_max )
272 , _sorted( false )
273 {
274 std::size_t np = size( positions );
275 allocate( totalBins(), np );
276 build( positions, 0, np );
277 }
278
297 template <class PositionType,
298 template <class, std::size_t, class...> class ArrayType,
299 class... Args>
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,
306#else
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,
310#endif
311 const Scalar neighborhood_radius, const Scalar cell_size_ratio = 1,
312 typename std::enable_if<( is_slice<PositionType>::value ||
313 Kokkos::is_view<PositionType>::value ),
314 int>::type* = 0 )
315 : _begin( begin )
316 , _end( end )
317 , _grid( grid_min, grid_max, grid_delta )
318 , _cell_stencil( neighborhood_radius, cell_size_ratio, grid_min,
319 grid_max )
320 , _sorted( false )
321 {
322 allocate( totalBins(), end - begin );
323 build( positions, begin, end );
324 }
325
336 template <class PositionType>
338 PositionType positions, const Scalar grid_delta[num_space_dim],
339 const Scalar grid_min[num_space_dim],
340 const Scalar grid_max[num_space_dim],
341 typename std::enable_if<( is_slice<PositionType>::value ||
342 Kokkos::is_view<PositionType>::value ),
343 int>::type* = 0 )
344 : _begin( 0 )
345 , _end( size( positions ) )
346 , _grid( grid_min, grid_max, grid_delta )
347 , _cell_stencil( grid_delta[0], 1.0, grid_min, grid_max )
348 , _sorted( false )
349 {
350 std::size_t np = size( positions );
351 allocate( totalBins(), np );
352 build( positions, 0, np );
353 }
354
371 template <class PositionType>
373 PositionType positions, const std::size_t begin, const std::size_t end,
374 const Scalar grid_delta[num_space_dim],
375 const Scalar grid_min[num_space_dim],
376 const Scalar grid_max[num_space_dim],
377 typename std::enable_if<( is_slice<PositionType>::value ||
378 Kokkos::is_view<PositionType>::value ),
379 int>::type* = 0 )
380 : _begin( begin )
381 , _end( end )
382 , _grid( grid_min, grid_max, grid_delta )
383 , _cell_stencil( grid_delta[0], 1.0, grid_min, grid_max )
384 , _sorted( false )
385 {
386 allocate( totalBins(), end - begin );
387 build( positions, begin, end );
388 }
389
402 template <class PositionType>
404 PositionType positions, const Scalar grid_delta[num_space_dim],
405 const Scalar grid_min[num_space_dim],
406 const Scalar grid_max[num_space_dim], const Scalar neighborhood_radius,
407 const Scalar cell_size_ratio = 1,
408 typename std::enable_if<( is_slice<PositionType>::value ||
409 Kokkos::is_view<PositionType>::value ),
410 int>::type* = 0 )
411 : _begin( 0 )
412 , _end( size( positions ) )
413 , _grid( grid_min, grid_max, grid_delta )
414 , _cell_stencil( neighborhood_radius, cell_size_ratio, grid_min,
415 grid_max )
416 , _sorted( false )
417 {
418 std::size_t np = size( positions );
419 allocate( totalBins(), np );
420 build( positions, 0, np );
421 }
422
441 template <class PositionType>
443 PositionType positions, const std::size_t begin, const std::size_t end,
444 const Scalar grid_delta[num_space_dim],
445 const Scalar grid_min[num_space_dim],
446 const Scalar grid_max[num_space_dim], const Scalar neighborhood_radius,
447 const Scalar cell_size_ratio = 1,
448 typename std::enable_if<( is_slice<PositionType>::value ||
449 Kokkos::is_view<PositionType>::value ),
450 int>::type* = 0 )
451 : _begin( begin )
452 , _end( end )
453 , _grid( grid_min, grid_max, grid_delta )
454 , _cell_stencil( neighborhood_radius, cell_size_ratio, grid_min,
455 grid_max )
456 , _sorted( false )
457 {
458 allocate( totalBins(), end - begin );
459 build( positions, begin, end );
460 }
461
463 KOKKOS_INLINE_FUNCTION
464 int numParticles() const { return _permutes.extent( 0 ); }
465
467 KOKKOS_INLINE_FUNCTION
468 std::size_t getParticleBegin() const { return _begin; }
469
471 KOKKOS_INLINE_FUNCTION
472 std::size_t getParticleEnd() const { return _end; }
473
478 KOKKOS_INLINE_FUNCTION
479 int totalBins() const { return _grid.totalNumCells(); }
480
486 KOKKOS_INLINE_FUNCTION
487 int numBin( const int dim ) const { return _grid.numBin( dim ); }
488
499 template <std::size_t NSD = num_space_dim>
500 KOKKOS_INLINE_FUNCTION std::enable_if_t<3 == NSD, size_type>
501 cardinalBinIndex( const int i, const int j, const int k ) const
502 {
503 return _grid.cardinalCellIndex( i, j, k );
504 }
505
514 KOKKOS_INLINE_FUNCTION
516 cardinalBinIndex( const Kokkos::Array<int, num_space_dim>& ijk ) const
517 {
518 return _grid.cardinalCellIndex( ijk );
519 }
520
531 KOKKOS_INLINE_FUNCTION
532 void ijkBinIndex( const int cardinal, int& i, int& j, int& k ) const
533 {
534 _grid.ijkBinIndex( cardinal, i, j, k );
535 }
536
545 KOKKOS_INLINE_FUNCTION
546 void ijkBinIndex( const int cardinal,
547 Kokkos::Array<int, num_space_dim>& ijk ) const
548 {
549 _grid.ijkBinIndex( cardinal, ijk );
550 }
551
557 KOKKOS_INLINE_FUNCTION
558 int binSize( const Kokkos::Array<int, num_space_dim> ijk ) const
559 {
560 return _bin_data.binSize( cardinalBinIndex( ijk ) );
561 }
562
570 KOKKOS_INLINE_FUNCTION
571 int binSize( const int i, const int j, const int k ) const
572 {
573 return _bin_data.binSize( cardinalBinIndex( i, j, k ) );
574 }
575
583 KOKKOS_INLINE_FUNCTION
584 size_type binOffset( const int i, const int j, const int k ) const
585 {
586 return _bin_data.binOffset( cardinalBinIndex( i, j, k ) );
587 }
588
594 KOKKOS_INLINE_FUNCTION
595 size_type binOffset( const Kokkos::Array<int, num_space_dim> ijk ) const
596 {
597 return _bin_data.binOffset( cardinalBinIndex( ijk ) );
598 }
599
606 KOKKOS_INLINE_FUNCTION
607 size_type permutation( const int particle_id ) const
608 {
609 return _bin_data.permutation( particle_id );
610 }
611
615 KOKKOS_INLINE_FUNCTION
616 std::size_t rangeBegin() const { return _bin_data.rangeBegin(); }
617
621 KOKKOS_INLINE_FUNCTION
622 std::size_t rangeEnd() const { return _bin_data.rangeEnd(); }
623
628 KOKKOS_INLINE_FUNCTION
629 stencil_type cellStencil() const { return _cell_stencil; }
630
635 BinningData<MemorySpace> binningData() const { return _bin_data; }
636
651 template <class ExecutionSpace, class PositionType>
652 void build( ExecutionSpace, PositionType positions, const std::size_t begin,
653 const std::size_t end )
654 {
655 Kokkos::Profiling::ScopedRegion region(
656 "Cabana::LinkedCellList::build" );
657
659 assert( end >= begin );
660 assert( end <= size( positions ) );
661
662 // Resize the binning data. Note that the permutation vector spans
663 // only the length of begin-end;
664 std::size_t ncell = totalBins();
665 if ( _counts.extent( 0 ) != ncell )
666 {
667 Kokkos::resize( _counts, ncell );
668 Kokkos::resize( _offsets, ncell );
669 }
670 std::size_t nparticles = end - begin;
671 if ( _permutes.extent( 0 ) != nparticles )
672 {
673 Kokkos::resize( _permutes, nparticles );
674 }
675
676 // Get local copies of class data for lambda function capture.
677 auto grid = _grid;
678 auto counts = _counts;
679 auto offsets = _offsets;
680 auto permutes = _permutes;
681
682 // Count.
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 )
687 {
688 Kokkos::Array<int, num_space_dim> ijk;
689 Kokkos::Array<Scalar, num_space_dim> pos;
690 for ( std::size_t d = 0; d < num_space_dim; ++d )
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;
695 };
696 Kokkos::parallel_for( "Cabana::LinkedCellList::build::cell_count",
697 particle_range, cell_count );
698 Kokkos::fence();
699 Kokkos::Experimental::contribute( _counts, counts_sv );
700
701 // Compute offsets.
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 )
705 {
706 if ( final_pass )
707 offsets( c ) = update;
708 update += counts( c );
709 };
710 Kokkos::parallel_scan( "Cabana::LinkedCellList::build::offset_scan",
711 cell_range, offset_scan );
712 Kokkos::fence();
713
714 // Reset counts.
715 Kokkos::deep_copy( _counts, 0 );
716
717 // Compute the permutation vector.
718 auto create_permute = KOKKOS_LAMBDA( const std::size_t p )
719 {
720 Kokkos::Array<int, num_space_dim> ijk;
721 Kokkos::Array<Scalar, num_space_dim> pos;
722 for ( std::size_t d = 0; d < num_space_dim; ++d )
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;
728 };
729 Kokkos::parallel_for( "Cabana::LinkedCellList::build::create_permute",
730 particle_range, create_permute );
731 Kokkos::fence();
732
733 // Create the binning data.
734 _bin_data = BinningData<MemorySpace>( begin, end, _counts, _offsets,
735 _permutes );
736
737 // Store the bin per particle (for neighbor iteration).
739 }
740
754 template <class PositionType>
755 void build( PositionType positions, const std::size_t begin,
756 const std::size_t end )
757 {
758 // Use the default execution space.
759 build( execution_space{}, positions, begin, end );
760 }
761
769 template <class PositionType>
770 void build( PositionType positions )
771 {
772 build( positions, 0, size( positions ) );
773 }
774
779 {
780 Kokkos::parallel_for(
781 "Cabana::LinkedCellList::storeBinIndices",
782 Kokkos::RangePolicy<execution_space>( 0, totalBins() ), *this );
783 }
784
789 auto getParticleBins() const { return _particle_bins; }
790
794 KOKKOS_INLINE_FUNCTION
795 auto getParticleBin( const int particle_index ) const
796 {
797 assert( particle_index >= static_cast<int>( _begin ) );
798 assert( particle_index < static_cast<int>( _end ) );
799 return _particle_bins( particle_index - _begin );
800 }
801
806 KOKKOS_FUNCTION void operator()( const int i ) const
807 {
808 Kokkos::Array<int, num_space_dim> bin_ijk;
809 ijkBinIndex( i, bin_ijk );
810 auto offset = binOffset( bin_ijk );
811 auto size = binSize( bin_ijk );
812 for ( size_t p = offset; p < offset + size; ++p )
813 {
814 if ( _sorted )
815 {
816 _particle_bins( p ) = i;
817 }
818 else
819 {
820 _particle_bins( permutation( p ) - _begin ) = i;
821 }
822 }
823 }
824
829 void update( const bool sorted ) { _sorted = sorted; }
830
834 KOKKOS_INLINE_FUNCTION
835 auto sorted() const { return _sorted; }
836
840 template <std::size_t NSD = num_space_dim>
841 KOKKOS_INLINE_FUNCTION std::enable_if_t<3 == NSD, void>
842 getStencilCells( const int cell, int& imin, int& imax, int& jmin, int& jmax,
843 int& kmin, int& kmax ) const
844 {
845 _cell_stencil.getCells( cell, imin, imax, jmin, jmax, kmin, kmax );
846 }
847
851 KOKKOS_INLINE_FUNCTION
852 void getStencilCells( const int cell,
853 Kokkos::Array<int, num_space_dim>& min,
854 Kokkos::Array<int, num_space_dim>& max ) const
855 {
856 _cell_stencil.getCells( cell, min, max );
857 }
858
863 KOKKOS_INLINE_FUNCTION
864 auto getParticle( const int offset ) const
865 {
866 std::size_t j;
867 if ( !sorted() )
868 j = permutation( offset );
869 else
870 j = offset + getParticleBegin();
871 return j;
872 }
873
874 private:
875 std::size_t _begin;
876 std::size_t _end;
877
878 // Building the linked cell.
879 BinningData<MemorySpace> _bin_data;
880 Impl::CartesianGrid<Scalar, num_space_dim> _grid;
881
882 CountView _counts;
883 OffsetView _offsets;
884 OffsetView _permutes;
885
886 // Iterating over the linked cell.
887 stencil_type _cell_stencil;
888
889 bool _sorted;
890 CountView _particle_bins;
891
892 void allocate( const int ncell, const int nparticles )
893 {
894 _counts = CountView(
895 Kokkos::view_alloc( Kokkos::WithoutInitializing, "counts" ),
896 ncell );
897 _offsets = OffsetView(
898 Kokkos::view_alloc( Kokkos::WithoutInitializing, "offsets" ),
899 ncell );
900 _permutes = OffsetView(
901 Kokkos::view_alloc( Kokkos::WithoutInitializing, "permutes" ),
902 nparticles );
903 // This is only used for iterating over the particles (not building the
904 // permutaion vector).
905 _particle_bins = CountView(
906 Kokkos::view_alloc( Kokkos::WithoutInitializing, "counts" ),
907 nparticles );
908 }
909};
910
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
924#else
925 const ArrayType<Scalar, NumSpaceDim> grid_delta,
926 const ArrayType<Scalar, NumSpaceDim> grid_min,
927 const ArrayType<Scalar, NumSpaceDim> grid_max
928#endif
929)
930{
931 using memory_space = typename PositionType::memory_space;
932 using scalar_type = typename PositionType::value_type;
934 positions, grid_delta, grid_min, grid_max );
935}
936
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
950#else
951 const ArrayType<Scalar, NumSpaceDim> grid_delta,
952 const ArrayType<Scalar, NumSpaceDim> grid_min,
953 const ArrayType<Scalar, NumSpaceDim> grid_max
954#endif
955)
956{
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 );
961}
962
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,
977#else
978 const ArrayType<Scalar, NumSpaceDim> grid_delta,
979 const ArrayType<Scalar, NumSpaceDim> grid_min,
980 const ArrayType<Scalar, NumSpaceDim> grid_max,
981#endif
982 const typename PositionType::value_type neighborhood_radius,
983 const typename PositionType::value_type cell_size_ratio = 1.0 )
984{
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,
989 cell_size_ratio );
990}
991
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,
1006#else
1007 const ArrayType<Scalar, NumSpaceDim> grid_delta,
1008 const ArrayType<Scalar, NumSpaceDim> grid_min,
1009 const ArrayType<Scalar, NumSpaceDim> grid_max,
1010#endif
1011 const typename PositionType::value_type neighborhood_radius,
1012 const typename PositionType::value_type cell_size_ratio = 1.0 )
1013{
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 );
1019}
1020
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] )
1031{
1032 using memory_space = typename PositionType::memory_space;
1033 using scalar_type = typename PositionType::value_type;
1034 return LinkedCellList<memory_space, scalar_type, 3>( positions, grid_delta,
1035 grid_min, grid_max );
1036}
1037
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] )
1048{
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 );
1053}
1054
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 )
1068{
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,
1073 cell_size_ratio );
1074}
1075
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 )
1089{
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 );
1095}
1096
1097//---------------------------------------------------------------------------//
1099template <typename>
1100struct is_linked_cell_list_impl : public std::false_type
1101{
1102};
1103
1104template <typename MemorySpace, typename Scalar, std::size_t Dim>
1105struct is_linked_cell_list_impl<LinkedCellList<MemorySpace, Scalar, Dim>>
1106 : public std::true_type
1107{
1108};
1110
1112template <class T>
1114 : public is_linked_cell_list_impl<typename std::remove_cv<T>::type>::type
1115{
1116};
1117
1118//---------------------------------------------------------------------------//
1130template <class LinkedCellListType, class PositionType>
1132 LinkedCellListType& linked_cell_list, PositionType& positions,
1133 typename std::enable_if<( is_linked_cell_list<LinkedCellListType>::value &&
1136 Kokkos::is_view<PositionType>::value ) ),
1137 int>::type* = 0 )
1138{
1139 permute( linked_cell_list.binningData(), positions );
1140
1141 // Update internal state.
1142 linked_cell_list.update( true );
1143
1144 linked_cell_list.storeParticleBins();
1145}
1146
1147//---------------------------------------------------------------------------//
1149template <class MemorySpace, typename Scalar, std::size_t NumSpaceDim>
1150class NeighborList<LinkedCellList<MemorySpace, Scalar, NumSpaceDim>>
1151{
1152 public:
1154 using memory_space = MemorySpace;
1158 static constexpr std::size_t num_space_dim = NumSpaceDim;
1159
1161 KOKKOS_INLINE_FUNCTION static std::size_t
1163 {
1164 std::size_t total_n = 0;
1165 // Sum neighbors across all particles in range.
1166 for ( std::size_t p = list.getParticleBegin();
1167 p < list.getParticleEnd(); p++ )
1168 total_n += numNeighbor( list, p );
1169 return total_n;
1170 }
1171
1173 KOKKOS_INLINE_FUNCTION
1174 static std::size_t maxNeighbor( const list_type& list )
1175 {
1176 std::size_t max_n = 0;
1177 // Max neighbors across all particles in range.
1178 for ( std::size_t p = list.getParticleBegin();
1179 p < list.getParticleEnd(); p++ )
1180 if ( numNeighbor( list, p ) > max_n )
1181 max_n = numNeighbor( list, p );
1182 return max_n;
1183 }
1184
1186 template <std::size_t NSD = num_space_dim>
1187 KOKKOS_INLINE_FUNCTION static std::enable_if_t<3 == NSD, std::size_t>
1188 numNeighbor( const list_type& list, const std::size_t particle_index )
1189 {
1190 int total_count = 0;
1191 Kokkos::Array<int, 3> min;
1192 Kokkos::Array<int, 3> max;
1193 list.getStencilCells( list.getParticleBin( particle_index ), min, max );
1194
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 )
1199 {
1200 ijk = { i, j, k };
1201 total_count += list.binSize( ijk );
1202 }
1203
1204 return total_count;
1205 }
1206
1208 template <std::size_t NSD = num_space_dim>
1209 KOKKOS_INLINE_FUNCTION static std::enable_if_t<2 == NSD, std::size_t>
1210 numNeighbor( const list_type& list, const std::size_t particle_index )
1211 {
1212 int total_count = 0;
1213 Kokkos::Array<int, 2> min;
1214 Kokkos::Array<int, 2> max;
1215 list.getStencilCells( list.getParticleBin( particle_index ), min, max );
1216
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 )
1220 {
1221 ij = { i, j };
1222 total_count += list.binSize( ij );
1223 }
1224
1225 return total_count;
1226 }
1227
1230 template <std::size_t NSD = num_space_dim>
1231 KOKKOS_INLINE_FUNCTION static std::enable_if_t<3 == NSD, std::size_t>
1232 getNeighbor( const list_type& list, const std::size_t particle_index,
1233 const std::size_t neighbor_index )
1234 {
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;
1239 list.getStencilCells( list.getParticleBin( particle_index ), min, max );
1240
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 )
1245 {
1246 ijk = { i, j, k };
1247
1248 total_count += list.binSize( ijk );
1249 // This neighbor is in this bin.
1250 if ( total_count > neighbor_index )
1251 {
1252 int particle_id = list.binOffset( ijk ) +
1253 ( neighbor_index - previous_count );
1254 return list.getParticle( particle_id );
1255 }
1256 // Update previous to all bins so far.
1257 previous_count = total_count;
1258 }
1259
1260 assert( total_count <= totalNeighbor( list ) );
1261
1262 // Should never make it to this point.
1263 return 0;
1264 }
1265
1268 template <std::size_t NSD = num_space_dim>
1269 KOKKOS_INLINE_FUNCTION static std::enable_if_t<2 == NSD, std::size_t>
1270 getNeighbor( const list_type& list, const std::size_t particle_index,
1271 const std::size_t neighbor_index )
1272 {
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;
1277 list.getStencilCells( list.getParticleBin( particle_index ), min, max );
1278
1279 // Loop over the cell stencil.
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 )
1283 {
1284 ij = { i, j };
1285
1286 total_count += list.binSize( ij );
1287 // This neighbor is in this bin.
1288 if ( total_count > neighbor_index )
1289 {
1290 int particle_id = list.binOffset( ij ) +
1291 ( neighbor_index - previous_count );
1292 return list.getParticle( particle_id );
1293 }
1294 // Update previous to all bins so far.
1295 previous_count = total_count;
1296 }
1297
1298 assert( total_count <= totalNeighbor( list ) );
1299
1300 // Should never make it to this point.
1301 return 0;
1302 }
1303};
1304
1305} // end namespace Cabana
1306
1307#endif // end CABANA_SORT_HPP
Neighbor list interface.
Slice a single particle property from an AoSoA.
Sorting and binning built on Kokkos BinSort.
Cabana utilities.
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