2-D Dirichlet diffusion  ·  n = 31, h = 1/32  ·  levels 31 → 15 → 7 → 3 → 1  ·  40 machine checks, all PASS, 0.7 s

Divide by Four and Conquer

Every stationary solver in this suite eventually hits the same wall: smooth error, invisible to local updates, contracting at $1-O(h^2)$. Multigrid walks around the wall — smooth the rough half, ship the smooth half to a grid where it is rough, recurse. This page walks the walk, one arrow-key at a time, and ends on the flattest row of numbers in the suite.

the smoother owns the rough half
damped Jacobi, $\omega=\tfrac45$: factor $\le\tfrac35$ per sweep
736 high-frequency modes, killed in place
the coarse grid owns the smooth half
all $15^2=225$ smooth modes fit on the $2h$ grid
where they arrive rough — and recursion repeats the split
The punchline, up front. One V(2,2)-cycle contracts the error by $\rho_V = $ 0.1872 / 0.1901 / 0.1908 at $n = 15/31/63$ — a spread of 0.0036 across an 18× range of problem sizes, while damped Jacobi's rate degrades $0.9846 \to 0.9961 \to 0.9990$ on the same three problems. At the worst of the three rates, 14 cycles reach $10^{-10}$ — the same count at all three measured sizes. That is the property this page exists to earn: mesh independence, measured, not asserted. Walk the stepper with to see where it comes from.
§0 · The arena

One problem, five grids, two moving parts

The problem is the suite's 2-D workhorse: $-\nabla\!\cdot\!\nabla u = f$ on the unit square with Dirichlet walls, discretized by poisson.poisson_2d at $n = 31$ interior points per side ($h = \tfrac1{32}$, $N = 961$ unknowns, the 5-point stencil: $4/h^2$ on the diagonal, $-1/h^2$ to each of the four neighbors). The right-hand side is the hot/cold-rod pair of reports 11 and 13, mapped from their $n=32$ grid to $n=31$ by relative position: hot rod $+1$ at column 4, rows 3–8; cold rod $-1$ at column 26, rows 22–27 (0-based interior indices). The map lands on the exact point-symmetric image of the originals — $b + \mathrm{rot}_{180}(b) = 0$, and therefore the solution is point-antisymmetric too, a parity fact that will quietly matter in S1. The first guess is seeded noise (standard_normal(seed 0), scaled to $\|x^\star\|$): half smooth, half rough, maximally unhelpful.

Two moving parts do all the work. The smoother is damped Jacobi with $\omega = \tfrac45$ — report 12's high-frequency-optimal damping for the 2-D 5-point stencil (Trottenberg et al., Multigrid), run $\nu_1 = \nu_2 = 2$ sweeps before and after each hand-off. The transfer pair is full weighting down (the $\tfrac1{16}[1\,2\,1;\,2\,4\,2;\,1\,2\,1]$ stencil) and bilinear interpolation up, tied by the classical duality $P = 4R^\top$ — exactly, the constant being $2^d$ in our $A = \mathrm{stencil}/h^2$ scaling: $R$'s rows sum to 1 (an average), $P$'s columns sum to 4 (a unit spread over $\sim$4 fine nodes), and that factor is precisely what makes $RAP$ a $2h$-scale operator. Coarse operators are rediscretizedpoisson_2d again at $2h, 4h, \dots$ — with the Galerkin alternative $RAP$ computed alongside and quantified honestly in §12. Grids shrink $31 \to 15 \to 7 \to 3 \to 1$, all odd, standard $h \to 2h$; the $1{\times}1$ operator at the bottom is exactly $[[16]] = 4/h^2$ at $h = \tfrac12$, so the coarsest "solve" is a single division.

Everything in the stepper below is a baked field from results/multigrid.json — no number on this page was computed by the browser's arithmetic alone; the self-test badge re-derives a handful of identities per stage from the baked matrices at every load. Use / (or the buttons) to step, Home/End to jump; arrow keys always step the stage, never the sliders.

§1–§9 · The stepper

Nine moves, one V

the V-cycle stepper step  ·  Home/End jump  ·  dots navigate self-test …
S1 / 9

