35 #include "indirectPrimitivePatch.H"
38 #include "PatchTools.H"
70 const bool syncNonCollocated,
89 label patchEdgeI = patchEdges[i];
90 label coupledEdgeI = coupledEdges[i];
92 if (isChangedEdge[patchEdgeI])
99 if (sameEdgeOrientation[i] == cppOrientation[coupledEdgeI])
101 cppEdgeData[coupledEdgeI] =
data;
127 label patchEdgeI = patchEdges[i];
128 label coupledEdgeI = coupledEdges[i];
134 if (sameEdgeOrientation[i] == cppOrientation[coupledEdgeI])
136 allEdgeData[patchEdgeI] =
data;
143 if (!isChangedEdge[patchEdgeI])
145 changedEdges.
append(patchEdgeI);
146 isChangedEdge[patchEdgeI] =
true;
158 const bool syncNonCollocated,
171 PatchTools::matchEdges
187 label nMaxRegions = 0;
191 nMaxRegions +=
f.size();
199 pointGlobalRegions.
setSize(patch.size());
200 forAll(pointGlobalRegions, faceI)
203 labelList& pRegions = pointGlobalRegions[faceI];
207 pRegions[fp] = globalRegions.
toGlobal(nRegions++);
222 if (!nonManifoldEdge[edgeI])
233 pointGlobalRegions[faceI][fp0],
234 pointGlobalRegions[faceI][fp1]
236 if (!isChangedEdge[edgeI])
238 changedEdges.
append(edgeI);
239 isChangedEdge[edgeI] =
true;
272 forAll(changedEdges, changedI)
274 label edgeI = changedEdges[changedI];
275 const labelPair& edgeData = allEdgeData[edgeI];
282 label faceI = eFaces[i];
287 if (pointGlobalRegions[faceI][fp0] > edgeData[0])
289 pointGlobalRegions[faceI][fp0] = edgeData[0];
290 if (!isChangedFace[faceI])
292 isChangedFace[faceI] =
true;
293 changedFaces.
append(faceI);
298 if (pointGlobalRegions[faceI][fp1] > edgeData[1])
300 pointGlobalRegions[faceI][fp1] = edgeData[1];
301 if (!isChangedFace[faceI])
303 isChangedFace[faceI] =
true;
304 changedFaces.
append(faceI);
312 if (nChangedFaces == 0)
321 isChangedEdge =
false;
322 changedEdges.
clear();
326 label faceI = changedFaces[i];
332 label edgeI = fEdges[fp];
334 if (!nonManifoldEdge[edgeI])
338 label region0 = pointGlobalRegions[faceI][fp0];
340 label region1 = pointGlobalRegions[faceI][fp1];
344 (allEdgeData[edgeI][0] > region0)
345 || (allEdgeData[edgeI][1] > region1)
348 allEdgeData[edgeI] =
labelPair(region0, region1);
349 if (!isChangedEdge[edgeI])
351 changedEdges.
append(edgeI);
352 isChangedEdge[edgeI] =
true;
375 if (nChangedEdges == 0)
387 pointLocalRegions.
setSize(patch.size());
393 face& pRegions = pointLocalRegions[faceI];
397 label globalRegionI = pointGlobalRegions[faceI][fp];
401 if (fnd != globalToLocalRegion.end())
404 pRegions[fp] = fnd();
409 label localRegionI = globalToLocalRegion.size();
410 pRegions[fp] = localRegionI;
411 globalToLocalRegion.insert(globalRegionI, localRegionI);
412 dynLocalToGlobalRegion.
append(globalRegionI);
416 localToGlobalRegion.
transfer(dynLocalToGlobalRegion);
430 pointRegions_(pointRegions),
431 regionPoints_(regionPoints)
433 if (pointRegions_.size() != patch_.size())
436 <<
"nFaces:" << patch_.size()
437 <<
" pointRegions:" << pointRegions.
size()
448 const scalar expansionRatio,
456 if (firstLayerDisp.size() != regionPoints_.size())
459 <<
"nRegions:" << regionPoints_.size()
460 <<
" firstLayerDisp:" << firstLayerDisp.size()
466 topPatchID.
size() != patch_.size()
467 && bottomPatchID.
size() != patch_.size()
471 <<
"nFaces:" << patch_.size()
472 <<
" topPatchID:" << topPatchID.
size()
473 <<
" bottomPatchID:" << bottomPatchID.
size()
477 if (extrudeEdgePatches.
size() != patch_.nEdges())
480 <<
"nEdges:" << patch_.nEdges()
481 <<
" extrudeEdgePatches:" << extrudeEdgePatches.
size()
492 (nLayers+1)*(patch_.size()+patch_.nEdges())
503 labelList addedCells(nLayers*patch_.size());
506 for (
label layerI = 0; layerI < nLayers; layerI++)
508 addedCells[nLayers*faceI+layerI] = meshMod.
addCell
513 cellToFaceMap.size(),
516 cellToFaceMap.
append(faceI);
525 forAll(patch_.localPoints(), pointI)
530 patch_.localPoints()[pointI],
531 pointToPointMap.size(),
535 pointToPointMap.
append(pointI);
547 labelList addedPoints(nLayers*regionPoints_.size());
548 forAll(regionPoints_, regionI)
550 label pointI = regionPoints_[regionI];
552 point pt = patch_.localPoints()[pointI];
553 point disp = firstLayerDisp[regionI];
554 for (
label layerI = 0; layerI < nLayers; layerI++)
558 addedPoints[nLayers*regionI+layerI] = meshMod.
addPoint
561 pointToPointMap.size(),
565 pointToPointMap.
append(pointI);
567 disp *= expansionRatio;
573 forAll(patch_.localFaces(), faceI)
577 patch_.localFaces()[faceI].reverseFace(),
578 addedCells[nLayers*faceI],
582 faceToFaceMap.size(),
584 bottomPatchID[faceI],
588 faceToFaceMap.
append(-faceI-1);
602 forAll(patch_.localFaces(), faceI)
605 const face&
f = patch_.localFaces()[faceI];
609 for (
label layerI = 0; layerI < nLayers; layerI++)
614 label region = pointRegions_[faceI][fp];
615 newF[fp] = addedPoints[region*nLayers+layerI];
618 label own = addedCells[faceI*nLayers+layerI];
621 if (layerI == nLayers-1)
624 patchI = topPatchID[faceI];
628 nei = addedCells[faceI*nLayers+layerI+1];
639 faceToFaceMap.size(),
645 faceToFaceMap.
append(faceI+1);
665 forAll(extrudeEdgePatches, edgeI)
667 const labelList& eFaces = patch_.edgeFaces()[edgeI];
668 const labelList& ePatches = extrudeEdgePatches[edgeI];
670 if (ePatches.
size() == 0)
673 if (eFaces.
size() != 2)
677 <<
" not internal but does not have side-patches defined."
683 if (eFaces.
size() != ePatches.
size())
686 <<
"external/feature edge:" << edgeI
687 <<
" has " << eFaces.
size() <<
" connected extruded faces "
688 <<
" but only " << ePatches.
size()
696 const face&
f = patch_.localFaces()[eFaces[0]];
697 const edge&
e = patch_.edges()[edgeI];
700 label fp1 =
f.fcIndex(fp0);
705 fp0 =
f.rcIndex(fp1);
710 for (
label layerI = 0; layerI < nLayers; layerI++)
712 label region0 = pointRegions_[eFaces[0]][fp0];
713 label region1 = pointRegions_[eFaces[0]][fp1];
720 newF[2] = addedPoints[nLayers*region1+layerI];
721 newF[3] = addedPoints[nLayers*region0+layerI];
725 newF[0] = addedPoints[nLayers*region0+layerI-1];
726 newF[1] = addedPoints[nLayers*region1+layerI-1];
727 newF[2] = addedPoints[nLayers*region1+layerI];
728 newF[3] = addedPoints[nLayers*region0+layerI];
739 for (
label i = 0; i < newF.
size()-1; i++)
741 newF[i] = newF[newF.fcIndex(i)];
747 label minCellI = addedCells[nLayers*eFaces[0]+layerI];
750 if (ePatches.
size() == 0)
752 maxCellI = addedCells[nLayers*eFaces[1]+layerI];
753 if (minCellI > maxCellI)
756 Swap(minCellI, maxCellI);
764 patchI = ePatches[0];
790 faceToFaceMap.size(),
797 faceToEdgeMap.
append(edgeI);
802 forAll(extrudeEdgePatches, edgeI)
804 const labelList& eFaces = patch_.edgeFaces()[edgeI];
805 const labelList& ePatches = extrudeEdgePatches[edgeI];
807 if (ePatches.
size() >= 2)
809 for (
label i = 1; i < ePatches.
size(); i++)
812 label minFaceI = eFaces[i];
815 const face&
f = patch_.localFaces()[minFaceI];
817 const edge&
e = patch_.edges()[edgeI];
819 label fp1 =
f.fcIndex(fp0);
824 fp0 =
f.rcIndex(fp1);
828 for (
label layerI = 0; layerI < nLayers; layerI++)
830 label region0 = pointRegions_[minFaceI][fp0];
831 label region1 = pointRegions_[minFaceI][fp1];
837 newF[2] = addedPoints[nLayers*region1+layerI];
838 newF[3] = addedPoints[nLayers*region0+layerI];
842 newF[0] = addedPoints[nLayers*region0+layerI-1];
843 newF[1] = addedPoints[nLayers*region1+layerI-1];
844 newF[2] = addedPoints[nLayers*region1+layerI];
845 newF[3] = addedPoints[nLayers*region0+layerI];
857 for (
label i = 0; i < newF.
size()-1; i++)
859 newF[i] = newF[newF.fcIndex(i)];
881 addedCells[nLayers*minFaceI+layerI],
885 faceToFaceMap.size(),
892 faceToEdgeMap.
append(edgeI);
899 cellToFaceMap_.transfer(cellToFaceMap);
900 faceToFaceMap_.transfer(faceToFaceMap);
901 faceToEdgeMap_.transfer(faceToEdgeMap);
902 pointToPointMap_.transfer(pointToPointMap);