42bool 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())
55 return f[fp1] ==
e.
end();
60 <<
"Can not find edge " << mesh_.
edges()[edgeI]
69Foam::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"
116bool 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)
176void 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))
212void 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);
378 featureEdge_(10*
mesh.cellEdges()[celli].size()),
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);
Various functions to operate on Lists.
bool insert(const Key &key)
Insert a new entry, not overwriting existing entries.
iterator end() noexcept
Return an iterator to end traversing the UList.
label find(const T &val, label pos=0) const
Find index of the first occurrence of the value.
label fcIndex(const label i) const noexcept
bool isFeaturePoint(const label edge0, const label edge1) const
Are two edges connected at feature point?
bool isFeatureVertex(const label facei, const label vertI) const
Is vertexI on facei used by two edges that form feature.
~cellFeatures()
Destructor.
An edge is a list of two point labels. The functionality it provides supports the discretisation on a...
label end() const
Return end (last/second) vertex label.
vector unitVec(const UList< point > &pts) const
Return the unit vector (end - start)
label start() const
Return start (first) vertex label.
Cell-face mesh analysis engine.
const edgeList & edges() const
Return mesh edges. Uses calcEdges.
const labelListList & cellEdges() const
virtual const faceList & faces() const =0
Return faces.
A Vector of values with scalar precision, where scalar is float/double depending on the compilation f...
Template functions to aid in the implementation of demand driven data.
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
#define WarningInFunction
Report a warning using Foam::Warning.
List< label > labelList
A List of labels.
quaternion normalised(const quaternion &q)
Return the normalised (unit) quaternion of the given quaternion.
Ostream & endl(Ostream &os)
Add newline and flush stream.
errorManip< error > abort(error &err)
List< face > faceList
A List of faces.
void deleteDemandDrivenData(DataPtr &dataPtr)
#define forAll(list, i)
Loop across all elements in list.