40 namespace processorLODs
54 static label time = 0;
71 const DynamicList<treeBoundBox>& procBoxes = fixedBoxes[proci];
74 const treeBoundBox& bb = procBoxes[boxi];
84 for (
const face&
f : bb.faces)
87 for (
const label fpi :
f)
89 os <<
' ' << fpi + verti + 1;
103 const label refineIter,
104 const label nTgtObjects,
119 toProc << nObjectsOfType_ << boxes_[proci] << newToOld_[proci];
137 UIPstream fromProc(proci, pBufs);
138 const label nObjects =
readLabel(fromProc);
139 List<treeBoundBox> remoteSrcBoxes(fromProc);
140 const List<label> newToOld(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;
162 List<labelList>& localProcTgtElems = localTgtElems[proci];
163 List<labelList> newLocalProcTgtElems(remoteSrcBoxes.size());
165 forAll(remoteSrcBoxes, srcBoxi)
167 const treeBoundBox& remSrcBb = remoteSrcBoxes[srcBoxi];
168 DynamicList<label> selectedElems(maxObjectsPerLeaf_);
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();
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)
266 const treeBoundBox subBb(origBox.
subBbox(octant));
268 for (label srcElemi = 0; srcElemi < nSrcElem; ++srcElemi)
270 if (subBb.overlaps(calcSrcBox(srcElemi)))
285 const treeBoundBox& origBox,
286 DynamicList<treeBoundBox>& procBoxes,
287 DynamicList<labelList>& procBoxElems,
288 DynamicList<label>& procNewToOld
292 for (
direction octant = 0; octant < 8; ++octant)
294 const treeBoundBox subBb(origBox.subBbox(octant));
297 DynamicList<label> newElems(srcAddr.size()/2);
299 for (
const label srcElemi : srcAddr)
301 if (subBb.overlaps(calcSrcBox(srcElemi)))
303 newElems.append(srcElemi);
310 procBoxes.append(subBb);
311 procBoxElems.append(newElems);
312 procNewToOld.append(boxi);
320 const label refineIter,
321 const label nSrcFaces,
322 const List<labelList>& refineFlags,
323 List<DynamicList<treeBoundBox>>& fixedBoxes
329 forAll(refineFlags, proci)
333 UOPstream toProc(proci, pBufs);
334 toProc << refineFlags[proci];
338 pBufs.finishedSends();
342 bool refineBoxes =
false;
353 UIPstream fromProc(proci, pBufs);
356 const List<treeBoundBox>& procBoxes = boxes_[proci];
357 DynamicList<treeBoundBox> newProcBoxes(procBoxes.size());
358 DynamicList<labelList> newProcBoxElems(procBoxes.size());
359 newToOld[proci].setCapacity(boxes_[proci].size());
360 DynamicList<label>& newProcNewToOld = newToOld[proci];
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)
504 sendElems[proci] =
identity(nTgtElems);
510 const List<labelList>& procBoxElems = localTgtElems[proci];
512 for (
const labelList& elems: procBoxElems)
514 allIDs.insert(elems);
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);
551 sendSizes[localProci][proci] = sendElems[proci].size();
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])
579 autoPtr<mapDistribute> mapPtr
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),
608 nRefineIterMax_(nRefineIterMax),
610 boxSrcElems_(
Pstream::nProcs())
626 newProcBoxes.
append(srcBb);