42 bool Foam::cellFeatures::faceAlignedEdge(
const label facei,
const label edgeI)
45 const edge&
e = mesh_.
edges()[edgeI];
47 const face&
f = mesh_.
faces()[facei];
51 if (
f[fp] ==
e.start())
53 label fp1 =
f.fcIndex(fp);
55 return f[fp1] ==
e.end();
60 <<
"Can not find edge " << mesh_.
edges()[edgeI]
69 Foam::label Foam::cellFeatures::nextEdge
71 const Map<label>& toSuperFace,
72 const label superFacei,
73 const label thisEdgeI,
77 const labelList& pEdges = mesh_.pointEdges()[thisVertI];
81 label edgeI = pEdges[pEdgeI];
83 if ((edgeI != thisEdgeI) && featureEdge_.found(edgeI))
87 const labelList& eFaces = mesh_.edgeFaces()[edgeI];
91 label facei = eFaces[eFacei];
96 && (toSuperFace[facei] == superFacei)
106 <<
"Can not find edge in " << featureEdge_ <<
" connected to edge "
107 << thisEdgeI <<
" at vertex " << thisVertI <<
endl
108 <<
"This might mean that the externalEdges do not form a closed loop"
116 bool Foam::cellFeatures::isCellFeatureEdge
133 scalar cosAngle = n0 & n1;
135 const edge&
e = mesh_.edges()[edgeI];
137 const face& f0 = mesh_.faces()[face0];
139 label face0Start = f0.find(
e.start());
140 label face0End = f0.fcIndex(face0Start);
142 const face& f1 = mesh_.faces()[face1];
144 label face1Start = f1.find(
e.start());
145 label face1End = f1.fcIndex(face1Start);
150 (f0[face0End] ==
e.end())
151 && (f1[face1End] !=
e.end())
154 (f0[face0End] !=
e.end())
155 && (f1[face1End] ==
e.end())
162 cosAngle = -cosAngle;
165 if (cosAngle < minCos)
176 void Foam::cellFeatures::walkSuperFace
179 const label superFacei,
180 Map<label>& toSuperFace
183 if (toSuperFace.insert(facei, superFacei))
185 const labelList& fEdges = mesh_.faceEdges()[facei];
187 for (
const label edgeI : fEdges)
189 if (!featureEdge_.found(edgeI))
212 void Foam::cellFeatures::calcSuperFaces()
const
216 const labelList& cFaces = mesh_.cells()[celli_];
221 Map<label> toSuperFace(10*cFaces.size());
223 label superFacei = 0;
227 label facei = cFaces[cFacei];
229 if (!toSuperFace.found(facei))
243 faceMap_.setSize(superFacei);
247 label facei = cFaces[cFacei];
249 faceMap_[toSuperFace[facei]].append(facei);
254 faceMap_[superI].shrink();
260 facesPtr_ =
new faceList(superFacei);
266 label facei = cFaces[cFacei];
268 label superFacei = toSuperFace[facei];
270 if (faces[superFacei].empty())
275 label startEdgeI = -1;
277 const labelList& fEdges = mesh_.faceEdges()[facei];
281 label edgeI = fEdges[fEdgeI];
283 if (featureEdge_.found(edgeI))
292 if (startEdgeI != -1)
296 DynamicList<label> superFace(10*mesh_.faces()[facei].size());
298 const edge&
e = mesh_.edges()[startEdgeI];
302 bool flipOrientation =
303 (mesh_.faceOwner()[facei] == celli_)
304 ^ (faceAlignedEdge(facei, startEdgeI));
306 label startVertI = -1;
310 startVertI =
e.end();
314 startVertI =
e.start();
317 label edgeI = startEdgeI;
319 label vertI =
e.otherVertex(startVertI);
323 label newEdgeI = nextEdge
332 if (isFeaturePoint(edgeI, newEdgeI))
334 superFace.append(vertI);
339 if (vertI == startVertI)
344 vertI = mesh_.edges()[edgeI].otherVertex(vertI);
348 if (superFace.size() <= 2)
351 <<
" Can not collapse faces " << faceMap_[superFacei]
352 <<
" into one big face on cell " << celli_ <<
endl
353 <<
"Try decreasing minCos:" << minCos_ <<
endl;
357 faces[superFacei].transfer(superFace);
368 Foam::cellFeatures::cellFeatures
382 const labelList& cEdges = mesh_.cellEdges()[celli_];
386 label edgeI = cEdges[cEdgeI];
388 if (isCellFeatureEdge(minCos_, edgeI))
390 featureEdge_.insert(edgeI);
413 || (edge0 >= mesh_.nEdges())
415 || (edge1 >= mesh_.nEdges())
419 <<
"Illegal edge labels : edge0:" << edge0 <<
" edge1:" << edge1
423 const edge& e0 = mesh_.edges()[edge0];
427 const edge& e1 = mesh_.edges()[edge1];
440 cosAngle = e0Vec & e1Vec;
449 cosAngle = - e0Vec & e1Vec;
456 <<
"Edges do not share common vertex. e0:" << e0
460 if (cosAngle < minCos_)
479 || (facei >= mesh_.nFaces())
481 || (vertI >= mesh_.nPoints())
485 <<
"Illegal face " << facei <<
" or vertex " << vertI
489 const labelList& pEdges = mesh_.pointEdges()[vertI];
496 label edgeI = pEdges[pEdgeI];
517 <<
"Did not find two edges sharing vertex " << vertI
518 <<
" on face " << facei <<
" vertices:" << mesh_.faces()[facei]
522 return isFeaturePoint(edge0, edge1);