Go to the documentation of this file.
28 #include "triSurface.H"
60 if (refine[faceI] == RED)
71 forAll(myNeighbours, myNeighbourI)
73 label neighbourFaceI = myNeighbours[myNeighbourI];
75 if (refine[neighbourFaceI] == GREEN)
78 calcRefineStatus(surf, neighbourFaceI, refine);
80 else if (refine[neighbourFaceI] == NONE)
82 refine[neighbourFaceI] = GREEN;
95 const label newPointI,
105 label fp1 =
f.fcIndex(fp0);
106 label fp2 =
f.fcIndex(fp1);
180 forAll(refineStatus, faceI)
182 if (refineStatus[faceI] == RED)
189 label edgeI = fEdges[i];
191 if (edgeMid[edgeI] == -1)
204 edgeMid[edgeI] = newVertI++;
219 edges[fEdges[0]].commonVertex(edges[fEdges[1]]),
230 edges[fEdges[1]].commonVertex(edges[fEdges[2]]),
241 edges[fEdges[2]].commonVertex(edges[fEdges[0]]),
263 const label edgeI = fEdges[i];
267 if ((otherFaceI != -1) && (refineStatus[otherFaceI] == GREEN))
283 forAll(refineStatus, faceI)
285 if (refineStatus[faceI] == NONE)
314 const vector common(pEnd - pStart);
315 const vector base0(pLeft - pStart);
316 const vector base1(pRight - pStart);
318 vector n0(common ^ base0);
321 vector n1(base1 ^ common);
357 label faceI = myFaces[myFaceI];
359 if ((faceStatus[faceI] == ANYEDGE) || (faceStatus[faceI] >= 0))
361 faceStatus[faceI] = NOEDGE;
390 facesToBeCollapsed.
insert(myFaces[myFaceI]);
401 label face1I = v1Faces[v1FaceI];
403 label otherEdgeI = oppositeEdge(surf, face1I, v1);
411 if (oppositeVertex(surf, face2I, otherEdgeI) == v2)
415 facesToBeCollapsed.
insert(face1I);
416 facesToBeCollapsed.
insert(face2I);
421 return facesToBeCollapsed;
437 label face1I = myFaces[myFaceI];
439 if (faceUsed.
found(face1I))
470 if (!collapsedFaces.
found(v2Faces[v2FaceI]))
472 v2FacesHash.
insert(v2Faces[v2FaceI]);
479 label face1I = v1Faces[v1FaceI];
481 if (collapsedFaces.
found(face1I))
505 label commonVert = vert1I;
506 label face2I = vertexUsesFace(surf, v2FacesHash, commonVert);
510 face2I = vertexUsesFace(surf, v2FacesHash, commonVert);
516 label edge1I = getEdge(surf, v1, commonVert);
517 label edge2I = getEdge(surf, v2, commonVert);
519 edgeToEdge.insert(edge1I, edge2I);
520 edgeToEdge.insert(edge2I, edge1I);
522 edgeToFace.insert(edge1I, face2I);
523 edgeToFace.insert(edge2I, face1I);
547 label C = oppositeVertex(surf, faceI, edgeI);
553 if (edgeToEdge.found(edgeI))
556 label edge2I = edgeToEdge[edgeI];
557 face2I = edgeToFace[edgeI];
559 D = oppositeVertex(surf, face2I, edge2I);
566 if ((face2I != -1) && !collapsedFaces.
found(face2I))
568 D = oppositeVertex(surf, face2I, edgeI);
578 cosAngle = faceCosAngle
588 cosAngle = faceCosAngle
598 cosAngle = faceCosAngle
608 cosAngle = faceCosAngle
619 <<
"face " << faceI <<
" does not use vertex "
645 label faceI = v1Faces[v1FaceI];
647 if (collapsedFaces.
found(faceI))
656 label edgeI = myEdges[myEdgeI];
698 label faceI = v1Faces[v1FaceI];
700 if (collapsedFaces.
found(faceI))
709 label edgeI = myEdges[myEdgeI];
846 const label excludeEdgeI,
847 const label excludePointI,
849 const point& triPoint,
850 const plane& cutPlane,
856 const labelList& fEdges =
s.faceEdges()[triI];
873 if (
mag(d[i]) < 1
e-6)
882 if (excludePointI != -1)
894 label fp1 =
f.fcIndex(fp0);
895 label fp2 =
f.fcIndex(fp1);
902 cut.elementType() = triPointRef::POINT;
903 cut.setIndex(
s.localFaces()[triI][fp1]);
905 else if (d[fp2] == 0.0)
909 cut.elementType() = triPointRef::POINT;
910 cut.setIndex(
s.localFaces()[triI][fp2]);
914 (d[fp1] < 0 && d[fp2] < 0)
915 || (d[fp1] > 0 && d[fp2] > 0)
929 cut.elementType() = triPointRef::EDGE;
930 cut.setIndex(fEdges[fp1]);
941 label fp1 =
f.fcIndex(fp0);
948 <<
"problem : triangle has three intersections." <<
nl
949 <<
"triangle:" <<
f.tri(
points)
952 inters[interI].setHit();
953 inters[interI].setPoint(
points[
f[fp0]]);
954 inters[interI].elementType() = triPointRef::POINT;
955 inters[interI].setIndex(
s.localFaces()[triI][fp0]);
960 (d[fp0] < 0 && d[fp1] > 0)
961 || (d[fp0] > 0 && d[fp1] < 0)
967 <<
"problem : triangle has three intersections." <<
nl
968 <<
"triangle:" <<
f.tri(
points)
971 inters[interI].setHit();
972 inters[interI].setPoint
977 inters[interI].elementType() = triPointRef::EDGE;
978 inters[interI].setIndex(fEdges[fp0]);
988 else if (interI == 1)
993 else if (interI == 2)
998 inters[0].elementType() == triPointRef::EDGE
999 && inters[0].index() == excludeEdgeI
1006 inters[1].elementType() == triPointRef::EDGE
1007 && inters[1].index() == excludeEdgeI
1078 else if (current.
elementType() == triPointRef::EDGE)
1097 if (current.
index() ==
e[0] || current.
index() ==
e[1])
1127 else if (current.
elementType() == triPointRef::EDGE)
1170 const label excludeEdgeI,
1171 const label excludePointI,
1173 const plane& cutPlane
1182 label triI = eFaces[i];
1211 if (excludeEdgeI != -1 && !cutInfo.
hit())
1214 <<
"Triangle:" << triI
1215 <<
" excludeEdge:" << excludeEdgeI
1217 <<
" plane:" << cutPlane
1225 if (distSqr < minDistSqr)
1227 minDistSqr = distSqr;
1262 const point& pt = pts[pointI];
1264 outFile<<
"v " << pt.
x() <<
' ' << pt.
y() <<
' ' << pt.
z() <<
endl;
1266 Pout<<
"Written " << pts.size() <<
" vertices to file " << fName <<
endl;
1281 forAll(markedVerts, vertI)
1283 if (markedVerts[vertI])
1287 outFile<<
"v " << pt.
x() <<
' ' << pt.
y() <<
' ' << pt.
z() <<
endl;
1292 Pout<<
"Written " << nVerts <<
" vertices to file " << fName <<
endl;
1311 label face1I = myFaces[0];
1313 if (myFaces.
size() == 2)
1315 face2I = myFaces[1];
1326 forAll(startFaces, startFaceI)
1328 edgeTris[nTris++] = startFaces[startFaceI];
1331 forAll(endFaces, endFaceI)
1333 label faceI = endFaces[endFaceI];
1335 if ((faceI != face1I) && (faceI != face2I))
1337 edgeTris[nTris++] = faceI;
1362 const edge&
e = edges[v1Edges[v1EdgeI]];
1363 vertexNeighbours.
insert(
e.otherVertex(v1));
1370 const edge&
e = edges[v2Edges[v2EdgeI]];
1372 label vertI =
e.otherVertex(v2);
1374 vertexNeighbours.
insert(vertI);
1376 return vertexNeighbours.
toc();
1438 if (myFaces.
size() != 2)
1444 if (faceI == myFaces[0])
1473 <<
"Edge " << surf.
edges()[edgeI] <<
" not in face "
1477 label i1 = eFaces.fcIndex(i0);
1478 label i2 = eFaces.fcIndex(i1);
1502 else if (vertI ==
f[1])
1507 else if (vertI ==
f[2])
1532 label edgeI = myEdges[myEdgeI];
1536 if ((
e.start() != vertI) && (
e.end() != vertI))
1543 <<
"Cannot find vertex " << vertI <<
" in edges of face " << faceI
1565 if (vertI !=
e.start() && vertI !=
e.end())
1572 <<
"Cannot find vertex opposite edge " << edgeI <<
" vertices " <<
e
1591 label edgeI = v1Edges[v1EdgeI];
1594 if ((
e.start() == v2) || (
e.end() == v2))
1612 if ((e0I == e1I) || (e0I == e2I) || (e1I == e2I))
1615 <<
"Duplicate edge labels : e0:" << e0I <<
" e1:" << e1I
1624 label faceI = eFaces[eFaceI];
1631 || (myEdges[1] == e1I)
1632 || (myEdges[2] == e1I)
1638 || (myEdges[1] == e2I)
1639 || (myEdges[2] == e2I)
1699 return collapseEdges(surf, collapsableEdges, edgeMids, faceStatus);
1721 forAll(localPoints, pointI)
1723 pointMap[pointI] = pointI;
1729 forAll(collapseEdgeLabels, collapseEdgeI)
1731 const label edgeI = collapseEdgeLabels[collapseEdgeI];
1733 if ((edgeI < 0) || (edgeI >= surf.
nEdges()))
1736 <<
"Edge label outside valid range." <<
endl
1737 <<
"edge label:" << edgeI <<
endl
1738 <<
"total number of edges:" << surf.
nEdges() <<
endl
1742 const labelList& neighbours = edgeFaces[edgeI];
1744 if (neighbours.
size() == 2)
1746 const label stat0 = faceStatus[neighbours[0]];
1747 const label stat1 = faceStatus[neighbours[1]];
1752 ((stat0 == ANYEDGE) || (stat0 == edgeI))
1753 && ((stat1 == ANYEDGE) || (stat1 == edgeI))
1756 const edge&
e = edges[edgeI];
1761 (pointMap[
e.start()] !=
e.start())
1762 || (pointMap[
e.end()] !=
e.end())
1766 <<
"points already mapped. Double collapse." <<
endl
1767 <<
"edgeI:" << edgeI
1768 <<
" start:" <<
e.start()
1769 <<
" end:" <<
e.end()
1770 <<
" pointMap[start]:" << pointMap[
e.start()]
1771 <<
" pointMap[end]:" << pointMap[
e.end()]
1775 const label minVert =
min(
e.start(),
e.end());
1776 pointMap[
e.start()] = minVert;
1777 pointMap[
e.end()] = minVert;
1780 newPoints[minVert] = edgeMids[edgeI];
1783 protectNeighbours(surf,
e.start(), faceStatus);
1784 protectNeighbours(surf,
e.end(), faceStatus);
1788 oppositeVertex(surf, neighbours[0], edgeI),
1794 oppositeVertex(surf, neighbours[1], edgeI),
1806 forAll(collapseFaces, collapseI)
1808 faceStatus[collapseFaces[collapseI]] = COLLAPSED;
1823 forAll(localFaces, faceI)
1827 const label a = pointMap[
f[0]];
1828 const label b = pointMap[
f[1]];
1829 const label c = pointMap[
f[2]];
1833 (a !=
b) && (a !=
c) && (
b !=
c)
1834 && (faceStatus[faceI] != COLLAPSED)
1875 forAll(refineFaces, refineFaceI)
1877 calcRefineStatus(surf, refineFaces[refineFaceI], refineStatus);
1881 return doRefine(surf, refineStatus);
1903 forAll(refineEdges, refineEdgeI)
1905 label edgeI = refineEdges[refineEdgeI];
1909 bool neighbourIsRefined=
false;
1913 if (refineStatus[myFaces[myFaceI]] != NONE)
1915 neighbourIsRefined =
true;
1920 if (!neighbourIsRefined)
1932 newPoints[newPointI] = mid;
1948 refineStatus[myFaces[myFaceI]] = GREEN;
1958 if (refineStatus[faceI] == NONE)
1965 newPoints.setSize(newPointI);
1983 scalar minLength = GREAT;
1984 label minIndex = -1;
1987 const edge&
e = surf.
edges()[edgeIndices[i]];
1996 if (length < minLength)
2002 return edgeIndices[minIndex];
2013 scalar maxLength = -GREAT;
2014 label maxIndex = -1;
2017 const edge&
e = surf.
edges()[edgeIndices[i]];
2026 if (length > maxLength)
2032 return edgeIndices[maxIndex];
2040 const scalar mergeTol
2062 label newTriangleI = 0;
2068 label newA = pointMap[
f[0]];
2069 label newB = pointMap[
f[1]];
2070 label newC = pointMap[
f[2]];
2072 if ((newA != newB) && (newA != newC) && (newB != newC))
2074 newTriangles[newTriangleI++] =
2078 newTriangles.
setSize(newTriangleI);
2099 const label nearestFaceI,
2100 const point& nearestPt
2106 label nearType, nearLabel;
2108 f.nearestPointClassify(nearestPt,
points, nearType, nearLabel);
2110 if (nearType == triPointRef::NONE)
2115 else if (nearType == triPointRef::EDGE)
2123 vector edgeNormal(vector::zero);
2129 return edgeNormal/(
mag(edgeNormal) + VSMALL);
2143 const point& sample,
2144 const point& nearestPoint,
2150 if (eFaces.
size() != 2)
2162 vector n = 0.5*(faceNormals[eFaces[0]] + faceNormals[eFaces[1]]);
2164 if (((sample - nearestPoint) &
n) > 0)
2180 const point& sample,
2181 const label nearestFaceI
2188 label nearType, nearLabel;
2190 pointHit pHit =
f.nearestPointClassify(sample,
points, nearType, nearLabel);
2194 if (nearType == triPointRef::NONE)
2196 vector sampleNearestVec = (sample - nearestPoint);
2199 scalar
c = sampleNearestVec & surf.
faceNormals()[nearestFaceI];
2241 else if (nearType == triPointRef::EDGE)
2271 return edgeSide(surf, sample, nearestPoint, edgeI);
2281 label nearPointI = localF[nearLabel];
2285 const point& base = localPoints[nearPointI];
2290 label minEdgeI = -1;
2294 label edgeI = pEdges[i];
2296 const edge&
e = edges[edgeI];
2298 label otherPointI =
e.otherVertex(nearPointI);
2301 vector eVec(localPoints[otherPointI] - base);
2302 scalar magEVec =
mag(eVec);
2304 if (magEVec > VSMALL)
2309 const point perturbPoint = base + eVec;
2313 if (distSqr < minDistSqr)
2315 minDistSqr = distSqr;
2324 <<
"Problem: did not find edge closer than " << minDistSqr
2328 return edgeSide(surf, sample, nearestPoint, minEdgeI);
2346 mesh.nFaces() -
mesh.nInternalFaces()
2349 label newPatchI = 0;
2353 const label patchI = iter.key();
2357 label nTriTotal = 0;
2359 forAll(patch, patchFaceI)
2361 const face&
f = patch[patchFaceI];
2367 f.triangles(
points, nTri, triFaces);
2369 forAll(triFaces, triFaceI)
2371 const face&
f = triFaces[triFaceI];
2381 Pout<< patch.
name() <<
" : generated " << nTriTotal
2382 <<
" triangles from " << patch.size() <<
" faces with"
2383 <<
" new patchid " << newPatchI <<
endl;
2401 surface.patches().setSize(newPatchI);
2407 const label patchI = iter.key();
2411 surface.patches()[newPatchI].geometricType() = patch.type();
2436 label newPointI = 0;
2440 newPoints[newPointI++] =
points[pointI];
2442 forAll(faceCentres, faceI)
2444 newPoints[newPointI++] = faceCentres[faceI];
2451 mesh.nFaces() -
mesh.nInternalFaces()
2454 label newPatchI = 0;
2458 const label patchI = iter.key();
2461 label nTriTotal = 0;
2463 forAll(patch, patchFaceI)
2466 const face&
f = patch[patchFaceI];
2473 label fp1 =
f.fcIndex(fp);
2483 Pout<< patch.
name() <<
" : generated " << nTriTotal
2484 <<
" triangles from " << patch.size() <<
" faces with"
2485 <<
" new patchid " << newPatchI <<
endl;
2504 surface.patches().setSize(newPatchI);
2510 const label patchI = iter.key();
2514 surface.patches()[newPatchI].geometricType() = patch.type();
2531 geompackVertices[doubleI++] = pts[i][0];
2532 geompackVertices[doubleI++] = pts[i][1];
2545 geompackVertices.begin(),
2547 triangle_node.begin(),
2548 triangle_neighbor.begin()
2554 <<
"Failed dtris2 with vertices:" << pts.
size()
2559 triangle_node.
setSize(3*nTris);
2560 triangle_neighbor.
setSize(3*nTris);
2569 triangle_node[3*i]-1,
2570 triangle_node[3*i+1]-1,
2571 triangle_node[3*i+2]-1,
2579 points[i][0] = pts[i][0];
2580 points[i][1] = pts[i][1];
2598 edge[0] = tri.
c()-tri.
b();
2599 edge[1] = tri.
a()-tri.
c();
2600 edge[2] = tri.
b()-tri.
a();
2606 for (
label i=0; i<3; i++)
2628 allVerts.setSize(samplePts.size());
2629 allWeights.setSize(samplePts.size());
2635 const point& samplePt = samplePts[i];
2641 scalar minDistance = GREAT;
2649 label nearType, nearLabel;
2665 calcInterpolationWeights(tri, nearest.
rawPoint(), weights);
2675 else if (nearest.
distance() < minDistance)
2683 verts[0] =
f[nearLabel];
2686 weights[1] = -GREAT;
2688 weights[2] = -GREAT;
2697 verts[0] =
f[nearLabel];
2698 verts[1] =
f[
f.fcIndex(nearLabel)];
2717 weights[2] = -GREAT;
2731 calcInterpolationWeights(tri, nearest.
rawPoint(), weights);
2756 const point& trianglePoint
2762 label index, elemType;
2782 nearest.
setIndex(
s.faceEdges()[triI][index]);
2788 nearest.
setIndex(
s.localFaces()[triI][index]);
2801 const plane& cutPlane
2809 snapToEnd(
s, end, nearest);
2842 nearest = visitFaces
2857 nearest = visitFaces
2868 snapToEnd(
s, end, nearest);
2878 const plane& cutPlane,
2894 hitInfo = trackToEdge
const vector & normal() const
Return plane normal.
const labelListList & pointFaces() const
Return point-face addressing.
label index() const
Return index.
const Field< PointType > & points() const
Return reference to global points.
const labelListList & edgeFaces() const
Return edge-face addressing.
bool hit() const
Is there a hit.
A class for handling file names.
void setIndex(const label index)
const edgeList & edges() const
Return list of edges, address into LOCAL point list.
List< Key > toc() const
Return the table of contents.
#define forAll(list, i)
Loop across all elements in list.
This class describes the interaction of a face and a point. It carries the info of a successful hit a...
label findIndex(const ListType &, typename ListType::const_reference, const label start=0)
Find first occurence of given element and return index,.
A 1D vector of objects of type <T> that resizes itself as necessary to accept the new objects.
const Field< PointType > & localPoints() const
Return pointField of points in patch.
const Point & rawPoint() const
Return point with no checking.
label nEdges() const
Return number of edges in patch.
Contains information about location on a triSurface:
An edge is a list of two point labels. The functionality it provides supports the discretisation on a...
bool hit() const
Is there a hit.
int dtris2(int point_num, double point_xy[], int *tri_num, int tri_vert[], int tri_nabe[])
Ostream & endl(Ostream &os)
Add newline and flush stream.
const labelListList & faceEdges() const
Return face-edge addressing.
dimensioned< scalar > mag(const dimensioned< Type > &)
const geometricSurfacePatchList & patches() const
triPointRef::proxType & elementType()
Mesh consisting of general polyhedral cells.
simpleMatrix< scalar > A(Nc)
forAllConstIter(PtrDictionary< phaseModel >, mixture.phases(), phase)
Geometric class that creates a 2D plane and can return the intersection point between a line and the ...
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]
A triangle primitive used to calculate face normals and swept volumes.
const Point & rawPoint() const
Return point with no checking.
Hash function class for primitives. All non-primitives used to hash entries on hash tables likely nee...
scalar distance() const
Return distance to hit.
const Point & c() const
Return third vertex.
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 dimensionedScalar b
Wien displacement law constant: default SI units: [m.K].
Pre-declare SubField and related Field type.
Triangulated surface description with patch information.
A patch is a list of labels that address the faces in the global face list.
const Point & a() const
Return first vertex.
const labelListList & pointEdges() const
Return point-edge addressing.
void clear()
Clear the addressed list, i.e. set the size to zero.
DynamicList< T, SizeInc, SizeMult, SizeDiv > & shrink()
Shrink the allocated space to the number of elements used.
Patchify triangles based on orientation w.r.t other (triangulated or triangulatable) surfaces.
label nPoints() const
Return number of points supporting patch faces.
const Point & b() const
Return second vertex.
PointFrompoint toPoint(const Foam::point &p)
bool found(const Key &) const
Return true if hashedEntry is found in table.
const word & name() const
Return the name.
errorManip< error > abort(error &err)
void setPoint(const Point &p)
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))
label start() const
Return start label of this patch in the polyMesh face list.
DynamicList< T, SizeInc, SizeMult, SizeDiv > & append(const T &)
Append an element at the end of the list.
An STL-conforming hash table.
dimensioned< Type > max(const dimensioned< Type > &, const dimensioned< Type > &)
pointHit nearestPointClassify(const point &p, label &nearType, label &nearLabel) const
Find the nearest point to p on the triangle and classify it:
const Field< PointType > & pointNormals() const
Return point normals for patch.
void setSize(const label)
Reset size of List.
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
dimensionedSymmTensor sqr(const dimensionedVector &dv)
prefixOSstream Pout(cout, "Pout")
const Field< PointType > & faceNormals() const
Return face normals for patch.
A 1D array of objects of type <T>, where the size of the vector is known and used for subscript bound...
const dimensionedScalar e
Elementary charge.
const point & refPoint() const
Return or return plane base point.
bool insert(const Key &key)
Insert a new entry.
Triangle with additional region number.
const dimensionedScalar c
Speed of light in a vacuum.
const List< Face > & localFaces() const
Return patch faces addressing into local point list.
A face is a list of labels corresponding to mesh vertices.
void size(const label)
Override size to be inconsistent with allocated storage.
const labelListList & faceFaces() const
Return face-face addressing.
Graphite solid properties.
dimensioned< Type > min(const dimensioned< Type > &, const dimensioned< Type > &)
const word & name() const
Return name.
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 > magSqr(const dimensioned< Type > &)
A normal distribution model.
triangle< point, const point & > triPointRef
A list of faces which address into the list of points.