Start honest: take the rod problem, the seeded random first guess, and do the obvious thing — damped-Jacobi sweeps, ω = 4/5. Watch both the error field and its 2-D DST spectrum: the rough corner of the spectrum is dead within a handful of sweeps (rough energy fraction 0.398 → 2.95×10⁻³² by sweep 100), while mode (1,1) still holds 0.6798 of its starting amplitude — exactly μ₁₁¹⁰⁰ with μ₁₁ = 0.996148. A hundred sweeps buy a factor of 4.84 in ‖e‖. The smoother is not weak; it is specialized.

error field and spectrum share one scale across all four snapshots
error field e after 0 sweeps
‖e‖ =
|DST coefficients| (log shade); gold corner = smooth 15²
rough energy fraction
‖e‖ per sweep, log scale — the stall
mode (1,1) kept after 100 sweeps 0.6798 = μ₁₁¹⁰⁰ max rough amplitude kept 1.55×10⁻¹⁶ (the float64 DST roundoff floor; the exact per-mode factor is μdisc¹⁰⁰ ≈ 4×10⁻²³) per-sweep ratio, sweeps 90–100: 0.990050 ≈ μ₁₂ = 0.9904 — the rods are point-antisymmetric, so their slowest surviving mode is (1,2)

Blame, assigned mode by mode. Damped Jacobi never mixes DST modes; mode (k, l) contracts by exactly μkl = 1 − ω (sin²(kπh/2) + sin²(lπh/2)) per sweep — report 12's per-mode factor 1 − ωλk/(4/h²), now in 2-D. The smoothing factor is the worst |μ| over the high-frequency quadrant only (max(k, l) ≥ 16): the continuous symbol gives sup = max(|1−ω/2|, |1−2ω|) = 3/5 exactly at ω = 4/5, attained at both θ = (π/2, 0) and (π, π) — and 4/5 is the argmin: no other damping does better. The discrete grid sits strictly inside the quadrant, so its worst rough mode, (1, 16), does slightly better: 0.598074, within 0.4% of 3/5 — and a straight-line fit to the measured rough-mode decay (sweeps 10 → 25) returns 0.598074 again.

sup over HF quadrant at this ω: 0.600
per-mode factor μkl at ω (blue +, red −)
gold corner = the smooth 15×15 block; outside it, the HF quadrant
hover for (k, l, μ)
sup over HF vs ω — the kink at 4/5, value 3/5
measured sup of rough modes per sweep
slope fit (sweeps 10→25): 0.598074
smoothing factor, exact symbol: 3/5 at ω = 4/5 discrete (n = 31): 0.598074 at mode (1, 16) smooth-corner contrast: μ₁₁ = 0.996148 — the smoother's blind spot

The bet multigrid makes: after a few sweeps, what remains of the error fits on a grid with a quarter of the points. Test it directly — decimate the field to the 15×15 coarse nodes (keep every second fine node), interpolate straight back, and measure what the round trip lost. The 5-sweep error loses 5.9%; the 20-sweep error 2.7%; the raw sweep-0 error 74%. A pure rough-mode field loses 101% — more than all of it, because the round trip aliases rough into smooth. The representation error falls monotonically with smoothing: 0.7448 > 0.0588 > 0.0266 > 0.0163.

field on 31×31
↘↖
decimated to 15² = 225 values,
bilinearly interpolated back
what the round trip lost
rel. error
round-trip loss vs sweeps of smoothing (log)
even the best field in range(P): rough 0.971 vs 5-sweep 0.046 — rough error has no coarse story at all

So hand the problem down — but hand down the residual, not the iterate: the coarse grid will solve A₂h e = R r for the correction. Full weighting averages each coarse node over its 3×3 fine neighborhood with the 1/16 [1 2 1; 2 4 2; 1 2 1] stencil — the kron square of the 1-D [¼, ½, ¼] — so every row of R sums to 1 (all 225 rows, boundary-adjacent ones included) and constants pass through untouched. Fine 31×31 residual, norm 9.741 → coarse 15×15 right-hand side, norm 1.582; the baked coarse field is R r exactly, at every level of the hierarchy.

same physical square, a quarter of the unknowns each hop
residual r on the fine grid (31×31)
‖r‖ =
→ R
coarse right-hand side R r (15×15)
‖R r‖ =
the full-weighting stencil ×16
rows of R sum to 1 · columns of P sum to 4
unknowns this hop: 961 → 225 duality: P = 4 Rᵀ exactly — the 4 is 2d, the h²-scaling's price for "average down, spread up"

