Fluid Dynamics & CFD
April 2026 · 15 min read · CFD · Lattice-Boltzmann · Canvas 2D

Kármán Vortex Street: Flow Instability, Strouhal Number & LBM Simulation

When fluid flows past a bluff body at intermediate Reynolds numbers, the symmetric wake becomes unstable and breaks into a beautiful periodic pattern of alternating vortices — the Kármán vortex street. This phenomenon governs the resonant vibration of chimneys, the singing of power lines in the wind, the collapse of the Tacoma Narrows Bridge, and the hydrodynamic efficiency of fish locomotion. Understanding it requires both linear stability theory and computational fluid dynamics.

1. Reynolds Number Regimes

The Reynolds number Re = ρUD/μ = UD/ν (where U is free-stream velocity, D is cylinder diameter, ν = μ/ρ is kinematic viscosity) governs the flow topology:

Re range Flow regime Description
Re < 1 Stokes / creeping flow Symmetric, no separation. Drag ≈ 3πμUD (Stokes law for sphere)
1 < Re < 5 Steady attached Small symmetric attached eddies form behind cylinder
5 < Re < 47 Steady recirculation Fore-aft symmetric wake; two steady vortices in recirculation zone
47 < Re < 190 Laminar shedding Kármán vortex street: periodic alternating shedding, 2D, no spanwise variation
190 < Re < 1000 3D transition Spanwise Mode A (Re≈190) then Mode B (Re≈260) instabilities; wake becomes 3D
10³ — 2×10⁵ Subcritical turbulent Turbulent boundary layer on cylinder; St ≈ 0.2; wide turbulent wake
Re ≈ 5×10⁵ Drag crisis Laminar-turbulent BL transition; separation point moves downstream; C_D drops from 1.2 to 0.3
Re > 10⁶ Supercritical turbulent Fully turbulent BL; irregular shedding; C_D ≈ 0.3

The onset of vortex shedding at Re ≈ 47 is a supercritical Hopf bifurcation: the steady symmetric wake solution loses stability and a limit cycle (periodic shedding) is born. The bifurcation parameter is Re; the bifurcation is non-hysteretic (supercritical).

2. Strouhal Number & Shedding Frequency

The non-dimensional shedding frequency is the Strouhal number:

St = f · D / U f : vortex shedding frequency [Hz] D : cylinder diameter [m] U : free-stream velocity [m/s]

For a circular cylinder in the laminar shedding regime (50 < Re < 1000), Williamson & Brown (1998) give the empirical fit:

St = 0.2663 − 1.019 / √Re (47 < Re < 200) St ≈ 0.198 · (1 − 19.7 / Re) (alternative, Fey et al.) // For Re = 100: St ≈ 0.167 (period T = 6D/U) // For Re = 200: St ≈ 0.185 // Turbulent regime: St ≈ 0.20 (relatively insensitive to Re)

Two opposite-sign vortices are shed per cycle — one from each side — so the wake pattern has a spatial period of 2 × (U/f) × (lateral spacing). The downstream spacing of same-sign vortices (vortex street wavelength) is λ = U/f = D/St.

For the vortex street to be stable, the lateral-to-longitudinal spacing ratio must satisfy the von Kármán stability criterion:

h/a = (1/π) · arcsinh(1) ≈ 0.2806 h : lateral distance between vortex rows a : longitudinal distance between same-row vortices

Any other ratio causes the two rows to interact and quickly disrupt the pattern. This specific geometry was derived by von Kármán (1911) from the stability analysis of a double row of point vortices — an elegant application of 2D potential flow theory.

3. Linear Stability & Wake Instability

The transition from steady to periodic flow at Re ≈ 47 is explained by linear stability analysis of the Navier-Stokes equations linearised around the steady base flow U(x):

Linearised N-S (with q = [u', p'] perturbation): ∂q/∂t = L(Re) · q // L is the linearised Navier-Stokes operator (non-normal, non-symmetric) // Hopf bifurcation occurs when L has eigenvalues with Re(λ) = 0

At Re < 47, all eigenvalues of L have negative real parts — perturbations decay. At Re = 47 a complex conjugate pair λ = ±iω₀ crosses the imaginary axis (the Hopf condition), and the steady wake is replaced by a growing oscillation with frequency ω₀ = 2πSt·U/D. Above Re = 47 the amplitude saturates via nonlinear effects; the flow settles onto a stable limit cycle (the periodic vortex street).

Absolute vs Convective Instability

The distinction between absolute and convective instability is critical for understanding why the vortex street persists:

