This is a 2D atmospheric "box model": instead of watching molecules collide, it integrates the real coupled reaction-rate equations for an air parcel over a simulated day, driven by a real diurnal sunlight curve (rises ~6am, peaks near solar noon, sets ~6pm):
NO2 + hv (UV) -> NO + O3 [photolysis, rate J(t) ∝ sunlight(t)]
NO + O3 -> NO2 + O2 [titration — consumes ozone]
VOC + OH -> RO2 [OH formed photochemically, ∝ sunlight(t)]
RO2 + NO -> NO2 + products [net O3-producing propagation]
RO2 + NO2 -> PAN [reservoir formation]
PAN -> RO2 + NO2 [thermal decomposition, k = A·exp(-Ea/RT)]
Every step is an explicit numerical integration of these six coupled rate equations (Euler sub-stepping for stability), not a scripted animation. Two heat-driven multipliers apply everywhere temperature enters the model, exactly as in the 3D version of this simulator: an Arrhenius-style rate factor that doubles roughly every 10°C (reaction kinetics and biogenic VOC emission, Guenther-style), and faster PAN decomposition with Ea ≈ 113 kJ/mol releasing stored NOx back into circulation as heat rises.
The counter-intuitive regime shift: when VOC is scarce relative to NOx ("VOC-limited"), extra NOx mostly reacts via NO + O3 → NO2, titrating ozone away rather than producing more of it — so raising NOx emission can lower the afternoon O3 peak. When VOC is abundant relative to NOx ("NOx-limited"), extra NOx accelerates the RO2 + NO propagation step that manufactures ozone, so raising NOx raises the peak instead. This mirrors the real "ozone isopleth" VOC/NOx sensitivity ratio used in air-quality science (Sillman, 1999). Click Freeze this curve as reference, then change the NOx slider and watch the new solid curve against the frozen dashed one — the regime banner tells you which side of the ratio you are on.
The Ozone readout uses the same US EPA 8-hour ozone breakpoints (ppb) as the 3D version: Good ≤54, Moderate 55–70, Unhealthy for Sensitive Groups 71–85, Unhealthy 86–105, Very Unhealthy >105.