24#include <Cabana_VerletList.hpp>
32template <
class MemorySpace,
class AlgorithmTag,
class LayoutTag,
33 class BuildTag = Cabana::TeamVectorOpTag>
35 LayoutTag, BuildTag> {
39 std::size_t
const max_neigh) {
54 KOKKOS_INLINE_FUNCTION
56 std::size_t
const max_neigh) {
59 Kokkos::ViewAllocateWithoutInitializing(
"neighbors"), num_particles,
64 KOKKOS_INLINE_FUNCTION
66 std::size_t
const max_neigh) {
67 Kokkos::realloc(
counts, num_particles);
68 Kokkos::realloc(Kokkos::WithoutInitializing,
neighbors, num_particles,
73 KOKKOS_INLINE_FUNCTION
76 auto count_n =
counts(nid);
78 if (count > count_n) {
81 count = Kokkos::atomic_fetch_add(&
counts(pid), 1);
91 KOKKOS_INLINE_FUNCTION
93 auto const count =
counts(pid);
105 KOKKOS_INLINE_FUNCTION
108 auto count_n =
counts(nid);
110 if (count > count_n) {
124 KOKKOS_INLINE_FUNCTION
126 Kokkos::parallel_for(
"custom_verlet_list::sort_neighbors",
127 Kokkos::RangePolicy<Kokkos::DefaultExecutionSpace>(
128 std::size_t{0},
counts.size()),
129 [&](std::size_t
const i) {
130 auto const count =
counts(i);
132 std::sort(ptr, ptr + count);
138 KOKKOS_INLINE_FUNCTION
140 auto max_counts = 0l;
141 auto ave_counts = 0l;
142 auto ave_sq_counts = 0l;
143 for (
int pid = 0; pid <
counts.extent(0); ++pid) {
144 auto const count =
static_cast<long>(
counts(pid));
145 if (max_counts < count)
148 ave_sq_counts += count * count;
150 if (
counts.extent(0) != 0) {
151 ave_counts /=
static_cast<long>(
counts.extent(0));
152 ave_sq_counts /=
static_cast<long>(
counts.extent(0));
153 ave_sq_counts -= ave_counts * ave_counts;
155 ostream <<
"max:" << max_counts <<
" ave:" << ave_counts
156 <<
" var:" << ave_sq_counts << std::endl;
157 return static_cast<int>(max_counts);
160 KOKKOS_INLINE_FUNCTION
163 Kokkos::Max<int> max_reduce(max_counts);
164 Kokkos::parallel_reduce(
165 "custom_verlet_list::reduce_max",
166 Kokkos::RangePolicy<Kokkos::DefaultExecutionSpace>(std::size_t{0},
168 [&](std::size_t
const i,
int &value) {
180 KOKKOS_INLINE_FUNCTION
void setOverflow() {
overflow =
true; }
183template <
class MemorySpace,
class AlgorithmTag,
class BuildTag>
185 Cabana::VerletLayout2D, BuildTag>> {
191 Cabana::VerletLayout2D, BuildTag>;
194 KOKKOS_INLINE_FUNCTION
196 std::size_t
const num_p = list.
counts.size();
197 std::size_t total_n = 0;
198 for (std::size_t i = 0; i < num_p; ++i)
199 total_n += list.
counts(i);
204 KOKKOS_INLINE_FUNCTION
210 KOKKOS_INLINE_FUNCTION
212 std::size_t
const particle_index) {
213 return list.
counts(particle_index);
218 KOKKOS_INLINE_FUNCTION
220 std::size_t
const particle_index,
221 std::size_t
const count) {
222 return list.
neighbors(particle_index, count);
static KOKKOS_INLINE_FUNCTION std::size_t getNeighbor(list_type const &list, std::size_t const particle_index, std::size_t const count)
Get the id for a neighbor for a given particle index and the index of the neighbor relative to the pa...
static KOKKOS_INLINE_FUNCTION std::size_t totalNeighbor(list_type const &list)
Get the total number of neighbors across all particles.
static KOKKOS_INLINE_FUNCTION std::size_t maxNeighbor(list_type const &list)
Get the maximum number of neighbors per particle.
static KOKKOS_INLINE_FUNCTION std::size_t numNeighbor(list_type const &list, std::size_t const particle_index)
Get the number of neighbors for a given particle index.
MemorySpace memory_space
Kokkos memory space.
KOKKOS_INLINE_FUNCTION void addNeighborLB(int pid, int nid)
KOKKOS_INLINE_FUNCTION void sortNeighbors()
KOKKOS_INLINE_FUNCTION auto get_max_counts()
CustomVerletList(std::size_t const begin, std::size_t const end, std::size_t const max_neigh)
KOKKOS_INLINE_FUNCTION void addNeighborAtomicLB(int pid, int nid)
KOKKOS_INLINE_FUNCTION void initializeData(std::size_t const num_particles, std::size_t const max_neigh)
KOKKOS_INLINE_FUNCTION void reallocData(std::size_t const num_particles, std::size_t const max_neigh)
KOKKOS_INLINE_FUNCTION void addNeighbor(int pid, int nid)
CustomVerletList()=default
Kokkos::View< int **, Kokkos::LayoutRight, MemorySpace > neighbors
KOKKOS_INLINE_FUNCTION auto get_variance_max_counts(auto &ostream)
Kokkos::View< int *, MemorySpace > counts
KOKKOS_INLINE_FUNCTION bool hasOverflow() const