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;
const polyBoundaryMesh & boundaryMesh() const
Return boundary mesh.
PtrList< polyPatch > polyPatchList
container classes for polyPatch
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.
bool empty() const
Return true if the UList is empty (ie, size() is zero)
intWM_LABEL_SIZE_t label
A label is an int32_t or int64_t as specified by the pre-processor macro WM_LABEL_SIZE.
const word & name() const
Return name.
A class for handling file names.
bool set(const label) const
Is element set.
const word & name() const
Return name.
void read(const polyMesh &)
Read from boundaryMesh of polyMesh.
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...
A face is a list of labels corresponding to mesh vertices.
label getNPoints(const label startFacei, const label nFaces) const
Number of points used in face subset.
dimensioned< Type > max(const dimensioned< Type > &, const dimensioned< Type > &)
const labelListList & faceEdges() const
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
label nInternalFaces() const
A list that is sorted upon construction or when explicitly requested with the sort() method...
const labelListList & pointEdges() const
Cell-face mesh analysis engine.
void triangulate(const label startFacei, const label nFaces, const label totalNTris, labelList &triVerts) const
Simple triangulation of face subset. TotalNTris is total number.
void size(const label)
Override size to be inconsistent with allocated storage.
const word & geometricType() const
Return the type of the patch.
label getNTris(const label facei) const
Simple triangulation of face subset. Returns number of triangles.
Ostream & endl(Ostream &os)
Add newline and flush stream.
~boundaryMesh()
Destructor.
void writeTriSurface(const fileName &) const
Write to file.
virtual const pointField & points() const =0
Return mesh points.
void patchify(const labelList &nearest, const polyBoundaryMesh &oldPatches, polyMesh &newMesh) const
Take over patches onto polyMesh from nearest face in *this.
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...
labelList getNearest(const primitiveMesh &pMesh, const vector &searchSpan) const
Get bMesh index of nearest face for every boundary face in.
Vector< scalar > vector
A scalar version of the templated Vector.
void markFaces(const labelList &protectedEdges, const label facei, boolList &visited) const
const Field< PointType > & localPoints() const
Return pointField of points in patch.
label triangles(const pointField &points, label &triI, faceList &triFaces) const
Split into triangles using existing points.
label size() const
Return number of elements in table.
const labelList & meshPoints() const
Return labelList of mesh points in patch. They are constructed.
void changePatchType(const word &patchName, const word &type)
Change patch.
scalar avgDim() const
Average length/height/width dimension.
void deletePatch(const word &patchName)
Delete from patch list.
boundaryMesh()
Construct null.
virtual const pointField & points() const
Return raw points.
List< bool > boolList
Bool container classes.
bool insert(const Key &, const T &newElmt)
Insert a new hashedEntry.
virtual autoPtr< polyPatch > clone(const polyBoundaryMesh &bm) const
Construct and return a clone, resetting the boundary mesh.
A list of faces which address into the list of points.
const Point & hitPoint() const
Return hit point.
label region() const
Return region label.
A List obtained as a section of another List.
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...
An edge is a list of two point labels. The functionality it provides supports the discretisation on a...
A class for handling words, derived from string.
void append(const T &)
Append an element at the end of the list.
Encapsulation of data needed to search on PrimitivePatches.
DynamicList< T, SizeInc, SizeMult, SizeDiv > & append(const T &)
Append an element at the end of the list.
bool hit() const
Is there a hit.
const Field< PointType > & points() const
Return reference to global points.
const labelListList & edgeFaces() const
Return edge-face addressing.
const edgeList & edges() const
Return list of edges, address into LOCAL point list.
List< label > labelList
A List of labels.
Triangle with additional region number.
void changePatches(const List< polyPatch *> &patches)
Change patches.
const Field< PointType > & faceNormals() const
Return face normals for patch.
errorManip< error > abort(error &err)
wordList patchNames() const
Get names of patches.
dimensioned< scalar > magSqr(const dimensioned< Type > &)
label nEdges() const
Return number of edges in patch.
DynamicList< T, SizeInc, SizeMult, SizeDiv > & shrink()
Shrink the allocated space to the number of elements used.
const word & physicalType() const
Return the optional physical type of the patch.
defineTypeNameAndDebug(combustionModel, 0)
word name(const complex &)
Return a string representation of a complex.
label size() const
Return the number of elements in the UPtrList.
const edgeList & edges() const
Return mesh edges. Uses calcEdges.
const vectorField & faceCentres() const
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 point & max() const
Maximum describing the bounding box.
const geometricSurfacePatchList & patches() const
Non-pointer based hierarchical recursive searching.
void readTriSurface(const fileName &)
Read from triSurface.
A templated 1D list of pointers to objects of type <T>, where the size of the array is known and used...
label end() const
Return end vertex label.
prefixOSstream Pout(cout, "Pout")
const List< FaceType > & localFaces() const
Return patch faces addressing into local point list.
const vectorField & faceAreas() const
A List with indirect addressing.
label index() const
Return the index of this patch in the boundaryMesh.
virtual const faceList & faces() const =0
Return faces.
label start() const
Return start label of this patch in the polyMesh face list.
void triangulateLocal(const label startFacei, const label nFaces, const label totalNTris, labelList &triVerts, labelList &localToGlobal) const
Same as triangulate but in local vertex numbering.
The geometricSurfacePatch is like patchIdentifier but for surfaces. Holds type, name and index...
Standard boundBox + extra functionality for use in octree.
dimensioned< scalar > mag(const dimensioned< Type > &)
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.
const point & min() const
Minimum describing the bounding box.
const bMesh & mesh() const
label nTriangles() const
Number of triangles after splitting.
A patch is a list of labels that address the faces in the global face list.
Triangulated surface description with patch information.
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]
PrimitivePatch< faceList, const pointField > bMesh
Holder of faceList and points. (v.s. e.g. primitivePatch which references points) ...
void transfer(List< T > &)
Transfer the contents of the argument List into this list.
label index() const
Return index.
const labelListList & edgeFaces() const
label start() const
Return start vertex label.
void changeFaces(const labelList &patchIDs, labelList &oldToNew)
Recalculate face ordering and patches. Return old to new.