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)
86 x[d] =
pos(
i * Dim + d);
87 for (
int d = 0; d < Dim; ++d)
89 const double L =
csz[d] *
static_cast<double>(
gsz[d]);
90 double rel = x[d] -
org[d];
94 for (
int d = 0; d < Dim; ++d)
95 pos(
i * Dim + d) = x[d];
97 for (
int d = 0; d < Dim; ++d) {
98 const double rel = (x[d] -
org[d]) /
csz[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);
139 std::vector<double>
hSendPos(
static_cast<std::size_t
>(
nSend) * Dim);
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)
151 sp(
j * Dim + d) =
pos(
s * 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);
158 for (std::size_t k = 0; k <
hSendPos.size(); ++k)
161 auto hspay = Kokkos::create_mirror_view(
spay);
163 for (std::size_t k = 0; k <
hSendPay.size(); ++k)
170 ensureScratch(
pos.extent(0),
payload.extent(0));
175 Kokkos::parallel_for(
178 for (
int d = 0; d < Dim; ++d)
179 tp(k * Dim + d) =
pos(
s * 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)