Science Journaling Club Founded 2024

VOLUME 1, ISSUE 2 · WINTER 2025 · ORIGINAL RESEARCH

Why Small Fires Are Common and Big Fires Are Not Rare Enough

Written jointly by the Science Journaling Club

Computational study · Peer-edited by the club review board · LaTeX source · Analysis code · Raw output · Interactive model

Abstract Trees grow at random, lightning falls at random, and whatever connected patch the bolt lands in burns. Those two rules make the Drossel-Schwabl forest fire model, which the literature quotes everywhere as a clean case of self-organised criticality, complete with a power-law distribution of fire sizes. We tested the claim rather than repeating it. The club wrote the model and ran it on a laptop, and since no forest was observed and no fire measured anywhere, the computation itself is the experiment. Across five values of \(\theta = p/f\) spanning two decades and three lattice sizes we recorded 416,000 fires, 120,000 of them in a main run at \(512 \times 512\) with \(\theta = 500\). We fitted a truncated discrete power law by maximum likelihood, after first checking the estimator on synthetic data with a known exponent, where it recovered the truth in all five tests with a largest \(z\) of 1.61. The same synthetic data fitted the popular way, a straight line through a log-log histogram, came out 35.2% low on a known \(\tau = 1.5\), which is the sort of error nobody notices when the true answer is unknown. On the fire data, the main-run exponent over \(s \in [4, 500]\) is \(\tau = 1.1269 \pm 0.0025\) (moving-block bootstrap), close to the \(1.15\) the pre-2002 literature reports. The power law is nonetheless rejected: the Kolmogorov-Smirnov distance of 0.00824 gives \(p < 0.005\) over that window, and over the full range the distance is 26× the 95th percentile of what the fitted law itself produces. The exponent is not a constant of the model either, which is the part that unsettled us. It climbs from 1.0394 at \(\theta = 50\) to 1.1741 at \(\theta = 5000\), a drift of +0.069 per decade, with \(\chi^2 = 466.3\) on 4 degrees of freedom against a constant. Two things did land: the steady-state identity \(\langle s \rangle = \theta(1-\rho)/\rho\) held to 0.14%, and our tree density at \(\theta = 125\), 0.38073, sits 0.9 standard errors from Grassberger's tabulated 0.379837. Our lattices are three to four orders of magnitude smaller in area than the ones that reopened the criticality argument, so we can measure the drift and cannot settle where it stops. Seed 20251124.

A Distribution With No Sensible Average

Out of the 120,000 fires in our main run, 13,373 of them burned exactly one cell and then went out. They make up 11.14% of every fire in the record. Between them they destroyed 13,373 cells out of 92,683,166. Rounded honestly, they destroyed nothing.

Now the other end: fires of a thousand cells or more made up 18.004% of the count and 88.5% of the burnt area, and the single largest of them took 38,758 cells, 14.8% of the whole lattice, once and never again. The median fire was 32 cells. The mean was 772.36.

A median of 32 against a mean of 772 states the whole problem. Whatever you want to call the typical fire here, the average is not it, and the typical fire is not the average either, because the tail is heavy enough that a handful of events almost nobody in the record ever lived through drags the arithmetic mean around behind them.

11.14%of fires burned one cell
88.5%of area burnt by 18% of fires
32 vs 772median against mean fire size
416,000fires recorded in total

We started this because the model is charming. Two rules and nothing else, and out drops a size distribution shaped like the ones people plot for real wildfires and real earthquakes, which is exactly the charm and exactly the trap. We finished it less charmed, because the exponent everybody quotes for this model is not stable, our own goodness of fit test rejects the power law it is supposed to describe, and the reason the rejection does not show up more often in the literature is that a straight line drawn through a log-log plot cannot notice.

The Lattice Is Not a Forest

We have no forest. The club owns no plot, no drone and no fire permit, so our research is computation, and this article is the output of a program we wrote, running a mathematical object that is only distantly related to a wood. What we do have is a room with computers in it, and when we say we measured something, we mean we measured it from our own simulated fires, the way you would measure the frequency of heads by flipping a coin many times.

The model is due to Drossel and Schwabl in 1992 [2], building on the self-organised criticality programme that Bak, Tang and Wiesenfeld started five years earlier [1]. Each of the \(L \times L\) cells is empty or holds a tree, and we use helical boundary conditions: every cell carries a single index \(i\), its neighbours are \(i \pm 1\) and \(i \pm L\), and \(i + L^2\) is identified with \(i\). Grassberger wired his lattice the same way [7], so his densities and ours can be compared digit for digit.

Two moves, repeated forever:

