39 template<
class ParticleType>
42 Info<<
"Building InteractionLists with interaction distance "
43 << maxDistance_ <<
endl;
47 const vector interactionVec = maxDistance_*vector::one;
49 treeBoundBox procBb(treeBoundBox(mesh_.points()));
51 treeBoundBox extendedProcBb
53 procBb.min() - interactionVec,
54 procBb.max() + interactionVec
59 allExtendedProcBbs[Pstream::myProcNo()] = extendedProcBb;
61 Pstream::gatherList(allExtendedProcBbs);
63 Pstream::scatterList(allExtendedProcBbs);
65 List<treeBoundBox> extendedProcBbsInRange;
66 List<label> extendedProcBbsTransformIndex;
67 List<label> extendedProcBbsOrigProc;
69 findExtendedProcBbsInRange
73 mesh_.globalData().globalTransforms(),
74 extendedProcBbsInRange,
75 extendedProcBbsTransformIndex,
76 extendedProcBbsOrigProc
83 cellBbs[celli] = treeBoundBox
85 mesh_.cells()[celli].points
93 const globalIndexAndTransform& globalTransforms =
94 mesh_.globalData().globalTransforms();
99 bitSet cellInRangeOfCoupledPatch(mesh_.nCells(),
false);
103 DynamicList<labelPair> cellIAndTToExchange;
105 DynamicList<treeBoundBox> cellBbsToExchange;
107 DynamicList<label> procToDistributeCellTo;
109 forAll(extendedProcBbsInRange, ePBIRI)
111 const treeBoundBox& otherExtendedProcBb =
112 extendedProcBbsInRange[ePBIRI];
114 label transformIndex = extendedProcBbsTransformIndex[ePBIRI];
116 label origProc = extendedProcBbsOrigProc[ePBIRI];
120 const treeBoundBox& cellBb = cellBbs[celli];
122 if (cellBb.overlaps(otherExtendedProcBb))
127 cellInRangeOfCoupledPatch.set(celli);
129 cellIAndTToExchange.append
131 globalTransforms.encode(celli, transformIndex)
134 cellBbsToExchange.append(cellBb);
136 procToDistributeCellTo.append(origProc);
141 buildMap(cellMapPtr_, procToDistributeCellTo);
144 label preDistributionCellMapSize = procToDistributeCellTo.size();
146 cellMap().distribute(cellBbsToExchange);
148 cellMap().distribute(cellIAndTToExchange);
152 DynamicList<label> coupledPatchRangeCells;
154 forAll(cellInRangeOfCoupledPatch, celli)
156 if (cellInRangeOfCoupledPatch[celli])
158 coupledPatchRangeCells.append(celli);
162 treeBoundBox procBbRndExt
164 treeBoundBox(mesh_.points()).extend(
rndGen, 1
e-4)
167 indexedOctree<treeDataCell> coupledPatchRangeTree
173 coupledPatchRangeCells,
182 ril_.setSize(cellBbsToExchange.size());
186 boolList cellBbRequiredByAnyCell(cellBbsToExchange.size(),
false);
188 Info<<
" Building referred interaction lists" <<
endl;
190 forAll(cellBbsToExchange, bbI)
192 const labelPair& ciat = cellIAndTToExchange[bbI];
194 const vectorTensorTransform&
transform = globalTransforms.transform
196 globalTransforms.transformIndex(ciat)
199 treeBoundBox tempTransformedBb
201 transform.invTransformPosition(cellBbsToExchange[bbI].points())
204 treeBoundBox extendedBb
206 tempTransformedBb.min() - interactionVec,
207 tempTransformedBb.max() + interactionVec
213 coupledPatchRangeTree.findBox(extendedBb)
216 if (!interactingElems.empty())
218 cellBbRequiredByAnyCell[bbI] =
true;
221 ril_[bbI].
setSize(interactingElems.size(), -1);
223 forAll(interactingElems, i)
225 label elemI = interactingElems[i];
231 label
c = coupledPatchRangeTree.shapes().cellLabels()[elemI];
254 cellBbsToExchange.setSize(0);
256 cellMap().reverseDistribute
258 preDistributionCellMapSize,
259 cellBbRequiredByAnyCell
262 cellMap().reverseDistribute
264 preDistributionCellMapSize,
271 preDistributionCellMapSize = -1;
278 inplaceSubset(cellBbRequiredByAnyCell, procToDistributeCellTo);
280 preDistributionCellMapSize = procToDistributeCellTo.size();
283 buildMap(cellMapPtr_, procToDistributeCellTo);
286 cellIndexAndTransformToDistribute_.transfer(cellIAndTToExchange);
290 rilInverse_.setSize(mesh_.nCells());
293 List<DynamicList<label>> rilInverseTemp(rilInverse_.size());
298 const labelList& realCells = ril_[refCelli];
304 forAll(realCells, realCelli)
306 rilInverseTemp[realCells[realCelli]].append(refCelli);
310 forAll(rilInverse_, celli)
312 rilInverse_[celli].transfer(rilInverseTemp[celli]);
319 mesh_.boundaryMesh().checkParallelSync(
true);
322 DynamicList<label> localWallFaces;
324 for (
const polyPatch&
patch : mesh_.boundaryMesh())
326 if (isA<wallPolyPatch>(
patch))
330 forAll(areaFraction, facei)
332 if (areaFraction[facei] > 0.5)
334 localWallFaces.append(facei +
patch.start());
348 mesh_.faces()[localWallFaces[i]]
353 DynamicList<labelPair> wallFaceIAndTToExchange;
355 DynamicList<treeBoundBox> wallFaceBbsToExchange;
357 DynamicList<label> procToDistributeWallFaceTo;
359 forAll(extendedProcBbsInRange, ePBIRI)
361 const treeBoundBox& otherExtendedProcBb =
362 extendedProcBbsInRange[ePBIRI];
364 label transformIndex = extendedProcBbsTransformIndex[ePBIRI];
366 label origProc = extendedProcBbsOrigProc[ePBIRI];
370 const treeBoundBox& wallFaceBb = wallFaceBbs[i];
372 if (wallFaceBb.overlaps(otherExtendedProcBb))
377 label wallFacei = localWallFaces[i];
379 wallFaceIAndTToExchange.append
381 globalTransforms.encode(wallFacei, transformIndex)
384 wallFaceBbsToExchange.append(wallFaceBb);
386 procToDistributeWallFaceTo.append(origProc);
391 buildMap(wallFaceMapPtr_, procToDistributeWallFaceTo);
394 label preDistributionWallFaceMapSize = procToDistributeWallFaceTo.size();
396 wallFaceMap().distribute(wallFaceBbsToExchange);
398 wallFaceMap().distribute(wallFaceIAndTToExchange);
400 indexedOctree<treeDataCell> allCellsTree
402 treeDataCell(
true, mesh_, polyMesh::CELL_TETS),
409 rwfil_.setSize(wallFaceBbsToExchange.size());
413 boolList wallFaceBbRequiredByAnyCell(wallFaceBbsToExchange.size(),
false);
415 forAll(wallFaceBbsToExchange, bbI)
417 const labelPair& wfiat = wallFaceIAndTToExchange[bbI];
419 const vectorTensorTransform&
transform = globalTransforms.transform
421 globalTransforms.transformIndex(wfiat)
424 treeBoundBox tempTransformedBb
426 transform.invTransformPosition(wallFaceBbsToExchange[bbI].points())
429 treeBoundBox extendedBb
431 tempTransformedBb.min() - interactionVec,
432 tempTransformedBb.max() + interactionVec
438 coupledPatchRangeTree.findBox(extendedBb)
441 if (!interactingElems.empty())
443 wallFaceBbRequiredByAnyCell[bbI] =
true;
446 rwfil_[bbI].
setSize(interactingElems.size(), -1);
448 forAll(interactingElems, i)
450 label elemI = interactingElems[i];
456 label
c = coupledPatchRangeTree.shapes().cellLabels()[elemI];
479 wallFaceBbsToExchange.setSize(0);
481 wallFaceMap().reverseDistribute
483 preDistributionWallFaceMapSize,
484 wallFaceBbRequiredByAnyCell
487 wallFaceMap().reverseDistribute
489 preDistributionWallFaceMapSize,
490 wallFaceIAndTToExchange
496 preDistributionWallFaceMapSize = -1;
501 inplaceSubset(wallFaceBbRequiredByAnyCell, wallFaceIAndTToExchange);
503 inplaceSubset(wallFaceBbRequiredByAnyCell, procToDistributeWallFaceTo);
505 preDistributionWallFaceMapSize = procToDistributeWallFaceTo.size();
508 buildMap(wallFaceMapPtr_, procToDistributeWallFaceTo);
511 wallFaceIndexAndTransformToDistribute_.transfer(wallFaceIAndTToExchange);
515 rwfilInverse_.setSize(mesh_.nCells());
518 List<DynamicList<label>> rwfilInverseTemp(rwfilInverse_.size());
521 forAll(rwfil_, refWallFacei)
523 const labelList& realCells = rwfil_[refWallFacei];
529 forAll(realCells, realCelli)
531 rwfilInverseTemp[realCells[realCelli]].append(refWallFacei);
535 forAll(rwfilInverse_, celli)
537 rwfilInverse_[celli].transfer(rwfilInverseTemp[celli]);
541 referredWallFaces_.setSize(wallFaceIndexAndTransformToDistribute_.size());
543 forAll(referredWallFaces_, rWFI)
545 const labelPair& wfiat = wallFaceIndexAndTransformToDistribute_[rWFI];
547 label wallFaceIndex = globalTransforms.index(wfiat);
549 const vectorTensorTransform&
transform = globalTransforms.transform
551 globalTransforms.transformIndex(wfiat)
554 const face&
f = mesh_.faces()[wallFaceIndex];
556 label patchi = mesh_.boundaryMesh().patchID()
558 wallFaceIndex - mesh_.nInternalFaces()
561 referredWallFaces_[rWFI] = referredWallFace
564 transform.invTransformPosition(
f.points(mesh_.points())),
569 wallFaceMap().distribute(referredWallFaces_);
573 writeReferredWallFaces();
578 Info<<
" Building direct interaction lists" <<
endl;
580 indexedOctree<treeDataFace> wallFacesTree
582 treeDataFace(
true, mesh_, localWallFaces),
589 dil_.setSize(mesh_.nCells());
591 dwfil_.setSize(mesh_.nCells());
595 const treeBoundBox& cellBb = cellBbs[celli];
597 treeBoundBox extendedBb
599 cellBb.min() - interactionVec,
600 cellBb.max() + interactionVec
604 labelList interactingElems(allCellsTree.findBox(extendedBb));
607 DynamicList<label> cellDIL(interactingElems.size());
609 for (
const label elemi : interactingElems)
611 const label
c = allCellsTree.shapes().cellLabels()[elemi];
625 dil_[celli].transfer(cellDIL);
628 interactingElems = wallFacesTree.findBox(extendedBb);
630 dwfil_[celli].setSize(interactingElems.size(), -1);
632 forAll(interactingElems, i)
634 const label elemi = interactingElems[i];
636 const label
f = wallFacesTree.shapes().faceLabels()[elemi];
638 dwfil_[celli][i] =
f;
644 template<
class ParticleType>
647 const treeBoundBox& procBb,
648 const List<treeBoundBox>& allExtendedProcBbs,
649 const globalIndexAndTransform& globalTransforms,
650 List<treeBoundBox>& extendedProcBbsInRange,
651 List<label>& extendedProcBbsTransformIndex,
652 List<label>& extendedProcBbsOrigProc
655 extendedProcBbsInRange.setSize(0);
656 extendedProcBbsTransformIndex.setSize(0);
657 extendedProcBbsOrigProc.setSize(0);
659 DynamicList<treeBoundBox> tmpExtendedProcBbsInRange;
660 DynamicList<label> tmpExtendedProcBbsTransformIndex;
661 DynamicList<label> tmpExtendedProcBbsOrigProc;
663 label nTrans = globalTransforms.nIndependentTransforms();
665 forAll(allExtendedProcBbs, proci)
669 if (nTrans == 0 && proci != Pstream::myProcNo())
671 treeBoundBox extendedReferredProcBb = allExtendedProcBbs[proci];
673 if (procBb.overlaps(extendedReferredProcBb))
675 tmpExtendedProcBbsInRange.append(extendedReferredProcBb);
679 tmpExtendedProcBbsTransformIndex.append(0);
681 tmpExtendedProcBbsOrigProc.append(proci);
684 else if (nTrans == 3)
686 label& i = permutationIndices[0];
687 label& j = permutationIndices[1];
688 label&
k = permutationIndices[2];
690 for (i = -1; i <= 1; i++)
692 for (j = -1; j <= 1; j++)
694 for (
k = -1;
k <= 1;
k++)
701 && proci == Pstream::myProcNo()
709 label transI = globalTransforms.encodeTransformIndex
715 globalTransforms.transform(transI);
717 treeBoundBox extendedReferredProcBb
721 allExtendedProcBbs[proci].points()
725 if (procBb.overlaps(extendedReferredProcBb))
727 tmpExtendedProcBbsInRange.append
729 extendedReferredProcBb
732 tmpExtendedProcBbsTransformIndex.append(transI);
734 tmpExtendedProcBbsOrigProc.append(proci);
740 else if (nTrans == 2)
742 label& i = permutationIndices[0];
743 label& j = permutationIndices[1];
745 for (i = -1; i <= 1; i++)
747 for (j = -1; j <= 1; j++)
749 if (i == 0 && j == 0 && proci == Pstream::myProcNo())
756 label transI = globalTransforms.encodeTransformIndex
762 globalTransforms.transform(transI);
764 treeBoundBox extendedReferredProcBb
768 allExtendedProcBbs[proci].points()
772 if (procBb.overlaps(extendedReferredProcBb))
774 tmpExtendedProcBbsInRange.append
776 extendedReferredProcBb
779 tmpExtendedProcBbsTransformIndex.append(transI);
781 tmpExtendedProcBbsOrigProc.append(proci);
786 else if (nTrans == 1)
788 label& i = permutationIndices[0];
790 for (i = -1; i <= 1; i++)
792 if (i == 0 && proci == Pstream::myProcNo())
799 label transI = globalTransforms.encodeTransformIndex
805 globalTransforms.transform(transI);
807 treeBoundBox extendedReferredProcBb
811 allExtendedProcBbs[proci].points()
815 if (procBb.overlaps(extendedReferredProcBb))
817 tmpExtendedProcBbsInRange.append
819 extendedReferredProcBb
822 tmpExtendedProcBbsTransformIndex.append(transI);
824 tmpExtendedProcBbsOrigProc.append(proci);
830 extendedProcBbsInRange.transfer(tmpExtendedProcBbsInRange);
831 extendedProcBbsTransformIndex.transfer(tmpExtendedProcBbsTransformIndex);
832 extendedProcBbsOrigProc.transfer(tmpExtendedProcBbsOrigProc);
836 template<
class ParticleType>
839 autoPtr<mapDistribute>& mapPtr,
840 const List<label>& toProc
849 for (
const label proci : toProc)
859 sendMap[proci].setSize(nSend[proci]);
867 label proci = toProc[i];
869 sendMap[proci][nSend[proci]++] = i;
874 Pstream::exchangeSizes(sendMap, recvSizes);
883 constructMap[Pstream::myProcNo()] =
identity
885 sendMap[Pstream::myProcNo()].size()
888 label constructSize = constructMap[Pstream::myProcNo()].size();
890 forAll(constructMap, proci)
892 if (proci != Pstream::myProcNo())
894 const label nRecv = recvSizes[proci];
896 constructMap[proci].setSize(nRecv);
898 for (label i = 0; i < nRecv; i++)
900 constructMap[proci][i] = constructSize++;
911 std::move(constructMap)
917 template<
class ParticleType>
923 const globalIndexAndTransform& globalTransforms =
924 mesh_.globalData().globalTransforms();
926 referredParticles_.setSize(cellIndexAndTransformToDistribute_.size());
930 forAll(referredParticles_, i)
932 referredParticles_[i].clear();
938 forAll(cellIndexAndTransformToDistribute_, i)
940 const labelPair ciat = cellIndexAndTransformToDistribute_[i];
942 label cellIndex = globalTransforms.index(ciat);
944 List<ParticleType*> realParticles =
cellOccupancy[cellIndex];
946 IDLList<ParticleType>& particlesToRefer = referredParticles_[i];
950 const ParticleType& particle = *realParticles[rM];
952 particlesToRefer.append(particle.clone().ptr());
954 prepareParticleToBeReferred(particlesToRefer.last(), ciat);
960 template<
class ParticleType>
963 ParticleType* particle,
967 const globalIndexAndTransform& globalTransforms =
968 mesh_.globalData().globalTransforms();
970 const vectorTensorTransform&
transform = globalTransforms.transform
972 globalTransforms.transformIndex(ciat)
975 particle->prepareForInteractionListReferral(
transform);
979 template<
class ParticleType>
984 forAll(referredParticles_, refCelli)
986 const IDLList<ParticleType>& refCell =
987 referredParticles_[refCelli];
989 for (
const ParticleType&
p : refCell)
993 static_cast<ParticleType*
>(
p.clone().ptr())
1001 template<
class ParticleType>
1004 const globalIndexAndTransform& globalTransforms =
1005 mesh_.globalData().globalTransforms();
1007 referredWallData_.setSize
1009 wallFaceIndexAndTransformToDistribute_.size()
1014 forAll(referredWallData_, rWVI)
1016 const labelPair& wfiat = wallFaceIndexAndTransformToDistribute_[rWVI];
1018 label wallFaceIndex = globalTransforms.index(wfiat);
1020 const vectorTensorTransform&
transform = globalTransforms.transform
1022 globalTransforms.transformIndex(wfiat)
1025 label patchi = mesh_.boundaryMesh().patchID()
1027 wallFaceIndex - mesh_.nInternalFaces()
1032 - mesh_.boundaryMesh()[patchi].start();
1036 referredWallData_[rWVI] =
U.boundaryField()[patchi][patchFacei];
1040 referredWallData_[rWVI] =
1041 transform.R().T() & referredWallData_[rWVI];
1047 template<
class ParticleType>
1050 if (referredWallFaces_.empty())
1055 fileName objDir = mesh_.time().timePath()/cloud::prefix;
1059 fileName objFileName =
"referredWallFaces.obj";
1061 OFstream str(objDir/objFileName);
1064 << mesh_.time().timeName()/cloud::prefix/objFileName
1069 forAll(referredWallFaces_, rWFI)
1071 const referredWallFace& rwf = referredWallFaces_[rWFI];
1082 str<<
' ' << fPtI + offset;
1087 offset += rwf.size();
1094 template<
class ParticleType>
1098 cloud_(mesh_,
"nullptr_Cloud",
IDLList<ParticleType>()),
1107 cellIndexAndTransformToDistribute_(),
1108 wallFaceIndexAndTransformToDistribute_(),
1109 referredWallFaces_(),
1110 UName_(
"unknown_U"),
1111 referredWallData_(),
1112 referredParticles_()
1116 template<
class ParticleType>
1127 writeCloud_(writeCloud),
1130 maxDistance_(maxDistance),
1135 cellIndexAndTransformToDistribute_(),
1136 wallFaceIndexAndTransformToDistribute_(),
1137 referredWallFaces_(),
1139 referredWallData_(),
1140 referredParticles_()
1142 buildInteractionLists();
1148 template<
class ParticleType>
1155 template<
class ParticleType>
1162 if (mesh_.changing())
1165 <<
"Mesh changing, rebuilding InteractionLists form scratch."
1168 buildInteractionLists();
1171 prepareWallDataToRefer();
1175 for (label domain = 0; domain < Pstream::nProcs(); domain++)
1177 const labelList& subMap = cellMap().subMap()[domain];
1189 forAll(subMappedParticles, i)
1191 toDomain << subMappedParticles[i];
1199 wallFaceMap().send(pBufs, referredWallData_);
1203 template<
class ParticleType>
1207 const label startOfRequests
1210 Pstream::waitRequests(startOfRequests);
1212 referredParticles_.setSize(cellMap().constructSize());
1214 for (label domain = 0; domain < Pstream::nProcs(); domain++)
1216 const labelList& constructMap = cellMap().constructMap()[domain];
1218 if (constructMap.size())
1227 typename ParticleType::iNew(mesh_)
1233 forAll(referredParticles_, refCelli)
1236 for (ParticleType&
p : refCell)
1238 p.correctAfterInteractionListReferral(ril_[refCelli][0]);
1242 fillReferredParticleCloud();
1244 wallFaceMap().receive(pBufs, referredWallData_);