diff --git a/src/turbulenceModels/compressible/RAS/Make/files b/src/turbulenceModels/compressible/RAS/Make/files index 1329745581..ed01f0592e 100644 --- a/src/turbulenceModels/compressible/RAS/Make/files +++ b/src/turbulenceModels/compressible/RAS/Make/files @@ -15,6 +15,7 @@ wallFunctions = derivedFvPatchFields/wallFunctions alphatWallFunctions = $(wallFunctions)/alphatWallFunctions $(alphatWallFunctions)/alphatWallFunction/alphatWallFunctionFvPatchScalarField.C +$(alphatWallFunctions)/alphatJayatillekeWallFunction/alphatJayatillekeWallFunctionFvPatchScalarField.C mutWallFunctions = $(wallFunctions)/mutWallFunctions $(mutWallFunctions)/mutkRoughWallFunction/mutkRoughWallFunctionFvPatchScalarField.C diff --git a/src/turbulenceModels/compressible/RAS/derivedFvPatchFields/wallFunctions/alphatWallFunctions/alphatJayatillekeWallFunction/alphatJayatillekeWallFunctionFvPatchScalarField.C b/src/turbulenceModels/compressible/RAS/derivedFvPatchFields/wallFunctions/alphatWallFunctions/alphatJayatillekeWallFunction/alphatJayatillekeWallFunctionFvPatchScalarField.C new file mode 100644 index 0000000000..e8fdf3edd5 --- /dev/null +++ b/src/turbulenceModels/compressible/RAS/derivedFvPatchFields/wallFunctions/alphatWallFunctions/alphatJayatillekeWallFunction/alphatJayatillekeWallFunctionFvPatchScalarField.C @@ -0,0 +1,316 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2008-2009 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 2 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, write to the Free Software Foundation, + Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +\*---------------------------------------------------------------------------*/ + +#include "alphatJayatillekeWallFunctionFvPatchScalarField.H" +#include "RASModel.H" +#include "fvPatchFieldMapper.H" +#include "volFields.H" +#include "addToRunTimeSelectionTable.H" +#include "wallFvPatch.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ +namespace compressible +{ +namespace RASModels +{ + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +scalar alphatJayatillekeWallFunctionFvPatchScalarField::maxExp_ = 50.0; +scalar alphatJayatillekeWallFunctionFvPatchScalarField::tolerance_ = 0.01; +label alphatJayatillekeWallFunctionFvPatchScalarField::maxIters_ = 10; + +// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // + +void alphatJayatillekeWallFunctionFvPatchScalarField::checkType() +{ + if (!isA(patch())) + { + FatalErrorIn + ( + "alphatJayatillekeWallFunctionFvPatchScalarField::checkType()" + ) + << "Patch type for patch " << patch().name() << " must be wall\n" + << "Current patch type is " << patch().type() << nl + << exit(FatalError); + } +} + + +scalar alphatJayatillekeWallFunctionFvPatchScalarField::Psmooth +( + const scalar Prat +) const +{ + return 9.24*(pow(Prat, 0.75) - 1.0)*(1.0 + 0.28*exp(-0.007*Prat)); +} + + +scalar alphatJayatillekeWallFunctionFvPatchScalarField::yPlusTherm +( + const scalar P, + const scalar Prat +) const +{ + scalar ypt = 11.0; + + for (int i=0; i& iF +) +: + fixedValueFvPatchScalarField(p, iF), + Prt_(0.85), + Cmu_(0.09), + kappa_(0.41), + E_(9.8) +{ + checkType(); +} + + +alphatJayatillekeWallFunctionFvPatchScalarField:: +alphatJayatillekeWallFunctionFvPatchScalarField +( + const alphatJayatillekeWallFunctionFvPatchScalarField& ptf, + const fvPatch& p, + const DimensionedField& iF, + const fvPatchFieldMapper& mapper +) +: + fixedValueFvPatchScalarField(ptf, p, iF, mapper), + Prt_(ptf.Prt_), + Cmu_(ptf.Cmu_), + kappa_(ptf.kappa_), + E_(ptf.E_) +{} + + +alphatJayatillekeWallFunctionFvPatchScalarField:: +alphatJayatillekeWallFunctionFvPatchScalarField +( + const fvPatch& p, + const DimensionedField& iF, + const dictionary& dict +) +: + fixedValueFvPatchScalarField(p, iF, dict), + Prt_(dict.lookupOrDefault("Prt", 0.85)), + Cmu_(dict.lookupOrDefault("Cmu", 0.09)), + kappa_(dict.lookupOrDefault("kappa", 0.41)), + E_(dict.lookupOrDefault("E", 9.8)) +{ + checkType(); +} + + +alphatJayatillekeWallFunctionFvPatchScalarField:: +alphatJayatillekeWallFunctionFvPatchScalarField +( + const alphatJayatillekeWallFunctionFvPatchScalarField& awfpsf +) +: + fixedValueFvPatchScalarField(awfpsf), + Prt_(awfpsf.Prt_), + Cmu_(awfpsf.Cmu_), + kappa_(awfpsf.kappa_), + E_(awfpsf.E_) +{ + checkType(); +} + + +alphatJayatillekeWallFunctionFvPatchScalarField:: +alphatJayatillekeWallFunctionFvPatchScalarField +( + const alphatJayatillekeWallFunctionFvPatchScalarField& awfpsf, + const DimensionedField& iF +) +: + fixedValueFvPatchScalarField(awfpsf, iF), + Prt_(awfpsf.Prt_), + Cmu_(awfpsf.Cmu_), + kappa_(awfpsf.kappa_), + E_(awfpsf.E_) +{ + checkType(); +} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +void alphatJayatillekeWallFunctionFvPatchScalarField::updateCoeffs() +{ + if (updated()) + { + return; + } + + const label patchI = patch().index(); + + const RASModel& rasModel = db().lookupObject("RASProperties"); + + const scalar Cmu25 = pow(Cmu_, 0.25); + + const scalarField& y = rasModel.y()[patchI]; + + const scalarField& muw = rasModel.mu().boundaryField()[patchI]; + + const scalarField& alphaw = rasModel.alpha().boundaryField()[patchI]; + scalarField& alphatw = *this; + + const tmp tk = rasModel.k(); + const volScalarField& k = tk(); + + const fvPatchVectorField& Uw = rasModel.U().boundaryField()[patchI]; + const scalarField magUp = mag(Uw.patchInternalField() - Uw); + const scalarField magGradUw = mag(Uw.snGrad()); + + const scalarField& rhow = rasModel.rho().boundaryField()[patchI]; + const fvPatchScalarField& hw = + patch().lookupPatchField("h"); + + // Heat flux [W/m2] - lagging alphatw + const scalarField qDot = (alphaw + alphatw)*hw.snGrad(); + + // Populate boundary values + forAll(alphatw, faceI) + { + label faceCellI = patch().faceCells()[faceI]; + + scalar uTau = Cmu25*sqrt(k[faceCellI]); + + scalar yPlus = uTau*y[faceI]/(muw[faceI]/rhow[faceI]); + + // Molecular Prandtl number + scalar Pr = muw[faceI]/alphaw[faceI]; + + // Molecular-to-turbulenbt Prandtl number ratio + scalar Prat = Pr/Prt_; + + // Thermal sublayer thickness + scalar P = Psmooth(Prat); + scalar yPlusTherm = this->yPlusTherm(P, Prat); + + // Evaluate new effective thermal diffusivity + scalar alphaEff = 0.0; + if (yPlus < yPlusTherm) + { + scalar A = qDot[faceI]*rhow[faceI]*uTau*y[faceI]; + scalar B = qDot[faceI]*Pr*yPlus; + scalar C = Pr*0.5*rhow[faceI]*uTau*sqr(magUp[faceI]); + alphaEff = A/(B + C + VSMALL); + } + else + { + scalar A = qDot[faceI]*rhow[faceI]*uTau*y[faceI]; + scalar B = qDot[faceI]*Prt_*(1.0/kappa_*log(E_*yPlus) + P); + scalar magUc = uTau/kappa_*log(E_*yPlusTherm) - mag(Uw[faceI]); + scalar C = + 0.5*rhow[faceI]*uTau + *(Prt_*sqr(magUp[faceI]) + (Pr - Prt_)*sqr(magUc)); + alphaEff = A/(B + C + VSMALL); + } + + // Update turbulent thermal diffusivity + alphatw[faceI] = max(0.0, alphaEff - alphaw[faceI]); + + if (debug) + { + Info<< " uTau = " << uTau << nl + << " Pr = " << Pr << nl + << " Prt = " << Prt_ << nl + << " qDot = " << qDot[faceI] << nl + << " yPlus = " << yPlus << nl + << " yPlusTherm = " << yPlusTherm << nl + << " alphaEff = " << alphaEff << nl + << " alphaw = " << alphaw[faceI] << nl + << " alphatw = " << alphatw[faceI] << nl + << endl; + } + } + + fixedValueFvPatchField::updateCoeffs(); +} + + +void alphatJayatillekeWallFunctionFvPatchScalarField::write(Ostream& os) const +{ + fvPatchField::write(os); + os.writeKeyword("Prt") << Prt_ << token::END_STATEMENT << nl; + os.writeKeyword("Cmu") << Cmu_ << token::END_STATEMENT << nl; + os.writeKeyword("kappa") << kappa_ << token::END_STATEMENT << nl; + os.writeKeyword("E") << E_ << token::END_STATEMENT << nl; + writeEntry("value", os); +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +makePatchTypeField +( + fvPatchScalarField, + alphatJayatillekeWallFunctionFvPatchScalarField +); + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace RASModels +} // End namespace compressible +} // End namespace Foam + +// ************************************************************************* // diff --git a/src/turbulenceModels/compressible/RAS/derivedFvPatchFields/wallFunctions/alphatWallFunctions/alphatJayatillekeWallFunction/alphatJayatillekeWallFunctionFvPatchScalarField.H b/src/turbulenceModels/compressible/RAS/derivedFvPatchFields/wallFunctions/alphatWallFunctions/alphatJayatillekeWallFunction/alphatJayatillekeWallFunctionFvPatchScalarField.H new file mode 100644 index 0000000000..6b5ce3bd72 --- /dev/null +++ b/src/turbulenceModels/compressible/RAS/derivedFvPatchFields/wallFunctions/alphatWallFunctions/alphatJayatillekeWallFunction/alphatJayatillekeWallFunctionFvPatchScalarField.H @@ -0,0 +1,195 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2008-2009 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 2 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, write to the Free Software Foundation, + Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +Class + alphatJayatillekeWallFunctionFvPatchScalarField + +Description + Thermal wall function for turbulent thermal diffusivity based on the + Jayatilleke thermal wall function + +SourceFiles + alphatJayatillekeWallFunctionFvPatchScalarField.C + +\*---------------------------------------------------------------------------*/ + +#ifndef alphatJayatillekeWallFunctionFvPatchScalarField_H +#define alphatJayatillekeWallFunctionFvPatchScalarField_H + +#include "fixedValueFvPatchFields.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ +namespace compressible +{ +namespace RASModels +{ + +/*---------------------------------------------------------------------------*\ + Class alphatJayatillekeWallFunctionFvPatchScalarField Declaration +\*---------------------------------------------------------------------------*/ + +class alphatJayatillekeWallFunctionFvPatchScalarField +: + public fixedValueFvPatchScalarField +{ + // Private data + + //- Turbulent Prandtl number + scalar Prt_; + + //- Cmu coefficient + scalar Cmu_; + + //- Von Karman constant + scalar kappa_; + + //- E coefficient + scalar E_; + + + // Solution parameters + + static scalar maxExp_; + static scalar tolerance_; + static label maxIters_; + + + // Private member functions + + //- Check the type of the patch + void checkType(); + + //- `P' function + scalar Psmooth(const scalar Prat) const; + + //- Calculate y+ at the edge of the thermal laminar sublayer + scalar yPlusTherm + ( + const scalar P, + const scalar Prat + ) const; + + +public: + + //- Runtime type information + TypeName("alphatJayatillekeWallFunction"); + + + // Constructors + + //- Construct from patch and internal field + alphatJayatillekeWallFunctionFvPatchScalarField + ( + const fvPatch&, + const DimensionedField& + ); + + //- Construct from patch, internal field and dictionary + alphatJayatillekeWallFunctionFvPatchScalarField + ( + const fvPatch&, + const DimensionedField&, + const dictionary& + ); + + //- Construct by mapping given an + // alphatJayatillekeWallFunctionFvPatchScalarField + // onto a new patch + alphatJayatillekeWallFunctionFvPatchScalarField + ( + const alphatJayatillekeWallFunctionFvPatchScalarField&, + const fvPatch&, + const DimensionedField&, + const fvPatchFieldMapper& + ); + + //- Construct as copy + alphatJayatillekeWallFunctionFvPatchScalarField + ( + const alphatJayatillekeWallFunctionFvPatchScalarField& + ); + + //- Construct and return a clone + virtual tmp clone() const + { + return tmp + ( + new alphatJayatillekeWallFunctionFvPatchScalarField(*this) + ); + } + + //- Construct as copy setting internal field reference + alphatJayatillekeWallFunctionFvPatchScalarField + ( + const alphatJayatillekeWallFunctionFvPatchScalarField&, + const DimensionedField& + ); + + //- Construct and return a clone setting internal field reference + virtual tmp clone + ( + const DimensionedField& iF + ) const + { + return tmp + ( + new alphatJayatillekeWallFunctionFvPatchScalarField + ( + *this, + iF + ) + ); + } + + + // Member functions + + // Evaluation functions + + //- Update the coefficients associated with the patch field + virtual void updateCoeffs(); + + + // I-O + + //- Write + void write(Ostream&) const; +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace RASModels +} // End namespace compressible +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* //