Fires are instantaneous relative to growth, so nothing grows while anything burns. That double separation of time scales is what makes the model tractable, and it is what the review literature means by the critical state of this model [5]. It also means the two rates enter only through their ratio:

$$\theta = \frac{p}{f} = \text{growth attempts per lightning strike.}$$

Each elementary event in our code is a growth attempt with probability \(\theta/(1+\theta)\) or a strike with probability \(1/(1+\theta)\), so the number of plantings between strikes is geometric with mean \(\theta\), while the critical limit is \(\theta \to \infty\), which is where the whole argument lives.

What the lattice leaves out is most of a forest, since fire spreads to every touching tree with probability one and to nothing else, so there is no wind, no slope, no ember thrown across a firebreak, no humidity and no species that resists burning. Trees appear at uniformly random cells, which no seed does, and burnt ground is ready for a new tree the instant the fire passes, so nothing in the model corresponds to soil damage, or to a seed bank, or to succession, or to the years a burnt slope spends as scrub. Lightning falls uniformly in space and time. Real ignition clusters in storms and follows drought. A cell is not an acre. A fire of 38,758 cells is not a hectare of anything, and we have no conversion to offer. Nothing in this article is a prediction about any real forest.

Checking the Ruler Before Measuring the Room

Before fitting anything from the model we checked the fitting machinery against data whose answer we already knew by construction. The exponents here sit near 1.15, well below 2, so the unbounded discrete power law is no use: \(\sum_{k} k^{-\tau}\) diverges for \(\tau \le 1\), leaving nothing to normalise with. We fit the power law truncated to the integer support \([s_{\min}, s_{\max}]\),

$$P(s) = \frac{s^{-\tau}}{Z(\tau)}, \qquad Z(\tau) = \sum_{k=s_{\min}}^{s_{\max}} k^{-\tau},$$

whose log-likelihood is \(\ell(\tau) = -\tau \sum_i \log s_i - n \log Z(\tau)\). Setting the derivative to zero gives a condition that is easy to state and easy to solve: the model's mean of \(\log s\) must equal the data's, and the model's mean decreases monotonically in \(\tau\), so one bisection finds the maximum. The standard error comes from the Fisher information, \(\mathrm{SE} = 1/\sqrt{n \operatorname{Var}(\log s)}\). The apparatus belongs to Clauset, Shalizi and Newman [12], with the truncation handled the way Deluca and Corral set out [13].

Then, synthetic data from a known exponent, handed to the estimator. Five tests, four of which used 200,000 draws:

true τnsupportrecovered τSE differencez
1.16200,000[1, 10000] 1.160930.00085+0.00093+1.09
1.1620,000[1, 10000] 1.163470.00269+0.00347+1.29
1.50200,000[1, 10000] 1.500350.00127+0.00035+0.27
2.50200,000[1, 10000] 2.497890.00377−0.00211−0.56
1.16200,000[10, 3000] 1.162210.00138+0.00221+1.61

Every \(|z|\) is below 2. The estimator recovers the truth inside its own stated error at two sample sizes, at three exponents and on two different supports, which is the whole test; had it failed, there would have been no article.

Then we fitted exactly the same synthetic data the way almost every undergraduate lab does it: histogram the values, take logarithms of both axes, fit a straight line by least squares. Figure 1 shows what that gives on data whose answer is known by construction.

1 1 1.5 1.5 2 2 2.5 2.5 MLE (on the line)OLS log-binnedOLS raw histogramrecovered = true true exponent τ, known by construction recovered τ Checking the ruler: three estimators on synthetic data Each point is 200,000 draws from a truncated power law with theexponent on the x axis. The diagonal is the right answer. Maximum likelihood sits on it; regression does not.
Figure 1. Three estimators run on synthetic draws from a truncated power law with a known exponent, so the right answer is the dashed diagonal. Maximum likelihood sits on it at all three exponents, out by 0.1% at worst. Least squares through a raw integer histogram is low by 8.5% at \(\tau = 1.16\), by 35.2% at \(\tau = 1.50\) and by 29.0% at \(\tau = 2.50\). Log-binning repairs most of the damage and overshoots instead, by 2.5% to 4.3%. All nine points come from the same 200,000-draw samples.

The raw-histogram regression is not a little biased. At \(\tau = 1.5\) it returns 0.97215 when the answer is 1.5, an error of a third on data manufactured to have no complications at all. The mechanism is not mysterious: the tail bins hold one or two events each, empty bins are silently dropped because the logarithm of zero cannot be plotted, and the surviving points in the tail sit systematically above where the law says they should. The fit then flattens to accommodate them, and Newman set this out plainly twenty years ago, while regression through a log-log histogram is still the default method in a great many papers [12], including papers whose conclusions rest on the exponent it gets wrong.

