Go to the documentation of this file.
66 os <<
"v " << pt.
x() <<
' ' << pt.
y() <<
' ' << pt.
z() <<
nl;
70 const edge&
e = edges[edgeI];
72 os <<
"l " <<
e.start()+1 <<
' ' <<
e.end()+1 <<
nl;
90 os <<
"v " << pt.
x() <<
' ' << pt.
y() <<
' ' << pt.
z() <<
nl;
94 const edge&
e = edges[faceEdges[i]];
96 os <<
"l " <<
e.start()+1 <<
' ' <<
e.end()+1 <<
nl;
118 const edge&
e = edges[faceEdges[i]];
124 if (pointMap[pointI] == -1)
128 os <<
"v " << pt.
x() <<
' ' << pt.
y() <<
' ' << pt.
z() <<
nl;
130 pointMap[pointI] = maxVertI++;
137 const edge&
e = edges[faceEdges[i]];
139 os <<
"l " << pointMap[
e.start()]+1 <<
' ' << pointMap[
e.end()]+1
157 os <<
"v " << pt.
x() <<
' ' << pt.
y() <<
' ' << pt.
z() <<
nl;
164 os <<
' ' <<
f[fp]+1;
181 label edgeI = edgeLabels[i];
183 const edge&
e = edges[edgeI];
185 label stat = visited[edgeI];
187 if (stat == UNVISITED)
189 Pout<<
" edge:" << edgeI <<
" verts:" <<
e
190 <<
" unvisited" <<
nl;
192 else if (stat == STARTTOEND)
194 Pout<<
" edge:" << edgeI <<
" from " <<
e[0]
195 <<
" to " <<
e[1] <<
nl;
197 else if (stat == ENDTOSTART)
199 Pout<<
" edge:" << edgeI <<
" from " <<
e[1]
200 <<
" to " <<
e[0] <<
nl;
204 Pout<<
" edge:" << edgeI <<
" both " <<
e
234 if (vA1 == vB1 || vAMin1 == vBMin1)
238 else if (vA1 == vBMin1 || vAMin1 == vB1)
246 <<
"Triangle:" << fA <<
" and triangle:" << fB
247 <<
" share a point but not an edge"
254 <<
"Triangle:" << fA <<
" and triangle:" << fB
255 <<
" do not share an edge"
271 if (iter == visited.end())
273 visited.insert(key, offset);
301 label edgeI = fEdges[i];
303 const edge&
e = edges[edgeI];
307 facePointEdges.find(
e.start());
309 if (iter == facePointEdges.end())
313 facePointEdges.insert(
e.start(), oneEdge);
317 iter().append(edgeI);
322 facePointEdges.find(
e.end());
324 if (iter2 == facePointEdges.end())
328 facePointEdges.insert(
e.end(), oneEdge);
332 iter2().append(edgeI);
345 <<
"Point:" << iter.key() <<
" used by too few edges:"
353 Pout<<
"calcPointEdgeAddressing: face consisting of edges:" <<
endl;
356 label edgeI = fEdges[i];
357 const edge&
e = edges[edgeI];
358 Pout<<
" " << edgeI <<
' ' <<
e
363 Pout<<
" Constructed point-edge adressing:" <<
endl;
366 Pout<<
" vertex " << iter.key() <<
" is connected to edges "
372 return facePointEdges;
387 const label prevEdgeI,
388 const label prevVertI
399 if (connectedEdges.size() <= 1)
403 Pout<<
"Writing face:" << faceI <<
" to face.obj" <<
endl;
407 Pout<<
"Writing connectedEdges edges to faceEdges.obj" <<
endl;
408 writeLocalOBJ(
points, edges, connectedEdges,
"faceEdges.obj");
412 <<
"Problem: prevVertI:" << prevVertI <<
" on edge " << prevEdgeI
413 <<
" has less than 2 connected edges."
419 if (connectedEdges.size() == 2)
422 if (connectedEdges[0] == prevEdgeI)
426 Pout<<
"Stepped from edge:" << edges[prevEdgeI]
427 <<
" to edge:" << edges[connectedEdges[1]]
428 <<
" chosen from candidates:" << connectedEdges <<
endl;
430 return connectedEdges[1];
436 Pout<<
"Stepped from edge:" << edges[prevEdgeI]
437 <<
" to edge:" << edges[connectedEdges[0]]
438 <<
" chosen from candidates:" << connectedEdges <<
endl;
440 return connectedEdges[0];
447 const edge& prevE = edges[prevEdgeI];
451 e0 /=
mag(e0) + VSMALL;
456 if (
mag(
mag(e1) - 1) > SMALL)
459 Pout<<
"Writing face:" << faceI <<
" to face.obj" <<
endl;
463 Pout<<
"Writing connectedEdges edges to faceEdges.obj" <<
endl;
464 writeLocalOBJ(
points, edges, connectedEdges,
"faceEdges.obj");
468 <<
"Unnormalized normal e1:" << e1
469 <<
" formed from cross product of e0:" << e0 <<
" n:" <<
n
478 scalar maxAngle = -GREAT;
481 forAll(connectedEdges, connI)
483 label edgeI = connectedEdges[connI];
485 if (edgeI != prevEdgeI)
487 label stat = visited[edgeI];
489 const edge&
e = edges[edgeI];
509 vec /=
mag(vec) + VSMALL;
513 if (angle > maxAngle)
527 Pout<<
"Writing face:" << faceI <<
" to face.obj" <<
endl;
531 Pout<<
"Writing connectedEdges edges to faceEdges.obj" <<
endl;
532 writeLocalOBJ(
points, edges, connectedEdges,
"faceEdges.obj");
536 <<
"Trying to step from edge " << edges[prevEdgeI]
537 <<
", vertex " << prevVertI
538 <<
" but cannot find 'unvisited' edges among candidates:"
545 Pout<<
"Stepped from edge:" << edges[prevEdgeI]
546 <<
" to edge:" << maxEdgeI <<
" angle:" << edges[maxEdgeI]
547 <<
" with angle:" << maxAngle
566 const label startEdgeI,
567 const label startVertI,
580 label vertI = startVertI;
581 label edgeI = startEdgeI;
585 const edge&
e = edges[edgeI];
590 <<
" edge:" << edgeI <<
" vertices:" <<
e
592 <<
" vertex:" << vertI <<
endl;
598 visited[edgeI] |= STARTTOEND;
602 visited[edgeI] |= ENDTOSTART;
610 vertI =
e.otherVertex(vertI);
612 if (vertI == startVertI)
643 const label excludePointI,
654 label pointI = iter.key();
656 if (pointI != excludePointI)
658 label nVisits = iter();
660 if (nVisits == 2*facePointEdges[pointI].size())
663 scalar dist =
mag(eSurf.
points()[pointI] - pt);
679 <<
"Dumping face edges to faceEdges.obj" <<
endl;
681 writeLocalOBJ(eSurf.
points(), eSurf.
edges(), fEdges,
"faceEdges.obj");
684 <<
"No fully visited edge found for pt " << pt
709 Map<label> pointVisited(2*facePointEdges.size());
713 label edgeI = iter.key();
717 if (stat == STARTTOEND || stat == ENDTOSTART)
719 incCount(pointVisited,
e[0], 1);
720 incCount(pointVisited,
e[1], 1);
722 else if (stat == BOTH)
724 incCount(pointVisited,
e[0], 2);
725 incCount(pointVisited,
e[1], 2);
727 else if (stat == UNVISITED)
729 incCount(pointVisited,
e[0], 0);
730 incCount(pointVisited,
e[1], 0);
739 label pointI = iter.key();
741 label nVisits = iter();
743 Pout<<
"point:" << pointI <<
" nVisited:" << nVisits
744 <<
" pointEdges:" << facePointEdges[pointI].size() <<
endl;
752 label visitedVert0 = -1;
753 label unvisitedVert0 = -1;
756 scalar minDist = GREAT;
760 label pointI = iter.key();
762 label nVisits = pointVisited[pointI];
766 if (nVisits < 2*pEdges.size())
786 if (nearDist < minDist)
789 visitedVert0 = nearVertI;
790 unvisitedVert0 = pointI;
799 scalar minDist = GREAT;
803 label pointI = iter.key();
805 if (pointI != unvisitedVert0)
807 label nVisits = pointVisited[pointI];
811 if (nVisits < 2*pEdges.size())
831 if (nearDist < minDist)
843 additionalEdges[0] =
edge(visitedVert0, unvisitedVert0);
850 Pout<<
"Dumping face:" << faceI <<
" to " << newFName <<
endl;
861 return splitFace(surf, faceI, eSurf);
880 calcPointEdgeAddressing
892 label edgeI = fEdges[i];
914 visited.insert(edgeI, ENDTOSTART);
920 visited.insert(edgeI, STARTTOEND);
925 visited.insert(edgeI, UNVISITED);
940 label startEdgeI = -1;
941 label startVertI = -1;
945 label edgeI = fEdges[i];
947 const edge&
e = edges[edgeI];
949 label stat = visited[edgeI];
951 if (stat == STARTTOEND)
961 else if (stat == ENDTOSTART)
973 if (startEdgeI == -1)
1011 label edgeI = fEdges[i];
1013 label stat = visited[edgeI];
1018 <<
"Dumping face edges to faceEdges.obj" <<
endl;
1020 writeLocalOBJ(
points, edges, fEdges,
"faceEdges.obj");
1023 <<
"Problem: edge " << edgeI <<
" vertices "
1024 << edges[edgeI] <<
" on face " << faceI
1025 <<
" has visited status " << stat <<
" from a "
1026 <<
"righthanded walk along all"
1027 <<
" of the triangle edges. Are the original surfaces"
1028 <<
" closed and non-intersecting?"
1031 else if (stat != BOTH)
1070 intersectionEdges_(0),
1080 intersectionEdges_(0),
1090 const bool isFirstSurface,
1095 intersectionEdges_(0),
1097 nSurfacePoints_(surf.
nPoints())
1105 faceMap_.setSize(size());
1109 faceMap_[faceI] = faceI;
1133 startTriI[faceI] = newTris.size();
1151 forAll(newFaces, newFaceI)
1153 const face& newF = newFaces[newFaceI];
1155 const label region = surf[faceI].region();
1161 const triFace& t = tris[triI];
1165 if (t[i] < 0 || t[i] >= eSurf.
points().size())
1168 <<
"Face triangulation of face " << faceI
1169 <<
" uses points outside range 0.."
1193 triSurface::operator=
1204 faceMap_.setSize(size());
1206 for (
label faceI = 0; faceI < surf.
size()-1; faceI++)
1208 for (
label triI = startTriI[faceI]; triI < startTriI[faceI+1]; triI++)
1210 faceMap_[triI] = faceI;
1213 for (
label triI = startTriI[surf.
size()-1]; triI < size(); triI++)
1215 faceMap_[triI] = surf.
size()-1;
1224 label intersectionEdgeI = 0;
1235 label surfStartI = meshPointMap()[
e.start()];
1236 label surfEndI = meshPointMap()[
e.end()];
1239 label surfEdgeI = -1;
1241 const labelList& pEdges = pointEdges()[surfStartI];
1245 const edge& surfE = edges()[pEdges[i]];
1249 if (surfE.
start() == surfEndI || surfE.
end() == surfEndI)
1251 surfEdgeI = pEdges[i];
1257 if (surfEdgeI != -1)
1259 intersectionEdges_[intersectionEdgeI++] = surfEdgeI;
1264 <<
"Cannot find edge among candidates " << pEdges
1265 <<
" which uses points " << surfStartI
1266 <<
" and " << surfEndI
void addIntersectionEdges(const label faceI, const edgeList &)
Add intersection edges to a face. Used for connecting.
static void findNearestVisited(const edgeSurface &eSurf, const label faceI, const Map< DynamicList< label > > &facePointEdges, const Map< label > &pointVisited, const point &pt, const label excludeFaceI, label &minVertI, scalar &minDist)
For resplitFace: find nearest (to pt) fully visited point. Return.
intersectedSurface()
Construct null.
static Map< DynamicList< label > > calcPointEdgeAddressing(const edgeSurface &, const label faceI)
Calculate point-edge addressing for single face only.
#define forAllIter(Container, container, iter)
Iterate across all elements in the container object of type.
A class for handling file names.
static face walkFace(const edgeSurface &eSurf, const label faceI, const vector &n, const Map< DynamicList< label > > &facePointEdges, const label startEdgeI, const label startVertI, Map< label > &visited)
Walk path along edges in face. Used by splitFace.
#define forAll(list, i)
Loop across all elements in list.
void writeOBJ(Ostream &os, label &vertI, const tetPoints &tet)
label findIndex(const ListType &, typename ListType::const_reference, const label start=0)
Find first occurence of given element and return index,.
static void writeLocalOBJ(const pointField &points, const edgeList &edges, const labelList &faceEdges, const fileName &)
Debug:Dump selected edges to stream. Renumbers vertices to.
static bool sameEdgeOrder(const labelledTri &fA, const labelledTri &fB)
Check if the two vertices that f0 and f1 share are in the same.
static const label ENDTOSTART
bool isSurfaceEdge(const label edgeI) const
An edge is a list of two point labels. The functionality it provides supports the discretisation on a...
static void incCount(Map< label > &visited, const label key, const label offset)
Increment data for key. (start from 0 if not found)
Ostream & endl(Ostream &os)
Add newline and flush stream.
static faceList resplitFace(const triSurface &surf, const label faceI, const Map< DynamicList< label > > &facePointEdges, const Map< label > &visited, edgeSurface &eSurf)
Fallback for if splitFace fails to connect all.
const labelListList & faceEdges() const
Return face-edge addressing.
const pointField & points() const
dimensioned< scalar > mag(const dimensioned< Type > &)
const geometricSurfacePatchList & patches() const
static const label UNVISITED
label fcIndex(const label i) const
Return the forward circular index, i.e. the next index.
forAllConstIter(PtrDictionary< phaseModel >, mixture.phases(), phase)
static label nextEdge(const edgeSurface &eSurf, const Map< label > &visited, const label faceI, const vector &n, const Map< DynamicList< label > > &facePointEdges, const label prevEdgeI, const label prevVertI)
Choose edge out of candidates (facePointEdges) according to.
label end() const
Return end vertex label.
intWM_LABEL_SIZE_t label
A label is an int32_t or int64_t as specified by the pre-processor macro WM_LABEL_SIZE.
Pre-declare SubField and related Field type.
Basic surface-surface intersection description. Constructed from two surfaces it creates a descriptio...
Triangulated surface description with patch information.
#define SeriousErrorInFunction
Report an error message using Foam::SeriousError.
void operator=(const triSurface &)
DynamicList< T, SizeInc, SizeMult, SizeDiv > & shrink()
Shrink the allocated space to the number of elements used.
label nSurfacePoints() const
const pointField & cutPoints() const
const edgeList & edges() const
label nPoints() const
Return number of points supporting patch faces.
static const label STARTTOEND
scalar pseudoAngle(const vector &e0, const vector &e1, const vector &vec)
Estimate angle of vec in coordinate system (e0, e1, e0^e1).
errorManip< error > abort(error &err)
static faceList splitFace(const triSurface &surf, const label faceI, edgeSurface &eSurf)
Main face splitting routine. Gets overall points and edges and.
const double e
Elementary charge.
const edgeList & cutEdges() const
Description of surface in form of 'cloud of edges'.
const labelList & edgeOwner() const
If 2 face neighbours: label of face where ordering of edge.
DynamicList< T, SizeInc, SizeMult, SizeDiv > & append(const T &)
Append an element at the end of the list.
Triangulation of faces. Handles concave polygons as well (inefficiently)
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
label start() const
Return start vertex label.
A triangular face using a FixedList of labels corresponding to mesh vertices.
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 labelListList & faceEdges() const
From face to our edges_.
label nSurfaceEdges() const
Triangle with additional region number.
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.
An Ostream is an abstract base class for all output systems (streams, files, token lists,...
label parentEdge(const label edgeI) const
Parent edge (original surface edge this edge came from).
static void writeOBJ(const pointField &points, const edgeList &edges, Ostream &os)
Debug:Dump edges to stream. Mantains vertex numbering.
label rcIndex(const label i) const
Return the reverse circular index, i.e. the previous index.
label otherVertex(const label a) const
Given one vertex, return the other.
static void printVisit(const edgeList &edges, const labelList &edgeLabels, const Map< label > &visited)
Debug:Print visited status.
defineTypeNameAndDebug(combustionModel, 0)
word name(const complex &)
Return a string representation of a complex.
void reverse(UList< T > &, const label n)