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.found(facei))
185 toSuperFace.insert(facei, superFacei);
187 const labelList& fEdges = mesh_.faceEdges()[facei];
191 label edgeI = fEdges[fEdgeI];
193 if (!featureEdge_.found(edgeI))
216 void Foam::cellFeatures::calcSuperFaces()
const
220 const labelList& cFaces = mesh_.cells()[celli_];
225 Map<label> toSuperFace(10*cFaces.size());
227 label superFacei = 0;
231 label facei = cFaces[cFacei];
233 if (!toSuperFace.found(facei))
247 faceMap_.setSize(superFacei);
251 label facei = cFaces[cFacei];
253 faceMap_[toSuperFace[facei]].append(facei);
258 faceMap_[superI].shrink();
264 facesPtr_ =
new faceList(superFacei);
270 label facei = cFaces[cFacei];
272 label superFacei = toSuperFace[facei];
274 if (faces[superFacei].empty())
279 label startEdgeI = -1;
281 const labelList& fEdges = mesh_.faceEdges()[facei];
285 label edgeI = fEdges[fEdgeI];
287 if (featureEdge_.found(edgeI))
296 if (startEdgeI != -1)
300 DynamicList<label> superFace(10*mesh_.faces()[facei].size());
302 const edge&
e = mesh_.edges()[startEdgeI];
306 bool flipOrientation =
307 (mesh_.faceOwner()[facei] == celli_)
308 ^ (faceAlignedEdge(facei, startEdgeI));
310 label startVertI = -1;
314 startVertI =
e.end();
318 startVertI =
e.start();
321 label edgeI = startEdgeI;
323 label vertI =
e.otherVertex(startVertI);
327 label newEdgeI = nextEdge
336 if (isFeaturePoint(edgeI, newEdgeI))
338 superFace.append(vertI);
343 if (vertI == startVertI)
348 vertI = mesh_.edges()[edgeI].otherVertex(vertI);
352 if (superFace.size() <= 2)
355 <<
" Can not collapse faces " << faceMap_[superFacei]
356 <<
" into one big face on cell " << celli_ <<
endl
357 <<
"Try decreasing minCos:" << minCos_ <<
endl;
361 faces[superFacei].transfer(superFace);
372 Foam::cellFeatures::cellFeatures
386 const labelList& cEdges = mesh_.cellEdges()[celli_];
390 label edgeI = cEdges[cEdgeI];
392 if (isCellFeatureEdge(minCos_, edgeI))
394 featureEdge_.insert(edgeI);
417 || (edge0 >= mesh_.nEdges())
419 || (edge1 >= mesh_.nEdges())
423 <<
"Illegal edge labels : edge0:" << edge0 <<
" edge1:" << edge1
427 const edge& e0 = mesh_.edges()[edge0];
431 const edge& e1 = mesh_.edges()[edge1];
444 cosAngle = e0Vec & e1Vec;
453 cosAngle = - e0Vec & e1Vec;
460 <<
"Edges do not share common vertex. e0:" << e0
464 if (cosAngle < minCos_)
483 || (facei >= mesh_.nFaces())
485 || (vertI >= mesh_.nPoints())
489 <<
"Illegal face " << facei <<
" or vertex " << vertI
493 const labelList& pEdges = mesh_.pointEdges()[vertI];
500 label edgeI = pEdges[pEdgeI];
521 <<
"Did not find two edges sharing vertex " << vertI
522 <<
" on face " << facei <<
" vertices:" << mesh_.faces()[facei]
526 return isFeaturePoint(edge0, edge1);