Working Notes From the Club Table

Meeting 1
First version: a recursive flood fill. Python's recursion limit is 1000. Fires are routinely larger, so it died on the third fire of the first run. Rewrote with an explicit stack.

Meeting 1, later
Planting trees one at a time cost more than the burning. Now we draw the geometric gap to the next strike. Then one vectorised assignment plants that many cells. Main run went from unusable to 145 seconds.

Meeting 2
Argument about the fitting window. Somebody wanted \(s_{\min} = 1\). The distribution visibly bends below about 4 because a fire of one, two or three cells is a lattice artefact rather than anything scaling, and fitting from 1 drags \(\tau\) down to 1.0526. We fixed the window at \([4, \theta]\) and said so everywhere, because a window chosen after seeing the answer is not a window, it is a preference.

Meeting 2
Tried the automatic \(s_{\min}\) rule that minimises the KS distance. It lands on \(s_{\min} = 6\), leaves 1.92 decades, and gives 1.1386. Call that 4.3 fit-B standard errors above the number we report. Look at the KS column of the printed scan though: from \(s_{\min} = 6\) to \(s_{\min} = 64\) it wanders between 0.00467 and 0.00806 with no real minimum, so which \(s_{\min}\) wins is decided by noise. A rule whose answer noise picks is not a rule. See §9.

Meeting 3
The script crashed twice with MemoryError while another project hogged the machine. Not our bug, but our problem. The planting array at \(\theta = 5000\) held 1.2 million integers. Capped it at 50,000 per batch, dropped to 32-bit indices, and pinned BLAS to a single thread so that numpy would import at all on a machine that was short of memory. None of that changes a single number.

Meeting 3
Goodness of fit returns \(p = 0.000\) on the main window. Spent a meeting assuming we had broken the test. We had not. See §6, and the subsample table there, which actually explains it.

Meeting 4
Seed fixed at 20251124. Every number here comes from one run of the file as it now stands. The run takes 699 seconds.

The Arithmetic

One thing in this study is exact. Do it by hand before trusting anything that was fitted. In a steady state every tree that grows must eventually burn. Count per lightning strike. A strike is preceded by \(\theta\) growth attempts on average, of which a fraction \(1 - \rho\) land on empty cells and become trees, where \(\rho\) is the tree density. A fraction \(\rho\) of strikes hit a tree and start a fire. That fire has mean size \(\langle s \rangle\). Trees in must equal trees out:

$$\theta\,(1 - \rho) = \rho \, \langle s \rangle \qquad \Longrightarrow \qquad \langle s \rangle = \frac{\theta\,(1 - \rho)}{\rho}.$$

No fitting, no approximation, no free parameter. Put our main run through it.

theta 500
strikes 305,633
strikes that hit a tree 120,000
so rho = 120000 / 305633 = 0.39263
1 - rho = 0.60737
500 x 0.60737 = 303.685
303.685 / 0.39263 = 773.471 predicted mean fire
cells burnt = 92,683,166
fires = 120,000
92683166 / 120000 = 772.360 measured mean fire
difference = -1.111 (-0.144%)
standard error on the mean = 5.608
difference in standard errors= -0.20

A fifth of a standard error. If the lattice were not in a steady state, or the flood fill were missing cells at the boundary, or the geometric gaps were off by one, these two numbers would part company and the whole study would be worthless. They do not part company, so the simulator is doing what the model says it should be doing. A check, not a discovery. Still, it is the only number here that comes with a guarantee.

The density trace backs it up. During the discarded warm-up of 10,485 fires the density averaged 0.39226. First half of the recording, 0.39187; second half, 0.39400. No trend worth naming survives 120,000 fires. A steady state is supposed to look exactly that boring.

1.12 1.14 1.16 1.18 1.2 1.22 1.24 1e3 1e4 1e5 fires accumulated running τ final value 1.1269 The estimate settling down as fires accumulate
Figure 2. The running maximum likelihood exponent over the window \(s \in [4, 500]\), plotted against the number of fires accumulated, with a band of \(\pm 1\) asymptotic standard error. The first estimate, from 600 fires, is 1.1920 with an error of 0.0385, so it is consistent with the final answer and useless. By 24,000 fires the estimate is 1.1302 and within 0.004 of where it ends. The final value from all 120,000 fires is 1.1269. Nothing dramatic happens after the first few thousand fires, which is the point: the estimate converges, and the error keeps shrinking as \(1/\sqrt{n}\) exactly as it should.

The Test Says No

Now the distribution itself. Every fire in the main run, log-binned at eight bins per decade, with two lines drawn through it: the maximum likelihood fit over \(s \in [4, 500]\), and the line a least-squares regression puts through the raw log-log histogram over the same window.

