36 template<
class ParticleType>
39 Info<<
"Building InteractionLists with interaction distance "
40 << maxDistance_ <<
endl;
44 const vector interactionVec = maxDistance_*vector::one;
50 procBb.
min() - interactionVec,
51 procBb.
max() + interactionVec
56 allExtendedProcBbs[Pstream::myProcNo()] = extendedProcBb;
58 Pstream::gatherList(allExtendedProcBbs);
60 Pstream::scatterList(allExtendedProcBbs);
66 findExtendedProcBbsInRange
70 mesh_.globalData().globalTransforms(),
71 extendedProcBbsInRange,
72 extendedProcBbsTransformIndex,
73 extendedProcBbsOrigProc
82 mesh_.cells()[cellI].points
91 mesh_.globalData().globalTransforms();
106 forAll(extendedProcBbsInRange, ePBIRI)
109 extendedProcBbsInRange[ePBIRI];
111 label transformIndex = extendedProcBbsTransformIndex[ePBIRI];
113 label origProc = extendedProcBbsOrigProc[ePBIRI];
119 if (cellBb.
overlaps(otherExtendedProcBb))
124 cellInRangeOfCoupledPatch[cellI] =
true;
126 cellIAndTToExchange.
append
128 globalTransforms.
encode(cellI, transformIndex)
131 cellBbsToExchange.
append(cellBb);
133 procToDistributeCellTo.
append(origProc);
138 buildMap(cellMapPtr_, procToDistributeCellTo);
141 label preDistributionCellMapSize = procToDistributeCellTo.size();
143 cellMap().distribute(cellBbsToExchange);
145 cellMap().distribute(cellIAndTToExchange);
151 forAll(cellInRangeOfCoupledPatch, cellI)
153 if (cellInRangeOfCoupledPatch[cellI])
155 coupledPatchRangeCells.
append(cellI);
170 coupledPatchRangeCells,
179 ril_.setSize(cellBbsToExchange.size());
183 boolList cellBbRequiredByAnyCell(cellBbsToExchange.size(),
false);
185 Info<<
" Building referred interaction lists" <<
endl;
187 forAll(cellBbsToExchange, bbI)
189 const labelPair& ciat = cellIAndTToExchange[bbI];
198 transform.invTransformPosition(cellBbsToExchange[bbI].points())
203 tempTransformedBb.
min() - interactionVec,
204 tempTransformedBb.
max() + interactionVec
210 coupledPatchRangeTree.
findBox(extendedBb)
213 if (!interactingElems.empty())
215 cellBbRequiredByAnyCell[bbI] =
true;
220 forAll(interactingElems, i)
222 label elemI = interactingElems[i];
228 label c = coupledPatchRangeTree.
shapes().cellLabels()[elemI];
253 cellMap().reverseDistribute
255 preDistributionCellMapSize,
256 cellBbRequiredByAnyCell
259 cellMap().reverseDistribute
261 preDistributionCellMapSize,
268 preDistributionCellMapSize = -1;
275 inplaceSubset(cellBbRequiredByAnyCell, procToDistributeCellTo);
277 preDistributionCellMapSize = procToDistributeCellTo.size();
280 buildMap(cellMapPtr_, procToDistributeCellTo);
283 cellIndexAndTransformToDistribute_.transfer(cellIAndTToExchange);
287 rilInverse_.setSize(mesh_.nCells());
295 const labelList& realCells = ril_[refCellI];
301 forAll(realCells, realCellI)
303 rilInverseTemp[realCells[realCellI]].
append(refCellI);
307 forAll(rilInverse_, cellI)
309 rilInverse_[cellI].transfer(rilInverseTemp[cellI]);
316 mesh_.boundaryMesh().checkParallelSync(
true);
321 forAll(mesh_.boundaryMesh(), patchI)
325 if (isA<wallPolyPatch>(patch))
337 mesh_.faces()[localWallFaces[i]].points(mesh_.points())
348 forAll(extendedProcBbsInRange, ePBIRI)
351 extendedProcBbsInRange[ePBIRI];
353 label transformIndex = extendedProcBbsTransformIndex[ePBIRI];
355 label origProc = extendedProcBbsOrigProc[ePBIRI];
361 if (wallFaceBb.
overlaps(otherExtendedProcBb))
366 label wallFaceI = localWallFaces[i];
368 wallFaceIAndTToExchange.
append
370 globalTransforms.
encode(wallFaceI, transformIndex)
373 wallFaceBbsToExchange.
append(wallFaceBb);
375 procToDistributeWallFaceTo.
append(origProc);
380 buildMap(wallFaceMapPtr_, procToDistributeWallFaceTo);
383 label preDistributionWallFaceMapSize = procToDistributeWallFaceTo.size();
385 wallFaceMap().distribute(wallFaceBbsToExchange);
387 wallFaceMap().distribute(wallFaceIAndTToExchange);
398 rwfil_.setSize(wallFaceBbsToExchange.size());
402 boolList wallFaceBbRequiredByAnyCell(wallFaceBbsToExchange.size(),
false);
404 forAll(wallFaceBbsToExchange, bbI)
406 const labelPair& wfiat = wallFaceIAndTToExchange[bbI];
415 transform.invTransformPosition(wallFaceBbsToExchange[bbI].points())
420 tempTransformedBb.
min() - interactionVec,
421 tempTransformedBb.
max() + interactionVec
427 coupledPatchRangeTree.
findBox(extendedBb)
430 if (!interactingElems.empty())
432 wallFaceBbRequiredByAnyCell[bbI] =
true;
437 forAll(interactingElems, i)
439 label elemI = interactingElems[i];
445 label c = coupledPatchRangeTree.
shapes().cellLabels()[elemI];
468 wallFaceBbsToExchange.
setSize(0);
470 wallFaceMap().reverseDistribute
472 preDistributionWallFaceMapSize,
473 wallFaceBbRequiredByAnyCell
476 wallFaceMap().reverseDistribute
478 preDistributionWallFaceMapSize,
479 wallFaceIAndTToExchange
485 preDistributionWallFaceMapSize = -1;
490 inplaceSubset(wallFaceBbRequiredByAnyCell, wallFaceIAndTToExchange);
492 inplaceSubset(wallFaceBbRequiredByAnyCell, procToDistributeWallFaceTo);
494 preDistributionWallFaceMapSize = procToDistributeWallFaceTo.size();
497 buildMap(wallFaceMapPtr_, procToDistributeWallFaceTo);
500 wallFaceIndexAndTransformToDistribute_.transfer(wallFaceIAndTToExchange);
504 rwfilInverse_.setSize(mesh_.nCells());
510 forAll(rwfil_, refWallFaceI)
512 const labelList& realCells = rwfil_[refWallFaceI];
518 forAll(realCells, realCellI)
520 rwfilInverseTemp[realCells[realCellI]].
append(refWallFaceI);
524 forAll(rwfilInverse_, cellI)
526 rwfilInverse_[cellI].transfer(rwfilInverseTemp[cellI]);
530 referredWallFaces_.setSize(wallFaceIndexAndTransformToDistribute_.size());
532 forAll(referredWallFaces_, rWFI)
534 const labelPair& wfiat = wallFaceIndexAndTransformToDistribute_[rWFI];
536 label wallFaceIndex = globalTransforms.
index(wfiat);
543 const face&
f = mesh_.faces()[wallFaceIndex];
545 label patchI = mesh_.boundaryMesh().patchID()
547 wallFaceIndex - mesh_.nInternalFaces()
553 transform.invTransformPosition(
f.points(mesh_.points())),
558 wallFaceMap().distribute(referredWallFaces_);
562 writeReferredWallFaces();
567 Info<<
" Building direct interaction lists" <<
endl;
578 dil_.setSize(mesh_.nCells());
580 dwfil_.setSize(mesh_.nCells());
588 cellBb.
min() - interactionVec,
589 cellBb.
max() + interactionVec
598 forAll(interactingElems, i)
600 label elemI = interactingElems[i];
616 dil_[cellI].transfer(cellDIL);
619 interactingElems = wallFacesTree.
findBox(extendedBb);
621 dwfil_[cellI].setSize(interactingElems.
size(), -1);
623 forAll(interactingElems, i)
625 label elemI = interactingElems[i];
629 dwfil_[cellI][i] =
f;
635 template<
class ParticleType>
646 extendedProcBbsInRange.
setSize(0);
647 extendedProcBbsTransformIndex.
setSize(0);
648 extendedProcBbsOrigProc.
setSize(0);
656 forAll(allExtendedProcBbs, procI)
660 if (nTrans == 0 && procI != Pstream::myProcNo())
662 treeBoundBox extendedReferredProcBb = allExtendedProcBbs[procI];
664 if (procBb.
overlaps(extendedReferredProcBb))
666 tmpExtendedProcBbsInRange.
append(extendedReferredProcBb);
670 tmpExtendedProcBbsTransformIndex.
append(0);
672 tmpExtendedProcBbsOrigProc.
append(procI);
675 else if (nTrans == 3)
677 label& i = permutationIndices[0];
678 label& j = permutationIndices[1];
679 label&
k = permutationIndices[2];
681 for (i = -1; i <= 1; i++)
683 for (j = -1; j <= 1; j++)
685 for (
k = -1;
k <= 1;
k++)
692 && procI == Pstream::myProcNo()
712 allExtendedProcBbs[procI].points()
716 if (procBb.
overlaps(extendedReferredProcBb))
718 tmpExtendedProcBbsInRange.
append
720 extendedReferredProcBb
723 tmpExtendedProcBbsTransformIndex.
append(transI);
725 tmpExtendedProcBbsOrigProc.
append(procI);
731 else if (nTrans == 2)
733 label& i = permutationIndices[0];
734 label& j = permutationIndices[1];
736 for (i = -1; i <= 1; i++)
738 for (j = -1; j <= 1; j++)
740 if (i == 0 && j == 0 && procI == Pstream::myProcNo())
759 allExtendedProcBbs[procI].points()
763 if (procBb.
overlaps(extendedReferredProcBb))
765 tmpExtendedProcBbsInRange.
append
767 extendedReferredProcBb
770 tmpExtendedProcBbsTransformIndex.
append(transI);
772 tmpExtendedProcBbsOrigProc.
append(procI);
777 else if (nTrans == 1)
779 label& i = permutationIndices[0];
781 for (i = -1; i <= 1; i++)
783 if (i == 0 && procI == Pstream::myProcNo())
802 allExtendedProcBbs[procI].points()
806 if (procBb.
overlaps(extendedReferredProcBb))
808 tmpExtendedProcBbsInRange.
append
810 extendedReferredProcBb
813 tmpExtendedProcBbsTransformIndex.
append(transI);
815 tmpExtendedProcBbsOrigProc.
append(procI);
821 extendedProcBbsInRange = tmpExtendedProcBbsInRange.
xfer();
822 extendedProcBbsTransformIndex = tmpExtendedProcBbsTransformIndex.
xfer();
823 extendedProcBbsOrigProc = tmpExtendedProcBbsOrigProc.
xfer();
827 template<
class ParticleType>
842 label procI = toProc[i];
852 sendSizes[Pstream::myProcNo()] = nSend;
861 sendMap[procI].
setSize(nSend[procI]);
869 label procI = toProc[i];
871 sendMap[procI][nSend[procI]++] = i;
880 constructMap[Pstream::myProcNo()] =
identity
882 sendMap[Pstream::myProcNo()].size()
885 label constructSize = constructMap[Pstream::myProcNo()].
size();
887 forAll(constructMap, procI)
889 if (procI != Pstream::myProcNo())
891 label nRecv = sendSizes[procI][Pstream::myProcNo()];
893 constructMap[procI].
setSize(nRecv);
895 for (
label i = 0; i < nRecv; i++)
897 constructMap[procI][i] = constructSize++;
914 template<
class ParticleType>
921 mesh_.globalData().globalTransforms();
923 referredParticles_.setSize(cellIndexAndTransformToDistribute_.size());
927 forAll(referredParticles_, i)
929 referredParticles_[i].clear();
935 forAll(cellIndexAndTransformToDistribute_, i)
937 const labelPair ciat = cellIndexAndTransformToDistribute_[i];
939 label cellIndex = globalTransforms.
index(ciat);
947 const ParticleType&
particle = *realParticles[rM];
951 prepareParticleToBeReferred(particlesToRefer.last(), ciat);
957 template<
class ParticleType>
965 mesh_.globalData().globalTransforms();
983 template<
class ParticleType>
988 forAll(referredParticles_, refCellI)
991 referredParticles_[refCellI];
997 static_cast<ParticleType*
>(iter().clone().ptr())
1005 template<
class ParticleType>
1009 mesh_.globalData().globalTransforms();
1011 referredWallData_.setSize
1013 wallFaceIndexAndTransformToDistribute_.size()
1018 forAll(referredWallData_, rWVI)
1020 const labelPair& wfiat = wallFaceIndexAndTransformToDistribute_[rWVI];
1022 label wallFaceIndex = globalTransforms.
index(wfiat);
1029 label patchI = mesh_.boundaryMesh().patchID()
1031 wallFaceIndex - mesh_.nInternalFaces()
1036 - mesh_.boundaryMesh()[patchI].start();
1040 referredWallData_[rWVI] =
U.boundaryField()[patchI][patchFaceI];
1044 referredWallData_[rWVI] =
1045 transform.R().T() & referredWallData_[rWVI];
1051 template<
class ParticleType>
1054 if (referredWallFaces_.empty())
1059 fileName objDir = mesh_.time().timePath()/cloud::prefix;
1063 fileName objFileName =
"referredWallFaces.obj";
1068 << mesh_.time().timeName()/cloud::prefix/objFileName
1073 forAll(referredWallFaces_, rWFI)
1086 str<<
' ' << fPtI + offset;
1091 offset += rwf.
size();
1098 template<
class ParticleType>
1102 cloud_(mesh_,
"NULL_Cloud",
IDLList<ParticleType>()),
1111 cellIndexAndTransformToDistribute_(),
1112 wallFaceIndexAndTransformToDistribute_(),
1113 referredWallFaces_(),
1114 UName_(
"unknown_UName"),
1115 referredWallData_(),
1116 referredParticles_()
1120 template<
class ParticleType>
1131 writeCloud_(writeCloud),
1134 maxDistance_(maxDistance),
1139 cellIndexAndTransformToDistribute_(),
1140 wallFaceIndexAndTransformToDistribute_(),
1141 referredWallFaces_(),
1143 referredWallData_(),
1144 referredParticles_()
1146 buildInteractionLists();
1152 template<
class ParticleType>
1159 template<
class ParticleType>
1166 if (mesh_.changing())
1169 <<
"Mesh changing, rebuilding InteractionLists form scratch."
1172 buildInteractionLists();
1175 prepareWallDataToRefer();
1179 for (
label domain = 0; domain < Pstream::nProcs(); domain++)
1181 const labelList& subMap = cellMap().subMap()[domain];
1193 forAll(subMappedParticles, i)
1195 toDomain << subMappedParticles[i];
1203 wallFaceMap().send(pBufs, referredWallData_);
1207 template<
class ParticleType>
1211 const label startOfRequests
1214 Pstream::waitRequests(startOfRequests);
1216 referredParticles_.setSize(cellMap().constructSize());
1218 for (
label domain = 0; domain < Pstream::nProcs(); domain++)
1220 const labelList& constructMap = cellMap().constructMap()[domain];
1222 if (constructMap.
size())
1231 typename ParticleType::iNew(mesh_)
1237 fillReferredParticleCloud();
1239 wallFaceMap().receive(pBufs, referredWallData_);