44 Foam::scalar Foam::isoSurfaceCell::isoFraction
63 bool Foam::isoSurfaceCell::isTriCut
69 bool aLower = (pointValues[tri[0]] < iso_);
70 bool bLower = (pointValues[tri[1]] < iso_);
71 bool cLower = (pointValues[tri[2]] < iso_);
73 return !(aLower == bLower && aLower == cLower);
77 Foam::isoSurfaceCell::cellCutType Foam::isoSurfaceCell::calcCutType
79 const PackedBoolList& isTet,
85 const cell& cFaces = mesh_.cells()[celli];
87 if (isTet.get(celli) == 1)
91 const face& f = mesh_.faces()[cFaces[cFacei]];
93 for (
label fp = 1; fp < f.size() - 1; fp++)
95 triFace tri(f[0], f[fp], f[f.fcIndex(fp)]);
97 if (isTriCut(tri, pointValues))
107 bool cellLower = (cellValues[celli] < iso_);
110 bool edgeCut =
false;
114 label facei = cFaces[cFacei];
115 const face& f = mesh_.faces()[facei];
120 if ((pointValues[f[fp]] < iso_) != cellLower)
132 const label fp0 = mesh_.tetBasePtIs()[facei];
133 label fp = f.fcIndex(fp0);
134 for (
label i = 2; i < f.size(); i++)
136 label nextFp = f.fcIndex(fp);
138 if (isTriCut(
triFace(f[fp0], f[fp], f[nextFp]), pointValues))
159 const labelList& cPoints = mesh_.cellPoints(celli);
165 if ((pointValues[cPoints[i]] < iso_) != cellLower)
171 if (nPyrCuts == cPoints.size())
188 void Foam::isoSurfaceCell::calcCutTypes
190 const PackedBoolList& isTet,
195 cellCutType_.setSize(mesh_.nCells());
197 forAll(mesh_.cells(), celli)
199 cellCutType_[celli] = calcCutType(isTet, cVals, pVals, celli);
201 if (cellCutType_[celli] == CUT)
209 Pout<<
"isoSurfaceCell : detected " << nCutCells_
210 <<
" candidate cut cells." <<
endl;
217 const labelledTri& tri0,
218 const labelledTri& tri1
237 label fp0p1 = tri0.fcIndex(fp0);
238 label fp1p1 = tri1.fcIndex(fp1);
239 label fp1m1 = tri1.rcIndex(fp1);
241 if (tri0[fp0p1] == tri1[fp1p1] || tri0[fp0p1] == tri1[fp1m1])
243 common[0] = tri0[fp0];
244 common[1] = tri0[fp0p1];
251 Foam::point Foam::isoSurfaceCell::calcCentre(
const triSurface& s)
257 sum += s[i].centre(s.points());
267 DynamicList<labelledTri, 64>& localTris
272 if (localTris.size() == 1)
274 const labelledTri& tri = localTris[0];
275 info.setPoint(tri.centre(localPoints));
278 else if (localTris.size() == 2)
281 const labelledTri& tri0 = localTris[0];
282 const labelledTri& tri1 = localTris[1];
284 labelPair shared = findCommonPoints(tri0, tri1);
288 const vector n0 = tri0.normal(localPoints);
289 const vector n1 = tri1.normal(localPoints);
301 tri0.centre(localPoints)
302 + tri1.centre(localPoints)
309 else if (localTris.size())
319 localTris.clearStorage();
322 label nZones = surf.markZones
331 scalar minCos = great;
332 const vector& n0 = surf.faceNormals()[0];
333 for (
label i = 1; i < surf.size(); i++)
335 scalar cosAngle = (n0 & surf.faceNormals()[i]);
336 if (cosAngle < minCos)
344 info.setPoint(calcCentre(surf));
354 void Foam::isoSurfaceCell::calcSnappedCc
356 const PackedBoolList& isTet,
360 DynamicList<point>& snappedPoints,
367 snappedCc.
setSize(mesh_.nCells());
371 DynamicList<point, 64> localPoints(64);
372 DynamicList<labelledTri, 64> localTris(64);
373 Map<label> pointToLocal(64);
375 forAll(mesh_.cells(), celli)
377 if (cellCutType_[celli] == CUT && isTet.get(celli) == 0)
379 scalar cVal = cVals[celli];
381 const cell& cFaces = mesh_.cells()[celli];
385 pointToLocal.clear();
392 const face& f = mesh_.faces()[cFaces[cFacei]];
396 label pointi = f[fp];
398 scalar s = isoFraction(cVal, pVals[pointi]);
400 if (s >= 0.0 && s <= 0.5)
402 if (pointToLocal.insert(pointi, localPoints.size()))
404 localPoints.append((1.0-s)*cc[celli]+s*pts[pointi]);
410 if (localPoints.size() == 1)
413 snappedCc[celli] = snappedPoints.size();
414 snappedPoints.append(localPoints[0]);
422 else if (localPoints.size() == 2)
425 snappedCc[celli] = snappedPoints.size();
426 snappedPoints.append(0.5*(localPoints[0]+localPoints[1]));
434 else if (localPoints.size())
439 label facei = cFaces[cFacei];
440 const face& f = mesh_.faces()[facei];
446 const label fp0 = mesh_.tetBasePtIs()[facei];
447 label fp = f.fcIndex(fp0);
448 for (
label i = 2; i < f.size(); i++)
450 label nextFp = f.fcIndex(fp);
451 triFace tri(f[fp0], f[fp], f[nextFp]);
454 FixedList<scalar, 3>
s(3);
455 s[0] = isoFraction(cVal, pVals[tri[0]]);
456 s[1] = isoFraction(cVal, pVals[tri[1]]);
457 s[2] = isoFraction(cVal, pVals[tri[2]]);
461 (s[0] >= 0.0 && s[0] <= 0.5)
462 && (s[1] >= 0.0 && s[1] <= 0.5)
463 && (s[2] >= 0.0 && s[2] <= 0.5)
468 (mesh_.faceOwner()[facei] == celli)
469 == (cVal >= pVals[tri[0]])
476 pointToLocal[tri[1]],
477 pointToLocal[tri[0]],
478 pointToLocal[tri[2]],
489 pointToLocal[tri[0]],
490 pointToLocal[tri[1]],
491 pointToLocal[tri[2]],
513 snappedCc[celli] = snappedPoints.size();
514 snappedPoints.append(info.hitPoint());
528 void Foam::isoSurfaceCell::genPointTris
535 DynamicList<point, 64>& localTriPoints
540 const face& f = mesh_.faces()[facei];
542 const label fp0 = mesh_.tetBasePtIs()[facei];
543 label fp = f.fcIndex(fp0);
544 for (
label i = 2; i < f.size(); i++)
546 label nextFp = f.fcIndex(fp);
547 triFace tri(f[fp0], f[fp], f[nextFp]);
557 label b = tri[tri.fcIndex(index)];
558 label c = tri[tri.rcIndex(index)];
561 FixedList<scalar, 3>
s(3);
562 s[0] = isoFraction(pointValues[pointi], pointValues[b]);
563 s[1] = isoFraction(pointValues[pointi], pointValues[c]);
564 s[2] = isoFraction(pointValues[pointi], cellValues[celli]);
568 (s[0] >= 0.0 && s[0] <= 0.5)
569 && (s[1] >= 0.0 && s[1] <= 0.5)
570 && (s[2] >= 0.0 && s[2] <= 0.5)
573 point p0 = (1.0-s[0])*pts[pointi] + s[0]*pts[b];
574 point p1 = (1.0-s[1])*pts[pointi] + s[1]*pts[c];
575 point p2 = (1.0-s[2])*pts[pointi] + s[2]*cc[celli];
579 (mesh_.faceOwner()[facei] == celli)
580 == (pointValues[pointi] > cellValues[celli])
583 localTriPoints.append(p0);
584 localTriPoints.append(p1);
585 localTriPoints.append(p2);
589 localTriPoints.append(p1);
590 localTriPoints.append(p0);
591 localTriPoints.append(p2);
600 void Foam::isoSurfaceCell::genPointTris
606 DynamicList<point, 64>& localTriPoints
610 const cell& cFaces = mesh_.cells()[celli];
612 FixedList<label, 4> tet;
616 const face& f = mesh_.faces()[facei];
622 const face& f1 = mesh_.faces()[cFaces[cFacei]];
642 label b = f[f.fcIndex(index)];
643 label c = f[f.rcIndex(index)];
649 FixedList<scalar, 3>
s(3);
650 s[0] = isoFraction(pointValues[pointi], pointValues[b]);
651 s[1] = isoFraction(pointValues[pointi], pointValues[c]);
652 s[2] = isoFraction(pointValues[pointi], pointValues[ccPointi]);
656 (s[0] >= 0.0 && s[0] <= 0.5)
657 && (s[1] >= 0.0 && s[1] <= 0.5)
658 && (s[2] >= 0.0 && s[2] <= 0.5)
661 point p0 = (1.0-s[0])*pts[pointi] + s[0]*pts[b];
662 point p1 = (1.0-s[1])*pts[pointi] + s[1]*pts[c];
663 point p2 = (1.0-s[2])*pts[pointi] + s[2]*pts[ccPointi];
665 if (mesh_.faceOwner()[facei] != celli)
667 localTriPoints.append(p0);
668 localTriPoints.append(p1);
669 localTriPoints.append(p2);
673 localTriPoints.append(p1);
674 localTriPoints.append(p0);
675 localTriPoints.append(p2);
681 void Foam::isoSurfaceCell::calcSnappedPoint
683 const PackedBoolList& isTet,
687 DynamicList<point>& snappedPoints,
693 PackedBoolList isBoundaryPoint(mesh_.nPoints());
694 const polyBoundaryMesh& patches = mesh_.boundaryMesh();
697 const polyPatch& pp = patches[
patchi];
701 label facei = pp.start();
704 const face& f = mesh_.faces()[facei++];
708 isBoundaryPoint.set(f[fp], 1);
715 const point greatPoint(great, great, great);
717 pointField collapsedPoint(mesh_.nPoints(), greatPoint);
721 DynamicList<point, 64> localTriPoints(100);
724 forAll(mesh_.pointFaces(), pointi)
726 if (isBoundaryPoint.get(pointi) == 1)
731 const labelList& pFaces = mesh_.pointFaces()[pointi];
737 label facei = pFaces[i];
741 cellCutType_[mesh_.faceOwner()[facei]] == CUT
743 mesh_.isInternalFace(facei)
744 && cellCutType_[mesh_.faceNeighbour()[facei]] == CUT
761 localPointCells.clear();
762 localTriPoints.clear();
766 label facei = pFaces[pFacei];
767 label own = mesh_.faceOwner()[facei];
769 if (isTet.get(own) == 1)
773 if (localPointCells.insert(own))
775 genPointTris(pVals, pointi, facei, own, localTriPoints);
791 if (mesh_.isInternalFace(facei))
793 label nei = mesh_.faceNeighbour()[facei];
795 if (isTet.get(nei) == 1)
797 if (localPointCells.insert(nei))
799 genPointTris(pVals, pointi, facei, nei, localTriPoints);
817 if (localTriPoints.size() == 3)
822 collapsedPoint[pointi] =
sum(points)/points.size();
828 else if (localTriPoints.size())
847 label nZones = surf.markZones
856 scalar minCos = great;
857 const vector& n0 = surf.faceNormals()[0];
858 for (
label i = 1; i < surf.size(); i++)
860 const vector&
n = surf.faceNormals()[i];
861 scalar cosAngle = (n0 &
n);
862 if (cosAngle < minCos)
869 collapsedPoint[pointi] = calcCentre(surf);
879 minMagSqrEqOp<point>(),
883 snappedPoint.setSize(mesh_.nPoints());
886 forAll(collapsedPoint, pointi)
890 if (
magSqr(collapsedPoint[pointi]) < 0.5*
magSqr(greatPoint))
892 snappedPoint[pointi] = snappedPoints.size();
893 snappedPoints.append(collapsedPoint[pointi]);
901 const bool checkDuplicates,
902 const List<point>& triPoints,
907 label nTris = triPoints.size()/3;
909 if ((triPoints.size() % 3) != 0)
912 <<
"Problem: number of points " << triPoints.size()
929 Pout<<
"isoSurfaceCell : merged from " << triPoints.size()
930 <<
" points down to " << newPoints.size() <<
endl;
946 <<
"Merged points contain duplicates" 947 <<
" when merging with distance " << mergeDistance_ <<
endl 948 <<
"merged:" << newPoints.size() <<
" re-merged:" 949 << newNewPoints.size()
955 List<labelledTri> tris;
957 DynamicList<labelledTri> dynTris(nTris);
959 DynamicList<label> newToOldTri(nTris);
961 for (
label oldTriI = 0; oldTriI < nTris; oldTriI++)
965 triPointReverseMap[rawPointi],
966 triPointReverseMap[rawPointi+1],
967 triPointReverseMap[rawPointi+2],
970 if ((tri[0] != tri[1]) && (tri[0] != tri[2]) && (tri[1] != tri[2]))
972 newToOldTri.append(oldTriI);
979 triMap.transfer(newToOldTri);
980 tris.transfer(dynTris);
992 Pout<<
"isoSurfaceCell : merged from " << nTris
993 <<
" down to " << tris.size() <<
" triangles." <<
endl;
999 centres[triI] = tris[triI].centre(newPoints);
1015 Pout<<
"isoSurfaceCell : detected " 1016 << centres.size()-mergedCentres.size()
1017 <<
" duplicate triangles." <<
endl;
1024 DynamicList<label> newToOldTri(tris.size());
1025 labelList newToMaster(mergedCentres.size(), -1);
1028 label mergedI = oldToMerged[triI];
1030 if (newToMaster[mergedI] == -1)
1032 newToMaster[mergedI] = triI;
1033 newToOldTri.append(triMap[triI]);
1034 tris[newTriI++] = tris[triI];
1038 triMap.transfer(newToOldTri);
1039 tris.setSize(newTriI);
1047 bool Foam::isoSurfaceCell::validTri(
const triSurface& surf,
const label facei)
1051 const labelledTri& f = surf[facei];
1055 if (f[fp] < 0 || f[fp] >= surf.points().size())
1058 <<
"triangle " << facei <<
" vertices " << f
1059 <<
" uses point indices outside point range 0.." 1060 << surf.points().size()-1 <<
endl;
1066 if ((f[0] == f[1]) || (f[0] == f[2]) || (f[1] == f[2]))
1069 <<
"triangle " << facei
1070 <<
" uses non-unique vertices " << f
1077 const labelList& fFaces = surf.faceFaces()[facei];
1083 label nbrFacei = fFaces[i];
1085 if (nbrFacei <= facei)
1091 const labelledTri& nbrF = surf[nbrFacei];
1095 ((f[0] == nbrF[0]) || (f[0] == nbrF[1]) || (f[0] == nbrF[2]))
1096 && ((f[1] == nbrF[0]) || (f[1] == nbrF[1]) || (f[1] == nbrF[2]))
1097 && ((f[2] == nbrF[0]) || (f[2] == nbrF[1]) || (f[2] == nbrF[2]))
1101 <<
"triangle " << facei <<
" vertices " << f
1102 <<
" coords:" << f.points(surf.points())
1103 <<
" has the same vertices as triangle " << nbrFacei
1104 <<
" vertices " << nbrF
1114 void Foam::isoSurfaceCell::calcAddressing
1116 const triSurface& surf,
1117 List<FixedList<label, 3>>& faceEdges,
1120 Map<labelList>& edgeFacesRest
1129 const labelledTri& tri = surf[triI];
1130 edgeCentres[edgeI++] = 0.5*(points[tri[0]]+points[tri[1]]);
1131 edgeCentres[edgeI++] = 0.5*(points[tri[1]]+points[tri[2]]);
1132 edgeCentres[edgeI++] = 0.5*(points[tri[2]]+points[tri[0]]);
1148 Pout<<
"isoSurfaceCell : detected " 1149 << mergedCentres.size()
1150 <<
" edges on " << surf.size() <<
" triangles." <<
endl;
1160 faceEdges.setSize(surf.size());
1164 faceEdges[triI][0] = oldToMerged[edgeI++];
1165 faceEdges[triI][1] = oldToMerged[edgeI++];
1166 faceEdges[triI][2] = oldToMerged[edgeI++];
1171 edgeFace0.setSize(mergedCentres.size());
1173 edgeFace1.setSize(mergedCentres.size());
1175 edgeFacesRest.clear();
1177 forAll(oldToMerged, oldEdgeI)
1179 label triI = oldEdgeI / 3;
1180 label edgeI = oldToMerged[oldEdgeI];
1182 if (edgeFace0[edgeI] == -1)
1184 edgeFace0[edgeI] = triI;
1186 else if (edgeFace1[edgeI] == -1)
1188 edgeFace1[edgeI] = triI;
1199 if (iter != edgeFacesRest.end())
1202 label sz = eFaces.size();
1203 eFaces.setSize(sz+1);
1208 edgeFacesRest.insert(edgeI,
labelList(1, triI));
1215 bool Foam::isoSurfaceCell::danglingTriangle
1217 const FixedList<label, 3>& fEdges,
1224 if (edgeFace1[fEdges[i]] == -1)
1230 if (nOpen == 1 || nOpen == 2 || nOpen == 3)
1241 Foam::label Foam::isoSurfaceCell::markDanglingTriangles
1243 const List<FixedList<label, 3>>& faceEdges,
1246 const Map<labelList>& edgeFacesRest,
1250 keepTriangles.setSize(faceEdges.size());
1251 keepTriangles =
true;
1253 label nDangling = 0;
1261 label edgeI = iter.key();
1262 const labelList& otherEdgeFaces = iter();
1265 if (danglingTriangle(faceEdges[edgeFace0[edgeI]], edgeFace1))
1267 keepTriangles[edgeFace0[edgeI]] =
false;
1270 if (danglingTriangle(faceEdges[edgeFace1[edgeI]], edgeFace1))
1272 keepTriangles[edgeFace1[edgeI]] =
false;
1275 forAll(otherEdgeFaces, i)
1277 label triI = otherEdgeFaces[i];
1278 if (danglingTriangle(faceEdges[triI], edgeFace1))
1280 keepTriangles[triI] =
false;
1291 const triSurface& s,
1299 createWithValues<boolList>
1308 newToOldPoints.setSize(s.points().size());
1309 oldToNewPoints.setSize(s.points().size());
1310 oldToNewPoints = -1;
1314 forAll(include, oldFacei)
1316 if (include[oldFacei])
1323 label oldPointi = f[fp];
1325 if (oldToNewPoints[oldPointi] == -1)
1327 oldToNewPoints[oldPointi] = pointi;
1328 newToOldPoints[pointi++] = oldPointi;
1333 newToOldPoints.setSize(pointi);
1338 forAll(newToOldPoints, i)
1340 newPoints[i] = s.points()[newToOldPoints[i]];
1343 List<labelledTri> newTriangles(newToOldFaces.size());
1348 const labelledTri& tri = s[newToOldFaces[i]];
1350 newTriangles[i][0] = oldToNewPoints[tri[0]];
1351 newTriangles[i][1] = oldToNewPoints[tri[1]];
1352 newTriangles[i][2] = oldToNewPoints[tri[2]];
1353 newTriangles[i].region() = tri.region();
1357 return triSurface(newTriangles, s.patches(), newPoints,
true);
1369 const bool regularise,
1370 const scalar mergeTol
1377 mergeDistance_(mergeTol*mesh.
bounds().
mag())
1381 Pout<<
"isoSurfaceCell : mergeTol:" << mergeTol
1383 <<
" mergeDistance:" << mergeDistance_ <<
endl;
1393 if (tet.
isA(mesh_, celli))
1395 isTet.set(celli, 1);
1402 calcCutTypes(isTet, cVals, pVals);
1421 snappedCc.
setSize(mesh_.nCells());
1427 Pout<<
"isoSurfaceCell : shifted " << snappedPoints.
size()
1428 <<
" cell centres to intersection." <<
endl;
1432 label nCellSnaps = snappedPoints.
size();
1449 snappedPoint.
setSize(mesh_.nPoints());
1455 Pout<<
"isoSurfaceCell : shifted " << snappedPoints.
size()-nCellSnaps
1456 <<
" vertices to intersection." <<
endl;
1469 mesh_.cellCentres(),
1482 Pout<<
"isoSurfaceCell : generated " << triMeshCells.
size()
1483 <<
" unmerged triangles." <<
endl;
1501 Pout<<
"isoSurfaceCell : generated " << triMap.
size()
1502 <<
" merged triangles." <<
endl;
1505 meshCells_.setSize(triMap.
size());
1508 meshCells_[i] = triMeshCells[triMap[i]];
1515 Pout<<
"isoSurfaceCell : checking " << size()
1516 <<
" triangles for validity." <<
endl;
1521 validTri(*
this, triI);
1547 label nDangling = markDanglingTriangles
1558 Pout<<
"isoSurfaceCell : detected " << nDangling
1559 <<
" dangling triangles." <<
endl;
1582 meshCells_ =
labelField(meshCells_, subsetTriMap);
Field< label > labelField
Specialisation of Field<T> for label.
A cellMatcher for tet cells.
#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.
void inplaceRenumber(const labelUList &oldToNew, ListType &)
Inplace renumber the values of a list.
friend Ostream & operator(Ostream &, const UList< T > &)
List< geometricSurfacePatch > geometricSurfacePatchList
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
HashTable< T, label, Hash< label > >::iterator iterator
void size(const label)
Override size to be inconsistent with allocated storage.
Ostream & endl(Ostream &os)
Add newline and flush stream.
This class describes the interaction of (usually) a face and a point. It carries the info of a succes...
PointIndexHit< point > pointIndexHit
Vector< scalar > vector
A scalar version of the templated Vector.
labelList findIndices(const ListType &, typename ListType::const_reference, const label start=0)
Find all occurrences of given element. Linear search.
Macros for easy insertion into run-time selection tables.
dimensioned< Type > sum(const DimensionedField< Type, GeoMesh > &df)
List< bool > boolList
Bool container classes.
iterator find(const Key &)
Find and return an iterator set at the hashedEntry.
HashSet< label, Hash< label > > labelHashSet
A HashSet with label keys.
gmvFile<< "tracers "<< particles.size()<< nl;forAllConstIter(Cloud< passiveParticle >, particles, iter){ gmvFile<< iter().position().x()<< " ";}gmvFile<< nl;forAllConstIter(Cloud< passiveParticle >, particles, iter){ gmvFile<< iter().position().y()<< " ";}gmvFile<< nl;forAllConstIter(Cloud< passiveParticle >, particles, iter){ gmvFile<< iter().position().z()<< " ";}gmvFile<< nl;forAll(lagrangianScalarNames, i){ word name=lagrangianScalarNames[i];IOField< scalar > s(IOobject(name, runTime.timeName(), cloud::prefix, mesh, IOobject::MUST_READ, IOobject::NO_WRITE))
vectorField pointField
pointField is a vectorField.
An ordered pair of two objects of type <T> with first() and second() elements.
A 1D vector of objects of type <T> that resizes itself as necessary to accept the new objects...
Field< scalar > scalarField
Specialisation of Field<T> for scalar.
scalar mag() const
The magnitude of the bounding box span.
Pair< label > labelPair
Label pair.
List< label > labelList
A List of labels.
forAllConstIter(PtrDictionary< phaseModel >, mixture.phases(), phase)
errorManip< error > abort(error &err)
Templated 3D Vector derived from VectorSpace adding construction from 3 components, element access using x(), y() and z() member functions and the inner-product (dot-product) and cross product operators.
dimensioned< scalar > magSqr(const dimensioned< Type > &)
DynamicList< T, SizeInc, SizeMult, SizeDiv > & shrink()
Shrink the allocated space to the number of elements used.
defineTypeNameAndDebug(combustionModel, 0)
label findIndex(const ListType &, typename ListType::const_reference, const label start=0)
Find first occurrence of given element and return index,.
virtual bool isA(const primitiveMesh &mesh, const label celli)
Exact match. Uses faceSizeMatch.
isoSurfaceCell(const polyMesh &mesh, const scalarField &cellValues, const scalarField &pointValues, const scalar iso, const bool regularise, const scalar mergeTol=1e-6)
Construct from dictionary.
void setSize(const label)
Reset size of List.
const boundBox & bounds() const
Return mesh bounding box.
vector point
Point is a vector.
#define WarningInFunction
Report a warning using Foam::Warning.
prefixOSstream Pout(cout, "Pout")
label mergePoints(const UList< Type > &points, const scalar mergeTol, const bool verbose, labelList &pointMap, const Type &origin=Type::zero)
Sorts and merges points. All points closer than/equal mergeTol get merged.
dimensioned< scalar > mag(const dimensioned< Type > &)
Mesh consisting of general polyhedral cells.
Triangulated surface description with patch information.
void transfer(List< T > &)
Transfer the contents of the argument List into this list.
A HashTable to objects of type <T> with a label key.