1 10 100 1e3 1e4 1e5 1e-8 1e-6 1e-4 1e-2 1 fire size s (cells burnt) P(s) fit window [4, 500] Fire size distribution, 120,000 fires at L = 512, θ = 500 maximum likelihood, τ = 1.1269 log-log regression, τ = 1.1231 points: log-binned, 8 bins per decade
Figure 3. Fire size distribution from the main run, 120,000 fires at \(L = 512\) and \(\theta = 500\), log-binned at eight bins per decade. The shaded strip is the fitted window \(s \in [4, 500]\). The solid line is maximum likelihood, \(\tau = 1.1269\); the dashed line is the log-log regression on the same window, \(\tau = 1.1231\). On this particular data set the two nearly agree, which is luck rather than vindication: on synthetic data with a known answer the same regression was wrong by up to 35% (Figure 1). Note the shoulder above \(s \approx 2000\), well beyond the fitted window, where the distribution stops falling as fast as a power law and then drops off a cliff.

It looks like a power law. The test says otherwise. We tested it with the semi-parametric procedure of Clauset, Shalizi and Newman [12]: fit the law, generate synthetic data sets of the same size from the fitted law, refit each one, and ask how often a synthetic set fits its own model worse than the data fit theirs.

Over the full range, \(s = 1\) to 38,758, the fitted exponent is \(\tau = 1.1174\), and the Kolmogorov-Smirnov distance between data and fit is 0.05978. Synthetic sets drawn from the fitted law produce a mean distance of 0.00166 and a 95th percentile of 0.00233. Our data sit 26 times the 95th percentile. Rejected, and not narrowly.

Over the fitted window \(s \in [4, 500]\) the fit is closer. Closer is not close enough: the distance of 0.00824 stands against a synthetic 95th percentile of 0.00356, and none of the 200 synthetic sets managed to fit its own model as badly as the data fit ours. \(p < 0.005\).

Before treating that as a result, look at what the same test does on subsamples of exactly the same fires, drawn from the same window and fitted the same way:

fires usedτKS distancegoodness of fit pverdict
3001.13440.040890.160power law fine
1,0001.10600.023260.140power law fine
3,0001.12150.007300.920power law fine
10,0001.13240.009110.040rejected
30,0001.12800.006640.000rejected
66,1991.12690.008240.000rejected

The fitted exponent barely moves; the verdict flips completely. The table says nothing about the forest fire model and everything about hypothesis tests: with enough data a test rejects any model that is even slightly wrong, and every model is slightly wrong. Somebody who ran 1,000 fires would publish that the power law fits beautifully and would be reporting the size of their sample, not a property of the world.

So the rejection on its own is cheap, and what makes it worth reporting is that we can see the shape of the failure rather than just its \(p\) value, and the shape is the one Grassberger reported as early as 1993, when high-statistics runs contradicted the exponents Drossel and Schwabl had derived [3], and which he pinned down in 2002 on lattices a thousand times larger than ours [7]. Pruessner and Jensen confirmed it with a better algorithm [8][10]. Figure 4 shows it. Multiply the distribution by \(s^{\tau}\). A true power law would come out horizontal.

θ=50 θ=125 θ=500 θ=2000 θ=5000 1 10 100 1e3 1e4 1e5 1e-3 1e-2 1e-1 fire size s s^τ P(s) Compensated distributions, τ = 1.1269 (flat means power law) Each curve is one run at L = 512. A true power law of exponent1.1269 would be a horizontal line. None of them is horizontal for long.
Figure 4. Compensated distributions \(s^{\tau}P(s)\) with \(\tau = 1.1269\), the main-run exponent, applied to all five values of \(\theta\). A genuine power law of that exponent would appear as a horizontal line over the scaling range. The \(\theta = 50\) curve is nearly flat only because its scaling range is barely a decade long; at larger \(\theta\) each curve tilts upward, runs into a raised shoulder just below the cutoff, and then falls. The shoulder is the feature that broke simple scaling in the published work [7][8], and it is visible at lattice sizes a school club can run.

The Exponent Will Not Sit Still

If the model were critical in the plain sense, \(\tau\) would be a number belonging to the model rather than to the run. We measured it at five values of \(\theta\) across two decades, with the window held at \([4, \theta]\) throughout so that it keeps the same position relative to the cutoff at every \(\theta\).