The coarse problem is the same equationpoisson_2d rediscretized at 2h — with a quarter of the unknowns: 961 → 225 → 49 → 9 → 1. So don't solve it; apply the same idea again. Smooth, restrict, recurse. Four hops down, the "grid" is one point, the operator is exactly [[16]] = 4/h² at h = 1/2, and the solve is a division: f = 8.50722×10⁻⁵ → u = f/16 = 5.31701×10⁻⁶. Residual there: exactly 0. The recursion has bottomed out in arithmetic a calculator could do.

the right-hand sides each level receives, during the first V-cycle's descent
every hop: same 5-point stencil, kept O(1) entries per row — only the count of unknowns shrinks, 4× per level at 1×1: u = f / 16, residual and level error exactly 0

Coming back up: bilinear-interpolate the coarse solution to the fine grid (P = 4 Rᵀ, exactly) and add it. Press play to watch the addition happen: the pre-smoothed fine error, norm 0.01258, meets the interpolated coarse correction and drops to 0.003058 — a factor of 4.1 from one addition. This is the moment the coarse grid pays the fine grid back: everything the smoother could not touch, solved at quarter price and shipped home.

e(t) = ebefore − t · correction
fine error after pre-smoothing
‖e‖ = 0.0125765
the interpolated coarse correction
(what came back up the V)
error at t = 0.00
‖e(t)‖ =
log gauge
after the full addition: ‖e‖ = 0.00305844 — a 4.1× cut, no smoothing involved

Interpolation is not free: bilinear P plants a faint high-frequency ripple on the fine grid (look at the spectrum — the rough quadrant lights back up: rough fraction of the error 0.270 right after the correction). But rough error is exactly what the smoother is for. Two post-sweeps cut each rough amplitude by roughly μ² ≈ 0.358 and the rough fraction collapses to 0.0289. The V-cycle's choreography is precisely this: every actor cleans up the mess the other one makes.

fine error field (after correction)
‖e‖ =
|DST coefficients| (log shade)
rough energy fraction
rough fraction: 0.2700.0289 in two sweeps ‖e‖: 0.003058440.0023261 — modest in norm, decisive in spectrum: the error is now smooth enough for the next cycle's bet

Assemble everything: pre-smooth and restrict on the way down (31 → 15 → 7 → 3), divide at 1, correct and post-smooth on the way up. Eighteen recorded stages, one V. Press play and walk it: the marker descends the levels while the error gauge ticks down from 0.0179 to 0.0023 — a one-cycle contraction of 0.1296. And the whole walk is linear in (x₀, b): vcycle(x₀, b) = x₀ + vcycle(0, b − A x₀) to 1.09×10⁻¹⁵ — one V-cycle is one application of M⁻¹, the suite's standard object, ready for CG in S9.

the V — click any node to jump; gold marker = current stage
level field
level ‖e‖, log gauge
fine ‖e‖: 0.01794520.0023261 in one cycle (contraction 0.129622) residual norm at this stage:

Now iterate the cycle — and change the mesh. The exact spectral radius of the V(2,2) error propagator E = I − M⁻¹A is 0.1872 / 0.1901 / 0.1908 at n = 15 / 31 / 63 (dense eigenvalues at 15 and 31, Arnoldi at 63): a spread of 0.0036 while N grows 18×. The measured per-cycle curves below fit 0.1660 / 0.1752 / 0.1789 over cycles 2–15 — the fit runs slightly below ρ because it averages the transient. Damped Jacobi on the same three problems: ρ = 0.98463 / 0.99615 / 0.99904, marching to 1 like 1 − O(h²). One number is a property of the problem size; the other is a property of the algorithm.

solid: V(2,2) cycles at three sizes · dashed: damped Jacobi's per-sweep slope, same three sizes
relative error vs V-cycle count — three sizes, one slope
nlevelsρV exactρV fit (cycles 2–15) ρJacobiJacobi sweeps to 10⁻¹⁰Jacobi sweeps ≡ one V-cycle V-PCG itersplain CG iters
1515→7→3→10.1872010.165967 0.9846281487108835
3131→15→7→3→10.1900890.175199 0.9961485966430874
6363→31→15→7→3→10.1908180.178873 0.9990362388417188149
suite-culture column: the V-cycle-from-zero is a valid SPD preconditioner (symmetric to 1.54×10⁻¹⁶, λmin = 4.354×10⁻⁴ at n = 15), and V-PCG needs 8 / 8 / 8 iterations while plain CG grows 35 / 74 / 149 — the √κ law meeting a κ that stopped growing
§10 · Why it works

