322 mesh_.faces()[localWallFaces[i]]
333 forAll(extendedProcBbsInRange, ePBIRI)
336 extendedProcBbsInRange[ePBIRI];
338 label transformIndex = extendedProcBbsTransformIndex[ePBIRI];
340 label origProc = extendedProcBbsOrigProc[ePBIRI];
346 if (wallFaceBb.
overlaps(otherExtendedProcBb))
351 label wallFacei = localWallFaces[i];
353 wallFaceIAndTToExchange.
append
355 globalTransforms.encode(wallFacei, transformIndex)
358 wallFaceBbsToExchange.
append(wallFaceBb);
360 procToDistributeWallFaceTo.
append(origProc);
365 buildMap(wallFaceMapPtr_, procToDistributeWallFaceTo);
368 label preDistributionWallFaceMapSize = procToDistributeWallFaceTo.
size();
370 wallFaceMap().distribute(wallFaceBbsToExchange);
372 wallFaceMap().distribute(wallFaceIAndTToExchange);
374 indexedOctree<treeDataCell> allCellsTree
376 treeDataCell(
true, mesh_, polyMesh::CELL_TETS),
383 rwfil_.setSize(wallFaceBbsToExchange.
size());
387 boolList wallFaceBbRequiredByAnyCell(wallFaceBbsToExchange.
size(),
false);
389 forAll(wallFaceBbsToExchange, bbI)
391 const labelPair& wfiat = wallFaceIAndTToExchange[bbI];
395 globalTransforms.transformIndex(wfiat)
398 treeBoundBox extendedBb
400 transform.invTransformPosition(wallFaceBbsToExchange[bbI].points())
402 extendedBb.grow(maxDistance_);
407 coupledPatchRangeTree.findBox(extendedBb)
410 if (!interactingElems.empty())
412 wallFaceBbRequiredByAnyCell[bbI] =
true;
415 rwfil_[bbI].setSize(interactingElems.size(), -1);
417 forAll(interactingElems, i)
419 label elemI = interactingElems[i];
425 label
c = coupledPatchRangeTree.shapes().objectIndex(elemI);
448 wallFaceBbsToExchange.
clear();
450 wallFaceMap().reverseDistribute
452 preDistributionWallFaceMapSize,
453 wallFaceBbRequiredByAnyCell
456 wallFaceMap().reverseDistribute
458 preDistributionWallFaceMapSize,
459 wallFaceIAndTToExchange
465 preDistributionWallFaceMapSize = -1;
470 inplaceSubset(wallFaceBbRequiredByAnyCell, wallFaceIAndTToExchange);
472 inplaceSubset(wallFaceBbRequiredByAnyCell, procToDistributeWallFaceTo);
474 preDistributionWallFaceMapSize = procToDistributeWallFaceTo.
size();
477 buildMap(wallFaceMapPtr_, procToDistributeWallFaceTo);
480 wallFaceIndexAndTransformToDistribute_.transfer(wallFaceIAndTToExchange);
484 rwfilInverse_.setSize(mesh_.nCells());
487 List<DynamicList<label>> rwfilInverseTemp(rwfilInverse_.size());
490 forAll(rwfil_, refWallFacei)
492 const labelList& realCells = rwfil_[refWallFacei];
498 forAll(realCells, realCelli)
500 rwfilInverseTemp[realCells[realCelli]].
append(refWallFacei);
504 forAll(rwfilInverse_, celli)
506 rwfilInverse_[celli].transfer(rwfilInverseTemp[celli]);
510 referredWallFaces_.setSize(wallFaceIndexAndTransformToDistribute_.size());
512 forAll(referredWallFaces_, rWFI)
514 const labelPair& wfiat = wallFaceIndexAndTransformToDistribute_[rWFI];
516 label wallFaceIndex = globalTransforms.index(wfiat);
520 globalTransforms.transformIndex(wfiat)
523 const face&
f = mesh_.faces()[wallFaceIndex];
525 const label patchi = mesh_.boundaryMesh().patchID(wallFaceIndex);
527 referredWallFaces_[rWFI] = referredWallFace
530 transform.invTransformPosition(
f.points(mesh_.points())),
535 wallFaceMap().distribute(referredWallFaces_);
539 writeReferredWallFaces();
544 Info<<
" Building direct interaction lists" <<
endl;
546 indexedOctree<treeDataFace> wallFacesTree
548 treeDataFace(
true, mesh_, localWallFaces),
555 dil_.setSize(mesh_.nCells());
557 dwfil_.setSize(mesh_.nCells());
561 const treeBoundBox& cellBb = cellBbs[celli];
563 treeBoundBox extendedBb(cellBb);
564 extendedBb.grow(maxDistance_);
567 labelList interactingElems(allCellsTree.findBox(extendedBb));
570 DynamicList<label> cellDIL(interactingElems.size());
572 for (
const label elemi : interactingElems)
574 const label
c = allCellsTree.shapes().objectIndex(elemi);
588 dil_[celli].transfer(cellDIL);
591 interactingElems = wallFacesTree.findBox(extendedBb);
593 dwfil_[celli].setSize(interactingElems.size(), -1);
595 forAll(interactingElems, i)
597 const label elemi = interactingElems[i];
599 const label
f = wallFacesTree.shapes().objectIndex(elemi);
601 dwfil_[celli][i] =
f;
607template<
class ParticleType>
608void Foam::InteractionLists<ParticleType>::findExtendedProcBbsInRange
610 const treeBoundBox& procBb,
611 const List<treeBoundBox>& allExtendedProcBbs,
612 const globalIndexAndTransform& globalTransforms,
613 List<treeBoundBox>& extendedProcBbsInRange,
614 List<label>& extendedProcBbsTransformIndex,
615 List<label>& extendedProcBbsOrigProc
618 extendedProcBbsInRange.clear();
619 extendedProcBbsTransformIndex.clear();
620 extendedProcBbsOrigProc.clear();
622 DynamicList<treeBoundBox> tmpExtendedProcBbsInRange;
623 DynamicList<label> tmpExtendedProcBbsTransformIndex;
624 DynamicList<label> tmpExtendedProcBbsOrigProc;
626 label nTrans = globalTransforms.nIndependentTransforms();
628 forAll(allExtendedProcBbs, proci)
630 labelList permutationIndices(nTrans, Zero);
632 if (nTrans == 0 && proci != Pstream::myProcNo())
634 treeBoundBox extendedReferredProcBb = allExtendedProcBbs[proci];
636 if (procBb.overlaps(extendedReferredProcBb))
638 tmpExtendedProcBbsInRange.append(extendedReferredProcBb);
642 tmpExtendedProcBbsTransformIndex.append(0);
644 tmpExtendedProcBbsOrigProc.append(proci);
647 else if (nTrans == 3)
649 label& i = permutationIndices[0];
650 label& j = permutationIndices[1];
651 label&
k = permutationIndices[2];
653 for (i = -1; i <= 1; i++)
655 for (j = -1; j <= 1; j++)
657 for (
k = -1;
k <= 1;
k++)
664 && proci == Pstream::myProcNo()
672 label transI = globalTransforms.encodeTransformIndex
680 treeBoundBox extendedReferredProcBb
684 allExtendedProcBbs[proci].points()
688 if (procBb.overlaps(extendedReferredProcBb))
690 tmpExtendedProcBbsInRange.append
692 extendedReferredProcBb
695 tmpExtendedProcBbsTransformIndex.append(transI);
697 tmpExtendedProcBbsOrigProc.append(proci);
703 else if (nTrans == 2)
705 label& i = permutationIndices[0];
706 label& j = permutationIndices[1];
708 for (i = -1; i <= 1; i++)
710 for (j = -1; j <= 1; j++)
712 if (i == 0 && j == 0 && proci == Pstream::myProcNo())
719 label transI = globalTransforms.encodeTransformIndex
727 treeBoundBox extendedReferredProcBb
731 allExtendedProcBbs[proci].points()
735 if (procBb.overlaps(extendedReferredProcBb))
737 tmpExtendedProcBbsInRange.append
739 extendedReferredProcBb
742 tmpExtendedProcBbsTransformIndex.append(transI);
744 tmpExtendedProcBbsOrigProc.append(proci);
749 else if (nTrans == 1)
751 label& i = permutationIndices[0];
753 for (i = -1; i <= 1; i++)
755 if (i == 0 && proci == Pstream::myProcNo())
762 label transI = globalTransforms.encodeTransformIndex
770 treeBoundBox extendedReferredProcBb
774 allExtendedProcBbs[proci].points()
778 if (procBb.overlaps(extendedReferredProcBb))
780 tmpExtendedProcBbsInRange.append
782 extendedReferredProcBb
785 tmpExtendedProcBbsTransformIndex.append(transI);
787 tmpExtendedProcBbsOrigProc.append(proci);
793 extendedProcBbsInRange.transfer(tmpExtendedProcBbsInRange);
794 extendedProcBbsTransformIndex.transfer(tmpExtendedProcBbsTransformIndex);
795 extendedProcBbsOrigProc.transfer(tmpExtendedProcBbsOrigProc);
799template<
class ParticleType>
800void Foam::InteractionLists<ParticleType>::buildMap
802 autoPtr<mapDistribute>& mapPtr,
803 const List<label>& toProc
810 labelList nSend(Pstream::nProcs(), Zero);
812 for (
const label proci : toProc)
822 sendMap[proci].resize_nocopy(nSend[proci]);
829 label proci = toProc[i];
830 sendMap[proci][nSend[proci]++] = i;
833 mapPtr.reset(
new mapDistribute(std::move(sendMap)));
837template<
class ParticleType>
838void Foam::InteractionLists<ParticleType>::prepareParticlesToRefer
843 const globalIndexAndTransform& globalTransforms =
844 mesh_.globalData().globalTransforms();
846 referredParticles_.setSize(cellIndexAndTransformToDistribute_.size());
850 forAll(referredParticles_, i)
852 referredParticles_[i].clear();
858 forAll(cellIndexAndTransformToDistribute_, i)
860 const labelPair ciat = cellIndexAndTransformToDistribute_[i];
862 label cellIndex = globalTransforms.index(ciat);
864 List<ParticleType*> realParticles =
cellOccupancy[cellIndex];
866 IDLList<ParticleType>& particlesToRefer = referredParticles_[i];
870 const ParticleType& particle = *realParticles[rM];
872 particlesToRefer.append(particle.clone().ptr());
874 prepareParticleToBeReferred(particlesToRefer.last(), ciat);
880template<
class ParticleType>
881void Foam::InteractionLists<ParticleType>::prepareParticleToBeReferred
883 ParticleType* particle,
887 const globalIndexAndTransform& globalTransforms =
888 mesh_.globalData().globalTransforms();
892 globalTransforms.transformIndex(ciat)
895 particle->prepareForInteractionListReferral(transform);
899template<
class ParticleType>
900void Foam::InteractionLists<ParticleType>::fillReferredParticleCloud()
904 forAll(referredParticles_, refCelli)
906 const IDLList<ParticleType>& refCell =
907 referredParticles_[refCelli];
909 for (
const ParticleType&
p : refCell)
913 static_cast<ParticleType*
>(
p.clone().ptr())
921template<
class ParticleType>
922void Foam::InteractionLists<ParticleType>::prepareWallDataToRefer()
924 const globalIndexAndTransform& globalTransforms =
925 mesh_.globalData().globalTransforms();
927 referredWallData_.setSize
929 wallFaceIndexAndTransformToDistribute_.size()
934 forAll(referredWallData_, rWVI)
936 const labelPair& wfiat = wallFaceIndexAndTransformToDistribute_[rWVI];
938 label wallFaceIndex = globalTransforms.index(wfiat);
942 globalTransforms.transformIndex(wfiat)
945 const label patchi = mesh_.boundaryMesh().patchID(wallFaceIndex);
947 const label patchFacei =
948 mesh_.boundaryMesh()[patchi].whichFace(wallFaceIndex);
952 referredWallData_[rWVI] =
U.boundaryField()[patchi][patchFacei];
956 referredWallData_[rWVI] =
957 transform.R().T() & referredWallData_[rWVI];
963template<
class ParticleType>
964void Foam::InteractionLists<ParticleType>::writeReferredWallFaces()
const
966 if (referredWallFaces_.empty())
971 fileName objDir = mesh_.time().timePath()/cloud::prefix;
975 fileName objFileName =
"referredWallFaces.obj";
977 OFstream str(objDir/objFileName);
980 << mesh_.time().timeName()/cloud::prefix/objFileName
985 forAll(referredWallFaces_, rWFI)
987 const referredWallFace& rwf = referredWallFaces_[rWFI];
991 meshTools::writeOBJ(str, rwf.points()[rwf[fPtI]]);
998 str<<
' ' << fPtI + offset;
1003 offset += rwf.size();
1010template<
class ParticleType>
1011Foam::InteractionLists<ParticleType>::InteractionLists(
const polyMesh&
mesh)
1014 cloud_(mesh_,
"nullptr_Cloud", IDLList<ParticleType>()),
1023 cellIndexAndTransformToDistribute_(),
1024 wallFaceIndexAndTransformToDistribute_(),
1025 referredWallFaces_(),
1026 UName_(
"unknown_U"),
1027 referredWallData_(),
1028 referredParticles_()
1032template<
class ParticleType>
1033Foam::InteractionLists<ParticleType>::InteractionLists
1042 cloud_(mesh_,
"referredParticleCloud",
IDLList<ParticleType>()),
1043 writeCloud_(writeCloud),
1046 maxDistance_(maxDistance),
1051 cellIndexAndTransformToDistribute_(),
1052 wallFaceIndexAndTransformToDistribute_(),
1053 referredWallFaces_(),
1055 referredWallData_(),
1056 referredParticles_()
1058 buildInteractionLists();
1064template<
class ParticleType>
1071template<
class ParticleType>
1078 if (mesh_.changing())
1081 <<
"Mesh changing, rebuilding InteractionLists from scratch."
1084 buildInteractionLists();
1087 prepareWallDataToRefer();
1093 const labelList& subMap = cellMap().subMap()[domain];
1097 UOPstream toDomain(domain, pBufs);
1099 UIndirectList<IDLList<ParticleType>> subMappedParticles
1105 forAll(subMappedParticles, i)
1107 toDomain << subMappedParticles[i];
1119template<
class ParticleType>
1123 const label startOfRequests
1128 referredParticles_.setSize(cellMap().constructSize());
1132 const labelList& constructMap = cellMap().constructMap()[domain];
1134 if (constructMap.
size())
1143 typename ParticleType::iNew(mesh_)
1149 forAll(referredParticles_, refCelli)
1152 for (ParticleType&
p : refCell)
1154 p.correctAfterInteractionListReferral(ril_[refCelli][0]);