θfiresρ⟨s⟩ measured ⟨s⟩ exactdifflargest fire% of lattice ⟨s²⟩/⟨s⟩τSE (bootstrap)gof p
50100,0000.36588 86.6586.66−0.012% 3,0341.2%416.9 1.03940.00580.010
125100,0000.38073 203.60203.32+0.137% 6,8352.6%1,177.6 1.07240.00410.000
500120,0000.39263 772.36773.47−0.144% 38,75814.8%5,657.8 1.12690.00290.000
2,00020,0000.40068 2,992.162,991.50+0.022% 97,88337.3%24,849.3 1.16090.00580.020
5,00010,0000.40185 7,433.187,442.50−0.125% 154,57859.0%58,678.0 1.17410.00560.120
all runs at L = 512, window s in [4, θ], errors from a moving-block bootstrap of the fire sequence

The exponent climbs from 1.0394 to 1.1741 across the table, and against the hypothesis that these five numbers estimate a single constant, the weighted mean comes to 1.1145 with \(\chi^2 = 466.3\) on 4 degrees of freedom, which is not a near miss. A constant exponent is not supported at any of the lattice sizes and ratios we can reach. Fitted as a straight line in \(\log_{10}\theta\), the drift is +0.069 per decade.

The errors in that table come from a moving-block bootstrap rather than from the likelihood, because consecutive fires in a single run are nothing like independent of one another, since a large fire clears the lattice and the fires immediately after it are small. Resampling contiguous blocks of the fire sequence keeps that structure. The main run barely notices: 0.0025 against the asymptotic 0.0027, a ratio of 0.92. Knowing that was worth the trouble.

1.02 1.04 1.06 1.08 1.1 1.12 1.14 1.16 1.18 1.2 pre-2002: 1.15 Grassberger: 1.19 100 1e3 θ = p/f fitted τ a. exponent drifts upward largest 99.9 pct cutoff 100 1e3 1e3 1e4 1e5 θ = p/f cutoff fire sizeb. the cutoff moves with θ Bars are moving-block bootstrap standard errors. Five independentruns at L = 512. The rightmost point in panel a is the one to distrust: at θ = 5000 the biggest fires are limited by the lattice rather than by θ.
Figure 5. Left: the fitted exponent against \(\theta\), with moving-block bootstrap standard errors. The two dashed horizontals are the value the pre-2002 literature settled on (1.15, in our convention) and Grassberger's own 2002 estimate (1.19). Our points pass through the first and approach the second, but they are still climbing when we run out of lattice. Right: three measures of where the distribution is cut off, all against \(\theta\) on log axes. The ratio \(\langle s^2\rangle/\langle s\rangle\) scales as \(\theta^{1.081 \pm 0.019}\), against Grassberger's reported 1.08 for the large-\(\theta\) limit. The largest fire seen scales as \(\theta^{0.882 \pm 0.077}\), and it scales more slowly precisely because at large \(\theta\) it is the lattice, not \(\theta\), that sets it.

One number in that figure is the best agreement in the whole study, and we want to be clear that it is also by some distance the cheapest. Our cutoff scaling exponent of 1.081 matches Grassberger's 1.08 to three digits, and it comes from a five-point regression whose own error bar is 0.019, which is to say from five points and a lot of goodwill. Agreement that good on that few points is partly luck, whereas the tree density comparison is the honest one: our \(\theta = 125\) run gives \(\rho = 0.38073\) from 262,653 lightning strikes, a binomial standard error of 0.00095, sitting 0.9 standard errors from Grassberger's tabulated \(0.379837 \pm 0.000006\) [7]. That comparison confirms, sharply and independently of anything we tuned, that we implemented the model he implemented.

Where the Lattice Runs Out

Two columns of that table should worry you. At \(\theta = 2000\) the largest single fire took 37.3% of the lattice. At \(\theta = 5000\) it took 59.0%, and a fire that eats three fifths of the world is not being limited by \(\theta\) any more, it is being limited by the edge of the simulation.

So we repeated the worst case on a lattice four times larger in area, and looked at what moved.

θ = 5000L = 512L = 1024
fires recorded10,0006,000
tree density ρ0.401850.40711
mean fire size7,433.187,285.77
largest fire154,578217,826
largest fire, % of lattice59.0%20.8%
⟨s²⟩/⟨s⟩58,678.066,016.4
τ on [4, 5000]1.17411.1663
bootstrap SE0.00560.0078

The exponent moved by −0.0078, which is 0.8 combined standard errors. Reassuring, and not proof: the cutoff proxy moved upward by 12.5%, which says the smaller lattice genuinely was truncating the tail, even though the exponent barely noticed that anything had gone missing. At \(\theta = 500\) the same check across \(L = 256\), 512 and 1024 gives 1.1175, 1.1269 and 1.1206, a spread of 0.009 against bootstrap errors of 0.005 to 0.006, so there is a wobble at the edge of significance and no trend.

