Picking the wrong turbulence model doesn't just affect accuracy — it can cause divergence, wrong wall shear stress, and badly predicted separation. This guide explains when to use kOmegaSST versus kEpsilon versus Spalart-Allmaras, how to set correct inlet values for each, what y+ your mesh needs, and how to configure the model in constant/momentumTransport (or turbulenceProperties in older OpenFOAM versions).
All three main RANS models are two-equation models (or one-equation for SA), but they behave very differently near walls and in adverse pressure gradients:
// constant/momentumTransport (OpenFOAM v2106+)
simulationType RAS;
RAS
{
model kOmegaSST;
turbulence on;
printCoeffs on;
}
For older versions the file is constant/turbulenceProperties with identical syntax.
You need initial values for k and omega. Compute them from turbulence intensity I (typically 0.01–0.10) and a turbulence length scale L:
// U_ref = 20 m/s, I = 0.05, L = 0.1 m
// k = 1.5 * (U * I)^2 = 1.5 * (20 * 0.05)^2 = 1.5 m²/s²
// omega = k^0.5 / (C_mu^0.25 * L) = 1.225 / (0.3 * 0.1) ≈ 40.8 1/s
// 0/k — inlet
inlet
{
type fixedValue;
value uniform 1.5;
}
// 0/omega — inlet
inlet
{
type fixedValue;
value uniform 40.8;
}
// 0/nut — inlet (typically 0 or small value)
inlet
{
type calculated;
value uniform 0;
}
kOmegaSST has a blended near-wall formulation — it can run in both low-Re (y+ ≈ 1) and high-Re (y+ 30–300) modes. In low-Re mode no wall functions are needed for k and omega; set k = 0 at the wall and use omegaWallFunction for omega (it handles both regimes internally).
// 0/k — walls (low-Re resolved BL)
walls
{
type fixedValue;
value uniform 0;
}
// 0/omega — walls (works for both y+ regimes)
walls
{
type omegaWallFunction;
value uniform 1;
}
// 0/nut — walls
walls
{
type nutkWallFunction;
value uniform 0;
}
kOmegaSST is the right default for attached and mildly separated flows, but it has a well-documented failure mode at high angles of attack: it over-predicts attached flow and systematically delays or suppresses stall. Understanding why matters more than just knowing to switch models.
All RANS models compute turbulent stresses via the Boussinesq hypothesis: turbulent stresses are proportional to mean strain rate via a scalar eddy viscosity. In strongly separated regions, the eddy viscosity grows large — it artificially diffuses momentum and keeps the boundary layer attached longer than it physically is. The kOmegaSST strain-vorticity limiter (the F2 blending function) reduces this effect compared to plain kOmega, but not enough to capture massively separated flows correctly.
The second problem is that post-stall is inherently unsteady — vortex shedding, intermittent reattachment, dynamic stall cycles. Steady-state RANS cannot capture this by construction. Even a perfect turbulence model would fail in steady mode above stall.
At high angles of attack, the adverse pressure gradient and separation point move upstream and the wake grows substantially. Two regions become critical:
A skewness above ~10–12 in the curved boundary layer region degrades gradient accuracy precisely where the pressure gradient is steepest. If your checkMesh reports maximum skewness above 10 near the aerofoil surface, fix it before interpreting high-AoA results.
// constant/momentumTransport
simulationType RAS;
RAS
{
model realizableKE; // or: kEpsilon for standard
turbulence on;
printCoeffs on;
}
// U_ref = 20 m/s, I = 0.05, L = 0.1 m
// k = 1.5 m²/s² (same formula)
// epsilon = C_mu^0.75 * k^1.5 / L = 0.09^0.75 * 1.5^1.5 / 0.1 ≈ 17.1 m²/s³
// 0/k — inlet
inlet
{
type fixedValue;
value uniform 1.5;
}
// 0/epsilon — inlet
inlet
{
type fixedValue;
value uniform 17.1;
}
kEpsilon always requires wall functions. Never use y+ ≈ 1 with kEpsilon — the model equations are not valid in the viscous sublayer. Target y+ between 30 and 300. Wall patches need epsilonWallFunction and kqRWallFunction:
// 0/epsilon — walls
walls
{
type epsilonWallFunction;
value uniform 0;
}
// 0/k — walls
walls
{
type kqRWallFunction;
value uniform 0;
}
SA uses a single transport equation for the modified turbulent viscosity nuTilda. It is very robust and ideal when you want a reliable converged solution without worrying about y+ requirements (it works across both y+ regimes).
// constant/momentumTransport
RAS
{
model SpalartAllmaras;
turbulence on;
}
// 0/nuTilda — inlet (typical: 3-5 * nu)
// nu_air = 1.5e-5 m²/s
inlet
{
type fixedValue;
value uniform 4.5e-5;
}
// 0/nuTilda — walls
walls
{
type fixedValue;
value uniform 0;
}
Large Eddy Simulation resolves large eddies directly and models only the sub-grid scale (SGS) motions. LES is far more expensive than RANS but necessary for accurately capturing unsteady flow structures, noise generation, and large-scale separation.
The classic SGS model. Simple and robust, but slightly overdissipative. Works well for isotropic turbulence and basic shear flows.
// constant/momentumTransport
simulationType LES;
LES
{
model Smagorinsky;
turbulence on;
Smagorinsky
{
Ck 0.094;
Ce 1.048;
}
}
Wall-Adapting Local Eddy-viscosity (WALE) gives zero SGS viscosity in laminar shear regions and near solid walls, making it more accurate for wall-bounded flows without requiring van Driest damping functions.
// constant/momentumTransport
LES
{
model WALE;
turbulence on;
WALE
{
Ck 0.094;
Ce 1.048;
Cw 0.325;
}
}
For LES, boundary conditions are typically the same as RANS for the mean quantities. The SGS model fields (nut, k) are usually initialised to zero and develop from the resolved flow field.
Detached Eddy Simulation (DES) and Scale-Adaptive Simulation (SAS) are hybrid approaches that apply RANS near solid walls and switch to a LES-like mode in detached regions. They are the practical solution for post-stall aerodynamics, bluff body wakes, and any case where full LES is too expensive but steady RANS is known to be wrong.
DES uses the RANS length scale (ω-based) near walls and replaces it with the local mesh size in separated zones, triggering the Smagorinsky SGS model implicitly. The transition between RANS and LES regions is controlled automatically by comparing the RANS length scale to the local cell size Δ.
// constant/momentumTransport
simulationType LES; // DES is declared under LES in OpenFOAM
LES
{
model kOmegaSSTDES;
turbulence on;
printCoeffs on;
}
Boundary conditions for k, omega, and nut are identical to kOmegaSST — DES does not change the near-wall treatment. DES must be run as transient (PIMPLE). A Courant number below 1 is the minimum; target Co < 0.5 in the detached region for accurate eddy resolution.
Mesh requirement: the wake and separation zone need a mesh fine enough to resolve the dominant eddies. A good rule of thumb is that the cells in the separated region should be roughly isotropic (aspect ratio near 1). Highly stretched wake cells degrade DES accuracy significantly.
SAS modifies the kOmegaSST equations to include a von Kármán length scale term that makes the model self-adapt to resolved flow structures. It is less aggressive than DES — it activates LES-like behaviour only in highly unsteady regions — but requires no special mesh treatment at the RANS/LES interface.
// constant/momentumTransport
simulationType RAS; // SAS is declared under RAS
RAS
{
model kOmegaSSTSAS;
turbulence on;
}
SAS is a good intermediate step: cheaper to set up than DES (no LES mesh requirements in the separation zone), and more physically consistent than URANS for strongly unsteady separated flows. If SAS gives unsteady results that match experiment reasonably well, there is often no need to go to full DES.
The k-kl-omega model (also called the Walters-Cokljat transition model) predicts laminar-to-turbulent transition. It solves three transport equations: turbulent kinetic energy k_t, laminar kinetic energy k_l, and specific dissipation rate omega. It is appropriate when boundary layer transition location significantly affects the flow or drag.
// constant/momentumTransport
RAS
{
model kkLOmega;
turbulence on;
}
// 0/kt — inlet
inlet
{
type fixedValue;
value uniform 0.001; // small value; transition is predicted internally
}
// 0/kl — inlet
inlet
{
type fixedValue;
value uniform 0;
}
This model requires a well-resolved boundary layer mesh (y+ ≈ 1) and is significantly more sensitive to initial conditions than kOmegaSST. Transition models are not recommended unless the transition location is known to substantially affect your quantity of interest.
The γ-Reθ model (Langtry-Menter, also called SST transition model) is the standard approach for flows where boundary layer transition drives the result — typically Re < 5×10⁵. At these Reynolds numbers, a laminar separation bubble (LSB) forms on the suction side of an aerofoil: the laminar boundary layer separates, transitions to turbulent, and either reattaches (forming the LSB) or bursts into full separation. The stall angle depends almost entirely on whether the bubble bursts. Neither kOmegaSST nor k-kl-omega models this mechanism reliably.
Two additional transport equations are solved on top of kOmegaSST:
The transition onset is driven by the free-stream turbulence intensity (Tu) and a pressure gradient parameter. Getting Tu right at the inlet is therefore critical — it directly sets the predicted transition location.
// constant/momentumTransport
simulationType RAS;
RAS
{
model gammaReThetatSST;
turbulence on;
printCoeffs on;
}
Four fields are required in 0/:
// 0/gamma — intermittency
internalField uniform 1; // 1 = turbulent initial field (let it develop)
inlet
{
type fixedValue;
value uniform 1;
}
walls
{
type zeroGradient;
}
// 0/ReThetat — transition onset Re_theta
internalField uniform 100; // rough estimate; model will compute correct value
inlet
{
type fixedValue;
value uniform 100;
}
walls
{
type zeroGradient;
}
// k and omega — same as kOmegaSST, but k at inlet must reflect true Tu
// Tu = 0.1% → k = 1.5 * (U * 0.001)^2
The Langtry-Menter correlation was calibrated on flat-plate and NACA profile data at moderate Re. It can under-predict the stall angle when the LSB is at the leading edge (short bubble) because the reattachment length is sensitive to the local pressure gradient in ways the correlation doesn't fully capture. If you observe early stall with γ-Reθ despite correct Tu, check the mesh resolution at the leading edge (at least 5–6 cells across the bubble region is a starting point) and consider running a sensitivity study on the inlet Tu.
OpenFOAM uses standard model coefficients by default. In most cases these should not be changed. However, for specific applications, validated coefficient adjustments exist:
Cmu 0.033, C1 1.176, C2 1.92, sigmaEps 1.3 for better ABL predictions.C3 coefficient controls buoyancy production; use C3 -0.33 for stable stratification.// Adjusting model coefficients in constant/momentumTransport
RAS
{
model kEpsilon;
turbulence on;
kEpsilonCoeffs
{
Cmu 0.033;
C1 1.176;
C2 1.92;
sigmaEps 1.3;
}
}
Upload your case and CFDpilot recommends the correct model, inlet values, and wall treatment based on your flow regime.
Check my setup →Use kOmegaSST whenever you have wall-bounded flows, adverse pressure gradients, or mild separation — external aerodynamics, aerofoils, or internal duct flows where wall shear stress accuracy matters. Use kEpsilon (realizable) for free shear flows (jets, wakes, mixing layers) where wall accuracy is less critical.
kOmegaSST has a blended near-wall formulation. For full boundary layer resolution (low-Re mode), target y+ approximately 1 with at least 10 cells across the boundary layer. For wall function mode (high-Re), target y+ between 30 and 300. Avoid y+ values between 5 and 30 — the buffer layer where both approaches are inaccurate.
In OpenFOAM v2106 and later, use constant/momentumTransport. In older versions (Foundation and ESI up to v2012), use constant/turbulenceProperties. The syntax inside the file is identical — only the filename changes.
No. kEpsilon is not valid in the viscous sublayer. Its wall functions assume the first cell is in the log-law region (y+ between 30 and 300). Using kEpsilon with y+ near 1 produces incorrect wall shear stress and turbulence quantities. Switch to kOmegaSST if you need to resolve the boundary layer.
Smagorinsky is simpler and works well for isotropic turbulence but overpredicts SGS viscosity in laminar and near-wall regions. WALE gives zero SGS viscosity in laminar shear regions and near walls without requiring van Driest damping, making it more accurate for wall-bounded LES simulations.
Use the formula: omega = k^0.5 / (C_mu^0.25 * L), where C_mu = 0.09, k is the turbulent kinetic energy, and L is the turbulence length scale (typically 0.07 times the hydraulic diameter for pipe flows). Alternatively: omega = epsilon / (C_mu * k) if you have computed epsilon first.
RANS models including kOmegaSST systematically over-predict attached flow at high angles of attack. The Boussinesq hypothesis produces high eddy viscosity in the separation zone, which artificially suppresses the instabilities that cause stall. Additionally, post-stall flow is inherently unsteady — steady RANS cannot capture it regardless of model quality. Switch to transient PIMPLE (URANS) for stall onset, and to kOmegaSSTDES for post-stall prediction.
DES (kOmegaSSTDES) explicitly switches from RANS to an LES-like mode based on a comparison between the RANS length scale and local mesh size — it requires the mesh in the separated zone to be fine enough to support the switch. SAS (kOmegaSSTSAS) adds a von Kármán length scale term to the RANS equations, letting the model self-adapt to resolved unsteadiness without needing special mesh treatment at the interface. SAS is easier to set up; DES is more physically rigorous for massively separated flows.
Use gammaReThetatSST when the transition location significantly affects your quantity of interest — typically Re < 5×10⁵ for external aerodynamics. At these Reynolds numbers, a laminar separation bubble forms on the suction side and the stall angle depends on whether it reattaches or bursts. kOmegaSST assumes fully turbulent flow from the leading edge and cannot model this mechanism. The gammaReTheta model requires y+ ≈ 1 and a correctly specified inlet turbulence intensity (Tu) — the transition onset correlation is calibrated against Tu.