Koch (1985) showed that the near wake of the cylinder is absolutely unstable for Re > 25–35. This absolute instability "locks in" the shedding frequency, making the vortex street a global instability rather than a noise-amplified convective wave.

4. Drag, Lift & Pressure

The alternating vortex shedding produces a periodically varying lift force (crossflow) at frequency f_s and a weakly modulated drag force at frequency 2f_s:

C_D = F_D / (½ρU²LD) : drag coefficient (mean) C_L = F_L / (½ρU²LD) : lift coefficient (zero mean, oscillates at f_s) // Approximate values for 2D laminar shedding, Re = 100: C_D ≈ 1.35 ± 0.012 (mean + oscillation amplitude) C_L ≈ 0 ± 0.33 (zero mean, amplitude 0.33)

The drag oscillation at 2f_s arises from the symmetric formation of vortices on alternate sides — each new vortex adds a positive increment to drag regardless of which side it is shed. The lift oscillation at f_s corresponds to the alternating sign of circulation in each shed vortex.

The pressure field decomposes into: (1) a mean pressure deficit in the wake (responsible for form drag), (2) oscillating near-wake pressure with period 1/f_s, and (3) the attached vortex pressure (suction on the side where the shear layer rolls up).

5. Vortex-Induced Vibration & Lock-in

If the cylinder is elastically mounted (mass m, spring k, damping c), it can vibrate in the crossflow direction. When the shedding frequency f_s approaches the structural natural frequency f_n = √(k/m) / (2π), a phenomenon called lock-in (or synchronisation) occurs:

Lock-in reduced velocity range: U_r = U / (f_n · D) ≈ 4 – 8 // Tacoma Narrows Bridge (1940): // Wind speed ≈ 67 km/h = 18.6 m/s // Bridge width D ≈ 12 m // St ≈ 0.11 → f_s ≈ 0.17 Hz (for shallow H-section) // Bridge torsional natural frequency ≈ 0.2 Hz // → Near-resonance → amplitude growth → collapse

Lock-in is exploited constructively in flow energy harvesters (piezoelectric patches on oscillating structures) and in fish locomotion: a trout swimming behind a D-shaped bluff body "surfs" the Kármán street, extracting energy from shed vortices via timed undulations of its body — demonstrated experimentally by Liao et al. (2003) in Science.

6. LBM D2Q9: Theory

The Lattice-Boltzmann Method (LBM) solves a discrete Boltzmann equation on a lattice. In D2Q9 (2D, 9 velocities), each cell stores 9 distribution functions fᵢ representing particle populations moving in 9 discrete directions:

Velocity set e_i (D2Q9): i=0: (0,0) weight w₀ = 4/9 i=1,2,3,4: (±1,0),(0,±1) w = 1/9 i=5,6,7,8: (±1,±1) w = 1/36 LBM update (BGK collision): fᵢ*(x, t) = fᵢ(x, t) − (1/τ) · [fᵢ(x,t) − fᵢᵉᵍ(x,t)] ← collision fᵢ(x+eᵢ, t+1) = fᵢ*(x, t) ← streaming Equilibrium distribution: fᵢᵉᵍ = wᵢ · ρ · [1 + (eᵢ·u)/cs² + (eᵢ·u)²/(2cs⁴) − u²/(2cs²)] cs = 1/√3 (lattice speed of sound) Macroscopic fields: ρ(x) = Σᵢ fᵢ(x) // density u(x) = (1/ρ) Σᵢ fᵢ(x)·eᵢ // velocity

The relaxation time τ controls viscosity: ν = cs²(τ − ½) = (1/3)(τ − ½). For τ ∈ (0.5, 2) the method is stable. The Reynolds number in LBM units is Re = U_LBM · D_LBM / ν_LBM.

Boundary conditions on the cylinder surface use bounce-back: any distribution function streaming into the solid is reflected back in the opposite direction with equal magnitude. This implements a no-slip condition second-order accurate for stationary boundaries.

7. LBM D2Q9: Implementation

// LBM D2Q9 — Kármán vortex street
// Grid: NX × NY lattice, cylinder at (cx, cy) radius R
// Vorticity rendered: ω = ∂v/∂x − ∂u/∂y (finite difference)

const W = 320, H = 160;
const CX = 70, CY = H >> 1, R = 12;
const TAU = 0.56;          // relaxation time → ν = (0.56−0.5)/3 = 0.02
const U0  = 0.1;           // inlet velocity (LBM units, must be ≪ 1)

