40 namespace processorLODs
54 static label time = 0;
64 for (
const int proci : Pstream::allProcs())
66 if (proci == Pstream::myProcNo())
87 for (
const label fpi :
f)
89 os <<
' ' << fpi + verti + 1;
103 const label refineIter,
104 const label nTgtObjects,
114 for (
const int proci : Pstream::allProcs())
116 if (proci != Pstream::myProcNo())
119 toProc << nObjectsOfType_ << boxes_[proci] << newToOld_[proci];
127 for (
const int proci : Pstream::allProcs())
129 if (proci == Pstream::myProcNo())
138 const label nObjects =
readLabel(fromProc);
142 if (remoteSrcBoxes.empty())
148 labelList& procRefineFlags = refineFlags[proci];
149 procRefineFlags.
setSize(remoteSrcBoxes.size(), FIXED);
151 if (scalar(nTgtObjects)/scalar(nObjects) < 0.1)
155 fixedSendElems[proci].insert(
identity(nTgtObjects));
156 nElems[proci] = nTgtObjects;
165 forAll(remoteSrcBoxes, srcBoxi)
170 if (refineIter > nStartUpIter)
173 const label oldBoxi = newToOld[srcBoxi];
174 const labelList& tgtBoxElems = localProcTgtElems[oldBoxi];
176 for (
const label tgtObji : tgtBoxElems)
178 if (calcTgtBox(tgtObji).overlaps(remSrcBb))
180 selectedElems.
append(tgtObji);
187 for (label tgtObji = 0; tgtObji < nTgtObjects; ++tgtObji)
189 if (calcTgtBox(tgtObji).overlaps(remSrcBb))
191 selectedElems.
append(tgtObji);
196 nElem += selectedElems.size();
200 proci == Pstream::myProcNo()
201 || selectedElems.size() < maxObjectsPerLeaf_
204 procRefineFlags[srcBoxi] = FIXED;
205 fixedSendElems[proci].insert(selectedElems);
209 procRefineFlags[srcBoxi] = REFINE;
210 if (refineIter >= nStartUpIter)
212 newLocalProcTgtElems[srcBoxi].
transfer(selectedElems);
217 localProcTgtElems.
transfer(newLocalProcTgtElems);
218 nElems[proci] = nElem;
226 const label refineIter,
227 const label nSrcElem,
236 if (refineIter == nStartUpIter)
239 for (
direction octant = 0; octant < 8; ++octant)
246 for (label srcElemi = 0; srcElemi < nSrcElem; ++srcElemi)
248 if (subBb.overlaps(calcSrcBox(srcElemi)))
250 newElems.append(srcElemi);
257 procBoxElems.
append(newElems);
258 procNewToOld.
append(boxi);
264 for (
direction octant = 0; octant < 8; ++octant)
268 for (label srcElemi = 0; srcElemi < nSrcElem; ++srcElemi)
270 if (subBb.overlaps(calcSrcBox(srcElemi)))
292 for (
direction octant = 0; octant < 8; ++octant)
299 for (
const label srcElemi : srcAddr)
301 if (subBb.overlaps(calcSrcBox(srcElemi)))
303 newElems.
append(srcElemi);
311 procBoxElems.
append(newElems);
312 procNewToOld.
append(boxi);
320 const label refineIter,
321 const label nSrcFaces,
329 forAll(refineFlags, proci)
331 if (proci != Pstream::myProcNo())
334 toProc << refineFlags[proci];
342 bool refineBoxes =
false;
346 for (
const int proci : Pstream::allProcs())
348 if (proci == Pstream::myProcNo())
359 newToOld[proci].setCapacity(boxes_[proci].size());
365 if (refineFlags[boxi] == DROP)
369 else if (refineFlags[boxi] == REFINE)
371 if (refineIter > nStartUpIter)
378 boxSrcElems_[proci][boxi],
401 else if (refineFlags[boxi] == FIXED)
403 fixedBoxes[proci].append(procBoxes[boxi]);
408 <<
"Unhandled refine action " << refineFlags[boxi]
414 boxes_[proci].transfer(newProcBoxes);
415 boxSrcElems_[proci].transfer(newProcBoxElems);
416 newToOld_[proci].transfer(newProcNewToOld);
425 const label nSrcElems,
426 const label nTgtElems
440 label refinementIter = 1;
441 bool refineSrcBoxes =
true;
442 while (refineSrcBoxes && (refinementIter <= nRefineIterMax_))
478 allBoxes[proci].
append(boxes_[proci]);
480 writeBoxes(allBoxes, refinementIter);
486 Pout<<
"Local src boxes after " << refinementIter-1 <<
" iterations:"
492 label nBox = fixedBoxes[proci].size() + boxes_[proci].size();
493 Pout<<
" proc:" << proci <<
" nBoxes:" << nBox <<
nl;
500 forAll(localTgtElems, proci)
502 if (proci == Pstream::myProcNo() && nSrcElems)
504 sendElems[proci] =
identity(nTgtElems);
512 for (
const labelList& elems: procBoxElems)
517 sendElems[proci] = allIDs.toc();
521 fixedSendElems.
clear();
522 localTgtElems.
clear();
526 Pout<<
"Local objects: " << nTgtElems <<
" Send map:" <<
nl
531 Pout<<
tab << proci <<
tab << sendElems[proci].size()
536 return createLODMap(sendElems);
546 const label localProci = Pstream::myProcNo();
548 sendSizes[localProci].
setSize(Pstream::nProcs());
551 sendSizes[localProci][proci] = sendElems[proci].size();
553 Pstream::gatherList(sendSizes);
554 Pstream::scatterList(sendSizes);
561 constructMap[localProci] =
identity(sendElems[localProci].size());
563 label segmenti = constructMap[localProci].size();
564 forAll(constructMap, proci)
566 if (proci != localProci)
569 label nRecv = sendSizes[proci][localProci];
570 constructMap[proci].
setSize(nRecv);
572 for (label& addr : constructMap[proci])
584 std::move(sendElems),
585 std::move(constructMap)
599 const label maxObjectsPerLeaf,
600 const label nObjectsOfType,
601 const label nRefineIterMax
605 srcPoints_(srcPoints),
606 tgtPoints_(tgtPoints),
607 boxes_(Pstream::nProcs()),
608 nRefineIterMax_(nRefineIterMax),
609 newToOld_(Pstream::nProcs()),
610 boxSrcElems_(Pstream::nProcs())
614 if (srcPoints_.size())
626 newProcBoxes.
append(srcBb);