56 cell2cellFaceV.begin(),
58 result.cellNew2Old.begin(),
63 auto dbgCheckSubGraphRanges = [&]([[maybe_unused]]
const char *tag)
65 for (
int p = 0; p < static_cast<int>(
result.localPartitionStarts.size()) - 1;
p++)
69 for (
index iC = pStart; iC < pEnd; iC++)
70 for (
auto jC : cell2cellFaceV[iC])
72 jC >= 0 && jC <
nCell,
73 "%s: partition %d [%lld,%lld): cell %lld has neighbor %lld outside [0,%lld)",
74 tag,
p, (
long long)pStart, (
long long)pEnd,
75 (
long long)iC, (
long long)jC, (
long long)
nCell);
78 auto dbgCheckBidir = [&]([[maybe_unused]]
const char *tag)
81 for (
auto jC : cell2cellFaceV[iC])
84 for (
auto kC : cell2cellFaceV[jC])
91 "%s: edge %lld->%lld exists but reverse %lld->%lld missing",
92 tag, (
long long)iC, (
long long)jC, (
long long)jC, (
long long)iC);
97 dbgCheckSubGraphRanges(
"before inner partitioning");
98 dbgCheckBidir(
"before inner partitioning");
101 for (
int iPart = 0; iPart < static_cast<int>(
result.localPartitionStarts.size()) - 1; iPart++)
103 index bwOldC{0}, bwNewC{0};
105 index offsetN =
result.localPartitionStarts[iPart + 1];
107 cell2cellFaceV.begin() + offset,
108 cell2cellFaceV.begin() + offsetN,
109 result.cellNew2Old.begin() + offset,
110 result.cellNew2Old.begin() + offsetN, nPartsInner, offset,
true, bwOldC, bwNewC,
111 cell2cellFaceV.begin(),
nCell);
116 dbgCheckSubGraphRanges(fmt::format(
"after inner part {}", iPart).c_str());
121 dbgCheckBidir(
"after all inner partitioning");
128 auto cellIsNotPrivate = [&](
index iCell)
130 for (
auto iCellOther : cell2cell[iCell])
132 if (iCellOther >=
nCell)
137 int nLocalParts = !
result.localPartitionStarts.empty()
138 ?
static_cast<int>(
result.localPartitionStarts.size()) - 1
140 auto localPartStart = [&](
int iPart) ->
index
141 {
return !
result.localPartitionStarts.empty() ?
result.localPartitionStarts.at(iPart) : 0; };
142 auto localPartEnd = [&](
int iPart) ->
index
143 {
return !
result.localPartitionStarts.empty() ?
result.localPartitionStarts.at(iPart + 1) :
nCell; };
145 std::vector<index> cellNew2Old_new;
146 cellNew2Old_new.reserve(
nCell);
149 for (
int iPart = 0; iPart < nLocalParts; iPart++)
151 for (
index i = localPartStart(iPart);
i < localPartEnd(iPart);
i++)
153 cellNew2Old_new.push_back(
result.cellNew2Old[
i]);
154 for (
index i = localPartStart(iPart);
i < localPartEnd(iPart);
i++)
156 cellNew2Old_new.push_back(
result.cellNew2Old[
i]);
159 result.cellNew2Old = std::move(cellNew2Old_new);
161 for (
auto v :
result.cellNew2Old)
167 std::vector<bool> seen(
nCell,
false);
172 seen[
result.cellNew2Old[
i]] =
true;