A 320×160 D2Q9 lattice streams fictitious particle packets along 9 directions per cell. Each step they relax toward local equilibrium (BGK) and stream to neighbours; the cylinder uses bounce-back to enforce a no-slip wall. The result is rendered as plain putImageData pixels — no WebGL — using exactly the same solver as the 3D version.
Re = u0 · D / ν
St = f·D / U ≈ 0.2
Click the canvas to drop a new solid obstacle into the flow.