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;
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]]);
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];
535 scalar edgeLen = edge0Len/(1<<ownLevel);
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 ..."
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,
982 Map<label> nbrProcToPatch;
983 Map<label> patchToNbrProc;
999 Info<<
nl <<
"Adding in total " << nAdded/2 <<
" inter-processor patches to"
1000 <<
" handle extrusion of non-manifold processor boundaries."
1007 Map<label> wantedToAddedPatch;
1013 const processorPolyPatch pp
1023 wantedToAddedPatch.insert(
patchi, procPatchi);
1031 if (fnd != wantedToAddedPatch.end())
1033 sidePatchID[i] = fnd();
1044 void Foam::snappyLayerDriver::calculateLayerThickness
1048 const layerParameters& layerParams,
1051 const scalar edge0Len,
1058 const fvMesh&
mesh = meshRefiner_.
mesh();
1066 scalarField firstLayerThickness(pp.nPoints(), great);
1067 scalarField finalLayerThickness(pp.nPoints(), great);
1071 minThickness.setSize(pp.nPoints());
1072 minThickness = great;
1080 forAll(meshPoints, patchPointi)
1082 label ppPointi = pp.meshPointMap()[meshPoints[patchPointi]];
1084 firstLayerThickness[ppPointi] =
min
1086 firstLayerThickness[ppPointi],
1087 layerParams.firstLayerThickness()[
patchi]
1089 finalLayerThickness[ppPointi] =
min
1091 finalLayerThickness[ppPointi],
1092 layerParams.finalLayerThickness()[
patchi]
1094 totalThickness[ppPointi] =
min
1096 totalThickness[ppPointi],
1097 layerParams.thickness()[
patchi]
1099 expRatio[ppPointi] =
min
1102 layerParams.expansionRatio()[
patchi]
1104 minThickness[ppPointi] =
min
1106 minThickness[ppPointi],
1107 layerParams.minThickness()[
patchi]
1116 firstLayerThickness,
1124 finalLayerThickness,
1162 if (layerParams.relativeSizes())
1166 min(layerParams.minThickness()) < 0
1167 ||
max(layerParams.minThickness()) > 2
1171 <<
"Thickness should be factor of local undistorted cell size."
1172 <<
" Valid values are [0..2]." <<
nl
1173 <<
" minThickness:" << layerParams.minThickness()
1187 const face&
f = pp.localFaces()[i];
1191 maxPointLevel[
f[fp]] =
max(maxPointLevel[
f[fp]], ownLevel);
1205 forAll(maxPointLevel, pointi)
1208 scalar edgeLen = edge0Len/(1<<maxPointLevel[pointi]);
1209 firstLayerThickness[pointi] *= edgeLen;
1210 finalLayerThickness[pointi] *= edgeLen;
1211 totalThickness[pointi] *= edgeLen;
1212 minThickness[pointi] *= edgeLen;
1221 forAll(firstLayerThickness, pointi)
1223 thickness[pointi] = layerParams.layerThickness
1225 patchNLayers[pointi],
1226 firstLayerThickness[pointi],
1227 finalLayerThickness[pointi],
1228 totalThickness[pointi],
1232 expansionRatio[pointi] = layerParams.layerExpansionRatio
1234 patchNLayers[pointi],
1235 firstLayerThickness[pointi],
1236 finalLayerThickness[pointi],
1237 totalThickness[pointi],
1249 int oldPrecision =
Info().precision();
1252 label maxPatchNameLen = 0;
1257 maxPatchNameLen =
max(maxPatchNameLen,
label(patchName.size()));
1261 <<
setf(ios_base::left) <<
setw(maxPatchNameLen) <<
"patch"
1262 <<
setw(0) <<
" faces layers avg thickness[m]" <<
nl
1263 <<
setf(ios_base::left) <<
setw(maxPatchNameLen) <<
" "
1264 <<
setw(0) <<
" near-wall overall" <<
nl
1265 <<
setf(ios_base::left) <<
setw(maxPatchNameLen) <<
"-----"
1266 <<
setw(0) <<
" ----- ------ --------- -------" <<
endl;
1277 scalar sumThickness = 0;
1278 scalar sumNearWallThickness = 0;
1279 label nMasterPoints = 0;
1281 forAll(meshPoints, patchPointi)
1283 label meshPointi = meshPoints[patchPointi];
1284 if (isMasterPoint[meshPointi])
1286 label ppPointi = pp.meshPointMap()[meshPointi];
1288 sumThickness += thickness[ppPointi];
1289 sumNearWallThickness += layerParams.firstLayerThickness
1291 patchNLayers[ppPointi],
1292 firstLayerThickness[ppPointi],
1293 finalLayerThickness[ppPointi],
1294 thickness[ppPointi],
1295 expansionRatio[ppPointi]
1304 scalar avgThickness = 0;
1305 scalar avgNearWallThickness = 0;
1312 avgNearWallThickness =
1321 <<
" " <<
setw(6) << layerParams.numLayers()[
patchi]
1322 <<
" " <<
setw(8) << avgNearWallThickness
1323 <<
" " <<
setw(8) << avgThickness
1332 void Foam::snappyLayerDriver::syncPatchDisplacement
1338 List<extrudeMode>& extrudeStatus
1341 const fvMesh&
mesh = meshRefiner_.
mesh();
1342 const labelList& meshPoints = pp.meshPoints();
1354 minMagSqrEqOp<vector>(),
1361 if (
mag(patchDisp[i]) < minThickness[i])
1379 labelList syncPatchNLayers(patchNLayers);
1392 forAll(syncPatchNLayers, i)
1394 if (syncPatchNLayers[i] != patchNLayers[i])
1423 forAll(syncPatchNLayers, i)
1425 if (syncPatchNLayers[i] != patchNLayers[i])
1456 void Foam::snappyLayerDriver::getPatchDisplacement
1463 List<extrudeMode>& extrudeStatus
1466 Info<<
nl <<
"Determining displacement for added points"
1467 <<
" according to pointNormal ..." <<
endl;
1469 const fvMesh&
mesh = meshRefiner_.
mesh();
1470 const vectorField& faceNormals = pp.faceNormals();
1472 const pointField& localPoints = pp.localPoints();
1484 patchDisp = thickness*pointNormals;
1487 label nNoVisNormal = 0;
1488 label nExtrudeRemove = 0;
1492 forAll(pointNormals, patchPointi)
1494 label meshPointi = pp.meshPoints()[patchPointi];
1496 if (extrudeStatus[patchPointi] == NOEXTRUDE)
1499 patchNLayers[patchPointi] = 0;
1500 patchDisp[patchPointi] =
Zero;
1505 const vector&
n = pointNormals[patchPointi];
1511 Pout<<
"No valid normal for point " << meshPointi
1512 <<
' ' << pp.points()[meshPointi]
1513 <<
"; setting displacement to "
1514 << patchDisp[patchPointi]
1518 extrudeStatus[patchPointi] = EXTRUDEREMOVE;
1525 forAll(extrudeStatus, patchPointi)
1527 if (extrudeStatus[patchPointi] == EXTRUDEREMOVE)
1532 const labelList& pEdges = pp.pointEdges()[patchPointi];
1536 label edgei = pEdges[i];
1538 label otherPointi = pp.edges()[edgei].otherVertex(patchPointi);
1540 if (extrudeStatus[otherPointi] != NOEXTRUDE)
1542 avg += localPoints[otherPointi] + patchDisp[otherPointi];
1551 Pout<<
"Displacement at illegal point "
1552 << localPoints[patchPointi]
1554 << (avg /
nPoints - localPoints[patchPointi])
1558 patchDisp[patchPointi] =
1560 - localPoints[patchPointi];
1573 <<
" points with point normal pointing through faces." <<
nl
1574 <<
"Reset displacement at "
1576 <<
" points to average of surrounding points." <<
endl;
1579 syncPatchDisplacement
1592 bool Foam::snappyLayerDriver::sameEdgeNeighbour
1595 const label myGlobalFacei,
1596 const label nbrGlobFacei,
1600 const labelList& eFaces = globalEdgeFaces[edgei];
1601 if (eFaces.size() == 2)
1603 return edge(myGlobalFacei, nbrGlobFacei) == edge(eFaces[0], eFaces[1]);
1612 void Foam::snappyLayerDriver::getVertexString
1618 const label myGlobFacei,
1619 const label nbrGlobFacei,
1623 const labelList& fEdges = pp.faceEdges()[facei];
1637 label prevFp = fEdges.rcIndex(startFp);
1657 label nextFp = fEdges.fcIndex(endFp);
1674 const face&
f = pp.localFaces()[facei];
1691 Foam::label Foam::snappyLayerDriver::truncateDisplacement
1693 const globalIndex& globalFaces,
1697 const faceSet& illegalPatchFaces,
1700 List<extrudeMode>& extrudeStatus
1703 const fvMesh&
mesh = meshRefiner_.
mesh();
1707 const Map<label>& meshPointMap = pp.meshPointMap();
1711 label facei = iter.key();
1716 <<
"Faceset " << illegalPatchFaces.name()
1717 <<
" contains internal face " << facei <<
nl
1726 if (meshPointMap.found(
f[fp]))
1728 label patchPointi = meshPointMap[
f[fp]];
1730 if (extrudeStatus[patchPointi] != NOEXTRUDE)
1745 forAll(patchDisp, patchPointi)
1747 if (
mag(patchDisp[patchPointi]) < minThickness[patchPointi])
1763 else if (extrudeStatus[patchPointi] == NOEXTRUDE)
1766 patchDisp[patchPointi] =
Zero;
1767 patchNLayers[patchPointi] = 0;
1772 const faceList& localFaces = pp.localFaces();
1776 syncPatchDisplacement
1797 const face& localF = localFaces[i];
1802 extrudeMode prevMode = extrudeStatus[localF.prevLabel(0)];
1806 extrudeMode fpMode = extrudeStatus[localF[fp]];
1808 if (prevMode == NOEXTRUDE && fpMode != NOEXTRUDE)
1835 reduce(nPinched, sumOp<label>());
1837 Info<<
"truncateDisplacement : Unextruded " << nPinched
1838 <<
" faces due to non-consecutive vertices being extruded." <<
endl;
1861 label nButterFly = 0;
1863 DynamicList<label> stringedVerts;
1864 forAll(pp.edges(), edgei)
1866 const labelList& globFaces = edgeGlobalFaces[edgei];
1868 if (globFaces.size() == 2)
1870 label myFacei = pp.edgeFaces()[edgei][0];
1871 label myGlobalFacei = globalFaces.toGlobal
1873 pp.addressing()[myFacei]
1875 label nbrGlobalFacei =
1877 globFaces[0] != myGlobalFacei
1894 extrudeStatus[stringedVerts[0]] != NOEXTRUDE
1895 || extrudeStatus[stringedVerts.last()] != NOEXTRUDE
1900 for (
label i = 1; i < stringedVerts.size()-1; i++)
1904 extrudeStatus[stringedVerts[i]] == NOEXTRUDE
1936 reduce(nButterFly, sumOp<label>());
1938 Info<<
"truncateDisplacement : Unextruded " << nButterFly
1939 <<
" faces due to stringed edges with inconsistent extrusion."
1950 label nDiffering = 0;
1994 if (nPinched+nButterFly+nDiffering == 0)
2006 void Foam::snappyLayerDriver::setupLayerInfoTruncation
2010 const List<extrudeMode>& extrudeStatus,
2011 const label nBufferCellsNoExtrude,
2016 Info<<
nl <<
"Setting up information for layer truncation ..." <<
endl;
2018 const fvMesh&
mesh = meshRefiner_.
mesh();
2020 if (nBufferCellsNoExtrude < 0)
2022 Info<<
nl <<
"Performing no layer truncation."
2023 <<
" nBufferCellsNoExtrude set to less than 0 ..." <<
endl;
2026 forAll(pp.localFaces(), patchFacei)
2028 const face&
f = pp.localFaces()[patchFacei];
2032 if (patchNLayers[
f[fp]] > 0)
2034 nPatchFaceLayers[patchFacei] = patchNLayers[
f[fp]];
2039 nPatchPointLayers = patchNLayers;
2042 forAll(nPatchFaceLayers, patchFacei)
2044 if (nPatchFaceLayers[patchFacei] == -1)
2046 nPatchFaceLayers[patchFacei] = 0;
2055 forAll(pp.localFaces(), patchFacei)
2057 const face&
f = pp.localFaces()[patchFacei];
2062 bool noExtrude =
false;
2067 if (extrudeStatus[
f[fp]] == NOEXTRUDE)
2071 mLevel =
max(mLevel, patchNLayers[
f[fp]]);
2081 nPatchFaceLayers[patchFacei] = 1;
2082 maxLevel[patchFacei] = mLevel;
2086 maxLevel[patchFacei] = mLevel;
2101 for (
label ilevel = 1; ilevel < nLevels; ilevel++)
2107 nBuffer = nBufferCellsNoExtrude - 1;
2111 nBuffer = nBufferCellsNoExtrude;
2114 for (
label ibuffer = 0; ibuffer < nBuffer + 1; ibuffer++)
2116 labelList tempCounter(nPatchFaceLayers);
2118 boolList foundNeighbour(pp.nPoints(),
false);
2120 forAll(pp.meshPoints(), patchPointi)
2122 forAll(pointFaces[patchPointi], pointFacei)
2124 label facei = pointFaces[patchPointi][pointFacei];
2128 nPatchFaceLayers[facei] != -1
2129 && maxLevel[facei] > 0
2132 foundNeighbour[patchPointi] =
true;
2147 forAll(pp.meshPoints(), patchPointi)
2149 if (foundNeighbour[patchPointi])
2151 forAll(pointFaces[patchPointi], pointFacei)
2153 label facei = pointFaces[patchPointi][pointFacei];
2156 nPatchFaceLayers[facei] == -1
2157 && maxLevel[facei] > 0
2158 && ilevel < maxLevel[facei]
2161 tempCounter[facei] = ilevel;
2166 nPatchFaceLayers = tempCounter;
2170 forAll(pp.localFaces(), patchFacei)
2172 if (nPatchFaceLayers[patchFacei] == -1)
2174 nPatchFaceLayers[patchFacei] = maxLevel[patchFacei];
2178 forAll(pp.meshPoints(), patchPointi)
2180 if (extrudeStatus[patchPointi] != NOEXTRUDE)
2182 forAll(pointFaces[patchPointi], pointFacei)
2184 label face = pointFaces[patchPointi][pointFacei];
2185 nPatchPointLayers[patchPointi] =
max
2187 nPatchPointLayers[patchPointi],
2188 nPatchFaceLayers[face]
2194 nPatchPointLayers[patchPointi] = 0;
2210 bool Foam::snappyLayerDriver::cellsUseFace
2212 const polyMesh&
mesh,
2223 if (faces.found(cFaces[cFacei]))
2236 Foam::label Foam::snappyLayerDriver::checkAndUnmark
2238 const addPatchCellLayer& addLayer,
2239 const dictionary& meshQualityDict,
2240 const bool additionalReporting,
2241 const List<labelPair>& baffles,
2243 const fvMesh& newMesh,
2247 List<extrudeMode>& extrudeStatus
2251 Info<<
nl <<
"Checking mesh with layer ..." <<
endl;
2252 faceSet wrongFaces(newMesh,
"wrongFaces", newMesh.nFaces()/1000);
2264 <<
" (concave, zero area or negative cell pyramid volume)"
2278 addLayer.layerFaces()
2286 const label nReportMax = 10;
2287 DynamicField<point> disabledFaceCentres(nReportMax);
2289 forAll(addedCells, oldPatchFacei)
2293 const labelList& fCells = addedCells[oldPatchFacei];
2295 if (cellsUseFace(newMesh, fCells, wrongFaces))
2302 pp.localFaces()[oldPatchFacei],
2309 if (additionalReporting && (nChanged < nReportMax))
2311 disabledFaceCentres.
append
2313 pp.faceCentres()[oldPatchFacei]
2325 if (additionalReporting)
2334 label nReportLocal = nChanged;
2335 if (nChangedTotal > nReportMax)
2350 Pout<<
"Checked mesh with layers. Disabled extrusion at " <<
endl;
2351 for (
label i=0; i < nReportLocal; i++)
2353 Pout<<
" " << disabledFaceCentres[i] <<
endl;
2359 if (nReportTotal < nChangedTotal)
2361 Info<<
"Suppressed disabled extrusion message for other "
2362 << nChangedTotal - nReportTotal <<
" faces." <<
endl;
2366 return nChangedTotal;
2370 Foam::label Foam::snappyLayerDriver::countExtrusion
2373 const List<extrudeMode>& extrudeStatus
2377 label nExtruded = 0;
2379 const faceList& localFaces = pp.localFaces();
2383 const face& localFace = localFaces[i];
2387 if (extrudeStatus[localFace[fp]] != NOEXTRUDE)
2401 void Foam::snappyLayerDriver::getLayerCellsFaces
2403 const polyMesh&
mesh,
2404 const addPatchCellLayer& addLayer,
2414 faceRealThickness = 0;
2422 forAll(addedCells, oldPatchFacei)
2424 const labelList& added = addedCells[oldPatchFacei];
2426 const labelList& layer = layerFaces[oldPatchFacei];
2432 cellNLayers[added[i]] = layer.size()-1;
2437 forAll(layerFaces, oldPatchFacei)
2439 const labelList& layer = layerFaces[oldPatchFacei];
2440 const scalar realThickness = oldRealThickness[oldPatchFacei];
2446 for (
label i = 1; i < layer.size(); i++)
2448 faceRealThickness[layer[i]] = realThickness;
2455 void Foam::snappyLayerDriver::printLayerData
2466 int oldPrecision =
Info().precision();
2469 label maxPatchNameLen = 0;
2473 word patchName = pbm[
patchi].name();
2474 maxPatchNameLen =
max(maxPatchNameLen,
label(patchName.size()));
2478 <<
setf(ios_base::left) <<
setw(maxPatchNameLen) <<
"patch"
2479 <<
setw(0) <<
" faces layers overall thickness" <<
nl
2480 <<
setf(ios_base::left) <<
setw(maxPatchNameLen) <<
" "
2481 <<
setw(0) <<
" [m] [%]" <<
nl
2482 <<
setf(ios_base::left) <<
setw(maxPatchNameLen) <<
"-----"
2483 <<
setw(0) <<
" ----- ------ --- ---" <<
endl;
2489 const polyPatch& pp = pbm[
patchi];
2491 label sumSize = pp.size();
2494 const labelList& faceCells = pp.faceCells();
2495 label sumNLayers = 0;
2498 sumNLayers += cellNLayers[faceCells[i]];
2511 scalar sumRealThickness =
sum(patchReal);
2512 scalar sumFraction = 0;
2515 if (patchWanted[i] > vSmall)
2517 sumFraction += (patchReal[i]/patchWanted[i]);
2522 reduce(sumSize, sumOp<label>());
2523 reduce(sumNLayers, sumOp<label>());
2524 reduce(sumRealThickness, sumOp<scalar>());
2525 reduce(sumFraction, sumOp<scalar>());
2528 scalar avgLayers = 0;
2530 scalar avgFraction = 0;
2533 avgLayers = scalar(sumNLayers)/sumSize;
2534 avgReal = sumRealThickness/sumSize;
2535 avgFraction = sumFraction/sumSize;
2540 <<
" " <<
setw(8) << sumSize
2541 <<
" " <<
setw(8) << avgLayers
2542 <<
" " <<
setw(8) << avgReal
2543 <<
" " <<
setw(8) << 100*avgFraction
2550 bool Foam::snappyLayerDriver::writeLayerData
2565 forAll(cellNLayers, celli)
2567 if (cellNLayers[celli] > 0)
2572 cellSet addedCellSet(
mesh,
"addedCells", nAdded);
2573 forAll(cellNLayers, celli)
2575 if (cellNLayers[celli] > 0)
2577 addedCellSet.insert(celli);
2580 addedCellSet.instance() = meshRefiner_.name();
2583 <<
" added cells to cellSet "
2584 << addedCellSet.name() <<
endl;
2585 bool ok = addedCellSet.
write();
2592 if (faceRealThickness[facei] > 0)
2598 faceSet layerFacesSet(
mesh,
"layerFaces", nAdded);
2601 if (faceRealThickness[facei] > 0)
2603 layerFacesSet.insert(facei);
2606 layerFacesSet.instance() = meshRefiner_.name();
2609 <<
" faces inside added layer to faceSet "
2610 << layerFacesSet.name() <<
endl;
2611 bool ok = layerFacesSet.
write();
2634 fixedValueFvPatchScalarField::typeName
2639 fld.boundaryFieldRef();
2644 const polyPatch& pp = pbm[
patchi];
2645 const labelList& faceCells = pp.faceCells();
2649 pfld[i] = cellNLayers[faceCells[i]];
2655 bool ok =
fld.write();
2672 fixedValueFvPatchScalarField::typeName
2678 fld.boundaryFieldRef();
2690 bool ok =
fld.write();
2698 "thicknessFraction",
2707 fixedValueFvPatchScalarField::typeName
2713 fld.boundaryFieldRef();
2732 if (patchWanted[i] > vSmall)
2734 pfld[i] = patchReal[i]/patchWanted[i];
2741 <<
" : overall layer thickness (fraction"
2742 <<
" of desired thickness)" <<
endl;
2743 bool ok =
fld.write();
2756 faceWantedThickness,
2774 meshRefiner_(meshRefiner),
2775 globalToMasterPatch_(globalToMasterPatch),
2776 globalToSlavePatch_(globalToSlavePatch)
2795 <<
"Merging all faces of a cell" <<
nl
2796 <<
"---------------------------" <<
nl
2797 <<
" - which are on the same patch" <<
nl
2798 <<
" - which make an angle < " <<
radToDeg(planarAngle)
2801 <<
" (cos:" << minCos <<
')' <<
nl
2802 <<
" - as long as the resulting face doesn't become concave"
2805 <<
" (0=straight, 180=fully concave)" <<
nl
2816 duplicateFace[cpl[0]] = cpl[1];
2817 duplicateFace[cpl[1]] = cpl[0];
2834 meshRefiner_.mergePatchFacesUndo
2843 meshRefiner_.mergeEdgesUndo(minCos, motionDict);
2852 const label nAllowableErrors,
2862 meshRefiner_.createZoneBaffles
2864 globalToMasterPatch_,
2865 globalToSlavePatch_,
2872 Info<<
"Writing baffled mesh to time "
2873 << meshRefiner_.name() <<
endl;
2917 determineSidePatches
2938 label nIdealTotAddedCells = 0;
2998 const scalar edge0Len =
2999 meshRefiner_.meshCutter().level0EdgeLength();
3000 const labelList& cellLevel = meshRefiner_.meshCutter().cellLevel();
3029 for (
label i = 0; i < layerParams.
nGrow(); i++)
3043 const scalar edge0Len = meshRefiner_.meshCutter().level0EdgeLength();
3044 const labelList& cellLevel = meshRefiner_.meshCutter().cellLevel();
3054 meshRefiner_.name(),
3061 calculateLayerThickness
3089 avgPointData(pp, thickness);
3097 makeLayerDisplacementField
3110 combinedDict.
merge(motionDict);
3112 combinedDict.
add(
"minThicknessName", minThickness.
name());
3131 label iteration = 0;
3137 <<
"Layer addition iteration " << iteration <<
nl
3138 <<
"--------------------------" <<
endl;
3146 : motionDict.
subDict(
"relaxed")
3151 Info<<
"Switched to relaxed meshQuality constraints." <<
endl;
3157 syncPatchDisplacement
3167 getPatchDisplacement
3200 combinedDict.
merge(motionDict);
3202 combinedDict.
merge(meshQualityDict);
3204 combinedDict.
add(
"minThicknessName", minThickness.
name());
3207 medialAxisMoverPtr().move
3217 patchDisp = oldPatchPos - pp().localPoints();
3224 truncateDisplacement
3249 Info<<
"Writing shrunk mesh to time "
3250 << meshRefiner_.name() <<
endl;
3276 labelList nPatchFaceLayers(pp().size(), -1);
3277 setupLayerInfoTruncation
3291 forAll(nPatchPointLayers, i)
3295 nPatchPointLayers[i],
3298 finalDisp[i] = ratio*patchDisp[i];
3302 const scalarField invExpansionRatio(1.0/expansionRatio);
3329 savedMeshMod = meshMod;
3330 savedAddLayer = addLayer;
3352 fvMesh& newMesh = newMeshPtr();
3374 newMeshBaffles[i][0] = map().reverseFaceMap()[
p[0]];
3375 newMeshBaffles[i][1] = map().reverseFaceMap()[
p[1]];
3383 avgPointData(pp,
mag(patchDisp))(),
3391 label nAddedCells = 0;
3392 forAll(cellNLayers, celli)
3394 if (cellNLayers[celli] > 0)
3403 Info<<
"Writing layer mesh to time " << meshRefiner_.name()
3407 cellSet addedCellSet(newMesh,
"addedCells", nAddedCells);
3408 forAll(cellNLayers, celli)
3410 if (cellNLayers[celli] > 0)
3412 addedCellSet.
insert(celli);
3418 <<
" added cells to cellSet " << addedCellSet.
name()
3420 addedCellSet.
write();
3430 if (faceRealThickness[facei] > 0)
3432 layerFacesSet.
insert(facei);
3438 <<
" faces inside added layer to faceSet "
3440 layerFacesSet.
write();
3444 label nTotChanged = checkAndUnmark
3458 label nTotExtruded = countExtrusion(pp, extrudeStatus);
3462 Info<<
"Extruding " << nTotExtruded
3463 <<
" out of " << nTotFaces
3464 <<
" faces (" << 100.0*nTotExtruded/nTotFaces <<
"%)."
3465 <<
" Removed extrusion at " << nTotChanged <<
" faces."
3467 <<
"Added " << nTotAddedCells <<
" out of "
3468 << nIdealTotAddedCells <<
" cells ("
3469 << 100.0*nTotAddedCells/nIdealTotAddedCells <<
"%)."
3472 if (nTotChanged == 0)
3482 for (
label i = 0; i < layerParams.
nGrow(); i++)
3513 meshRefiner_.topoChange(map,
labelList(0));
3522 p[0] = map().reverseFaceMap()[
p[0]];
3523 p[1] = map().reverseFaceMap()[
p[1]];
3531 Info<<
"Converting " << nBaffles
3532 <<
" baffles back into zoned faces ..."
3541 Info<<
"Converted baffles in = "
3542 << meshRefiner_.mesh().time().cpuTimeIncrement()
3553 <<
"Doing final balancing" <<
nl
3554 <<
"---------------------" <<
nl
3573 map().distributeCellData(cellNLayers);
3574 map().distributeFaceData(faceWantedThickness);
3575 map().distributeFaceData(faceRealThickness);
3587 faceWantedThickness,
3598 const bool preBalance,
3606 <<
"Shrinking and layer addition phase" <<
nl
3607 <<
"----------------------------------" <<
nl
3610 Info<<
"Using mesh parameters " << motionDict <<
nl <<
endl;
3613 mergePatchFacesUndo(layerParams, motionDict);
3620 label nFacesWithLayers = 0;
3623 if (numLayers[
patchi] > 0)
3635 <<
"Ignoring layers on coupled patch " << pp.
name()
3644 Info<<
nl <<
"No layers to generate ..." <<
endl;
3649 checkMeshManifold();
3652 Info<<
"Checking initial mesh ..." <<
endl;
3661 Info<<
"Detected " << nInitErrors <<
" illegal faces"
3662 <<
" (concave, zero area or negative cell pyramid volume)"
3670 <<
"Doing initial balancing" <<
nl
3671 <<
"-----------------------" <<
nl
3677 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, GeoMesh, PrimitiveField > Boundary
Type of the boundary field.
static tmp< GeometricField< Type, pointMesh, Field > > New(const word &name, const Internal &, const PtrList< Patch > &, 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.
static labelListList addedCells(const polyMesh &, const labelListList &layerFaces)
Helper: get added cells per patch face.
void updateZones(polyMesh &mesh)
Update the mesh zones.
void topoChange(const polyTopoChangeMap &, const labelList &faceMap, const labelList &pointMap)
Update any locally stored mesh information. Gets additional.
void setRefinement(const polyMesh &mesh, 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.
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 keywords followed by any number of values (e.g. words and numbers) or sub-dictionaries.
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.
const word & name() const
Return const reference to name.
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 addPatch(const label insertPatchi, const polyPatch &patch)
Add/insert single patch.
void clearOut()
Clear all geometry and addressing.
virtual void setPoints(const pointField &)
Reset the points.
Calculates a unique integer (label so might not have enough room - 2G max) for processor + local inde...
const labelList & coupledPatchMeshEdges() const
Return map from coupledPatch edges to mesh edges.
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.
virtual const faceList & faces() const
Return raw faces.
virtual const labelList & faceOwner() const
Return face owner.
const globalMeshData & globalData() const
Return parallel info.
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.
const vectorField & faceCentres() const
label nInternalFaces() const
bool isInternalFace(const label faceIndex) const
Return true if given face label is internal to the mesh.
const cellList & cells() 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.
Foam::fvMesh mesh(Foam::IOobject(regionName, runTime.name(), runTime, Foam::IOobject::MUST_READ), false)
#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(lagrangian::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(), lagrangian::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)
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.
void mag(LagrangianPatchField< scalar > &f, const LagrangianPatchField< Type > &f1)
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
defineTypeNameAndDebug(combustionModel, 0)
dimensioned< Type > sum(const DimensionedField< Type, GeoMesh, PrimitiveField > &df)
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.