39 bool Foam::cellFeatures::faceAlignedEdge(
const label facei,
const label edgeI)
42 const edge& e = mesh_.
edges()[edgeI];
44 const face& f = mesh_.
faces()[facei];
48 if (f[fp] == e.start())
50 label fp1 = f.fcIndex(fp);
52 return f[fp1] == e.end();
57 <<
"Can not find edge " << mesh_.
edges()[edgeI]
68 const Map<label>& toSuperFace,
69 const label superFacei,
70 const label thisEdgeI,
78 label edgeI = pEdges[pEdgeI];
80 if ((edgeI != thisEdgeI) && featureEdge_.
found(edgeI))
88 label facei = eFaces[eFacei];
93 && (toSuperFace[facei] == superFacei)
103 <<
"Can not find edge in " << featureEdge_ <<
" connected to edge " 104 << thisEdgeI <<
" at vertex " << thisVertI <<
endl 105 <<
"This might mean that the externalEdges do not form a closed loop" 113 bool Foam::cellFeatures::isCellFeatureEdge
133 scalar cosAngle = n0 & n1;
136 const edge& e = mesh_.
edges()[edgeI];
138 const face& f0 = mesh_.
faces()[face0];
141 label face0End = f0.fcIndex(face0Start);
143 const face& f1 = mesh_.
faces()[face1];
146 label face1End = f1.fcIndex(face1Start);
151 (f0[face0End] == e.end())
152 && (f1[face1End] != e.end())
155 (f0[face0End] != e.end())
156 && (f1[face1End] == e.end())
163 cosAngle = -cosAngle;
166 if (cosAngle < minCos)
179 void Foam::cellFeatures::walkSuperFace
182 const label superFacei,
183 Map<label>& toSuperFace
186 if (!toSuperFace.found(facei))
188 toSuperFace.insert(facei, superFacei);
194 label edgeI = fEdges[fEdgeI];
196 if (!featureEdge_.
found(edgeI))
219 void Foam::cellFeatures::calcSuperFaces()
const 228 Map<label> toSuperFace(10*cFaces.size());
230 label superFacei = 0;
234 label facei = cFaces[cFacei];
236 if (!toSuperFace.found(facei))
250 faceMap_.setSize(superFacei);
254 label facei = cFaces[cFacei];
256 faceMap_[toSuperFace[facei]].append(facei);
261 faceMap_[superI].shrink();
267 facesPtr_ =
new faceList(superFacei);
273 label facei = cFaces[cFacei];
275 label superFacei = toSuperFace[facei];
277 if (faces[superFacei].empty())
282 label startEdgeI = -1;
288 label edgeI = fEdges[fEdgeI];
290 if (featureEdge_.
found(edgeI))
299 if (startEdgeI != -1)
303 DynamicList<label> superFace(10*mesh_.
faces()[facei].
size());
305 const edge& e = mesh_.
edges()[startEdgeI];
309 bool flipOrientation =
311 ^ (faceAlignedEdge(facei, startEdgeI));
313 label startVertI = -1;
317 startVertI = e.end();
321 startVertI = e.start();
324 label edgeI = startEdgeI;
326 label vertI = e.otherVertex(startVertI);
330 label newEdgeI = nextEdge
341 superFace.append(vertI);
346 if (vertI == startVertI)
351 vertI = mesh_.
edges()[edgeI].otherVertex(vertI);
355 if (superFace.size() <= 2)
358 <<
" Can not collapse faces " << faceMap_[superFacei]
359 <<
" into one big face on cell " << celli_ <<
endl 360 <<
"Try decreasing minCos:" << minCos_ <<
endl;
364 faces[superFacei].transfer(superFace);
375 Foam::cellFeatures::cellFeatures
393 label edgeI = cEdges[cEdgeI];
395 if (isCellFeatureEdge(minCos_, edgeI))
397 featureEdge_.
insert(edgeI);
420 || (edge0 >= mesh_.
nEdges())
422 || (edge1 >= mesh_.
nEdges())
426 <<
"Illegal edge labels : edge0:" << edge0 <<
" edge1:" << edge1
449 cosAngle = e0Vec & e1Vec;
458 cosAngle = - e0Vec & e1Vec;
465 <<
"Edges do not share common vertex. e0:" << e0
469 if (cosAngle < minCos_)
487 || (facei >= mesh_.
nFaces())
493 <<
"Illegal face " << facei <<
" or vertex " << vertI
504 label edgeI = pEdges[pEdgeI];
525 <<
"Did not find two edges sharing vertex " << vertI
526 <<
" on face " << facei <<
" vertices:" << mesh_.
faces()[facei]
label end() const
Return end vertex label.
#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.
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
Cell-face mesh analysis engine.
const vectorField & faceAreas() const
const edgeList & edges() const
Return mesh edges. Uses calcEdges.
void size(const label)
Override size to be inconsistent with allocated storage.
Ostream & endl(Ostream &os)
Add newline and flush stream.
virtual const pointField & points() const =0
Return mesh points.
Vector< scalar > vector
A scalar version of the templated Vector.
bool insert(const Key &key)
Insert a new entry.
const cellList & cells() const
const labelListList & edgeFaces() const
Various functions to operate on Lists.
An edge is a list of two point labels. The functionality it provides supports the discretisation on a...
~cellFeatures()
Destructor.
List< label > labelList
A List of labels.
const labelListList & pointEdges() const
errorManip< error > abort(error &err)
bool found(const Key &) const
Return true if hashedEntry is found in table.
label start() const
Return start vertex label.
const labelListList & cellEdges() const
label findIndex(const ListType &, typename ListType::const_reference, const label start=0)
Find first occurence of given element and return index,.
Template functions to aid in the implementation of demand driven data.
#define WarningInFunction
Report a warning using Foam::Warning.
virtual const faceList & faces() const =0
Return faces.
vector vec(const pointField &) const
Return the vector (end - start)
virtual const labelList & faceOwner() const =0
Face face-owner addresing.
dimensioned< scalar > mag(const dimensioned< Type > &)
bool isFeatureVertex(const label facei, const label vertI) const
Is vertexI on facei used by two edges that form feature.
bool isFeaturePoint(const label edge0, const label edge1) const
Are two edges connected at feature point?
const labelListList & faceEdges() const
void deleteDemandDrivenData(DataPtr &dataPtr)