A real 2D stable-fluids solver (Jos Stam method): velocity (u,v), smoke density and temperature live on a grid. Each frame runs add source → buoyancy force → viscous diffusion (Jacobi) → divergence-free pressure projection → semi-Lagrangian advection → project again, then diffuses/advects density and temperature through the same velocity field.
buoyancy: dv/dt += α·(T−T_amb) − β·ρ_smoke
advect: q(x,t+dt) = q(x − u(x)·dt, t) (backtrace + bilinear sample)
project: ∇²p = ∇·u, u ← u − ∇p (Jacobi Poisson solve)
Plume rise is cross-checked against the Briggs (1975) buoyant plume-rise formula for a bent-over plume:
Δh = 1.6 · F^(1/3) · x^(2/3) / u
where F is the fire's buoyancy flux (from fire intensity), x a fixed downwind reference distance and u the wind speed. The simulated plume-top height should track this prediction as intensity and wind change — a real physics sanity check, not a decorative animation.