56 const List<topoDistanceData>& allFaceInfo,
58 const bool distanceMode,
62 const cell& cFaces2 =
mesh.
cells()[cellI];
71 label faceI = cFaces2[i];
72 const topoDistanceData& info = allFaceInfo[faceI];
73 if (info.distance() < minDist)
75 minDist = info.distance();
79 else if (info.distance() == minDist)
91 scalar minDist2 = ROOTVGREAT;
94 label faceI = cFaces2[i];
95 if (allFaceInfo[faceI].
distance() == minDist)
112 label faceI = cFaces2[i];
113 if (allFaceInfo[faceI].
distance() == minDist)
121 if (isLeakPoint[
f[fp]])
128 if (nLeak < minLeakPoints)
130 minLeakPoints = nLeak;
142 void Foam::shortestPathSet::calculateDistance
145 const polyMesh&
mesh,
148 List<topoDistanceData>& allFaceInfo,
149 List<topoDistanceData>& allCellInfo
152 int dummyTrackData = 0;
155 DynamicList<topoDistanceData> faceDist;
156 DynamicList<label> cFaces1;
161 faceDist.reserve(cFaces.size());
162 cFaces1.reserve(cFaces.size());
164 for (
label facei : cFaces)
166 if (!allFaceInfo[facei].valid(dummyTrackData))
169 faceDist.append(topoDistanceData(123, 0));
193 const fvMesh& fm = refCast<const fvMesh>(
mesh);
195 const_cast<fvMesh&
>(fm).setInstance(fm.time().timeName());
202 fm.time().timeName(),
210 forAll(allCellInfo, celli)
212 fld[celli] = allCellInfo[celli].distance();
217 SubList<topoDistanceData>
p(pp.patchSlice(allFaceInfo));
221 pfld[i] = 1.0*
p[i].distance();
223 fld.boundaryFieldRef()[patchi] == pfld;
232 void Foam::shortestPathSet::sync
234 const polyMesh&
mesh,
239 bool& findMinDistance
246 orEqOp<unsigned int>(),
253 orEqOp<unsigned int>()
257 typedef Tuple2<label, Tuple2<point, bool>> ProcData;
262 Tuple2<point, bool>(origin, findMinDistance)
267 [](ProcData&
x,
const ProcData&
y)
275 origin = searchData.second().first();
276 findMinDistance = searchData.second().second();
281 bool Foam::shortestPathSet::touchesWall
283 const polyMesh&
mesh,
294 if (isLeakPoint[
f[fp]])
296 if (isLeakFace.set(facei))
307 void Foam::shortestPathSet::genSamples
309 const bool markLeakPath,
311 const polyMesh&
mesh,
313 const point& insidePoint,
314 const label insideCelli,
315 const point& outsidePoint,
317 DynamicList<point>& samplingPts,
318 DynamicList<label>& samplingCells,
319 DynamicList<label>& samplingFaces,
320 DynamicList<label>& samplingSegments,
321 DynamicList<scalar>& samplingCurveDist,
333 label trackLength = 0;
335 for (
label iter = 0; iter < maxIter; iter++)
337 List<topoDistanceData> allFaceInfo(
mesh.
nFaces());
338 List<topoDistanceData> allCellInfo(
mesh.
nCells());
341 forAll(isBlockedFace, facei)
343 if (isBlockedFace[facei])
345 allFaceInfo[facei] = maxData;
356 if (celli != insideCelli && celli != outsideCelli)
358 if (isLeakCell[celli])
360 allCellInfo[celli] = maxData;
361 const cell& cFaces =
mesh.
cells()[celli];
362 for (
auto facei : cFaces)
364 allFaceInfo[facei] = maxData;
375 if (isLeakFace[facei])
377 allFaceInfo[facei] = maxData;
384 calculateDistance(iter,
mesh, insideCelli, allFaceInfo, allCellInfo);
395 bool targetFound =
false;
396 if (outsideCelli != -1)
399 targetFound = allCellInfo[outsideCelli].valid(dummyTrackData);
403 <<
"Point " << outsidePoint
404 <<
" not reachable by walk from " << insidePoint
405 <<
". Probably mesh has island/regions."
406 <<
" Skipped route detection." <<
endl;
409 reduce(targetFound, orOp<bool>());
418 label frontCellI = outsideCelli;
419 point origin(outsidePoint);
420 bool findMinDistance =
true;
424 label frontFaceI = -1;
427 if (frontCellI != -1)
441 frontFaceI = findMinFace
456 if (isBlockedFace.size() && isBlockedFace[frontFaceI])
465 if (nbrCellI == frontCellI)
470 if (nbrCellI == insideCelli)
477 frontCellI = nbrCellI;
480 frontFaceI = findMinFace
490 const topoDistanceData& cInfo = allCellInfo[frontCellI];
491 const topoDistanceData& fInfo = allFaceInfo[frontFaceI];
493 if (fInfo.distance() <= cInfo.distance())
496 samplingCells.append(frontCellI);
497 samplingFaces.append(-1);
498 samplingSegments.append(iter);
499 samplingCurveDist.append
501 trackLength+cInfo.distance()
503 isLeakCell.set(frontCellI);
516 isNewLeakPoint.set(
mesh.
faces()[frontFaceI]);
518 findMinDistance =
false;
523 isLeakPoint.transfer(isNewLeakPoint);
538 if (frontFaceI != -1)
545 if (frontCellI != -1)
547 minCellDistance = allCellInfo[frontCellI].distance();
549 reduce(minCellDistance, minOp<label>());
564 const label oldFrontFaceI = frontFaceI;
569 const polyPatch& pp = pbm[patchI];
572 label faceI = pp.start()+i;
577 && (isBlockedFace.empty() || !isBlockedFace[faceI])
581 frontCellI = pp.faceCells()[i];
589 && allCellInfo[frontCellI].
distance() < minCellDistance
592 const topoDistanceData& cInfo = allCellInfo[frontCellI];
595 samplingCells.append(frontCellI);
596 samplingFaces.append(-1);
597 samplingSegments.append(iter);
598 samplingCurveDist.append
600 trackLength+cInfo.distance()
602 isLeakCell.set(frontCellI);
616 isLeakPoint.set(
mesh.
faces()[frontFaceI]);
618 findMinDistance =
false;
625 if (insideCelli != -1 && frontCellI == insideCelli)
650 samplingCurveDist.size()
651 ? samplingCurveDist.last()
660 const fvMesh& fm = refCast<const fvMesh>(
mesh);
662 const_cast<fvMesh&
>(fm).setInstance(fm.time().timeName());
668 fm.time().timeName(),
678 fld[celli] = isLeakCell[celli];
680 fld.correctBoundaryConditions();
687 void Foam::shortestPathSet::genSamples
689 const bool markLeakPath,
691 const polyMesh&
mesh,
697 DynamicList<point> samplingPts;
698 DynamicList<label> samplingCells;
699 DynamicList<label> samplingFaces;
700 DynamicList<label> samplingSegments;
701 DynamicList<scalar> samplingCurveDist;
709 for (
label patchi : wallPatches)
711 const polyPatch& pp = pbm[patchi];
714 isLeakPoint.set(pp[i]);
719 forAll(isBlockedFace, facei)
721 if (isBlockedFace[facei])
731 orEqOp<unsigned int>(),
740 label prevSegmenti = 0;
741 scalar prevDistance = 0.0;
743 for (
auto insidePoint : insidePoints_)
747 for (
auto outsidePoint : outsidePoints_)
749 const label nOldSamples = samplingSegments.size();
773 label maxSegment = 0;
774 scalar maxDistance = 0.0;
775 for (
label i = nOldSamples; i < samplingSegments.size(); ++i)
777 samplingSegments[i] += prevSegmenti;
778 maxSegment =
max(maxSegment, samplingSegments[i]);
779 samplingCurveDist[i] += prevDistance;
780 maxDistance =
max(maxDistance, samplingCurveDist[i]);
782 prevSegmenti =
returnReduce(maxSegment, maxOp<label>());
783 prevDistance =
returnReduce(maxDistance, maxOp<scalar>());
793 Pout<<
"Writing " << leakFaces.size() <<
" faces to " << str.
name()
798 samplingPts.shrink();
799 samplingCells.shrink();
800 samplingFaces.shrink();
801 samplingSegments.shrink();
802 samplingCurveDist.shrink();
807 std::move(samplingPts),
808 std::move(samplingCells),
809 std::move(samplingFaces),
810 std::move(samplingSegments),
811 std::move(samplingCurveDist)
829 const bool markLeakPath,
839 outsidePoints_(outsidePoints)
851 Info<<
"shortestPathSet : Writing blocked faces to "
852 << outputDir <<
endl;
859 findIndices(isBlockedFace,
true)
876 setPatch.localFaces(),
877 setPatch.meshPoints(),
878 setPatch.meshPointMap(),
881 uniqueMeshPointLabels,
896 (outputDir /
"blockedFace"),
907 setPatch.localPoints(),
908 setPatch.localFaces(),
909 (outputDir /
"blockedFace"),
917 genSamples(markLeakPath, maxIter,
mesh, wallPatches, isBlockedFace);
942 if (!pp.
coupled() && !isA<emptyPolyPatch>(pp))
944 wallPatches.append(patchi);
948 genSamples(markLeakPath, maxIter,
mesh, wallPatches,
boolList());