Skip to content
cfd-lab:~/en/posts/2026-07-14-kelvin-helmho…● online

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

NOTE #102DAY TUE 유체역학DATE 2026.07.14UPDATED 2026.10.19READ 7 min read#Kelvin-Helmholtz#Shear-Instability#Vortex#Stratified-Flow#Flow-Phenomena

Waves Hanging in the Sky — The Kelvin-Helmholtz Instability

With equal density and no gravity or surface tension, sigma equals k times ΔU over 2, and short waves run away.

Every so often the sky wears a row of frozen ocean waves. Hook-shaped crests, lined up like breakers. In a photo they look faked. They are real clouds. Kelvin-Helmholtz clouds. The air is copying a wave the instant before it breaks.

The hooks start on a thin boundary where a fast stream meets a slow one. A shear layer. That boundary refuses to stay flat. When it rolls, and when it stays quiet, sits in one growth-rate formula. At the end a thin vortex sheet gets rolled up by hand.

Move the sliders for shear ΔU\Delta U, density ratio, gravity, and surface tension. The growth-rate curve either lies down on the floor or the orange band pinches in from both sides.

UNSTABLE — fastest growth at λ* ≈ 0.79 cm (σ ≈ 597.78 /s)

Drop ΔU\Delta U near 6 and the curve flips to "STABLE." Raise gravity or surface tension and the unstable band shrinks from both ends. Push the density ratio toward 1 and the curve shoots up under a weak shear.

Waves Hanging in the Sky#

Kelvin-Helmholtz clouds are not the only place this happens. The same thing plays out everywhere. The seams where Jupiter's bands split apart, the internal waves where seawater of different densities slides past itself, the brief spiral when you pour milk into coffee. Even the point where a rising ribbon of cigarette smoke suddenly scatters follows the same rule.

They share one ingredient. Two fluid layers flow side by side at different speeds. The upper layer fast, the lower layer slow. The thin boundary between them slips. That slip — the shear — is the seed.

Intuitively you might expect the two streams to just glide past each other. They do not. Even the tiniest ripple on the boundary grows on its own. This is the Kelvin-Helmholtz instability (a shear-driven instability of the interface).

What Happens When Two Streams Slip#

Say a small bump rises on the boundary. The fast upper stream has to go over it. The passage over the crest narrows. To keep the flow rate the same, the fluid speeds up where the passage is tight.

Faster means lower pressure. That is Bernoulli's principle (where the flow is fast, the pressure is low). Lower pressure above the crest sucks the crest up even more. In the trough the opposite happens: the flow slows, the pressure rises, and the trough gets pushed down harder.

So the crest rises higher and the trough digs deeper. A small ripple feeds itself — a positive feedback. Once it starts, it does not stop. That is the core mechanism of the instability.

One common misconception: "Heavy water below, light air above — isn't that stable?" By gravity alone, yes. But strong enough shear beats gravity's stabilizing effect. Even a stable stratification collapses in front of a strong wind.

The Dispersion Relation — Which Wavelengths Grow#

This tug-of-war compresses into a single equation. An upper layer (density ρ1\rho_1) and a lower layer (density ρ2\rho_2) slip past each other at relative speed ΔU\Delta U, with gravity gg and surface tension TT acting on the interface. The rate at which a ripple of wavenumber kk (waves per unit length) grows — its growth rate σ\sigma — is:

σ(k)=kρ1ρ2(ρ1+ρ2)2(ΔU)2−g(ρ2−ρ1)(ρ1+ρ2) k−Tkρ1+ρ2\sigma(k) = k\sqrt{\frac{\rho_1\rho_2}{(\rho_1+\rho_2)^2}(\Delta U)^2 - \frac{g(\rho_2-\rho_1)}{(\rho_1+\rho_2)\,k} - \frac{T k}{\rho_1+\rho_2}}

σ\sigma is how fast the ripple grows. The first term under the root is shear (it destabilizes), the second is gravity (heavy fluid below stabilizes), and the third is surface tension (it pulls the interface taut and stabilizes).

If the radicand is positive, σ\sigma is real and the ripple grows exponentially. If negative, σ\sigma is imaginary — the ripple only oscillates and never grows. The instability condition is that the radicand is positive, i.e., shear beats the other two.

ρ1ρ2ρ1+ρ2(ΔU)2>g(ρ2−ρ1)k+Tk\frac{\rho_1\rho_2}{\rho_1+\rho_2}(\Delta U)^2 > \frac{g(\rho_2-\rho_1)}{k} + T k

Look at the purest case. If the two layers have equal density (ρ1=ρ2=ρ\rho_1=\rho_2=\rho) and there is no gravity or surface tension, the formula collapses to something strikingly simple.

σ=k ΔU2\sigma = \frac{k\,\Delta U}{2}

The larger the wavenumber — the shorter the wavelength — the faster it grows. With no brakes at all, arbitrarily short wavelengths blow up. In real flow, viscosity cuts off this runaway at the short-wavelength end.

Gravity and Surface Tension Hit the Brakes#

The two brakes stop different wavelengths. The gravity term scales as 1/k1/k, so it suppresses long waves (small kk). The surface-tension term scales as kk, so it suppresses short waves (large kk). A band of unstable wavelengths survives in between.

If the shear is weak, that band never opens. Increase the shear and at some point instability breaks through first at one particular wavelength. That threshold is exactly the minimum wind speed at which a breeze starts raising waves on a calm surface.

