50 partialFaceAreaWeightAMI,
113 label nFacesRemaining = srcAddr.size();
122 labelList seedFaces(nFacesRemaining, -1);
123 seedFaces[srcFacei] = tgtFacei;
126 bitSet mapFlag(nFacesRemaining,
true);
129 label startSeedi = 0;
134 bool continueWalk =
true;
139 visitedFaces.
clear();
157 mapFlag.
unset(srcFacei);
161 nonOverlapFaces.
append(srcFacei);
176 }
while (continueWalk);
184 const label srcFacei,
185 const label tgtStartFacei,
188 DynamicList<label>& nbrFaces,
190 DynamicList<label>& visitedFaces,
193 List<DynamicList<label>>& srcAddr,
194 List<DynamicList<scalar>>& srcWght,
195 List<DynamicList<point>>& srcCtr,
196 List<DynamicList<label>>& tgtAddr,
197 List<DynamicList<scalar>>& tgtWght
200 addProfiling(ami,
"faceAreaWeightAMI::processSourceFace");
202 if (tgtStartFacei == -1)
207 const auto& tgtPatch = this->tgtPatch();
210 nbrFaces.append(tgtStartFacei);
211 appendNbrFaces(tgtStartFacei, tgtPatch, visitedFaces, nbrFaces);
213 bool faceProcessed =
false;
215 label maxNeighbourFaces = nbrFaces.size();
220 label tgtFacei = nbrFaces.remove();
221 visitedFaces.append(tgtFacei);
223 scalar interArea = 0;
225 calcInterArea(srcFacei, tgtFacei, interArea, interCentroid);
230 srcAddr[srcFacei].append(tgtFacei);
231 srcWght[srcFacei].append(interArea);
232 srcCtr[srcFacei].append(interCentroid);
234 tgtAddr[tgtFacei].append(srcFacei);
235 tgtWght[tgtFacei].append(interArea);
237 appendNbrFaces(tgtFacei, tgtPatch, visitedFaces, nbrFaces);
239 faceProcessed =
true;
241 maxNeighbourFaces =
max(maxNeighbourFaces, nbrFaces.size());
244 }
while (nbrFaces.size() > 0);
251 return faceProcessed;
260 const bitSet& mapFlag,
262 const DynamicList<label>& visitedFaces,
263 const bool errorOnNotFound
268 if (mapFlag.count() == 0)
280 bool valuesSet =
false;
281 for (label faceS: srcNbrFaces)
283 if (mapFlag.test(faceS) && seedFaces[faceS] == -1)
285 for (label faceT : visitedFaces)
287 const scalar threshold =
291 if (overlaps(faceS, faceT, threshold))
293 seedFaces[faceS] = faceT;
313 label facei = startSeedi;
314 if (!mapFlag.test(startSeedi))
316 facei = mapFlag.find_next(facei);
318 const label startSeedi0 = facei;
320 bool foundNextSeed =
false;
326 foundNextSeed =
true;
329 if (seedFaces[facei] != -1)
332 tgtFacei = seedFaces[facei];
337 facei = mapFlag.find_next(facei);
343 Pout<<
"Advancing front stalled: searching for new "
344 <<
"target face" <<
endl;
351 tgtFacei = findTargetFace(srcFacei, visitedFaces);
358 facei = mapFlag.find_next(facei);
364 <<
"Unable to set target face for source face " << srcFacei
374 const label srcFacei,
375 const label tgtFacei,
385 (srcMagSf_[srcFacei] < ROOTVSMALL)
386 || (tgtMagSf_[tgtFacei] < ROOTVSMALL)
392 const auto& srcPatch = this->srcPatch();
393 const auto& tgtPatch = this->tgtPatch();
399 faceAreaIntersect inter
419 scalar magN =
mag(
n);
421 const face& src = srcPatch[srcFacei];
422 const face& tgt = tgtPatch[tgtFacei];
424 if (magN > ROOTVSMALL)
426 inter.calc(src, tgt,
n/magN,
area, centroid);
431 <<
"Invalid normal for source face " << srcFacei
432 <<
" points " << UIndirectList<point>(srcPoints, src)
433 <<
" target face " << tgtFacei
434 <<
" points " << UIndirectList<point>(tgtPoints, tgt)
440 static OBJstream tris(
"intersectionTris.obj");
441 const auto& triPts = inter.triangles();
442 for (
const auto& tp : triPts)
444 tris.write(
triPointRef(tp[0], tp[1], tp[2]),
false);
450 writeIntersectionOBJ(
area, src, tgt, srcPoints, tgtPoints);
457 const label srcFacei,
458 const label tgtFacei,
459 const scalar threshold
465 (srcMagSf_[srcFacei] < ROOTVSMALL)
466 || (tgtMagSf_[tgtFacei] < ROOTVSMALL)
472 const auto& srcPatch = this->srcPatch();
473 const auto& tgtPatch = this->tgtPatch();
478 faceAreaIntersect inter
498 scalar magN =
mag(
n);
500 const face& src = srcPatch[srcFacei];
501 const face& tgt = tgtPatch[tgtFacei];
503 if (magN > ROOTVSMALL)
505 return inter.overlaps(src, tgt,
n/magN, threshold);
510 <<
"Invalid normal for source face " << srcFacei
511 <<
" points " << UIndirectList<point>(srcPoints, src)
512 <<
" target face " << tgtFacei
513 <<
" points " << UIndirectList<point>(tgtPoints, tgt)
523 List<DynamicList<label>>& srcAddr,
524 List<DynamicList<scalar>>& srcWght,
525 List<DynamicList<point>>& srcCtr,
526 List<DynamicList<label>>& tgtAddr,
527 List<DynamicList<scalar>>& tgtWght
530 addProfiling(ami,
"faceAreaWeightAMI::restartUncoveredSourceFace");
534 label nBelowMinWeight = 0;
535 const scalar minWeight = 0.95;
538 DynamicList<label> nbrFaces(10);
541 DynamicList<label> visitedFaces(10);
543 const auto& srcPatch = this->srcPatch();
547 const scalar
s =
sum(srcWght[srcFacei]);
548 const scalar t =
s/srcMagSf_[srcFacei];
554 const face&
f = srcPatch[srcFacei];
558 const label tgtFacei =
559 findTargetFace(srcFacei, srcAddr[srcFacei], fpi);
564 visitedFaces = srcAddr[srcFacei];
566 (void)processSourceFace
585 if (
debug && nBelowMinWeight)
588 <<
"Restarted search on " << nBelowMinWeight
589 <<
" faces since sum of weights < " << minWeight
599 const dictionary&
dict,
600 const bool reverseTarget
603 advancingFrontAMI(
dict, reverseTarget),
604 restartUncoveredSourceFace_
606 dict.getOrDefault(
"restartUncoveredSourceFace", true)
613 const bool requireMatch,
614 const bool reverseTarget,
615 const scalar lowWeightCorrection,
617 const bool restartUncoveredSourceFace
627 restartUncoveredSourceFace_(restartUncoveredSourceFace)
634 restartUncoveredSourceFace_(ami.restartUncoveredSourceFace_)
659 bool ok = initialiseWalk(srcFacei, tgtFacei);
661 srcCentroids_.setSize(srcAddress_.size());
663 const auto& src = this->srcPatch();
664 const auto& tgt = this->tgtPatch();
667 List<DynamicList<label>> srcAddr(src.size());
668 List<DynamicList<scalar>> srcWght(srcAddr.size());
669 List<DynamicList<point>> srcCtr(srcAddr.size());
670 List<DynamicList<label>> tgtAddr(tgt.size());
671 List<DynamicList<scalar>> tgtWght(tgtAddr.size());
686 if (
debug && !srcNonOverlap_.empty())
688 Pout<<
" AMI: " << srcNonOverlap_.size()
689 <<
" non-overlap faces identified"
694 if (restartUncoveredSourceFace_)
696 restartUncoveredSourceFace
710 srcAddress_[i].transfer(srcAddr[i]);
711 srcWeights_[i].transfer(srcWght[i]);
712 srcCentroids_[i].transfer(srcCtr[i]);
717 tgtAddress_[i].transfer(tgtAddr[i]);
718 tgtWeights_[i].transfer(tgtWght[i]);
727 globalIndex globalSrcFaces(srcPatch0.size());
728 globalIndex globalTgtFaces(tgtPatch0.size());
730 for (
labelList& addressing : srcAddress_)
732 for (label& addr : addressing)
734 addr = extendedTgtFaceIDs_[addr];
738 for (
labelList& addressing : tgtAddress_)
740 globalSrcFaces.inplaceToGlobal(addressing);
751 extendedTgtMapPtr_->constructMap(),
753 extendedTgtMapPtr_->subMap(),
757 ListOps::appendEqOp<label>(),
766 extendedTgtMapPtr_->constructMap(),
768 extendedTgtMapPtr_->subMap(),
772 ListOps::appendEqOp<scalar>(),
777 extendedTgtMapPtr_->reverseDistribute(tgtPatch0.size(), tgtMagSf_);
780 List<Map<label>> cMapSrc;
783 new mapDistribute(globalSrcFaces, tgtAddress_, cMapSrc)
786 List<Map<label>> cMapTgt;
789 new mapDistribute(globalTgtFaces, srcAddress_, cMapTgt)
794 normaliseWeights(requireMatch_,
true);
796 nonConformalCorrection();
808 if (restartUncoveredSourceFace_)
812 "restartUncoveredSourceFace",
813 restartUncoveredSourceFace_