74 for (
int d = 0;
d <
Dim; ++
d) {
76 csz[
d] = cellSize_[
d];
78 per[
d] = periodic_[
d];
80 View<int> dest(Kokkos::view_alloc(
"pmd::dest", Kokkos::WithoutInitializing),
81 static_cast<std::size_t
>(n));
85 for (
int d = 0;
d <
Dim; ++
d)
87 for (
int d = 0;
d <
Dim; ++
d)
89 const double L =
csz[
d] *
static_cast<double>(
gsz[
d]);
94 for (
int d = 0;
d <
Dim; ++
d)
97 for (
int d = 0;
d <
Dim; ++
d) {
103 c = c < 0 ? 0 : (c >=
gsz[
d] ?
gsz[
d] - 1 : c);
113 auto hdest = Kokkos::create_mirror_view(
dest);
116 keepIdx.reserve(
static_cast<std::size_t
>(n));
125 std::vector<int> sendRanks, sendCounts;
128 sendRanks.push_back(
kv.first);
129 sendCounts.push_back(
static_cast<int>(
kv.second.size()));
134 sent_ =
static_cast<std::size_t
>(
nSend);
143 View<double> sp(Kokkos::view_alloc(
"pmd::sendPos", Kokkos::WithoutInitializing),
144 static_cast<std::size_t
>(
nSend) *
Dim);
145 View<char> spay(Kokkos::view_alloc(
"pmd::sendPay", Kokkos::WithoutInitializing),
147 Kokkos::parallel_for(
150 for (
int d = 0;
d <
Dim; ++
d)
152 for (std::size_t b = 0; b <
stride; ++b)
156 auto hsp = Kokkos::create_mirror_view(
sp);
157 Kokkos::deep_copy(
hsp,
sp);
161 auto hspay = Kokkos::create_mirror_view(
spay);
170 ensureScratch(
pos.extent(0),
payload.extent(0));
175 Kokkos::parallel_for(
178 for (
int d = 0;
d <
Dim; ++
d)
180 for (std::size_t b = 0; b <
stride; ++b)
183 Kokkos::deep_copy(Kokkos::subview(
pos, std::pair<std::size_t, std::size_t>(
184 0,
static_cast<std::size_t
>(
keep) *
Dim)),
185 Kokkos::subview(tmpPos_, std::pair<std::size_t, std::size_t>(
186 0,
static_cast<std::size_t
>(
keep) *
Dim)));
189 Kokkos::subview(
payload, std::pair<std::size_t, std::size_t>(
191 Kokkos::subview(tmpPay_, std::pair<std::size_t, std::size_t>(
192 0,
static_cast<std::size_t
>(
keep) *
stride)));
197 std::vector<std::vector<char>>
outbox(sendRanks.size());
200 for (std::size_t r = 0; r < sendRanks.size(); ++r) {
220 auto packNext = [&](std::vector<char>&
out) ->
int {
223 int d = sendRanks[
q];
228 auto onRecv = [&](
int , std::vector<char>&
msg) {
230 for (std::size_t
i = 0;
i <
cnt; ++
i) {
250 Kokkos::parallel_for(
252 for (
int d = 0;
d <
Dim; ++
d)
257 Kokkos::parallel_for(
258 "pmd::unpack_pay", Kokkos::RangePolicy<ExecSpace>(0,
recv),
260 for (std::size_t b = 0; b <
stride; ++b)