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,
330 forAll(refineFlags, proci)
332 if (proci != Pstream::myProcNo())
335 toProc << nElems[proci] << refineFlags[proci];
343 bool refineBoxes =
false;
348 for (
const int proci : Pstream::allProcs())
350 if (proci == Pstream::myProcNo())
362 newToOld[proci].setCapacity(boxes_[proci].size());
368 if (refineFlags[boxi] == DROP)
372 else if (refineFlags[boxi] == REFINE)
374 if (refineIter > nStartUpIter)
381 boxSrcElems_[proci][boxi],
404 else if (refineFlags[boxi] == FIXED)
406 fixedBoxes[proci].append(procBoxes[boxi]);
411 <<
"Unhandled refine action " << refineFlags[boxi]
417 boxes_[proci].transfer(newProcBoxes);
418 boxSrcElems_[proci].transfer(newProcBoxElems);
419 newToOld_[proci].transfer(newProcNewToOld);
428 const label nSrcElems,
429 const label nTgtElems
443 label refinementIter = 1;
444 bool refineSrcBoxes =
true;
445 while (refineSrcBoxes && (refinementIter <= nRefineIterMax_))
482 allBoxes[proci].
append(boxes_[proci]);
484 writeBoxes(allBoxes, refinementIter);
490 Pout<<
"Local src boxes after " << refinementIter-1 <<
" iterations:"
496 label nBox = fixedBoxes[proci].size() + boxes_[proci].size();
497 Pout<<
" proc:" << proci <<
" nBoxes:" << nBox <<
nl;
504 forAll(localTgtElems, proci)
506 if (proci == Pstream::myProcNo() && nSrcElems)
508 sendElems[proci] =
identity(nTgtElems);
516 for (
const labelList& elems: procBoxElems)
521 sendElems[proci] = allIDs.
toc();
525 fixedSendElems.
clear();
526 localTgtElems.
clear();
530 Pout<<
"Local objects: " << nTgtElems <<
" Send map:" <<
nl
535 Pout<<
tab << proci <<
tab << sendElems[proci].size()
540 return createLODMap(sendElems);
550 const label localProci = Pstream::myProcNo();
552 sendSizes[localProci].
setSize(Pstream::nProcs());
555 sendSizes[localProci][proci] = sendElems[proci].size();
557 Pstream::gatherList(sendSizes);
558 Pstream::scatterList(sendSizes);
565 constructMap[localProci] =
identity(sendElems[localProci].size());
567 label segmenti = constructMap[localProci].size();
568 forAll(constructMap, proci)
570 if (proci != localProci)
573 label nRecv = sendSizes[proci][localProci];
574 constructMap[proci].
setSize(nRecv);
576 for (label& addr : constructMap[proci])
588 std::move(sendElems),
589 std::move(constructMap)
603 const label maxObjectsPerLeaf,
604 const label nObjectsOfType,
605 const label nRefineIterMax
609 srcPoints_(srcPoints),
610 tgtPoints_(tgtPoints),
611 boxes_(Pstream::nProcs()),
612 nRefineIterMax_(nRefineIterMax),
613 newToOld_(Pstream::nProcs()),
614 boxSrcElems_(Pstream::nProcs())
618 if (srcPoints_.size())
630 newProcBoxes.
append(srcBb);