← back to journal

Binder crossings at 1024×1024 hit the Ising Tc, once I measured at the right moment

2026-10-15 · Kit Wickham

Two posts ago, Binder cumulant crossings found the 2D Ising critical temperature to three digits, and plain Metropolis ran out of steam at 128×128. Wolff cluster updates should remove that wall, so I redid the crossings with Wolff up to 1024×1024. The 256/512 pair crosses at 2.26917 ± 0.00006 and 512/1024 at 2.26910 ± 0.00007. The exact value is 2.26919. That's about ten times tighter than before, in under half an hour on 9 CPU cores.

The first attempt got something else wrong, though, and the way it went wrong is the more useful part of this post.

A bug that only moved one of two numbers

Wolff flips one cluster at a time, and clusters vary wildly in size. To space my measurements about one sweep apart, I flipped clusters until their sizes added up to at least N = L² spins, then recorded the magnetization. The crossing temperatures came out reasonable, only a few error bars low. The height where the curves cross was way off, though: U* ≈ 0.64, when the known infinite-lattice value is 0.6107, and it drifted further from it as the lattices grew.

The rule "stop once the total reaches N" is the problem. The cluster that pushes the total over the line is more likely to be a big one, for the same reason the bus you catch tends to be the one that's running late. Big clusters grow out of big ordered regions, so measurements taken just after one over-sample strongly magnetized states. That raises ⟨m²⟩² relative to ⟨m⁴⟩, which pushes U up. The fix is to measure every k clusters, with k fixed in advance (N divided by the average cluster size measured during warm-up). Same physics, same cost, and the only difference is when you look. At exactly Tc, with 200,000 measurements per size:

LU at Tc, stop on total sizeU at Tc, every k clusters
80.62760.6132
160.62850.6109
320.63150.6109
640.63410.6114
1280.63650.6113

The crossing temperature hid the bug because it barely cares. The bias shifts every size's curve in a similar way, so the curves still meet near the right temperature, just at the wrong height. Had I only looked at Tc, I'd have reported the first run's 256/512 crossing, about 2.2689 and several error bars low, and blamed it on finite-size corrections.

The clean run

Wolff updates in C, starting fully ordered, with 200 sweeps' worth of warm-up, then one measurement every k clusters (about one sweep of work). For L = 32 to 128 I used 12 temperatures from 2.258 to 2.280 in steps of 0.002. The bigger lattices have much steeper curves, so they got 11 temperatures from 2.264 to 2.274 in steps of 0.001. Each temperature and size had 8 independent seeds of 60,000 measurements at L=32, down to 3,000 at L=1024. That made 552 runs in total, finishing in 28 minutes. As before, the crossing is the root of a quadratic fitted to UL − U2L over the 7 temperatures around the sign change, and the error bars come from a jackknife over the 8 seeds.

sizescrossing Tminus exactin error barsU at crossing
32 / 642.26879 ± 0.00008−0.00040−4.90.6116 ± 0.0002
64 / 1282.26923 ± 0.00009+0.00005+0.50.6106 ± 0.0003
128 / 2562.26926 ± 0.00006+0.00007+1.30.6104 ± 0.0004
256 / 5122.26917 ± 0.00006−0.00002−0.30.6110 ± 0.0006
512 / 10242.26910 ± 0.00007−0.00009−1.30.6122 ± 0.0015

From 64/128 on, every pair sits within about one error bar of the exact answer, and the crossing heights scatter around 0.6107 as they should. The 32/64 pair is still almost 5 error bars low. That's the same finite-size drift the Metropolis run showed at small sizes, now visible because the error bars got small enough to resolve it. The fit itself adds some uncertainty. Using 5 points instead of 7, or a cubic instead of a quadratic, moves the large-lattice crossings by up to 0.00008, which is about one error bar. So I'd quote the result as Tc = 2.2692 ± 0.0001, not to five digits.

So what

Wolff did exactly what the last post promised. Lattices 64 times bigger than Metropolis could handle cost minutes per temperature, and the error bars on Tc shrank tenfold. The lesson I'll keep, though, is about the bug. Any sampler with variable-size steps, like cluster flips, event-driven simulations or adaptive time steps, can bias its results if you decide when to measure based on how big the steps were. The safe rule is to decide in advance when you'll look. And check more than one number: here the crossing temperature looked fine, and only the crossing height gave the bug away.

Method: one Mac, about 35 lines of C, 8 seeds per point, no reweighting between temperatures. Equilibration wasn't checked separately beyond the U values coming out right. The biased numbers in the first table come from a separate run of the same program with the old measuring rule.