Spatial SIR epidemic
Is there a sharp threshold above which a local outbreak becomes a lattice-wide epidemic — and where is it?

▶ Run the simulationSee the measured result
Units: dimensionless (open-bond probability = transmissibility T; square-lattice bond-percolation threshold, exact — Kesten 1980). Secondary knowns: triangular-lattice bond threshold 2·sin(π/18)=0.3472963 exact; Bethe/tree branching threshold at coordination z=4 is 1/(z−1)=0.33333.
How the lab tests it
Run the simplest spatial SIR: each infected cell infects every susceptible 4-neighbour with probability T, then recovers (immune). From one seed, sweep T and measure the final immune fraction and the spanning probability (does the outbreak reach the boundary?); locate T_c at the Π = ½ crossing.
What it checks
a sharp epidemic threshold at T_c ≈ ½ — exactly the square-lattice bond-percolation threshold (Grassberger's SIR↔percolation map, exact by duality; the live single-seed crossing on the finite 151² lattice reads just under ½, ≈0.495, converging to ½ as the lattice grows) — and notably ABOVE the well-mixed mean-field prediction R₀ = 1 (T ≈ ⅓ on a 4-contact graph), because spatial clustering wastes infections on already-hit neighbours
Epidemic threshold calculator: R₀, herd immunity and the lattice T_c
Two numbers answer 'when does an outbreak become an epidemic', and they disagree. The well-mixed one is the famous one: each case makes R₀ = (z−1)T others, the epidemic starts at R₀ = 1, and on a four-contact graph that is a transmissibility of one third. The simulation above does not do that. It infects each susceptible neighbour once, with probability T, on a lattice — and a lattice has short loops, so a growing outbreak keeps spending infections on neighbours it has already reached. Grassberger's mapping says what that costs exactly: the SIR rule IS bond percolation, so the epidemic threshold is the bond-percolation threshold, and on the square lattice that is one half by self-duality, proved by Kesten. Every threshold on this page is computed rather than quoted: the lattice's duality condition is a polynomial, and the page bisects it — multiplies and adds, correctly rounded, no transcendental anywhere near the answer — so the square lattice's threshold arrives as an exact zero at the first midpoint, the triangular lattice's arrives at 2sin(π/18) without a sine being evaluated, and the honeycomb lattice's arrives too, though this lab has never run one and says so rather than comparing. The rival is carried as a DIAL rather than as a second formula: g is how many of a case's z−1 chances the loops waste, T_c = 1/(z−1−g), and its two ends are the whole argument — g = 0 hands back the falsified mean-field one third, g = 1 hands back the square lattice's one half as the same double, and running it backwards on this lab's own measured crossing gives 1.0028 ± 0.0020 wasted neighbours, which is one, to within one and a half standard errors. Four contacts, three chances, and the loops eat one of them. Two directions then turn the threshold into something usable: Newman's T = 1 − e^(−βτ) converts rates into it (and finds that at the self-dual threshold the infectious period is exactly one halving time, βτ = ln 2), and the herd-immunity direction prices 1 − 1/R₀ at the R₀ the lattice actually demands, which is 1.5 rather than 1. The last two directions audit the simulation instead of the physics: one runs the shipped module's own crossing estimator, expression for expression, on the module's own two sweep bins and reproduces the executed on-screen number; the other lays the three rulers side by side — the exact root, the oracle's finite-size crossing, and the screen — and checks that the two disclosed systematics, opposite in sign, add up to the gap between them with nothing left over. What this page will not do: extrapolate a finite lattice to infinity (that is the oracle's job and the finding's), price a site-percolation threshold (a different world on this site owns that), or pretend the honeycomb number has been measured here.
T_c = the root in (0,1) of the lattice's duality condition — square: p = 1−p (self-dual) · triangular: p³−3p+1 = 0 · honeycomb: p³−3p²+1 = 0 · R₀ = (z−1)T, herd immunity = 1 − 1/R₀, well-mixed threshold T* = 1/(z−1) · T = 1 − e^(−βτ) · rival as a dial: T_c = 1/(z−1−g) · screen estimator: T_c = T₁ + [(½ − Π₁)/(Π₂ − Π₁)]·(T₂ − T₁)