// D2Q9 weights and velocity vectors
const W9 = [4/9, 1/9,1/9,1/9,1/9, 1/36,1/36,1/36,1/36];
const EX = [0, 1,0,-1, 0, 1,-1,-1, 1];
const EY = [0, 0,1, 0,-1, 1, 1,-1,-1];
const OPP= [0, 3,4, 1, 2, 7,8, 5, 6];  // bounce-back pairs

const N = W * H;
let f    = new Float32Array(9 * N);
let fTmp = new Float32Array(9 * N);
const solid = new Uint8Array(N);

// Mark cylinder cells
function initSolid() {
  for (let y = 0; y < H; y++) for (let x = 0; x < W; x++) {
    const dx = x - CX, dy = y - CY;
    if (dx*dx + dy*dy <= R*R) solid[y*W+x] = 1;
  }
}

// Equilibrium distribution
function feq(i, rho, ux, uy) {
  const eu = EX[i]*ux + EY[i]*uy;
  const u2 = ux*ux + uy*uy;
  return W9[i] * rho * (1 + 3*eu + 4.5*eu*eu - 1.5*u2);
}

// Initialise uniform flow
function initFlow() {
  for (let n = 0; n < N; n++) {
    const rho0 = 1.0;
    for (let i = 0; i < 9; i++) f[9*n+i] = feq(i, rho0, U0, 0);
  }
}

function step() {
  const inv_tau = 1 / TAU;

  // Collision
  for (let n = 0; n < N; n++) {
    if (solid[n]) continue;
    let rho = 0, ux = 0, uy = 0;
    for (let i = 0; i < 9; i++) {
      const fi = f[9*n+i];
      rho += fi; ux += EX[i]*fi; uy += EY[i]*fi;
    }
    ux /= rho; uy /= rho;
    for (let i = 0; i < 9; i++) {
      f[9*n+i] += inv_tau * (feq(i, rho, ux, uy) - f[9*n+i]);
    }
  }

  // Streaming + boundary conditions
  for (let y = 0; y < H; y++) for (let x = 0; x < W; x++) {
    const n0 = y*W + x;
    if (solid[n0]) {
      // Bounce-back for solid cells
      for (let i = 0; i < 9; i++) fTmp[9*n0+OPP[i]] = f[9*n0+i];
      continue;
    }
    for (let i = 0; i < 9; i++) {
      let nx = x + EX[i], ny = y + EY[i];
      // Left inlet: constant velocity inlet (Zou-He)
      if (nx < 0) { fTmp[9*n0+i] = feq(i, 1.0, U0, 0); continue; }
      // Right outlet: zero-gradient (copy from neighbour)
      if (nx >= W) { nx = W-1; }
      if (ny < 0)  ny = 0;
      if (ny >= H) ny = H-1;
      const nn = ny*W + nx;
      fTmp[9*nn+i] = f[9*n0+i];
    }
  }
  const tmp = f; f = fTmp; fTmp = tmp;
}

// Read vorticity ω = ∂v/∂x − ∂u/∂y (central differences)
function getVorticity(x, y) {
  const getU = (xx, yy) => {
    const n = Math.min(Math.max(yy,0),H-1)*W + Math.min(Math.max(xx,0),W-1);
    let rho=0, ux=0, uy=0;
    for (let i=0;i<9;i++){rho+=f[9*n+i];ux+=EX[i]*f[9*n+i];uy+=EY[i]*f[9*n+i];}
    return rho > 0 ? [ux/rho, uy/rho] : [0,0];
  };
  const [,vR] = getU(x+1, y); const [,vL] = getU(x-1, y);
  const [uT]  = getU(x, y+1); const [uB]  = getU(x, y-1);
  return 0.5 * ((vR - vL) - (uT - uB));
}
    

8. Interactive Vortex Street Simulation

The canvas below runs an LBM D2Q9 simulation at 320×160 lattice cells. Vorticity ωz = ∂v/∂x − ∂u/∂y is rendered using a diverging blue–white–red colourmap. Increase Re to see the transition from a steady wake to full periodic shedding.

Blue = clockwise vorticity  |  Red = counter-clockwise  |  Grey = cylinder

Engineering consequence: The Tacoma Narrows Bridge collapse (1940) remains the most cited example of vortex-induced resonance in engineering education — although modern analysis shows that torsional flutter (a different aeroelastic instability) was the primary mechanism. Pure VIV was a contributing factor in the initial oscillations. Modern long-span bridges use aerodynamically refined box girder cross-sections with St numbers chosen to avoid resonance with structural natural frequencies across the expected wind speed range.