Skip to content
Draft. This manual is new and still being checked against the software as it is verified. Some pages will change. If something here does not match what you see, the software is right — tell us and we will fix the page.

Choosing a turbulence model

The Models panel offers sixteen. The default is k-omega SST, and for most external flow that is the right answer — but the panel makes you look at the choice rather than hiding it, because the model is one of the few settings that can move the answer by more than the mesh does.

This page is about what the choice actually is. Not a survey of sixteen models: the two families most people pick between, what each one is assuming, and where each one is wrong.


Turbulence is not a separate physical process that needs its own equation. The Navier–Stokes equations already contain it. The problem is scale: a turbulent flow contains eddies from the size of the body down to the millimetre or below, and resolving all of them in space and time is out of reach for any geometry you would put in this application.

So the equations are averaged. Averaging a nonlinear equation leaves a residue — the average of a product is not the product of the averages — and that residue appears as an extra stress term, the Reynolds stress, representing momentum transported by the fluctuations that were averaged away.

There is no equation for it. Every RANS turbulence model is a guess at that term.

That is the whole of it, and it is worth holding on to, because it explains everything else on this page: the models disagree because they are different guesses at a quantity nobody has an equation for, and no amount of mesh refinement makes the guess better.

flowchart TD
N["Navier–Stokes<br/>contains all turbulence"]
N --> R["Average in time<br/>(RANS)"]
N --> L["Filter in space<br/>(LES / DES)"]
R --> RS["A Reynolds stress term<br/>with no equation for it"]
RS --> E["Eddy viscosity models<br/>k-epsilon, k-omega, SST, S-A"]
RS --> RSM["Reynolds stress models<br/>LRR, SSG — solve the stresses directly"]
L --> LS["Large eddies resolved,<br/>small ones modelled"]
LS --> T["Transient by construction.<br/>Cannot be run steady"]

Almost every model on the list — everything except the RSM pair and the scale-resolving options — makes the same simplification first: the Reynolds stress acts like a viscosity. Turbulence is treated as if it thickened the fluid, with an eddy viscosity that varies through the flow and is aligned with the local strain rate.

This is a big assumption and it is a good one in most places. It is wrong where turbulence is strongly anisotropic — swirl, strong streamline curvature, the secondary flows in a non-circular duct — because a scalar viscosity cannot produce stresses that differ by direction. If your flow is one of those, no amount of choosing between k-epsilon and k-omega SST helps; they share the assumption that is failing.

Having assumed an eddy viscosity, a two-equation model then needs to construct it from a velocity scale and a length scale, and transports two quantities to get them. The choice of which two is where k-epsilon and k-omega differ.


Transports turbulent kinetic energy k and its dissipation rate epsilon.

It was calibrated on free shear flows — jets, wakes, mixing layers away from walls — and it is very good at those. It is robust, it converges readily, and for confined flows where the interesting physics is in the bulk rather than at the wall it remains a sensible choice. A great deal of industrial internal-flow CFD is done with it for good reasons.

Two things it is not:

It is not a near-wall model. The standard form is a high-Reynolds-number formulation: it is not valid through the viscous sublayer and depends on wall functions to bridge the gap. That is a legitimate way to work, but it means the model’s answer at the wall is coming from the log law rather than from the model.

It does not predict separation well. In an adverse pressure gradient it over-predicts the eddy viscosity, which over-predicts the momentum transported into the near-wall region, which keeps the boundary layer attached longer than it should be. On a bluff body or a diffuser or an aerofoil near stall, this is not a small error — separating in the wrong place moves the pressure distribution, and pressure drag is usually the larger part of the drag.

The realizable and RNG variants improve on the standard form in specific ways — realizable enforces a physical constraint on the normal stresses and does better in strongly strained flow; RNG is derived differently and does better with rapid strain. Neither changes the fundamental near-wall picture.


k-omega transports k and the specific dissipation rate omega instead. The practical consequence is that the model integrates cleanly to the wall: it is valid through the viscous sublayer, so it can resolve the boundary layer rather than bridging it.

Plain k-omega has a well-known weakness in the other direction: it is sensitive to the freestream value of omega. The answer inside the boundary layer depends on what you set at the inlet, which is not a property you want a model to have.

k-omega SST is Menter’s response, and understanding it is most of what you need. It does two things:

  1. Blends. It uses k-omega near the wall, where k-omega is strong, and switches to k-epsilon behaviour in the freestream, where k-epsilon is insensitive to inlet conditions. A blending function does the switching based on distance from the wall.
  2. Limits the shear stress. It caps the eddy viscosity so that the turbulent shear stress cannot exceed a bound derived from the turbulent kinetic energy.

The second is the one that matters. That limiter is precisely what stops the over-prediction of eddy viscosity in an adverse pressure gradient — the mechanism that makes k-epsilon keep the flow attached too long. It is why SST predicts separation onset far better, and why it is the default here and the default nearly everywhere that external aerodynamics is done.

