76 void Foam::snappyLayerDriver::dumpDisplacement
78 const fileName& prefix,
81 const List<extrudeMode>& extrudeStatus
84 OBJstream dispStr(prefix +
"_disp.obj");
85 Info<<
"Writing all displacements to " << dispStr.name() <<
endl;
87 forAll(patchDisp, patchPointi)
89 const point& pt = pp.localPoints()[patchPointi];
90 dispStr.write(
linePointRef(pt, pt + patchDisp[patchPointi]));
94 OBJstream illStr(prefix +
"_illegal.obj");
95 Info<<
"Writing invalid displacements to " << illStr.name() <<
endl;
97 forAll(patchDisp, patchPointi)
99 if (extrudeStatus[patchPointi] !=
EXTRUDE)
101 const point& pt = pp.localPoints()[patchPointi];
102 illStr.write(
linePointRef(pt, pt + patchDisp[patchPointi]));
114 tmp<scalarField> tfaceFld(
new scalarField(pp.size(), 0.0));
117 forAll(pp.localFaces(), facei)
119 const face&
f = pp.localFaces()[facei];
124 faceFld[facei] += pointFld[
f[fp]];
126 faceFld[facei] /=
f.
size();
135 void Foam::snappyLayerDriver::checkManifold
138 pointSet& nonManifoldPoints
142 fp.checkPointManifold(
false, &nonManifoldPoints);
149 const labelList& eFaces = edgeFaces[edgei];
151 if (eFaces.size() > 2)
153 const edge&
e = fp.edges()[edgei];
155 nonManifoldPoints.insert(fp.meshPoints()[
e[0]]);
156 nonManifoldPoints.insert(fp.meshPoints()[
e[1]]);
162 void Foam::snappyLayerDriver::checkMeshManifold()
const
164 const fvMesh& mesh = meshRefiner_.mesh();
166 Info<<
nl <<
"Checking mesh manifoldness ..." <<
endl;
169 labelList outsideFaces(mesh.nFaces() - mesh.nInternalFaces());
171 for (
label facei = mesh.nInternalFaces(); facei < mesh.nFaces(); facei++)
173 outsideFaces[facei - mesh.nInternalFaces()] = facei;
176 pointSet nonManifoldPoints
188 IndirectList<face>(mesh.faces(), outsideFaces),
198 Info<<
"Outside of mesh is multiply connected across edges or"
200 <<
"This is not a fatal error but might cause some unexpected"
201 <<
" behaviour." <<
nl
216 bool Foam::snappyLayerDriver::unmarkExtrusion
218 const label patchPointi,
221 List<extrudeMode>& extrudeStatus
224 if (extrudeStatus[patchPointi] == EXTRUDE)
226 extrudeStatus[patchPointi] = NOEXTRUDE;
227 patchNLayers[patchPointi] = 0;
228 patchDisp[patchPointi] =
Zero;
231 else if (extrudeStatus[patchPointi] == EXTRUDEREMOVE)
233 extrudeStatus[patchPointi] = NOEXTRUDE;
234 patchNLayers[patchPointi] = 0;
235 patchDisp[patchPointi] =
Zero;
246 bool Foam::snappyLayerDriver::unmarkExtrusion
248 const face& localFace,
251 List<extrudeMode>& extrudeStatus
254 bool unextruded =
false;
277 void Foam::snappyLayerDriver::handleNonManifolds
284 List<extrudeMode>& extrudeStatus
287 const fvMesh& mesh = meshRefiner_.mesh();
289 Info<<
nl <<
"Handling non-manifold points ..." <<
endl;
292 Info<<
nl <<
"Checking patch manifoldness ..." <<
endl;
294 pointSet nonManifoldPoints(mesh,
"nonManifoldPoints", pp.nPoints());
297 checkManifold(pp, nonManifoldPoints);
300 forAll(edgeGlobalFaces, edgei)
304 pp.edgeFaces()[edgei].size() == 1
305 && edgeGlobalFaces[edgei].size() > 2
311 const edge&
e = pp.edges()[edgei];
312 nonManifoldPoints.insert(pp.meshPoints()[
e[0]]);
313 nonManifoldPoints.insert(pp.meshPoints()[
e[1]]);
319 PackedBoolList isCoupledEdge(mesh.nEdges());
321 const labelList& cpEdges = mesh.globalData().coupledPatchMeshEdges();
324 isCoupledEdge[cpEdges[i]] =
true;
330 orEqOp<unsigned int>(),
334 forAll(edgeGlobalFaces, edgei)
336 label meshEdgeI = meshEdges[edgei];
340 pp.edgeFaces()[edgei].size() == 1
341 && edgeGlobalFaces[edgei].size() == 1
342 && isCoupledEdge[meshEdgeI]
346 const edge&
e = pp.edges()[edgei];
350 nonManifoldPoints.insert(pp.meshPoints()[
e[0]]);
351 nonManifoldPoints.insert(pp.meshPoints()[
e[1]]);
360 Info<<
"Outside of local patch is multiply connected across edges or"
361 <<
" points at " << nNonManif <<
" points." <<
endl;
365 const labelList& meshPoints = pp.meshPoints();
367 forAll(meshPoints, patchPointi)
369 if (nonManifoldPoints.found(meshPoints[patchPointi]))
382 Info<<
"Set displacement to zero for all " << nNonManif
383 <<
" non-manifold points" <<
endl;
388 void Foam::snappyLayerDriver::handleFeatureAngle
395 List<extrudeMode>& extrudeStatus
398 const fvMesh& mesh = meshRefiner_.mesh();
400 Info<<
nl <<
"Handling feature edges ..." <<
endl;
402 if (minCos < 1-small)
411 const labelList& eFaces = pp.edgeFaces()[edgei];
413 label meshEdgeI = meshEdges[edgei];
419 edgeNormal[meshEdgeI],
420 pp.faceNormals()[eFaces[i]]
433 autoPtr<OBJstream> str;
442 + meshRefiner_.name()
446 Info<<
"Writing feature edges to " << str().name() <<
endl;
455 const labelList& eFaces = pp.edgeFaces()[edgei];
457 label meshEdgeI = meshEdges[edgei];
459 const vector&
n = edgeNormal[meshEdgeI];
463 scalar
cos =
n & pp.faceNormals()[eFaces[0]];
467 const edge&
e = pp.edges()[edgei];
488 const point& p0 = pp.localPoints()[
e[0]];
489 const point& p1 = pp.localPoints()[
e[1]];
496 Info<<
"Set displacement to zero for points on "
498 <<
" feature edges" <<
endl;
507 void Foam::snappyLayerDriver::handleWarpedFaces
510 const scalar faceRatio,
511 const scalar edge0Len,
515 List<extrudeMode>& extrudeStatus
518 const fvMesh& mesh = meshRefiner_.mesh();
520 Info<<
nl <<
"Handling cells with warped patch faces ..." <<
nl;
524 label nWarpedFaces = 0;
528 const face&
f = pp[i];
532 label facei = pp.addressing()[i];
534 label ownLevel = cellLevel[mesh.faceOwner()[facei]];
535 scalar edgeLen = edge0Len/(1<<ownLevel);
538 const point& fc = mesh.faceCentres()[facei];
539 const vector& fn = pp.faceNormals()[i];
546 vProj[fp] = (
n & fn);
550 scalar minVal =
min(vProj);
551 scalar maxVal =
max(vProj);
553 if ((maxVal - minVal) > faceRatio * edgeLen)
572 Info<<
"Set displacement to zero on "
574 <<
" warped faces since layer would be > " << faceRatio
575 <<
" of the size of the bounding box." <<
endl;
682 void Foam::snappyLayerDriver::setNumLayers
689 List<extrudeMode>& extrudeStatus,
693 const fvMesh& mesh = meshRefiner_.mesh();
695 Info<<
nl <<
"Handling points with inconsistent layer specification ..."
707 const labelList& meshPoints = mesh.boundaryMesh()[
patchi].meshPoints();
711 forAll(meshPoints, patchPointi)
713 label ppPointi = pp.meshPointMap()[meshPoints[patchPointi]];
715 maxLayers[ppPointi] =
max(wantedLayers, maxLayers[ppPointi]);
716 minLayers[ppPointi] =
min(wantedLayers, minLayers[ppPointi]);
747 <<
"Patchpoint:" << i <<
" coord:" << pp.localPoints()[i]
748 <<
" maxLayers:" << maxLayers
749 <<
" minLayers:" << minLayers
752 else if (maxLayers[i] == minLayers[i])
755 patchNLayers[i] = maxLayers[i];
773 patchNLayers[i] = maxLayers[i];
780 forAll(pp.localFaces(), facei)
782 const face&
f = pp.localFaces()[facei];
788 nCells =
max(nCells, patchNLayers[
f[fp]]);
791 nAddedCells += nCells;
793 reduce(nAddedCells, sumOp<label>());
806 Foam::snappyLayerDriver::makeLayerDisplacementField
808 const pointMesh& pMesh,
813 const pointBoundaryMesh& pointPatches = pMesh.boundary();
818 slipPointPatchVectorField::typeName
820 wordList actualPatchTypes(patchFieldTypes.size());
830 if (numLayers[
patchi] == 0)
833 zeroFixedValuePointPatchVectorField::typeName;
835 else if (numLayers[
patchi] > 0)
837 patchFieldTypes[
patchi] = fixedValuePointPatchVectorField::typeName;
843 if (isA<processorPointPatch>(pointPatches[
patchi]))
845 patchFieldTypes[
patchi] = calculatedPointPatchVectorField::typeName;
847 else if (isA<cyclicPointPatch>(pointPatches[
patchi]))
849 patchFieldTypes[
patchi] = cyclicSlipPointPatchVectorField::typeName;
856 tmp<pointVectorField> tfld
871 void Foam::snappyLayerDriver::growNoExtrusion
876 List<extrudeMode>& extrudeStatus
879 Info<<
nl <<
"Growing non-extrusion points by one layer ..." <<
endl;
881 List<extrudeMode> grownExtrudeStatus(extrudeStatus);
883 const faceList& localFaces = pp.localFaces();
889 const face&
f = localFaces[facei];
891 bool hasSqueeze =
false;
894 if (extrudeStatus[
f[fp]] == NOEXTRUDE)
908 extrudeStatus[
f[fp]] == EXTRUDE
909 && grownExtrudeStatus[
f[fp]] != NOEXTRUDE
912 grownExtrudeStatus[
f[fp]] = NOEXTRUDE;
919 extrudeStatus.transfer(grownExtrudeStatus);
928 status[i] = extrudeStatus[i];
940 extrudeStatus[i] = extrudeMode(status[i]);
945 forAll(extrudeStatus, patchPointi)
947 if (extrudeStatus[patchPointi] == NOEXTRUDE)
949 patchDisp[patchPointi] =
Zero;
950 patchNLayers[patchPointi] = 0;
954 reduce(nGrown, sumOp<label>());
956 Info<<
"Set displacement to zero for an additional " << nGrown
957 <<
" points." <<
endl;
961 void Foam::snappyLayerDriver::determineSidePatches
963 const globalIndex& globalFaces,
976 fvMesh& mesh = meshRefiner_.mesh();
982 Map<label> nbrProcToPatch;
983 Map<label> patchToNbrProc;
997 label nOldPatches = mesh.boundaryMesh().size();
999 Info<<
nl <<
"Adding in total " << nAdded/2 <<
" inter-processor patches to"
1000 <<
" handle extrusion of non-manifold processor boundaries."
1007 Map<label> wantedToAddedPatch;
1012 const label procPatchi = mesh.boundaryMesh().size();
1013 const processorPolyPatch pp
1018 mesh.boundaryMesh(),
1030 wantedToAddedPatch.insert(
patchi, procPatchi);
1038 if (fnd != wantedToAddedPatch.end())
1040 sidePatchID[i] = fnd();
1046 const_cast<polyBoundaryMesh&
>(mesh.boundaryMesh()).topoChange();
1051 void Foam::snappyLayerDriver::calculateLayerThickness
1055 const layerParameters& layerParams,
1058 const scalar edge0Len,
1065 const fvMesh& mesh = meshRefiner_.mesh();
1066 const polyBoundaryMesh&
patches = mesh.boundaryMesh();
1073 scalarField firstLayerThickness(pp.nPoints(), great);
1074 scalarField finalLayerThickness(pp.nPoints(), great);
1078 minThickness.setSize(pp.nPoints());
1079 minThickness = great;
1087 forAll(meshPoints, patchPointi)
1089 label ppPointi = pp.meshPointMap()[meshPoints[patchPointi]];
1091 firstLayerThickness[ppPointi] =
min
1093 firstLayerThickness[ppPointi],
1094 layerParams.firstLayerThickness()[
patchi]
1096 finalLayerThickness[ppPointi] =
min
1098 finalLayerThickness[ppPointi],
1099 layerParams.finalLayerThickness()[
patchi]
1101 totalThickness[ppPointi] =
min
1103 totalThickness[ppPointi],
1104 layerParams.thickness()[
patchi]
1106 expRatio[ppPointi] =
min
1109 layerParams.expansionRatio()[
patchi]
1111 minThickness[ppPointi] =
min
1113 minThickness[ppPointi],
1114 layerParams.minThickness()[
patchi]
1123 firstLayerThickness,
1131 finalLayerThickness,
1169 if (layerParams.relativeSizes())
1173 min(layerParams.minThickness()) < 0
1174 ||
max(layerParams.minThickness()) > 2
1178 <<
"Thickness should be factor of local undistorted cell size."
1179 <<
" Valid values are [0..2]." <<
nl
1180 <<
" minThickness:" << layerParams.minThickness()
1192 label ownLevel = cellLevel[mesh.faceOwner()[pp.addressing()[i]]];
1194 const face&
f = pp.localFaces()[i];
1198 maxPointLevel[
f[fp]] =
max(maxPointLevel[
f[fp]], ownLevel);
1212 forAll(maxPointLevel, pointi)
1215 scalar edgeLen = edge0Len/(1<<maxPointLevel[pointi]);
1216 firstLayerThickness[pointi] *= edgeLen;
1217 finalLayerThickness[pointi] *= edgeLen;
1218 totalThickness[pointi] *= edgeLen;
1219 minThickness[pointi] *= edgeLen;
1228 forAll(firstLayerThickness, pointi)
1230 thickness[pointi] = layerParams.layerThickness
1232 patchNLayers[pointi],
1233 firstLayerThickness[pointi],
1234 finalLayerThickness[pointi],
1235 totalThickness[pointi],
1239 expansionRatio[pointi] = layerParams.layerExpansionRatio
1241 patchNLayers[pointi],
1242 firstLayerThickness[pointi],
1243 finalLayerThickness[pointi],
1244 totalThickness[pointi],
1254 const polyBoundaryMesh&
patches = mesh.boundaryMesh();
1256 int oldPrecision =
Info().precision();
1259 label maxPatchNameLen = 0;
1264 maxPatchNameLen =
max(maxPatchNameLen,
label(patchName.size()));
1268 <<
setf(ios_base::left) <<
setw(maxPatchNameLen) <<
"patch"
1269 <<
setw(0) <<
" faces layers avg thickness[m]" <<
nl
1270 <<
setf(ios_base::left) <<
setw(maxPatchNameLen) <<
" "
1271 <<
setw(0) <<
" near-wall overall" <<
nl
1272 <<
setf(ios_base::left) <<
setw(maxPatchNameLen) <<
"-----"
1273 <<
setw(0) <<
" ----- ------ --------- -------" <<
endl;
1284 scalar sumThickness = 0;
1285 scalar sumNearWallThickness = 0;
1286 label nMasterPoints = 0;
1288 forAll(meshPoints, patchPointi)
1290 label meshPointi = meshPoints[patchPointi];
1291 if (isMasterPoint[meshPointi])
1293 label ppPointi = pp.meshPointMap()[meshPointi];
1295 sumThickness += thickness[ppPointi];
1296 sumNearWallThickness += layerParams.firstLayerThickness
1298 patchNLayers[ppPointi],
1299 firstLayerThickness[ppPointi],
1300 finalLayerThickness[ppPointi],
1301 thickness[ppPointi],
1302 expansionRatio[ppPointi]
1311 scalar avgThickness = 0;
1312 scalar avgNearWallThickness = 0;
1319 avgNearWallThickness =
1328 <<
" " <<
setw(6) << layerParams.numLayers()[
patchi]
1329 <<
" " <<
setw(8) << avgNearWallThickness
1330 <<
" " <<
setw(8) << avgThickness
1339 void Foam::snappyLayerDriver::syncPatchDisplacement
1345 List<extrudeMode>& extrudeStatus
1348 const fvMesh& mesh = meshRefiner_.mesh();
1349 const labelList& meshPoints = pp.meshPoints();
1361 minMagSqrEqOp<vector>(),
1368 if (
mag(patchDisp[i]) < minThickness[i])
1386 labelList syncPatchNLayers(patchNLayers);
1399 forAll(syncPatchNLayers, i)
1401 if (syncPatchNLayers[i] != patchNLayers[i])
1430 forAll(syncPatchNLayers, i)
1432 if (syncPatchNLayers[i] != patchNLayers[i])
1463 void Foam::snappyLayerDriver::getPatchDisplacement
1470 List<extrudeMode>& extrudeStatus
1473 Info<<
nl <<
"Determining displacement for added points"
1474 <<
" according to pointNormal ..." <<
endl;
1476 const fvMesh& mesh = meshRefiner_.mesh();
1477 const vectorField& faceNormals = pp.faceNormals();
1479 const pointField& localPoints = pp.localPoints();
1491 patchDisp = thickness*pointNormals;
1494 label nNoVisNormal = 0;
1495 label nExtrudeRemove = 0;
1499 forAll(pointNormals, patchPointi)
1501 label meshPointi = pp.meshPoints()[patchPointi];
1503 if (extrudeStatus[patchPointi] == NOEXTRUDE)
1506 patchNLayers[patchPointi] = 0;
1507 patchDisp[patchPointi] =
Zero;
1512 const vector&
n = pointNormals[patchPointi];
1518 Pout<<
"No valid normal for point " << meshPointi
1519 <<
' ' << pp.points()[meshPointi]
1520 <<
"; setting displacement to "
1521 << patchDisp[patchPointi]
1525 extrudeStatus[patchPointi] = EXTRUDEREMOVE;
1532 forAll(extrudeStatus, patchPointi)
1534 if (extrudeStatus[patchPointi] == EXTRUDEREMOVE)
1539 const labelList& pEdges = pp.pointEdges()[patchPointi];
1543 label edgei = pEdges[i];
1545 label otherPointi = pp.edges()[edgei].otherVertex(patchPointi);
1547 if (extrudeStatus[otherPointi] != NOEXTRUDE)
1549 avg += localPoints[otherPointi] + patchDisp[otherPointi];
1558 Pout<<
"Displacement at illegal point "
1559 << localPoints[patchPointi]
1561 << (avg /
nPoints - localPoints[patchPointi])
1565 patchDisp[patchPointi] =
1567 - localPoints[patchPointi];
1580 <<
" points with point normal pointing through faces." <<
nl
1581 <<
"Reset displacement at "
1583 <<
" points to average of surrounding points." <<
endl;
1586 syncPatchDisplacement
1599 bool Foam::snappyLayerDriver::sameEdgeNeighbour
1602 const label myGlobalFacei,
1603 const label nbrGlobFacei,
1607 const labelList& eFaces = globalEdgeFaces[edgei];
1608 if (eFaces.size() == 2)
1610 return edge(myGlobalFacei, nbrGlobFacei) == edge(eFaces[0], eFaces[1]);
1619 void Foam::snappyLayerDriver::getVertexString
1625 const label myGlobFacei,
1626 const label nbrGlobFacei,
1630 const labelList& fEdges = pp.faceEdges()[facei];
1644 label prevFp = fEdges.rcIndex(startFp);
1664 label nextFp = fEdges.fcIndex(endFp);
1681 const face&
f = pp.localFaces()[facei];
1698 Foam::label Foam::snappyLayerDriver::truncateDisplacement
1700 const globalIndex& globalFaces,
1704 const faceSet& illegalPatchFaces,
1707 List<extrudeMode>& extrudeStatus
1710 const fvMesh& mesh = meshRefiner_.mesh();
1714 const Map<label>& meshPointMap = pp.meshPointMap();
1718 label facei = iter.key();
1720 if (mesh.isInternalFace(facei))
1723 <<
"Faceset " << illegalPatchFaces.name()
1724 <<
" contains internal face " << facei <<
nl
1728 const face&
f = mesh.faces()[facei];
1733 if (meshPointMap.found(
f[fp]))
1735 label patchPointi = meshPointMap[
f[fp]];
1737 if (extrudeStatus[patchPointi] != NOEXTRUDE)
1752 forAll(patchDisp, patchPointi)
1754 if (
mag(patchDisp[patchPointi]) < minThickness[patchPointi])
1770 else if (extrudeStatus[patchPointi] == NOEXTRUDE)
1773 patchDisp[patchPointi] =
Zero;
1774 patchNLayers[patchPointi] = 0;
1779 const faceList& localFaces = pp.localFaces();
1783 syncPatchDisplacement
1804 const face& localF = localFaces[i];
1809 extrudeMode prevMode = extrudeStatus[localF.prevLabel(0)];
1813 extrudeMode fpMode = extrudeStatus[localF[fp]];
1815 if (prevMode == NOEXTRUDE && fpMode != NOEXTRUDE)
1842 reduce(nPinched, sumOp<label>());
1844 Info<<
"truncateDisplacement : Unextruded " << nPinched
1845 <<
" faces due to non-consecutive vertices being extruded." <<
endl;
1868 label nButterFly = 0;
1870 DynamicList<label> stringedVerts;
1871 forAll(pp.edges(), edgei)
1873 const labelList& globFaces = edgeGlobalFaces[edgei];
1875 if (globFaces.size() == 2)
1877 label myFacei = pp.edgeFaces()[edgei][0];
1878 label myGlobalFacei = globalFaces.toGlobal
1880 pp.addressing()[myFacei]
1882 label nbrGlobalFacei =
1884 globFaces[0] != myGlobalFacei
1901 extrudeStatus[stringedVerts[0]] != NOEXTRUDE
1902 || extrudeStatus[stringedVerts.last()] != NOEXTRUDE
1907 for (
label i = 1; i < stringedVerts.size()-1; i++)
1911 extrudeStatus[stringedVerts[i]] == NOEXTRUDE
1943 reduce(nButterFly, sumOp<label>());
1945 Info<<
"truncateDisplacement : Unextruded " << nButterFly
1946 <<
" faces due to stringed edges with inconsistent extrusion."
1957 label nDiffering = 0;
2001 if (nPinched+nButterFly+nDiffering == 0)
2013 void Foam::snappyLayerDriver::setupLayerInfoTruncation
2017 const List<extrudeMode>& extrudeStatus,
2018 const label nBufferCellsNoExtrude,
2023 Info<<
nl <<
"Setting up information for layer truncation ..." <<
endl;
2025 const fvMesh& mesh = meshRefiner_.mesh();
2027 if (nBufferCellsNoExtrude < 0)
2029 Info<<
nl <<
"Performing no layer truncation."
2030 <<
" nBufferCellsNoExtrude set to less than 0 ..." <<
endl;
2033 forAll(pp.localFaces(), patchFacei)
2035 const face&
f = pp.localFaces()[patchFacei];
2039 if (patchNLayers[
f[fp]] > 0)
2041 nPatchFaceLayers[patchFacei] = patchNLayers[
f[fp]];
2046 nPatchPointLayers = patchNLayers;
2049 forAll(nPatchFaceLayers, patchFacei)
2051 if (nPatchFaceLayers[patchFacei] == -1)
2053 nPatchFaceLayers[patchFacei] = 0;
2062 forAll(pp.localFaces(), patchFacei)
2064 const face&
f = pp.localFaces()[patchFacei];
2069 bool noExtrude =
false;
2074 if (extrudeStatus[
f[fp]] == NOEXTRUDE)
2078 mLevel =
max(mLevel, patchNLayers[
f[fp]]);
2088 nPatchFaceLayers[patchFacei] = 1;
2089 maxLevel[patchFacei] = mLevel;
2093 maxLevel[patchFacei] = mLevel;
2108 for (
label ilevel = 1; ilevel < nLevels; ilevel++)
2114 nBuffer = nBufferCellsNoExtrude - 1;
2118 nBuffer = nBufferCellsNoExtrude;
2121 for (
label ibuffer = 0; ibuffer < nBuffer + 1; ibuffer++)
2123 labelList tempCounter(nPatchFaceLayers);
2125 boolList foundNeighbour(pp.nPoints(),
false);
2127 forAll(pp.meshPoints(), patchPointi)
2129 forAll(pointFaces[patchPointi], pointFacei)
2131 label facei = pointFaces[patchPointi][pointFacei];
2135 nPatchFaceLayers[facei] != -1
2136 && maxLevel[facei] > 0
2139 foundNeighbour[patchPointi] =
true;
2154 forAll(pp.meshPoints(), patchPointi)
2156 if (foundNeighbour[patchPointi])
2158 forAll(pointFaces[patchPointi], pointFacei)
2160 label facei = pointFaces[patchPointi][pointFacei];
2163 nPatchFaceLayers[facei] == -1
2164 && maxLevel[facei] > 0
2165 && ilevel < maxLevel[facei]
2168 tempCounter[facei] = ilevel;
2173 nPatchFaceLayers = tempCounter;
2177 forAll(pp.localFaces(), patchFacei)
2179 if (nPatchFaceLayers[patchFacei] == -1)
2181 nPatchFaceLayers[patchFacei] = maxLevel[patchFacei];
2185 forAll(pp.meshPoints(), patchPointi)
2187 if (extrudeStatus[patchPointi] != NOEXTRUDE)
2189 forAll(pointFaces[patchPointi], pointFacei)
2191 label face = pointFaces[patchPointi][pointFacei];
2192 nPatchPointLayers[patchPointi] =
max
2194 nPatchPointLayers[patchPointi],
2195 nPatchFaceLayers[face]
2201 nPatchPointLayers[patchPointi] = 0;
2217 bool Foam::snappyLayerDriver::cellsUseFace
2219 const polyMesh& mesh,
2226 const cell& cFaces = mesh.cells()[cellLabels[i]];
2230 if (faces.found(cFaces[cFacei]))
2243 Foam::label Foam::snappyLayerDriver::checkAndUnmark
2245 const addPatchCellLayer& addLayer,
2246 const dictionary& meshQualityDict,
2247 const bool additionalReporting,
2248 const List<labelPair>& baffles,
2250 const fvMesh& newMesh,
2254 List<extrudeMode>& extrudeStatus
2258 Info<<
nl <<
"Checking mesh with layer ..." <<
endl;
2259 faceSet wrongFaces(newMesh,
"wrongFaces", newMesh.nFaces()/1000);
2271 <<
" (concave, zero area or negative cell pyramid volume)"
2285 addLayer.layerFaces()
2293 const label nReportMax = 10;
2294 DynamicField<point> disabledFaceCentres(nReportMax);
2296 forAll(addedCells, oldPatchFacei)
2300 const labelList& fCells = addedCells[oldPatchFacei];
2302 if (cellsUseFace(newMesh, fCells, wrongFaces))
2309 pp.localFaces()[oldPatchFacei],
2316 if (additionalReporting && (nChanged < nReportMax))
2318 disabledFaceCentres.
append
2320 pp.faceCentres()[oldPatchFacei]
2332 if (additionalReporting)
2341 label nReportLocal = nChanged;
2342 if (nChangedTotal > nReportMax)
2357 Pout<<
"Checked mesh with layers. Disabled extrusion at " <<
endl;
2358 for (
label i=0; i < nReportLocal; i++)
2360 Pout<<
" " << disabledFaceCentres[i] <<
endl;
2366 if (nReportTotal < nChangedTotal)
2368 Info<<
"Suppressed disabled extrusion message for other "
2369 << nChangedTotal - nReportTotal <<
" faces." <<
endl;
2373 return nChangedTotal;
2377 Foam::label Foam::snappyLayerDriver::countExtrusion
2380 const List<extrudeMode>& extrudeStatus
2384 label nExtruded = 0;
2386 const faceList& localFaces = pp.localFaces();
2390 const face& localFace = localFaces[i];
2394 if (extrudeStatus[localFace[fp]] != NOEXTRUDE)
2408 void Foam::snappyLayerDriver::getLayerCellsFaces
2410 const polyMesh& mesh,
2411 const addPatchCellLayer& addLayer,
2418 cellNLayers.setSize(mesh.nCells());
2420 faceRealThickness.setSize(mesh.nFaces());
2421 faceRealThickness = 0;
2429 forAll(addedCells, oldPatchFacei)
2431 const labelList& added = addedCells[oldPatchFacei];
2433 const labelList& layer = layerFaces[oldPatchFacei];
2439 cellNLayers[added[i]] = layer.size()-1;
2444 forAll(layerFaces, oldPatchFacei)
2446 const labelList& layer = layerFaces[oldPatchFacei];
2447 const scalar realThickness = oldRealThickness[oldPatchFacei];
2453 for (
label i = 1; i < layer.size(); i++)
2455 faceRealThickness[layer[i]] = realThickness;
2462 void Foam::snappyLayerDriver::printLayerData
2471 const polyBoundaryMesh& pbm = mesh.boundaryMesh();
2473 int oldPrecision =
Info().precision();
2476 label maxPatchNameLen = 0;
2480 word patchName = pbm[
patchi].name();
2481 maxPatchNameLen =
max(maxPatchNameLen,
label(patchName.size()));
2485 <<
setf(ios_base::left) <<
setw(maxPatchNameLen) <<
"patch"
2486 <<
setw(0) <<
" faces layers overall thickness" <<
nl
2487 <<
setf(ios_base::left) <<
setw(maxPatchNameLen) <<
" "
2488 <<
setw(0) <<
" [m] [%]" <<
nl
2489 <<
setf(ios_base::left) <<
setw(maxPatchNameLen) <<
"-----"
2490 <<
setw(0) <<
" ----- ------ --- ---" <<
endl;
2496 const polyPatch& pp = pbm[
patchi];
2498 label sumSize = pp.size();
2501 const labelList& faceCells = pp.faceCells();
2502 label sumNLayers = 0;
2505 sumNLayers += cellNLayers[faceCells[i]];
2518 scalar sumRealThickness =
sum(patchReal);
2519 scalar sumFraction = 0;
2522 if (patchWanted[i] > vSmall)
2524 sumFraction += (patchReal[i]/patchWanted[i]);
2529 reduce(sumSize, sumOp<label>());
2530 reduce(sumNLayers, sumOp<label>());
2531 reduce(sumRealThickness, sumOp<scalar>());
2532 reduce(sumFraction, sumOp<scalar>());
2535 scalar avgLayers = 0;
2537 scalar avgFraction = 0;
2540 avgLayers = scalar(sumNLayers)/sumSize;
2541 avgReal = sumRealThickness/sumSize;
2542 avgFraction = sumFraction/sumSize;
2547 <<
" " <<
setw(8) << sumSize
2548 <<
" " <<
setw(8) << avgLayers
2549 <<
" " <<
setw(8) << avgReal
2550 <<
" " <<
setw(8) << 100*avgFraction
2557 bool Foam::snappyLayerDriver::writeLayerData
2572 forAll(cellNLayers, celli)
2574 if (cellNLayers[celli] > 0)
2579 cellSet addedCellSet(mesh,
"addedCells", nAdded);
2580 forAll(cellNLayers, celli)
2582 if (cellNLayers[celli] > 0)
2584 addedCellSet.insert(celli);
2587 addedCellSet.instance() = meshRefiner_.name();
2590 <<
" added cells to cellSet "
2591 << addedCellSet.name() <<
endl;
2592 bool ok = addedCellSet.
write();
2597 for (
label facei = 0; facei < mesh.nInternalFaces(); facei++)
2599 if (faceRealThickness[facei] > 0)
2605 faceSet layerFacesSet(mesh,
"layerFaces", nAdded);
2606 for (
label facei = 0; facei < mesh.nInternalFaces(); facei++)
2608 if (faceRealThickness[facei] > 0)
2610 layerFacesSet.insert(facei);
2613 layerFacesSet.instance() = meshRefiner_.name();
2616 <<
" faces inside added layer to faceSet "
2617 << layerFacesSet.name() <<
endl;
2618 bool ok = layerFacesSet.
write();
2641 fixedValueFvPatchScalarField::typeName
2643 const polyBoundaryMesh& pbm = mesh.boundaryMesh();
2646 fld.boundaryFieldRef();
2651 const polyPatch& pp = pbm[
patchi];
2652 const labelList& faceCells = pp.faceCells();
2656 pfld[i] = cellNLayers[faceCells[i]];
2662 bool ok =
fld.write();
2679 fixedValueFvPatchScalarField::typeName
2682 const polyBoundaryMesh& pbm = mesh.boundaryMesh();
2685 fld.boundaryFieldRef();
2697 bool ok =
fld.write();
2705 "thicknessFraction",
2714 fixedValueFvPatchScalarField::typeName
2717 const polyBoundaryMesh& pbm = mesh.boundaryMesh();
2720 fld.boundaryFieldRef();
2739 if (patchWanted[i] > vSmall)
2741 pfld[i] = patchReal[i]/patchWanted[i];
2748 <<
" : overall layer thickness (fraction"
2749 <<
" of desired thickness)" <<
endl;
2750 bool ok =
fld.write();
2763 faceWantedThickness,
2781 meshRefiner_(meshRefiner),
2782 globalToMasterPatch_(globalToMasterPatch),
2783 globalToSlavePatch_(globalToSlavePatch)
2802 <<
"Merging all faces of a cell" <<
nl
2803 <<
"---------------------------" <<
nl
2804 <<
" - which are on the same patch" <<
nl
2805 <<
" - which make an angle < " <<
radToDeg(planarAngle)
2808 <<
" (cos:" << minCos <<
')' <<
nl
2809 <<
" - as long as the resulting face doesn't become concave"
2812 <<
" (0=straight, 180=fully concave)" <<
nl
2823 duplicateFace[cpl[0]] = cpl[1];
2824 duplicateFace[cpl[1]] = cpl[0];
2841 meshRefiner_.mergePatchFacesUndo
2850 meshRefiner_.mergeEdgesUndo(minCos, motionDict);
2859 const label nAllowableErrors,
2869 meshRefiner_.createZoneBaffles
2871 globalToMasterPatch_,
2872 globalToSlavePatch_,
2879 Info<<
"Writing baffled mesh to time "
2880 << meshRefiner_.name() <<
endl;
2924 determineSidePatches
2945 label nIdealTotAddedCells = 0;
3005 const scalar edge0Len =
3006 meshRefiner_.meshCutter().level0EdgeLength();
3007 const labelList& cellLevel = meshRefiner_.meshCutter().cellLevel();
3036 for (
label i = 0; i < layerParams.
nGrow(); i++)
3050 const scalar edge0Len = meshRefiner_.meshCutter().level0EdgeLength();
3051 const labelList& cellLevel = meshRefiner_.meshCutter().cellLevel();
3061 meshRefiner_.name(),
3068 calculateLayerThickness
3095 avgPointData(pp, thickness);
3103 makeLayerDisplacementField
3116 combinedDict.
merge(motionDict);
3118 combinedDict.
add(
"minThicknessName", minThickness.
name());
3137 label iteration = 0;
3143 <<
"Layer addition iteration " << iteration <<
nl
3144 <<
"--------------------------" <<
endl;
3152 : motionDict.
subDict(
"relaxed")
3157 Info<<
"Switched to relaxed meshQuality constraints." <<
endl;
3163 syncPatchDisplacement
3173 getPatchDisplacement
3206 combinedDict.
merge(motionDict);
3208 combinedDict.
merge(meshQualityDict);
3210 combinedDict.
add(
"minThicknessName", minThickness.
name());
3213 medialAxisMoverPtr().move
3223 patchDisp = oldPatchPos - pp().localPoints();
3229 faceSet dummySet(mesh,
"wrongPatchFaces", 0);
3230 truncateDisplacement
3255 Info<<
"Writing shrunk mesh to time "
3256 << meshRefiner_.name() <<
endl;
3282 labelList nPatchFaceLayers(pp().size(), -1);
3283 setupLayerInfoTruncation
3297 forAll(nPatchPointLayers, i)
3301 nPatchPointLayers[i],
3304 finalDisp[i] = ratio*patchDisp[i];
3308 const scalarField invExpansionRatio(1.0/expansionRatio);
3334 savedMeshMod = meshMod;
3356 fvMesh& newMesh = newMeshPtr();
3378 newMeshBaffles[i][0] = map().reverseFaceMap()[
p[0]];
3379 newMeshBaffles[i][1] = map().reverseFaceMap()[
p[1]];
3387 avgPointData(pp,
mag(patchDisp))(),
3395 label nAddedCells = 0;
3396 forAll(cellNLayers, celli)
3398 if (cellNLayers[celli] > 0)
3407 Info<<
"Writing layer mesh to time " << meshRefiner_.name()
3411 cellSet addedCellSet(newMesh,
"addedCells", nAddedCells);
3412 forAll(cellNLayers, celli)
3414 if (cellNLayers[celli] > 0)
3416 addedCellSet.
insert(celli);
3422 <<
" added cells to cellSet " << addedCellSet.
name()
3424 addedCellSet.
write();
3434 if (faceRealThickness[facei] > 0)
3436 layerFacesSet.
insert(facei);
3442 <<
" faces inside added layer to faceSet "
3444 layerFacesSet.
write();
3448 label nTotChanged = checkAndUnmark
3462 label nTotExtruded = countExtrusion(pp, extrudeStatus);
3466 Info<<
"Extruding " << nTotExtruded
3467 <<
" out of " << nTotFaces
3468 <<
" faces (" << 100.0*nTotExtruded/nTotFaces <<
"%)."
3469 <<
" Removed extrusion at " << nTotChanged <<
" faces."
3471 <<
"Added " << nTotAddedCells <<
" out of "
3472 << nIdealTotAddedCells <<
" cells ("
3473 << 100.0*nTotAddedCells/nIdealTotAddedCells <<
"%)."
3476 if (nTotChanged == 0)
3486 for (
label i = 0; i < layerParams.
nGrow(); i++)
3514 meshRefiner_.topoChange(map,
labelList(0));
3523 p[0] = map().reverseFaceMap()[
p[0]];
3524 p[1] = map().reverseFaceMap()[
p[1]];
3532 Info<<
"Converting " << nBaffles
3533 <<
" baffles back into zoned faces ..."
3542 Info<<
"Converted baffles in = "
3543 << meshRefiner_.mesh().time().cpuTimeIncrement()
3554 <<
"Doing final balancing" <<
nl
3555 <<
"---------------------" <<
nl
3574 map().distributeCellData(cellNLayers);
3575 map().distributeFaceData(faceWantedThickness);
3576 map().distributeFaceData(faceRealThickness);
3588 faceWantedThickness,
3599 const bool preBalance,
3607 <<
"Shrinking and layer addition phase" <<
nl
3608 <<
"----------------------------------" <<
nl
3611 Info<<
"Using mesh parameters " << motionDict <<
nl <<
endl;
3614 mergePatchFacesUndo(layerParams, motionDict);
3621 label nFacesWithLayers = 0;
3624 if (numLayers[
patchi] > 0)
3636 <<
"Ignoring layers on coupled patch " << pp.
name()
3645 Info<<
nl <<
"No layers to generate ..." <<
endl;
3650 checkMeshManifold();
3653 Info<<
"Checking initial mesh ..." <<
endl;
3662 Info<<
"Detected " << nInitErrors <<
" illegal faces"
3663 <<
" (concave, zero area or negative cell pyramid volume)"
3671 <<
"Doing initial balancing" <<
nl
3672 <<
"-----------------------" <<
nl
3678 if (numLayers[
patchi] > 0)
Istream and Ostream manipulators taking arguments.
#define forAll(list, i)
Loop across all elements in list.
#define forAllConstIter(Container, container, iter)
Iterate across all elements in the container object of type.
static pointMesh & New(const word &name, const polyMesh &mesh)
Construct and return the named DemandDrivenMeshObject.
DynamicList< T, SizeInc, SizeMult, SizeDiv > & append(const T &)
Append an element at the end of the list.
DynamicList< T, SizeInc, SizeMult, SizeDiv > & shrink()
Shrink the allocated space to the number of elements used.
SubField< scalar > subField
Declare type of subField.
GeometricBoundaryField< Type, PatchField, GeoMesh > Boundary
Type of the boundary field.
static tmp< GeometricField< Type, pointPatchField, pointMesh > > New(const word &name, const Internal &, const PtrList< pointPatchField< Type >> &, const HashPtrTable< Source > &=HashPtrTable< Source >())
Return a temporary field constructed from name,.
bool insert(const Key &key)
Insert a new entry.
bool unset(const Key &key)
Unset the specified key - same as erase.
bool set(const Key &key)
Same as insert (cannot overwrite nil content)
label size() const
Return number of elements in table.
friend class const_iterator
Declare friendship with the const_iterator.
A primitive field of type <Type> with automated input and output.
IOobject defines the attributes of an object for which implicit objectRegistry management is supporte...
writeOption writeOpt() const
fileName & instance() const
Return the instance directory, constant, system, <time> etc.
const word & name() const
Return name.
void append(const T &)
Append an element at the end of the list.
void size(const label)
Override size to be inconsistent with allocated storage.
void clear()
Clear the list, i.e. set size to zero.
static const List< label > & null()
Return a null List.
virtual Ostream & write(const char)=0
Write character.
Class to control time during OpenFOAM simulations that is also the top-level objectRegistry.
fileName path() const
Explicitly inherit path from TimePaths to disambiguate from.
label fcIndex(const label i) const
Return the forward circular index, i.e. the next index.
static label nProcs(const label communicator=0)
Number of processes in parallel run.
static bool & parRun()
Is this a parallel run?
static int myProcNo(const label communicator=0)
Number of this process (starting from masterNo() = 0)
label size() const
Return the number of elements in the UPtrList.
static const Form rootMax
Adds layers of cells to outside of polyPatch. Can optionally create stand-alone extruded mesh (addToM...
static void calcSidePatch(const polyMesh &, const globalIndex &globalFaces, const labelListList &globalEdgeFaces, const indirectPrimitivePatch &pp, labelList &sidePatchID, label &nPatches, Map< label > &nbrProcToPatch, Map< label > &patchToNbrProc)
Boundary edges get extruded into boundary faces. Determine patch.
void setRefinement(const globalIndex &globalFaces, const labelListList &globalEdgeFaces, const scalarField &expansionRatio, const indirectPrimitivePatch &pp, const labelList &sidePatchID, const labelList &exposedPatchID, const labelList &nFaceLayers, const labelList &nPointLayers, const vectorField &firstLayerDisp, const labelList &faceCellZones, polyTopoChange &meshMod)
Play commands into polyTopoChange to create layers on top.
void topoChange(const polyTopoChangeMap &, const labelList &faceMap, const labelList &pointMap)
Update any locally stored mesh information. Gets additional.
labelListList addedCells() const
Added cells given current mesh & layerfaces.
static labelListList globalEdgeFaces(const polyMesh &, const globalIndex &globalFaces, const indirectPrimitivePatch &pp)
Per patch edge the pp faces (in global indices) using it. Uses.
An auto-pointer similar to the STL auto_ptr but with automatic casting to a reference to the type and...
A collection of cell labels.
Abstract base class for decomposition.
A list of keyword definitions, which are a keyword followed by any number of values (e....
const dictionary & subDict(const word &) const
Find and return a sub-dictionary.
bool add(entry *, bool mergeEntry=false)
Add a new entry.
bool merge(const dictionary &)
Merge entries from the given dictionary.
static autoPtr< externalDisplacementMeshMover > New(const word &type, const dictionary &dict, const List< labelPair > &baffles, pointVectorField &pointDisplacement)
Return a reference to the selected meshMover model.
word name() const
Return file name (part beyond last /)
Sends/receives parts of mesh+fvfields to neighbouring processors. Used in load balancing.
Mesh data needed to do the Finite Volume discretisation.
const Time & time() const
Return the top-level database.
virtual bool write(const bool write=true) const
Write mesh using IO settings from time.
const word & name() const
Return reference to name.
virtual void topoChange(const polyTopoChangeMap &map)
Update mesh corresponding to the given map.
const polyMesh & mesh() const
Return reference to polyMesh.
virtual void setPoints(const pointField &)
Reset the points.
static const word & calculatedType()
Return the type of the calculated for of fvPatchField.
Calculates a unique integer (label so might not have enough room - 2G max) for processor + local inde...
Simple container to keep together layer specific information.
scalar finalLayerThicknessRatio(const label nLayers, const scalar expansionRatio) const
Determine ratio of final layer thickness to.
const dictionary & dict() const
const labelList & numLayers() const
How many layers to add:
scalar featureAngle() const
label nRelaxedIter() const
Number of iterations after which relaxed motion rules.
const Switch & additionalReporting() const
scalar concaveAngle() const
label nGrow() const
If points get not extruded do nGrow layers of connected faces.
const List< mergeFace > & mergeFaces() const
Whether to merge boundary faces of the same layer cell.
label nBufferCellsNoExtrude() const
Create buffer region for new layer terminations.
bool relativeSizes() const
Are size parameters relative to inner cell size or.
scalar maxFaceThicknessRatio() const
Stop layer growth on highly warped cells.
label nLayerIter() const
Number of overall layer addition iterations.
const word & meshShrinker() const
Type of mesh shrinker.
static labelPairList findDuplicateFacePairs(const polyMesh &)
Helper routine to find all baffles (two boundary faces.
Helper class which maintains intersections of (changing) mesh with (static) surfaces.
static autoPtr< indirectPrimitivePatch > makePatch(const polyMesh &, const labelList &)
Create patch from set of patches.
static void updateList(const labelList &newToOld, const T &nullValue, List< T > &elems)
Helper: reorder list according to map.
static writeType writeLevel()
Get/set write level.
static void setDisplacement(const labelList &patchIDs, const indirectPrimitivePatch &pp, pointField &patchDisp, pointVectorField &displacement)
Set displacement field from displacement on patch points.
const word & name() const
Return name.
Mesh consisting of general polyhedral cells.
const polyBoundaryMesh & boundaryMesh() const
Return boundary mesh.
virtual const pointField & points() const
Return raw points.
void setInstance(const fileName &)
Set the instance for mesh files.
A patch is a list of labels that address the faces in the global face list.
virtual bool coupled() const
Return true if this patch is geometrically coupled (i.e. faces and.
const labelUList & faceCells() const
Return face-cell addressing.
Direct mesh changes based on v1.3 polyTopoChange syntax.
autoPtr< polyTopoChangeMap > makeMesh(autoPtr< fvMesh > &newMesh, const IOobject &io, const polyMesh &mesh, const bool syncParallel=true, const bool orderCells=false, const bool orderPoints=false)
Create new mesh with old mesh patches.
autoPtr< polyTopoChangeMap > changeMesh(polyMesh &mesh, const bool syncParallel=true, const bool orderCells=false, const bool orderPoints=false)
Inplace changes mesh without change of patches.
const labelListList & pointEdges() const
const edgeList & edges() const
Return mesh edges. Uses calcEdges.
label nInternalFaces() const
virtual bool write(const bool write=true) const
Write using setting from DB.
All to do with adding layers.
snappyLayerDriver(meshRefinement &meshRefiner, const labelList &globalToMasterPatch, const labelList &globalToSlavePatch)
Construct from components.
void doLayers(const dictionary &shrinkDict, const dictionary &motionDict, const layerParameters &layerParams, const bool preBalance, decompositionMethod &decomposer, fvMeshDistribute &distributor)
Add layers according to the dictionary settings.
void addLayers(const layerParameters &layerParams, const dictionary &motionDict, const labelList &patchIDs, const label nAllowableErrors, decompositionMethod &decomposer, fvMeshDistribute &distributor)
Add cell layers.
void mergePatchFacesUndo(const layerParameters &layerParams, const dictionary &motionDict)
Merge patch faces on same cell.
A class for managing temporary objects.
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
volVectorField vectorField(fieldObject, mesh)
gmvFile<< "tracers "<< particles.size()<< nl;{ pointField positions(particles.size());label particlei=0;forAllConstIter(Cloud< passiveParticle >, particles, iter) { positions[particlei++]=iter().position(mesh);} for(i=0;i< pTraits< point >::nComponents;i++) { forAll(positions, particlei) { gmvFile<< component(positions[particlei], i)<< ' ';} gmvFile<< nl;}}forAll(lagrangianScalarNames, i){ const word &name=lagrangianScalarNames[i];IOField< scalar > fld(IOobject(name, runTime.name(), cloud::prefix, mesh, IOobject::MUST_READ, IOobject::NO_WRITE))
const fvPatchList & patches
Functions for checking mesh topology and geometry.
#define WarningInFunction
Report a warning using Foam::Warning.
bool checkMesh(const bool report, const polyMesh &mesh, const dictionary &dict, const labelList &checkFaces, const List< labelPair > &baffles, labelHashSet &wrongFaces)
Check (subset of mesh including baffles) with mesh settings in dict.
errorManipArg< error, int > exit(error &err, const int errNo=1)
List< word > wordList
A List of words.
Smanip< ios_base::fmtflags > setf(const ios_base::fmtflags flags)
pointField vertices(const blockVertexList &bvl)
Omanip< int > setprecision(const int i)
scalar radToDeg(const scalar rad)
Convert radians to degrees.
Ostream & decrIndent(Ostream &os)
Decrement the indent level.
List< label > labelList
A List of labels.
intWM_LABEL_SIZE_t label
A label is an int32_t or int64_t as specified by the pre-processor macro WM_LABEL_SIZE.
Ostream & endl(Ostream &os)
Add newline and flush stream.
line< point, const point & > linePointRef
Line using referred points.
Omanip< int > setw(const int i)
dimensioned< Type > sum(const DimensionedField< Type, GeoMesh > &df)
errorManip< error > abort(error &err)
const dimensionSet dimless
const dimensionSet dimLength
vectorField pointField
pointField is a vectorField.
Ostream & incrIndent(Ostream &os)
Increment the indent level.
List< bool > boolList
Bool container classes.
vector point
Point is a vector.
Field< scalar > scalarField
Specialisation of Field<T> for scalar.
layerAndWeight min(const layerAndWeight &a, const layerAndWeight &b)
Vector< scalar > vector
A scalar version of the templated Vector.
void reduce(const List< UPstream::commsStruct > &comms, T &Value, const BinaryOp &bop, const int tag, const label comm)
List< labelList > labelListList
A List of labelList.
T returnReduce(const T &Value, const BinaryOp &bop, const int tag=Pstream::msgType(), const label comm=UPstream::worldComm)
VolField< scalar > volScalarField
dimensioned< scalar > mag(const dimensioned< Type > &)
defineTypeNameAndDebug(combustionModel, 0)
layerAndWeight max(const layerAndWeight &a, const layerAndWeight &b)
dimensioned< vector > dimensionedVector
Dimensioned vector obtained from generic dimensioned type.
Field< vector > vectorField
Specialisation of Field<T> for vector.
Pair< int > faceMap(const label facePi, const face &faceP, const label faceNi, const face &faceN)
prefixOSstream Pout(cout, "Pout")
HashSet< label, Hash< label > > labelHashSet
A HashSet with label keys.
label findIndex(const ListType &, typename ListType::const_reference, const label start=0)
Find first occurrence of given element and return index,.
static const label labelMax
labelList identityMap(const label len)
Create identity map (map[i] == i) of given length.
PrimitivePatch< IndirectList< face >, const pointField & > indirectPrimitivePatch
Foam::indirectPrimitivePatch.
Ostream & indent(Ostream &os)
Indent stream.
Type gMax(const FieldField< Field, Type > &f)
dimensionedScalar cos(const dimensionedScalar &ds)
static const label labelMin
dimensioned< scalar > dimensionedScalar
Dimensioned scalar obtained from generic dimensioned type.
void inplaceReorder(const labelUList &oldToNew, ListType &)
Inplace reorder the elements of a list.