Go to the documentation of this file.
42 void Foam::faceCollapser::insert
45 const label excludeElem,
51 if (elems[i] != excludeElem)
60 Foam::label Foam::faceCollapser::findEdge
70 label edgeI = edgeLabels[i];
72 const edge&
e = edges[edgeI];
76 (
e[0] == v0 &&
e[1] == v1)
77 || (
e[0] == v1 &&
e[1] == v0)
85 <<
" and " << v1 <<
" in edge labels " << edgeLabels
95 void Foam::faceCollapser::filterFace
97 const Map<labelList>& splitEdges,
99 polyTopoChange& meshMod
102 const face&
f = mesh_.faces()[facei];
103 const labelList& fEdges = mesh_.faceEdges()[facei];
106 DynamicList<label> newFace(10 *
f.size());
115 label fp1 =
f.fcIndex(fp);
120 label edgeI =
findEdge(mesh_.edges(), fEdges, v0, v1);
123 splitEdges.find(edgeI);
125 if (edgeFnd != splitEdges.end())
133 if (v0 == mesh_.edges()[edgeI].start())
137 newFace.append(extraVerts[i]);
144 newFace.append(extraVerts[i]);
149 face newF(newFace.shrink());
160 if (mesh_.isInternalFace(facei))
162 nei = mesh_.faceNeighbour()[facei];
166 patchi = mesh_.boundaryMesh().whichPatch(facei);
170 label
zoneID = mesh_.faceZones().whichZone(facei);
172 bool zoneFlip =
false;
176 const faceZone& fZone = mesh_.faceZones()[
zoneID];
178 zoneFlip = fZone.flipMap()[fZone.whichFace(facei)];
187 mesh_.faceOwner()[facei],
220 const edgeList& edges = mesh_.edges();
221 const faceList& faces = mesh_.faces();
240 const label facei = faceLabels[i];
242 const face&
f = faces[facei];
244 const label fpA = fpStart[i];
245 const label fpB = fpEnd[i];
250 Pout<<
"Face:" <<
f <<
" collapsed to fp:" << fpA <<
' ' << fpB
251 <<
" with points:" << pA <<
' ' << pB
263 dist[fpB] =
magSqr(pB - pA);
270 label fp =
f.fcIndex(fpMin1);
279 if (w <= dist[fpMin1])
282 w = dist[fpMin1] + 1
e-6*(dist[fpB] - dist[fpA]);
286 pA +
Foam::sqrt(w / (dist[fpB] - dist[fpA]))*(pB - pA)
289 Pout<<
"Adapting position of vertex " <<
f[fp] <<
" on face "
290 <<
f <<
" from " << near.
rawPoint() <<
" to " << newPoint
315 fp =
f.fcIndex(fpMin1);
323 fp =
f.rcIndex(fpMin1);
332 if (w <= dist[fpMin1])
335 w = dist[fpMin1] + 1
e-6*(dist[fpB] - dist[fpA]);
339 pA +
Foam::sqrt(w / (dist[fpB] - dist[fpA]))*(pB - pA)
342 Pout<<
"Adapting position of vertex " <<
f[fp] <<
" on face "
343 <<
f <<
" from " << near.
rawPoint() <<
" to " << newPoint
368 fp =
f.rcIndex(fpMin1);
374 if (dist.
indices()[dist.size()-1] != fpB)
376 OFstream str(
"conflictingFace.obj");
380 <<
"Trying to collapse face:" << facei <<
" vertices:" <<
f
381 <<
" to edges between vertices " <<
f[fpA] <<
" and "
382 <<
f[fpB] <<
" but " <<
f[fpB] <<
" does not seem to be the"
383 <<
" vertex furthest away from " <<
f[fpA] <<
endl
384 <<
"Dumped conflicting face to obj file conflictingFace.obj"
390 Pout<<
"Face:" <<
f <<
" fpA:" << fpA <<
" fpB:" << fpB <<
nl;
397 Pout<<
" fp:" << fp <<
" distance:" << dist[i] <<
nl;
402 const labelList& fEdges = mesh_.faceEdges()[facei];
412 label fp1 =
f.fcIndex(fp);
415 label sorted0 = sortedFp[fp];
416 label sorted1 = sortedFp[fp1];
424 if (sorted0 < sorted1)
428 for (label j = sorted0+1; j < sorted1; j++)
437 for (label j = sorted1+1; j < sorted0; j++)
443 if (edgePoints.size())
447 label edgeI =
findEdge(edges, fEdges,
f[fp],
f[fp1]);
449 const edge&
e = edges[edgeI];
451 if (fpToFp1 == (
f[fp] ==
e.start()))
453 splitEdges.insert(edgeI, edgePoints);
458 splitEdges.insert(edgeI, edgePoints);
462 insert(edgeFaces[edgeI], facei, affectedFaces);
469 Pout<<
"Split edge:" << iter.key()
470 <<
" verts:" << mesh_.edges()[iter.key()]
473 const labelList& edgePoints = iter.val();
477 Pout<<
" " << edgePoints[i] <<
nl;
488 const label facei = faceLabels[i];
493 affectedFaces.erase(facei);
501 for (
const label facei : affectedFaces)
503 filterFace(splitEdges, facei, meshMod);
List< label > labelList
A List of labels.
srcOptions insert("case", fileName(rootDirSource/caseDirSource))
void reverse(UList< T > &list, const label n)
typename parent_type::const_iterator const_iterator
void set(List< bool > &bools, const labelRange &range)
Set the specified range 'on' in a boolList.
List< edge > edgeList
A List of edges.
void sort()
Forward (stable) sort the list (if changed after construction).
Describes the interaction of a face and a point. It carries the info of a successful hit and (if succ...
Direct mesh changes based on v1.3 polyTopoChange syntax.
An edge is a list of two point labels. The functionality it provides supports the discretisation on a...
A HashTable to objects of type <T> with a label key.
void append(const T &val)
Append an element at the end of the list.
Class describing modification of a point.
Ostream & endl(Ostream &os)
Add newline and flush stream.
prefixOSstream Pout
OSstream wrapped stdout (std::cout) with parallel prefix.
Mesh consisting of general polyhedral cells.
#define forAll(list, i)
Loop across all elements in list.
dimensioned< typename typeOfMag< Type >::type > magSqr(const dimensioned< Type > &dt)
DynamicList< T, SizeMin > & append(const T &val)
Append an element to the end of this list.
const point_type & rawPoint() const noexcept
The point, no checks.
void setRefinement(const labelList &faceLabels, const labelList &fpA, const labelList &fpB, polyTopoChange &) const
Collapse faces along endpoints. Play commands into.
A list that is sorted upon construction or when explicitly requested with the sort() method.
const labelIOList & zoneID
errorManip< error > abort(error &err)
Output to file stream, using an OSstream.
void setPoint(const point_type &p)
Set the point.
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
label setAction(const topoAction &action)
For compatibility with polyTopoChange: set topological action.
forAllConstIters(mixture.phases(), phase)
List< face > faceList
A List of faces.
Class containing data for face removal.
dimensionedScalar sqrt(const dimensionedScalar &ds)
const dimensionedScalar e
Elementary charge.
const labelList & indices() const
Return the list of sorted indices. Updated every sort.
#define forAllReverse(list, i)
Reverse loop across all elements in list.
A face is a list of labels corresponding to mesh vertices.
HashSet< label, Hash< label > > labelHashSet
A HashSet of labels, uses label hasher.
PointHit< Point > nearestDist(const Point &p) const
Return nearest distance to line from a given point.