Artifact Shelf
Surprise me Source on GitHub

No. 18 · Simulations · October 9, 2026

Kármán's Street

Vortex shedding and the Kármán vortex street, run in a live lattice-Boltzmann wind tunnel that measures its own drag, lift and Strouhal number.

A long scrolling explainer on vortex shedding: above a Reynolds number of about 47 the wake behind a cylinder stops being symmetric and throws off eddies from alternate sides, which settle into the staggered double row called a Kármán vortex street. The page follows it from creeping flow at Re = 1 through the onset of the swing, the Strouhal number, the forces on the body, wires that sing in the wind, cloud streets behind an island and a stalled wing. Every flow picture is a lattice-Boltzmann wind tunnel running live on the GPU, and the meters under it read drag, lift and shedding frequency off the running simulation.

How to use it

  • The title tunnel opens on a cylinder at Re = 150 that is already shedding, shown as smoke streaks and surface dye. Drag across it to draw solid obstacles into the flow, and Reset tunnel clears them and starts the cylinder again. The corner readout gives the Reynolds and Strouhal numbers.
  • The contents bar under it jumps to I Reynolds, II Strouhal, III Forces, IV Sound, V Sky, VI Wings, VII Lab and Notes.
  • I to VII pin a second tunnel beside the text (above it on a phone), with four meters (Reynolds, Drag Cd, Lift Cl, Strouhal) and a scrolling trace of drag and lift. Each card loads its own scene as it reaches the middle of the screen, and Replay restarts the scenes in I and V.
  • The toolbar under that tunnel has Draw and Erase (drag on the tunnel), a view menu with Smoke, Vorticity, Speed, Pressure and Clouds, Pause (it then reads Play) and Restart flow, which restarts the flow around whatever is in the tunnel.
  • I runs Re = 1, where the smoke closes up behind the cylinder; Re = 20, with the two trapped eddies and a live eddy-length readout; Re = 100 started from a tiny nudge, with a log-scale chart of the lift growing and levelling off and the measured growth per cycle; and the street at Re = 150, with von Kármán's 1911 stability result and Bénard's films from three years earlier.
  • II has a Reynolds number slider from 50 to 200 that changes the running flow, and plots each settled measurement against Williamson's fit to experiments. III draws lift against drag as a figure of eight, since drag pulses twice per shedding cycle, with the mean drag and lift amplitude beside it.
  • IV picks a wire, Power line, Guy wire or Car aerial, and gives its diameter, wind speed, tone and Reynolds number. Play the tone plays that frequency until you press Stop. The card also covers Strouhal's 1878 experiments with whirled wires, helical strakes on chimneys, and why the 1940 Tacoma Narrows collapse was flutter rather than shedding.
  • V puts a model of Guadalupe Island, 260 km off Baja California, in the Clouds view. VI loads a NACA 0012 wing at Re = 1,000 based on chord, and Angle of attack (0° to 30°) tilts it in the running flow while the card reports mean lift and drag.
  • VII Lab opens everything: Reynolds number (1 to 3,000 on a log scale), Playback speed (0.25× to 3×), eight presets (Cylinder, Square, Flat plate, Two in a row, Side by side, Airfoil, Island, Empty), Write a word into the wind with Place word (up to ten letters, set as solid type), and Smoke rake and Surface dye to switch the two kinds of smoke on and off.

How it works

The flow is computed with the lattice Boltzmann method on a D2Q9 lattice. Each cell holds nine particle populations that stream to their neighbours and relax toward a local equilibrium, and on average this reproduces the incompressible Navier–Stokes equations at low Mach number. The collision is regularized BGK after Latt and Chopard: the non-equilibrium part of each population is rebuilt from the local momentum flux before relaxing, which filters out modes that are not hydrodynamic. The Reynolds number sets the viscosity through ν = UL/Re and the relaxation time τ = 3ν + ½, with an inlet speed U of 0.1 lattice units (Mach 0.17) and L the cylinder diameter, the wing's chord or the frontal height of whatever has been drawn. A Smagorinsky eddy viscosity, solved in closed form from the same momentum flux, is added to τ with a constant of 0.1, rising to 0.15 between Re = 500 and 3,000.

The desktop tunnel is 768 × 288 cells with the cylinder 24 across (544 × 192 and 16 across on small screens, and 272 × 96 with a ?lite query string), so it is 12 diameters tall and shows 28 diameters of length. The inlet column is held at equilibrium with uniform velocity, the top and bottom walls are free-slip (populations reflect specularly), solids use half-way bounce-back, and the outlet is zero-gradient. The last 96 columns are a hidden sponge layer where τ rises quadratically, so vortices are damped before they reach the exit. Each lattice step is one fragment-shader pass in WebGL2 that pulls the nine populations from the neighbouring cells, collides them and writes them through multiple render targets to three 32-bit float textures, ping-ponging between two sets; the spare channels carry density and velocity for the other passes. Every restart puts a small upward velocity in the upper half of the near wake to break the symmetry, 10% of the inflow speed in most scenes and 0.3% in the onset scene so the growth can be followed from a tiny amplitude.

