diff --git a/src/TurbulenceModels/Allwmake b/src/TurbulenceModels/Allwmake
index fb0c219f58..d76497d667 100755
--- a/src/TurbulenceModels/Allwmake
+++ b/src/TurbulenceModels/Allwmake
@@ -9,6 +9,7 @@ set -x
wmake $targetType turbulenceModels
wmake $targetType incompressible
wmake $targetType compressible
+wmake $targetType schemes
wmakeLnInclude phaseIncompressible
wmakeLnInclude phaseCompressible
diff --git a/src/TurbulenceModels/schemes/DEShybrid/DEShybrid.C b/src/TurbulenceModels/schemes/DEShybrid/DEShybrid.C
new file mode 100644
index 0000000000..d18c0f007b
--- /dev/null
+++ b/src/TurbulenceModels/schemes/DEShybrid/DEShybrid.C
@@ -0,0 +1,36 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | Copyright (C) 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 "fvMesh.H"
+#include "DEShybrid.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+ makeSurfaceInterpolationScheme(DEShybrid);
+}
+
+// ************************************************************************* //
diff --git a/src/TurbulenceModels/schemes/DEShybrid/DEShybrid.H b/src/TurbulenceModels/schemes/DEShybrid/DEShybrid.H
new file mode 100644
index 0000000000..e7607005ea
--- /dev/null
+++ b/src/TurbulenceModels/schemes/DEShybrid/DEShybrid.H
@@ -0,0 +1,413 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | Copyright (C) 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 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
+ Foam::DEShybrid
+
+Description
+ Hybrid convection scheme of Travin et al. for hybrid RAS/LES calculations.
+ The scheme blends between a low-dissipative convection scheme within the
+ LES region (e.g. linear) and a numerically more robust convection scheme in
+ the RAS region (e.g. upwind-biased schemes).
+
+ The routine calculates the blending factor denoted as "sigma" in the
+ literature reference, where 0 <= sigma <= sigmaMax, which is then employed
+ to set the weights:
+ \f[
+ weight = (1-sigma) w_1 + sigma w_2
+ \f]
+
+ where
+ \vartable
+ sigma | blending factor
+ w_1 | scheme 1 weights
+ w_2 | scheme 2 weights
+ \endvartable
+
+ Reference:
+ \verbatim
+ A. Travin, M. Shur, M. Strelets, P. Spalart (2000).
+ Physical and numerical upgrades in the detached-eddy simulation of
+ complex turbulent flows.
+ In Proceedings of the 412th Euromech Colloquium on LES and Complex
+ Transition and Turbulent Flows, Munich, Germany
+ \endverbatim
+
+ Example of the DEShybrid scheme specification using linear within the LES
+ region and linearUpwind within the RAS region:
+ \verbatim
+ divSchemes
+ {
+ .
+ .
+ div(phi,U) Gauss DEShybrid
+ linear // scheme 1
+ linearUpwind grad(U) // scheme 2
+ 0.65 // DES coefficient, typically = 0.65
+ 10 // Reference time scale (Uref/Lref)
+ 1; // Maximum sigma limit (0-1)
+ .
+ .
+ }
+ \endverbatim
+
+Notes
+ - Scheme 1 should be linear (or other low-dissipative schemes) which will
+ be used in the detached/vortex shedding regions.
+ - Scheme 2 should be an upwind/deferred correction/TVD scheme which will
+ be used in the free-stream/Euler/boundary layer regions.
+
+SourceFiles
+ DEShybrid.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef DEShybrid_H
+#define DEShybrid_H
+
+#include "surfaceInterpolationScheme.H"
+#include "surfaceInterpolate.H"
+#include "fvcGrad.H"
+#include "blendedSchemeBase.H"
+#include "turbulentTransportModel.H"
+#include "turbulentFluidThermoModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+/*---------------------------------------------------------------------------*\
+ class DEShybrid Declaration
+\*---------------------------------------------------------------------------*/
+
+template
+class DEShybrid
+:
+ public surfaceInterpolationScheme,
+ public blendedSchemeBase
+{
+ // Private Data
+
+ //- Scheme 1
+ tmp > tScheme1_;
+
+ //- Scheme 2
+ tmp > tScheme2_;
+
+ //- DES Coefficient
+ scalar CDES_;
+
+ //- Time scale coefficient [1/s]
+ dimensionedScalar invTau_;
+
+ //- Maximum bound for sigma (limited to 1)
+ scalar sigmaMax_;
+
+ //- Lower limit for `B' coefficient
+ dimensionedScalar B0_;
+
+ //- Small length scale to avoid division by zero
+ dimensionedScalar d0_;
+
+ //- Disallow default bitwise copy construct
+ DEShybrid(const DEShybrid&);
+
+ //- Disallow default bitwise assignment
+ void operator=(const DEShybrid&);
+
+
+ // Private Member Functions
+
+ //- Calculate the blending factor
+ tmp calcBlendingFactor
+ (
+ const GeometricField& vf,
+ const volScalarField& nuEff,
+ const volVectorField& U,
+ const volScalarField& delta
+ ) const
+ {
+ tmp gradU(fvc::grad(U));
+ const volScalarField S(sqrt(2.0)*mag(symm(gradU())));
+ const volScalarField Omega(sqrt(2.0)*mag(skew(gradU())));
+ const volScalarField magSqrGradU(magSqr(gradU));
+
+ const volScalarField B
+ (
+ 0.5*Omega*max(S, Omega)
+ /max(0.5*magSqrGradU, B0_)
+ );
+ const volScalarField K
+ (
+ max(Foam::sqrt(0.5*magSqrGradU), 0.1*invTau_)
+ );
+ const volScalarField lTurb(Foam::sqrt(nuEff/(pow(0.09, 1.5)*K)));
+ const volScalarField g(tanh(pow4(B)));
+ const volScalarField A
+ (
+ max(scalar(0), CDES_*delta/max(lTurb*g, d0_) - 0.5)
+ );
+ const surfaceScalarField Af(fvc::interpolate(A));
+
+ return tmp
+ (
+ new surfaceScalarField
+ (
+ vf.name() + "BlendingFactor",
+ max(sigmaMax_*tanh(pow3(Af)), scalar(0))
+ )
+ );
+ }
+
+
+public:
+
+ //- Runtime type information
+ TypeName("DEShybrid");
+
+
+ // Constructors
+
+ //- Construct from mesh and Istream.
+ // The name of the flux field is read from the Istream and looked-up
+ // from the mesh objectRegistry
+ DEShybrid(const fvMesh& mesh, Istream& is)
+ :
+ surfaceInterpolationScheme(mesh),
+ tScheme1_
+ (
+ surfaceInterpolationScheme::New(mesh, is)
+ ),
+ tScheme2_
+ (
+ surfaceInterpolationScheme::New(mesh, is)
+ ),
+ CDES_(readScalar(is)),
+ invTau_("invTau", dimless/dimTime, readScalar(is)),
+ sigmaMax_(readScalar(is)),
+ B0_("B0", dimless/sqr(dimTime), 1e-20),
+ d0_("d0", dimLength, SMALL)
+ {
+ if (invTau_.value() <= 0)
+ {
+ FatalErrorIn("DEShybrid(const fvMesh&, Istream&)")
+ << "invTau coefficient must be greater than 0. "
+ << "Current value: " << invTau_ << exit(FatalError);
+ }
+ if (sigmaMax_ > 1)
+ {
+ FatalErrorIn("DEShybrid(const fvMesh&, Istream&)")
+ << "sigmaMax coefficient must be less than or equal to 1. "
+ << "Current value: " << sigmaMax_ << exit(FatalError);
+ }
+ }
+
+ //- Construct from mesh, faceFlux and Istream
+ DEShybrid
+ (
+ const fvMesh& mesh,
+ const surfaceScalarField& faceFlux,
+ Istream& is
+ )
+ :
+ surfaceInterpolationScheme(mesh),
+ tScheme1_
+ (
+ surfaceInterpolationScheme::New(mesh, faceFlux, is)
+ ),
+ tScheme2_
+ (
+ surfaceInterpolationScheme::New(mesh, faceFlux, is)
+ ),
+ CDES_(readScalar(is)),
+ invTau_("invTau", dimless/dimTime, readScalar(is)),
+ sigmaMax_(readScalar(is)),
+ B0_("B0", dimless/sqr(dimTime), 1e-20),
+ d0_("d0", dimLength, SMALL)
+ {
+ if (invTau_.value() <= 0)
+ {
+ FatalErrorIn("DEShybrid(const fvMesh&, Istream&)")
+ << "invTau coefficient must be greater than 0. "
+ << "Current value: " << invTau_ << exit(FatalError);
+ }
+ if (sigmaMax_ > 1)
+ {
+ FatalErrorIn("DEShybrid(const fvMesh&, Istream&)")
+ << "sigmaMax coefficient must be less than or equal to 1. "
+ << "Current value: " << sigmaMax_ << exit(FatalError);
+ }
+ }
+
+
+ // Member Functions
+
+ //- Return the face-based blending factor
+ virtual tmp blendingFactor
+ (
+ const GeometricField& vf
+ ) const
+ {
+ const fvMesh& mesh = this->mesh();
+
+ typedef compressible::turbulenceModel cmpModel;
+ typedef incompressible::turbulenceModel icoModel;
+
+ // Assuming that LES delta field is called "delta"
+ const volScalarField& delta = this->mesh().template
+ lookupObject("delta");
+
+ // Could avoid the compressible/incompressible case by looking
+ // up all fields from the database - but retrieving from model
+ // ensures consistent fields are being employed e.g. for multiphase
+ // where group name is used
+
+ if (mesh.foundObject(icoModel::propertiesName))
+ {
+ const icoModel& model =
+ mesh.lookupObject(icoModel::propertiesName);
+
+ return calcBlendingFactor(vf, model.nuEff(), model.U(), delta);
+ }
+ else if (mesh.foundObject(cmpModel::propertiesName))
+ {
+ const cmpModel& model =
+ mesh.lookupObject(cmpModel::propertiesName);
+
+ return calcBlendingFactor
+ (
+ vf, model.muEff()/model.rho(), model.U(), delta
+ );
+ }
+ else
+ {
+ FatalErrorIn
+ (
+ "virtual tmp DEShybrid::blendingFactor"
+ "("
+ "const GeometricField&"
+ ") const"
+ )
+ << "Scheme requires a turbulence model to be present. "
+ << "Unable to retrieve turbulence model from the mesh "
+ << "database" << exit(FatalError);
+
+ return tmp(NULL);
+ }
+ }
+
+
+ //- Return the interpolation weighting factors
+ tmp weights
+ (
+ const GeometricField& vf
+ ) const
+ {
+ surfaceScalarField bf(blendingFactor(vf));
+
+ return
+ (scalar(1) - bf)*tScheme1_().weights(vf)
+ + bf*tScheme2_().weights(vf);
+ }
+
+
+ //- Return the face-interpolate of the given cell field
+ // with explicit correction
+ tmp >
+ interpolate
+ (
+ const GeometricField& vf
+ ) const
+ {
+ surfaceScalarField bf(blendingFactor(vf));
+
+ return
+ (scalar(1) - bf)*tScheme1_().interpolate(vf)
+ + bf*tScheme2_().interpolate(vf);
+ }
+
+
+ //- Return true if this scheme uses an explicit correction
+ virtual bool corrected() const
+ {
+ return tScheme1_().corrected() || tScheme2_().corrected();
+ }
+
+
+ //- Return the explicit correction to the face-interpolate
+ // for the given field
+ virtual tmp >
+ correction
+ (
+ const GeometricField& vf
+ ) const
+ {
+ surfaceScalarField bf(blendingFactor(vf));
+
+ if (tScheme1_().corrected())
+ {
+ if (tScheme2_().corrected())
+ {
+ return
+ (
+ (scalar(1) - bf)
+ * tScheme1_().correction(vf)
+ + bf
+ * tScheme2_().correction(vf)
+ );
+ }
+ else
+ {
+ return
+ (
+ (scalar(1) - bf)
+ * tScheme1_().correction(vf)
+ );
+ }
+ }
+ else if (tScheme2_().corrected())
+ {
+ return (bf*tScheme2_().correction(vf));
+ }
+ else
+ {
+ return tmp >
+ (
+ NULL
+ );
+ }
+ }
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/TurbulenceModels/schemes/Make/files b/src/TurbulenceModels/schemes/Make/files
new file mode 100644
index 0000000000..49f0357b64
--- /dev/null
+++ b/src/TurbulenceModels/schemes/Make/files
@@ -0,0 +1,3 @@
+DEShybrid/DEShybrid.C
+
+LIB = $(FOAM_LIBBIN)/libturbulenceModelSchemes
\ No newline at end of file
diff --git a/src/TurbulenceModels/schemes/Make/options b/src/TurbulenceModels/schemes/Make/options
new file mode 100644
index 0000000000..29eef672df
--- /dev/null
+++ b/src/TurbulenceModels/schemes/Make/options
@@ -0,0 +1,17 @@
+EXE_INC = \
+ -I$(LIB_SRC)/transportModels \
+ -I$(LIB_SRC)/transportModels/compressible/lnInclude \
+ -I$(LIB_SRC)/TurbulenceModels/turbulenceModels/lnInclude \
+ -I$(LIB_SRC)/TurbulenceModels/incompressible/lnInclude \
+ -I$(LIB_SRC)/TurbulenceModels/compressible/lnInclude \
+ -I$(LIB_SRC)/thermophysicalModels/basic/lnInclude \
+ -I$(LIB_SRC)/finiteVolume/lnInclude
+
+LIB_LIBS = \
+ -lcompressibleTransportModels \
+ -lturbulenceModels \
+ -lincompressibleTurbulenceModels \
+ -lincompressibleTransportModels \
+ -lcompressibleTurbulenceModels \
+ -lfluidThermophysicalModels \
+ -lfiniteVolume