U →
Re –
Ma –
τ –
t* 0
grid –
– MLUPS
The air is modelled as a lattice gas. Every grid cell carries nine particle populations fi, one per lattice velocity of the D2Q9 stencil. Each time step they stream to the neighbouring cell and then relax towards a local Maxwell–Boltzmann equilibrium (BGK collision). Density and velocity are moments of the populations, and in the limit of small Mach number this reproduces the Navier–Stokes equations, with viscosity ν = (τ − ½)/3 set by the relaxation time τ.
At high Reynolds numbers τ approaches ½ and plain BGK blows up, so a Smagorinsky large-eddy model adds eddy viscosity where the strain is large. The strain comes locally from the non-equilibrium stress, so no finite differences are needed. Bodies use halfway bounce-back, with a moving-wall correction for the spinning cylinder. Forces come from momentum exchange: every population that hits a solid gives the body twice its momentum.
The inlet holds a uniform stream. The outlet is zero-gradient, with a sponge of extra viscosity in the last 8% of the tunnel so vortices leave quietly. The walls are free-slip by default (an open test section) or no-slip for channel flows. Smoke is a passive scalar advected with a MacCormack scheme; tracers are advected with second-order Runge–Kutta. Everything runs in WebGPU compute shaders; the browser only reads back force sums.
Everything is in lattice units. Re = U L / ν uses the scene's reference length (chord, diameter or step height in cells), coefficients are per unit span, and t* = t U / L counts convective times. Results are 2D and laminar-to-transitional; expect the right trends and orders of magnitude rather than wind-tunnel numbers, and note that the tunnel walls add blockage.
Aeolus needs a browser with WebGPU: a recent Chrome or Edge, Safari 26+, or a recent Firefox.