Now the number that decides how much any of this is worth. Grassberger's 2002 study reached \(65536 \times 65536\) and \(\theta = 256{,}000\) [7]. Our largest lattice is \(1024 \times 1024\), and our largest \(\theta\) is 5,000, which is not close. We are short by 4,096 in area and by 51 in \(\theta\), and he concluded that the apparent scaling laws are transients, and that the true asymptotic regime might not arrive until \(\theta \sim 10^{40}\), a number with no physical home anywhere.

Take our own drift seriously for a moment and it says something faintly ridiculous: a straight line through our five points reaches \(\tau = 1.19\), Grassberger's estimate, at \(\theta \approx 10^{3.8}\), which is around 6,300, barely past where we stopped. If that extrapolation were right the argument would have ended in 2002, but the extrapolation is wrong, and the reason it is wrong is the reason to distrust extrapolations of this kind: the drift is decelerating, we cannot see where it stops, and a straight line fitted over two decades tells you nothing whatever about the twentieth decade. We print it only to show how easily a number like that fools you.

Plainly, then: our lattices are too small to settle whether this model is critical. We can confirm the drift. We can confirm that the compensated distribution is nowhere flat for long. We can confirm that a goodness of fit test rejects the power law, and we cannot tell a drift converging on 1.19 from one converging elsewhere, or from one that never converges, and no run we can afford would tell us. On the evidence we can generate, the honest position is the one Palmieri and Jensen describe [16]: the model is scale-free in appearance over the range anybody plots, and what it is doing asymptotically is a separate question that our hardware cannot touch.

The Strongest Objection to All of This

A reader who knows the field could put the whole article aside in one paragraph, and the paragraph would go roughly like this. Grassberger established in 2002, on lattices four thousand times larger, that this model does not show simple scaling, that the exponent drifts, and that the tree density had been badly underestimated. Pruessner and Jensen said the same with a different algorithm [8][10]. A club rerunning that on inadequate hardware has confirmed a known result and called it research. Nothing here is new.

We think that objection is mostly correct. What follows is our account of which parts survive it.

The drift itself is confirmation and we have labelled it as such: our \(\tau\) at \(\theta = 500\) sits 0.0231 below the pre-2002 value of 1.15 and our \(\tau\) at \(\theta = 5000\) sits 0.0241 above it, which is the drift restated in the form of a disagreement with a constant. Reproduction, not discovery.

The density agreement at \(\theta = 125\) is worth more than it looks, and Grassberger quotes \(\rho = 0.379837 \pm 0.000006\); we get 0.38073 with a standard error of 0.00095, putting us 0.9 standard errors away from him and nowhere near an accident. A number that sharp from an independent implementation, written from the published rules by people who had not seen his code, is the strongest evidence in this article that we are simulating the object he simulated. It also rules out the likeliest way for a student project to go wrong, which is to simulate a subtly different model and never notice the difference.

The part we would defend hardest is Figure 1 and the small table sitting beside it. The claim that log-log regression is a bad estimator of a power-law exponent is not new either [11][12][13], but the specific numbers are ours and they are checkable in a minute by anybody with a laptop: on 200,000 draws from a known \(\tau = 1.5\), maximum likelihood returns 1.50145 and least squares returns 0.97215. Most published fire-size exponents, we would guess, came out of the second method. Reed and McKelvey fitted North American fire records parametrically and found the power law inadequate over the full range [9]; Hantson, Pueyo and Chuvieco fitted global fire records by maximum likelihood and preferred a log-normal in most regions [14]; Corral and González, reanalysing several geoscience data sets with a careful protocol, found wildfires among the cases better described by a truncated log-normal [15]. Those three results are in tension with a large earlier literature that fitted straight lines, and Figure 1 is a small demonstration of why that tension exists.

A second objection we cannot dispose of. Our headline exponent depends on a window we chose. Across thirteen reasonable windows on the same 120,000 fires, \(\tau\) ranges from 1.0096 to 1.1390, a spread of 0.1294, while the statistical error on any one of them is between 0.0009 and 0.0049. Window choice moves the answer twenty-six times further than the largest of those errors, and fifty times further than the error on the value we report. We fixed the window before fitting and said so. The sensitivity is printed above, and that is the best response available to us, though none of it makes the underlying problem go away. When a distribution is not a power law, the exponent of the power law it is not becomes a property of your window rather than of the world.

What a Real Fire Season Would Have to Look Like

The toy stops being comfortable here, and here we have to be most careful, because this is exactly the place where a lattice of squares gets quietly promoted into a forest.

