Every bar is a node of a 1D wave equation utt = c²uxx, stepped with the explicit central-difference (leapfrog) scheme:
u[i]ⁿ⁺¹ = 2u[i]ⁿ − u[i]ⁿ⁻¹ + r²(u[i+1]ⁿ − 2u[i]ⁿ + u[i−1]ⁿ)
r = c·Δt / Δx (Courant–Friedrichs–Lewy number)
This explicit scheme is only numerically stable while r ≤ 1 — the CFL condition: information cannot be allowed to cross more than one grid cell per timestep, or the discretisation overshoots and every step amplifies its own error until the field diverges. Verified numerically for this build: r=0.99 stays bounded through 2000 steps, r=1.001 blows past the divergence cap within 510 steps — the source article's claim of a hard threshold at r=1 checks out to three decimal places.
- Adaptive mode picks Δt = r·Δx/c every frame from the Courant slider, so raising resolution (N) automatically shrinks Δt to stay stable — the "smaller timestep, more steps needed" trade-off: finer spatial resolution is only affordable if you also pay for more, smaller timesteps.
- Manual mode fixes Δt directly. Push N up while Δt stays the same and r = cΔt/Δx quietly climbs past 1 — the same grid that was rock-solid at low resolution now explodes, with no other setting touched.
- Sim speed caps stepping at a fixed compute budget (120 substeps per animation frame, standing in for a fixed CPU/GPU time slice). When the stability-mandated Δt is so small that keeping up with real time would need more substeps than the budget allows, the simulation deliberately falls behind — the same "not enough headroom" bottleneck made visible as a number instead of a stutter.
- Boundary condition changes what "the edge of the grid" means physically: fixed (Dirichlet, u=0) forces a node there and flips an arriving pulse's sign on reflection; free (Neumann, zero slope) mirrors the neighbour value and reflects the pulse upright. Same PDE, same Δt policy, visibly different edge behaviour.
Real solvers (CFD, seismic, EM/FDTD) live or die by this same inequality — it is the single most common reason a "just make Δt smaller" fix silently makes a simulation ten times slower, and the single most common reason an "unstable" bug is really just an oversized timestep.