16#ifndef CABANA_NEIGHBORLIST_HPP
17#define CABANA_NEIGHBORLIST_HPP
19#include <Kokkos_Core.hpp>
70 KOKKOS_INLINE_FUNCTION
71 static bool isValid(
const std::size_t p,
const double,
const double,
72 const double,
const std::size_t n,
const double,
73 const double,
const double )
95 KOKKOS_INLINE_FUNCTION
static bool
96 isValid(
const std::size_t p,
const double xp,
const double yp,
97 const double zp,
const std::size_t n,
const double xn,
98 const double yn,
const double zn )
100 return ( ( p != n ) &&
103 ( ( yn > yp ) || ( ( yn == yp ) && ( zn > zp ) ) ) ) ) );
112template <
class NeighborListType>
120 KOKKOS_INLINE_FUNCTION
124 KOKKOS_INLINE_FUNCTION
128 KOKKOS_INLINE_FUNCTION
130 const std::size_t particle_index );
133 KOKKOS_INLINE_FUNCTION
135 const std::size_t particle_index,
136 const std::size_t neighbor_index );
139 KOKKOS_INLINE_FUNCTION
141 const std::size_t particle_index,
142 const std::size_t neighbor_index );
150template <
class ListType>
151KOKKOS_INLINE_FUNCTION std::size_t
154 std::size_t total_n = 0;
156 for ( std::size_t p = 0; p < num_particles; p++ )
162template <
class ListType>
163KOKKOS_INLINE_FUNCTION std::size_t
164maxNeighbor(
const ListType& list,
const std::size_t num_particles )
166 std::size_t max_n = 0;
167 for ( std::size_t p = 0; p < num_particles; p++ )
182template <
class ExecutionSpace,
class ListType>
183Kokkos::View<int* [2], typename ListType::memory_space>
185 const ListType& list,
const int num_bin )
188 auto num_neigh = Kokkos::View<int*, typename ListType::memory_space>(
189 "particle_count", num_particles );
192 auto extract_functor = KOKKOS_LAMBDA(
const int p )
196 Kokkos::RangePolicy<ExecutionSpace> particle_policy( exec_space, 0,
198 Kokkos::parallel_for( particle_policy, extract_functor );
203 auto histogram = Kokkos::View<int* [2], typename ListType::memory_space>(
204 "particle_count", num_bin, 2 );
205 auto histogram_functor = KOKKOS_LAMBDA(
const int b )
209 static_cast<double>( max_neigh ) /
static_cast<double>( num_bin );
210 if ( num_bin > max_neigh )
213 histogram( b, 0 ) =
static_cast<int>( ( b + 1 ) * bin_width );
214 histogram( b, 1 ) = bin_data.binSize( b );
216 Kokkos::RangePolicy<ExecutionSpace> bin_policy( exec_space, 0, num_bin );
217 Kokkos::parallel_for( bin_policy, histogram_functor );
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:164
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:152
Sorting and binning built on Kokkos BinSort.
Tag for full neighbor lists.
Definition Cabana_NeighborList.hpp:36
Tag for half neighbor lists.
Definition Cabana_NeighborList.hpp:49
static KOKKOS_INLINE_FUNCTION bool isValid(const std::size_t p, const double, const double, const double, const std::size_t n, const double, const double, const double)
Check whether neighbor pair is valid.
Definition Cabana_NeighborList.hpp:71
static KOKKOS_INLINE_FUNCTION bool isValid(const std::size_t p, const double xp, const double yp, const double zp, const std::size_t n, const double xn, const double yn, const double zn)
Check whether neighbor pair is valid.
Definition Cabana_NeighborList.hpp:96
Neighborhood discriminator.
Definition Cabana_NeighborList.hpp:55
Neighbor list interface. Provides an interface callable at the functor level that gives access to nei...
Definition Cabana_NeighborList.hpp:114
typename NeighborListType::memory_space memory_space
Kokkos memory space.
Definition Cabana_NeighborList.hpp:117
KOKKOS_INLINE_FUNCTION std::size_t setNeighbor(NeighborListType &list, const std::size_t particle_index, const std::size_t neighbor_index)
Set the id for a neighbor for a given particle index and neighbor index.
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 getNeighbor(const NeighborListType &list, const std::size_t particle_index, const std::size_t neighbor_index)
Get the id for a neighbor for a given particle index and neighbor index.
static KOKKOS_INLINE_FUNCTION std::size_t totalNeighbor(const NeighborListType &list)
Get the total number of neighbors across all particles.
static KOKKOS_INLINE_FUNCTION std::size_t maxNeighbor(const NeighborListType &list)
Get the maximum number of neighbors across all particles.
Core: particle data structures and algorithms.
Definition Cabana_AoSoA.hpp:36
auto binByKey(KeyViewType keys, const int nbin, const std::size_t begin, const std::size_t end, typename std::enable_if<(Kokkos::is_view< KeyViewType >::value), int >::type *=0)
Bin an AoSoA over a subset of its range based on the associated key values and number of bins....
Definition Cabana_Sort.hpp:418
Kokkos::View< int *[2], typename ListType::memory_space > neighborHistogram(ExecutionSpace exec_space, const std::size_t num_particles, const ListType &list, const int num_bin)
Construct a histogram of neighbors per particle.
Definition Cabana_NeighborList.hpp:184