diff --git a/src/TurbulenceModels/turbulenceModels/Make/files b/src/TurbulenceModels/turbulenceModels/Make/files index 2123e373e8887e0485320cabfce4ccf11a644468..315ba24226f4727294a0e7ce674c78e6d7c0c704 100644 --- a/src/TurbulenceModels/turbulenceModels/Make/files +++ b/src/TurbulenceModels/turbulenceModels/Make/files @@ -40,6 +40,7 @@ $(nutWallFunctions)/nutkWallFunction/nutkWallFunctionFvPatchScalarField.C $(nutWallFunctions)/nutkRoughWallFunction/nutkRoughWallFunctionFvPatchScalarField.C $(nutWallFunctions)/nutkAtmRoughWallFunction/nutkAtmRoughWallFunctionFvPatchScalarField.C +$(nutWallFunctions)/nutUBlendedWallFunction/nutUBlendedWallFunctionFvPatchScalarField.C $(nutWallFunctions)/nutUWallFunction/nutUWallFunctionFvPatchScalarField.C $(nutWallFunctions)/nutUSpaldingWallFunction/nutUSpaldingWallFunctionFvPatchScalarField.C $(nutWallFunctions)/nutUTabulatedWallFunction/nutUTabulatedWallFunctionFvPatchScalarField.C diff --git a/src/TurbulenceModels/turbulenceModels/derivedFvPatchFields/wallFunctions/nutWallFunctions/nutUBlendedWallFunction/nutUBlendedWallFunctionFvPatchScalarField.C b/src/TurbulenceModels/turbulenceModels/derivedFvPatchFields/wallFunctions/nutWallFunctions/nutUBlendedWallFunction/nutUBlendedWallFunctionFvPatchScalarField.C new file mode 100644 index 0000000000000000000000000000000000000000..81f1d10a2594836b44e1b51cf0062d6e214e1a3a --- /dev/null +++ b/src/TurbulenceModels/turbulenceModels/derivedFvPatchFields/wallFunctions/nutWallFunctions/nutUBlendedWallFunction/nutUBlendedWallFunctionFvPatchScalarField.C @@ -0,0 +1,225 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2016 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "nutUBlendedWallFunctionFvPatchScalarField.H" +#include "turbulenceModel.H" +#include "fvPatchFieldMapper.H" +#include "volFields.H" +#include "addToRunTimeSelectionTable.H" + +// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * // + +Foam::tmp<Foam::scalarField> +Foam::nutUBlendedWallFunctionFvPatchScalarField::calcNut() const +{ + const label patchi = patch().index(); + + const turbulenceModel& turbModel = db().lookupObject<turbulenceModel> + ( + IOobject::groupName + ( + turbulenceModel::propertiesName, + internalField().group() + ) + ); + const fvPatchVectorField& Uw = turbModel.U().boundaryField()[patchi]; + const scalarField magGradU(mag(Uw.snGrad())); + const tmp<scalarField> tnuw = turbModel.nu(patchi); + const scalarField& nuw = tnuw(); + + return max + ( + scalar(0), + sqr(calcUTau(magGradU))/(magGradU + ROOTVSMALL) - nuw + ); +} + + +Foam::tmp<Foam::scalarField> +Foam::nutUBlendedWallFunctionFvPatchScalarField::calcUTau +( + const scalarField& magGradU +) const +{ + const label patchi = patch().index(); + + const turbulenceModel& turbModel = db().lookupObject<turbulenceModel> + ( + IOobject::groupName + ( + turbulenceModel::propertiesName, + internalField().group() + ) + ); + + const scalarField& y = turbModel.y()[patchi]; + + const tmp<scalarField> tnuw = turbModel.nu(patchi); + const scalarField& nuw = tnuw(); + + const vectorField n(patch().nf()); + const fvPatchVectorField& Uw = turbModel.U().boundaryField()[patchi]; + vectorField Up(Uw.patchInternalField() - Uw); + Up -= n*(n & Up); + const scalarField magUp(mag(Up)); + + tmp<scalarField> tuTaup(new scalarField(patch().size(), 0.0)); + scalarField& uTaup = tuTaup.ref(); + + const scalarField& nutw = *this; + + forAll(uTaup, facei) + { + scalar ut = sqrt((nutw[facei] + nuw[facei])*magGradU[facei]); + scalar error = GREAT; + label iter = 0; + while (iter++ < 10 && error > 0.001) + { + scalar yPlus = y[facei]*ut/nuw[facei]; + scalar uTauVis = magUp[facei]/yPlus; + scalar uTauLog = kappa_*magUp[facei]/log(E_*yPlus); + + scalar utNew = pow(pow(uTauVis, n_) + pow(uTauLog, n_), 1.0/n_); + error = mag(ut - utNew)/(ut + ROOTVSMALL); + ut = 0.5*(ut + utNew); + } + uTaup[facei] = ut; + } + + return tuTaup; +} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::nutUBlendedWallFunctionFvPatchScalarField:: +nutUBlendedWallFunctionFvPatchScalarField +( + const fvPatch& p, + const DimensionedField<scalar, volMesh>& iF +) +: + nutWallFunctionFvPatchScalarField(p, iF), + n_(4) +{} + + +Foam::nutUBlendedWallFunctionFvPatchScalarField:: +nutUBlendedWallFunctionFvPatchScalarField +( + const nutUBlendedWallFunctionFvPatchScalarField& ptf, + const fvPatch& p, + const DimensionedField<scalar, volMesh>& iF, + const fvPatchFieldMapper& mapper +) +: + nutWallFunctionFvPatchScalarField(ptf, p, iF, mapper), + n_(ptf.n_) +{} + + +Foam::nutUBlendedWallFunctionFvPatchScalarField:: +nutUBlendedWallFunctionFvPatchScalarField +( + const fvPatch& p, + const DimensionedField<scalar, volMesh>& iF, + const dictionary& dict +) +: + nutWallFunctionFvPatchScalarField(p, iF, dict), + n_(dict.lookupOrDefault<scalar>("n", 4)) +{} + + +Foam::nutUBlendedWallFunctionFvPatchScalarField:: +nutUBlendedWallFunctionFvPatchScalarField +( + const nutUBlendedWallFunctionFvPatchScalarField& wfpsf +) +: + nutWallFunctionFvPatchScalarField(wfpsf), + n_(wfpsf.n_) +{} + + +Foam::nutUBlendedWallFunctionFvPatchScalarField:: +nutUBlendedWallFunctionFvPatchScalarField +( + const nutUBlendedWallFunctionFvPatchScalarField& wfpsf, + const DimensionedField<scalar, volMesh>& iF +) +: + nutWallFunctionFvPatchScalarField(wfpsf, iF), + n_(wfpsf.n_) +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +Foam::tmp<Foam::scalarField> +Foam::nutUBlendedWallFunctionFvPatchScalarField::yPlus() const +{ + const label patchi = patch().index(); + + const turbulenceModel& turbModel = db().lookupObject<turbulenceModel> + ( + IOobject::groupName + ( + turbulenceModel::propertiesName, + internalField().group() + ) + ); + const scalarField& y = turbModel.y()[patchi]; + const tmp<scalarField> tnuw = turbModel.nu(patchi); + const scalarField& nuw = tnuw(); + const fvPatchVectorField& Uw = turbModel.U().boundaryField()[patchi]; + const scalarField magGradU(mag(Uw.snGrad())); + + return y*calcUTau(magGradU)/nuw; +} + + +void Foam::nutUBlendedWallFunctionFvPatchScalarField::write(Ostream& os) const +{ + fvPatchField<scalar>::write(os); + writeLocalEntries(os); + writeEntry("value", os); + os.writeEntry("n", n_); +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + makePatchTypeField + ( + fvPatchScalarField, + nutUBlendedWallFunctionFvPatchScalarField + ); +} + + +// ************************************************************************* // diff --git a/src/TurbulenceModels/turbulenceModels/derivedFvPatchFields/wallFunctions/nutWallFunctions/nutUBlendedWallFunction/nutUBlendedWallFunctionFvPatchScalarField.H b/src/TurbulenceModels/turbulenceModels/derivedFvPatchFields/wallFunctions/nutWallFunctions/nutUBlendedWallFunction/nutUBlendedWallFunctionFvPatchScalarField.H new file mode 100644 index 0000000000000000000000000000000000000000..67db5bf700a12562d8689771742cb4b6cbc59ed1 --- /dev/null +++ b/src/TurbulenceModels/turbulenceModels/derivedFvPatchFields/wallFunctions/nutWallFunctions/nutUBlendedWallFunction/nutUBlendedWallFunctionFvPatchScalarField.H @@ -0,0 +1,206 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2016-2017 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Class + Foam::nutUBlendedWallFunctionFvPatchScalarField + +Group + grpWallFunctions + +Description + This boundary condition provides a turbulent kinematic viscosity condition + when using wall functions, based on a blending of laminar sub-layer and + log region contributions. + + \f[ + uTau = (uTau_v^n + uTau_l^n)^(1/n) + \f] + + where + \vartable + uTau | friction velocity + uTau_v | friction velocity in the viscous region + uTau_l | friction velocity in the log region + \endvartable + + +Usage + + Example of the boundary condition specification: + \verbatim + myPatch + { + type nutUBlendedWallFunction; + } + \endverbatim + + Reference: + See the section that describes 'automatic wall treatment' + \verbatim + Menter, F., Carregal Ferreira, J., Esch, T., Konno, B. (2003). + The SST Turbulence Model with Improved Wall Treatment + for Heat Transfer Predictions in Gas Turbines. + Proceedings of the International Gas Turbine Congress 2003 Tokyo + \endverbatim + +Note + The full 'automatic wall treatment' description also requires use of the + Foam::omegaWallFunction with the \c blended flag set to 'on' + +SeeAlso + Foam::nutWallFunctionFvPatchScalarField + Foam::omegaWallFunctionFvPatchScalarField + +SourceFiles + nutUBlendedWallFunctionFvPatchScalarField.C + +\*---------------------------------------------------------------------------*/ + +#ifndef nutUBlendedWallFunctionFvPatchScalarField_H +#define nutUBlendedWallFunctionFvPatchScalarField_H + +#include "nutWallFunctionFvPatchScalarField.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class nutUBlendedWallFunctionFvPatchScalarField Declaration +\*---------------------------------------------------------------------------*/ + +class nutUBlendedWallFunctionFvPatchScalarField +: + public nutWallFunctionFvPatchScalarField +{ +protected: + + // Protected data + + //- Model coefficient; default = 4 + scalar n_; + + + // Protected Member Functions + + //- Calculate the turbulence viscosity + virtual tmp<scalarField> calcNut() const; + + //- Calculate the friction velocity + virtual tmp<scalarField> calcUTau(const scalarField& magGradU) const; + + +public: + + //- Runtime type information + TypeName("nutUBlendedWallFunction"); + + + // Constructors + + //- Construct from patch and internal field + nutUBlendedWallFunctionFvPatchScalarField + ( + const fvPatch&, + const DimensionedField<scalar, volMesh>& + ); + + //- Construct from patch, internal field and dictionary + nutUBlendedWallFunctionFvPatchScalarField + ( + const fvPatch&, + const DimensionedField<scalar, volMesh>&, + const dictionary& + ); + + //- Construct by mapping given + // nutUBlendedWallFunctionFvPatchScalarField + // onto a new patch + nutUBlendedWallFunctionFvPatchScalarField + ( + const nutUBlendedWallFunctionFvPatchScalarField&, + const fvPatch&, + const DimensionedField<scalar, volMesh>&, + const fvPatchFieldMapper& + ); + + //- Construct as copy + nutUBlendedWallFunctionFvPatchScalarField + ( + const nutUBlendedWallFunctionFvPatchScalarField& + ); + + //- Construct and return a clone + virtual tmp<fvPatchScalarField> clone() const + { + return tmp<fvPatchScalarField> + ( + new nutUBlendedWallFunctionFvPatchScalarField(*this) + ); + } + + //- Construct as copy setting internal field reference + nutUBlendedWallFunctionFvPatchScalarField + ( + const nutUBlendedWallFunctionFvPatchScalarField&, + const DimensionedField<scalar, volMesh>& + ); + + //- Construct and return a clone setting internal field reference + virtual tmp<fvPatchScalarField> clone + ( + const DimensionedField<scalar, volMesh>& iF + ) const + { + return tmp<fvPatchScalarField> + ( + new nutUBlendedWallFunctionFvPatchScalarField(*this, iF) + ); + } + + + // Member functions + + // Evaluation functions + + //- Calculate and return the yPlus at the boundary + virtual tmp<scalarField> yPlus() const; + + + // I-O + + //- Write + virtual void write(Ostream& os) const; +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* //