Go to the documentation of this file.
27 #include "primitiveMesh.H"
48 if (
f[fp] ==
e.start())
52 return f[fp1] ==
e.end();
57 <<
"Can not find edge " <<
mesh_.
edges()[edgeI]
69 const label superFaceI,
70 const label thisEdgeI,
74 const labelList& pEdges = mesh_.pointEdges()[thisVertI];
78 label edgeI = pEdges[pEdgeI];
80 if ((edgeI != thisEdgeI) && featureEdge_.found(edgeI))
84 const labelList& eFaces = mesh_.edgeFaces()[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"
127 vector n0 = mesh_.faceAreas()[face0];
130 vector n1 = mesh_.faceAreas()[face1];
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)
182 const label superFaceI,
186 if (!toSuperFace.found(faceI))
188 toSuperFace.insert(faceI, superFaceI);
190 const labelList& fEdges = mesh_.faceEdges()[faceI];
194 label edgeI = fEdges[fEdgeI];
196 if (!featureEdge_.found(edgeI))
223 const labelList& cFaces = mesh_.cells()[cellI_];
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;
284 const labelList& fEdges = mesh_.faceEdges()[faceI];
288 label edgeI = fEdges[fEdgeI];
290 if (featureEdge_.found(edgeI))
299 if (startEdgeI != -1)
305 const edge&
e = mesh_.edges()[startEdgeI];
309 bool flipOrientation =
310 (mesh_.faceOwner()[faceI] == cellI_)
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
339 if (isFeaturePoint(edgeI, newEdgeI))
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);
389 const labelList& cEdges = mesh_.cellEdges()[cellI_];
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
430 const edge& e0 = mesh_.edges()[edge0];
435 const edge& e1 = mesh_.edges()[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())
489 || (vertI >= mesh_.nPoints())
493 <<
"Illegal face " << faceI <<
" or vertex " << vertI
497 const labelList& pEdges = mesh_.pointEdges()[vertI];
504 label edgeI = pEdges[pEdgeI];
525 <<
"Did not find two edges sharing vertex " << vertI
526 <<
" on face " << faceI <<
" vertices:" << mesh_.faces()[faceI]
530 return isFeaturePoint(edge0, edge1);
const primitiveMesh & mesh_
#define forAll(list, i)
Loop across all elements in list.
label findIndex(const ListType &, typename ListType::const_reference, const label start=0)
Find first occurence of given element and return index,.
virtual const faceList & faces() const =0
Return faces.
vector vec(const pointField &) const
Return the vector (end - start)
Template functions to aid in the implementation of demand driven data.
An edge is a list of two point labels. The functionality it provides supports the discretisation on a...
void transfer(List< T > &)
Transfer the contents of the argument List into this list.
Ostream & endl(Ostream &os)
Add newline and flush stream.
const edgeList & edges() const
Return mesh edges. Uses calcEdges.
dimensioned< scalar > mag(const dimensioned< Type > &)
label end() const
Return end vertex label.
void deleteDemandDrivenData(DataPtr &dataPtr)
~cellFeatures()
Destructor.
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 labelListList & cellEdges() const
void append(const T &)
Append an element at the end of the list.
void walkSuperFace(const label faceI, const label superFaceI, Map< label > &toSuperFace) const
bool isCellFeatureEdge(const scalar, const label) const
label nextEdge(const Map< label > &toSuperFace, const label superFaceI, const label thisEdgeI, const label thisVertI) const
errorManip< error > abort(error &err)
const double e
Elementary charge.
DynamicList< T, SizeInc, SizeMult, SizeDiv > & append(const T &)
Append an element at the end of the list.
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
label start() const
Return start vertex label.
A 1D array of objects of type <T>, where the size of the vector is known and used for subscript bound...
bool faceAlignedEdge(const label, const label) const
void calcSuperFaces() const
A face is a list of labels corresponding to mesh vertices.
Various functions to operate on Lists.
void size(const label)
Override size to be inconsistent with allocated storage.
bool isFeaturePoint(const label edge0, const label edge1) const
Are two edges connected at feature point?
cellFeatures(const cellFeatures &)
Disallow default bitwise copy construct.
#define WarningInFunction
Report a warning using Foam::Warning.
bool isFeatureVertex(const label faceI, const label vertI) const
Is vertexI on faceI used by two edges that form feature.
Cell-face mesh analysis engine.