Skip to content
cfd-lab:~/en/posts/2026-06-02-kolmogorov-ca…● online

Translated from the author's Korean original. Read the original (한국어)

NOTE #060DAY TUE 유체역학DATE 2026.06.02UPDATED 2026.10.19READ 6 min read#Turbulence#Kolmogorov#Energy-Cascade#DNS#Flow-Phenomena

Turbulence Runs Three Rulers at Once — The Kolmogorov Cascade and the -5/3 Law

Open the fit window past 10/L and 0.1/η and the slope that should be −5/3 sags toward −1.4.

1941, a notebook in Moscow#

Two months before the war reached his door, Kolmogorov mailed three short notes to a journal. Together they ran fewer than sixteen pages. There was no wind tunnel, no measurement data, no figure. Only dimensional analysis and a pair of statistical assumptions.

One line from that notebook still pins CFD down eighty years later. At sufficiently high Reynolds number, the way energy is distributed across scales is fixed by a single length — the Kolmogorov microscale η\eta. This post walks through how that line arises, why it sets your grid budget and DNS (Direct Numerical Simulation) cost, and finishes by fitting a -5/3 slope to a synthetic spectrum.

Raise the time-speed slider and the gap between breakups shrinks, while the order from large eddy to small stays put.

Each eddy lives a turnover time τ ∝ ℓ^(2/3), then splits into smaller ones. The smallest eddies (gray) dissipate as heat.

Large eddies (cyan) live a long turnover, τ∼L2/3\tau \sim L^{2/3}. Medium eddies (orange) split faster, and small eddies (pink) hand off to gray (viscous dissipation) almost instantly. While each eddy is alive, the energy flux it passes down equals every other scale's flux — that is the definition of the inertial subrange.

Three rulers stuffed into one flow#

Lay out a chunk of turbulence and three lengths show up.

  • Integral scale LL — the size of the largest eddies. Set by the flow's geometry (pipe diameter, chimney width). This is where the energy sits.
  • Taylor microscale λ\lambda — defined through the curvature of the two-point velocity autocorrelation at the origin. A mediator between large and small.
  • Kolmogorov microscale η\eta — the smallest ruler, where viscosity grinds kinetic energy into heat. Far above the molecular mean free path, but far below LL.

The three rulers coexist in the same flow. As the Reynolds number climbs, the gap between LL and η\eta widens. That gap is the inertial subrange.

Dimensional analysis bridges the gap#

Kolmogorov's hypotheses fit on two lines.

  1. At small enough scales, statistics depend only on viscosity ν\nu and the energy dissipation rate ε\varepsilon.
  2. In the inertial subrange viscosity drops out, and statistics depend only on ε\varepsilon.

Hypothesis 1 builds the smallest scale. ν\nu has units m2/s\mathrm{m^2/s} and ε\varepsilon has units m2/s3\mathrm{m^2/s^3}. To extract a length:

η=(ν3ε)1/4,uη=(νε)1/4,τη=(νε)1/2\eta = \left(\frac{\nu^3}{\varepsilon}\right)^{1/4}, \quad u_\eta = (\nu \varepsilon)^{1/4}, \quad \tau_\eta = \left(\frac{\nu}{\varepsilon}\right)^{1/2}

η\eta is length, uηu_\eta velocity, τη\tau_\eta time. Units alone close the system.

Hypothesis 2 cuts deeper. The inertial-range spectrum E(k)E(k) must depend only on ε\varepsilon and wavenumber kk. EE has units m3/s2\mathrm{m^3/s^2}. Matching dimensions:

E(k)=C ε2/3 k−5/3E(k) = C\, \varepsilon^{2/3}\, k^{-5/3}

CC is the Kolmogorov constant, measured around C≈1.5C \approx 1.5. The -5/3 law falls out from assumptions and units. Not a single data point was used.

Scale separation — the gap Re opens#

The large-eddy estimate ε∼u′3/L\varepsilon \sim u'^3 / L (energy injection equals dissipation in steady state) gives:

ηL=Re−3/4,λL∼Re−1/2,τηT∼Re−1/2\frac{\eta}{L} = \mathrm{Re}^{-3/4}, \quad \frac{\lambda}{L} \sim \mathrm{Re}^{-1/2}, \quad \frac{\tau_\eta}{T} \sim \mathrm{Re}^{-1/2}

with Re=u′L/ν\mathrm{Re} = u'L/\nu. A tenfold rise in Reynolds shrinks η/L\eta/L to 10−3/4≈0.1810^{-3/4} \approx 0.18 of its previous value. For a grid to resolve every scale, cell count scales as Re9/4\mathrm{Re}^{9/4}. A laboratory wind tunnel at Re=104\mathrm{Re} = 10^4 has L/η≈1,000L/\eta \approx 1{,}000, and a 3D DNS needs ∼109\sim 10^9 cells. An aircraft wing at Re=107\mathrm{Re} = 10^7 would demand 101510^{15} cells — beyond any current supercomputer.

The fit window's width in decades is fixed by its edges. From 10/L10/L to 0.1/η0.1/\eta the width is log⁡10(L/η)−2\log_{10}(L/\eta)-2. At Re=104\mathrm{Re}=10^{4}, L/η≈1,000L/\eta\approx 1{,}000, so the window is one decade. Each tenfold rise in Reynolds multiplies η/L\eta/L by 0.180.18. Apply that twice, at Re=106\mathrm{Re}=10^{6}, and η/L\eta/L is about 0.0320.032 of the old value, so L/ηL/\eta opens to about 3×1043\times 10^{4} and the window to about 2.5 decades.

With the snippet's u′=1u'=1 and L=1L=1, ε=u′3/L=1\varepsilon=u'^{3}/L=1. Before fLf_L and fηf_\eta, the inertial piece is E(k)=1.5 k−5/3E(k)=1.5\,k^{-5/3}. The commented fit, −1.661, sits 0.006 off the expected −1.667. Ten percent noise still leaves three digits if the window stays shut.

How that gap first opens inside a pipe continues in the critical Reynolds where a water jet breaks into layers. As the nominal Reynolds grows, cells between LL and η\eta scale as Re9/4\mathrm{Re}^{9/4}, and at 10410^{4} a 3D grid is already 10910^{9}.

The road energy travels#

A large eddy spins. Viscosity is too weak to drain it directly. Instead the large eddy breaks into smaller eddies, those into smaller still. The breakup time is the eddy turnover time τℓ∼ℓ/uℓ\tau_\ell \sim \ell/u_\ell. That breakup binds every scale through a single number — the dissipation rate ε\varepsilon.

The -5/3 slope and the traps at either end#

Plot E(k)E(k) log-log and a straight band at slope -5/3 appears in the middle. Different physics rule the two ends.

  • Around k∼1/Lk \sim 1/L — the energy-containing range. The geometry-imposed largest eddies live here. E(k)E(k) peaks.
  • Around k∼1/ηk \sim 1/\eta — the viscous dissipation range. E(k)E(k) falls exponentially. Viscosity drinks the energy.

Move the Reynolds-number slider up and the -5/3 band gets longer.

Model energy spectrum E(k) on log-log axes (Pope 2000 form).
L/η = 5.62e+3  ·  η = 1.78e-4  ·  λ (Taylor) = 1.22e-2

At Re=103\mathrm{Re} = 10^3 the -5/3 band is barely visible. At Re=106\mathrm{Re} = 10^6 a nearly four-decade straight line opens. Experimentally, if a clean -5/3 slope holds over even a single decade, the flow counts as fully developed turbulence.

Python — fitting -5/3 to a synthetic spectrum#

How does one extract a -5/3 slope from real data? Linear regression on log axes. Let's try on synthetic data.

import numpy as np
 
C_K = 1.5
c_L, p0 = 6.78, 2
beta_e, c_eta = 5.2, 0.40
 