The interesting property of our distribution is not the exponent. What matters is that \(\tau\) sits below 2, because for \(P(s) \propto s^{-\tau}\) with \(\tau \le 2\), the mean of \(s\) does not converge as the upper limit grows; the integral \(\int s \cdot s^{-\tau}\,\mathrm{d}s\) diverges at the top. Our fires have a finite mean only because there is a cutoff, and the cutoff exists only because the lattice is finite and \(\theta\) is finite. Push the cutoff out and the mean goes with it, which is what the identity \(\langle s \rangle = \theta(1-\rho)/\rho\) says outright: the average fire is proportional to \(\theta\), so a world with less frequent ignition does not get smaller fires on average, it gets larger ones.

Read that sentence again with fire suppression in mind, and the arithmetic turns uncomfortable. In the model, reducing the ignition rate at fixed growth is exactly increasing \(\theta\). Our runs say what happens: mean fire size goes from 86.65 at \(\theta = 50\) to 7,433.18 at \(\theta = 5000\), a factor of 86 for a factor of 100 in \(\theta\), and the largest fire observed goes from 3,034 cells to 154,578. The total area burnt per unit time barely changes. In a steady state, everything that grows has to burn. What changes is how the burning is packaged: fewer, vastly larger events.

Now the cold water, and there is a lot of it. Our model has no suppression in it. Nobody fights these fires. It has no fuel age, no moisture, no wind and no climate, and the real mechanism by which suppression changes a fire regime runs through fuel accumulation and continuity, which is precisely what our uniform random planting fails to represent. Moritz and colleagues put the alternative on the table: real fire regimes, read off historical catalogues and a detailed fire spread model, look more like highly optimised tolerance than like self-organised criticality [11]. The difference bites on exactly the management question this paragraph keeps circling. Reed and McKelvey's fire records point the same way, and so do the global analysis of Hantson and colleagues and the careful reanalysis by Corral and González: real fire size distributions are frequently not power laws at all [9][14][15].

So what does our computation actually license anybody to say? Only this: one simple, fully specified system exists in which the average event size is set by the ratio of two rates, and in which suppressing ignition provably enlarges events. Its tail is fat enough that planning around the average is a category error, and whether any real region belongs to that class is a question about that region, and answering it needs fire records and fuel maps rather than a lattice. What the model can do is stop somebody being surprised. If your fire size distribution has an exponent below 2, the biggest fire you have seen is mostly a statement about how long you have been watching.

Where a Different Choice Would Have Changed the Answer

Several decisions in this study could have gone the other way, and some of them would have moved the headline number, and being specific about which is the point of this section.

The fitting window. That choice has the largest effect, by a distance. Fitting \([1, \theta]\) instead of \([4, \theta]\) gives 1.0526 rather than 1.1269. Fitting \([4, 5000]\), which runs past the cutoff, gives 1.0893. Fitting \([16, 500]\) gives 1.1390, and a reader who wanted the answer to be 1.15 could have got much closer by choosing \([6, 500]\), and a reader who wanted it to be 1.0 could have got there with \([64, 4000]\). Everything else hangs on one sentence: window fixed at \([4, \theta]\), chosen before fitting.

Maximum likelihood against regression. On our own fire data the two happened to agree to within 0.004, which is at once the luckiest result in the study and the most misleading one. On synthetic data the gap runs to 35%, as Figure 1 shows, and if we had used regression and got a plausible-looking number, we would have had no way to know whether it was the plausible number or the biased one.

Four neighbours against eight. Our fire spreads to the four orthogonal neighbours. Allowing the four diagonals as well raises the effective connectivity, which lowers the density at which large clusters appear and would change every density in this article. It would not change the qualitative picture, because the mean-field limit of the model is a critical branching process with \(\tau = 3/2\) in our convention [4] and the two-dimensional behaviour is well away from that, but every number in the tables would move.

Helical against periodic boundaries. Helical wrapping joins each row's right edge to the next row's left edge. The result is not quite a torus. We used it because Grassberger did, and we wanted the density comparison exact; on a \(512 \times 512\) lattice the difference is a single seam, and we would expect it to matter less than our bootstrap error, but we did not test that and so we cannot claim it.

Separated against unseparated time scales. The instantaneous-fire rule is the model, not an approximation to it, so relaxing it produces a different model in which fires and growth overlap and very large fires are partly extinguished by the gaps they create. That variant has different critical behaviour, and the published exponents do not describe it.

How much we ran. Our \(\theta = 5000\) run has 10,000 fires against 120,000 for the main run. Fires there cost about fourteen seconds per thousand. Its bootstrap error, 0.0056, is twice the main run's. More fires there would have sharpened the top of the drift curve, and would have done nothing at all about the fires hitting the lattice edge.

