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());
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],
203 Foam::faceCollapser::faceCollapser(
const polyMesh&
mesh)
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);
277 scalar w = near.
point().distSqr(pA);
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.
point() <<
" to " << newPoint
330 scalar w = near.
point().distSqr(pA);
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.point() <<
" to " << newPoint
346 near.setPoint(newPoint);
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];
415 label sorted0 = sortedFp[fp];
416 label sorted1 = sortedFp[fp1];
419 DynamicList<label> edgePoints(
f.
size());
424 if (sorted0 < sorted1)
428 for (label j = sorted0+1; j < sorted1; j++)
430 edgePoints.append(
f[dist.
indices()[j]]);
437 for (label j = sorted1+1; j < sorted0; j++)
439 edgePoints.append(
f[dist.
indices()[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];
490 meshMod.
setAction(polyRemoveFace(facei));
493 affectedFaces.erase(facei);
501 for (
const label facei : affectedFaces)
503 filterFace(splitEdges, facei, meshMod);
void size(const label n)
Older name for setAddressableSize.
void sort()
Forward (stable) sort the list (if changed after construction).
A face is a list of labels corresponding to mesh vertices.
void setPoint(const point_type &p)
Set the point.
error FatalError
Error stream (stdout output on all processes), with additional 'FOAM FATAL ERROR' header text and sta...
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
void append(const T &val)
Append an element at the end of the list.
A list that is sorted upon construction or when explicitly requested with the sort() method...
srcOptions insert("case", fileName(rootDirSource/caseDirSource))
typename parent_type::const_iterator const_iterator
constexpr char nl
The newline '\n' character (0x0a)
List< face > faceList
A List of faces.
dimensionedScalar sqrt(const dimensionedScalar &ds)
Ostream & endl(Ostream &os)
Add newline and flush stream.
void setRefinement(const labelList &faceLabels, const labelList &fpA, const labelList &fpB, polyTopoChange &) const
Collapse faces along endpoints. Play commands into.
#define forAll(list, i)
Loop across all elements in list.
label fcIndex(const label i) const noexcept
The forward circular index. The next index in the list which returns to the first at the end of the l...
HashSet< label, Hash< label > > labelHashSet
A HashSet of labels, uses label hasher.
const dimensionedScalar e
Elementary charge.
List< edge > edgeList
A List of edges.
void reverse(UList< T > &list, const label n)
Reverse the first n elements of the list.
Describes the interaction of a object and a (templated) point. It carries the info of a successful hi...
errorManip< error > abort(error &err)
A Vector of values with scalar precision, where scalar is float/double depending on the compilation f...
vector point
Point is a vector.
Direct mesh changes based on v1.3 polyTopoChange syntax.
const point_type & point() const noexcept
Return the point, no checks.
const labelList & indices() const noexcept
Return the list of sorted indices. Updated every sort.
#define forAllReverse(list, i)
Reverse loop across all elements in list.
List< label > labelList
A List of labels.
label rcIndex(const label i) const noexcept
The reverse circular index. The previous index in the list which returns to the last at the beginning...
prefixOSstream Pout
OSstream wrapped stdout (std::cout) with parallel prefix.
dimensioned< typename typeOfMag< Type >::type > magSqr(const dimensioned< Type > &dt)
PointHit< point > pointHit
A PointHit with a 3D point.
forAllConstIters(mixture.phases(), phase)
A HashTable to objects of type <T> with a label key.
label setAction(const topoAction &action)
For compatibility with polyTopoChange: set topological action.