123 Kokkos::View<ManifoldC*, CpMem> outManifolds,
124 Kokkos::View<int, CpMem> outCount) {
127 Kokkos::deep_copy(space, outCount, 0);
132 Kokkos::View<std::uint64_t*, CpMem> keys(
133 Kokkos::view_alloc(space,
"peclet::dem::cp::keys", Kokkos::WithoutInitializing), n);
134 Kokkos::View<int*, CpMem> perm(
135 Kokkos::view_alloc(space,
"peclet::dem::cp::perm", Kokkos::WithoutInitializing), n);
136 Kokkos::parallel_for(
137 "peclet::dem::cp::key", Kokkos::RangePolicy<CpExec>(space, 0, n), KOKKOS_LAMBDA(
int i) {
138 keys(i) =
pairKey(contacts(i));
143 Kokkos::Experimental::sort_by_key(space, keys, perm);
146 Kokkos::View<int*, CpMem> segId(
147 Kokkos::view_alloc(space,
"peclet::dem::cp::segId", Kokkos::WithoutInitializing), n);
149 Kokkos::parallel_scan(
150 "peclet::dem::cp::segscan", Kokkos::RangePolicy<CpExec>(space, 0, n),
151 KOKKOS_LAMBDA(
int p,
int& run,
const bool final) {
152 const bool isNew = (p == 0) || (keys(p) != keys(p - 1));
161 Kokkos::View<std::uint64_t*, CpMem> k = keys;
162 Kokkos::View<int*, CpMem> sid = segId;
163 Kokkos::View<ManifoldC*, CpMem> out = outManifolds;
164 Kokkos::parallel_for(
165 "peclet::dem::cp::init", Kokkos::RangePolicy<CpExec>(space, 0, n), KOKKOS_LAMBDA(
int p) {
166 const bool leader = (p == 0) || (k(p) != k(p - 1));
175 Kokkos::View<const ContactC*, CpMem> ct = contacts;
176 Kokkos::View<int*, CpMem> pm = perm;
177 Kokkos::parallel_for(
178 "peclet::dem::cp::accum", Kokkos::RangePolicy<CpExec>(space, 0, n), KOKKOS_LAMBDA(
int p) {
180 const int s = sid(p);
181 Kokkos::atomic_add(&out(s).num_points, m.
num_points);
182 Kokkos::atomic_add(&out(s).normal_sum.x, m.
normal_sum.
x);
183 Kokkos::atomic_add(&out(s).normal_sum.y, m.
normal_sum.
y);
184 Kokkos::atomic_add(&out(s).normal_sum.z, m.
normal_sum.
z);
191 Kokkos::atomic_add(&out(s).rA_sum.x, m.
rA_sum.
x);
192 Kokkos::atomic_add(&out(s).rA_sum.y, m.
rA_sum.
y);
193 Kokkos::atomic_add(&out(s).rA_sum.z, m.
rA_sum.
z);
194 Kokkos::atomic_add(&out(s).rB_sum.x, m.
rB_sum.
x);
195 Kokkos::atomic_add(&out(s).rB_sum.y, m.
rB_sum.
y);
196 Kokkos::atomic_add(&out(s).rB_sum.z, m.
rB_sum.
z);
197 Kokkos::atomic_add(&out(s).wallVel_sum.x, m.
wallVel_sum.
x);
198 Kokkos::atomic_add(&out(s).wallVel_sum.y, m.
wallVel_sum.
y);
199 Kokkos::atomic_add(&out(s).wallVel_sum.z, m.
wallVel_sum.
z);
204 Kokkos::deep_copy(space, outCount, numSeg);