How it works
Nobody drew the smoke above. The space around the car is split into 2.4 million cells, and your graphics card recomputes how the air moves in each of them several hundred times a second. The smoke simply rides that computed wind.
Why Formula 1 needs a wind tunnel
A modern Formula 1 car is fast less because of its engine than because of the air. Wings and the floor press the car onto the track with a force that, at high speed, exceeds the car’s own weight. More downforce means more grip from the tyres and faster corners. The price is drag: the air holds the car back, and part of the engine’s power goes into just pushing it aside.
Teams test ideas in two ways: computation on supercomputers and runs in a wind tunnel. Under the FIA rules the tunnel model may be at most 60 % of full size and the air at most 50 m/s; the floor under the model is a moving belt and the wheels spin. Tunnel hours and computing are rationed, with more allowed for the teams further down the order. Our tunnel is the same idea, with a full-size car and equations instead of a fan.
The Navier–Stokes equations
Air moving well below the speed of sound obeys the Navier–Stokes equations: Newton’s second law for every drop of air, plus the condition that the air does not compress:
$$\rho\Big(\frac{\partial \mathbf u}{\partial t} + (\mathbf u\cdot\nabla)\,\mathbf u\Big) = -\nabla p + \mu\,\nabla^2 \mathbf u,\qquad \nabla\cdot\mathbf u = 0.$$On the left is mass times acceleration: a drop speeds up because the flow at its location changes and because it is carried to where the flow is different. On the right are the forces: a pressure difference $\nabla p$ pushes air towards lower pressure, and viscosity $\mu$ evens out the speeds of neighbouring layers.
How much viscosity matters is told by the Reynolds number, inertia over friction:
$$\mathrm{Re} = \frac{U L}{\nu} = \frac{69.4\ \text{m/s}\times 5.3\ \text{m}}{1.5\cdot 10^{-5}\ \text{m}^2/\text{s}} \approx 2.5\cdot 10^{7}.$$Twenty-five million: viscosity matters only in a boundary layer millimetres thin next to the bodywork, and behind the car the flow tears into eddies of every size — turbulence. There is no formula for such a flow; it can only be computed.
The lattice Boltzmann method
There are many ways to solve these equations. We use the lattice Boltzmann method, the approach behind research codes (FluidX3D) and industrial automotive software (PowerFLOW). Instead of a velocity and a pressure, each cell stores 19 numbers $f_i$: how much air moves in each of 19 directions $\mathbf c_i$ — at rest, towards the 6 faces or towards the 12 edges (the D3Q19 lattice). Density and velocity are just sums:
$$\rho = \sum_i f_i,\qquad \rho\,\mathbf u = \sum_i f_i\,\mathbf c_i.$$A step has two parts. Streaming: each $f_i$ hops to the neighbour in its direction. Collision: in each cell the numbers relax towards the equilibrium distribution, the way colliding molecules settle:
$$f_i(\mathbf x + \mathbf c_i,\ t + 1) = f_i^{\mathrm{eq}} + \Big(1 - \frac{1}{\tau}\Big)\big(f_i - f_i^{\mathrm{eq}}\big),\qquad f_i^{\mathrm{eq}} = w_i\,\rho\Big(1 + 3\,\mathbf c_i\!\cdot\mathbf u + \tfrac92 (\mathbf c_i\!\cdot\mathbf u)^2 - \tfrac32\,\mathbf u^2\Big) + \dots$$The Chapman–Enskog expansion shows that these simple rules give exactly the Navier–Stokes equations, with viscosity set by the relaxation time: $\nu = c_s^2\,(\tau - \tfrac12)$, where $c_s^2 = 1/3$ is the lattice speed of sound squared. The method’s great virtue is locality: each cell looks only at its neighbours, so millions of cells update at once — the graphics card does two billion cell updates a second.
Scales: a cell is about 3.8 cm, the tunnel 14 × 4.4 × 2.2 m. The flow moves 0.1 cells per step — a Mach number around 0.17, like the real car at 250 km/h — which fixes the time step: $\Delta t = h\,u_\text{lat}/U \approx 5.5\cdot 10^{-5}$ s. The card does about ten steps per frame, so the picture is slowed down roughly 40 times; the exact factor is in the readout on the right.
Turbulence we cannot resolve
To resolve every eddy at $\mathrm{Re} = 2.5\cdot 10^7$ you would need cells smaller than a tenth of a millimetre, about $10^{15}$ of them. So the computation uses the real viscosity of air, and the eddies smaller than a cell are represented by Smagorinsky’s subgrid model (large-eddy simulation, LES): where the flow shears strongly, the viscosity rises:
$$\nu_t = (C_s\,\Delta)^2\,|S|,\qquad C_s = 0.12.$$On the lattice this becomes a local $\tau$ in each cell, found from the non-equilibrium momentum flux $\Pi^{\mathrm{neq}}$ without any derivatives: $\tau = \tfrac12\big(\tau_0 + \sqrt{\tau_0^2 + 18\sqrt2\,C_s^2\,|\Pi^{\mathrm{neq}}|/\rho}\big)$.
Keeping the lattice from blowing up
With the real viscosity of air, $\tau - \tfrac12 \approx 10^{-6}$: the scheme damps almost nothing. The first version of the tunnel showed what that means. Ripples two cells wide grew behind the car and within a few thousand steps filled the tunnel — even the air ahead of the car shook at 30 % of its speed. An empty box with a 0.1 stream and tiny noise did the same: the error grew exponentially. This is a known weakness: in a moving flow the scheme’s second-order errors grow like $u^3$.
Three things fixed it:
- Third-order recursive regularisation (O. Malaspinas, 2015; C. Coreixas et al., 2017). The non-equilibrium part of $f_i$ is rebuilt from $\Pi^{\mathrm{neq}}$, and its third moments recursively: $a^{(3)}_{\alpha\beta\gamma} = u_\alpha a^{(2)}_{\beta\gamma} + u_\beta a^{(2)}_{\alpha\gamma} + u_\gamma a^{(2)}_{\alpha\beta}$. The equilibrium also gets the third-order terms the D3Q19 lattice can hold (six of them). With this, seeded noise decays even at $\tau - \tfrac12 = 10^{-6}$.
- Bulk viscosity (Dellar, 2001). The trace of $\Pi^{\mathrm{neq}}$ is about compression, that is, sound; it relaxes separately and strongly. The sound waves with which the turbulent wake rings through the whole tunnel die out, while the shear flow is untouched — legitimate for air that does not compress.
- Absorbing layers at the tunnel’s inlet and outlet, so waves and the wake leave without bouncing back.
With these, the incoming flow is steady to 0.03 % of its speed — at the real viscosity of air.
The car on the lattice
The car model is first cut into 1 cm voxels: its surface and everything inside it. The cockpit, the airbox and the sidepod inlets are sealed: on a real car the driver, radiators and engine sit there, and air does not flow through the body. Each lattice cell then gets a solid fraction $\varepsilon$, the average over 64 points inside it. This is redone in a millisecond for every yaw angle, ride height and DRS flap angle, so the knobs move smoothly.
In cells containing solid, the air is pulled towards the surface’s velocity. This is the partially saturated cells method (Noble and Torczynski, 1998):
$$f_i \leftarrow f_i^{\mathrm{eq}} + \Big(1 - \frac{1 - B}{\tau}\Big) f_i^{\mathrm{neq}} + B\,\Omega^s_i,\qquad \Omega^s_i = f_{\bar\imath} - f_i + f_i^{\mathrm{eq}}(\rho, \mathbf u_s) - f_{\bar\imath}^{\mathrm{eq}}(\rho, \mathbf u).$$The weight $B$ goes from 0 to 1 with $\varepsilon$; wing elements thinner than a cell count as solid, otherwise air would leak through them. On the wheels the surface velocity is the rotation $\mathbf u_s = \boldsymbol\omega \times \mathbf r$, with the bottom of the wheel moving with the road. The road itself is a moving wall: an $f$ bouncing off it gains $6\,w_i\,\rho\,\mathbf c_i\cdot\mathbf u_w$.
How the force is measured
Whatever momentum the air loses on the car, the car gains. The momentum the collision takes from the air in each solid cell is summed over the parts of the car: front wing, floor, rear wing, wheels, the rest of the body.
$$\mathbf F = -\sum_{\text{cells}} B \sum_i \Omega^s_i\,\mathbf c_i,\qquad F_\text{N} = F_\text{lat}\cdot\frac{\rho_\text{air}\,h^4}{\Delta t^2}.$$The forces jump about with the turbulence, so the readout shows the mean over the last ~0.08 s of flow. A kilogram-force is the weight of one kilogram, $9.81$ N.
What is simplified, and where the numbers differ from reality
The flow is computed honestly, but the grid is coarse. Absolute forces therefore differ from the real ones, while the changes — from DRS, ride height, dirty air — go the right way. Here is what the computation gives at 250 km/h with 3.8 cm cells, next to estimates for a real car from public data:
| This computation | A real car (estimate) | |
|---|---|---|
| Drag | ≈ 800–1000 kgf | ≈ 350 kgf ($C_D A \approx 1.2\ \text{m}^2$) |
| Vertical force | ≈ 500 kgf up | ≈ 1200 kgf down ($C_L A \approx 4\ \text{m}^2$) |
| Front + rear wing | ≈ 150 kgf down | ≈ 600 kgf down |
Why they differ:
- The boundary layer is not resolved. On the real car it is under a millimetre thick; our cell is 3.8 cm. Without a wall model, rounded bodies — tyres, sidepods — behave as at a low Reynolds number: the flow separates early, the wake is wider, drag is higher. A sphere test shows the same: $C_D \approx 0.33$, where a real sphere at this Re has 0.1–0.2.
- The gap under the floor is two cells. Ground effect, the main source of downforce, lives in the flow through a gap of a few centimetres, which needs dozens of cells to resolve; here the floor underperforms. That is also why the car sits 3.5 cm higher by default.
- A simplified floor. The free model’s floor is flat, without Venturi tunnels, like the 2009–2021 cars.
- A tight tunnel. The car blocks about 15 % of the cross-section, as is usual in real tunnels too; they correct for it, we show the raw numbers.
- No radiators, brakes or exhaust; rigid tyres, no suspension movement, hence no porpoising.
- The model is approximate — a hobbyist 3D model resembling the W14, not the real car’s geometry.
As the grid gets finer the numbers move the right way: at 3.0 cm (the “Maximum” setting) the wings press about one and a half times harder and the total lift drops fivefold. Teams use hundreds of millions of cells, wall models and the tunnel to get numbers they trust.
How it was checked
- The same step is written a second time in JavaScript, in double precision; on a small tunnel with a spinning ball the GPU matches it to $7\cdot10^{-7}$ in f32 and $5\cdot10^{-5}$ in f16, with forces to $10^{-4}$.
- Couette flow (a moving floor under a still wall) gives the exact linear profile — a check of the moving wall.
- A Taylor–Green vortex decays as $e^{-2\nu k^2 t}$ to 1 % — the viscosity is right.
- Flow past a cylinder at Re = 100 sheds vortices at a Strouhal number of 0.16–0.17 (reference 0.165).
- An empty tunnel stays exactly uniform; mass is conserved to $10^{-13}$.
Sources
Krüger T. et al. The Lattice Boltzmann Method: Principles and Practice. Springer, 2017. — Latt J., Chopard B. Lattice Boltzmann method with regularized pre-collision distribution functions. Math. Comput. Simul., 2006. — Malaspinas O. Increasing stability and accuracy of the lattice Boltzmann scheme: recursivity and regularization. arXiv:1505.06900, 2015. — Coreixas C. et al. Recursive regularization step for high-order lattice Boltzmann methods. Phys. Rev. E 96, 033306, 2017. — Dellar P. Bulk and shear viscosities in lattice Boltzmann equations. Phys. Rev. E 64, 031203, 2001. — Noble D., Torczynski J. A lattice-Boltzmann method for partially saturated computational cells. Int. J. Mod. Phys. C 9, 1998. — Hou S. et al. A lattice Boltzmann subgrid model for high Reynolds number flows. Fields Inst. Commun. 6, 1996. — Lehmann M. FluidX3D — lattice Boltzmann on GPUs, the FP16S trick. — FIA Formula 1 Technical Regulations and Aerodynamic Testing Restrictions.
Car model: “Mercedes F1 W14 [FREE!!]” by 3dblender_1 (Sketchfab), CC BY 4.0; repainted, logos removed.