The division of labor, run at every scale

The eigenmodes ledger priced every preconditioner by one question: which directions do you leave wrong? Multigrid's answer is structural: none — but no level is right about more than its own octave. The smoother at spacing $h$ owns the modes with wavelength near $2h$ — the 736 high-frequency modes here, contracted at $\le\tfrac35$ per sweep, mesh-independently. The 225 smooth modes it cannot touch are exactly the ones full weighting carries to the $2h$ grid without loss (S3's measured bet) — and on that grid, half of them have become high-frequency: a mode keeps its index $(k,l)$ but the grid's Nyquist has halved, so "smooth" is relative to where you stand. Recurse, and every mode of the original problem is high-frequency on exactly one level of the hierarchy — and gets killed there, at that level's $h$-independent rate. No mode is ever the slowest racer for long, which is why no $\kappa$ appears in the rate.

every mode is rough somewhere — the hierarchy of ownership bar length ∝ number of mode indices per side at that level; blue = that level's smoother kills these, gold = shipped down to 2h modes 1–15 · restricted to 2h modes 16–31 · smoother at h, factor ≤ 3/5 31×31 · 961 unknowns 1–7 ↓ 8–15 · smoother at 2h 15×15 · 225 unknowns — S3's smooth modes, arriving rough 4–7 7×7 · 49 unknowns 3×3 · 9 unknowns 1×1 · the division by 16 the eigenmodes question, answered hierarchically: every direction is left wrong by every level except the one where its wavelength is about two cells — and there it is contracted at a rate that never heard of κ. gold: deferred, not neglected — the restriction is (nearly) lossless on these modes: S3's 5.9%, then 2.7%.
The two-scale division of labor, recursed. At each level the smoother contracts the upper half of the surviving mode indices at an $h$-independent rate (S2's quadrant, factor $\le 3/5$ per sweep), and the lower half is shipped to the next grid, where the halved Nyquist promotes half of it to "rough". Four hops and nothing is left standing but the single $1{\times}1$ mode — solved exactly, by division.
§11 · The bill

O(N) per cycle: the geometric series, audited in flops

Quartering the unknowns at every level makes the whole hierarchy cost a geometric series: $N(1 + \tfrac14 + \tfrac1{16} + \cdots) < \tfrac43 N$ cells to visit per cycle. The measured level sums land where the series says: $\sum_\ell N_\ell / N_{\rm fine} = $ 1.2622 / 1.2955 / 1.3137 at $n = 15/31/63$, increasing toward and bounded by $\tfrac43$. In report 11 Part C's flop convention (1 MAC = 2 flops, $A$-matvec $= 2\,\mathrm{nnz}(A)$; the same ledger update views uses), one V(2,2)-cycle costs 19,237 / 87,601 / 373,693 flops at the three sizes — i.e. 85.5 / 91.2 / 94.2 flops per unknown — a 10% total rise across an 18× range of $N$, settling as it grows (the last refinement, $31 \to 63$, moves it under 4%): the definition of $O(N)$, with the constant printed. In matvec currency: one cycle $=$ 9.03 / 9.36 / 9.54 fine-grid matvecs, and the whole-cycle overhead relative to fine-level-only work is 1.236 / 1.281 / 1.306 $< \tfrac43$ — the coarse levels are nearly free.

Put §9 and the series together and the economics close: to $10^{-10}$, the V-cycle spends 14 cycles $\times\ \sim\!9.4$ matvec-equivalents $\approx$ 130 matvecs of work at any size — while damped Jacobi spends 1487 / 5966 / 23,884 sweeps, each about one matvec. In drop-per-cycle terms, one V-cycle is worth 108 / 430 / 1718 Jacobi sweeps at the three sizes, and the exchange rate quadruples with every refinement (430/108 = 3.98, 1718/430 = 3.99 — the mirror image of Jacobi's $1-\rho \propto h^2$ gap shrinking $4\times$ per $h$-halving). There is no crossover to wait for; the V-cycle is ahead at $n=15$ and the lead compounds.

work per cycle ∝ N + N/4 + N/16 + … < 4N/3 961 225 49 9 1 areas: the level sizes at n = 31 · sum/N = 1.2955 Σ Nℓ / N, measured 4/3 n=15 31 63 1.2622 1.2955 1.3137 bars drawn from 0; the 4/3 line is the infinite-series ceiling flops per unknown per cycle n=15 31 63 85.5 91.2 94.2 rises just 10% across 18× in N: O(N), constant included
The geometric series, and its audit. Left: the level sizes at $n=31$ drawn to area. Middle: measured $\sum_\ell N_\ell/N$ at the three sizes against the $4/3$ ceiling. Right: measured flops per unknown per V(2,2)-cycle in report 11 Part C's convention — the whole point of the plot is how boring it is.
§12 · The theory in one identity

Why report 12 kept measuring 0.357

The two-grid error propagator is $E_{TG} = S^{\nu_2}\,(I - P A_{2h}^{-1} R A)\,S^{\nu_1}$: smooth, correct exactly on the coarse space, smooth again. The classical convergence argument (Trottenberg; transferred to the learned setting as report 06's Theorem 4.1 digest) needs exactly two properties — the smoothing property (S2: rough modes die at a rate independent of $h$) and the approximation property (S3: what survives smoothing is coarse-representable) — and this page has measured both. Here the bound closes into an identity: at $\nu = 1{+}1$ the measured two-grid spectral radius at $n=31$ is $\rho_{TG} = $ 0.3577 — for the Galerkin coarse operator and for the rediscretized one, equal to machine precision — and both equal $\mu_{\rm disc}^2 = 0.598074^2 = $ 0.3576924. The binding mode is the pure high-frequency (1, 16): every coarse correction leaves it untouched, so the rate is one pre-sweep times one post-sweep on the worst rough mode, and the choice of coarse operator cannot matter. That is why report 12's bilinear two-grid measured its mesh-independent house number 0.357 at $N = 1024$: same propagator, same identity.

The Galerkin-vs-rediscretization difference, quantified honestly since the stepper runs rediscretization: $RAP$ is symmetric positive definite and translation-invariant in the interior, but it is the classical 9-point stencil against rediscretization's 5-point one,

$$H^2 A_{RAP}=\begin{pmatrix}-\tfrac14&-\tfrac12&-\tfrac14\\[-2pt]-\tfrac12&3&-\tfrac12\\[-2pt]-\tfrac14&-\tfrac12&-\tfrac14\end{pmatrix} \qquad\text{vs}\qquad H^2 A_{2h}=\begin{pmatrix}0&-1&0\\[-2pt]-1&4&-1\\[-2pt]0&-1&0\end{pmatrix},$$

relative Frobenius difference 0.330, max entry ratio off by 0.25. They are nonetheless the same operator where it matters: both are $O(H^2)$ discretizations, and their Rayleigh quotients on the three lowest coarse modes agree within 2%. Rough-mode convergence identical (the identity above), smooth-mode behavior identical to 2% — which is why the stepper's rediscretized V-cycle and the Galerkin one are interchangeable here, and why the distinction only starts to bite when there is no grid to rediscretize on.

§13 · Beyond geometry

When there is no grid to coarsen

Everything above leaned on geometry: rediscretizing needs a mesh, and full weighting needs to know which nine fine nodes sit under a coarse one. The Galerkin product $R A P$ is the escape hatch — it builds the coarse operator from the matrix alone, and §12 just showed it loses nothing that matters. Algebraic multigrid pushes the same move all the way: choose coarse variables and interpolation weights from the matrix graph itself, no mesh required — the automation whose fragility report 05 §5 flagged as the price of leaving the model problem. One rung further and the transfer operators are learned: report 06's NAMG hard-wires exactly this page's information flow — relax, restrict, coarse solve, prolong, relax — and trains the restriction, its attention weights becoming report 11 §5.3's learned coarse regressors: data-dependent block averages chosen by gradient descent rather than by geometry.

And that is the statistical reading of the whole page, the one reports 11 and 15 built rung by rung: coarse-grid correction is regression on aggregated variables, the smoother is the local stencil regression, and a V-cycle is multiscale regression run at every octave — each level's regressors explain the correlation lengths the level below cannot reach, which is 11 §5's variance split recursed. Report 13 gave the same fact its geometric name: of the decoupling ladder's axes, scale is the one with no finite exact rung — so multigrid recurses it, and S9's flat row of rates is what the bottom of that recursion looks like.

§14 · Crossings

Where the suite has already met the V

Physics

05 §5 promised "the road to multigrid" in one paragraph — smooth, restrict, recurse, $O(N)$ — and called it the end of the conversation for Poisson. This page is that paragraph, run and audited.

12 ran the two-grid cycle as a stationary predictor and kept measuring 0.357; §12 above closes that number as $\mu_{\rm disc}^2$. Update views' two-level ledger row is the same object one language over.

Probability

11 §5 measured block averages absorbing the long-range dependence of the field — the crudest coarse regressors — and §5.3 recursed the idea into multigrid-as-inference-on-aggregates. S3 is its approximation property, measured at $2h$.

15's prediction ladder ends at the same rung: a preconditioner is a statistical model, and the V-cycle is the multiscale one.

Synthesis

The eigenmodes ledger asked which directions to leave wrong; §10 is multigrid's answer — each direction handled where it is cheap. 13's scale axis, recursed; 14's separator hierarchy is the same tree read by a direct solver; 06's NAMG is the same V, learned.

Everything above is machine-verified (python/experiments/multigrid_checks.py, 40 checks, all PASS, deterministic, 0.7 s; every quoted number and every stepper field exported to results/multigrid.json, floats at 6 significant digits): the level hierarchy 31→15→7→3→1 with the $1{\times}1$ operator exactly $[[16]]$; the $n=31$ rod right-hand side and its point-antisymmetry; the smoother identity (matrix form == stencil loop, 2.5×10−16) and the per-mode contraction $\mu_{kl}^m$ for all 961 modes over 25 sweeps (8.6×10−15); the 2-D DST-I orthonormality behind every spectrum panel (1.1×10−14); the smoothing factor $\sup_{HF}|1-\omega s| = \max(|1-\omega/2|,|1-2\omega|) = 3/5$ exactly at $\omega = 4/5$ (attained at $(\pi/2,0)$ and $(\pi,\pi)$; a 1201² symbol grid never exceeds it; the argmin is $4/5$), the discrete factor 0.598074 at mode (1,16) and its empirical re-fit to 1.1×10−16; S1's frozen/dead corners ($\mu_{11}^{100} = 0.6798$; rough energy $0.398 \to 2.95{\times}10^{-32}$; the 90–100 per-sweep ratio 0.990050 inside the smooth-corner band); the transfer duality $P = 4R^\top$ exact, $R$ rows summing to 1 (all 225), the kron structure of the 1/16 stencil; S3's round-trip losses (5.9% / 2.7% smoothed vs 101% rough, best-in-range(P) 0.046 vs 0.971, monotone in sweeps); the 18-stage V-trace with every exported field recomputed against its norms (exact), the coarsest division $8.50722{\times}10^{-5}/16$, the 4.1× correction drop, the post-smoothing rough-fraction collapse $0.270 \to 0.0289$; V-cycle linearity (one cycle == one $M^{-1}$, 1.1×10−15); Galerkin $RAP$ symmetric PD, the 9-point vs 5-point stencils, Frobenius difference 0.330 yet smooth-mode Rayleigh agreement within 2%, and the identity $\rho_{TG}(1{+}1) = \mu_{\rm disc}^2 = 0.3576924$ for both coarse operators == report 12's 0.357; mesh independence $\rho_V = 0.1872/0.1901/0.1908$ at $n=15/31/63$ (dense eigenvalues at 15/31, Arnoldi at 63; fits over cycles 2–15 within $[0.8, 1.05]\rho$), Jacobi's $\rho = 1 - 2\omega\sin^2(\pi h/2) \to 1$ with gap ratios 3.990/3.998 ≈ 4 and 1487/5966/23,884 sweeps to $10^{-10}$; the V-cycle-from-zero a valid SPD preconditioner (symmetry 1.5×10−16, $\lambda_{\min} = 4.354{\times}10^{-4} > 0$, adjointness dot-tests) with V-PCG at 8/8/8 vs plain CG 35/74/149; and the $O(N)$ audit (level sums 1.2622/1.2955/1.3137 $< 4/3$; 85.5/91.2/94.2 flops per unknown; 9.03/9.36/9.54 fine-matvec units per cycle) in report 11 Part C's flop convention. Reuses poisson.poisson_2d and pcg.pcg. The page's own badge re-verifies a handful of baked numbers per stage at every load, from the baked fields themselves. Companion pages: 05 · classical preconditioners · 11 · regressions and multiscale · 12 · autoregressive preconditioning · 13 · decoupling · 15 · prediction · the eigenmode ledger · update views · the clickable grid.