def pope_spectrum(k, eps, L, eta):
    """Pope's model spectrum (homogeneous isotropic turbulence)."""
    kL = k * L
    kEta = k * eta
    f_L = (kL / np.sqrt(kL**2 + c_L)) ** (5/3 + p0)
    f_eta = np.exp(-beta_e * ((kEta**4 + c_eta**4)**0.25 - c_eta))
    return C_K * eps**(2/3) * k**(-5/3) * f_L * f_eta
 
# Setup
L_int = 1.0      # integral length
u_rms = 1.0      # rms velocity
Re = 1e5
nu = u_rms * L_int / Re
eps = u_rms**3 / L_int
eta = (nu**3 / eps) ** 0.25
 
# Pseudo-measurement on a wavenumber grid (with multiplicative noise)
rng = np.random.default_rng(0)
k = np.logspace(-1, np.log10(1.0 / eta) - 0.5, 80)
E_true = pope_spectrum(k, eps, L_int, eta)
E_meas = E_true * np.exp(0.10 * rng.standard_normal(k.size))   # ~10% lognormal noise
 
# Fit -5/3 only on the inertial range  (10/L < k < 0.1/eta)
mask = (k > 10 / L_int) & (k < 0.1 / eta)
slope, _ = np.polyfit(np.log(k[mask]), np.log(E_meas[mask]), 1)
print(f"L/eta = {L_int / eta:.1f}")
print(f"fitted slope = {slope:+.3f}  (expected -1.667)")
# L/eta = 17783.3
# fitted slope = -1.661  (expected -1.667)

Even with 80 noisy points the fitted slope is -1.66, three digits in agreement with the theoretical -5/3. Crank the noise up to 30% and the slope still lands between -1.59 and -1.74 — the inertial range is sturdy.

One question. Why mask out k<10/Lk < 10/L and k>0.1/ηk > 0.1/\eta? Because fLf_L and fηf_\eta bend the curve at both ends. In real measurements, a fit window that is too wide drags the slope toward -1.4. When a colleague reports "my data doesn't show -5/3", half the time the culprit is the fit window.

Surviving where the grid can't reach#

Once the cost of DNS is laid out, the workarounds become legible.

  • RANS (Reynolds-Averaged Navier–Stokes) — compute only the time-averaged field and close the fluctuations with a model. η\eta is not resolved, so grid cost scales like Re0\mathrm{Re}^0. The industry workhorse, weak on anisotropic Reynolds stresses.
  • LES (Large Eddy Simulation) — resolve the large eddies and close subgrid eddies through an SGS (subgrid-scale) model. Grid cost ranges from Re0.5\mathrm{Re}^{0.5} to Re1\mathrm{Re}^1 depending on whether walls are modeled. The middle ground.
  • DNS — resolve down to η\eta and integrate down to τη\tau_\eta. Cost scales as Re3\mathrm{Re}^{3} (3D plus time). An academic tool.

All three rest on the same -5/3 line. RANS replaces the entire inertial range with a model, LES resolves only part of it, DNS resolves all of it. Where you cut is the modeling decision.

When the fit window opens to both ends and the slope sags to −1.4#

η/L=Re−3/4\eta/L = \mathrm{Re}^{-3/4} sets how wide the window can be. Leave the mask outside 10/L<k<0.1/η10/L < k < 0.1/\eta and fLf_L plus fηf_\eta bend the ends, so the slope that should have followed only ε\varepsilon sags toward −1.4. The −1.661 in the code comment is what that closed window keeps.

Even Re=104\mathrm{Re} = 10^4 is already a heavy 3D grid, and Re=107\mathrm{Re} = 10^7 pushes it to 101510^{15}. Cut below that and hand the rest to a subgrid model, and the place where the coefficient comes out negative is written in where the dynamic coefficient went negative under Germano's identity. Trusting the cascade flux and shipping the clipped coefficient unchanged are different decisions.

Share if you found it helpful.