53 const label myRank = Pstream::myProcNo(comm);
54 const label nProcs = Pstream::nProcs(comm);
67 if (subMap[proci].size())
72 if (constructMap[proci].size())
79 allComms = commsSet.toc();
84 if (Pstream::master(comm))
87 for (
const int slave : Pstream::subProcs(comm))
91 Pstream::commsTypes::scheduled,
101 if (!allComms.found(nbrData[i]))
103 label sz = allComms.size();
105 allComms[sz] = nbrData[i];
110 for (
const int slave : Pstream::subProcs(comm))
114 Pstream::commsTypes::scheduled,
128 Pstream::commsTypes::scheduled,
134 toMaster << allComms;
139 Pstream::commsTypes::scheduled,
145 fromMaster >> allComms;
157 ).procSchedule()[myRank]
206 const label expectedSize,
207 const label receivedSize
210 if (receivedSize != expectedSize)
213 <<
"Expected from processor " << proci
214 <<
" " << expectedSize <<
" but received "
215 << receivedSize <<
" elements."
229 forAll(constructMap_, proci)
231 const labelList& construct = constructMap_[proci];
232 if (constructHasFlip_)
236 label index =
mag(construct[i])-1;
237 minIndex[proci] =
min(minIndex[proci], index);
238 maxIndex[proci] =
max(maxIndex[proci], index);
245 label index = construct[i];
246 minIndex[proci] =
min(minIndex[proci], index);
247 maxIndex[proci] =
max(maxIndex[proci], index);
259 localSize = maxIndex[myRank]+1;
262 os <<
"Layout: (constructSize:" << constructSize_
263 <<
" subHasFlip:" << subHasFlip_
264 <<
" constructHasFlip:" << constructHasFlip_
266 <<
"local (processor " << myRank <<
"):" <<
endl
267 <<
" start : 0" <<
endl
268 <<
" size : " << localSize <<
endl;
270 label offset = localSize;
275 if (constructMap_[proci].size() > 0)
277 if (minIndex[proci] != offset)
280 <<
"offset:" << offset
281 <<
" proci:" << proci
282 <<
" minIndex:" << minIndex[proci]
286 label size = maxIndex[proci]-minIndex[proci]+1;
287 os <<
"processor " << proci <<
':' <<
endl
288 <<
" start : " << offset <<
endl
289 <<
" size : " << size <<
endl;
308 compactMap.setSize(nProcs);
313 for (
const label globalIdx : elements)
315 if (globalIdx != -1 && !globalNumbering.
isLocal(globalIdx))
317 label proci = globalNumbering.
whichProcID(globalIdx);
324 compactMap[proci].clear();
327 compactMap[proci].resize(2*nNonLocal[proci]);
333 for (
const label globalIdx : elements)
335 if (globalIdx != -1 && !globalNumbering.
isLocal(globalIdx))
337 label proci = globalNumbering.
whichProcID(globalIdx);
338 label index = globalNumbering.
toLocal(proci, globalIdx);
339 label nCompact = compactMap[proci].size();
340 compactMap[proci].insert(index, nCompact);
356 compactMap.setSize(nProcs);
361 for (
const labelList& cCells : cellCells)
363 for (
const label globalIdx : cCells)
365 if (globalIdx != -1 && !globalNumbering.
isLocal(globalIdx))
367 label proci = globalNumbering.
whichProcID(globalIdx);
375 compactMap[proci].clear();
378 compactMap[proci].resize(2*nNonLocal[proci]);
384 for (
const labelList& cCells : cellCells)
386 for (
const label globalIdx : cCells)
388 if (globalIdx != -1 && !globalNumbering.
isLocal(globalIdx))
390 label proci = globalNumbering.
whichProcID(globalIdx);
391 label index = globalNumbering.
toLocal(proci, globalIdx);
392 label nCompact = compactMap[proci].size();
393 compactMap[proci].insert(index, nCompact);
417 compactStart[myRank] = 0;
418 constructSize_ = globalNumbering.
localSize();
419 forAll(compactStart, proci)
423 compactStart[proci] = constructSize_;
424 constructSize_ += compactMap[proci].size();
435 constructMap_.setSize(nProcs);
441 label nLocal = globalNumbering.
localSize();
442 wantedRemoteElements[proci] =
identity(nLocal);
443 constructMap_[proci] =
identity(nLocal);
448 labelList& remoteElem = wantedRemoteElements[proci];
449 labelList& localElem = constructMap_[proci];
450 remoteElem.
setSize(compactMap[proci].size());
451 localElem.
setSize(compactMap[proci].size());
455 const label compactI = compactStart[proci] + iter.val();
456 remoteElem[i] = iter.key();
457 localElem[i] = compactI;
465 Pstream::exchange<labelList, label>
467 wantedRemoteElements,
474 for (label& elem : elements)
476 elem =
renumber(globalNumbering, compactMap, elem);
498 compactStart[myRank] = 0;
499 constructSize_ = globalNumbering.
localSize();
500 forAll(compactStart, proci)
504 compactStart[proci] = constructSize_;
505 constructSize_ += compactMap[proci].size();
515 constructMap_.setSize(nProcs);
521 label nLocal = globalNumbering.
localSize();
522 wantedRemoteElements[proci] =
identity(nLocal);
523 constructMap_[proci] =
identity(nLocal);
528 labelList& remoteElem = wantedRemoteElements[proci];
529 labelList& localElem = constructMap_[proci];
530 remoteElem.
setSize(compactMap[proci].size());
531 localElem.
setSize(compactMap[proci].size());
535 const label compactI = compactStart[proci] + iter.val();
536 remoteElem[i] = iter.key();
537 localElem[i] = compactI;
545 Pstream::exchange<labelList, label>
547 wantedRemoteElements,
556 for (label& celli : cCells)
558 celli =
renumber(globalNumbering, compactMap, celli);
570 constructHasFlip_(false),
579 constructSize_(map.constructSize_),
580 subMap_(map.subMap_),
581 constructMap_(map.constructMap_),
582 subHasFlip_(map.subHasFlip_),
583 constructHasFlip_(map.constructHasFlip_),
599 const label constructSize,
602 const bool subHasFlip,
603 const bool constructHasFlip,
607 constructSize_(constructSize),
608 subMap_(std::move(subMap)),
609 constructMap_(std::move(constructMap)),
610 subHasFlip_(subHasFlip),
611 constructHasFlip_(constructHasFlip),
626 constructHasFlip_(
false),
633 if (sendProcs.
size() != recvProcs.
size())
636 <<
"The send and receive data is not the same length. sendProcs:"
637 << sendProcs.
size() <<
" recvProcs:" << recvProcs.
size()
645 forAll(sendProcs, sampleI)
647 const label sendProc = sendProcs[sampleI];
648 const label recvProc = recvProcs[sampleI];
653 if (myRank == sendProc)
658 if (myRank == recvProc)
666 constructMap_.setSize(nProcs);
669 subMap_[proci].setSize(nSend[proci]);
670 constructMap_[proci].setSize(nRecv[proci]);
675 forAll(sendProcs, sampleI)
677 const label sendProc = sendProcs[sampleI];
678 const label recvProc = recvProcs[sampleI];
680 if (myRank == sendProc)
683 subMap_[recvProc][nSend[recvProc]++] = sampleI;
685 if (myRank == recvProc)
688 constructMap_[sendProc][nRecv[sendProc]++] = sampleI;
690 constructSize_ = sampleI+1;
707 constructHasFlip_(
false),
714 calcCompactAddressing
768 constructHasFlip_(
false),
775 calcCompactAddressing
821 const bool subHasFlip,
822 const bool constructHasFlip,
827 subMap_(std::move(subMap)),
828 subHasFlip_(subHasFlip),
829 constructHasFlip_(constructHasFlip),
844 label nLocal = recvSizes[myRank];
854 label segmenti = nLocal;
855 forAll(constructMap, proci)
860 label nRecv = recvSizes[proci];
861 constructMap[proci].
setSize(nRecv);
863 for (label i = 0; i < nRecv; i++)
865 constructMap[proci][i] = segmenti++;
870 constructSize_ = segmenti;
871 constructMap_.
transfer(constructMap);
897 schedulePtr_.clear();
916 if (globalNumbering.
isLocal(globalI))
918 return globalNumbering.
toLocal(globalI);
922 label proci = globalNumbering.
whichProcID(globalI);
923 label index = globalNumbering.
toLocal(proci, globalI);
924 return compactMap[proci][index];
956 if (domain != myRank && map.size())
958 recvFields[domain].
setSize(map.size());
963 recvFields[domain].data_bytes(),
964 recvFields[domain].size_bytes(),
976 const labelList& map = constructMap_[domain];
978 if (domain != myRank && map.size())
980 boolList& subField = sendFields[domain];
984 subField[i] = accessAndFlip
997 subField.cdata_bytes(),
998 subField.size_bytes(),
1010 const labelList& map = constructMap_[myRank];
1012 recvFields[myRank].
setSize(map.size());
1015 recvFields[myRank][i] = accessAndFlip
1041 if (recvFields[domain][i])
1044 newMap[newI++] = map[i];
1047 if (newI < map.size())
1050 subMap_[domain].transfer(newMap);
1059 label maxConstructIndex = -1;
1063 const labelList& map = constructMap_[domain];
1070 label destinationI = map[i];
1071 if (constructHasFlip_)
1073 destinationI =
mag(destinationI)-1;
1077 if (elemIsUsed[destinationI])
1079 maxConstructIndex =
max(maxConstructIndex, destinationI);
1081 newMap[newI++] = map[i];
1084 if (newI < map.size())
1087 constructMap_[domain].transfer(newMap);
1091 constructSize_ = maxConstructIndex+1;
1094 schedulePtr_.clear();
1101 const label localSize,
1128 if (domain != myRank && map.size())
1130 recvFields[domain].
setSize(map.size());
1135 recvFields[domain].data_bytes(),
1136 recvFields[domain].size_bytes(),
1148 const labelList& map = constructMap_[domain];
1150 if (domain != myRank && map.size())
1152 boolList& subField = sendFields[domain];
1156 label index = map[i];
1157 if (constructHasFlip_)
1159 index =
mag(index)-1;
1161 subField[i] = elemIsUsed[index];
1168 subField.cdata_bytes(),
1169 subField.size_bytes(),
1181 const labelList& map = constructMap_[myRank];
1183 recvFields[myRank].
setSize(map.size());
1186 label index = map[i];
1187 if (constructHasFlip_)
1189 index =
mag(index)-1;
1191 recvFields[myRank][i] = elemIsUsed[index];
1205 oldToNewSub.
setSize(localSize, -1);
1207 boolList sendElemIsUsed(localSize,
false);
1214 if (recvFields[domain][i])
1216 label index = map[i];
1219 index =
mag(index)-1;
1221 sendElemIsUsed[index] =
true;
1227 forAll(sendElemIsUsed, i)
1229 if (sendElemIsUsed[i])
1231 oldToNewSub[i] = newI++;
1247 if (recvFields[domain][i])
1250 label index = map[i];
1258 index =
mag(index)-1;
1260 label newIndex = oldToNewSub[index];
1263 newIndex =
sign*(newIndex+1);
1265 newMap[newI++] = newIndex;
1268 newMap.setSize(newI);
1269 subMap_[domain].transfer(newMap);
1278 oldToNewConstruct.
setSize(elemIsUsed.size(), -1);
1284 oldToNewConstruct[i] = constructSize_++;
1290 const labelList& map = constructMap_[domain];
1297 label destinationI = map[i];
1299 if (constructHasFlip_)
1301 if (destinationI < 0)
1305 destinationI =
mag(destinationI)-1;
1309 if (elemIsUsed[destinationI])
1311 label newIndex = oldToNewConstruct[destinationI];
1312 if (constructHasFlip_)
1314 newIndex =
sign*(newIndex+1);
1316 newMap[newI++] = newIndex;
1319 newMap.setSize(newI);
1320 constructMap_[domain].transfer(newMap);
1340 schedulePtr_.clear();