58 << pre.c_str() <<
"vertex numbers:"
59 <<
f[0] <<
' ' <<
f[1] <<
' ' <<
f[2] <<
nl
61 << pre.c_str() <<
"vertex coords :"
64 << pre.c_str() <<
"region :" <<
f.region() <<
nl
75 fileName foamName(d.caseName() +
".ftr");
83 for (i=ts.size()-1; i>=0; i--)
85 if (ts[i].value() <= d.timeOutputValue())
96 for (label j=i; j>=0; j--)
98 if (
isFile(d.path()/ts[j].name()/typeName/foamName))
102 Pout<<
" triSurface::triSurfInstance(const Time& d)"
103 <<
"reading " << foamName
104 <<
" from " << ts[j].
name()/typeName
115 Pout<<
" triSurface::triSurfInstance(const Time& d)"
116 <<
"reading " << foamName
117 <<
" from constant/" <<
endl;
126 const label defaultRegion
129 List<labelledTri> triFaces(faces.size());
133 const face&
f = faces[facei];
138 <<
"Face at position " << facei
139 <<
" does not have three vertices:" <<
f
143 labelledTri& tri = triFaces[facei];
148 tri.region() = defaultRegion;
158 const label defaultRegion
161 List<labelledTri> triFaces(faces.size());
167 labelledTri& tri = triFaces[facei];
172 tri.region() = defaultRegion;
185 const label maxPointi =
points().size() - 1;
187 for (
const auto&
f : *
this)
189 for (
const label verti :
f)
191 if (verti < 0 || verti > maxPointi)
195 <<
" uses point indices outside point range 0.."
208 bitSet valid(size(),
true);
212 const labelledTri&
f = (*this)[facei];
214 if ((
f[0] ==
f[1]) || (
f[0] ==
f[2]) || (
f[1] ==
f[2]))
222 <<
"triangle " << facei
223 <<
" does not have three unique vertices:\n";
230 const labelList& fEdges = faceEdges()[facei];
235 for (
const label edgei : fEdges)
237 const labelList& eFaces = edgeFaces()[edgei];
239 for (
const label neighbour : eFaces)
241 if (neighbour > facei)
244 const labelledTri&
n = (*this)[neighbour];
248 ((
f[0] ==
n[0]) || (
f[0] ==
n[1]) || (
f[0] ==
n[2]))
249 && ((
f[1] ==
n[0]) || (
f[1] ==
n[1]) || (
f[1] ==
n[2]))
250 && ((
f[2] ==
n[0]) || (
f[2] ==
n[1]) || (
f[2] ==
n[2]))
258 <<
"triangles share the same vertices:\n"
259 <<
" face 1 :" << facei <<
endl;
265 << neighbour <<
endl;
281 for (
const label facei : valid)
283 (*this)[newFacei++] = (*this)[facei];
289 <<
"Removing " << size() - newFacei
290 <<
" illegal faces." <<
endl;
292 (*this).setSize(newFacei);
307 const labelList& myFaces = eFaces[edgei];
312 <<
"Edge " << edgei <<
" with vertices " << edges()[edgei]
313 <<
" has no edgeFaces"
316 else if (myFaces.size() > 2 && verbose)
319 <<
"Edge " << edgei <<
" with vertices " << edges()[edgei]
320 <<
" has more than 2 faces connected to it : " << myFaces
338 regions[facei] = operator[](facei).region();
344 label maxRegion = patches_.size()-1;
351 operator[](
faceMap.last()).region()
361 label region = operator[](facei).region();
363 newPatches[region].size()++;
369 label startFacei = 0;
370 forAll(newPatches, newPatchi)
372 surfacePatch& newPatch = newPatches[newPatchi];
374 newPatch.index() = newPatchi;
375 newPatch.start() = startFacei;
380 newPatchi < patches_.size()
381 && !patches_[newPatchi].name().empty()
384 newPatch.name() = patches_[newPatchi].name();
393 newPatchi < patches_.size()
394 && !patches_[newPatchi].geometricType().empty()
397 newPatch.geometricType() = patches_[newPatchi].geometricType();
404 startFacei += newPatch.size();
411 void Foam::triSurface::setDefaultPatches()
419 patches_.setSize(newPatches.size());
421 forAll(newPatches, patchi)
423 patches_[patchi].index() = patchi;
424 patches_[patchi].name() = newPatches[patchi].name();
425 patches_[patchi].geometricType() = newPatches[patchi].geometricType();
436 sortedEdgeFacesPtr_(nullptr),
437 edgeOwnerPtr_(nullptr)
445 sortedEdgeFacesPtr_(nullptr),
446 edgeOwnerPtr_(nullptr)
465 MeshReference(triangles, pts),
467 sortedEdgeFacesPtr_(nullptr),
468 edgeOwnerPtr_(nullptr)
480 MeshReference(triangles, pts, reuse),
482 sortedEdgeFacesPtr_(nullptr),
483 edgeOwnerPtr_(nullptr)
493 MeshReference(triangles, pts),
495 sortedEdgeFacesPtr_(nullptr),
496 edgeOwnerPtr_(nullptr)
508 MeshReference(convertToTri(triangles, 0), pts),
510 sortedEdgeFacesPtr_(nullptr),
511 edgeOwnerPtr_(nullptr)
520 const scalar scaleFactor
530 const word& fileType,
531 const scalar scaleFactor
536 read(
name, fileType);
554 MeshReference::clearTopology();
555 sortedEdgeFacesPtr_.reset(
nullptr);
556 edgeOwnerPtr_.reset(
nullptr);
562 MeshReference::clearPatchMeshAddr();
568 MeshReference::clearOut();
570 clearPatchMeshAddr();
592 if (!sortedEdgeFacesPtr_)
594 calcSortedEdgeFaces();
597 return *sortedEdgeFacesPtr_;
608 return *edgeOwnerPtr_;
615 sortedEdgeFacesPtr_.reset(
nullptr);
618 MeshReference::movePoints(pts);
621 storedPoints() = pts;
628 sortedEdgeFacesPtr_.reset(
nullptr);
631 MeshReference::movePoints(pts);
634 storedPoints().swap(pts);
641 if (scaleFactor > SMALL && !
equal(scaleFactor, 1))
644 this->clearTopology();
649 this->storedPoints() *= scaleFactor;
658 stitchTriangles(SMALL, verbose);
663 checkTriangles(verbose);
679 for (
auto&
f : this->storedFaces())
681 for (label& pointi :
f)
683 label compacti = oldToCompact[pointi];
686 compacti = compactPointMap.size();
687 oldToCompact[pointi] = compacti;
688 compactPointMap.append(pointi);
696 UIndirectList<point>(this->
points(), compactPointMap)
699 this->swapPoints(newPoints);
725 plainFaces.setSize(size());
729 plainFaces[facei] = this->operator[](facei);
740 const label currentZone,
750 DynamicList<label> newChangedFaces(2*changedFaces.size());
752 for (
const label facei : changedFaces)
754 const labelList& fEdges = faceEdges()[facei];
756 for (
const label edgei : fEdges)
758 if (!borderEdge[edgei])
760 const labelList& eFaces = edgeFaces()[edgei];
762 for (
const label nbrFacei : eFaces)
764 if (faceZone[nbrFacei] == -1)
766 faceZone[nbrFacei] = currentZone;
767 newChangedFaces.
append(nbrFacei);
769 else if (faceZone[nbrFacei] != currentZone)
772 <<
"Zones " << faceZone[nbrFacei]
773 <<
" at face " << nbrFacei
774 <<
" connects to zone " << currentZone
775 <<
" at face " << facei
783 if (newChangedFaces.empty())
788 changedFaces.transfer(newChangedFaces);
801 faceZone.setSize(size());
804 if (borderEdge.size() != nEdges())
807 <<
"borderEdge boolList not same size as number of edges" <<
endl
808 <<
"borderEdge:" << borderEdge.size() <<
endl
809 <<
"nEdges :" << nEdges()
815 for (label startFacei = 0;; zoneI++)
818 for (; startFacei < size(); startFacei++)
820 if (faceZone[startFacei] == -1)
826 if (startFacei >= size())
831 faceZone[startFacei] = zoneI;
833 markZone(borderEdge, startFacei, zoneI, faceZone);
847 const List<labelledTri>& locFaces = localFaces();
850 pointField newPoints(UIndirectList<point>(locPoints, pointMap));
853 labelList oldToNew(locPoints.size(), -1);
856 oldToNew[pointMap[pointi]] = pointi;
860 List<labelledTri> newFaces(UIndirectList<labelledTri>(locFaces,
faceMap));
863 for (
auto&
f : newFaces)
865 for (label& vert :
f)
867 vert = oldToNew[vert];
885 this->subsetMeshMap(include, pointMap,
faceMap);
886 return this->subsetMeshImpl(pointMap,
faceMap);
898 this->subsetMeshMap(include, pointMap,
faceMap);
899 return this->subsetMeshImpl(pointMap,
faceMap);
907 return this->subsetMesh(include, pointMap,
faceMap);
915 return this->subsetMesh(include, pointMap,
faceMap);
926 const bitSet selectPatches
937 bitSet include(this->size());
941 const label patchi = (*this)[facei].region();
943 if (selectPatches.test(patchi))
949 return this->subsetMesh(include);
957 this->storedFaces().swap(faceLst);
967 patches_.transfer(surf.
patches());
976 auto patches = ListOps::create<geometricSurfacePatch>
1003 storedFaces() = surf;
1004 storedPoints() = surf.
points();