45 const vector boundaryMesh::splitNormal_(3, 2, 1);
48 const scalar boundaryMesh::distanceTol_ = 1e-2;
63 label edgeI = pEdges[pEdgeI];
65 if (edgeToFeature_[edgeI] != -1)
85 label nbrEdgeI = pEdges[pEdgeI];
87 if (nbrEdgeI != edgeI)
89 label featI = edgeToFeature_[nbrEdgeI];
108 const label startEdgeI,
114 label edgeI = startEdgeI;
118 label vertI = e.start();
120 while (!isFeaturePoint[vertI])
124 edgeI = nextFeatureEdge(edgeI, vertI);
126 if ((edgeI == -1) || (edgeI == startEdgeI))
135 vertI = e.otherVertex(vertI);
147 labelList featLabels(featureEdges_.size());
149 label featLabelI = 0;
151 label initEdgeI = edgeI;
156 label featI = edgeToFeature_[edgeI];
163 featLabels[featLabelI++] = featI;
165 featVisited[featI] =
true;
171 vertI = e.otherVertex(vertI);
175 edgeI = nextFeatureEdge(edgeI, vertI);
177 if ((edgeI == -1) || (edgeI == initEdgeI))
182 while (!isFeaturePoint[vertI]);
186 featLabels.setSize(featLabelI);
192 void Foam::boundaryMesh::markEdges
194 const label maxDistance,
196 const label distance,
198 DynamicList<label>& visited
201 if (distance < maxDistance)
205 if (minDistance[edgeI] == -1)
208 visited.append(edgeI);
210 else if (minDistance[edgeI] <= distance)
223 forAll(startEdges, pEdgeI)
256 const word& patchName
293 if ((facei >= pp.
start()) && (facei < (pp.
start() + pp.size())))
317 label facei = changedFaces[i];
323 label edgeI = fEdges[fEdgeI];
325 if (!regionEdge[edgeI] && (edgeRegion[edgeI] == -1))
327 edgeRegion[edgeI] = region;
329 changedEdges[changedI++] = edgeI;
334 changedEdges.
setSize(changedI);
353 label edgeI = changedEdges[i];
359 label facei = eFaces[eFacei];
361 if (faceRegion[facei] == -1)
363 faceRegion[facei] = region;
365 changedFaces[changedI++] = facei;
370 changedFaces.
setSize(changedI);
377 void Foam::boundaryMesh::markZone
385 faceZone[facei] = currentZone;
397 changedEdges = faceToEdge
407 Pout<<
"From changedFaces:" << changedFaces.
size()
408 <<
" to changedEdges:" << changedEdges.
size()
412 if (changedEdges.
empty())
417 changedFaces = edgeToFace(currentZone, changedEdges, faceZone);
421 Pout<<
"From changedEdges:" << changedEdges.
size()
422 <<
" to changedFaces:" << changedFaces.
size()
426 if (changedFaces.
empty())
508 meshFace_[bFacei] = pp.
start() + patchFacei;
510 bFaces[bFacei] = pp[patchFacei];
519 Pout<<
"read : patches now:" <<
endl;
525 Pout<<
" name : " << bp.
name() << endl
526 <<
" size : " << bp.
size() << endl
527 <<
" start : " << bp.
start() << endl
547 meshPtr_ =
new bMesh(globalPatch.localFaces(), globalPatch.localPoints());
552 const bMesh& msh = *meshPtr_;
554 Pout<<
"** Start of Faces **" <<
endl;
558 const face&
f = msh[facei];
564 ctr += msh.
points()[f[fp]];
574 Pout<<
"** End of Faces **" <<
endl;
576 Pout<<
"** Start of Points **" <<
endl;
581 <<
" coord:" << msh.
points()[pointi]
585 Pout<<
"** End of Points **" <<
endl;
616 regions[triI] = surf[triI].region();
623 label oldRegion = -1111;
624 label boundPatch = 0;
628 if (regions[i] != oldRegion)
630 regionToBoundaryPatch.
insert(regions[i], boundPatch);
632 oldRegion = regions[i];
641 if (surfPatches.
size() == regionToBoundaryPatch.
size())
646 patches_.setSize(surfPatches.
size());
671 patches_.setSize(regionToBoundaryPatch.
size());
694 const labelList& indices = regions.indices();
703 label surfRegion = regions[0];
704 label foamRegion = regionToBoundaryPatch[surfRegion];
706 Pout<<
"Surface region " << surfRegion <<
" becomes boundary patch " 707 << foamRegion <<
" with name " << patches_[foamRegion].name() <<
endl;
711 label startFacei = 0;
715 label triI = indices[indexI];
719 if (tri.
region() != surfRegion)
724 bp.
size() = bFacei - startFacei;
725 bp.
start() = startFacei;
727 surfRegion = tri.
region();
728 foamRegion = regionToBoundaryPatch[surfRegion];
730 Pout<<
"Surface region " << surfRegion <<
" becomes boundary patch " 731 << foamRegion <<
" with name " << patches_[foamRegion].name()
737 meshFace_[bFacei] = triI;
739 bFaces[bFacei++] =
face(tri);
745 bp.
size() = bFacei - startFacei;
746 bp.
start() = startFacei;
804 startTri[facei] = triI;
806 triI += nTris[facei];
828 label triVertI = 3*startTri[facei];
830 for (
label faceTriI = 0; faceTriI < nTris[facei]; faceTriI++)
832 label v0 = triVerts[triVertI++];
833 label v1 = triVerts[triVertI++];
834 label v2 = triVerts[triVertI++];
845 surf.write(surfStream);
879 rightFaces.
append(bFacei);
892 Pout<<
"getNearest :" 893 <<
" rightBin:" << rightFaces.
size()
894 <<
" leftBin:" << leftFaces.
size()
915 scalar tol = 1e-6 * overallBb.
avgDim();
927 const scalar planarTol =
968 Pout<<
"getNearest : built trees" <<
endl;
983 const scalar searchDimSqr =
magSqr(searchSpan);
985 forAll(nearestBFacei, patchFacei)
991 if (debug && (patchFacei % 1000) == 0)
993 Pout<<
"getNearest : patchFace:" << patchFacei
994 <<
" meshFacei:" << meshFacei <<
" ctr:" << ctr <<
endl;
1000 scalar area =
mag(n);
1003 scalar typDim = -GREAT;
1008 typDim =
max(typDim,
mag(pMesh.
points()[f[fp]] - ctr));
1012 pointIndexHit rightInfo = rightTree.findNearest(ctr, searchDimSqr);
1016 pointIndexHit leftInfo = leftTree.findNearest(ctr, searchDimSqr);
1018 if (rightInfo.
hit())
1023 label rightFacei = rightFaces[rightInfo.
index()];
1024 label leftFacei = leftFaces[leftInfo.
index()];
1029 scalar rightSign = n & ns[rightFacei];
1030 scalar leftSign = n & ns[leftFacei];
1034 (rightSign > 0 && leftSign > 0)
1035 || (rightSign < 0 && leftSign < 0)
1039 if (rightDist < leftDist)
1041 nearestBFacei[patchFacei] = rightFacei;
1045 nearestBFacei[patchFacei] = leftFacei;
1057 typDim *= distanceTol_;
1059 if (rightDist < typDim && leftDist < typDim)
1064 nearestBFacei[patchFacei] = rightFacei;
1068 nearestBFacei[patchFacei] = leftFacei;
1074 if (rightDist < leftDist)
1076 nearestBFacei[patchFacei] = rightFacei;
1080 nearestBFacei[patchFacei] = leftFacei;
1089 label rightFacei = rightFaces[rightInfo.
index()];
1090 nearestBFacei[patchFacei] = rightFacei;
1101 nearestBFacei[patchFacei] = leftFaces[leftInfo.
index()];
1106 nearestBFacei[patchFacei] = -1;
1111 return nearestBFacei;
1130 Map<word> indexToName(2*patches_.size());
1133 label nNewPatches = patches_.size();
1135 forAll(oldPatches, oldPatchi)
1137 const polyPatch& patch = oldPatches[oldPatchi];
1138 const label newPatchi = findPatchID(patch.
name());
1140 if (newPatchi != -1)
1142 nameToIndex.insert(patch.
name(), newPatchi);
1143 indexToName.insert(newPatchi, patch.
name());
1149 forAll(patches_, bPatchi)
1153 if (!nameToIndex.found(bp.
name()))
1155 nameToIndex.insert(bp.
name(), bPatchi);
1156 indexToName.insert(bPatchi, bp.
name());
1173 forAll(patches_, bPatchi)
1177 const label newPatchi = nameToIndex[bp.
name()];
1180 const label oldPatchi = findPatchID(oldPatches, bp.
name());
1182 if (oldPatchi == -1)
1187 Pout<<
"patchify : Creating new polyPatch:" << bp.
name()
1201 meshFacei += facesToBeDone;
1209 const polyPatch& oldPatch = oldPatches[oldPatchi];
1213 Pout<<
"patchify : Cloning existing polyPatch:" 1217 newPatchPtrList[newPatchi] = oldPatch.
clone 1225 meshFacei += facesToBeDone;
1235 Pout<<
"Patchify : new polyPatch list:" <<
endl;
1243 Pout<<
"polyPatch:" << newPatch.
name() << endl
1244 <<
" type :" << newPatch.typeName << endl
1245 <<
" size :" << newPatch.size() << endl
1246 <<
" start:" << newPatch.
start() << endl
1260 if (newPatchPtrList.
size())
1269 forAll(patchFaces, newPatchi)
1271 patchFaces[newPatchi].setCapacity(nAvgFaces);
1279 forAll(oldPatches, oldPatchi)
1281 const polyPatch& patch = oldPatches[oldPatchi];
1283 forAll(patch, patchFacei)
1287 label meshFacei = patch.
start() + patchFacei;
1291 patchFaces[whichPatch(nearest[bFacei])].
append(meshFacei);
1295 forAll(patchFaces, newPatchi)
1297 patchFaces[newPatchi].shrink();
1304 for (
label newPatchi = 1; newPatchi < patchFaces.
size(); newPatchi++)
1323 edgeToFeature_ = -1;
1332 if (minCos >= 0.9999)
1337 edgeToFeature_[edgeI] = featureI;
1338 featureToEdge_[featureI++] = edgeI;
1347 if (eFaces.
size() == 2)
1349 label face0I = eFaces[0];
1351 label face1I = eFaces[1];
1366 float cosAng = n0 & n1;
1368 if (cosAng < minCos)
1370 edgeToFeature_[edgeI] = featureI;
1371 featureToEdge_[featureI++] = edgeI;
1378 edgeToFeature_[edgeI] = featureI;
1379 featureToEdge_[featureI++] = edgeI;
1385 featureToEdge_.
setSize(featureI);
1391 featureEdges_.
setSize(featureI);
1398 forAll(featureToEdge_, fEdgeI)
1400 label edgeI = featureToEdge_[fEdgeI];
1408 featToMeshPoint[e.
start()] = featPtI;
1417 label end = featToMeshPoint[e.
end()];
1421 featToMeshPoint[e.
end()] = featPtI;
1431 featureEdges_[fEdgeI] =
edge(start, end);
1435 featurePoints_.
setSize(featPtI);
1447 forAll(featureToEdge_, featI)
1449 label edgeI = featureToEdge_[featI];
1453 if (nFeatureEdges(e.
start()) != 2)
1455 isFeaturePoint[e.
start()] =
true;
1458 if (nFeatureEdges(e.
end()) != 2)
1460 isFeaturePoint[e.
end()] =
true;
1477 label startFeatI = -1;
1479 forAll(featVisited, featI)
1481 if (!featVisited[featI])
1489 if (startFeatI == -1)
1500 featureToEdge_[startFeatI],
1513 forAll(featureSegments_, segmentI)
1515 featureSegments_[segmentI] = segments[segmentI];
1528 markEdges(8, edgeI, 0, minDistance, visitedEdges);
1531 extraEdges_.
transfer(visitedEdges);
1548 <<
"Cannot find face " << facei <<
" in list of boundaryPatches " 1572 patches_.setSize(patches_.size() + 1);
1587 patches_.set(patchi, bpPtr);
1591 Pout<<
"addPatch : patches now:" <<
endl;
1597 Pout<<
" name : " << bp.
name() << endl
1598 <<
" size : " << bp.
size() << endl
1599 <<
" start : " << bp.
start() << endl
1609 const label delPatchi = findPatchID(patchName);
1611 if (delPatchi == -1)
1614 <<
"Can't find patch named " << patchName
1618 if (patches_[delPatchi].size())
1621 <<
"Trying to delete non-empty patch " << patchName
1622 <<
endl <<
"Current size:" << patches_[delPatchi].size()
1642 patches_ = newPatches;
1646 Pout<<
"deletePatch : patches now:" <<
endl;
1652 Pout<<
" name : " << bp.
name() << endl
1653 <<
" size : " << bp.
size() << endl
1654 <<
" start : " << bp.
start() << endl
1664 const word& patchName,
1665 const word& patchType
1668 const label changeI = findPatchID(patchName);
1673 <<
"Can't find patch named " << patchName
1700 newPatches.set(
patchi, bpPtr);
1709 patches_ = newPatches;
1719 if (patchIDs.
size() !=
mesh().size())
1722 <<
"List of patchIDs not equal to number of faces." <<
endl 1723 <<
"PatchIDs size:" << patchIDs.
size()
1724 <<
" nFaces::" <<
mesh().size()
1734 label patchID = patchIDs[facei];
1736 if (patchID < 0 || patchID >= patches_.size())
1739 <<
"PatchID " << patchID <<
" out of range" 1777 patches_ = newPatches;
1781 Pout<<
"changeFaces : patches now:" <<
endl;
1787 Pout<<
" name : " << bp.
name() << endl
1788 <<
" size : " << bp.
size() << endl
1789 <<
" start : " << bp.
start() << endl
1801 int patchID = patchIDs[facei];
1803 oldToNew[facei] = startFace[patchID]++;
1813 newFaces[oldToNew[facei]] =
mesh()[facei];
1814 newMeshFace[oldToNew[facei]] = meshFace_[facei];
1828 meshPtr_ = newMeshPtr_;
1842 const label startFacei,
1847 label totalNTris = 0;
1851 for (
label i = 0; i < nFaces; i++)
1855 nTris[i] = faceNTris;
1857 totalNTris += faceNTris;
1867 const label startFacei,
1869 const label totalNTris,
1874 triVerts.
setSize(3*totalNTris);
1878 for (
label i = 0; i < nFaces; i++)
1880 label facei = startFacei + i;
1893 forAll(triFaces, triFacei)
1895 const face& triF = triFaces[triFacei];
1897 triVerts[vertI++] = triF[0];
1898 triVerts[vertI++] = triF[1];
1899 triVerts[vertI++] = triF[2];
1908 const label startFacei,
1923 const label startFacei,
1925 const label totalNTris,
1938 triVerts.
setSize(3*totalNTris);
1942 for (
label i = 0; i < nFaces; i++)
1956 forAll(triFaces, triFacei)
1958 const face& triF = triFaces[triFacei];
1960 triVerts[vertI++] = triF[0];
1961 triVerts[vertI++] = triF[1];
1962 triVerts[vertI++] = triF[2];
1971 const label seedFacei,
1977 forAll(protectedEdges, i)
1979 protectedEdge[protectedEdges[i]] =
true;
1987 markZone(protectedEdge, seedFacei, 0, currentZone);
1992 forAll(currentZone, facei)
1994 if (currentZone[facei] == 0)
1996 visited[facei] =
true;
2000 visited[facei] =
false;
PtrList< polyPatch > polyPatchList
container classes for polyPatch
label end() const
Return end vertex label.
dimensionedScalar sign(const dimensionedScalar &ds)
label nPoints() const
Return number of points supporting patch faces.
void addPatch(const word &patchName)
Add to back of patch list.
#define forAll(list, i)
Loop across all elements in list.
intWM_LABEL_SIZE_t label
A label is an int32_t or int64_t as specified by the pre-processor macro WM_LABEL_SIZE.
A class for handling file names.
void read(const polyMesh &)
Read from boundaryMesh of polyMesh.
label region() const
Return region label.
void setFeatureEdges(const scalar minCos)
Set featureEdges, edgeToFeature, featureSegments according.
Like polyPatch but without reference to mesh. patchIdentifier::index is not used. Used in boundaryMes...
virtual autoPtr< polyPatch > clone(const polyBoundaryMesh &bm) const
Construct and return a clone, resetting the boundary mesh.
A face is a list of labels corresponding to mesh vertices.
const word & geometricType() const
Return the type of the patch.
const labelList & meshPoints() const
Return labelList of mesh points in patch. They are constructed.
const point & min() const
Minimum describing the bounding box.
dimensioned< Type > max(const dimensioned< Type > &, const dimensioned< Type > &)
void markFaces(const labelList &protectedEdges, const label facei, boolList &visited) const
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
bool empty() const
Return true if the UList is empty (ie, size() is zero)
A list that is sorted upon construction or when explicitly requested with the sort() method...
Cell-face mesh analysis engine.
bool hit() const
Is there a hit.
const vectorField & faceAreas() const
const List< Face > & localFaces() const
Return patch faces addressing into local point list.
const edgeList & edges() const
Return mesh edges. Uses calcEdges.
void size(const label)
Override size to be inconsistent with allocated storage.
Ostream & endl(Ostream &os)
Add newline and flush stream.
~boundaryMesh()
Destructor.
void triangulateLocal(const label startFacei, const label nFaces, const label totalNTris, labelList &triVerts, labelList &localToGlobal) const
Same as triangulate but in local vertex numbering.
const Field< PointType > & points() const
Return reference to global points.
virtual const pointField & points() const =0
Return mesh points.
const point & max() const
Maximum describing the bounding box.
scalar distance(const vector &p1, const vector &p2)
This class describes the interaction of (usually) a face and a point. It carries the info of a succes...
label size() const
Return number of elements in table.
Vector< scalar > vector
A scalar version of the templated Vector.
const word & physicalType() const
Return the optional physical type of the patch.
const vectorField & faceCentres() const
const polyBoundaryMesh & boundaryMesh() const
Return boundary mesh.
wordList patchNames() const
Get names of patches.
const labelListList & edgeFaces() const
void changePatchType(const word &patchName, const word &type)
Change patch.
void deletePatch(const word &patchName)
Delete from patch list.
virtual const pointField & points() const
Return raw points.
boundaryMesh()
Construct null.
List< bool > boolList
Bool container classes.
bool insert(const Key &, const T &newElmt)
Insert a new hashedEntry.
A list of faces which address into the list of points.
A List obtained as a section of another List.
labelList getNearest(const primitiveMesh &pMesh, const vector &searchSpan) const
Get bMesh index of nearest face for every boundary face in.
void changePatchID(const label faceID, const label patchID)
Change patch ID for a boundary face. Note: patchID should be in new.
void repatch()
Re-patch the mesh.
A mesh which allows changes in the patch distribution of the boundary faces. The change in patching i...
label start() const
Return start label of this patch in the polyMesh face list.
An edge is a list of two point labels. The functionality it provides supports the discretisation on a...
void writeTriSurface(const fileName &) const
Write to file.
A class for handling words, derived from string.
const geometricSurfacePatchList & patches() const
void append(const T &)
Append an element at the end of the list.
label getNTris(const label facei) const
Simple triangulation of face subset. Returns number of triangles.
Encapsulation of data needed to search on PrimitivePatches.
const edgeList & edges() const
Return list of edges, address into LOCAL point list.
Info<< "Finished reading KIVA file"<< endl;cellShapeList cellShapes(nPoints);labelList cellZoning(nPoints,-1);const cellModel &hex=*(cellModeller::lookup("hex"));labelList hexLabels(8);label activeCells=0;labelList pointMap(nPoints);forAll(pointMap, i){pointMap[i]=i;}for(label i=0;i< nPoints;i++){if(f[i] > 0.0){hexLabels[0]=i;hexLabels[1]=i1tab[i];hexLabels[2]=i3tab[i1tab[i]];hexLabels[3]=i3tab[i];hexLabels[4]=i8tab[i];hexLabels[5]=i1tab[i8tab[i]];hexLabels[6]=i3tab[i1tab[i8tab[i]]];hexLabels[7]=i3tab[i8tab[i]];cellShapes[activeCells]=cellShape(hex, hexLabels);edgeList edges=cellShapes[activeCells].edges();forAll(edges, ei){if(edges[ei].mag(points)< SMALL){label start=pointMap[edges[ei].start()];while(start!=pointMap[start]){start=pointMap[start];}label end=pointMap[edges[ei].end()];while(end!=pointMap[end]){end=pointMap[end];}label minLabel=min(start, end);pointMap[start]=pointMap[end]=minLabel;}}cellZoning[activeCells]=idreg[i];activeCells++;}}cellShapes.setSize(activeCells);cellZoning.setSize(activeCells);forAll(cellShapes, celli){cellShape &cs=cellShapes[celli];forAll(cs, i){cs[i]=pointMap[cs[i]];}cs.collapse();}label bcIDs[11]={-1, 0, 2, 4,-1, 5,-1, 6, 7, 8, 9};const label nBCs=12;const word *kivaPatchTypes[nBCs]={&wallPolyPatch::typeName,&wallPolyPatch::typeName,&wallPolyPatch::typeName,&wallPolyPatch::typeName,&symmetryPolyPatch::typeName,&wedgePolyPatch::typeName,&polyPatch::typeName,&polyPatch::typeName,&polyPatch::typeName,&polyPatch::typeName,&symmetryPolyPatch::typeName,&oldCyclicPolyPatch::typeName};enum patchTypeNames{PISTON, VALVE, LINER, CYLINDERHEAD, AXIS, WEDGE, INFLOW, OUTFLOW, PRESIN, PRESOUT, SYMMETRYPLANE, CYCLIC};const char *kivaPatchNames[nBCs]={"piston","valve","liner","cylinderHead","axis","wedge","inflow","outflow","presin","presout","symmetryPlane","cyclic"};List< SLList< face > > pFaces[nBCs]
bool set(const label) const
Is element set.
DynamicList< T, SizeInc, SizeMult, SizeDiv > & append(const T &)
Append an element at the end of the list.
List< label > labelList
A List of labels.
const labelListList & pointEdges() const
Triangle with additional region number.
void patchify(const labelList &nearest, const polyBoundaryMesh &oldPatches, polyMesh &newMesh) const
Take over patches onto polyMesh from nearest face in *this.
const word & name() const
Return name.
const word & name() const
Return name.
errorManip< error > abort(error &err)
dimensioned< scalar > magSqr(const dimensioned< Type > &)
prefixOSstream Pout(cout,"Pout")
label start() const
Return start vertex label.
DynamicList< T, SizeInc, SizeMult, SizeDiv > & shrink()
Shrink the allocated space to the number of elements used.
defineTypeNameAndDebug(combustionModel, 0)
const bMesh & mesh() const
void triangulate(const label startFacei, const label nFaces, const label totalNTris, labelList &triVerts) const
Simple triangulation of face subset. TotalNTris is total number.
word name(const complex &)
Return a string representation of a complex.
label nEdges() const
Return number of edges in patch.
void changePatches(const List< polyPatch * > &patches)
Change patches.
void setExtraEdges(const label edgeI)
Set extraEdges to edges 'near' to edgeI. Uses point-edge walk.
void setSize(const label)
Reset size of List.
const Field< PointType > & faceNormals() const
Return face normals for patch.
Non-pointer based hierarchical recursive searching.
label getNPoints(const label startFacei, const label nFaces) const
Number of points used in face subset.
void readTriSurface(const fileName &)
Read from triSurface.
label nTriangles() const
Number of triangles after splitting.
A templated 1D list of pointers to objects of type <T>, where the size of the array is known and used...
label index() const
Return index.
A List with indirect addressing.
virtual const faceList & faces() const =0
Return faces.
const Point & hitPoint() const
Return hit point.
The geometricSurfacePatch is like patchIdentifier but for surfaces. Holds type, name and index...
label triangles(const pointField &points, label &triI, faceList &triFaces) const
Split into triangles using existing points.
Standard boundBox + extra functionality for use in octree.
dimensioned< scalar > mag(const dimensioned< Type > &)
const labelListList & edgeFaces() const
Return edge-face addressing.
static autoPtr< polyPatch > New(const word &patchType, const word &name, const label size, const label start, const label index, const polyBoundaryMesh &bm)
Return a pointer to a new patch created on freestore from.
Mesh consisting of general polyhedral cells.
A patch is a list of labels that address the faces in the global face list.
Triangulated surface description with patch information.
scalar avgDim() const
Average length/height/width dimension.
const labelListList & faceEdges() const
PrimitivePatch< face, List, const pointField > bMesh
Holder of faceList and points. (v.s. e.g. primitivePatch which references points) ...
label nInternalFaces() const
label index() const
Return the index of this patch in the boundaryMesh.
void transfer(List< T > &)
Transfer the contents of the argument List into this list.
const Field< PointType > & localPoints() const
Return pointField of points in patch.
void changeFaces(const labelList &patchIDs, labelList &oldToNew)
Recalculate face ordering and patches. Return old to new.
label size() const
Return the number of elements in the UPtrList.