@@ -652,6 +652,89 @@ solver steps (route (a) evaluates it; `dtmax` makes the steps small enough that
652652which the current diagnostics, all built on node values, cannot see. Closing that gap is worth
653653roughly another 18% on top of route (a)'s 42%.
654654
655+ ## 17. Route (a) landed; Phase A diagnostics cancel the planned Phase B
656+
657+ Route (a) is now on ` performance/consistent-surface-theta-parametrization ` (PR #398 ), measured
658+ against ** current** develop (9491f893d — the earlier harness run used a stale local ` develop ` at
659+ 40f9a9d03, ~ 20 commits behind; refreshed, conclusions unchanged):
660+
661+ - ` diiid_n1 ` : ODE steps (total) ** 4572 → 1974 (−56.8%)** , et[ 1] 0.10%, q0/q95/singular surfaces
662+ unchanged to 0.00%. Runtime 202.1 → 177.6 s.
663+ - ` solovev_n1 ` : et[ 1] moves 98% — ** because the develop value was grid-dependent** . Same commit,
664+ only route (a) differing:
665+
666+ | mpsi | et[ 1] develop | et[ 1] route (a) | steps develop | steps route (a) |
667+ | ---| ---| ---| ---| ---|
668+ | 256 | 1.959e-02 | ** 1.462068e-02** | 1074 | 775 |
669+ | 512 | 5.399e-02 | ** 1.462087e-02** | 1558 | 806 |
670+ | 1024 | 8.890e-02 | ** 1.462084e-02** | 2689 | 891 |
671+
672+ develop drifts 4.5× and is still moving; route (a) is converged to 6 significant figures and the
673+ step ratio is 1.04×/1.11× against 1.45×/1.73×. ** For Solovev the issue's goal is met on both
674+ axes at once.**
675+
676+ ### A3 — the kill-switch fires: there is no interpolant error left to remove
677+
678+ Route (a) geometry vs a near-exact trace (` dtmax = 2π/8000 ` ), DIII-D mpsi=512, max relative
679+ difference:
680+
681+ | quantity | ψ<0.05 (280 surfaces) | mid-plasma |
682+ | ---| ---| ---|
683+ | nu | 5.53e-10 | 1.31e-09 |
684+ | offset | 2.40e-08 | 7.38e-09 |
685+ | rcoords | 7.30e-10 | 4.63e-09 |
686+ | jac | 9.92e-10 | 7.45e-10 |
687+
688+ The pre-registered prediction was that route (a) would differ from gold near the axis by ** far more
689+ than the integration tolerance** . It does not — it agrees * at* tolerance. ** Phase B (reparametrise
690+ onto the SFL angle with ` tstops ` ) would fix an error that is not there, and is cancelled.**
691+
692+ ### The step count is hypersensitive, so small step differences are not signal
693+
694+ Two traces differing only by ` dtmax = 2π/8000 ` vs ` 2π/7900 ` — geometry identical to ** 5.3e-11** —
695+ give 2343 vs 2370 steps (1.2%). And the gold trace takes 15% fewer steps than route (a) while
696+ agreeing with it to ~ 1e-9. So ` nstep ` is not a smooth functional of equilibrium quality: it responds
697+ to perturbations far below physical significance (et[ 1] agrees to 8-9 digits throughout). Route
698+ (a)'s −57% is far outside this sensitivity and is real; the leftover 15–20% gaps are its tail.
699+
700+ ### A1 — the residual belongs to the traced construction, not to the EFIT input
701+
702+ Same analytic equilibrium (` TJ_ANALYTIC_INPUT ` ), same grid, both with route (a) applied, only the
703+ construction path differing:
704+
705+ | mpsi | traced (` tj_analytic_direct ` ) | inversion (` tj_analytic ` ) |
706+ | ---| ---| ---|
707+ | 256 | 814 | 789 |
708+ | 512 | 997 (1.23×) | 892 (1.13×) |
709+ | 1024 | 1470 (1.47×) | 1056 (1.18×) |
710+
711+ With a perfectly smooth analytic input, the traced path still grows 1.47× while the inversion path
712+ grows 1.18×. So the DIII-D residual is ** not** specific to the EFIT file.
713+
714+ ### …and it is not trace integration error either
715+
716+ On that same traced analytic case at mpsi=1024, tightening the trace tolerance 1000× is null:
717+ ` etol ` 1e-10 → 1470 steps, 1e-13 → 1487 steps (+1.2%), et[ 1] identical to 8 digits.
718+
719+ (Method note: the first attempt at this test was a ** no-op** — ` examples/LAR_epsilon_scan ` has no
720+ ` etol ` key, so the ` sed ` matched nothing and all three runs used the default. Bit-identical results
721+ gave it away. The numbers above are from runs with the key actually inserted.)
722+
723+ ### Where that leaves the deep core
724+
725+ Geometry accurate to ~ 1e-9, insensitive to trace tolerance, yet still growing with mpsi on the
726+ traced path but not the inversion path. What distinguishes them is not the * size* of the per-surface
727+ error but its * character* : tracing each surface independently produces an error that is white in ψ
728+ at whatever amplitude it has, and a packed grid amplifies white noise no matter how small. The
729+ inversion path's quadrature error is smooth in ψ and so is not amplified.
730+
731+ If that is right, no amount of per-surface accuracy will flatten the traced path — only making the
732+ error * correlated* across surfaces (continuation) or using the inversion construction will. That is
733+ a hypothesis, not a measurement, and it is where the next session should start.
734+
735+ ** Untouched** : A2 (the EL-side error-control question — the solves pass only ` reltol ` , so ` abstol `
736+ sits at the DiffEq default; plus the integration-direction and Frobenius-start questions).
737+
655738## Implications / ranked follow-ups
656739
6577401 . ** Use the two-pass auto grid** (` mpsi=0 ` , ` psi_accuracy ` ) — already the example default; it
0 commit comments