Go to the documentation of this file.
36 #include "indirectPrimitivePatch.H"
56 const label oldRegion,
57 const label newRegion,
61 if (cellRegion[cellI] == oldRegion)
63 cellRegion[cellI] = newRegion;
67 const labelList& cCells = mesh_.cellCells()[cellI];
71 changeCellRegion(cCells[i], oldRegion, newRegion, cellRegion);
84 const label newRegion,
91 if (faceRegion[faceI] == -1 && !removedFace[faceI])
93 faceRegion[faceI] = newRegion;
104 label edgeI = fEdges[i];
106 if (nFacesPerEdge[edgeI] >= 0 && nFacesPerEdge[edgeI] <= 2)
108 const labelList& eFaces = mesh_.edgeFaces(edgeI, ef);
112 label nbrFaceI = eFaces[j];
114 const labelList& fEdges1 = mesh_.faceEdges(nbrFaceI, fe);
116 nChanged += changeFaceRegion
148 boolList affectedFace(mesh_.nFaces(),
false);
153 label region = cellRegion[cellI];
155 if (region != -1 && (cellI != cellRegionMaster[region]))
157 const labelList& cFaces = mesh_.cells()[cellI];
161 affectedFace[cFaces[cFaceI]] =
true;
169 affectedFace[facesToRemove[i]] =
true;
175 const labelList& eFaces = mesh_.edgeFaces(iter.key());
179 affectedFace[eFaces[eFaceI]] =
true;
186 label pointI = iter.key();
192 affectedFace[
pFaces[pFaceI]] =
true;
206 Pout<<
"removeFaces::writeOBJ : Writing faces to file "
220 const face&
f = localFaces[i];
226 str<<
' ' <<
f[fp]+1;
259 writeOBJ(fp, mesh_.time().path()/
"facesToBeMerged.obj");
261 <<
"Cannot merge faces " << faceLabels
262 <<
" into single face since outside vertices " << fp.
edgeLoops()
263 <<
" do not form single loop but form " << fp.
edgeLoops().
size()
274 label masterIndex = -1;
275 bool reverseLoop =
false;
295 if (index1 ==
f.fcIndex(index0))
301 else if (index1 ==
f.rcIndex(index0))
311 if (masterIndex == -1)
313 writeOBJ(fp, mesh_.time().path()/
"facesToBeMerged.obj");
323 label faceI = faceLabels[masterIndex];
325 label own = mesh_.faceOwner()[faceI];
327 if (cellRegion[own] != -1)
329 own = cellRegionMaster[cellRegion[own]];
332 label patchID, zoneID, zoneFlip;
334 getFaceInfo(faceI, patchID, zoneID, zoneFlip);
338 if (mesh_.isInternalFace(faceI))
340 nei = mesh_.faceNeighbour()[faceI];
342 if (cellRegion[nei] != -1)
344 nei = cellRegionMaster[cellRegion[nei]];
355 if (pointsToRemove.
found(pointI))
402 forAll(faceLabels, patchFaceI)
404 if (patchFaceI != masterIndex)
426 if (!mesh_.isInternalFace(faceI))
428 patchID = mesh_.boundaryMesh().whichPatch(faceI);
431 zoneID = mesh_.faceZones().whichZone(faceI);
437 const faceZone& fZone = mesh_.faceZones()[zoneID];
451 const face&
f = mesh_.faces()[faceI];
461 if (!pointsToRemove.
found(vertI))
463 newFace[newFp++] = vertI;
469 return face(newFace);
477 const label masterFaceID,
480 const bool flipFaceFlux,
481 const label newPatchID,
482 const bool removeFromZone,
489 if ((nei == -1) || (own < nei))
588 const labelList& faceOwner = mesh_.faceOwner();
589 const labelList& faceNeighbour = mesh_.faceNeighbour();
591 cellRegion.
setSize(mesh_.nCells());
594 regionMaster.
setSize(mesh_.nCells());
601 label faceI = facesToRemove[i];
603 if (!mesh_.isInternalFace(faceI))
610 label own = faceOwner[faceI];
611 label nei = faceNeighbour[faceI];
613 label region0 = cellRegion[own];
614 label region1 = cellRegion[nei];
621 cellRegion[own] = nRegions;
622 cellRegion[nei] = nRegions;
625 regionMaster[nRegions] = own;
631 cellRegion[own] = region1;
633 regionMaster[region1] =
min(own, regionMaster[region1]);
641 cellRegion[nei] = region0;
645 else if (region0 != region1)
648 label freedRegion = -1;
649 label keptRegion = -1;
651 if (region0 < region1)
661 keptRegion = region0;
662 freedRegion = region1;
664 else if (region1 < region0)
674 keptRegion = region1;
675 freedRegion = region0;
678 label master0 = regionMaster[region0];
679 label master1 = regionMaster[region1];
681 regionMaster[freedRegion] = -1;
682 regionMaster[keptRegion] =
min(master0, master1);
687 regionMaster.
setSize(nRegions);
698 label r = cellRegion[cellI];
704 if (cellI < regionMaster[r])
707 <<
"Not lowest numbered : cell:" << cellI
709 <<
" regionmaster:" << regionMaster[r]
717 if (nCells[region] == 1)
720 <<
"Region " << region
721 <<
" has only " << nCells[region] <<
" cells in it"
729 label nUsedRegions = 0;
733 if (regionMaster[i] != -1)
742 for (
label faceI = 0; faceI < mesh_.nInternalFaces(); faceI++)
744 label own = faceOwner[faceI];
745 label nei = faceNeighbour[faceI];
747 if (cellRegion[own] != -1 && cellRegion[own] == cellRegion[nei])
751 allFacesToRemove.
append(faceI);
755 newFacesToRemove.
transfer(allFacesToRemove);
771 faceSet facesToRemove(mesh_,
"facesToRemove", faceLabels);
772 Pout<<
"Writing faces to remove to faceSet " << facesToRemove.
name()
774 facesToRemove.
write();
778 boolList removedFace(mesh_.nFaces(),
false);
782 label faceI = faceLabels[i];
784 if (!mesh_.isInternalFace(faceI))
787 <<
"Face to remove is not internal face:" << faceI
791 removedFace[faceI] =
true;
804 labelList faceRegion(mesh_.nFaces(), -1);
819 labelList nFacesPerEdge(mesh_.nEdges(), -1);
824 label faceI = faceLabels[i];
826 const labelList& fEdges = mesh_.faceEdges(faceI, fe);
830 label edgeI = fEdges[i];
832 if (nFacesPerEdge[edgeI] == -1)
834 nFacesPerEdge[edgeI] = mesh_.edgeFaces(edgeI, ef).
size()-1;
838 nFacesPerEdge[edgeI]--;
848 forAll(mesh_.edges(), edgeI)
850 if (nFacesPerEdge[edgeI] == -1)
855 const labelList& eFaces = mesh_.edgeFaces(edgeI, ef);
857 if (eFaces.
size() > 2)
859 nFacesPerEdge[edgeI] = eFaces.
size();
861 else if (eFaces.
size() == 2)
867 const edge&
e = mesh_.edges()[edgeI];
870 <<
"Problem : edge has too few face neighbours:"
874 <<
" coords:" << mesh_.points()[
e[0]]
875 << mesh_.points()[
e[1]]
885 OFstream str(mesh_.time().path()/
"edgesWithTwoFaces.obj");
886 Pout<<
"Dumping edgesWithTwoFaces to " << str.
name() <<
endl;
889 forAll(nFacesPerEdge, edgeI)
891 if (nFacesPerEdge[edgeI] == 2)
894 const edge&
e = mesh_.edges()[edgeI];
900 str<<
"l " << vertI-1 <<
' ' << vertI <<
nl;
911 forAll(nFacesPerEdge, edgeI)
913 if (nFacesPerEdge[edgeI] == 2)
919 const labelList& eFaces = mesh_.edgeFaces(edgeI, ef);
923 label faceI = eFaces[i];
925 if (!removedFace[faceI] && !mesh_.isInternalFace(faceI))
939 if (f0 != -1 &&
f1 != -1)
947 if (patch0 != patch1)
951 <<
"not merging faces " << f0 <<
" and "
952 <<
f1 <<
" across patch boundary edge " << edgeI
956 nFacesPerEdge[edgeI] = 3;
958 else if (minCos_ < 1 && minCos_ > -1)
974 <<
"not merging faces " << f0 <<
" and "
975 <<
f1 <<
" across edge " << edgeI
980 nFacesPerEdge[edgeI] = 3;
984 else if (f0 != -1 ||
f1 != -1)
986 const edge&
e = mesh_.edges()[edgeI];
990 <<
"Problem : edge would have one boundary face"
991 <<
" and one internal face using it." <<
endl
992 <<
"Your remove pattern is probably incorrect." <<
endl
994 <<
" nFaces:" << nFacesPerEdge[edgeI]
996 <<
" coords:" << mesh_.points()[
e[0]]
997 << mesh_.points()[
e[1]]
1008 forAll(nFacesPerEdge, edgeI)
1010 if (nFacesPerEdge[edgeI] == 1)
1012 const edge&
e = mesh_.edges()[edgeI];
1015 <<
"Problem : edge would get 1 face using it only"
1016 <<
" edge:" << edgeI
1017 <<
" nFaces:" << nFacesPerEdge[edgeI]
1018 <<
" vertices:" <<
e
1019 <<
" coords:" << mesh_.points()[
e[0]]
1020 <<
' ' << mesh_.points()[
e[1]]
1070 syncTools::syncEdgeList
1079 forAll(nFacesPerEdge, edgeI)
1081 if (nFacesPerEdge[edgeI] == 0)
1084 edgesToRemove.
insert(edgeI);
1086 else if (nFacesPerEdge[edgeI] == 1)
1090 else if (nFacesPerEdge[edgeI] == 2)
1093 edgesToRemove.
insert(edgeI);
1099 OFstream str(mesh_.time().path()/
"edgesToRemove.obj");
1100 Pout<<
"Dumping edgesToRemove to " << str.
name() <<
endl;
1106 const edge&
e = mesh_.edges()[iter.key()];
1112 str<<
"l " << vertI-1 <<
' ' << vertI <<
nl;
1120 label startFaceI = 0;
1125 for (; startFaceI < mesh_.nFaces(); startFaceI++)
1127 if (faceRegion[startFaceI] == -1 && !removedFace[startFaceI])
1133 if (startFaceI == mesh_.nFaces())
1141 label nRegion = changeFaceRegion
1148 mesh_.faceEdges(startFaceI, fe),
1156 else if (nRegion == 1)
1159 faceRegion[startFaceI] = -2;
1174 syncTools::swapFaceList
1184 label faceI = mesh_.nInternalFaces();
1185 faceI < mesh_.nFaces();
1190 label nbrRegion = nbrFaceRegion[faceI];
1191 label myRegion = faceRegion[faceI];
1193 if (myRegion <= -1 || nbrRegion <= -1)
1195 if (nbrRegion != myRegion)
1198 <<
"Inconsistent face region across coupled patches."
1200 <<
"This side has for faceI:" << faceI
1201 <<
" region:" << myRegion <<
endl
1202 <<
"The other side has region:" << nbrRegion
1204 <<
"(region -1 means face is to be deleted)"
1208 else if (toNbrRegion[myRegion] == -1)
1211 toNbrRegion[myRegion] = nbrRegion;
1216 if (toNbrRegion[myRegion] != nbrRegion)
1219 <<
"Inconsistent face region across coupled patches."
1221 <<
"This side has for faceI:" << faceI
1222 <<
" region:" << myRegion
1223 <<
" with coupled neighbouring regions:"
1224 << toNbrRegion[myRegion] <<
" and "
1254 labelList nEdgesPerPoint(mesh_.nPoints());
1258 forAll(pointEdges, pointI)
1260 nEdgesPerPoint[pointI] = pointEdges[pointI].
size();
1266 const edge&
e = mesh_.edges()[iter.key()];
1270 nEdgesPerPoint[
e[i]]--;
1275 forAll(nEdgesPerPoint, pointI)
1277 if (nEdgesPerPoint[pointI] == 1)
1280 <<
"Problem : point would get 1 edge using it only."
1281 <<
" pointI:" << pointI
1282 <<
" coord:" << mesh_.points()[pointI]
1289 syncTools::syncPointList
1297 forAll(nEdgesPerPoint, pointI)
1299 if (nEdgesPerPoint[pointI] == 0)
1301 pointsToRemove.
insert(pointI);
1303 else if (nEdgesPerPoint[pointI] == 1)
1307 else if (nEdgesPerPoint[pointI] == 2)
1310 pointsToRemove.
insert(pointI);
1318 OFstream str(mesh_.time().path()/
"pointsToRemove.obj");
1319 Pout<<
"Dumping pointsToRemove to " << str.
name() <<
endl;
1367 if (affectedFace[faceI])
1369 affectedFace[faceI] =
false;
1379 label pointI = iter.key();
1386 forAll(cellRegion, cellI)
1388 label region = cellRegion[cellI];
1390 if (region != -1 && (cellI != cellRegionMaster[region]))
1405 forAll(regionToFaces, regionI)
1407 const labelList& rFaces = regionToFaces[regionI];
1409 if (rFaces.
size() <= 1)
1412 <<
"Region:" << regionI
1413 <<
" contains only faces " << rFaces
1429 affectedFace[rFaces[i]] =
false;
1440 forAll(affectedFace, faceI)
1442 if (affectedFace[faceI])
1444 affectedFace[faceI] =
false;
1446 face f(filterFace(pointsToRemove, faceI));
1448 label own = mesh_.faceOwner()[faceI];
1450 if (cellRegion[own] != -1)
1452 own = cellRegionMaster[cellRegion[own]];
1455 label patchID, zoneID, zoneFlip;
1457 getFaceInfo(faceI, patchID, zoneID, zoneFlip);
1461 if (mesh_.isInternalFace(faceI))
1463 nei = mesh_.faceNeighbour()[faceI];
1465 if (cellRegion[nei] != -1)
1467 nei = cellRegionMaster[cellRegion[nei]];
const labelListList & pointFaces() const
Return point-face addressing.
void mergeFaces(const labelList &cellRegion, const labelList &cellRegionMaster, const labelHashSet &pointsToRemove, const labelList &faceLabels, polyTopoChange &meshMod) const
Merge faceLabels into single face.
A class for handling file names.
Class containing data for point removal.
#define forAll(list, i)
Loop across all elements in list.
void writeOBJ(Ostream &os, label &vertI, const tetPoints &tet)
label findIndex(const ListType &, typename ListType::const_reference, const label start=0)
Find first occurence of given element and return index,.
labelListList invertOneToMany(const label len, const labelUList &)
Invert one-to-many map. Unmapped elements will be size 0.
const Field< PointType > & localPoints() const
Return pointField of points in patch.
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...
void transfer(List< T > &)
Transfer the contents of the argument List into this list.
virtual bool write() const
Write using setting from DB.
void changeCellRegion(const label cellI, const label oldRegion, const label newRegion, labelList &cellRegion) const
Change elements in cellRegion that are oldRegion to newRegion.
Class describing modification of a face.
Ostream & endl(Ostream &os)
Add newline and flush stream.
void setRefinement(const labelList &piercedFaces, const labelList &cellRegion, const labelList &cellRegionMaster, polyTopoChange &) const
Play commands into polyTopoChange to remove faces.
face filterFace(const labelHashSet &, const label) const
Return face with all pointsToRemove removed.
dimensioned< scalar > mag(const dimensioned< Type > &)
Mesh consisting of general polyhedral cells.
forAllConstIter(PtrDictionary< phaseModel >, mixture.phases(), phase)
Info<< "Finished reading KIVA file"<< endl;cellShapeList cellShapes(nPoints);labelList cellZoning(nPoints, -1);const cellModel &hex=*(cellModeller::lookup("hex"));labelList hexLabels(8);label activeCells=0;labelList pointMap(nPoints);forAll(pointMap, i){ pointMap[i]=i;}for(label i=0;i< nPoints;i++){ if(f[i] > 0.0) { hexLabels[0]=i;hexLabels[1]=i1tab[i];hexLabels[2]=i3tab[i1tab[i]];hexLabels[3]=i3tab[i];hexLabels[4]=i8tab[i];hexLabels[5]=i1tab[i8tab[i]];hexLabels[6]=i3tab[i1tab[i8tab[i]]];hexLabels[7]=i3tab[i8tab[i]];cellShapes[activeCells]=cellShape(hex, hexLabels);edgeList edges=cellShapes[activeCells].edges();forAll(edges, ei) { if(edges[ei].mag(points)< SMALL) { label start=pointMap[edges[ei].start()];while(start !=pointMap[start]) { start=pointMap[start];} label end=pointMap[edges[ei].end()];while(end !=pointMap[end]) { end=pointMap[end];} label minLabel=min(start, end);pointMap[start]=pointMap[end]=minLabel;} } cellZoning[activeCells]=idreg[i];activeCells++;}}cellShapes.setSize(activeCells);cellZoning.setSize(activeCells);forAll(cellShapes, celli){ cellShape &cs=cellShapes[celli];forAll(cs, i) { cs[i]=pointMap[cs[i]];} cs.collapse();}label bcIDs[11]={-1, 0, 2, 4, -1, 5, -1, 6, 7, 8, 9};const label nBCs=12;const word *kivaPatchTypes[nBCs]={ &wallPolyPatch::typeName, &wallPolyPatch::typeName, &wallPolyPatch::typeName, &wallPolyPatch::typeName, &symmetryPolyPatch::typeName, &wedgePolyPatch::typeName, &polyPatch::typeName, &polyPatch::typeName, &polyPatch::typeName, &polyPatch::typeName, &symmetryPolyPatch::typeName, &oldCyclicPolyPatch::typeName};enum patchTypeNames{ PISTON, VALVE, LINER, CYLINDERHEAD, AXIS, WEDGE, INFLOW, OUTFLOW, PRESIN, PRESOUT, SYMMETRYPLANE, CYCLIC};const char *kivaPatchNames[nBCs]={ "piston", "valve", "liner", "cylinderHead", "axis", "wedge", "inflow", "outflow", "presin", "presout", "symmetryPlane", "cyclic"};List< SLList< face > > pFaces[nBCs]
static const label labelMin
Class containing data for cell removal.
intWM_LABEL_SIZE_t label
A label is an int32_t or int64_t as specified by the pre-processor macro WM_LABEL_SIZE.
Pre-declare SubField and related Field type.
removeFaces(const removeFaces &)
Disallow default bitwise copy construct.
A subset of mesh faces organised as a primitive patch.
A patch is a list of labels that address the faces in the global face list.
A List with indirect addressing.
const word & name() const
Return name.
static void writeOBJ(const indirectPrimitivePatch &, const fileName &)
Debug: write set of faces to file in obj format.
boolList getFacesAffected(const labelList &cellRegion, const labelList &cellRegionMaster, const labelList &facesToRemove, const labelHashSet &edgesToRemove, const labelHashSet &pointsToRemove) const
Get all affected faces (including faces marked for removal)
bool found(const Key &) const
Return true if hashedEntry is found in table.
label whichFace(const label globalCellID) const
Helper function to re-direct to zone::localID(...)
errorManip< error > abort(error &err)
label start() const
Return start label of this patch in the polyMesh face list.
DynamicList< T, SizeInc, SizeMult, SizeDiv > & append(const T &)
Append an element at the end of the list.
void modFace(const face &f, const label masterFaceID, const label own, const label nei, const bool flipFaceFlux, const label newPatchID, const bool removeFromZone, const label zoneID, const bool zoneFlip, polyTopoChange &meshMod) const
Wrapper for meshMod.modifyFace. Reverses face if own>nei.
void setSize(const label)
Reset size of List.
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
label setAction(const topoAction &action)
For compatibility with polyTopoChange: set topological action.
prefixOSstream Pout(cout, "Pout")
const Field< PointType > & faceNormals() const
Return face normals for patch.
label changeFaceRegion(const labelList &cellRegion, const boolList &removedFace, const labelList &nFacesPerEdge, const label faceI, const label newRegion, const labelList &fEdges, labelList &faceRegion) const
Changes region of connected set of faces.
Class containing data for face removal.
const labelListList & edgeLoops() const
Return list of closed loops of boundary vertices.
A 1D array of objects of type <T>, where the size of the vector is known and used for subscript bound...
const dimensionedScalar e
Elementary charge.
bool insert(const Key &key)
Insert a new entry.
void getFaceInfo(const label faceI, label &patchID, label &zoneID, label &zoneFlip) const
Get patch, zone info for faceI.
const List< Face > & localFaces() const
Return patch faces addressing into local point list.
A face is a list of labels corresponding to mesh vertices.
const fileName & name() const
Return the name of the stream.
void size(const label)
Override size to be inconsistent with allocated storage.
label compatibleRemoves(const labelList &inPiercedFaces, labelList &cellRegion, labelList &cellRegionMaster, labelList &outPiercedFaces) const
Find faces including those with cells which have the same mastercell.
const labelList & meshPoints() const
Return labelList of mesh points in patch.
const boolList & flipMap() const
Return face flip map.
defineTypeNameAndDebug(combustionModel, 0)
dimensioned< Type > min(const dimensioned< Type > &, const dimensioned< Type > &)
#define WarningInFunction
Report a warning using Foam::Warning.
A list of faces which address into the list of points.
static const labelSphericalTensor labelI(1)
Identity labelTensor.
void reverse(UList< T > &, const label n)