It is not free of failure modes. SST tends to be conservative once separated — predicting a larger separated region than reality in some configurations — and like every eddy viscosity model it cannot represent anisotropy.


Spalart-Allmaras. One transport equation for a modified eddy viscosity. Built for external aerodynamics and attached boundary layers, cheap, robust, and still widely used in aerospace. Not intended for free shear flows or massive separation.

GEKO. A tunable k-omega formulation whose coefficients can be moved to span the behaviour of several models rather than committing to one. Useful if you have data to tune against. Note it is specific to recent ESI releases.

Reynolds stress models (LRR, SSG). Abandon the eddy viscosity assumption and transport the six stress components directly, plus a length scale. Seven equations instead of two. They can represent anisotropy, which is the reason to use them — swirl, secondary flows, strong curvature. They cost more, they are harder to converge, and they need a good mesh. Reach for one when you have a specific reason the eddy viscosity assumption is failing, not as a general upgrade.

Transition models (k-omega SST LM). Every model above assumes the boundary layer is turbulent everywhere. If a meaningful part of your surface is laminar — low Reynolds number, small chord, a clean leading edge — that assumption over-predicts friction drag and misses laminar separation entirely. Transition models predict where transition happens instead of assuming it has already happened. They need the sublayer resolved and a well-specified inlet turbulence state; run without either, they cannot do the job.

LES, and the hybrids (SA-DDES, SST-IDDES). These stop averaging and start filtering: the large, geometry-dependent eddies are resolved and only the small ones are modelled. This is a different bargain, not a better model. It requires a transient run, a mesh that is fine in all three directions in the region of interest, a time step tied to the Courant number, and a run long enough to average over. In exchange you get unsteady structure that RANS cannot produce. The DES hybrids use RANS in the boundary layer and LES in the separated region, which is the pragmatic compromise for bluff-body wakes.

Laminar. Not a turbulence model — the statement that there is no turbulence. Correct below the transition Reynolds number and wrong above it, and the transition Reynolds number depends on the geometry.


Situation The failure
k-epsilon on a bluff body, a diffuser, or an aerofoil near stall Separation predicted too late or not at all; pressure drag and lift both wrong
k-omega (plain) with an unconsidered inlet turbulence specification The boundary layer answer depends on a freestream value you guessed
Any RANS model on a flow with strong swirl or secondary flow The eddy viscosity assumption cannot produce anisotropic stress; the model is not the problem, the family is
Any fully turbulent model on a low-Reynolds-number or short-chord body Friction drag over-predicted; laminar separation missed entirely
A transition model on a wall-function mesh It cannot predict transition without the sublayer resolved
LES or DES run steady Not possible — these are transient formulations
Any RANS model on a genuinely unsteady flow You get a steady answer to a flow that has none. See Steady or transient
Laminar above the transition Reynolds number Under-predicts mixing and friction, usually badly

flowchart TD
S["What is the answer about?"]
S --> A["Separation, stall, wake,<br/>adverse pressure gradient"]
S --> B["Attached external<br/>aerodynamics"]
S --> C["Confined internal flow,<br/>mixing away from walls"]
S --> D["Swirl, strong curvature,<br/>duct secondary flow"]
S --> E["Unsteady structure is<br/>the point of the run"]
A --> A1["k-omega SST"]
B --> B1["k-omega SST or<br/>Spalart-Allmaras"]
C --> C1["k-epsilon family"]
D --> D1["A Reynolds stress model"]
E --> E1["LES, or a DES hybrid"]
A1 --> Z["Then check whether the answer<br/>depends on the choice"]
B1 --> Z
C1 --> Z
D1 --> Z
E1 --> Z

The last box is the point of the page. The way to find out whether the model choice matters for your case is to run two and compare. Duplicate the simulation, change the model, run it on the same mesh, and read the two off the Comparison panel side by side.

If the answer barely moves, you have shown the result is not model-dependent, which is a stronger claim than choosing the right model in the first place. If it moves a lot, that is not a failure of the study — that is the result. It tells you the number carries a model uncertainty, roughly how big it is, and that any report quoting it should say so. Quietly picking whichever of the two you prefer is how a spurious precision gets into a document.

Note that a model comparison is only meaningful once the mesh study is done: two models that differ by less than your mesh uncertainty have not been distinguished. See Mesh independence.


Two things the application does around the choice

Section titled “Two things the application does around the choice”

Changing the model re-derives the field set. k-epsilon solves for k and epsilon; k-omega SST solves for k and omega; Spalart-Allmaras solves for a modified viscosity. These are not the same fields. When you change the model, the fields change with it, and boundary conditions set on fields that no longer exist are discarded rather than kept as invisible dead entries.

Inlet turbulence is specified as intensity and length scale. You do not type k, omega or epsilon — you give a turbulence intensity and a length scale, which are quantities you can reason about physically, and the values are derived from them. This matters more than it sounds: for the freestream-sensitive models, the inlet turbulence specification is part of the answer, and getting it from physical inputs makes it something you can defend.