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 vector n0 = tri0.normal(localPoints);
290 vector n1 = tri1.normal(localPoints);
303 tri0.centre(localPoints)
304 + tri1.centre(localPoints)
311 else if (localTris.size())
321 localTris.clearStorage();
324 label nZones = surf.markZones
333 scalar minCos = GREAT;
334 const vector& n0 = surf.faceNormals()[0];
335 for (
label i = 1; i < surf.size(); i++)
337 scalar cosAngle = (n0 & surf.faceNormals()[i]);
338 if (cosAngle < minCos)
346 info.setPoint(calcCentre(surf));
356 void Foam::isoSurfaceCell::calcSnappedCc
358 const PackedBoolList& isTet,
362 DynamicList<point>& snappedPoints,
369 snappedCc.
setSize(mesh_.nCells());
373 DynamicList<point, 64> localPoints(64);
374 DynamicList<labelledTri, 64> localTris(64);
375 Map<label> pointToLocal(64);
377 forAll(mesh_.cells(), celli)
379 if (cellCutType_[celli] == CUT && isTet.get(celli) == 0)
381 scalar cVal = cVals[celli];
383 const cell& cFaces = mesh_.cells()[celli];
387 pointToLocal.clear();
394 const face& f = mesh_.faces()[cFaces[cFacei]];
398 label pointi = f[fp];
400 scalar s = isoFraction(cVal, pVals[pointi]);
402 if (s >= 0.0 && s <= 0.5)
404 if (pointToLocal.insert(pointi, localPoints.size()))
406 localPoints.append((1.0-s)*cc[celli]+s*pts[pointi]);
412 if (localPoints.size() == 1)
415 snappedCc[celli] = snappedPoints.size();
416 snappedPoints.append(localPoints[0]);
424 else if (localPoints.size() == 2)
427 snappedCc[celli] = snappedPoints.size();
428 snappedPoints.append(0.5*(localPoints[0]+localPoints[1]));
436 else if (localPoints.size())
441 label facei = cFaces[cFacei];
442 const face& f = mesh_.faces()[facei];
448 const label fp0 = mesh_.tetBasePtIs()[facei];
449 label fp = f.fcIndex(fp0);
450 for (
label i = 2; i < f.size(); i++)
452 label nextFp = f.fcIndex(fp);
453 triFace tri(f[fp0], f[fp], f[nextFp]);
456 FixedList<scalar, 3>
s(3);
457 s[0] = isoFraction(cVal, pVals[tri[0]]);
458 s[1] = isoFraction(cVal, pVals[tri[1]]);
459 s[2] = isoFraction(cVal, pVals[tri[2]]);
463 (s[0] >= 0.0 && s[0] <= 0.5)
464 && (s[1] >= 0.0 && s[1] <= 0.5)
465 && (s[2] >= 0.0 && s[2] <= 0.5)
470 (mesh_.faceOwner()[facei] == celli)
471 == (cVal >= pVals[tri[0]])
478 pointToLocal[tri[1]],
479 pointToLocal[tri[0]],
480 pointToLocal[tri[2]],
491 pointToLocal[tri[0]],
492 pointToLocal[tri[1]],
493 pointToLocal[tri[2]],
515 snappedCc[celli] = snappedPoints.size();
516 snappedPoints.append(info.hitPoint());
530 void Foam::isoSurfaceCell::genPointTris
537 DynamicList<point, 64>& localTriPoints
542 const face& f = mesh_.faces()[facei];
544 const label fp0 = mesh_.tetBasePtIs()[facei];
545 label fp = f.fcIndex(fp0);
546 for (
label i = 2; i < f.size(); i++)
548 label nextFp = f.fcIndex(fp);
549 triFace tri(f[fp0], f[fp], f[nextFp]);
559 label b = tri[tri.fcIndex(index)];
560 label c = tri[tri.rcIndex(index)];
563 FixedList<scalar, 3>
s(3);
564 s[0] = isoFraction(pointValues[pointi], pointValues[b]);
565 s[1] = isoFraction(pointValues[pointi], pointValues[c]);
566 s[2] = isoFraction(pointValues[pointi], cellValues[celli]);
570 (s[0] >= 0.0 && s[0] <= 0.5)
571 && (s[1] >= 0.0 && s[1] <= 0.5)
572 && (s[2] >= 0.0 && s[2] <= 0.5)
575 point p0 = (1.0-s[0])*pts[pointi] + s[0]*pts[b];
576 point p1 = (1.0-s[1])*pts[pointi] + s[1]*pts[c];
577 point p2 = (1.0-s[2])*pts[pointi] + s[2]*cc[celli];
581 (mesh_.faceOwner()[facei] == celli)
582 == (pointValues[pointi] > cellValues[celli])
585 localTriPoints.append(p0);
586 localTriPoints.append(p1);
587 localTriPoints.append(p2);
591 localTriPoints.append(p1);
592 localTriPoints.append(p0);
593 localTriPoints.append(p2);
602 void Foam::isoSurfaceCell::genPointTris
608 DynamicList<point, 64>& localTriPoints
612 const cell& cFaces = mesh_.cells()[celli];
614 FixedList<label, 4> tet;
618 const face& f = mesh_.faces()[facei];
624 const face& f1 = mesh_.faces()[cFaces[cFacei]];
644 label b = f[f.fcIndex(index)];
645 label c = f[f.rcIndex(index)];
651 FixedList<scalar, 3>
s(3);
652 s[0] = isoFraction(pointValues[pointi], pointValues[b]);
653 s[1] = isoFraction(pointValues[pointi], pointValues[c]);
654 s[2] = isoFraction(pointValues[pointi], pointValues[ccPointi]);
658 (s[0] >= 0.0 && s[0] <= 0.5)
659 && (s[1] >= 0.0 && s[1] <= 0.5)
660 && (s[2] >= 0.0 && s[2] <= 0.5)
663 point p0 = (1.0-s[0])*pts[pointi] + s[0]*pts[b];
664 point p1 = (1.0-s[1])*pts[pointi] + s[1]*pts[c];
665 point p2 = (1.0-s[2])*pts[pointi] + s[2]*pts[ccPointi];
667 if (mesh_.faceOwner()[facei] != celli)
669 localTriPoints.append(p0);
670 localTriPoints.append(p1);
671 localTriPoints.append(p2);
675 localTriPoints.append(p1);
676 localTriPoints.append(p0);
677 localTriPoints.append(p2);
683 void Foam::isoSurfaceCell::calcSnappedPoint
685 const PackedBoolList& isTet,
689 DynamicList<point>& snappedPoints,
695 PackedBoolList isBoundaryPoint(mesh_.nPoints());
696 const polyBoundaryMesh& patches = mesh_.boundaryMesh();
699 const polyPatch& pp = patches[
patchi];
703 label facei = pp.start();
706 const face& f = mesh_.faces()[facei++];
710 isBoundaryPoint.set(f[fp], 1);
717 const point greatPoint(GREAT, GREAT, GREAT);
719 pointField collapsedPoint(mesh_.nPoints(), greatPoint);
723 DynamicList<point, 64> localTriPoints(100);
726 forAll(mesh_.pointFaces(), pointi)
728 if (isBoundaryPoint.get(pointi) == 1)
733 const labelList& pFaces = mesh_.pointFaces()[pointi];
739 label facei = pFaces[i];
743 cellCutType_[mesh_.faceOwner()[facei]] == CUT
745 mesh_.isInternalFace(facei)
746 && cellCutType_[mesh_.faceNeighbour()[facei]] == CUT
763 localPointCells.clear();
764 localTriPoints.clear();
768 label facei = pFaces[pFacei];
769 label own = mesh_.faceOwner()[facei];
771 if (isTet.get(own) == 1)
775 if (localPointCells.insert(own))
777 genPointTris(pVals, pointi, facei, own, localTriPoints);
793 if (mesh_.isInternalFace(facei))
795 label nei = mesh_.faceNeighbour()[facei];
797 if (isTet.get(nei) == 1)
799 if (localPointCells.insert(nei))
801 genPointTris(pVals, pointi, facei, nei, localTriPoints);
819 if (localTriPoints.size() == 3)
824 collapsedPoint[pointi] =
sum(points)/points.size();
830 else if (localTriPoints.size())
849 label nZones = surf.markZones
858 scalar minCos = GREAT;
859 const vector& n0 = surf.faceNormals()[0];
860 for (
label i = 1; i < surf.size(); i++)
862 const vector&
n = surf.faceNormals()[i];
863 scalar cosAngle = (n0 &
n);
864 if (cosAngle < minCos)
871 collapsedPoint[pointi] = calcCentre(surf);
881 minMagSqrEqOp<point>(),
885 snappedPoint.setSize(mesh_.nPoints());
888 forAll(collapsedPoint, pointi)
892 if (
magSqr(collapsedPoint[pointi]) < 0.5*
magSqr(greatPoint))
894 snappedPoint[pointi] = snappedPoints.size();
895 snappedPoints.append(collapsedPoint[pointi]);
903 const bool checkDuplicates,
904 const List<point>& triPoints,
909 label nTris = triPoints.size()/3;
911 if ((triPoints.size() % 3) != 0)
914 <<
"Problem: number of points " << triPoints.size()
931 Pout<<
"isoSurfaceCell : merged from " << triPoints.size()
932 <<
" points down to " << newPoints.size() <<
endl;
948 <<
"Merged points contain duplicates" 949 <<
" when merging with distance " << mergeDistance_ <<
endl 950 <<
"merged:" << newPoints.size() <<
" re-merged:" 951 << newNewPoints.size()
957 List<labelledTri> tris;
959 DynamicList<labelledTri> dynTris(nTris);
961 DynamicList<label> newToOldTri(nTris);
963 for (
label oldTriI = 0; oldTriI < nTris; oldTriI++)
967 triPointReverseMap[rawPointi],
968 triPointReverseMap[rawPointi+1],
969 triPointReverseMap[rawPointi+2],
972 if ((tri[0] != tri[1]) && (tri[0] != tri[2]) && (tri[1] != tri[2]))
974 newToOldTri.append(oldTriI);
981 triMap.transfer(newToOldTri);
982 tris.transfer(dynTris);
994 Pout<<
"isoSurfaceCell : merged from " << nTris
995 <<
" down to " << tris.size() <<
" triangles." <<
endl;
1001 centres[triI] = tris[triI].centre(newPoints);
1017 Pout<<
"isoSurfaceCell : detected " 1018 << centres.size()-mergedCentres.size()
1019 <<
" duplicate triangles." <<
endl;
1026 DynamicList<label> newToOldTri(tris.size());
1027 labelList newToMaster(mergedCentres.size(), -1);
1030 label mergedI = oldToMerged[triI];
1032 if (newToMaster[mergedI] == -1)
1034 newToMaster[mergedI] = triI;
1035 newToOldTri.append(triMap[triI]);
1036 tris[newTriI++] = tris[triI];
1040 triMap.transfer(newToOldTri);
1041 tris.setSize(newTriI);
1049 bool Foam::isoSurfaceCell::validTri(
const triSurface& surf,
const label facei)
1053 const labelledTri& f = surf[facei];
1057 if (f[fp] < 0 || f[fp] >= surf.points().size())
1060 <<
"triangle " << facei <<
" vertices " << f
1061 <<
" uses point indices outside point range 0.." 1062 << surf.points().size()-1 <<
endl;
1068 if ((f[0] == f[1]) || (f[0] == f[2]) || (f[1] == f[2]))
1071 <<
"triangle " << facei
1072 <<
" uses non-unique vertices " << f
1079 const labelList& fFaces = surf.faceFaces()[facei];
1085 label nbrFacei = fFaces[i];
1087 if (nbrFacei <= facei)
1093 const labelledTri& nbrF = surf[nbrFacei];
1097 ((f[0] == nbrF[0]) || (f[0] == nbrF[1]) || (f[0] == nbrF[2]))
1098 && ((f[1] == nbrF[0]) || (f[1] == nbrF[1]) || (f[1] == nbrF[2]))
1099 && ((f[2] == nbrF[0]) || (f[2] == nbrF[1]) || (f[2] == nbrF[2]))
1103 <<
"triangle " << facei <<
" vertices " << f
1104 <<
" coords:" << f.points(surf.points())
1105 <<
" has the same vertices as triangle " << nbrFacei
1106 <<
" vertices " << nbrF
1116 void Foam::isoSurfaceCell::calcAddressing
1118 const triSurface& surf,
1119 List<FixedList<label, 3>>& faceEdges,
1122 Map<labelList>& edgeFacesRest
1131 const labelledTri& tri = surf[triI];
1132 edgeCentres[edgeI++] = 0.5*(points[tri[0]]+points[tri[1]]);
1133 edgeCentres[edgeI++] = 0.5*(points[tri[1]]+points[tri[2]]);
1134 edgeCentres[edgeI++] = 0.5*(points[tri[2]]+points[tri[0]]);
1150 Pout<<
"isoSurfaceCell : detected " 1151 << mergedCentres.size()
1152 <<
" edges on " << surf.size() <<
" triangles." <<
endl;
1162 faceEdges.setSize(surf.size());
1166 faceEdges[triI][0] = oldToMerged[edgeI++];
1167 faceEdges[triI][1] = oldToMerged[edgeI++];
1168 faceEdges[triI][2] = oldToMerged[edgeI++];
1173 edgeFace0.setSize(mergedCentres.size());
1175 edgeFace1.setSize(mergedCentres.size());
1177 edgeFacesRest.clear();
1179 forAll(oldToMerged, oldEdgeI)
1181 label triI = oldEdgeI / 3;
1182 label edgeI = oldToMerged[oldEdgeI];
1184 if (edgeFace0[edgeI] == -1)
1186 edgeFace0[edgeI] = triI;
1188 else if (edgeFace1[edgeI] == -1)
1190 edgeFace1[edgeI] = triI;
1201 if (iter != edgeFacesRest.end())
1204 label sz = eFaces.size();
1205 eFaces.setSize(sz+1);
1210 edgeFacesRest.insert(edgeI,
labelList(1, triI));
1217 bool Foam::isoSurfaceCell::danglingTriangle
1219 const FixedList<label, 3>& fEdges,
1226 if (edgeFace1[fEdges[i]] == -1)
1232 if (nOpen == 1 || nOpen == 2 || nOpen == 3)
1243 Foam::label Foam::isoSurfaceCell::markDanglingTriangles
1245 const List<FixedList<label, 3>>& faceEdges,
1248 const Map<labelList>& edgeFacesRest,
1252 keepTriangles.setSize(faceEdges.size());
1253 keepTriangles =
true;
1255 label nDangling = 0;
1263 label edgeI = iter.key();
1264 const labelList& otherEdgeFaces = iter();
1267 if (danglingTriangle(faceEdges[edgeFace0[edgeI]], edgeFace1))
1269 keepTriangles[edgeFace0[edgeI]] =
false;
1272 if (danglingTriangle(faceEdges[edgeFace1[edgeI]], edgeFace1))
1274 keepTriangles[edgeFace1[edgeI]] =
false;
1277 forAll(otherEdgeFaces, i)
1279 label triI = otherEdgeFaces[i];
1280 if (danglingTriangle(faceEdges[triI], edgeFace1))
1282 keepTriangles[triI] =
false;
1293 const triSurface& s,
1301 createWithValues<boolList>
1310 newToOldPoints.setSize(s.points().size());
1311 oldToNewPoints.setSize(s.points().size());
1312 oldToNewPoints = -1;
1316 forAll(include, oldFacei)
1318 if (include[oldFacei])
1325 label oldPointi = f[fp];
1327 if (oldToNewPoints[oldPointi] == -1)
1329 oldToNewPoints[oldPointi] = pointi;
1330 newToOldPoints[pointi++] = oldPointi;
1335 newToOldPoints.setSize(pointi);
1340 forAll(newToOldPoints, i)
1342 newPoints[i] = s.points()[newToOldPoints[i]];
1345 List<labelledTri> newTriangles(newToOldFaces.size());
1350 const labelledTri& tri = s[newToOldFaces[i]];
1352 newTriangles[i][0] = oldToNewPoints[tri[0]];
1353 newTriangles[i][1] = oldToNewPoints[tri[1]];
1354 newTriangles[i][2] = oldToNewPoints[tri[2]];
1355 newTriangles[i].region() = tri.region();
1359 return triSurface(newTriangles, s.patches(), newPoints,
true);
1371 const bool regularise,
1372 const scalar mergeTol
1379 mergeDistance_(mergeTol*mesh.
bounds().
mag())
1383 Pout<<
"isoSurfaceCell : mergeTol:" << mergeTol
1385 <<
" mergeDistance:" << mergeDistance_ <<
endl;
1395 if (tet.
isA(mesh_, celli))
1397 isTet.set(celli, 1);
1404 calcCutTypes(isTet, cVals, pVals);
1423 snappedCc.
setSize(mesh_.nCells());
1429 Pout<<
"isoSurfaceCell : shifted " << snappedPoints.
size()
1430 <<
" cell centres to intersection." <<
endl;
1434 label nCellSnaps = snappedPoints.
size();
1451 snappedPoint.
setSize(mesh_.nPoints());
1457 Pout<<
"isoSurfaceCell : shifted " << snappedPoints.
size()-nCellSnaps
1458 <<
" vertices to intersection." <<
endl;
1471 mesh_.cellCentres(),
1484 Pout<<
"isoSurfaceCell : generated " << triMeshCells.
size()
1485 <<
" unmerged triangles." <<
endl;
1503 Pout<<
"isoSurfaceCell : generated " << triMap.
size()
1504 <<
" merged triangles." <<
endl;
1507 meshCells_.setSize(triMap.
size());
1510 meshCells_[i] = triMeshCells[triMap[i]];
1517 Pout<<
"isoSurfaceCell : checking " << size()
1518 <<
" triangles for validity." <<
endl;
1523 validTri(*
this, triI);
1549 label nDangling = markDanglingTriangles
1560 Pout<<
"isoSurfaceCell : detected " << nDangling
1561 <<
" dangling triangles." <<
endl;
1584 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 > &)
const boundBox & bounds() const
Return mesh bounding box.
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 occurences 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.
scalar mag() const
The magnitude of the bounding box span.
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.
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 > &)
prefixOSstream Pout(cout,"Pout")
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 occurence 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.
vector point
Point is a vector.
#define WarningInFunction
Report a warning using Foam::Warning.
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.