Forces come from the momentum-exchange method. A shader adds up 2·fᵢ·cᵢ over every link from a fluid cell into a solid one, repeated passes sum 4 × 4 blocks until only a few texels are left, and one readback per frame gives the drag and lift coefficients F/(½ρU²L). The Strouhal number comes from the upward zero crossings of the lift about its mean over the last eight or so periods, interpolated between samples, as St = L/(UT); it is shown only when successive periods agree within 5%, and the meters read settling or steady otherwise. The eddy length in I.2 reads back the centreline velocity and finds the last cell of reversed flow behind the cylinder, and the onset chart takes the growth per cycle from the peaks of the lift while it is still small. The frame loop uses an adaptive step budget: 18 lattice steps per frame at 1× (12 on small screens), cut by 15% after a run of frames slower than 26 ms down to a floor of 4, and raised one step at a time when frames take under 18 ms. A new scene also fast-forwards a few thousand steps, spread over frames at up to five times the budget, so the wake has formed by the time the card is read.

For display, a second pass computes vorticity by central differences (scaled by D/U), speed, and the pressure coefficient from the density. Vorticity colours clockwise spin coral and counter-clockwise blue, Speed maps the speed onto a navy-to-cream ramp and darkens reversed flow, and Pressure is a diverging map of the pressure coefficient. The smoke lives in two half-float textures advected semi-Lagrangian by the lattice velocity: one channel is a rake of streaks fed in at the inlet, and two hold dye released from cells touching a solid, coral above the body's centroid and blue below. The rake is pre-filled across the whole tunnel on every restart so the first frame already shows streamlines. Smoke draws the dye over a faint vorticity field, Clouds draws it white over a dark sea, and solids are drawn as brushed metal with a lit rim. The wire tones use f = 0.2·U/D (80 Hz for the 25 mm power line in a 10 m/s wind, 333 Hz for the 6 mm guy wire, 1,000 Hz for the car aerial at 90 km/h) and are synthesised with Web Audio as a sine at f, a quieter sine at 2f, a slow 0.7 Hz tremolo and white noise band-passed around f. Each tunnel stops when it scrolls out of view or the tab is hidden, and with reduced motion set the title tunnel runs at half speed and skips the fast-forward.

Notes

  • The Model notes at the foot of the page include a validation table for the desktop grid against published values. Drag is 2.32 at Re 20 and 1.74 at Re 40 against Fornberg's 2.00 and 1.50; the eddy length is 1.00 D and 2.33 D against Coutanceau and Bouard's 0.93 D and 2.13 D; shedding starts between Re 45 and 55 against about 47; the Strouhal number is 0.141 at Re 55 and 0.173 at Re 100 against 0.130 and 0.164 from Williamson's fit; and at Re 100 the mean drag is 1.49 and the lift amplitude 0.40 against about 1.33 and 0.33 from 2D simulations. The cylinder blocks 8% of the tunnel's height, and the page notes that drag, lift and frequency run high for that reason, as they do in a real wind tunnel before blockage corrections. The notes also report a check against a separate CPU implementation of the same scheme, with the fields agreeing to 10⁻⁶.
  • The tunnel is a two-dimensional slice. Real cylinder wakes turn three-dimensional above Re ≈ 190, while this one keeps drawing a clean street, and it cannot show how helical strakes, introduced in 1957, stop chimneys shaking by making vortices leave at different moments along the height.
  • The tunnels need WebGL2 with 32-bit floating-point render targets. Without them a notice takes the place of each tunnel.
  • The history, the timeline A street with many names (1878 to 1996) and the examples come with a twelve-item source list at the foot of the page, from Strouhal's 1878 paper on aeolian tones, Reynolds 1883, Bénard 1908 and von Kármán 1911, through Roshko's 1954 report, Williamson's 1996 review and Billah and Scanlan's 1991 paper on the Tacoma Narrows, to Latt and Chopard's regularized collision, Wesfreid's history of the Bénard–Kármán naming dispute and the NASA Earth Observatory page for the MISR image of Guadalupe Island from 11 June 2000.
  • This copy fixes four things in the original. Without WebGL2 the page stopped before the story script ran; it now carries on, with a notice in each tunnel. Each frame reset the frame clock after its own work, so the adaptive step budget never saw a slow frame; it now does. On a phone, a vertical swipe that started on the title tunnel dropped a disc of obstacle before the page scrolled; a touch there now paints only once it moves sideways, or on a tap. And two fractions in the equilibrium formula were broken entities.

Also on the shelf

Embed Kármán's Street

Paste this where you want it to run. It loads from this site.