MMS: Spalart-Allmaras Turbulence Model

Category: V&V – Method of Manufactured Solutions | Revised 2026-10-01
CAE visualization for mms turbulence sa theory - technical simulation diagram
MMS: Spalart-AllmarasTurbulent Flow Model

Theory: choose the answer first, then build the source

Overview

🙋

Can't we tell whether a turbulence model is implemented correctly by comparing with experiments?

🎓

When results disagree with experiments, you can't tell model limitations from program errors; when they agree, a bug may be cancelling another error. Whether the program solves its equations correctly must be checked separately from experiments. That's verification, and the method of manufactured solutions is a powerful way to do it. Choose a solution, substitute it, and add the remainder as a source term; the chosen solution becomes exact. Then just check whether error falls at the theoretical rate under refinement. Equations like SA, with several nonlinear terms, often suffer missing terms or wrong coefficients, which this finds.

A simplified 1D SA equation

$$ \frac{d}{dy}\!\left[\frac{\nu + \tilde\nu}{\sigma}\frac{d\tilde\nu}{dy}\right] + \frac{c_{b2}}{\sigma}\left(\frac{d\tilde\nu}{dy}\right)^2 + c_{b1} S\,\tilde\nu - c_{w1}\left(\frac{\tilde\nu}{d}\right)^2 + f(y) = 0 $$

From the SA transport equation for ν̃, convection is removed, the destruction function fw is set to 1 and vorticity magnitude to S = 1. Constants: σ = 2/3, cb1 = 0.1355, cb2 = 0.622, cw1 = cb1/κ² + (1 + cb2)/σ = 3.239 (κ = 0.41). Domain 0.1 ≤ y ≤ 1, wall distance d = y, molecular viscosity ν = 0.1 (non-dimensional).

Manufactured solution and observed order

$$ \tilde\nu_m(y) = 1 + 0.5\sin(2\pi y),\qquad f = -\mathcal{L}(\tilde\nu_m),\qquad p = \frac{\ln(e_h / e_{h/2})}{\ln 2} $$

L is the left-hand operator. The source f was derived symbolically (sympy). e_h is the L2 error at spacing h.

Coffee Break Trivia

The SA model and a culture of verification

The Spalart–Allmaras model, published in 1992 for external aircraft flows, is a one-equation turbulence model widely used for its convenience. But implementations differ in small details, and codes disagreed on the same problem. NASA's Turbulence Modeling Resource collects standard equation forms and verification cases so multiple codes can check convergence to the same answer under grid refinement. Manufactured-solution verification is also used for such implementation checks.

Worked examples

Example: error under grid refinement (second-order central differences, Newton solve)

Implementation20 cells40 cells80 cells160 cellsObserved order
Correct3.40×10⁻³8.38×10⁻⁴2.08×10⁻⁴5.19×10⁻⁵2.02 / 2.01 / 2.00
cb2 term omitted1.37×10⁻¹1.34×10⁻¹1.33×10⁻¹1.33×10⁻¹0.03 / 0.01 / 0.01
One-sided face diffusivity7.98×10⁻³3.32×10⁻³1.55×10⁻³7.52×10⁻⁴1.26 / 1.10 / 1.04

Observed orders come from error ratios between successive grids. The correct implementation converges to the theoretical 2.

🙋

Omitting cb2 stops the error falling entirely, but one-sided diffusivity still lets it fall.

🎓

They're different kinds of error. Omitting cb2 means the program solves a different equation, so refinement only approaches that other equation's solution and the error stalls near 0.13 — easy to spot. One-sided face diffusivity keeps the equation right but drops discretisation accuracy from second to first order. Refinement still approaches the correct solution, so neither a single-grid result nor comparison with experiment reveals it, but the observed order of 1.04, against a theoretical 2, shows it at a glance. Order verification is valuable because it examines how error falls, not just how large it is.

Verification workflow

  1. Choose a smooth manufactured solution that exercises every term (no derivative vanishes).
  2. Derive the source symbolically to avoid transcription errors.
  3. Compute errors on 3–4 grids and the observed order.
  4. If the order is off, isolate the cause by removing terms one at a time.
  5. Disable accuracy-reducing features such as wall functions and limiters during verification.
Coffee Break Trivia

“Flat-plate friction matched”

An in-house solver with SA matched flat-plate boundary-layer skin friction within a few percent. Yet MMS verification gave an observed order below 2 with the error stalling partway. The cause: the cb2 term's coefficient had not been divided by σ. In a flat-plate boundary layer that term matters relatively little and was hidden among other errors. In separated flows results changed substantially; after the fix they agreed well with another code.

Common mistakes

Mistakes and fixes

MistakeEffectFix
Calling experimental agreement verificationBugs remainCheck order with MMS
Solution zeroing some termsBugs in those terms missedExercise all terms
Hand-derived sourceErrors in the source itselfSymbolic algebra
Grids too coarseNot in asymptotic rangeUse 4+ levels
Limiters left onOrder reducedDisable during verification
🙋

I'd like to learn related topics.

Related Simulators

Experience the theory firsthand with the interactive simulator for this field

All Simulators

Related fields

Structural AnalysisFluid Analysis (CFD)Thermal Analysis
Rate this article
Thank you for your feedback!
Helpful
More details
Report error
Helpful
0
More details
0
Report error
0