60 x = (
x ==
y) ?
x : value;
89 newElems[newI] = elems[i];
107 if (!mesh_.isInternalFace(faceI))
109 patchID = mesh_.boundaryMesh().whichPatch(faceI);
112 zoneID = mesh_.faceZones().whichZone(faceI);
118 const faceZone& fZone = mesh_.faceZones()[zoneID];
135 label patchID, zoneID, zoneFlip;
137 getFaceInfo(faceI, patchID, zoneID, zoneFlip);
141 if ((nei == -1) || (own < nei))
194 const label meshFaceI,
195 const label meshPointI,
201 if (mesh_.isInternalFace(meshFaceI))
296 label patchID, zoneID, zoneFlip;
310 if ((nei == -1) || (own < nei))
353 if (cellLevel_.size() != mesh_.nCells())
356 <<
"Number of cells in mesh:" << mesh_.nCells()
357 <<
" does not equal size of cellLevel:" << cellLevel_.size()
359 <<
"This might be because of a restart with inconsistent cellLevel."
366 const scalar GREAT2 =
sqr(GREAT);
383 const label cLevel = cellLevel_[cellI];
385 const labelList& cEdges = mesh_.cellEdges(cellI);
389 label edgeI = cEdges[i];
391 if (edgeLevel[edgeI] == -1)
393 edgeLevel[edgeI] = cLevel;
395 else if (edgeLevel[edgeI] ==
labelMax)
399 else if (edgeLevel[edgeI] != cLevel)
413 ifEqEqOp<labelMax>(),
421 const label eLevel = edgeLevel[edgeI];
423 if (eLevel >= 0 && eLevel <
labelMax)
425 const edge&
e = mesh_.edges()[edgeI];
427 scalar edgeLenSqr =
magSqr(
e.vec(mesh_.points()));
429 typEdgeLenSqr[eLevel] =
min(typEdgeLenSqr[eLevel], edgeLenSqr);
441 Pout<<
"hexRef8::getLevel0EdgeLength() :"
442 <<
" After phase1: Edgelengths (squared) per refinementlevel:"
443 << typEdgeLenSqr <<
endl;
457 const label cLevel = cellLevel_[cellI];
459 const labelList& cEdges = mesh_.cellEdges(cellI);
463 const edge&
e = mesh_.edges()[cEdges[i]];
465 scalar edgeLenSqr =
magSqr(
e.vec(mesh_.points()));
467 maxEdgeLenSqr[cLevel] =
max(maxEdgeLenSqr[cLevel], edgeLenSqr);
476 Pout<<
"hexRef8::getLevel0EdgeLength() :"
477 <<
" Crappy Edgelengths (squared) per refinementlevel:"
478 << maxEdgeLenSqr <<
endl;
485 forAll(typEdgeLenSqr, levelI)
487 if (typEdgeLenSqr[levelI] == GREAT2 && maxEdgeLenSqr[levelI] >= 0)
489 typEdgeLenSqr[levelI] = maxEdgeLenSqr[levelI];
495 Pout<<
"hexRef8::getLevel0EdgeLength() :"
496 <<
" Final Edgelengths (squared) per refinementlevel:"
497 << typEdgeLenSqr <<
endl;
501 scalar level0Size = -1;
503 forAll(typEdgeLenSqr, levelI)
505 scalar lenSqr = typEdgeLenSqr[levelI];
513 Pout<<
"hexRef8::getLevel0EdgeLength() :"
514 <<
" For level:" << levelI
516 <<
" with equivalent level0 len:" << level0Size
523 if (level0Size == -1)
544 if (cellAnchorPoints[cellI].size())
550 return cellAddedCells[cellI][index];
557 const face&
f = mesh_.faces()[faceI];
565 return cellAddedCells[cellI][index];
571 Perr<<
"cell:" << cellI <<
" anchorPoints:" << cellAnchorPoints[cellI]
575 <<
"Could not find point " << pointI
576 <<
" in the anchorPoints for cell " << cellI <<
endl
577 <<
"Does your original mesh obey the 2:1 constraint and"
578 <<
" did you use consistentRefinement to make your cells to refine"
579 <<
" obey this constraint as well?"
608 mesh_.faceOwner()[faceI],
613 if (mesh_.isInternalFace(faceI))
619 mesh_.faceNeighbour()[faceI],
639 label level = pointLevel_[
f[fp]];
641 if (level < minLevel)
660 label level = pointLevel_[
f[fp]];
662 if (level > maxLevel)
676 const label anchorLevel
683 if (pointLevel_[
f[fp]] <= anchorLevel)
694 OFstream str(mesh_.time().path()/
"cell_" +
Foam::name(cellI) +
".obj");
695 Pout<<
"hexRef8 : Dumping cell as obj to " << str.
name() <<
endl;
697 const cell& cFaces = mesh_.cells()[cellI];
699 Map<label> pointToObjVert;
704 const face&
f = mesh_.faces()[cFaces[i]];
708 if (pointToObjVert.insert(
f[fp], objVertI))
718 const face&
f = mesh_.faces()[cFaces[i]];
723 label nexPointI =
f[
f.fcIndex(fp)];
725 str <<
"l " << pointToObjVert[pointI]+1
726 <<
' ' << pointToObjVert[nexPointI]+1 <<
nl;
738 const bool searchForward,
739 const label wantedLevel
748 if (pointLevel_[pointI] < wantedLevel)
750 dumpCell(mesh_.faceOwner()[faceI]);
751 if (mesh_.isInternalFace(faceI))
753 dumpCell(mesh_.faceNeighbour()[faceI]);
758 <<
" level:" << UIndirectList<label>(pointLevel_,
f)()
759 <<
" startFp:" << startFp
760 <<
" wantedLevel:" << wantedLevel
763 else if (pointLevel_[pointI] == wantedLevel)
778 dumpCell(mesh_.faceOwner()[faceI]);
779 if (mesh_.isInternalFace(faceI))
781 dumpCell(mesh_.faceNeighbour()[faceI]);
786 <<
" level:" << UIndirectList<label>(pointLevel_,
f)()
787 <<
" startFp:" << startFp
788 <<
" wantedLevel:" << wantedLevel
798 const face&
f = mesh_.faces()[faceI];
802 return pointLevel_[
f[findMaxLevel(
f)]];
806 label ownLevel = cellLevel_[mesh_.faceOwner()[faceI]];
808 if (countAnchors(
f, ownLevel) == 4)
812 else if (countAnchors(
f, ownLevel+1) == 4)
826 polyTopoChange& meshMod,
834 face compactFace(
identity(newFace.size()));
835 pointField compactPoints(meshMod.points(), newFace);
837 vector n(compactFace.normal(compactPoints));
839 vector dir(neiPt - ownPt);
844 <<
"cell:" << cellI <<
" old face:" << faceI
845 <<
" newFace:" << newFace <<
endl
846 <<
" coords:" << compactPoints
847 <<
" ownPt:" << ownPt
848 <<
" neiPt:" << neiPt
852 vector fcToOwn(compactFace.centre(compactPoints) - ownPt);
854 scalar
s = (fcToOwn&
n) / (dir&
n);
856 if (s < 0.1 || s > 0.9)
859 <<
"cell:" << cellI <<
" old face:" << faceI
860 <<
" newFace:" << newFace <<
endl
861 <<
" coords:" << compactPoints
862 <<
" ownPt:" << ownPt
863 <<
" neiPt:" << neiPt
872 polyTopoChange& meshMod,
876 const point& boundaryPt,
880 face compactFace(
identity(newFace.size()));
881 pointField compactPoints(meshMod.points(), newFace);
883 vector n(compactFace.normal(compactPoints));
885 vector dir(boundaryPt - ownPt);
890 <<
"cell:" << cellI <<
" old face:" << faceI
891 <<
" newFace:" << newFace
892 <<
" coords:" << compactPoints
893 <<
" ownPt:" << ownPt
894 <<
" boundaryPt:" << boundaryPt
898 vector fcToOwn(compactFace.centre(compactPoints) - ownPt);
900 scalar
s = (fcToOwn&dir) /
magSqr(dir);
902 if (s < 0.7 || s > 1.3)
905 <<
"cell:" << cellI <<
" old face:" << faceI
906 <<
" newFace:" << newFace
907 <<
" coords:" << compactPoints
908 <<
" ownPt:" << ownPt
909 <<
" boundaryPt:" << boundaryPt
924 DynamicList<label>& verts
927 if (p0 < mesh_.nPoints() && p1 < mesh_.nPoints())
931 if (edgeI != -1 && edgeMidPoint[edgeI] != -1)
933 verts.append(edgeMidPoint[edgeI]);
955 const bool faceOrder,
956 const label edgeMidPointI,
957 const label anchorPointI,
958 const label faceMidPointI,
960 Map<edge>& midPointToAnchors,
961 Map<edge>& midPointToFaceMids,
962 polyTopoChange& meshMod
967 bool changed =
false;
968 bool haveTwoAnchors =
false;
972 if (edgeMidFnd == midPointToAnchors.end())
974 midPointToAnchors.insert(edgeMidPointI, edge(anchorPointI, -1));
978 edge&
e = edgeMidFnd();
980 if (anchorPointI !=
e[0])
989 if (
e[0] != -1 &&
e[1] != -1)
991 haveTwoAnchors =
true;
995 bool haveTwoFaceMids =
false;
999 if (faceMidFnd == midPointToFaceMids.end())
1001 midPointToFaceMids.insert(edgeMidPointI, edge(faceMidPointI, -1));
1005 edge&
e = faceMidFnd();
1007 if (faceMidPointI !=
e[0])
1011 e[1] = faceMidPointI;
1016 if (
e[0] != -1 &&
e[1] != -1)
1018 haveTwoFaceMids =
true;
1025 if (changed && haveTwoAnchors && haveTwoFaceMids)
1027 const edge& anchors = midPointToAnchors[edgeMidPointI];
1028 const edge& faceMids = midPointToFaceMids[edgeMidPointI];
1030 label otherFaceMidPointI = faceMids.otherVertex(faceMidPointI);
1037 DynamicList<label> newFaceVerts(4);
1038 if (faceOrder == (mesh_.faceOwner()[faceI] == cellI))
1040 newFaceVerts.append(faceMidPointI);
1051 newFaceVerts.append(edgeMidPointI);
1061 newFaceVerts.append(otherFaceMidPointI);
1062 newFaceVerts.append(cellMidPoint[cellI]);
1066 newFaceVerts.append(otherFaceMidPointI);
1076 newFaceVerts.append(edgeMidPointI);
1086 newFaceVerts.append(faceMidPointI);
1087 newFaceVerts.append(cellMidPoint[cellI]);
1091 newFace.transfer(newFaceVerts);
1093 label anchorCell0 = getAnchorCell
1101 label anchorCell1 = getAnchorCell
1107 anchors.otherVertex(anchorPointI)
1114 if (anchorCell0 < anchorCell1)
1119 ownPt = mesh_.points()[anchorPointI];
1120 neiPt = mesh_.points()[anchors.otherVertex(anchorPointI)];
1129 ownPt = mesh_.points()[anchors.otherVertex(anchorPointI)];
1130 neiPt = mesh_.points()[anchorPointI];
1137 if (anchorCell0 < anchorCell1)
1139 ownPt = mesh_.points()[anchorPointI];
1140 neiPt = mesh_.points()[anchors.otherVertex(anchorPointI)];
1144 ownPt = mesh_.points()[anchors.otherVertex(anchorPointI)];
1145 neiPt = mesh_.points()[anchorPointI];
1148 checkInternalOrientation
1159 return addInternalFace
1187 polyTopoChange& meshMod
1193 const cell& cFaces = mesh_.cells()[cellI];
1194 const label cLevel = cellLevel_[cellI];
1197 Map<edge> midPointToAnchors(24);
1199 Map<edge> midPointToFaceMids(24);
1202 DynamicList<label> storage;
1206 label nFacesAdded = 0;
1210 label faceI = cFaces[i];
1212 const face&
f = mesh_.faces()[faceI];
1213 const labelList& fEdges = mesh_.faceEdges(faceI, storage);
1218 label faceMidPointI = -1;
1220 label nAnchors = countAnchors(
f, cLevel);
1228 label anchorFp = -1;
1232 if (pointLevel_[
f[fp]] <= cLevel)
1240 label edgeMid = findLevel
1244 f.fcIndex(anchorFp),
1248 label faceMid = findLevel
1257 faceMidPointI =
f[faceMid];
1259 else if (nAnchors == 4)
1264 faceMidPointI = faceMidPoint[faceI];
1268 dumpCell(mesh_.faceOwner()[faceI]);
1269 if (mesh_.isInternalFace(faceI))
1271 dumpCell(mesh_.faceNeighbour()[faceI]);
1275 <<
"nAnchors:" << nAnchors
1276 <<
" faceI:" << faceI
1290 if (pointLevel_[point0] <= cLevel)
1299 label edgeMidPointI = -1;
1301 label fp1 =
f.fcIndex(fp0);
1303 if (pointLevel_[
f[fp1]] <= cLevel)
1306 label edgeI = fEdges[fp0];
1308 edgeMidPointI = edgeMidPoint[edgeI];
1310 if (edgeMidPointI == -1)
1314 const labelList& cPoints = mesh_.cellPoints(cellI);
1317 <<
"cell:" << cellI <<
" cLevel:" << cLevel
1318 <<
" cell points:" << cPoints
1320 << UIndirectList<label>(pointLevel_, cPoints)()
1321 <<
" face:" << faceI
1324 << UIndirectList<label>(pointLevel_,
f)()
1325 <<
" faceAnchorLevel:" << faceAnchorLevel[faceI]
1326 <<
" faceMidPoint:" << faceMidPoint[faceI]
1327 <<
" faceMidPointI:" << faceMidPointI
1335 label edgeMid = findLevel(faceI,
f, fp1,
true, cLevel+1);
1337 edgeMidPointI =
f[edgeMid];
1340 label newFaceI = storeMidPointInfo
1363 if (nFacesAdded == 12)
1374 label fpMin1 =
f.rcIndex(fp0);
1376 if (pointLevel_[
f[fpMin1]] <= cLevel)
1379 label edgeI = fEdges[fpMin1];
1381 edgeMidPointI = edgeMidPoint[edgeI];
1383 if (edgeMidPointI == -1)
1387 const labelList& cPoints = mesh_.cellPoints(cellI);
1390 <<
"cell:" << cellI <<
" cLevel:" << cLevel
1391 <<
" cell points:" << cPoints
1393 << UIndirectList<label>(pointLevel_, cPoints)()
1394 <<
" face:" << faceI
1397 << UIndirectList<label>(pointLevel_,
f)()
1398 <<
" faceAnchorLevel:" << faceAnchorLevel[faceI]
1399 <<
" faceMidPoint:" << faceMidPoint[faceI]
1400 <<
" faceMidPointI:" << faceMidPointI
1408 label edgeMid = findLevel
1417 edgeMidPointI =
f[edgeMid];
1420 newFaceI = storeMidPointInfo
1443 if (nFacesAdded == 12)
1451 if (nFacesAdded == 12)
1464 const label startFp,
1465 DynamicList<label>& faceVerts
1468 const face&
f = mesh_.faces()[faceI];
1469 const labelList& fEdges = mesh_.faceEdges(faceI);
1478 if (edgeMidPoint[fEdges[fp]] >= 0)
1480 faceVerts.append(edgeMidPoint[fEdges[fp]]);
1485 if (pointLevel_[
f[fp]] <= cLevel)
1491 else if (pointLevel_[
f[fp]] == cLevel+1)
1498 else if (pointLevel_[
f[fp]] == cLevel+2)
1501 faceVerts.append(
f[fp]);
1513 const label startFp,
1514 DynamicList<label>& faceVerts
1517 const face&
f = mesh_.faces()[faceI];
1518 const labelList& fEdges = mesh_.faceEdges(faceI);
1520 label fp =
f.rcIndex(startFp);
1524 if (pointLevel_[
f[fp]] <= cLevel)
1529 else if (pointLevel_[
f[fp]] == cLevel+1)
1535 else if (pointLevel_[
f[fp]] == cLevel+2)
1545 if (edgeMidPoint[fEdges[fp]] >= 0)
1547 faceVerts.
append(edgeMidPoint[fEdges[fp]]);
1566 PackedBoolList& refineCell
1572 for (
label faceI = 0; faceI < mesh_.nInternalFaces(); faceI++)
1574 label own = mesh_.faceOwner()[faceI];
1575 label ownLevel = cellLevel_[own] + refineCell.get(own);
1577 label nei = mesh_.faceNeighbour()[faceI];
1578 label neiLevel = cellLevel_[nei] + refineCell.get(nei);
1580 if (ownLevel > (neiLevel+1))
1584 refineCell.set(nei);
1588 refineCell.unset(own);
1592 else if (neiLevel > (ownLevel+1))
1596 refineCell.set(own);
1600 refineCell.unset(nei);
1609 labelList neiLevel(mesh_.nFaces()-mesh_.nInternalFaces());
1613 label own = mesh_.faceOwner()[i+mesh_.nInternalFaces()];
1615 neiLevel[i] = cellLevel_[own] + refineCell.get(own);
1624 label own = mesh_.faceOwner()[i+mesh_.nInternalFaces()];
1625 label ownLevel = cellLevel_[own] + refineCell.get(own);
1627 if (ownLevel > (neiLevel[i]+1))
1631 refineCell.unset(own);
1635 else if (neiLevel[i] > (ownLevel+1))
1639 refineCell.set(own);
1655 PackedBoolList refineCell(mesh_.nCells());
1658 refineCell.set(cellsToRefine[i]);
1661 for (
label faceI = 0; faceI < mesh_.nInternalFaces(); faceI++)
1663 label own = mesh_.faceOwner()[faceI];
1664 label ownLevel = cellLevel_[own] + refineCell.get(own);
1666 label nei = mesh_.faceNeighbour()[faceI];
1667 label neiLevel = cellLevel_[nei] + refineCell.get(nei);
1669 if (
mag(ownLevel-neiLevel) > 1)
1675 <<
" current level:" << cellLevel_[own]
1676 <<
" level after refinement:" << ownLevel
1678 <<
"neighbour cell:" << nei
1679 <<
" current level:" << cellLevel_[nei]
1680 <<
" level after refinement:" << neiLevel
1682 <<
"which does not satisfy 2:1 constraints anymore."
1689 labelList neiLevel(mesh_.nFaces()-mesh_.nInternalFaces());
1693 label own = mesh_.faceOwner()[i+mesh_.nInternalFaces()];
1695 neiLevel[i] = cellLevel_[own] + refineCell.get(own);
1704 label faceI = i + mesh_.nInternalFaces();
1706 label own = mesh_.faceOwner()[faceI];
1707 label ownLevel = cellLevel_[own] + refineCell.get(own);
1709 if (
mag(ownLevel - neiLevel[i]) > 1)
1711 label patchI = mesh_.boundaryMesh().whichPatch(faceI);
1715 <<
"Celllevel does not satisfy 2:1 constraint."
1716 <<
" On coupled face "
1718 <<
" on patch " << patchI <<
" "
1719 << mesh_.boundaryMesh()[patchI].name()
1720 <<
" owner cell " << own
1721 <<
" current level:" << cellLevel_[own]
1722 <<
" level after refinement:" << ownLevel
1724 <<
" (coupled) neighbour cell will get refinement "
1737 Pout<<
"hexRef8::setInstance(const fileName& inst) : "
1738 <<
"Resetting file instance to " << inst <<
endl;
1741 cellLevel_.instance() = inst;
1742 pointLevel_.instance() = inst;
1743 level0Edge_.instance() = inst;
1744 history_.instance() = inst;
1752 DynamicList<label>&
points
1757 if (pointLevel_[
f[fp]] <= level)
1770 DynamicList<label>&
points
1775 label pointI = meshPoints[
f[fp]];
1776 if (pointLevel_[pointI] <= level)
1788 const label cellLevel,
1789 DynamicList<face>& quads
1792 const cell& cFaces = mesh_.cells()[cellI];
1795 DynamicList<label> verts(4);
1803 label faceI = cFaces[i];
1804 const face&
f = mesh_.faces()[faceI];
1807 collectLevelPoints(
f, cellLevel, verts);
1808 if (verts.size() == 4)
1810 if (mesh_.faceOwner()[faceI] != cellI)
1814 quads.append(face(0));
1821 if (quads.size() < 6)
1823 Map<labelList> pointFaces(2*cFaces.size());
1827 label faceI = cFaces[i];
1828 const face&
f = mesh_.faces()[faceI];
1836 collectLevelPoints(
f, cellLevel, verts);
1837 if (verts.size() == 1)
1844 if (pointLevel_[pointI] == cellLevel+1)
1847 pointFaces.find(pointI);
1848 if (iter != pointFaces.end())
1881 const face&
f = mesh_.faces()[faceI];
1882 if (mesh_.faceOwner()[faceI] == cellI)
1884 fourFaces[pFaceI] =
f;
1888 fourFaces[pFaceI] =
f.reverseFace();
1894 SubList<face>(fourFaces, fourFaces.size()),
1899 if (edgeLoops.size() == 1)
1905 bigFace.meshPoints(),
1906 bigFace.edgeLoops()[0],
1911 if (verts.size() == 4)
1913 quads.append(face(0));
1922 return (quads.size() == 6);
1937 mesh_.facesInstance(),
1938 polyMesh::meshSubDir,
1940 IOobject::READ_IF_PRESENT,
1941 IOobject::AUTO_WRITE
1950 mesh_.facesInstance(),
1951 polyMesh::meshSubDir,
1953 IOobject::READ_IF_PRESENT,
1954 IOobject::AUTO_WRITE
1963 mesh_.facesInstance(),
1964 polyMesh::meshSubDir,
1966 IOobject::READ_IF_PRESENT,
1967 IOobject::AUTO_WRITE
1975 "refinementHistory",
1976 mesh_.facesInstance(),
1977 polyMesh::meshSubDir,
1980 IOobject::AUTO_WRITE
1982 (readHistory ? mesh_.nCells() : 0)
1984 faceRemover_(mesh_, GREAT),
1985 savedPointLevel_(0),
2006 <<
"History enabled but number of visible cells "
2009 <<
" is not equal to the number of cells in the mesh "
2021 <<
"Restarted from inconsistent cellLevel or pointLevel files."
2049 const polyMesh&
mesh,
2052 const refinementHistory& history,
2053 const scalar level0Edge
2062 mesh_.facesInstance(),
2063 polyMesh::meshSubDir,
2066 IOobject::AUTO_WRITE
2075 mesh_.facesInstance(),
2076 polyMesh::meshSubDir,
2079 IOobject::AUTO_WRITE
2088 mesh_.facesInstance(),
2089 polyMesh::meshSubDir,
2092 IOobject::AUTO_WRITE
2098 (level0Edge >= 0 ? level0Edge : getLevel0EdgeLength())
2105 "refinementHistory",
2106 mesh_.facesInstance(),
2107 polyMesh::meshSubDir,
2110 IOobject::AUTO_WRITE
2114 faceRemover_(mesh_, GREAT),
2115 savedPointLevel_(0),
2121 <<
"History enabled but number of visible cells in it "
2123 <<
" is not equal to the number of cells in the mesh "
2134 <<
"Incorrect cellLevel or pointLevel size." <<
endl
2158 const polyMesh&
mesh,
2161 const scalar level0Edge
2170 mesh_.facesInstance(),
2171 polyMesh::meshSubDir,
2174 IOobject::AUTO_WRITE
2183 mesh_.facesInstance(),
2184 polyMesh::meshSubDir,
2187 IOobject::AUTO_WRITE
2196 mesh_.facesInstance(),
2197 polyMesh::meshSubDir,
2200 IOobject::AUTO_WRITE
2206 (level0Edge >= 0 ? level0Edge : getLevel0EdgeLength())
2213 "refinementHistory",
2214 mesh_.facesInstance(),
2215 polyMesh::meshSubDir,
2218 IOobject::AUTO_WRITE
2220 List<refinementHistory::splitCell8>(0),
2224 faceRemover_(mesh_, GREAT),
2225 savedPointLevel_(0),
2235 <<
"Incorrect cellLevel or pointLevel size." <<
endl
2269 PackedBoolList refineCell(mesh_.nCells());
2272 refineCell.set(cellsToRefine[i]);
2277 label nChanged = faceConsistentRefinement(maxSet, refineCell);
2279 reduce(nChanged, sumOp<label>());
2283 Pout<<
"hexRef8::consistentRefinement : Changed " << nChanged
2284 <<
" refinement levels due to 2:1 conflicts."
2298 forAll(refineCell, cellI)
2300 if (refineCell.get(cellI))
2309 forAll(refineCell, cellI)
2311 if (refineCell.get(cellI))
2313 newCellsToRefine[nRefined++] = cellI;
2319 checkWantedRefinementLevels(newCellsToRefine);
2322 return newCellsToRefine;
2334 const label maxFaceDiff,
2337 const label maxPointDiff,
2341 const labelList& faceOwner = mesh_.faceOwner();
2342 const labelList& faceNeighbour = mesh_.faceNeighbour();
2345 if (maxFaceDiff <= 0)
2348 <<
"Illegal maxFaceDiff " << maxFaceDiff <<
nl
2367 forAll(allCellInfo, cellI)
2371 allCellInfo[cellI] = refinementData
2373 maxFaceDiff*(cellLevel_[cellI]+1),
2374 maxFaceDiff*cellLevel_[cellI]
2381 label cellI = cellsToRefine[i];
2383 allCellInfo[cellI].count() = allCellInfo[cellI].refinementCount();
2388 DynamicList<label> seedFaces(mesh_.nFaces()/100);
2390 DynamicList<refinementData> seedFacesInfo(mesh_.nFaces()/100);
2393 int dummyTrackData = 0;
2401 label faceI = facesToCheck[i];
2403 if (allFaceInfo[faceI].valid(dummyTrackData))
2407 <<
"Argument facesToCheck seems to have duplicate entries!"
2409 <<
"face:" << faceI <<
" occurs at positions "
2415 const refinementData& ownData = allCellInfo[faceOwner[faceI]];
2417 if (mesh_.isInternalFace(faceI))
2422 const refinementData& neiData = allCellInfo[faceNeighbour[faceI]];
2425 label faceRefineCount;
2426 if (neiData.count() > ownData.count())
2428 faceCount = neiData.count() + maxFaceDiff;
2429 faceRefineCount = faceCount + maxFaceDiff;
2433 faceCount = ownData.count() + maxFaceDiff;
2434 faceRefineCount = faceCount + maxFaceDiff;
2437 seedFaces.append(faceI);
2438 seedFacesInfo.append
2446 allFaceInfo[faceI] = seedFacesInfo.last();
2450 label faceCount = ownData.count() + maxFaceDiff;
2451 label faceRefineCount = faceCount + maxFaceDiff;
2453 seedFaces.append(faceI);
2454 seedFacesInfo.append
2462 allFaceInfo[faceI] = seedFacesInfo.last();
2470 forAll(faceNeighbour, faceI)
2473 if (!allFaceInfo[faceI].valid(dummyTrackData))
2475 label own = faceOwner[faceI];
2476 label nei = faceNeighbour[faceI];
2480 if (allCellInfo[own].count() > allCellInfo[nei].count())
2482 allFaceInfo[faceI].updateFace
2491 seedFaces.append(faceI);
2492 seedFacesInfo.append(allFaceInfo[faceI]);
2494 else if (allCellInfo[own].count() < allCellInfo[nei].count())
2496 allFaceInfo[faceI].updateFace
2505 seedFaces.append(faceI);
2506 seedFacesInfo.append(allFaceInfo[faceI]);
2514 for (
label faceI = mesh_.nInternalFaces(); faceI < mesh_.nFaces(); faceI++)
2517 if (!allFaceInfo[faceI].valid(dummyTrackData))
2519 label own = faceOwner[faceI];
2522 refinementData faceData;
2532 seedFaces.append(faceI);
2533 seedFacesInfo.append(faceData);
2539 FaceCellWave<refinementData, int> levelCalc
2551 Pout<<
"hexRef8::consistentSlowRefinement : Seeded "
2552 << seedFaces.size() <<
" faces between cells with different"
2553 <<
" refinement level." <<
endl;
2557 levelCalc.setFaceInfo(seedFaces.shrink(), seedFacesInfo.shrink());
2559 seedFacesInfo.clear();
2562 levelCalc.iterate(mesh_.globalData().nTotalFaces()+1);
2570 if (maxPointDiff == -1)
2578 labelList maxPointCount(mesh_.nPoints(), 0);
2580 forAll(maxPointCount, pointI)
2582 label& pLevel = maxPointCount[pointI];
2584 const labelList& pCells = mesh_.pointCells(pointI);
2588 pLevel =
max(pLevel, allCellInfo[pCells[i]].count());
2605 Map<refinementData> changedFacesInfo(pointsToCheck.size());
2609 label pointI = pointsToCheck[i];
2614 const labelList& pCells = mesh_.pointCells(pointI);
2618 label cellI = pCells[pCellI];
2620 refinementData& cellInfo = allCellInfo[cellI];
2624 !cellInfo.isRefined()
2626 maxPointCount[pointI]
2627 > cellInfo.count() + maxFaceDiff*maxPointDiff
2632 cellInfo.count() = cellInfo.refinementCount();
2635 const cell& cFaces = mesh_.cells()[cellI];
2639 label faceI = cFaces[cFaceI];
2641 refinementData faceData;
2652 if (faceData.count() > allFaceInfo[faceI].count())
2654 changedFacesInfo.insert(faceI, faceData);
2661 label nChanged = changedFacesInfo.size();
2662 reduce(nChanged, sumOp<label>());
2671 seedFaces.setCapacity(changedFacesInfo.size());
2672 seedFacesInfo.setCapacity(changedFacesInfo.size());
2676 seedFaces.append(iter.key());
2677 seedFacesInfo.append(iter());
2684 for (
label faceI = 0; faceI < mesh_.nInternalFaces(); faceI++)
2686 label own = mesh_.faceOwner()[faceI];
2689 + (allCellInfo[own].isRefined() ? 1 : 0);
2691 label nei = mesh_.faceNeighbour()[faceI];
2694 + (allCellInfo[nei].isRefined() ? 1 : 0);
2696 if (
mag(ownLevel-neiLevel) > 1)
2702 <<
" current level:" << cellLevel_[own]
2703 <<
" current refData:" << allCellInfo[own]
2704 <<
" level after refinement:" << ownLevel
2706 <<
"neighbour cell:" << nei
2707 <<
" current level:" << cellLevel_[nei]
2708 <<
" current refData:" << allCellInfo[nei]
2709 <<
" level after refinement:" << neiLevel
2711 <<
"which does not satisfy 2:1 constraints anymore." <<
nl
2712 <<
"face:" << faceI <<
" faceRefData:" << allFaceInfo[faceI]
2721 labelList neiLevel(mesh_.nFaces()-mesh_.nInternalFaces());
2722 labelList neiCount(mesh_.nFaces()-mesh_.nInternalFaces());
2723 labelList neiRefCount(mesh_.nFaces()-mesh_.nInternalFaces());
2727 label own = mesh_.faceOwner()[i+mesh_.nInternalFaces()];
2728 neiLevel[i] = cellLevel_[own];
2729 neiCount[i] = allCellInfo[own].count();
2730 neiRefCount[i] = allCellInfo[own].refinementCount();
2741 label faceI = i+mesh_.nInternalFaces();
2743 label own = mesh_.faceOwner()[faceI];
2746 + (allCellInfo[own].isRefined() ? 1 : 0);
2750 + ((neiCount[i] >= neiRefCount[i]) ? 1 : 0);
2752 if (
mag(ownLevel - nbrLevel) > 1)
2755 label patchI = mesh_.boundaryMesh().whichPatch(faceI);
2758 <<
"Celllevel does not satisfy 2:1 constraint."
2759 <<
" On coupled face "
2761 <<
" refData:" << allFaceInfo[faceI]
2762 <<
" on patch " << patchI <<
" "
2763 << mesh_.boundaryMesh()[patchI].name() <<
nl
2764 <<
"owner cell " << own
2765 <<
" current level:" << cellLevel_[own]
2766 <<
" current count:" << allCellInfo[own].count()
2767 <<
" current refCount:"
2768 << allCellInfo[own].refinementCount()
2769 <<
" level after refinement:" << ownLevel
2771 <<
"(coupled) neighbour cell"
2772 <<
" has current level:" << neiLevel[i]
2773 <<
" current count:" << neiCount[i]
2774 <<
" current refCount:" << neiRefCount[i]
2775 <<
" level after refinement:" << nbrLevel
2785 forAll(allCellInfo, cellI)
2787 if (allCellInfo[cellI].isRefined())
2797 forAll(allCellInfo, cellI)
2799 if (allCellInfo[cellI].isRefined())
2801 newCellsToRefine[nRefined++] = cellI;
2807 Pout<<
"hexRef8::consistentSlowRefinement : From "
2808 << cellsToRefine.size() <<
" to " << newCellsToRefine.size()
2809 <<
" cells to refine." <<
endl;
2812 return newCellsToRefine;
2818 const label maxFaceDiff,
2823 const labelList& faceOwner = mesh_.faceOwner();
2824 const labelList& faceNeighbour = mesh_.faceNeighbour();
2826 if (maxFaceDiff <= 0)
2829 <<
"Illegal maxFaceDiff " << maxFaceDiff <<
nl
2833 const scalar level0Size = 2*maxFaceDiff*level0EdgeLength();
2848 int dummyTrackData = 0;
2854 label cellI = cellsToRefine[i];
2856 allCellInfo[cellI] = refinementDistanceData
2859 mesh_.cellCentres()[cellI],
2864 forAll(allCellInfo, cellI)
2866 if (!allCellInfo[cellI].valid(dummyTrackData))
2868 allCellInfo[cellI] = refinementDistanceData
2871 mesh_.cellCentres()[cellI],
2879 DynamicList<label> seedFaces(mesh_.nFaces()/100);
2881 DynamicList<refinementDistanceData> seedFacesInfo(mesh_.nFaces()/100);
2887 label faceI = facesToCheck[i];
2889 if (allFaceInfo[faceI].valid(dummyTrackData))
2893 <<
"Argument facesToCheck seems to have duplicate entries!"
2895 <<
"face:" << faceI <<
" occurs at positions "
2900 label own = faceOwner[faceI];
2904 allCellInfo[own].valid(dummyTrackData)
2905 ? allCellInfo[own].originLevel()
2909 if (!mesh_.isInternalFace(faceI))
2913 const point& fc = mesh_.faceCentres()[faceI];
2915 refinementDistanceData neiData
2922 allFaceInfo[faceI].updateFace
2934 label nei = faceNeighbour[faceI];
2938 allCellInfo[nei].valid(dummyTrackData)
2939 ? allCellInfo[nei].originLevel()
2943 if (ownLevel == neiLevel)
2946 allFaceInfo[faceI].updateFace
2951 refinementDistanceData(level0Size, cc[nei], neiLevel+1),
2955 allFaceInfo[faceI].updateFace
2960 refinementDistanceData(level0Size, cc[own], ownLevel+1),
2968 allFaceInfo[faceI].updateFace
2973 refinementDistanceData(level0Size, cc[nei], neiLevel),
2977 allFaceInfo[faceI].updateFace
2982 refinementDistanceData(level0Size, cc[own], ownLevel),
2988 seedFaces.append(faceI);
2989 seedFacesInfo.append(allFaceInfo[faceI]);
2996 forAll(faceNeighbour, faceI)
2999 if (!allFaceInfo[faceI].valid(dummyTrackData))
3001 label own = faceOwner[faceI];
3005 allCellInfo[own].valid(dummyTrackData)
3006 ? allCellInfo[own].originLevel()
3010 label nei = faceNeighbour[faceI];
3014 allCellInfo[nei].valid(dummyTrackData)
3015 ? allCellInfo[nei].originLevel()
3019 if (ownLevel > neiLevel)
3022 seedFaces.append(faceI);
3023 allFaceInfo[faceI].updateFace
3028 refinementDistanceData(level0Size, cc[own], ownLevel),
3032 seedFacesInfo.append(allFaceInfo[faceI]);
3034 else if (neiLevel > ownLevel)
3036 seedFaces.append(faceI);
3037 allFaceInfo[faceI].updateFace
3042 refinementDistanceData(level0Size, cc[nei], neiLevel),
3046 seedFacesInfo.append(allFaceInfo[faceI]);
3052 seedFacesInfo.shrink();
3055 FaceCellWave<refinementDistanceData, int> levelCalc
3062 mesh_.globalData().nTotalCells()+1,
3103 label cellI = cellsToRefine[i];
3105 allCellInfo[cellI].originLevel() =
sizeof(
label)*8-2;
3106 allCellInfo[cellI].origin() = cc[cellI];
3112 PackedBoolList refineCell(mesh_.nCells());
3113 forAll(allCellInfo, cellI)
3115 label wanted = allCellInfo[cellI].wantedLevel(cc[cellI]);
3117 if (wanted > cellLevel_[cellI]+1)
3119 refineCell.set(cellI);
3122 faceConsistentRefinement(
true, refineCell);
3126 label nChanged = faceConsistentRefinement(
true, refineCell);
3128 reduce(nChanged, sumOp<label>());
3132 Pout<<
"hexRef8::consistentSlowRefinement2 : Changed " << nChanged
3133 <<
" refinement levels due to 2:1 conflicts."
3146 forAll(refineCell, cellI)
3149 if (refineCell[cellI])
3158 forAll(refineCell, cellI)
3161 if (refineCell[cellI])
3163 newCellsToRefine[nRefined++] = cellI;
3169 Pout<<
"hexRef8::consistentSlowRefinement2 : From "
3170 << cellsToRefine.size() <<
" to " << newCellsToRefine.size()
3171 <<
" cells to refine." <<
endl;
3176 cellSet cellsIn(mesh_,
"cellsToRefineIn", cellsToRefine);
3177 Pout<<
"hexRef8::consistentSlowRefinement2 : writing "
3178 << cellsIn.size() <<
" to cellSet "
3179 << cellsIn.objectPath() <<
endl;
3183 cellSet cellsOut(mesh_,
"cellsToRefineOut", newCellsToRefine);
3184 Pout<<
"hexRef8::consistentSlowRefinement2 : writing "
3185 << cellsOut.size() <<
" to cellSet "
3186 << cellsOut.objectPath() <<
endl;
3191 PackedBoolList refineCell(mesh_.nCells());
3192 forAll(newCellsToRefine, i)
3194 refineCell.set(newCellsToRefine[i]);
3196 const PackedBoolList savedRefineCell(refineCell);
3198 label nChanged = faceConsistentRefinement(
true, refineCell);
3203 mesh_,
"cellsToRefineOut2", newCellsToRefine.size()
3205 forAll(refineCell, cellI)
3207 if (refineCell.get(cellI))
3209 cellsOut2.insert(cellI);
3212 Pout<<
"hexRef8::consistentSlowRefinement2 : writing "
3213 << cellsOut2.size() <<
" to cellSet "
3214 << cellsOut2.objectPath() <<
endl;
3220 forAll(refineCell, cellI)
3222 if (refineCell.get(cellI) && !savedRefineCell.get(cellI))
3226 <<
"Cell:" << cellI <<
" cc:"
3227 << mesh_.cellCentres()[cellI]
3228 <<
" was not marked for refinement but does not obey"
3229 <<
" 2:1 constraints."
3236 return newCellsToRefine;
3244 polyTopoChange& meshMod
3249 Pout<<
"hexRef8::setRefinement :"
3250 <<
" Checking initial mesh just to make sure" <<
endl;
3259 savedPointLevel_.clear();
3260 savedCellLevel_.clear();
3264 DynamicList<label> newCellLevel(cellLevel_.size());
3265 forAll(cellLevel_, cellI)
3267 newCellLevel.append(cellLevel_[cellI]);
3269 DynamicList<label> newPointLevel(pointLevel_.size());
3270 forAll(pointLevel_, pointI)
3272 newPointLevel.append(pointLevel_[pointI]);
3278 Pout<<
"hexRef8::setRefinement :"
3279 <<
" Allocating " << cellLabels.size() <<
" cell midpoints."
3287 labelList cellMidPoint(mesh_.nCells(), -1);
3291 label cellI = cellLabels[i];
3293 label anchorPointI = mesh_.faces()[mesh_.cells()[cellI][0]][0];
3295 cellMidPoint[cellI] = meshMod.setAction
3299 mesh_.cellCentres()[cellI],
3306 newPointLevel(cellMidPoint[cellI]) = cellLevel_[cellI]+1;
3312 cellSet splitCells(mesh_,
"splitCells", cellLabels.size());
3314 forAll(cellMidPoint, cellI)
3316 if (cellMidPoint[cellI] >= 0)
3318 splitCells.insert(cellI);
3322 Pout<<
"hexRef8::setRefinement : Dumping " << splitCells.size()
3323 <<
" cells to split to cellSet " << splitCells.objectPath()
3336 Pout<<
"hexRef8::setRefinement :"
3337 <<
" Allocating edge midpoints."
3346 labelList edgeMidPoint(mesh_.nEdges(), -1);
3349 forAll(cellMidPoint, cellI)
3351 if (cellMidPoint[cellI] >= 0)
3353 const labelList& cEdges = mesh_.cellEdges(cellI);
3357 label edgeI = cEdges[i];
3359 const edge&
e = mesh_.edges()[edgeI];
3363 pointLevel_[
e[0]] <= cellLevel_[cellI]
3364 && pointLevel_[
e[1]] <= cellLevel_[cellI]
3367 edgeMidPoint[edgeI] = 12345;
3394 forAll(edgeMidPoint, edgeI)
3396 if (edgeMidPoint[edgeI] >= 0)
3399 edgeMids[edgeI] = mesh_.edges()[edgeI].centre(mesh_.points());
3407 point(-GREAT, -GREAT, -GREAT)
3412 forAll(edgeMidPoint, edgeI)
3414 if (edgeMidPoint[edgeI] >= 0)
3419 const edge&
e = mesh_.edges()[edgeI];
3421 edgeMidPoint[edgeI] = meshMod.setAction
3432 newPointLevel(edgeMidPoint[edgeI]) =
3445 OFstream str(mesh_.time().path()/
"edgeMidPoint.obj");
3447 forAll(edgeMidPoint, edgeI)
3449 if (edgeMidPoint[edgeI] >= 0)
3451 const edge&
e = mesh_.edges()[edgeI];
3457 Pout<<
"hexRef8::setRefinement :"
3458 <<
" Dumping edge centres to split to file " << str.
name() <<
endl;
3468 Pout<<
"hexRef8::setRefinement :"
3469 <<
" Allocating face midpoints."
3475 labelList faceAnchorLevel(mesh_.nFaces());
3477 for (
label faceI = 0; faceI < mesh_.nFaces(); faceI++)
3479 faceAnchorLevel[faceI] = faceLevel(faceI);
3484 labelList faceMidPoint(mesh_.nFaces(), -1);
3489 for (
label faceI = 0; faceI < mesh_.nInternalFaces(); faceI++)
3491 if (faceAnchorLevel[faceI] >= 0)
3493 label own = mesh_.faceOwner()[faceI];
3494 label ownLevel = cellLevel_[own];
3495 label newOwnLevel = ownLevel + (cellMidPoint[own] >= 0 ? 1 : 0);
3497 label nei = mesh_.faceNeighbour()[faceI];
3498 label neiLevel = cellLevel_[nei];
3499 label newNeiLevel = neiLevel + (cellMidPoint[nei] >= 0 ? 1 : 0);
3503 newOwnLevel > faceAnchorLevel[faceI]
3504 || newNeiLevel > faceAnchorLevel[faceI]
3507 faceMidPoint[faceI] = 12345;
3520 labelList newNeiLevel(mesh_.nFaces()-mesh_.nInternalFaces());
3524 label own = mesh_.faceOwner()[i+mesh_.nInternalFaces()];
3525 label ownLevel = cellLevel_[own];
3526 label newOwnLevel = ownLevel + (cellMidPoint[own] >= 0 ? 1 : 0);
3528 newNeiLevel[i] = newOwnLevel;
3538 label faceI = i+mesh_.nInternalFaces();
3540 if (faceAnchorLevel[faceI] >= 0)
3542 label own = mesh_.faceOwner()[faceI];
3543 label ownLevel = cellLevel_[own];
3544 label newOwnLevel = ownLevel + (cellMidPoint[own] >= 0 ? 1 : 0);
3548 newOwnLevel > faceAnchorLevel[faceI]
3549 || newNeiLevel[i] > faceAnchorLevel[faceI]
3552 faceMidPoint[faceI] = 12345;
3577 mesh_.nFaces()-mesh_.nInternalFaces(),
3578 point(-GREAT, -GREAT, -GREAT)
3583 label faceI = i+mesh_.nInternalFaces();
3585 if (faceMidPoint[faceI] >= 0)
3587 bFaceMids[i] = mesh_.faceCentres()[faceI];
3597 forAll(faceMidPoint, faceI)
3599 if (faceMidPoint[faceI] >= 0)
3604 const face&
f = mesh_.faces()[faceI];
3606 faceMidPoint[faceI] = meshMod.setAction
3611 faceI < mesh_.nInternalFaces()
3612 ? mesh_.faceCentres()[faceI]
3613 : bFaceMids[faceI-mesh_.nInternalFaces()]
3623 newPointLevel(faceMidPoint[faceI]) = faceAnchorLevel[faceI]+1;
3630 faceSet splitFaces(mesh_,
"splitFaces", cellLabels.size());
3632 forAll(faceMidPoint, faceI)
3634 if (faceMidPoint[faceI] >= 0)
3636 splitFaces.insert(faceI);
3640 Pout<<
"hexRef8::setRefinement : Dumping " << splitFaces.size()
3641 <<
" faces to split to faceSet " << splitFaces.objectPath() <<
endl;
3662 Pout<<
"hexRef8::setRefinement :"
3663 <<
" Finding cell anchorPoints (8 per cell)"
3674 labelList nAnchorPoints(mesh_.nCells(), 0);
3676 forAll(cellMidPoint, cellI)
3678 if (cellMidPoint[cellI] >= 0)
3680 cellAnchorPoints[cellI].setSize(8);
3684 forAll(pointLevel_, pointI)
3686 const labelList& pCells = mesh_.pointCells(pointI);
3690 label cellI = pCells[pCellI];
3694 cellMidPoint[cellI] >= 0
3695 && pointLevel_[pointI] <= cellLevel_[cellI]
3698 if (nAnchorPoints[cellI] == 8)
3703 <<
" of level " << cellLevel_[cellI]
3704 <<
" uses more than 8 points of equal or"
3705 <<
" lower level" <<
nl
3706 <<
"Points so far:" << cellAnchorPoints[cellI]
3710 cellAnchorPoints[cellI][nAnchorPoints[cellI]++] = pointI;
3715 forAll(cellMidPoint, cellI)
3717 if (cellMidPoint[cellI] >= 0)
3719 if (nAnchorPoints[cellI] != 8)
3723 const labelList& cPoints = mesh_.cellPoints(cellI);
3727 <<
" of level " << cellLevel_[cellI]
3728 <<
" does not seem to have 8 points of equal or"
3729 <<
" lower level" <<
endl
3730 <<
"cellPoints:" << cPoints <<
endl
3732 << UIndirectList<label>(pointLevel_, cPoints)() <<
endl
3745 Pout<<
"hexRef8::setRefinement :"
3746 <<
" Adding cells (1 per anchorPoint)"
3753 forAll(cellAnchorPoints, cellI)
3755 const labelList& cAnchors = cellAnchorPoints[cellI];
3757 if (cAnchors.size() == 8)
3759 labelList& cAdded = cellAddedCells[cellI];
3766 newCellLevel[cellI] = cellLevel_[cellI]+1;
3769 for (
label i = 1; i < 8; i++)
3771 cAdded[i] = meshMod.setAction
3779 mesh_.cellZones().whichZone(cellI)
3783 newCellLevel(cAdded[i]) = cellLevel_[cellI]+1;
3798 Pout<<
"hexRef8::setRefinement :"
3799 <<
" Marking faces to be handled"
3804 PackedBoolList affectedFace(mesh_.nFaces());
3807 forAll(cellMidPoint, cellI)
3809 if (cellMidPoint[cellI] >= 0)
3811 const cell& cFaces = mesh_.cells()[cellI];
3815 affectedFace.set(cFaces[i]);
3820 forAll(faceMidPoint, faceI)
3822 if (faceMidPoint[faceI] >= 0)
3824 affectedFace.set(faceI);
3828 forAll(edgeMidPoint, edgeI)
3830 if (edgeMidPoint[edgeI] >= 0)
3832 const labelList& eFaces = mesh_.edgeFaces(edgeI);
3836 affectedFace.set(eFaces[i]);
3848 Pout<<
"hexRef8::setRefinement : Splitting faces" <<
endl;
3851 forAll(faceMidPoint, faceI)
3853 if (faceMidPoint[faceI] >= 0 && affectedFace.get(faceI))
3859 const face&
f = mesh_.faces()[faceI];
3863 bool modifiedFace =
false;
3865 label anchorLevel = faceAnchorLevel[faceI];
3873 if (pointLevel_[pointI] <= anchorLevel)
3877 DynamicList<label> faceVerts(4);
3879 faceVerts.append(pointI);
3895 faceVerts.append(faceMidPoint[faceI]);
3907 newFace.transfer(faceVerts);
3928 if (mesh_.isInternalFace(faceI))
3930 label oldOwn = mesh_.faceOwner()[faceI];
3931 label oldNei = mesh_.faceNeighbour()[faceI];
3933 checkInternalOrientation
3938 mesh_.cellCentres()[oldOwn],
3939 mesh_.cellCentres()[oldNei],
3945 label oldOwn = mesh_.faceOwner()[faceI];
3947 checkBoundaryOrientation
3952 mesh_.cellCentres()[oldOwn],
3953 mesh_.faceCentres()[faceI],
3962 modifiedFace =
true;
3964 modFace(meshMod, faceI, newFace, own, nei);
3968 addFace(meshMod, faceI, newFace, own, nei);
3974 affectedFace.unset(faceI);
3984 Pout<<
"hexRef8::setRefinement :"
3985 <<
" Adding edge splits to unsplit faces"
3989 DynamicList<label> eFacesStorage;
3990 DynamicList<label> fEdgesStorage;
3992 forAll(edgeMidPoint, edgeI)
3994 if (edgeMidPoint[edgeI] >= 0)
3998 const labelList& eFaces = mesh_.edgeFaces(edgeI, eFacesStorage);
4002 label faceI = eFaces[i];
4004 if (faceMidPoint[faceI] < 0 && affectedFace.get(faceI))
4008 const face&
f = mesh_.faces()[faceI];
4009 const labelList& fEdges = mesh_.faceEdges
4015 DynamicList<label> newFaceVerts(
f.
size());
4019 newFaceVerts.append(
f[fp]);
4021 label edgeI = fEdges[fp];
4023 if (edgeMidPoint[edgeI] >= 0)
4025 newFaceVerts.append(edgeMidPoint[edgeI]);
4030 newFace.transfer(newFaceVerts);
4034 label anchorFp = findMinLevel(
f);
4051 if (mesh_.isInternalFace(faceI))
4053 label oldOwn = mesh_.faceOwner()[faceI];
4054 label oldNei = mesh_.faceNeighbour()[faceI];
4056 checkInternalOrientation
4061 mesh_.cellCentres()[oldOwn],
4062 mesh_.cellCentres()[oldNei],
4068 label oldOwn = mesh_.faceOwner()[faceI];
4070 checkBoundaryOrientation
4075 mesh_.cellCentres()[oldOwn],
4076 mesh_.faceCentres()[faceI],
4082 modFace(meshMod, faceI, newFace, own, nei);
4085 affectedFace.unset(faceI);
4097 Pout<<
"hexRef8::setRefinement :"
4098 <<
" Changing owner/neighbour for otherwise unaffected faces"
4102 forAll(affectedFace, faceI)
4104 if (affectedFace.get(faceI))
4106 const face&
f = mesh_.faces()[faceI];
4110 label anchorFp = findMinLevel(
f);
4124 modFace(meshMod, faceI,
f, own, nei);
4127 affectedFace.unset(faceI);
4142 Pout<<
"hexRef8::setRefinement :"
4143 <<
" Create new internal faces for split cells"
4147 forAll(cellMidPoint, cellI)
4149 if (cellMidPoint[cellI] >= 0)
4174 forAll(cellMidPoint, cellI)
4176 if (cellMidPoint[cellI] >= 0)
4178 minPointI =
min(minPointI, cellMidPoint[cellI]);
4179 maxPointI =
max(maxPointI, cellMidPoint[cellI]);
4182 forAll(faceMidPoint, faceI)
4184 if (faceMidPoint[faceI] >= 0)
4186 minPointI =
min(minPointI, faceMidPoint[faceI]);
4187 maxPointI =
max(maxPointI, faceMidPoint[faceI]);
4190 forAll(edgeMidPoint, edgeI)
4192 if (edgeMidPoint[edgeI] >= 0)
4194 minPointI =
min(minPointI, edgeMidPoint[edgeI]);
4195 maxPointI =
max(maxPointI, edgeMidPoint[edgeI]);
4199 if (minPointI !=
labelMax && minPointI != mesh_.nPoints())
4202 <<
"Added point labels not consecutive to existing mesh points."
4204 <<
"mesh_.nPoints():" << mesh_.nPoints()
4205 <<
" minPointI:" << minPointI
4206 <<
" maxPointI:" << maxPointI
4211 pointLevel_.transfer(newPointLevel);
4212 cellLevel_.transfer(newCellLevel);
4215 setInstance(mesh_.facesInstance());
4222 if (history_.active())
4226 Pout<<
"hexRef8::setRefinement :"
4227 <<
" Updating refinement history to " << cellLevel_.size()
4228 <<
" cells" <<
endl;
4232 history_.resize(cellLevel_.size());
4234 forAll(cellAddedCells, cellI)
4236 const labelList& addedCells = cellAddedCells[cellI];
4238 if (addedCells.size())
4241 history_.storeSplit(cellI, addedCells);
4252 label cellI = cellLabels[i];
4254 refinedCells[i].transfer(cellAddedCells[cellI]);
4257 return refinedCells;
4268 savedPointLevel_.resize(2*pointsToStore.size());
4271 label pointI = pointsToStore[i];
4272 savedPointLevel_.insert(pointI, pointLevel_[pointI]);
4275 savedCellLevel_.resize(2*cellsToStore.size());
4278 label cellI = cellsToStore[i];
4279 savedCellLevel_.insert(cellI, cellLevel_[cellI]);
4289 Map<label> dummyMap(0);
4291 updateMesh(map, dummyMap, dummyMap, dummyMap);
4300 const mapPolyMesh& map,
4301 const Map<label>& pointsToRestore,
4302 const Map<label>& facesToRestore,
4303 const Map<label>& cellsToRestore
4309 Pout<<
"hexRef8::updateMesh :"
4310 <<
" Updating various lists"
4315 const labelList& reverseCellMap = map.reverseCellMap();
4319 Pout<<
"hexRef8::updateMesh :"
4320 <<
" reverseCellMap:" << map.reverseCellMap().size()
4321 <<
" cellMap:" << map.cellMap().size()
4322 <<
" nCells:" << mesh_.nCells()
4323 <<
" nOldCells:" << map.nOldCells()
4324 <<
" cellLevel_:" << cellLevel_.size()
4325 <<
" reversePointMap:" << map.reversePointMap().size()
4326 <<
" pointMap:" << map.pointMap().size()
4327 <<
" nPoints:" << mesh_.nPoints()
4328 <<
" nOldPoints:" << map.nOldPoints()
4329 <<
" pointLevel_:" << pointLevel_.size()
4333 if (reverseCellMap.size() == cellLevel_.size())
4339 reorder(reverseCellMap, mesh_.nCells(), -1, cellLevel_);
4344 const labelList& cellMap = map.cellMap();
4347 forAll(cellMap, newCellI)
4349 label oldCellI = cellMap[newCellI];
4353 newCellLevel[newCellI] = -1;
4357 newCellLevel[newCellI] = cellLevel_[oldCellI];
4360 cellLevel_.transfer(newCellLevel);
4367 label newCellI = iter.key();
4368 label storedCellI = iter();
4372 if (fnd == savedCellLevel_.end())
4375 <<
"Problem : trying to restore old value for new cell "
4376 << newCellI <<
" but cannot find old cell " << storedCellI
4377 <<
" in map of stored values " << savedCellLevel_
4380 cellLevel_[newCellI] = fnd();
4399 const labelList& reversePointMap = map.reversePointMap();
4401 if (reversePointMap.size() == pointLevel_.size())
4404 reorder(reversePointMap, mesh_.nPoints(), -1, pointLevel_);
4409 const labelList& pointMap = map.pointMap();
4411 labelList newPointLevel(pointMap.size());
4413 forAll(pointMap, newPointI)
4415 label oldPointI = pointMap[newPointI];
4417 if (oldPointI == -1)
4426 newPointLevel[newPointI] = -1;
4430 newPointLevel[newPointI] = pointLevel_[oldPointI];
4433 pointLevel_.transfer(newPointLevel);
4440 label newPointI = iter.key();
4441 label storedPointI = iter();
4445 if (fnd == savedPointLevel_.end())
4448 <<
"Problem : trying to restore old value for new point "
4449 << newPointI <<
" but cannot find old point "
4451 <<
" in map of stored values " << savedPointLevel_
4454 pointLevel_[newPointI] = fnd();
4471 if (history_.active())
4473 history_.updateMesh(map);
4477 setInstance(mesh_.facesInstance());
4480 faceRemover_.updateMesh(map);
4483 cellShapesPtr_.clear();
4498 Pout<<
"hexRef8::subset :"
4499 <<
" Updating various lists"
4503 if (history_.active())
4506 <<
"Subsetting will not work in combination with unrefinement."
4508 <<
"Proceed at your own risk." <<
endl;
4516 forAll(cellMap, newCellI)
4518 newCellLevel[newCellI] = cellLevel_[cellMap[newCellI]];
4521 cellLevel_.transfer(newCellLevel);
4527 <<
"cellLevel_ contains illegal value -1 after mapping:"
4535 labelList newPointLevel(pointMap.size());
4537 forAll(pointMap, newPointI)
4539 newPointLevel[newPointI] = pointLevel_[pointMap[newPointI]];
4542 pointLevel_.transfer(newPointLevel);
4548 <<
"pointLevel_ contains illegal value -1 after mapping:"
4555 if (history_.active())
4557 history_.subset(pointMap,
faceMap, cellMap);
4561 setInstance(mesh_.facesInstance());
4567 cellShapesPtr_.clear();
4576 Pout<<
"hexRef8::distribute :"
4577 <<
" Updating various lists"
4582 map.distributeCellData(cellLevel_);
4584 map.distributePointData(pointLevel_);
4587 if (history_.active())
4589 history_.distribute(map);
4593 faceRemover_.distribute(map);
4596 cellShapesPtr_.clear();
4602 const scalar smallDim = 1
e-6 * mesh_.bounds().mag();
4606 Pout<<
"hexRef8::checkMesh : Using matching tolerance smallDim:"
4607 << smallDim <<
endl;
4617 labelList nei(mesh_.nFaces()-mesh_.nInternalFaces());
4620 nei[i] = mesh_.faceOwner()[i+mesh_.nInternalFaces()];
4626 const polyBoundaryMesh&
patches = mesh_.boundaryMesh();
4630 const polyPatch& pp =
patches[patchI];
4636 HashTable<label, labelPair, labelPair::Hash<> >
4637 cellToFace(2*pp.size());
4639 label faceI = pp.start();
4643 label own = mesh_.faceOwner()[faceI];
4644 label bFaceI = faceI-mesh_.nInternalFaces();
4646 if (!cellToFace.insert(
labelPair(own, nei[bFaceI]), faceI))
4650 <<
"Faces do not seem to be correct across coupled"
4651 <<
" boundaries" <<
endl
4652 <<
"Coupled face " << faceI
4653 <<
" between owner " << own
4654 <<
" on patch " << pp.
name()
4655 <<
" and coupled neighbour " << nei[bFaceI]
4656 <<
" has two faces connected to it:"
4658 << cellToFace[
labelPair(own, nei[bFaceI])]
4672 scalarField neiFaceAreas(mesh_.nFaces()-mesh_.nInternalFaces());
4675 neiFaceAreas[i] =
mag(mesh_.faceAreas()[i+mesh_.nInternalFaces()]);
4683 label faceI = i+mesh_.nInternalFaces();
4685 const scalar magArea =
mag(mesh_.faceAreas()[faceI]);
4687 if (
mag(magArea - neiFaceAreas[i]) > smallDim)
4689 const face&
f = mesh_.faces()[faceI];
4690 label patchI = mesh_.boundaryMesh().whichPatch(faceI);
4692 dumpCell(mesh_.faceOwner()[faceI]);
4695 <<
"Faces do not seem to be correct across coupled"
4696 <<
" boundaries" <<
endl
4697 <<
"Coupled face " << faceI
4698 <<
" on patch " << patchI
4699 <<
" " << mesh_.boundaryMesh()[patchI].
name()
4700 <<
" coords:" << UIndirectList<point>(mesh_.points(),
f)()
4701 <<
" has face area:" << magArea
4702 <<
" (coupled) neighbour face area differs:"
4704 <<
" to within tolerance " << smallDim
4714 labelList nVerts(mesh_.nFaces()-mesh_.nInternalFaces());
4718 nVerts[i] = mesh_.faces()[i+mesh_.nInternalFaces()].size();
4726 label faceI = i+mesh_.nInternalFaces();
4728 const face&
f = mesh_.faces()[faceI];
4730 if (
f.
size() != nVerts[i])
4732 dumpCell(mesh_.faceOwner()[faceI]);
4734 label patchI = mesh_.boundaryMesh().whichPatch(faceI);
4737 <<
"Faces do not seem to be correct across coupled"
4738 <<
" boundaries" <<
endl
4739 <<
"Coupled face " << faceI
4740 <<
" on patch " << patchI
4741 <<
" " << mesh_.boundaryMesh()[patchI].
name()
4742 <<
" coords:" << UIndirectList<point>(mesh_.points(),
f)()
4743 <<
" has size:" <<
f.
size()
4744 <<
" (coupled) neighbour face has size:"
4756 pointField anchorPoints(mesh_.nFaces()-mesh_.nInternalFaces());
4760 label faceI = i+mesh_.nInternalFaces();
4761 const point& fc = mesh_.faceCentres()[faceI];
4762 const face&
f = mesh_.faces()[faceI];
4763 const vector anchorVec(mesh_.points()[
f[0]] - fc);
4765 anchorPoints[i] = anchorVec;
4775 label faceI = i+mesh_.nInternalFaces();
4776 const point& fc = mesh_.faceCentres()[faceI];
4777 const face&
f = mesh_.faces()[faceI];
4778 const vector anchorVec(mesh_.points()[
f[0]] - fc);
4780 if (
mag(anchorVec - anchorPoints[i]) > smallDim)
4782 dumpCell(mesh_.faceOwner()[faceI]);
4784 label patchI = mesh_.boundaryMesh().whichPatch(faceI);
4787 <<
"Faces do not seem to be correct across coupled"
4788 <<
" boundaries" <<
endl
4789 <<
"Coupled face " << faceI
4790 <<
" on patch " << patchI
4791 <<
" " << mesh_.boundaryMesh()[patchI].
name()
4792 <<
" coords:" << UIndirectList<point>(mesh_.points(),
f)()
4793 <<
" has anchor vector:" << anchorVec
4794 <<
" (coupled) neighbour face anchor vector differs:"
4796 <<
" to within tolerance " << smallDim
4804 Pout<<
"hexRef8::checkMesh : Returning" <<
endl;
4811 const label maxPointDiff,
4817 Pout<<
"hexRef8::checkRefinementLevels :"
4818 <<
" Checking 2:1 refinement level" <<
endl;
4823 cellLevel_.size() != mesh_.nCells()
4824 || pointLevel_.size() != mesh_.nPoints()
4828 <<
"cellLevel size should be number of cells"
4829 <<
" and pointLevel size should be number of points."<<
nl
4830 <<
"cellLevel:" << cellLevel_.size()
4831 <<
" mesh.nCells():" << mesh_.nCells() <<
nl
4832 <<
"pointLevel:" << pointLevel_.size()
4833 <<
" mesh.nPoints():" << mesh_.nPoints()
4843 for (
label faceI = 0; faceI < mesh_.nInternalFaces(); faceI++)
4845 label own = mesh_.faceOwner()[faceI];
4846 label nei = mesh_.faceNeighbour()[faceI];
4848 if (
mag(cellLevel_[own] - cellLevel_[nei]) > 1)
4854 <<
"Celllevel does not satisfy 2:1 constraint." <<
nl
4855 <<
"On face " << faceI <<
" owner cell " << own
4856 <<
" has refinement " << cellLevel_[own]
4857 <<
" neighbour cell " << nei <<
" has refinement "
4864 labelList neiLevel(mesh_.nFaces()-mesh_.nInternalFaces());
4868 label own = mesh_.faceOwner()[i+mesh_.nInternalFaces()];
4870 neiLevel[i] = cellLevel_[own];
4878 label faceI = i+mesh_.nInternalFaces();
4880 label own = mesh_.faceOwner()[faceI];
4882 if (
mag(cellLevel_[own] - neiLevel[i]) > 1)
4886 label patchI = mesh_.boundaryMesh().whichPatch(faceI);
4889 <<
"Celllevel does not satisfy 2:1 constraint."
4890 <<
" On coupled face " << faceI
4891 <<
" on patch " << patchI <<
" "
4892 << mesh_.boundaryMesh()[patchI].name()
4893 <<
" owner cell " << own <<
" has refinement "
4895 <<
" (coupled) neighbour cell has refinement "
4918 forAll(syncPointLevel, pointI)
4920 if (pointLevel_[pointI] != syncPointLevel[pointI])
4923 <<
"PointLevel is not consistent across coupled patches."
4925 <<
"point:" << pointI <<
" coord:" << mesh_.points()[pointI]
4926 <<
" has level " << pointLevel_[pointI]
4927 <<
" whereas the coupled point has level "
4928 << syncPointLevel[pointI]
4936 if (maxPointDiff != -1)
4939 labelList maxPointLevel(mesh_.nPoints(), 0);
4941 forAll(maxPointLevel, pointI)
4943 const labelList& pCells = mesh_.pointCells(pointI);
4945 label& pLevel = maxPointLevel[pointI];
4949 pLevel =
max(pLevel, cellLevel_[pCells[i]]);
4965 label pointI = pointsToCheck[i];
4967 const labelList& pCells = mesh_.pointCells(pointI);
4971 label cellI = pCells[i];
4975 mag(cellLevel_[cellI]-maxPointLevel[pointI])
4982 <<
"Too big a difference between"
4983 <<
" point-connected cells." <<
nl
4985 <<
" cellLevel:" << cellLevel_[cellI]
4986 <<
" uses point:" << pointI
4987 <<
" coord:" << mesh_.points()[pointI]
4988 <<
" which is also used by a cell with level:"
4989 << maxPointLevel[pointI]
5064 if (cellShapesPtr_.empty())
5068 Pout<<
"hexRef8::cellShapes() : calculating splitHex cellShapes."
5069 <<
" cellLevel:" << cellLevel_.size()
5070 <<
" pointLevel:" << pointLevel_.size()
5077 label nSplitHex = 0;
5078 label nUnrecognised = 0;
5080 forAll(cellLevel_, cellI)
5082 if (meshShapes[cellI].model().index() == 0)
5084 label level = cellLevel_[cellI];
5087 DynamicList<face> quads;
5088 bool haveQuads = matchHexShape
5109 Pout<<
"hexRef8::cellShapes() :"
5110 <<
" nCells:" << mesh_.nCells() <<
" of which" <<
nl
5111 <<
" primitive:" << (mesh_.nCells()-nSplitHex-nUnrecognised)
5113 <<
" split-hex:" << nSplitHex <<
nl
5114 <<
" poly :" << nUnrecognised <<
nl
5118 return cellShapesPtr_();
5133 checkRefinementLevels(-1,
labelList(0));
5138 Pout<<
"hexRef8::getSplitPoints :"
5139 <<
" Calculating unrefineable points" <<
endl;
5143 if (!history_.active())
5146 <<
"Only call if constructed with history capability"
5154 labelList splitMaster(mesh_.nPoints(), -1);
5155 labelList splitMasterLevel(mesh_.nPoints(), 0);
5160 for (
label pointI = 0; pointI < mesh_.nPoints(); pointI++)
5162 const labelList& pCells = mesh_.pointCells(pointI);
5164 if (pCells.size() != 8)
5166 splitMaster[pointI] = -2;
5171 const labelList& visibleCells = history_.visibleCells();
5173 forAll(visibleCells, cellI)
5175 const labelList& cPoints = mesh_.cellPoints(cellI);
5177 if (visibleCells[cellI] != -1 && history_.parentIndex(cellI) >= 0)
5179 label parentIndex = history_.parentIndex(cellI);
5184 label pointI = cPoints[i];
5186 label masterCellI = splitMaster[pointI];
5188 if (masterCellI == -1)
5195 splitMaster[pointI] = parentIndex;
5196 splitMasterLevel[pointI] = cellLevel_[cellI] - 1;
5198 else if (masterCellI == -2)
5204 (masterCellI != parentIndex)
5205 || (splitMasterLevel[pointI] != cellLevel_[cellI] - 1)
5210 splitMaster[pointI] = -2;
5219 label pointI = cPoints[i];
5221 splitMaster[pointI] = -2;
5229 label faceI = mesh_.nInternalFaces();
5230 faceI < mesh_.nFaces();
5234 const face&
f = mesh_.faces()[faceI];
5238 splitMaster[
f[fp]] = -2;
5245 label nSplitPoints = 0;
5247 forAll(splitMaster, pointI)
5249 if (splitMaster[pointI] >= 0)
5258 forAll(splitMaster, pointI)
5260 if (splitMaster[pointI] >= 0)
5262 splitPoints[nSplitPoints++] = pointI;
5340 Pout<<
"hexRef8::consistentUnrefinement :"
5341 <<
" Determining 2:1 consistent unrefinement" <<
endl;
5347 <<
"maxSet not implemented yet."
5357 PackedBoolList unrefinePoint(mesh_.nPoints());
5359 forAll(pointsToUnrefine, i)
5361 label pointI = pointsToUnrefine[i];
5363 unrefinePoint.set(pointI);
5372 PackedBoolList unrefineCell(mesh_.nCells());
5374 forAll(unrefinePoint, pointI)
5376 if (unrefinePoint.get(pointI))
5378 const labelList& pCells = mesh_.pointCells(pointI);
5382 unrefineCell.set(pCells[j]);
5395 for (
label faceI = 0; faceI < mesh_.nInternalFaces(); faceI++)
5397 label own = mesh_.faceOwner()[faceI];
5398 label ownLevel = cellLevel_[own] - unrefineCell.get(own);
5400 label nei = mesh_.faceNeighbour()[faceI];
5401 label neiLevel = cellLevel_[nei] - unrefineCell.get(nei);
5403 if (ownLevel < (neiLevel-1))
5410 unrefineCell.set(nei);
5421 if (unrefineCell.get(own) == 0)
5427 unrefineCell.unset(own);
5431 else if (neiLevel < (ownLevel-1))
5435 unrefineCell.set(own);
5439 if (unrefineCell.get(nei) == 0)
5445 unrefineCell.unset(nei);
5453 labelList neiLevel(mesh_.nFaces()-mesh_.nInternalFaces());
5457 label own = mesh_.faceOwner()[i+mesh_.nInternalFaces()];
5459 neiLevel[i] = cellLevel_[own] - unrefineCell.get(own);
5467 label faceI = i+mesh_.nInternalFaces();
5468 label own = mesh_.faceOwner()[faceI];
5469 label ownLevel = cellLevel_[own] - unrefineCell.get(own);
5471 if (ownLevel < (neiLevel[i]-1))
5475 if (unrefineCell.get(own) == 0)
5481 unrefineCell.unset(own);
5485 else if (neiLevel[i] < (ownLevel-1))
5489 if (unrefineCell.get(own) == 1)
5495 unrefineCell.set(own);
5501 reduce(nChanged, sumOp<label>());
5505 Pout<<
"hexRef8::consistentUnrefinement :"
5506 <<
" Changed " << nChanged
5507 <<
" refinement levels due to 2:1 conflicts."
5521 forAll(unrefinePoint, pointI)
5523 if (unrefinePoint.get(pointI))
5525 const labelList& pCells = mesh_.pointCells(pointI);
5529 if (!unrefineCell.get(pCells[j]))
5531 unrefinePoint.unset(pointI);
5543 forAll(unrefinePoint, pointI)
5545 if (unrefinePoint.get(pointI))
5554 forAll(unrefinePoint, pointI)
5556 if (unrefinePoint.get(pointI))
5558 newPointsToUnrefine[nSet++] = pointI;
5562 return newPointsToUnrefine;
5569 polyTopoChange& meshMod
5572 if (!history_.active())
5575 <<
"Only call if constructed with history capability"
5581 Pout<<
"hexRef8::setUnrefinement :"
5582 <<
" Checking initial mesh just to make sure" <<
endl;
5586 forAll(cellLevel_, cellI)
5588 if (cellLevel_[cellI] < 0)
5591 <<
"Illegal cell level " << cellLevel_[cellI]
5592 <<
" for cell " << cellI
5599 pointSet pSet(mesh_,
"splitPoints", splitPointLabels);
5602 cellSet cSet(mesh_,
"splitPointCells", splitPointLabels.size());
5604 forAll(splitPointLabels, i)
5606 const labelList& pCells = mesh_.pointCells(splitPointLabels[i]);
5610 cSet.insert(pCells[j]);
5615 Pout<<
"hexRef8::setRefinement : Dumping " << pSet.size()
5617 << cSet.size() <<
" cells for unrefinement to" <<
nl
5618 <<
" pointSet " << pSet.objectPath() <<
nl
5619 <<
" cellSet " << cSet.objectPath()
5631 forAll(splitPointLabels, i)
5637 splitFaces.insert(
pFaces[j]);
5643 faceRemover_.compatibleRemoves
5651 if (facesToRemove.size() != splitFaces.size())
5654 <<
"Ininitial set of split points to unrefine does not"
5655 <<
" seem to be consistent or not mid points of refined cells"
5664 forAll(splitPointLabels, i)
5666 label pointI = splitPointLabels[i];
5670 const labelList& pCells = mesh_.pointCells(pointI);
5673 if (pCells.size() != 8)
5676 <<
"splitPoint " << pointI
5677 <<
" should have 8 cells using it. It has " << pCells
5690 label cellI = pCells[j];
5692 label region = cellRegion[cellI];
5697 <<
"Ininitial set of split points to unrefine does not"
5698 <<
" seem to be consistent or not mid points"
5699 <<
" of refined cells" <<
nl
5700 <<
"cell:" << cellI <<
" on splitPoint " << pointI
5701 <<
" has no region to be merged into"
5705 if (masterCellI != cellRegionMaster[region])
5708 <<
"cell:" << cellI <<
" on splitPoint:" << pointI
5709 <<
" in region " << region
5710 <<
" has master:" << cellRegionMaster[region]
5711 <<
" which is not the lowest numbered cell"
5712 <<
" among the pointCells:" << pCells
5721 faceRemover_.setRefinement
5732 forAll(splitPointLabels, i)
5734 label pointI = splitPointLabels[i];
5736 const labelList& pCells = mesh_.pointCells(pointI);
5742 cellLevel_[pCells[j]]--;
5745 history_.combineCells(masterCellI, pCells);
5749 setInstance(mesh_.facesInstance());
5760 && pointLevel_.write()
5761 && level0Edge_.write();
5763 if (history_.active())
5765 writeOk = writeOk && history_.write();