diff --git a/src/TurbulenceModels/compressible/turbulentFluidThermoModels/turbulentFluidThermoModels.C b/src/TurbulenceModels/compressible/turbulentFluidThermoModels/turbulentFluidThermoModels.C
index ad86b169a..519e15be4 100644
--- a/src/TurbulenceModels/compressible/turbulentFluidThermoModels/turbulentFluidThermoModels.C
+++ b/src/TurbulenceModels/compressible/turbulentFluidThermoModels/turbulentFluidThermoModels.C
@@ -57,6 +57,9 @@ makeRASModel(SpalartAllmaras);
#include "kEpsilon.H"
makeRASModel(kEpsilon);
+#include "realizableKE.H"
+makeRASModel(realizableKE);
+
#include "buoyantKEpsilon.H"
makeRASModel(buoyantKEpsilon);
diff --git a/src/TurbulenceModels/incompressible/turbulentTransportModels/turbulentTransportModels.C b/src/TurbulenceModels/incompressible/turbulentTransportModels/turbulentTransportModels.C
index c97c42fdb..c881910b3 100644
--- a/src/TurbulenceModels/incompressible/turbulentTransportModels/turbulentTransportModels.C
+++ b/src/TurbulenceModels/incompressible/turbulentTransportModels/turbulentTransportModels.C
@@ -55,6 +55,9 @@ makeRASModel(SpalartAllmaras);
#include "kEpsilon.H"
makeRASModel(kEpsilon);
+#include "realizableKE.H"
+makeRASModel(realizableKE);
+
#include "LaunderSharmaKE.H"
makeRASModel(LaunderSharmaKE);
diff --git a/src/TurbulenceModels/turbulenceModels/RAS/realizableKE/realizableKE.C b/src/TurbulenceModels/turbulenceModels/RAS/realizableKE/realizableKE.C
new file mode 100644
index 000000000..397847bbf
--- /dev/null
+++ b/src/TurbulenceModels/turbulenceModels/RAS/realizableKE/realizableKE.C
@@ -0,0 +1,337 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | Copyright (C) 2011-2015 OpenFOAM Foundation
+ \\/ 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 .
+
+\*---------------------------------------------------------------------------*/
+
+#include "realizableKE.H"
+#include "bound.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace RASModels
+{
+
+// * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * * //
+
+template
+tmp realizableKE::rCmu
+(
+ const volTensorField& gradU,
+ const volScalarField& S2,
+ const volScalarField& magS
+)
+{
+ tmp tS = dev(symm(gradU));
+ const volSymmTensorField& S = tS();
+
+ volScalarField W
+ (
+ (2*sqrt(2.0))*((S&S)&&S)
+ /(
+ magS*S2
+ + dimensionedScalar("small", dimensionSet(0, 0, -3, 0, 0), SMALL)
+ )
+ );
+
+ tS.clear();
+
+ volScalarField phis
+ (
+ (1.0/3.0)*acos(min(max(sqrt(6.0)*W, -scalar(1)), scalar(1)))
+ );
+ volScalarField As(sqrt(6.0)*cos(phis));
+ volScalarField Us(sqrt(S2/2.0 + magSqr(skew(gradU))));
+
+ return 1.0/(A0_ + As*Us*k_/epsilon_);
+}
+
+
+template
+void realizableKE::correctNut
+(
+ const volTensorField& gradU,
+ const volScalarField& S2,
+ const volScalarField& magS
+)
+{
+ this->nut_ = rCmu(gradU, S2, magS)*sqr(k_)/epsilon_;
+ this->nut_.correctBoundaryConditions();
+}
+
+
+template
+void realizableKE::correctNut()
+{
+ tmp tgradU = fvc::grad(this->U_);
+ volScalarField S2(2*magSqr(dev(symm(tgradU()))));
+ volScalarField magS(sqrt(S2));
+ correctNut(tgradU(), S2, magS);
+}
+
+
+template
+tmp realizableKE::kSource() const
+{
+ return tmp
+ (
+ new fvScalarMatrix
+ (
+ k_,
+ dimVolume*this->rho_.dimensions()*k_.dimensions()
+ /dimTime
+ )
+ );
+}
+
+
+template
+tmp realizableKE::epsilonSource() const
+{
+ return tmp
+ (
+ new fvScalarMatrix
+ (
+ epsilon_,
+ dimVolume*this->rho_.dimensions()*epsilon_.dimensions()
+ /dimTime
+ )
+ );
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
+
+template
+realizableKE::realizableKE
+(
+ const alphaField& alpha,
+ const rhoField& rho,
+ const volVectorField& U,
+ const surfaceScalarField& alphaRhoPhi,
+ const surfaceScalarField& phi,
+ const transportModel& transport,
+ const word& propertiesName,
+ const word& type
+)
+:
+ eddyViscosity >
+ (
+ type,
+ alpha,
+ rho,
+ U,
+ alphaRhoPhi,
+ phi,
+ transport,
+ propertiesName
+ ),
+
+ Cmu_
+ (
+ dimensioned::lookupOrAddToDict
+ (
+ "Cmu",
+ this->coeffDict_,
+ 0.09
+ )
+ ),
+ A0_
+ (
+ dimensioned::lookupOrAddToDict
+ (
+ "A0",
+ this->coeffDict_,
+ 4.0
+ )
+ ),
+ C2_
+ (
+ dimensioned::lookupOrAddToDict
+ (
+ "C2",
+ this->coeffDict_,
+ 1.9
+ )
+ ),
+ sigmak_
+ (
+ dimensioned::lookupOrAddToDict
+ (
+ "sigmak",
+ this->coeffDict_,
+ 1.0
+ )
+ ),
+ sigmaEps_
+ (
+ dimensioned::lookupOrAddToDict
+ (
+ "sigmaEps",
+ this->coeffDict_,
+ 1.2
+ )
+ ),
+
+ k_
+ (
+ IOobject
+ (
+ "k",
+ this->runTime_.timeName(),
+ this->mesh_,
+ IOobject::MUST_READ,
+ IOobject::AUTO_WRITE
+ ),
+ this->mesh_
+ ),
+ epsilon_
+ (
+ IOobject
+ (
+ "epsilon",
+ this->runTime_.timeName(),
+ this->mesh_,
+ IOobject::MUST_READ,
+ IOobject::AUTO_WRITE
+ ),
+ this->mesh_
+ )
+{
+ bound(k_, this->kMin_);
+ bound(epsilon_, this->epsilonMin_);
+
+ if (type == typeName)
+ {
+ correctNut();
+ this->printCoeffs(type);
+ }
+}
+
+
+// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
+
+template
+bool realizableKE::read()
+{
+ if (eddyViscosity >::read())
+ {
+ Cmu_.readIfPresent(this->coeffDict());
+ A0_.readIfPresent(this->coeffDict());
+ C2_.readIfPresent(this->coeffDict());
+ sigmak_.readIfPresent(this->coeffDict());
+ sigmaEps_.readIfPresent(this->coeffDict());
+
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+}
+
+
+template
+void realizableKE::correct()
+{
+ if (!this->turbulence_)
+ {
+ return;
+ }
+
+ // Local references
+ const alphaField& alpha = this->alpha_;
+ const rhoField& rho = this->rho_;
+ const surfaceScalarField& alphaRhoPhi = this->alphaRhoPhi_;
+ const volVectorField& U = this->U_;
+ volScalarField& nut = this->nut_;
+
+ eddyViscosity >::correct();
+
+ volScalarField divU(fvc::div(fvc::absolute(this->phi(), U)));
+
+ tmp tgradU = fvc::grad(U);
+ volScalarField S2(2*magSqr(dev(symm(tgradU()))));
+ volScalarField magS(sqrt(S2));
+
+ volScalarField eta(magS*k_/epsilon_);
+ volScalarField C1(max(eta/(scalar(5) + eta), scalar(0.43)));
+
+ volScalarField G(this->GName(), nut*(tgradU() && dev(twoSymm(tgradU()))));
+
+ // Update epsilon and G at the wall
+ epsilon_.boundaryField().updateCoeffs();
+
+ // Dissipation equation
+ tmp epsEqn
+ (
+ fvm::ddt(alpha, rho, epsilon_)
+ + fvm::div(alphaRhoPhi, epsilon_)
+ - fvm::laplacian(alpha*rho*DepsilonEff(), epsilon_)
+ ==
+ C1*alpha*rho*magS*epsilon_
+ - fvm::Sp
+ (
+ C2_*alpha*rho*epsilon_/(k_ + sqrt(this->nu()*epsilon_)),
+ epsilon_
+ )
+ + epsilonSource()
+ );
+
+ epsEqn().relax();
+
+ epsEqn().boundaryManipulate(epsilon_.boundaryField());
+
+ solve(epsEqn);
+ bound(epsilon_, this->epsilonMin_);
+
+
+ // Turbulent kinetic energy equation
+
+ tmp kEqn
+ (
+ fvm::ddt(alpha, rho, k_)
+ + fvm::div(alphaRhoPhi, k_)
+ - fvm::laplacian(alpha*rho*DkEff(), k_)
+ ==
+ alpha*rho*G
+ - fvm::SuSp(2.0/3.0*alpha*rho*divU, k_)
+ - fvm::Sp(alpha*rho*epsilon_/k_, k_)
+ + kSource()
+ );
+
+ kEqn().relax();
+ solve(kEqn);
+ bound(k_, this->kMin_);
+
+ correctNut(tgradU(), S2, magS);
+}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace RASModels
+} // End namespace Foam
+
+// ************************************************************************* //
diff --git a/src/TurbulenceModels/turbulenceModels/RAS/realizableKE/realizableKE.H b/src/TurbulenceModels/turbulenceModels/RAS/realizableKE/realizableKE.H
new file mode 100644
index 000000000..2279145b2
--- /dev/null
+++ b/src/TurbulenceModels/turbulenceModels/RAS/realizableKE/realizableKE.H
@@ -0,0 +1,219 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | Copyright (C) 2011-2015 OpenFOAM Foundation
+ \\/ 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 .
+
+Class
+ Foam::RASModels::realizableKE
+
+Group
+ grpRASTurbulence
+
+Description
+ Realizable k-epsilon turbulence model for incompressible and compressible
+ flows.
+
+ Model described in the paper:
+ \verbatim
+ "A New k-epsilon Eddy Viscosity Model for High Reynolds Number
+ Turbulent Flows"
+
+ Tsan-Hsing Shih, William W. Liou, Aamir Shabbir, Zhigang Tang and
+ Jiang Zhu
+
+ Computers and Fluids Vol. 24, No. 3, pp. 227-238, 1995
+ \endverbatim
+
+ The default model coefficients correspond to the following:
+ \verbatim
+ realizableKECoeffs
+ {
+ Cmu 0.09;
+ A0 4.0;
+ C2 1.9;
+ sigmak 1.0;
+ sigmaEps 1.2;
+ }
+ \endverbatim
+
+SourceFiles
+ realizableKE.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef realizableKE_H
+#define realizableKE_H
+
+#include "RASModel.H"
+#include "eddyViscosity.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace RASModels
+{
+
+/*---------------------------------------------------------------------------*\
+ Class realizableKE Declaration
+\*---------------------------------------------------------------------------*/
+
+template
+class realizableKE
+:
+ public eddyViscosity >
+{
+
+protected:
+
+ // Protected data
+
+ // Model coefficients
+
+ dimensionedScalar Cmu_;
+ dimensionedScalar A0_;
+ dimensionedScalar C2_;
+ dimensionedScalar sigmak_;
+ dimensionedScalar sigmaEps_;
+
+
+ // Fields
+
+ volScalarField k_;
+ volScalarField epsilon_;
+
+
+ // Protected Member Functions
+
+ tmp rCmu
+ (
+ const volTensorField& gradU,
+ const volScalarField& S2,
+ const volScalarField& magS
+ );
+
+ virtual void correctNut
+ (
+ const volTensorField& gradU,
+ const volScalarField& S2,
+ const volScalarField& magS
+ );
+
+ virtual void correctNut();
+ virtual tmp kSource() const;
+ virtual tmp epsilonSource() const;
+
+
+public:
+
+ typedef typename BasicTurbulenceModel::alphaField alphaField;
+ typedef typename BasicTurbulenceModel::rhoField rhoField;
+ typedef typename BasicTurbulenceModel::transportModel transportModel;
+
+
+ //- Runtime type information
+ TypeName("realizableKE");
+
+ // Constructors
+
+ //- Construct from components
+ realizableKE
+ (
+ const alphaField& alpha,
+ const rhoField& rho,
+ const volVectorField& U,
+ const surfaceScalarField& alphaRhoPhi,
+ const surfaceScalarField& phi,
+ const transportModel& transport,
+ const word& propertiesName = turbulenceModel::propertiesName,
+ const word& type = typeName
+ );
+
+
+ //- Destructor
+ virtual ~realizableKE()
+ {}
+
+
+ // Member Functions
+
+ //- Re-read model coefficients if they have changed
+ virtual bool read();
+
+ //- Return the effective diffusivity for k
+ tmp DkEff() const
+ {
+ return tmp
+ (
+ new volScalarField
+ (
+ "DkEff",
+ (this->nut_/sigmak_ + this->nu())
+ )
+ );
+ }
+
+ //- Return the effective diffusivity for epsilon
+ tmp DepsilonEff() const
+ {
+ return tmp
+ (
+ new volScalarField
+ (
+ "DepsilonEff",
+ (this->nut_/sigmaEps_ + this->nu())
+ )
+ );
+ }
+
+ //- Return the turbulence kinetic energy
+ virtual tmp k() const
+ {
+ return k_;
+ }
+
+ //- Return the turbulence kinetic energy dissipation rate
+ virtual tmp epsilon() const
+ {
+ return epsilon_;
+ }
+
+ //- Solve the turbulence equations and correct the turbulence viscosity
+ virtual void correct();
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace RASModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#ifdef NoRepository
+# include "realizableKE.C"
+#endif
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //