diff --git a/applications/solvers/compressible/rhoSimpleFoam/createFields.H b/applications/solvers/compressible/rhoSimpleFoam/createFields.H index 690b53760d75b22618fc9cd0c1358c015d867854..122280cfac48ecd0264c6463fa711928868d7c52 100644 --- a/applications/solvers/compressible/rhoSimpleFoam/createFields.H +++ b/applications/solvers/compressible/rhoSimpleFoam/createFields.H @@ -44,9 +44,14 @@ scalar pRefValue = 0.0; setRefCell(p, mesh.solutionDict().subDict("SIMPLE"), pRefCell, pRefValue); - dimensionedScalar pMin + dimensionedScalar rhoMax ( - mesh.solutionDict().subDict("SIMPLE").lookup("pMin") + mesh.solutionDict().subDict("SIMPLE").lookup("rhoMax") + ); + + dimensionedScalar rhoMin + ( + mesh.solutionDict().subDict("SIMPLE").lookup("rhoMin") ); Info<< "Creating turbulence model\n" << endl; diff --git a/applications/solvers/compressible/rhoSimpleFoam/hEqn.H b/applications/solvers/compressible/rhoSimpleFoam/hEqn.H index e299d99f83c9b1e0c0ab95b35d015300f4f18d7b..57395e977ed3520730cb0efaea428e2bae2b5da9 100644 --- a/applications/solvers/compressible/rhoSimpleFoam/hEqn.H +++ b/applications/solvers/compressible/rhoSimpleFoam/hEqn.H @@ -5,8 +5,8 @@ - fvm::Sp(fvc::div(phi), h) - fvm::laplacian(turbulence->alphaEff(), h) == - fvc::div(phi/fvc::interpolate(rho), p, "div(U,p)") - - p*fvc::div(phi/fvc::interpolate(rho)) + fvc::div(phi/fvc::interpolate(rho), rho/psi, "div(U,p)") + - (rho/psi)*fvc::div(phi/fvc::interpolate(rho)) ); hEqn.relax(); diff --git a/applications/solvers/compressible/rhoSimpleFoam/pEqn.H b/applications/solvers/compressible/rhoSimpleFoam/pEqn.H index 38922c99c9c5700518251a347c167b6848f3de62..329ebbd27fab99c901e1f727669ed2ce21ed5ebb 100644 --- a/applications/solvers/compressible/rhoSimpleFoam/pEqn.H +++ b/applications/solvers/compressible/rhoSimpleFoam/pEqn.H @@ -1,4 +1,7 @@ rho = thermo.rho(); +rho = max(rho, rhoMin); +rho = min(rho, rhoMax); +rho.relax(); volScalarField rUA = 1.0/UEqn().A(); U = rUA*UEqn().H(); @@ -82,15 +85,9 @@ else // Explicitly relax pressure for momentum corrector p.relax(); -rho = thermo.rho(); -rho.relax(); -Info<< "rho max/min : " << max(rho).value() << " " << min(rho).value() << endl; - U -= rUA*fvc::grad(p); U.correctBoundaryConditions(); -bound(p, pMin); - // For closed-volume cases adjust the pressure and density levels // to obey overall mass continuity if (closedVolume) @@ -98,3 +95,9 @@ if (closedVolume) p += (initialMass - fvc::domainIntegrate(psi*p)) /fvc::domainIntegrate(psi); } + +rho = thermo.rho(); +rho = max(rho, rhoMin); +rho = min(rho, rhoMax); +rho.relax(); +Info<< "rho max/min : " << max(rho).value() << " " << min(rho).value() << endl; diff --git a/applications/utilities/mesh/manipulation/checkMesh/checkGeometry.C b/applications/utilities/mesh/manipulation/checkMesh/checkGeometry.C index e16d90bbbd1adbd1be557973de6b8107776f9d97..50ff6918b089b2b67e97828b3a06cb5589ca5981 100644 --- a/applications/utilities/mesh/manipulation/checkMesh/checkGeometry.C +++ b/applications/utilities/mesh/manipulation/checkMesh/checkGeometry.C @@ -291,6 +291,22 @@ Foam::label Foam::checkGeometry(const polyMesh& mesh, const bool allGeometry) } } + if (allGeometry) + { + cellSet cells(mesh, "concaveCells", mesh.nCells()/100); + if (mesh.checkConcaveCells(true, &cells)) + { + noFailedChecks++; + + label nCells = returnReduce(cells.size(), sumOp<label>()); + + Info<< " <<Writing " << nCells + << " concave cells to set " << cells.name() << endl; + cells.instance() = mesh.pointsInstance(); + cells.write(); + } + } + return noFailedChecks; } diff --git a/src/OpenFOAM/meshes/primitiveMesh/primitiveMesh.H b/src/OpenFOAM/meshes/primitiveMesh/primitiveMesh.H index 7e7272b03236f8512b9457708fc1bd4fd87a15f0..718df480e00713c8991728542e35faa1bb3c4f22 100644 --- a/src/OpenFOAM/meshes/primitiveMesh/primitiveMesh.H +++ b/src/OpenFOAM/meshes/primitiveMesh/primitiveMesh.H @@ -291,6 +291,9 @@ class primitiveMesh //- Skewness warning threshold static scalar skewThreshold_; + //- Threshold where faces are considered coplanar + static scalar planarCosAngle_; + protected: @@ -646,6 +649,13 @@ public: labelHashSet* setPtr = NULL ) const; + //- Check for concave cells by the planes of faces + bool checkConcaveCells + ( + const bool report = false, + labelHashSet* setPtr = NULL + ) const; + //- Check mesh topology for correctness. // Returns false for no error. diff --git a/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshCheck/primitiveMeshCheck.C b/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshCheck/primitiveMeshCheck.C index 30a851e237913f7d97e1ee3066d3b118160d2563..7dcfceaf1020c78357251c99cf8bfdabcbfebed9 100644 --- a/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshCheck/primitiveMeshCheck.C +++ b/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshCheck/primitiveMeshCheck.C @@ -37,6 +37,7 @@ Foam::scalar Foam::primitiveMesh::closedThreshold_ = 1.0e-6; Foam::scalar Foam::primitiveMesh::aspectThreshold_ = 1000; Foam::scalar Foam::primitiveMesh::nonOrthThreshold_ = 70; // deg Foam::scalar Foam::primitiveMesh::skewThreshold_ = 4; +Foam::scalar Foam::primitiveMesh::planarCosAngle_ = 1.0e-6; // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // @@ -2093,6 +2094,121 @@ bool Foam::primitiveMesh::checkCellDeterminant } +bool Foam::primitiveMesh::checkConcaveCells +( + const bool report, + labelHashSet* setPtr +) const +{ + if (debug) + { + Info<< "bool primitiveMesh::checkConcaveCells(const bool" + << ", labelHashSet*) const: " + << "checking for concave cells" << endl; + } + + const cellList& c = cells(); + const labelList& fOwner = faceOwner(); + const vectorField& fAreas = faceAreas(); + const pointField& fCentres = faceCentres(); + + label nConcaveCells = 0; + + forAll (c, cellI) + { + const cell& cFaces = c[cellI]; + + bool concave = false; + + forAll(cFaces, i) + { + if (concave) + { + break; + } + + label fI = cFaces[i]; + + const point& fC = fCentres[fI]; + + vector fN = fAreas[fI]; + + fN /= max(mag(fN), VSMALL); + + // Flip normal if required so that it is always pointing out of + // the cell + if (fOwner[fI] != cellI) + { + fN *= -1; + } + + // Is the centre of any other face of the cell on the + // wrong side of the plane of this face? + + forAll(cFaces, j) + { + if (j != i) + { + label fJ = cFaces[j]; + + const point& pt = fCentres[fJ]; + + // If the cell is concave, the point will be on the + // positive normal side of the plane of f, defined by + // its centre and normal, and the angle between (pt - + // fC) and fN will be less than 90 degrees, so the dot + // product will be positive. + + vector pC = (pt - fC); + + pC /= max(mag(pC), VSMALL); + + if ((pC & fN) > -planarCosAngle_) + { + // Concave or planar face + + concave = true; + + if (setPtr) + { + setPtr->insert(cellI); + } + + nConcaveCells++; + + break; + } + } + } + } + } + + reduce(nConcaveCells, sumOp<label>()); + + if (nConcaveCells > 0) + { + if (debug || report) + { + Info<< " ***Concave cells found, number of cells: " + << nConcaveCells << endl; + } + + return true; + } + else + { + if (debug || report) + { + Info<< " Concave cell check OK." << endl; + } + + return false; + } + + return false; +} + + // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // bool Foam::primitiveMesh::checkTopology(const bool report) const diff --git a/src/dynamicMesh/polyTopoChange/polyTopoChange/removePoints.C b/src/dynamicMesh/polyTopoChange/polyTopoChange/removePoints.C index 07ceb696108defb4890df7a81f9a538c16220517..92ba164bb82de00df1319b2d2f31f5a869585d7c 100644 --- a/src/dynamicMesh/polyTopoChange/polyTopoChange/removePoints.C +++ b/src/dynamicMesh/polyTopoChange/polyTopoChange/removePoints.C @@ -202,12 +202,45 @@ Foam::label Foam::removePoints::countPointUsage pointCanBeDeleted[pointI] = true; nDeleted++; } - } edge0.clear(); edge1.clear(); + // Protect any points on faces that would collapse down to nothing + // No particular intelligence so might protect too many points + forAll(mesh_.faces(), faceI) + { + const face& f = mesh_.faces()[faceI]; + + label nCollapse = 0; + forAll(f, fp) + { + if (pointCanBeDeleted[f[fp]]) + { + nCollapse++; + } + } + + if ((f.size() - nCollapse) < 3) + { + // Just unmark enough points + forAll(f, fp) + { + if (pointCanBeDeleted[f[fp]]) + { + pointCanBeDeleted[f[fp]] = false; + --nCollapse; + if (nCollapse == 0) + { + break; + } + } + } + } + } + + // Point can be deleted only if all processors want to delete it syncTools::syncPointList ( diff --git a/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoLayerDriver.C b/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoLayerDriver.C index 828e7e65ff10b7f3071b5974af321f8c08e3bc12..50942e39c72629a59aa17dd957a4f6c4fa0f487b 100644 --- a/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoLayerDriver.C +++ b/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoLayerDriver.C @@ -1375,7 +1375,7 @@ void Foam::autoLayerDriver::growNoExtrusion pointField& patchDisp, labelList& patchNLayers, List<extrudeMode>& extrudeStatus -) +) const { Info<< nl << "Growing non-extrusion points by one layer ..." << endl; @@ -1406,7 +1406,7 @@ void Foam::autoLayerDriver::growNoExtrusion { if ( - extrudeStatus[f[fp]] == NOEXTRUDE + extrudeStatus[f[fp]] == EXTRUDE && grownExtrudeStatus[f[fp]] != NOEXTRUDE ) { @@ -1419,6 +1419,31 @@ void Foam::autoLayerDriver::growNoExtrusion extrudeStatus.transfer(grownExtrudeStatus); + + // Synchronise since might get called multiple times. + // Use the fact that NOEXTRUDE is the minimum value. + { + labelList status(extrudeStatus.size()); + forAll(status, i) + { + status[i] = extrudeStatus[i]; + } + syncTools::syncPointList + ( + meshRefiner_.mesh(), + pp.meshPoints(), + status, + minEqOp<label>(), + labelMax, // null value + false // no separation + ); + forAll(status, i) + { + extrudeStatus[i] = extrudeMode(status[i]); + } + } + + forAll(extrudeStatus, patchPointI) { if (extrudeStatus[patchPointI] == NOEXTRUDE) @@ -2711,8 +2736,6 @@ void Foam::autoLayerDriver::addLayers const labelList& meshPoints = patches[patchI].meshPoints(); - //scalar maxThickness = -VGREAT; - //scalar minThickness = VGREAT; scalar sumThickness = 0; scalar sumNearWallThickness = 0; @@ -2720,8 +2743,6 @@ void Foam::autoLayerDriver::addLayers { label ppPointI = pp().meshPointMap()[meshPoints[patchPointI]]; - //maxThickness = max(maxThickness, thickness[ppPointI]); - //minThickness = min(minThickness, thickness[ppPointI]); sumThickness += thickness[ppPointI]; label nLay = patchNLayers[ppPointI]; @@ -2749,8 +2770,6 @@ void Foam::autoLayerDriver::addLayers if (totNPoints > 0) { - //reduce(maxThickness, maxOp<scalar>()); - //reduce(minThickness, minOp<scalar>()); avgThickness = returnReduce(sumThickness, sumOp<scalar>()) / totNPoints; @@ -2766,8 +2785,6 @@ void Foam::autoLayerDriver::addLayers << " " << setw(6) << layerParams.numLayers()[patchI] << " " << setw(8) << avgNearWallThickness << " " << setw(8) << avgThickness - //<< " " << setw(8) << minThickness - //<< " " << setw(8) << maxThickness << endl; } Info<< endl; @@ -3147,6 +3164,19 @@ void Foam::autoLayerDriver::addLayers meshMover().movePoints(oldPoints); meshMover().correct(); + + // Grow out region of non-extrusion + for (label i = 0; i < layerParams.nGrow(); i++) + { + growNoExtrusion + ( + pp, + patchDisp, + patchNLayers, + extrudeStatus + ); + } + Info<< endl; } @@ -3293,7 +3323,6 @@ void Foam::autoLayerDriver::doLayers // Balance - if (Pstream::parRun()) if (Pstream::parRun() && preBalance) { Info<< nl diff --git a/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoLayerDriver.H b/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoLayerDriver.H index b49a6934b87f9332f168bf6bac543b52944b540e..915614aad91113fd88289bea54c0186f81c85182 100644 --- a/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoLayerDriver.H +++ b/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoLayerDriver.H @@ -232,13 +232,13 @@ class autoLayerDriver ) const; //- Grow no-extrusion layer. - static void growNoExtrusion + void growNoExtrusion ( const indirectPrimitivePatch& pp, pointField& patchDisp, labelList& patchNLayers, List<extrudeMode>& extrudeStatus - ); + ) const; //- Calculate pointwise wanted and minimum thickness. // thickness: wanted thickness diff --git a/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinementBaffles.C b/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinementBaffles.C index 882da504f9f4a3c1f86773b7471856fa1498dcd6..e2a2fee10ab21940e605ccab3358bb0d415a9f32 100644 --- a/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinementBaffles.C +++ b/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinementBaffles.C @@ -245,27 +245,8 @@ void Foam::meshRefinement::getBafflePatches const pointField& cellCentres = mesh_.cellCentres(); - // Build list of surfaces that are not to be baffled. - const wordList& cellZoneNames = surfaces_.cellZoneNames(); - - labelList surfacesToBaffle(cellZoneNames.size()); - label baffleI = 0; - forAll(cellZoneNames, surfI) - { - if (cellZoneNames[surfI].size()) - { - if (debug) - { - Pout<< "getBafflePatches : Not baffling surface " - << surfaces_.names()[surfI] << endl; - } - } - else - { - surfacesToBaffle[baffleI++] = surfI; - } - } - surfacesToBaffle.setSize(baffleI); + // Surfaces that need to be baffled + const labelList surfacesToBaffle(surfaces_.getUnnamedSurfaces()); ownPatch.setSize(mesh_.nFaces()); ownPatch = -1; @@ -1253,7 +1234,7 @@ void Foam::meshRefinement::findCellZoneTopo { label surfI = namedSurfaceIndex[faceI]; - if (surfI != -1) + if (surfI != -1 && surfaceToCellZone[surfI] != -1) { // Calculate region to zone from cellRegions on either side // of internal face. @@ -1305,7 +1286,7 @@ void Foam::meshRefinement::findCellZoneTopo label surfI = namedSurfaceIndex[faceI]; - if (surfI != -1) + if (surfI != -1 && surfaceToCellZone[surfI] != -1) { bool changedCell = calcRegionToZone ( @@ -1439,6 +1420,15 @@ void Foam::meshRefinement::makeConsistentFaceIndex } } } + else + { + // Unzonify boundary faces + forAll(pp, i) + { + label faceI = pp.start()+i; + namedSurfaceIndex[faceI] = -1; + } + } } } @@ -2042,14 +2032,10 @@ Foam::autoPtr<Foam::mapPolyMesh> Foam::meshRefinement::zonify labelList namedSurfaces(surfaces_.getNamedSurfaces()); - boolList isNamedSurface(cellZoneNames.size(), false); - forAll(namedSurfaces, i) { label surfI = namedSurfaces[i]; - isNamedSurface[surfI] = true; - Info<< "Surface : " << surfaces_.names()[surfI] << nl << " faceZone : " << faceZoneNames[surfI] << nl << " cellZone : " << cellZoneNames[surfI] << endl; @@ -2125,31 +2111,34 @@ Foam::autoPtr<Foam::mapPolyMesh> Foam::meshRefinement::zonify { label surfI = namedSurfaces[i]; - label zoneI = cellZones.findZoneID(cellZoneNames[surfI]); - - if (zoneI == -1) + if (cellZoneNames[surfI] != word::null) { - zoneI = cellZones.size(); - cellZones.setSize(zoneI+1); - cellZones.set - ( - zoneI, - new cellZone + label zoneI = cellZones.findZoneID(cellZoneNames[surfI]); + + if (zoneI == -1) + { + zoneI = cellZones.size(); + cellZones.setSize(zoneI+1); + cellZones.set ( - cellZoneNames[surfI], //name - labelList(0), //addressing - zoneI, //index - cellZones //cellZoneMesh - ) - ); - } + zoneI, + new cellZone + ( + cellZoneNames[surfI], //name + labelList(0), //addressing + zoneI, //index + cellZones //cellZoneMesh + ) + ); + } - if (debug) - { - Pout<< "Cells inside " << surfaces_.names()[surfI] - << " will go into cellZone " << zoneI << endl; + if (debug) + { + Pout<< "Cells inside " << surfaces_.names()[surfI] + << " will go into cellZone " << zoneI << endl; + } + surfaceToCellZone[surfI] = zoneI; } - surfaceToCellZone[surfI] = zoneI; } // Check they are synced @@ -2321,6 +2310,11 @@ Foam::autoPtr<Foam::mapPolyMesh> Foam::meshRefinement::zonify if (closedNamedSurfaces.size()) { + Info<< "Found " << closedNamedSurfaces.size() + << " closed, named surfaces. Assigning cells in/outside" + << " these surfaces to the corresponding cellZone." + << nl << endl; + findCellZoneGeometric ( closedNamedSurfaces, // indices of closed surfaces @@ -2333,8 +2327,10 @@ Foam::autoPtr<Foam::mapPolyMesh> Foam::meshRefinement::zonify // Set using walking // ~~~~~~~~~~~~~~~~~ - //if (returnReduce(nSet, sumOp<label>()) < mesh_.globalData().nTotalCells()) + if (!allowFreeStandingZoneFaces) { + Info<< "Walking to assign cellZones." << nl << endl; + // Topological walk findCellZoneTopo ( @@ -2349,6 +2345,9 @@ Foam::autoPtr<Foam::mapPolyMesh> Foam::meshRefinement::zonify // Make sure namedSurfaceIndex is unset inbetween same cell cell zones. if (!allowFreeStandingZoneFaces) { + Info<< "Only keeping zone faces inbetween different cellZones." + << nl << endl; + makeConsistentFaceIndex(cellToZone, namedSurfaceIndex); } diff --git a/src/mesh/autoMesh/autoHexMesh/refinementSurfaces/refinementSurfaces.C b/src/mesh/autoMesh/autoHexMesh/refinementSurfaces/refinementSurfaces.C index d3687b7bdbfcb09b3b46f5142437dd3335ffa5c4..c6aae8ccaedb716d6f7ce611bcf64ee7eccbbe75 100644 --- a/src/mesh/autoMesh/autoHexMesh/refinementSurfaces/refinementSurfaces.C +++ b/src/mesh/autoMesh/autoHexMesh/refinementSurfaces/refinementSurfaces.C @@ -77,8 +77,18 @@ Foam::refinementSurfaces::refinementSurfaces if (dict.found("faceZone")) { dict.lookup("faceZone") >> faceZoneNames_[surfI]; - dict.lookup("cellZone") >> cellZoneNames_[surfI]; - dict.lookup("zoneInside") >> zoneInside_[surfI]; + if (dict.readIfPresent("cellZone", cellZoneNames_[surfI])) + { + dict.lookup("zoneInside") >> zoneInside_[surfI]; + } + else if (dict.found("zoneInside")) + { + IOWarningIn("refinementSurfaces::refinementSurfaces(..)", dict) + << "Unused entry zoneInside for faceZone " + << faceZoneNames_[surfI] + << " since no cellZone specified." + << endl; + } } // Global perpendicular angle @@ -314,8 +324,21 @@ Foam::refinementSurfaces::refinementSurfaces if (dict.found("faceZone")) { dict.lookup("faceZone") >> faceZoneNames_[surfI]; - dict.lookup("cellZone") >> cellZoneNames_[surfI]; - dict.lookup("zoneInside") >> zoneInside_[surfI]; + if (dict.readIfPresent("cellZone", cellZoneNames_[surfI])) + { + dict.lookup("zoneInside") >> zoneInside_[surfI]; + } + else if (dict.found("zoneInside")) + { + IOWarningIn + ( + "refinementSurfaces::refinementSurfaces(..)", + dict + ) << "Unused entry zoneInside for faceZone " + << faceZoneNames_[surfI] + << " since no cellZone specified." + << endl; + } } // Global perpendicular angle @@ -475,18 +498,17 @@ Foam::labelList Foam::refinementSurfaces::getNamedSurfaces() const // Get indices of closed named surfaces Foam::labelList Foam::refinementSurfaces::getClosedNamedSurfaces() const { - labelList named(getNamedSurfaces()); + labelList closed(cellZoneNames_.size()); - labelList closed(named.size()); label closedI = 0; - - forAll(named, i) + forAll(cellZoneNames_, surfI) { - label surfI = named[i]; - - if (allGeometry_[surfaces_[surfI]].hasVolumeType()) + if (cellZoneNames_[surfI].size()) { - closed[closedI++] = surfI; + if (allGeometry_[surfaces_[surfI]].hasVolumeType()) + { + closed[closedI++] = surfI; + } } } closed.setSize(closedI); diff --git a/src/mesh/autoMesh/autoHexMesh/refinementSurfaces/refinementSurfaces.H b/src/mesh/autoMesh/autoHexMesh/refinementSurfaces/refinementSurfaces.H index 4a7b6f96c9992d47c603099cc67145db504c121c..bafe949a08adc469ac611a8d6060410b9c8096b5 100644 --- a/src/mesh/autoMesh/autoHexMesh/refinementSurfaces/refinementSurfaces.H +++ b/src/mesh/autoMesh/autoHexMesh/refinementSurfaces/refinementSurfaces.H @@ -146,7 +146,8 @@ public: return faceZoneNames_; } - //- Per 'interface' surface : name of cellZone to put cells into + //- Per 'interface' surface : empty or name of cellZone to put + // cells into const wordList& cellZoneNames() const { return cellZoneNames_; @@ -158,7 +159,7 @@ public: //- Get indices of named surfaces (surfaces with faceZoneName) labelList getNamedSurfaces() const; - //- Get indices of closed named surfaces + //- Get indices of closed surfaces with a cellZone labelList getClosedNamedSurfaces() const; //- From local region number to global region number diff --git a/src/turbulenceModels/incompressible/RAS/kOmega/kOmega.H b/src/turbulenceModels/incompressible/RAS/kOmega/kOmega.H index cf8f8a07ce65b679bef3184432cdb2c7c66167b3..d2759d29274673be2ce3fa1f94f3655bdb2699ba 100644 --- a/src/turbulenceModels/incompressible/RAS/kOmega/kOmega.H +++ b/src/turbulenceModels/incompressible/RAS/kOmega/kOmega.H @@ -33,7 +33,7 @@ Description "Turbulence Modeling for CFD" D. C. Wilcox, DCW Industries, Inc., La Canada, - California, 1998. + California, 1988. See also: http://www.cfd-online.com/Wiki/Wilcox's_k-omega_model