Reproducing this

One file, one command, Python 3.12 and numpy. No other package is used and nothing is downloaded.

python analysis/forest-fire-criticality.py > analysis/forest-fire-criticality-output.txt

Expected runtime is seven to twelve minutes, and the run printed in the output file took 699.3 seconds with numpy 2.4.2 on Python 3.12.3 under Windows 11, while a repeat on the same laptop with nothing else running took 425.7 seconds. The master seed is 20251124, hard-coded at the top of the file, and three independent streams are spawned from it through numpy's SeedSequence: one for the lattice, one for the fitting and bootstrap, one for the synthetic validation data. Peak memory is modest, a few tens of megabytes, because the lattice is a byte per cell and the largest temporary array is capped at 50,000 integers. The file pins BLAS to a single thread before importing numpy, which changes no number and lets the script start on a machine that is short of memory. We ran the finished file three times on the same machine and diffed the outputs: every scientific number matched to the last printed digit, and the only lines that differed were the wall-clock timings. If your output differs from ours by more than the printed standard errors, something is wrong somewhere and we would very much like to hear about it. The interactive model runs a smaller version of the same lattice in your browser, and at its default settings it reproduces the tree density and the fitted exponent to within 0.004, and the mass balance identity to a fifth of a percent.

References

  1. Bak, P., Tang, C. & Wiesenfeld, K. (1987). Self-organized criticality: an explanation of the 1/f noise. Physical Review Letters 59, 381–384. doi:10.1103/PhysRevLett.59.381
  2. Drossel, B. & Schwabl, F. (1992). Self-organized critical forest-fire model. Physical Review Letters 69, 1629–1632. doi:10.1103/PhysRevLett.69.1629
  3. Grassberger, P. (1993). On a self-organized critical forest-fire model. Journal of Physics A: Mathematical and General 26, 2081–2089. doi:10.1088/0305-4470/26/9/007
  4. Christensen, K., Flyvbjerg, H. & Olami, Z. (1993). Self-organized critical forest-fire model: mean-field theory and simulation results in 1 to 6 dimensions. Physical Review Letters 71, 2737–2740. doi:10.1103/PhysRevLett.71.2737
  5. Clar, S., Drossel, B. & Schwabl, F. (1996). Forest fires and other examples of self-organized criticality. Journal of Physics: Condensed Matter 8, 6803–6824. doi:10.1088/0953-8984/8/37/004
  6. Malamud, B. D., Morein, G. & Turcotte, D. L. (1998). Forest fires: an example of self-organized critical behavior. Science 281, 1840–1842. doi:10.1126/science.281.5384.1840
  7. Grassberger, P. (2002). Critical behaviour of the Drossel-Schwabl forest fire model. New Journal of Physics 4, 17. doi:10.1088/1367-2630/4/1/317
  8. Pruessner, G. & Jensen, H. J. (2002). Broken scaling in the forest-fire model. Physical Review E 65, 056707. doi:10.1103/PhysRevE.65.056707
  9. Reed, W. J. & McKelvey, K. S. (2002). Power-law behaviour and parametric models for the size-distribution of forest fires. Ecological Modelling 150, 239–254. doi:10.1016/S0304-3800(01)00483-5
  10. Pruessner, G. & Jensen, H. J. (2004). Efficient algorithm for the forest fire model. Physical Review E 70, 066707. doi:10.1103/PhysRevE.70.066707
  11. Moritz, M. A., Morais, M. E., Summerell, L. A., Carlson, J. M. & Doyle, J. (2005). Wildfires, complexity, and highly optimized tolerance. Proceedings of the National Academy of Sciences 102, 17912–17917. doi:10.1073/pnas.0508985102
  12. Clauset, A., Shalizi, C. R. & Newman, M. E. J. (2009). Power-law distributions in empirical data. SIAM Review 51, 661–703. doi:10.1137/070710111
  13. Deluca, A. & Corral, Á. (2013). Fitting and goodness-of-fit test of non-truncated and truncated power-law distributions. Acta Geophysica 61, 1351–1394. doi:10.2478/s11600-013-0154-9
  14. Hantson, S., Pueyo, S. & Chuvieco, E. (2016). Global fire size distribution: from power law to log-normal. International Journal of Wildland Fire 25, 403–412. doi:10.1071/WF15108
  15. Corral, Á. & González, Á. (2019). Power law size distributions in geoscience revisited. Earth and Space Science 6, 673–697. doi:10.1029/2018EA000479
  16. Palmieri, L. & Jensen, H. J. (2020). The forest fire model: the subtleties of criticality and scale invariance. Frontiers in Physics 8, 257. doi:10.3389/fphy.2020.00257