From an anecdote to a program
The standard theory of coronal nulls is not a strawman. Since Parnell, Smith, Neukirch & Priest (1996), a null is classified by the eigenvalues of the field Jacobian $M=\nabla\mathbf B$ at the point where $\mathbf B=0$: three real eigenvalues make a radial null (an X in its fan plane), a complex-conjugate pair makes a spiral null (an O), the odd-sign-out eigenvector is the spine, and the sign of its eigenvalue is the null’s sign. Detection on gridded fields is likewise settled practice — trilinear and first-order-Taylor methods, applied routinely to potential and NLFFF extrapolations of SDO/HMI magnetograms.
So the sub-Riemannian framing earns a place only if it matches that scheme where both speak, and adds something where the standard scheme is silent or fragile. Three falsifiable questions, pre-registered:
- H-R1 — can an SR read-out recover the Parnell type at all?
- H-R2 — is an integrated read-out more robust to noise than differentiating the field, which is what eigenvalue classification does in practice?
- H-R3 — does the detector reproduce a standard null catalogue on real solar data, plural — a gallery, not a single star on a single magnetogram?
Every kind of null (the detector is type-agnostic)
First the battery. We build exact linear nulls of every type — radial and spiral, both signs, each in its own randomly rotated frame, with the type known by construction — and point the growth-vector detector at them, alongside the real Part-4 null. For any traceless Jacobian $M$ there is a one-line exact vector potential $A(\mathbf r) = -\tfrac13\, \mathbf r\times(M\mathbf r)$ with $\nabla\times A = M\mathbf r$, so the detector runs on a genuine sub-Riemannian structure in every case, spiral nulls included.
research/preferred-directions/scripts/run_r1_gallery.py.
The result is clean and it sharpens the problem. The detector fires at every null type — the $5\to6$ jump is real for radial and spiral alike — and precisely because of that it carries no type information. Radial versus spiral lives in the fan topology: whether the eigenvalues of $M$ are real or complex. If the framework wants to classify, it must read that from the flow.
Integrate or differentiate?
Here is the one place a genuine edge could exist. The standard route estimates $M$ by finite-differencing a noisy gridded field — an ill-conditioned operation — and then tests a fragile discriminant (real versus complex eigenvalues). The SR route can instead integrate: field lines are the kernel foliation of the curvature 2-form $dA$, and their behaviour near the null encodes the type with no derivative ever taken. Trajectories that wind coherently about an axis mean a spiral; bounded winding means radial; and because $\operatorname{div}\mathbf B=0$ forces the spine rate to beat the fan rate, the escape-time asymmetry between forward and backward flow gives the sign.
So we raced them, fairly: same noisy grid instance to every method, same information ball, true null location for all; winding threshold calibrated once at zero noise on a disjoint battery, then frozen. Four methods: the integrated flow; pointwise central differences (the standard practice); a least-squares linear fit of the whole ball (the strong baseline — essentially the maximum-likelihood $\widehat M$ under white noise); and the same fit on a half-radius ball. Two field legs: exactly linear, and linear plus a 30% divergence- and current-free quadratic term the linear model cannot represent.
research/preferred-directions/scripts/run_r2_classifier.py.
H-R1 is confirmed — at zero noise the integrated flow recovers the full four-class label at 0.958, missing only configurations parked next to the radial/spiral boundary, where the types genuinely merge. An SR classification method exists.
H-R2 splits, and the interesting half is negative. Against the field’s standard practice — pointwise differences — integration wins at every noise level, in both legs. The mechanism is real. But against the least-squares fit it loses everywhere, and the anatomy of that loss is worth stating plainly:
- Regression is also integration. The least-squares fit is an integral operator over the ball — several thousand nodes averaging the noise down — with statistically optimal weights. The trajectory integral uses the same data budget less efficiently.
- The curved leg was parity-protected (a post-hoc finding, flagged as such): the quadratic contaminant is even under $\mathbf r\to-\mathbf r$ while the linear basis is odd, so on a centred ball the contamination is exactly orthogonal to the fit. The first term that actually biases a centred linear fit is cubic.
- Winding is noise-biased upward. Noise makes trajectories wander, wander reads as rotation, and radial nulls drift into the spiral bin — while the sign read-out barely degrades. Under noise the flow classifier decays into a good two-class sign classifier.
The moral, stated without hedging: for classifying a null, the community’s local linear fit is already the right tool, and the sub-Riemannian flow cannot sharpen it — it can only beat the naive practice. Classification is a language the framework speaks, not a tool it sharpens.
Three days of the real Sun
Grounding, finally, means plural real data. We fetched two more genuine SDO/HMI magnetograms — 2012-03-07, the day of AR11429’s X5.4 flare, and 2014-10-22, hosting AR12192, the largest active region of solar cycle 24 — alongside the 2011-06-07 region of Part 4. Per day: the two most bipolar-balanced active regions, potential-field extrapolation, the Newton null finder, and every interior null kept — no cherry-picking.
research/preferred-directions/scripts/run_r3_real_gallery.py.
Two findings ride along, and the first arrived as a caveat and left as a theorem. All
five real nulls are radial — necessarily, and not just for potential fields. In any
force-free field $\nabla\times\mathbf B = \alpha\mathbf B$ with bounded $\alpha$, the
current vanishes wherever $\mathbf B$ does; the antisymmetric part of
$\nabla\mathbf B$ is the dual of $\nabla\times\mathbf B$, so at a null the Jacobian is
symmetric, its eigenvalues real — no force-free extrapolation, potential, linear
force-free, or NLFFF alike, can host a spiral null at all. (Our Part-4 dynamo field can,
precisely because it is not force-free: all eight of its spiral nulls carry
$\lVert\nabla\times\mathbf B\rVert = \sqrt3 \neq 0$ where $\mathbf B = 0$. The
theorem’s linear-algebra core — a symmetric $\nabla\mathbf B$ has only real
eigenvalues, so no spiral pair — is machine-checked in Lean:
FDFormal.forcefree_null_no_spiral,
research/preferred-directions/lean/FORMAL.md.) So the
radial-only gallery is not half the problem — it is the whole problem that
smooth force-free (bounded-α) extrapolations can pose; non-force-free and
data-driven MHD extrapolations are outside the theorem, and genuinely spiral nulls live
there and in in-situ magnetospheric data. Second: the noise-fragile flow classifier
goes five-for-five here because the nulls in these force-free extrapolations (model
fields from real magnetograms, not in-situ measurements) sit far from the radial/spiral
boundary — exactly the regime the R2 curves say is easy for everyone. Consistency, not
contradiction.
The division of labour
After R1–R3 the ledger is clean enough to state as a table:
| Question about a null | Right tool | Status |
|---|---|---|
| Is one here? | SR growth vector: $Q\colon 5\to6$, scale-covariant, defined before any Jacobian is estimable | grounded: full type battery + five real nulls, 10/10 |
| What order? | SR law $Q=k+5$ | confirmed (Part 4) |
| How is the field changing nearby? | SR caustic: $\delta=-\varepsilon^2$ on the exponential profile; general 1D profiles read $(1-\tfrac34\beta)\lvert\nabla\ln B\rvert^2$ | confirmed (Part 3, article §4) |
| Radial or spiral, which sign? | the local least-squares fit of $\nabla\mathbf B$ | the standard scheme keeps it — R2 |
That last row is the honest one. We built the classification method the program called for; it works (H-R1), it beats the naive practice it was designed to beat, and a properly fitted Jacobian still beats it. A framework that wants to be science rather than advertising has to be able to report exactly that — and the rows above it are what it keeps.
Glossary
- Null / radial / spiral / spine / fan / sign — a point with $\mathbf B=0$; its Parnell class from the eigenvalues of $M=\nabla\mathbf B$: all real = radial (X), a complex pair = spiral (O); the spine is the odd-sign-out eigenvector, the fan its complementary plane, and the sign is the spine eigenvalue’s sign.
- $Q$ (homogeneous dimension) — sum of the growth-vector weights of the flux lift; $Q=5$ where $\mathbf B\neq0$, $Q=6$ at a generic null.
- Winding $W$ — median unwrapped angle swept by integrated field-line trajectories about their coherent rotation axis; the flow classifier’s radial/spiral discriminant.
- Escape asymmetry — median exit time of forward- versus backward-integrated trajectories from the information ball; because $\operatorname{tr} M = 0$ forces the spine rate to exceed the fan rate, its sign is the null’s sign.
- $\sigma$ (noise level) — standard deviation of white per-node field noise, relative to the RMS $\lvert\mathbf B\rvert$ over the information ball (radius 0.5, the data every classifier sees).
- Parity protection — an even-order contaminant is orthogonal to an odd (linear) basis on a centred symmetric ball, so quadratic curvature does not bias a centred linear fit.
Reproduce
cd research/preferred-directions
../cosmic-web/.venv/bin/python scripts/run_r1_gallery.py # type battery + gallery
../cosmic-web/.venv/bin/python scripts/run_r2_classifier.py # the race (~45 min)
../cosmic-web/.venv/bin/python scripts/fetch_hmi.py # real HMI days (VSO)
../cosmic-web/.venv/bin/python scripts/run_r3_real_gallery.py # the real gallery
Charter and per-experiment reports: research/preferred-directions/docs/PROGRAM-P3-real-null-grounding.md,
R2-classifier-noise.md, R3-real-gallery.md.