37 #include "PatchTools.H"
57 const labelList& eFaces = edgeFaces[edgeI];
59 if (eFaces.
size() == 2)
61 return (eFaces[0] != faceI ? eFaces[0] : eFaces[1]);
83 if (
f[fp-1] != pointI &&
f[0] != pointI)
98 const label thisGlobalFaceI,
99 const label nbrGlobalFaceI,
108 addedPoints_[
e[0]].size()
109 || addedPoints_[
e[1]].size()
112 nbrFace(globalEdgeFaces, edgeI, thisGlobalFaceI)
126 const label patchFaceI,
127 const label globalFaceI
138 label edgeI = fEdges[fp];
144 && ( addedPoints_[
e[0]].size() || addedPoints_[
e[1]].size() )
156 label nbrGlobalFaceI = nbrFace
163 if (nbrGlobalFaceI == -1)
176 label prevFp = fEdges.rcIndex(startFp);
200 label nextFp = fEdges.fcIndex(endFp);
231 const label newPatchID,
234 const label inflateFaceI,
236 const label ownFaceI,
237 const label nbrFaceI,
238 const label meshEdgeI,
240 const label numEdgeFaces,
245 label addedFaceI = -1;
259 if (addedCells[ownFaceI].size() < numEdgeFaces)
261 label offset = numEdgeFaces - addedCells[ownFaceI].
size();
262 if (layerI <= offset)
268 layerOwn = layerI - offset;
287 addedCells[ownFaceI][layerOwn],
309 if (addedCells[ownFaceI].size() > addedCells[nbrFaceI].size())
312 addedCells[ownFaceI].
size() - addedCells[nbrFaceI].
size();
316 if (layerI <= offset)
322 layerNbr = layerI - offset;
325 else if (addedCells[nbrFaceI].size() > addedCells[ownFaceI].size())
328 addedCells[nbrFaceI].
size() - addedCells[ownFaceI].
size();
332 if (layerI <= offset)
338 layerOwn = layerI - offset;
350 label inflateEdgeI = -1;
355 if (mesh_.isInternalFace(meshFaces[i]))
358 inflateEdgeI = meshEdgeI;
370 addedCells[ownFaceI][layerOwn],
371 addedCells[nbrFaceI][layerNbr],
395 const label nbrProcID
400 forAll(
mesh.globalData().processorPatches(), i)
402 label patchI =
mesh.globalData().processorPatches()[i];
406 refCast<const processorPolyPatch>(
patches[patchI]).neighbProcNo()
427 patchI =
mesh.boundaryMesh().whichPatch(faceI);
428 zoneI =
mesh.faceZones().whichZone(faceI);
431 label index =
mesh.faceZones()[zoneI].whichFace(faceI);
432 zoneFlip =
mesh.faceZones()[zoneI].flipMap()[index];
460 if (patchI != -1 || zoneI != -1)
462 inflateFaceI = faceI;
468 const edge& ppEdge = pp.
edges()[ppEdgeI];
479 const edge e(
f[fp],
f.nextLabel(fp));
480 int stat = edge::compare(
e, patchEdge);
489 zoneFlip = !zoneFlip;
497 <<
"Problem: cannot find patch edge " << ppEdgeI
498 <<
" with mesh vertices " << patchEdge
499 <<
" at " << patchEdge.
line(
mesh.points())
500 <<
" is not in face " << faceI <<
" with mesh vertices "
510 const bool useInternalFaces,
511 const bool useBoundaryFaces,
532 label faceI = meshFaces[
k];
538 (
mesh.isInternalFace(faceI) && useInternalFaces)
539 || (!
mesh.isInternalFace(faceI) && useBoundaryFaces)
556 if (zoneI != -1 || patchI != -1)
575 addToMesh_(addToMesh),
591 forAll(layerFaces, patchFaceI)
593 const labelList& faceLabels = layerFaces[patchFaceI];
595 if (faceLabels.
size())
597 labelList& added = layerCells[patchFaceI];
600 for (
label i = 0; i < faceLabels.
size()-1; i++)
602 added[i] =
mesh.faceNeighbour()[faceLabels[i]];
635 label meshEdgeI = meshEdges[edgeI];
637 const labelList& eFaces = edgeFaces[edgeI];
640 labelList& globalEFaces = globalEdgeFaces[meshEdgeI];
644 globalEFaces[i] = globalFaces.
toGlobal(pp.addressing()[eFaces[i]]);
664 const bool zoneFromAnyFace,
717 forAll(globalEdgeFaces, edgeI)
719 const labelList& eGlobalFaces = globalEdgeFaces[edgeI];
722 eGlobalFaces.
size() == 2
729 label f0 = eGlobalFaces[0];
732 label otherProcI = -1;
743 if (otherProcI != -1)
757 if (nbrProcToPatch.found(otherProcI))
759 edgePatchID[edgeI] = nbrProcToPatch[otherProcI];
764 nbrProcToPatch.insert(otherProcI,
nPatches);
765 patchToNbrProc.insert(
nPatches, otherProcI);
783 if (edgePatchID[edgeI] == -1)
787 label meshEdgeI = meshEdges[edgeI];
794 if (edgeFaces[edgeI].size() == 2)
800 label dummyPatchI = -1;
814 inflateFaceID[edgeI],
837 inflateFaceID[edgeI],
853 if (edgeFaces[edgeI].size() == 1 && edgePatchID[edgeI] == -1)
857 <<
"Have no sidePatchID for edge " << edgeI <<
" points "
873 edgeFaces[edgeI].size() == 1
874 && edgePatchID[edgeI] != -1
875 && inflateFaceID[edgeI] == -1
880 label myFaceI = pp.addressing()[edgeFaces[edgeI][0]];
883 label meshEdgeI = meshEdges[edgeI];
892 label faceI = meshFaces[
k];
896 if (
patches.whichPatch(faceI) == edgePatchID[edgeI])
948 label cppEdgeI = coupledEdges[i];
949 label ppEdgeI = patchEdges[i];
951 cppEdgeZoneID[cppEdgeI] = edgeZoneID[ppEdgeI];
952 if (sameEdgeOrientation[i])
954 cppEdgeFlip[cppEdgeI] = edgeFlip[ppEdgeI];
958 cppEdgeFlip[cppEdgeI] = !edgeFlip[ppEdgeI];
990 label cppEdgeI = coupledEdges[i];
991 label ppEdgeI = patchEdges[i];
993 edgeZoneID[ppEdgeI] = cppEdgeZoneID[cppEdgeI];
994 if (sameEdgeOrientation[i])
996 edgeFlip[ppEdgeI] = cppEdgeFlip[cppEdgeI];
1000 edgeFlip[ppEdgeI] = !cppEdgeFlip[cppEdgeI];
1028 Pout<<
"addPatchCellLayer::setRefinement : Adding up to "
1029 <<
gMax(nPointLayers)
1030 <<
" layers of cells to indirectPrimitivePatch with "
1036 pp.
nPoints() != firstLayerDisp.size()
1038 || pp.size() != nFaceLayers.
size()
1042 <<
"Size of new points is not same as number of points used by"
1043 <<
" the face subset" <<
endl
1044 <<
" patch.nPoints:" << pp.
nPoints()
1045 <<
" displacement:" << firstLayerDisp.size()
1046 <<
" nPointLayers:" << nPointLayers.
size() <<
nl
1047 <<
" patch.nFaces:" << pp.size()
1048 <<
" nFaceLayers:" << nFaceLayers.
size()
1054 if (nPointLayers[i] < 0)
1057 <<
"Illegal number of layers " << nPointLayers[i]
1063 if (nFaceLayers[i] < 0)
1066 <<
"Illegal number of layers " << nFaceLayers[i]
1071 forAll(globalEdgeFaces, edgeI)
1073 if (globalEdgeFaces[edgeI].size() > 2)
1077 if (nPointLayers[
e[0]] > 0 || nPointLayers[
e[1]] > 0)
1080 <<
"Trying to extrude edge "
1082 <<
" which is non-manifold (has "
1083 << globalEdgeFaces[edgeI].
size()
1084 <<
" local or coupled faces using it)"
1115 label meshPointI = meshPoints[i];
1117 if (
n[meshPointI] != nPointLayers[i])
1120 <<
"At mesh point:" << meshPointI
1121 <<
" coordinate:" << mesh_.points()[meshPointI]
1122 <<
" specified nLayers:" << nPointLayers[i] <<
endl
1123 <<
"On coupled point a different nLayers:"
1124 <<
n[meshPointI] <<
" was specified."
1132 labelList nFromFace(mesh_.nPoints(), 0);
1135 const face&
f = pp[i];
1141 nFromFace[pointI] =
max(nFromFace[pointI], nFaceLayers[i]);
1154 label meshPointI = meshPoints[i];
1159 && nPointLayers[i] != nFromFace[meshPointI]
1163 <<
"At mesh point:" << meshPointI
1164 <<
" coordinate:" << mesh_.points()[meshPointI]
1165 <<
" specified nLayers:" << nPointLayers[i] <<
endl
1166 <<
"but the max nLayers of surrounding faces is:"
1167 << nFromFace[meshPointI]
1186 label meshPointI = meshPoints[i];
1188 if (
mag(d[meshPointI] - firstLayerDisp[i]) > SMALL)
1191 <<
"At mesh point:" << meshPointI
1192 <<
" coordinate:" << mesh_.points()[meshPointI]
1193 <<
" specified displacement:" << firstLayerDisp[i]
1195 <<
"On coupled point a different displacement:"
1196 << d[meshPointI] <<
" was specified."
1212 if (nPointLayers[
e[0]] > 0 || nPointLayers[
e[1]] > 0)
1219 if (eFaces.
size() != 1)
1222 <<
"boundary-edge-to-be-extruded:"
1223 << pp.
points()[meshPoints[
e[0]]]
1224 << pp.
points()[meshPoints[
e[1]]]
1225 <<
" has more than two faces using it:" << eFaces
1229 label myFaceI = pp.addressing()[eFaces[0]];
1231 label meshEdgeI = meshEdges[edgeI];
1234 const labelList& meshFaces = mesh_.edgeFaces(meshEdgeI, ef);
1243 label faceI = meshFaces[i];
1245 if (faceI != myFaceI)
1247 if (!mesh_.isInternalFace(faceI))
1256 <<
"boundary-edge-to-be-extruded:"
1257 << pp.
points()[meshPoints[
e[0]]]
1258 << pp.
points()[meshPoints[
e[1]]]
1259 <<
" has more than two boundary faces"
1262 << mesh_.faceCentres()[bFaceI]
1263 <<
" patch:" <<
patches.whichPatch(bFaceI)
1264 <<
" and " << faceI <<
" fc:"
1265 << mesh_.faceCentres()[faceI]
1266 <<
" patch:" <<
patches.whichPatch(faceI)
1284 label meshFaceI = pp.addressing()[patchFaceI];
1286 patchID[patchFaceI] =
patches.whichPatch(meshFaceI);
1292 addedPoints_.setSize(pp.
nPoints());
1295 label nTruncated = 0;
1297 forAll(nPointLayers, patchPointI)
1299 if (nPointLayers[patchPointI] > 0)
1301 addedPoints_[patchPointI].setSize(nPointLayers[patchPointI]);
1311 Pout<<
"Not adding points at " << nTruncated <<
" out of "
1324 copiedPatchPoints.
setSize(firstLayerDisp.size());
1325 forAll(firstLayerDisp, patchPointI)
1327 if (addedPoints_[patchPointI].size())
1329 label meshPointI = meshPoints[patchPointI];
1330 label zoneI = mesh_.pointZones().whichZone(meshPointI);
1331 copiedPatchPoints[patchPointI] = meshMod.
setAction
1335 mesh_.points()[meshPointI],
1347 forAll(firstLayerDisp, patchPointI)
1349 if (addedPoints_[patchPointI].size())
1351 label meshPointI = meshPoints[patchPointI];
1353 label zoneI = mesh_.pointZones().whichZone(meshPointI);
1355 point pt = mesh_.points()[meshPointI];
1357 vector disp = firstLayerDisp[patchPointI];
1359 forAll(addedPoints_[patchPointI], i)
1368 (addToMesh_ ? meshPointI : -1),
1374 addedPoints_[patchPointI][i] = addedVertI;
1376 disp *= expansionRatio[patchPointI];
1390 if (nFaceLayers[patchFaceI] > 0)
1392 addedCells[patchFaceI].
setSize(nFaceLayers[patchFaceI]);
1394 label meshFaceI = pp.addressing()[patchFaceI];
1396 label ownZoneI = mesh_.cellZones().whichZone
1398 mesh_.faceOwner()[meshFaceI]
1401 for (
label i = 0; i < nFaceLayers[patchFaceI]; i++)
1405 addedCells[patchFaceI][i] = meshMod.
setAction
1412 (addToMesh_ ? mesh_.faceOwner()[meshFaceI] : -1),
1428 layerFaces_.setSize(pp.size());
1432 label meshFaceI = pp.addressing()[patchFaceI];
1434 if (addedCells[patchFaceI].size())
1436 layerFaces_[patchFaceI].setSize(addedCells[patchFaceI].size() + 1);
1443 forAll(addedCells[patchFaceI], i)
1447 if (addedPoints_[
f[fp]].empty())
1454 : copiedPatchPoints[
f[fp]]
1461 addedPoints_[
f[fp]].
size()
1462 - addedCells[patchFaceI].
size();
1463 newFace[fp] = addedPoints_[
f[fp]][i+offset];
1475 if (i == addedCells[patchFaceI].size()-1)
1479 patchI = patchID[patchFaceI];
1480 zoneI = mesh_.faceZones().whichZone(meshFaceI);
1483 const faceZone& fz = mesh_.faceZones()[zoneI];
1490 nei = addedCells[patchFaceI][i+1];
1495 layerFaces_[patchFaceI][i+1] = meshMod.
setAction
1500 addedCells[patchFaceI][i],
1504 (addToMesh_ ? meshFaceI : -1),
1523 if (addedCells[patchFaceI].size())
1525 label meshFaceI = pp.addressing()[patchFaceI];
1527 layerFaces_[patchFaceI][0] = meshFaceI;
1535 mesh_.faceOwner()[meshFaceI],
1536 addedCells[patchFaceI][0],
1553 if (nFaceLayers[patchFaceI] > 0)
1555 label meshFaceI = pp.addressing()[patchFaceI];
1556 label zoneI = mesh_.faceZones().whichZone(meshFaceI);
1557 bool zoneFlip =
false;
1560 const faceZone& fz = mesh_.faceZones()[zoneI];
1568 f[fp] = copiedPatchPoints[
f[fp]];
1571 layerFaces_[patchFaceI][0] = meshMod.
setAction
1576 addedCells[patchFaceI][0],
1582 exposedPatchID[patchFaceI],
1608 labelList meshEdgeLayers(mesh_.nEdges(), -1);
1612 const edge&
e = edges[edgeI];
1614 label meshEdgeI = meshEdges[edgeI];
1616 if ((nPointLayers[
e[0]] == 0) && (nPointLayers[
e[1]] == 0))
1618 meshEdgeLayers[meshEdgeI] = 0;
1626 meshEdgeLayers[meshEdgeI] =
max
1628 nFaceLayers[eFaces[i]],
1629 meshEdgeLayers[meshEdgeI]
1645 edgeLayers[edgeI] = meshEdgeLayers[meshEdges[edgeI]];
1658 const labelList& fEdges = faceEdges[patchFaceI];
1672 globalFaces.
toGlobal(pp.addressing()[patchFaceI])
1681 const label startFp = indexPair[0];
1682 const label endFp = indexPair[1];
1689 const face&
f = localFaces[patchFaceI];
1692 if (endFp >= startFp)
1694 stringedVerts.
setSize(endFp-startFp+2);
1703 for (
label i = 0; i < stringedVerts.
size()-1; i++)
1705 stringedVerts[i] =
f[fp];
1706 doneEdge[fEdges[fp]] =
true;
1709 stringedVerts.last() =
f[fp];
1719 label startEdgeI = fEdges[startFp];
1721 label meshEdgeI = meshEdges[startEdgeI];
1723 label numEdgeSideFaces = edgeLayers[startEdgeI];
1725 for (
label i = 0; i < numEdgeSideFaces; i++)
1727 label vEnd = stringedVerts.last();
1728 label vStart = stringedVerts[0];
1737 if (addedPoints_[vEnd].size())
1740 addedPoints_[vEnd].size() - numEdgeSideFaces;
1742 if (addedPoints_[vStart].size())
1745 addedPoints_[vStart].size() - numEdgeSideFaces;
1749 face newFace(newFp);
1757 forAll(stringedVerts, stringedI)
1759 label v = stringedVerts[stringedI];
1765 : copiedPatchPoints[v]
1774 forAll(stringedVerts, stringedI)
1776 label v = stringedVerts[stringedI];
1777 if (addedPoints_[v].size())
1780 addedPoints_[v].
size() - numEdgeSideFaces;
1783 addedPoints_[v][i+offset-1],
1795 : copiedPatchPoints[v]
1805 if (numEdgeSideFaces < addedPoints_[vEnd].size())
1807 if (i == 0 && addedPoints_[vEnd].size())
1810 addedPoints_[vEnd].size() - numEdgeSideFaces;
1811 for (
label ioff = 0; ioff < offset; ioff++)
1815 addedPoints_[vEnd][ioff],
1825 label v = stringedVerts[stringedI];
1826 if (addedPoints_[v].size())
1829 addedPoints_[v].
size() - numEdgeSideFaces;
1832 addedPoints_[v][i+offset],
1844 : copiedPatchPoints[v]
1854 if (numEdgeSideFaces < addedPoints_[vStart].size())
1856 if (i == 0 && addedPoints_[vStart].size())
1859 addedPoints_[vStart].size() - numEdgeSideFaces;
1860 for (
label ioff = offset-1; ioff >= 0; ioff--)
1864 addedPoints_[vStart][ioff],
1884 if (!verts.
insert(newFace[fp]))
1887 <<
"Duplicate vertex in face"
1888 <<
" to be added." <<
nl
1889 <<
"newFace:" << newFace <<
nl
1897 <<
" out of:" << numEdgeSideFaces <<
nl
1898 <<
"ExtrudeEdge:" << meshEdgeI
1900 << mesh_.edges()[meshEdgeI].line
1904 <<
"string:" << stringedVerts
1922 label nbrFaceI = nbrFace
1929 const labelList& meshFaces = mesh_.edgeFaces
1938 bool zoneFlip =
false;
1939 if (edgeZoneID[startEdgeI] != -1)
1941 zoneFlip = !edgeFlip[startEdgeI];
1950 edgePatchID[startEdgeI],
1951 edgeZoneID[startEdgeI],
1953 inflateFaceID[startEdgeI],
1981 forAll(newAddedPoints, newPointI)
1983 label oldPointI = pointMap[newPointI];
1985 const labelList& added = addedPoints_[oldPointI];
1987 labelList& newAdded = newAddedPoints[newPointI];
1997 newAdded[newI++] = newPointI;
2002 addedPoints_.transfer(newAddedPoints);
2008 forAll(newLayerFaces, newFaceI)
2012 const labelList& added = layerFaces_[oldFaceI];
2014 labelList& newAdded = newLayerFaces[newFaceI];
2024 newAdded[newI++] = newFaceI;
2029 layerFaces_.transfer(newLayerFaces);