ΔUmin⁡2=2(ρ1+ρ2)ρ1ρ2g T (ρ2−ρ1)\Delta U_{\min}^2 = \frac{2(\rho_1+\rho_2)}{\rho_1\rho_2}\sqrt{g\,T\,(\rho_2-\rho_1)}

Plug in air and water and you get ΔUmin⁡≈6.6 m/s\Delta U_{\min} \approx 6.6\ \mathrm{m/s}, with the first wavelength to break through at about 1.7 cm. Kelvin computed this in the 19th century. (A real water surface ripples at lower wind speeds too, because of viscosity — a limit of the ideal theory.)

For a continuously stratified flow, the verdict comes from the Richardson number (the ratio of buoyancy to shear). Ri=N2/(dU/dz)2\mathrm{Ri} = N^2/(dU/dz)^2, where NN is the buoyancy frequency. The Miles-Howard theorem says instability is possible somewhere below Ri<1/4\mathrm{Ri} < 1/4. It is the working criterion for predicting when turbulence erupts in the atmosphere and ocean.

The orange band on the curve above is the window that first opens at this threshold. The velocity inside a rolled-up core overlaps the split drawn in forced and free vortices.

Drawing the Growth-Rate Curve in Python#

Port the formula straight into code and you can read off which wavelength grows first at any wind speed.

import math
 
def kh_growth_rate(k, dU, rho_u, rho_l, g=9.81, T=0.072):
    """Growth rate sigma(k) of a Kelvin-Helmholtz mode."""
    shear   = rho_u * rho_l * dU**2 / (rho_u + rho_l)**2   # destabilizing (shear)
    gravity = g * (rho_l - rho_u) / ((rho_u + rho_l) * k)  # stabilizes long waves
    tension = T * k / (rho_u + rho_l)                      # stabilizes short waves
    disc = shear - gravity - tension
    return k * math.sqrt(disc) if disc > 0 else 0.0
 
rho_air, rho_water = 1.225, 1000.0
ks = [1 + 0.2 * i for i in range(4000)]
for dU in (3.0, 6.6, 10.0):
    s = [kh_growth_rate(k, dU, rho_air, rho_water) for k in ks]
    smax = max(s)
    if smax > 0:
        kstar = ks[s.index(smax)]
        lam = 2 * math.pi / kstar * 100   # cm
        print(f"dU={dU:4.1f} m/s -> unstable, lambda*={lam:5.2f} cm, sigma_max={smax:6.2f} /s")
    else:
        print(f"dU={dU:4.1f} m/s -> stable (no waves)")

Running it prints:

dU= 3.0 m/s -> stable (no waves)
dU= 6.6 m/s -> unstable, lambda*= 1.69 cm, sigma_max=  4.89 /s
dU=10.0 m/s -> unstable, lambda*= 0.78 cm, sigma_max=183.30 /s

Raise the vortex-count slider and the shear ΔU\Delta U slider together and both the roll-up speed and the hook spacing change.

A gentle line winds into a cat's eye in a few seconds. Higher ΔU\Delta U rolls faster. More vortices cut the hooks finer. Reset returns a flat ripple.

At 3 m/s the surface stays calm. Cross 6.6 m/s and the first ripple has λ∗=1.69\lambda^*=1.69 cm and σmax⁡=4.89\sigma_{\max}=4.89 /s. At 10 m/s, λ∗=0.78\lambda^*=0.78 cm and σmax⁡=183.30\sigma_{\max}=183.30 /s. Wind only rises by about 1.5, from 6.6 to 10. The growth rate jumps by about 37, from 4.89 to 183.30. Just above threshold the radicand is thin.

The printed 1.69 cm is k=2π/0.0169k=2\pi/0.0169, roughly 372 m−1372\ \mathrm{m}^{-1}. Drop that kk and ΔU=6.6\Delta U=6.6 into the unbraked formula σ=kΔU/2\sigma=k\Delta U/2 and σ\sigma lands in the thousands per second. The printed 4.89 /s is a different order. At 6.6 m/s, shear nearly cancels gravity and surface tension. The densities are air 1.225 and water 1000, with g=9.81g=9.81 and T=0.072T=0.072. Those four numbers make ΔUmin⁡≈6.6\Delta U_{\min}\approx 6.6 m/s. The drop from 1.69 cm to 0.78 cm means the short side is starting to win.

The eye shows up after the linear stage#

Linear theory holds while the bump is still small. Once the crest is large, the story changes. The interface does not stop at a wave. It rolls up whole. The thin vortex sheet winds into a train. That is the hook cloud, Stuart's cat's eye.

The growth-rate formula only sees the linear stage, the first rise of the ripple. The cat's eye is nonlinear. The interface pulls on itself. Each marker tugs its neighbors through an inviscid induced velocity. The ripple stands up. Then it rolls.

Above Ri of 1/4, shear alone does not roll it#

If Ri=N2/(dU/dz)2\mathrm{Ri}=N^2/(dU/dz)^2 sits above 1/4, the Miles-Howard theorem does not allow instability. Stratification is holding the shear down. On an air-water interface the printout is stable whenever ΔU\Delta U is under 6.6 m/s. The 3 m/s line opens no wave at all.

The same interface, broken into drops by tension alone, is Plateau–Rayleigh breakup of a liquid jet. Here the only question is whether shear beats that tension. With no brakes, as in σ=kΔU/2\sigma=k\Delta U/2, short waves win without limit. Viscosity cuts that end off. A hook in the sky means shear already won, before that cutoff.

Share if you found it helpful.