Skip to content

Tearing - BUGFIX! - Polish roots with a real 2x2 Jacobian so the anti-holomorphic SLAYER residual converges - #577

Merged
matt-pharr merged 2 commits into
developfrom
bugfix/slayer-polish-antianalytic
Oct 29, 2026
Merged

matt-pharr merged 2 commits into
developfrom
bugfix/slayer-polish-antianalytic

Conversation

@d-burg

@d-burg d-burg commented Oct 23, 2026 •

Copy link
Copy Markdown
Collaborator

Release note

  • Audience: users
  • Numerical impact: SLAYER polished roots move to the true zero of the residual; the current harness reports γ changes of 0.1305 Hz (0.01%) in diiid_slayer_n1 and 0.2564 Hz (0.02%) in diiid_slayer_n1_chi_perp_e, with the tracked no_root flags unchanged. On residuals where the old polish stalled, roots that were wrongly rejected as :spurious are now kept (harness @ 5828895)
  • Migration: no deck changes. SLAYER growth rates can change where the old polish stalled: rerun tearing analyses whose least-damped root was reported :spurious or :no_root.

SLAYER tearing growth rates could miss the least-damped root: the root polisher assumed a holomorphic residual, but the SLAYER residual is a function of conj(Q), so steep roots failed to polish and were rejected as spurious. The polisher now uses a real 2×2 Jacobian and converges on these residuals.

Regression report

Latest SDCC fanout rerun: develop 7817f0e7a vs 5828895a0 — 21 cases; growth-rate changes of 0.1305 Hz (0.01%) and 0.2564 Hz (0.02%) in the two uncoupled SLAYER cases; other comparable quantities unchanged; harness exit 0. Full report and limitations. gal_resistive_pe has all eight quantities missing on both refs and provides no numerical validation. Earlier reports are retained below.

runtests_dispersion_polish.jl (65) passes on feynman at 5828895a0. The report below is the earlier run at 5d4ee8fe9.

Run at 5d4ee8f against develop @ 231e776:

Regression Report: diiid_n1
===================================================================================================================
Ref 1: 231e7766a  @ 231e7766a (2026-10-23)
       env: julia 1.11.6, arm64-apple-darwin24.0.0, manifest 228bd1ea (pinned), 8 threads/8 BLAS, jit build
Ref 2: bugfix/slayer-polish-antianalytic  @ 5d4ee8fe9 (2026-10-23)
       env: julia 1.11.6, arm64-apple-darwin24.0.0, manifest 228bd1ea (pinned), 8 threads/8 BLAS, jit build
-------------------------------------------------------------------------------------------------------------------
Quantity                                      231e7766a        bugfix/slayer-polish-antianalytic  Diff       Status
-------------------------------------------------------------------------------------------------------------------
total energy Re(et[1])                        8.006124e-01     8.006124e-01                       0.0e+00    OK    
total energy Im(et[1])                        7.924928e-05     7.924928e-05                       0.0e+00    OK    
plasma energy Re(ep[1])                       -1.372261e+00    -1.372261e+00                      0.0e+00    OK    
vacuum energy Re(ev[1])                       2.172874e+00     2.172874e+00                       0.0e+00    OK    
vacuum matrix min eigenvalue                  1.873975e-01     1.873975e-01                       0.0e+00    OK    
plasma energy (all)                           [35 elem]        [35 elem]                          0.0e+00    OK    
vacuum energy (all)                           [35 elem]        [35 elem]                          0.0e+00    OK    
total energy (all)                            [35 elem]        [35 elem]                          0.0e+00    OK    
ODE steps (saved)                             782              782                                0.0e+00    OK    
ODE steps (total)                             777              777                                0.0e+00    OK    
q0                                            1.204212e+00     1.204212e+00                       0.0e+00    OK    
q95                                           4.781723e+00     4.781723e+00                       0.0e+00    OK    
beta_t                                        1.327024e-02     1.327024e-02                       0.0e+00    OK    
beta_n                                        1.372511e+00     1.372511e+00                       0.0e+00    OK    
internal inductance li1                       8.842269e-01     8.842269e-01                       0.0e+00    OK    
internal inductance li2                       7.080757e-01     7.080757e-01                       0.0e+00    OK    
internal inductance li3                       7.304340e-01     7.304340e-01                       0.0e+00    OK    
poloidal beta betap1                          6.680739e-01     6.680739e-01                       0.0e+00    OK    
poloidal beta betap2                          5.349836e-01     5.349836e-01                       0.0e+00    OK    
poloidal beta betap3                          5.518764e-01     5.518764e-01                       0.0e+00    OK    
# singular surfaces                           5                5                                  0.0e+00    OK    
singular psi locations                        [5 elem]         [5 elem]                           0.0e+00    OK    
singular q values                             [5 elem]         [5 elem]                           0.0e+00    OK    
current beta betaj                            4.236480e-01     4.236480e-01                       0.0e+00    OK    
plasma volume                                 1.829472e+01     1.829472e+01                       0.0e+00    OK    
plasma current                                1.152130e+00     1.152130e+00                       0.0e+00    OK    
mpert                                         35               35                                 0.0e+00    OK    
npert                                         1                1                                  0.0e+00    OK    
toroidal field bt0                            2.006573e+00     2.006573e+00                       0.0e+00    OK    
wall field bwall                              3.880145e-01     3.880145e-01                       0.0e+00    OK    
aspect ratio                                  2.845746e+00     2.845746e+00                       0.0e+00    OK    
elongation kappa                              1.708322e+00     1.708322e+00                       0.0e+00    OK    
q profile (checksum)                          d0188a4b99b7...  d0188a4b99b7...                    identical  OK    
pressure profile (checksum)                   b3454f0497c9...  b3454f0497c9...                    identical  OK    
Mercier D_I profile (checksum)                3df366bd23ba...  3df366bd23ba...                    identical  OK    
resistive interchange D_R profile (checksum)  f4b268f6c296...  f4b268f6c296...                    identical  OK    
ballooning Delta' profile (checksum)          4a3918377d0a...  4a3918377d0a...                    identical  OK    
island half-widths                            [5 elem]         [5 elem]                           0.0e+00    OK    
Chirikov parameter                            [5 elem]         [5 elem]                           0.0e+00    OK    
||resonant area-weighted field||              5.288946e-04     5.288946e-04                       0.0e+00    OK    
dominant-coupling singular values             [3 elem]         [3 elem]                           0.0e+00    OK    
|forcing overlap with dominant mode|          1.411578e-04     1.411578e-04                       0.0e+00    OK    
|delta_nominal| of coil set 1                 7.034773e-05     7.034773e-05                       0.0e+00    OK    
||ddelta/d(shift)|| over coil sets            1.245501e-04     1.245501e-04                       0.0e+00    OK    
||ddelta/d(tilt)|| over coil sets             4.176378e-07     4.176378e-07                       0.0e+00    OK    
PE plasma energy                              3.320677e+00     3.320677e+00                       0.0e+00    OK    
PE vacuum energy                              3.174510e+00     3.174510e+00                       0.0e+00    OK    
PE surface energy                             5.509016e+00     5.509016e+00                       0.0e+00    OK    
PE toroidal torque                            1.119445e-04     1.119445e-04                       0.0e+00    OK    
NTV torque FGAR [N·m]                         5.483496e-01     5.483496e-01                       0.0e+00    OK    
NTV kinetic energy dW FGAR [J]                8.163805e-02     8.163805e-02                       0.0e+00    OK    
Runtime (s)                                   139.8s           140.6s                                        --    
||forcing b~|| (root-area-weighted)           4.683330e-04     4.683330e-04                       0.0e+00    OK    
resonant area-weighted field b^r              [5 elem]         [5 elem]                           0.0e+00    OK    
===================================================================================================================
Summary: 53 unchanged

Regression Report: diiid_slayer_n1
==================================================================================================================
Ref 1: 231e7766a  @ 231e7766a (2026-10-23)
       env: julia 1.11.6, arm64-apple-darwin24.0.0, manifest 228bd1ea (pinned), 8 threads/8 BLAS, jit build
Ref 2: bugfix/slayer-polish-antianalytic  @ 5d4ee8fe9 (2026-10-23)
       env: julia 1.11.6, arm64-apple-darwin24.0.0, manifest 228bd1ea (pinned), 8 threads/8 BLAS, jit build
------------------------------------------------------------------------------------------------------------------
Quantity                            231e7766a  bugfix/slayer-polish-antianalytic  Diff               Status       
------------------------------------------------------------------------------------------------------------------
SLAYER surface indices              [6 elem]   [6 elem]                           0.0e+00            OK           
SLAYER poloidal m                   [6 elem]   [6 elem]                           0.0e+00            OK           
SLAYER toroidal n                   [6 elem]   [6 elem]                           0.0e+00            OK           
SLAYER minor radius rs              [6 elem]   [6 elem]                           0.0e+00            OK           
SLAYER r-based shear                [6 elem]   [6 elem]                           0.0e+00            OK           
SLAYER Lundquist S                  [6 elem]   [6 elem]                           0.0e+00            OK           
SLAYER D_norm                       [6 elem]   [6 elem]                           0.0e+00            OK           
SLAYER P_perp                       [6 elem]   [6 elem]                           0.0e+00            OK           
SLAYER tauk                         [6 elem]   [6 elem]                           0.0e+00            OK           
SLAYER iota_e                       [6 elem]   [6 elem]                           0.0e+00            OK           
SLAYER Q_e                          [6 elem]   [6 elem]                           0.0e+00            OK           
SLAYER Q_i                          [6 elem]   [6 elem]                           0.0e+00            OK           
SLAYER Q_root [2/1,3/1,4/1]         [3 elem]   [3 elem]                           1.2e-05            OK           
SLAYER ω_Hz [2/1,3/1,4/1]           [3 elem]   [3 elem]                           1.6e-01            OK           
SLAYER γ_Hz [2/1,3/1,4/1]           [3 elem]   [3 elem]                           2.753e-01 (0.02%)  ** CHANGED **
SLAYER no_root flags [2/1,3/1,4/1]  [3 elem]   [3 elem]                           0.0e+00            OK           
SLAYER enabled flag                 1          1                                  0.0e+00            OK           
Runtime (s)                         127.2s     128.4s                                                --           
==================================================================================================================
Summary: 1 changed, 16 unchanged

Notes for reviewers

  • Cause. solve_inner(::SLAYERModel{:fitzpatrick}, ...) evaluates conj(Δ̂(ĝ)) on purpose (Schwarz reflection, to keep the scan-plane contour orientation consistent; see the comment in Riccati.jl). Root locations are unaffected, but the residual f(Q) = Δ′ − S^{1/3}Δ(Q) − Δ_c is then anti-holomorphic in Q. _polish_root modelled f with a complex secant slope, which assumes holomorphy. On an anti-holomorphic f that step is the mirror image of the true one: an offset i·y becomes 2i·y, each halving backtrack is also worse, and the polish returns the unpolished point. The validity gate then rejects every root whose raw contour intersection is not already accurate, which hits steep roots first.
  • Where it showed up. ARC V3A 2/1 surface (c = 1, ideal-wall Δ′ = −4.8): the least-damped root sits at the electron diamagnetic frequency, ω = −2.317 kHz, γ = −0.029 kHz, where |df/dQ| ≈ 3.8e3. It was rejected as :spurious (raw |f| = 2.06 vs gate 0.28), and extraction reported γ = −13.5 kHz from a far, strongly damped root family instead. Diagnosed by winding numbers (the residual winds −1 around its zeros and +1 around its poles, i.e. anti-holomorphic everywhere) and confirmed by a real-Jacobian Newton converging to |f| ≈ 1e-7 from three starts. The same mechanism produced run-to-run bimodality in the ARC ensembles (−0.02 kHz vs −13 kHz), depending on how close the raw intersection happened to land.
  • Fix. _polish_root now forms the real 2×2 Jacobian of (Re f, Im f) with respect to (Re Q, Im Q) from forward differences along both axes. Exact for holomorphic and anti-holomorphic residuals. Trust region, backtracking and the improve-or-no-op contract are unchanged; two forward-difference evaluations per iteration instead of one secant evaluation, measured at 127.2 → 128.4 s on diiid_slayer_n1. A Broyden update that would bring it back to one is Tearing.Dispersion - Update the root polish's Jacobian by Broyden instead of two differences per step #604.
  • Not changed. The conj convention in solve_inner and the validity gate itself (validity_rtol) are untouched.
  • Tests. test/runtests_dispersion_polish.jl: anti-holomorphic linear residual, a root offset purely along Im Q, and a steep nonlinear anti-holomorphic residual (all three fail with the complex-secant polish: 5 assertions), plus an extraction-level guard on a coarse scan whose raw intersection is above the gate. Polish (63), AMR (49), brute-force scan (33), residual (20), coupled (42), coupled full (31), runner (88), SLAYER inputs (62) and inner-layer suites pass.
  • Related. Tearing - BUGFIX - Make AMR growth-rate extraction independent of the global RNG #572 targeted the same run-to-run spread through triangulation pooling and has been taken out of v2.0; the likely remaining cause of near-pole rejections, the trust-radius cap near poles, is Tearing.Dispersion - Exclude poles from the polish trust radius near a pole #609. A residual that conjugates Δ̂ finds the intended roots only for a real (or Hermitian, coupled) Δ′; that condition is Tearing.Dispersion - Require a Hermitian Δ′ where the SLAYER residual conjugates Δ̂ #606.

Changes since the review

  • Develop merged (9ff0490f7), no conflicts.
  • 5828895a0: the 9-line comment on _polish_root cut to two lines, the local det renamed jdet, a test with a residual that is neither holomorphic nor anti-holomorphic, and the one-iteration evaluation bound tightened from 3·8 + 2 to 1 + 6 (two differences, the trial step and up to three backtracks).

🤖 Generated with Claude Code

@github-actions github-actions Bot added bugfix Something was wrong and now is not changed-results Results move or an interface breaks - read before upgrading labels Oct 23, 2026
@matt-pharr
matt-pharr added this pull request to stack #601 October 27, 2026 08:55
@d-burg d-burg added this to the GPEC v2.0.0 milestone Oct 28, 2026
@d-burg

d-burg commented Oct 28, 2026

Copy link
Copy Markdown
Collaborator Author

@matt-pharr could you run the harness on three more against develop 7817f0e7a? Heads: #577 5828895a0, #493 8d2eca4a5, #595 2dc99e1c8. For #577, the coupled and GGJ cases matter most (diiid_slayer_n1_coupled, diiid_slayer_n1_chi_perp_e, ggj_reference, ggj_ray_q500i, gal_resistive_diiid), since its polish change is shared with those paths. All three have develop merged and their review fixes in; #595 no longer changes any harness bound.

@d-burg
d-burg requested a review from matt-pharr October 28, 2026 21:13
@d-burg d-burg self-assigned this Oct 28, 2026
@matt-pharr

Copy link
Copy Markdown
Collaborator

@d-burg — completed the requested full SDCC fanout against develop 7817f0e7a, testing head 5828895a0.

Result: two small growth-rate differences; harness exit code 0, with no run failures.

  • 18 cases are entirely unchanged.
  • diiid_slayer_n1: the only changed quantity is the tracked growth-rate vector, with maximum absolute difference 0.1305 Hz (0.01%). The other 16 quantities are unchanged within their harness thresholds.
  • diiid_slayer_n1_chi_perp_e: the only changed quantity is the growth-rate vector, with maximum absolute difference 0.2564 Hz (0.02%). The other 16 quantities are unchanged within their thresholds.
  • The tracked no_root flags are unchanged in both cases. Q_root and frequency remain within their existing thresholds.
  • The requested coupled/GGJ/Galerkin checks (diiid_slayer_n1_coupled, ggj_reference, ggj_ray_q500i, gal_resistive_diiid) are unchanged. The chi_perp_e case is included above rather than described as unchanged.
  • gal_resistive_pe: all eight quantities are missing on both refs and provide no numerical validation.

The two growth-rate differences are reported as numerical changes; this run alone does not establish whether any part of the difference is threaded-search variability.

Environment: Julia 1.12.6, x86_64 Linux, CI manifest 4c9d54fa pinned at both refs, partition sirius. 21 cases / 42 tasks. Matching allocations at each ref: 2 Julia threads / 1 BLAS thread normally; diiid_error_field uses 16 / 8. The precompiled Riccati case was compared in the same build mode at both refs. Each PR's own harness case definitions were used.

./regress_fanout.sh --refs 7817f0e7a,5828895a0 --harness-ref 5828895a0 --name pr577_5828895a0_vs_7817f0e7a_20261028

SDCC report: /home/ITER/pharrm/Projects/GPEC_dev/regress-fanout/runs/pr577_5828895a0_vs_7817f0e7a_20261028/report.txt; report job 1299404.

Full regression report (21 cases)

================================================================
Case: diiid_error_field — DIII-D-like error-field assessment, n=1: ErrorFields stage with the NTV-limited correction couplings
================================================================

Regression Report: diiid_error_field
============================================================================================
Ref 1: 7817f0e7a  @ 7817f0e7a (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 16 threads/8 BLAS, jit build
Ref 2: 5828895a0  @ 5828895a0 (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 16 threads/8 BLAS, jit build
--------------------------------------------------------------------------------------------
Quantity                                         7817f0e7a     5828895a0     Diff     Status
--------------------------------------------------------------------------------------------
EFC overlap per kAt                              [1 elem]      [1 elem]      0.0e+00  OK    
EFC whole-field NTV torque per kAt² [N·m]        [1 elem]      [1 elem]      0.0e+00  OK    
EFC residual-field NTV torque per kAt² [N·m]     [1 elem]      [1 elem]      0.0e+00  OK    
EFC reference rotation ω_ref [rad/s]             [1 elem]      [1 elem]      0.0e+00  OK    
EFC rotation-scan shifts [rad/s]                 [9 elem]      [9 elem]      0.0e+00  OK    
EFC residual torque against rotation [N·m/kAt²]  [9 elem]      [9 elem]      0.0e+00  OK    
dominant-coupling singular values                [3 elem]      [3 elem]      0.0e+00  OK    
|delta_nominal| of coil set 1                    1.406930e-06  1.406930e-06  0.0e+00  OK    
|Σ δ_as_designed| of the error-field coils       1.358875e-18  1.358875e-18  0.0e+00  OK    
Monte Carlo mean |δ| of the error-field coils    4.701300e-05  4.701300e-05  0.0e+00  OK    
Runtime (s)                                      252.5s        248.1s                 --    
============================================================================================
Summary: 10 unchanged


================================================================
Case: diiid_multi_n — DIII-D-like equilibrium, n = 1, 2, ideal + perturbed equilibrium
================================================================

Regression Report: diiid_multi_n
=================================================================================================================
Ref 1: 7817f0e7a  @ 7817f0e7a (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
Ref 2: 5828895a0  @ 5828895a0 (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
-----------------------------------------------------------------------------------------------------------------
Quantity                                                      7817f0e7a        5828895a0        Diff       Status
-----------------------------------------------------------------------------------------------------------------
total energy Re(et[1])                                        -5.750527e-01    -5.750527e-01    0.0e+00    OK    
total energy (all)                                            [58 elem]        [58 elem]        0.0e+00    OK    
ODE steps (saved)                                             628              628              0.0e+00    OK    
mpert                                                         29               29               0.0e+00    OK    
npert                                                         2                2                0.0e+00    OK    
toroidal mode label of each mode index (checksum)             8d8d42b8832d...  8d8d42b8832d...  identical  OK    
permeability diagonal P~_ii (all n blocks)                    [58 elem]        [58 elem]        0.0e+00    OK    
forcing b~ (root-area-weighted), n = 1, 2                     [58 elem]        [58 elem]        0.0e+00    OK    
response b~ (root-area-weighted), n = 1, 2                    [58 elem]        [58 elem]        0.0e+00    OK    
PE plasma energy (sum over n)                                 2.936559e+00     2.936559e+00     0.0e+00    OK    
PE vacuum energy (sum over n)                                 3.113946e+00     3.113946e+00     0.0e+00    OK    
PE surface energy (sum over n)                                3.523427e+00     3.523427e+00     0.0e+00    OK    
PE toroidal torque sum_n -2n Im(Phi_n' Lambda_nn^-1 Phi_n)/4  1.820337e-06     1.820337e-06     0.0e+00    OK    
resonant n per row (rows sorted by psi across n)              [7 elem]         [7 elem]         0.0e+00    OK    
resonant m per row                                            [7 elem]         [7 elem]         0.0e+00    OK    
resonant area-weighted field b^r per row                      [7 elem]         [7 elem]         0.0e+00    OK    
island half-widths per row                                    [7 elem]         [7 elem]         0.0e+00    OK    
Chirikov parameter per row                                    [7 elem]         [7 elem]         0.0e+00    OK    
forcing-driven Delta' per row                                 [7 elem]         [7 elem]         0.0e+00    OK    
Runtime (s)                                                   197.5s           189.7s                      --    
=================================================================================================================
Summary: 19 unchanged


================================================================
Case: diiid_n1 — DIII-D-like equilibrium, n=1, ideal + perturbed equilibrium
================================================================

Regression Report: diiid_n1
=================================================================================================
Ref 1: 7817f0e7a  @ 7817f0e7a (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
Ref 2: 5828895a0  @ 5828895a0 (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
-------------------------------------------------------------------------------------------------
Quantity                                      7817f0e7a        5828895a0        Diff       Status
-------------------------------------------------------------------------------------------------
total energy Re(et[1])                        8.006122e-01     8.006122e-01     0.0e+00    OK    
total energy Im(et[1])                        7.924882e-05     7.924882e-05     0.0e+00    OK    
plasma energy Re(ep[1])                       -1.372261e+00    -1.372261e+00    0.0e+00    OK    
vacuum energy Re(ev[1])                       2.172874e+00     2.172874e+00     0.0e+00    OK    
vacuum matrix min eigenvalue                  1.873975e-01     1.873975e-01     0.0e+00    OK    
plasma energy (all)                           [35 elem]        [35 elem]        0.0e+00    OK    
vacuum energy (all)                           [35 elem]        [35 elem]        0.0e+00    OK    
total energy (all)                            [35 elem]        [35 elem]        0.0e+00    OK    
ODE steps (saved)                             788              788              0.0e+00    OK    
ODE steps (total)                             783              783              0.0e+00    OK    
q0                                            1.204212e+00     1.204212e+00     0.0e+00    OK    
q95                                           4.781723e+00     4.781723e+00     0.0e+00    OK    
beta_t                                        1.327024e-02     1.327024e-02     0.0e+00    OK    
beta_n                                        1.372511e+00     1.372511e+00     0.0e+00    OK    
internal inductance li1                       8.842268e-01     8.842268e-01     0.0e+00    OK    
internal inductance li2                       7.080757e-01     7.080757e-01     0.0e+00    OK    
internal inductance li3                       7.304340e-01     7.304340e-01     0.0e+00    OK    
poloidal beta betap1                          6.680739e-01     6.680739e-01     0.0e+00    OK    
poloidal beta betap2                          5.349836e-01     5.349836e-01     0.0e+00    OK    
poloidal beta betap3                          5.518764e-01     5.518764e-01     0.0e+00    OK    
# singular surfaces                           5                5                0.0e+00    OK    
singular psi locations                        [5 elem]         [5 elem]         0.0e+00    OK    
singular q values                             [5 elem]         [5 elem]         0.0e+00    OK    
current beta betaj                            4.236480e-01     4.236480e-01     0.0e+00    OK    
plasma volume                                 1.829472e+01     1.829472e+01     0.0e+00    OK    
plasma current                                1.152130e+00     1.152130e+00     0.0e+00    OK    
mpert                                         35               35               0.0e+00    OK    
npert                                         1                1                0.0e+00    OK    
toroidal field bt0                            2.006573e+00     2.006573e+00     0.0e+00    OK    
wall field bwall                              3.880145e-01     3.880145e-01     0.0e+00    OK    
aspect ratio                                  2.845746e+00     2.845746e+00     0.0e+00    OK    
elongation kappa                              1.708322e+00     1.708322e+00     0.0e+00    OK    
q profile (checksum)                          6da947d0754e...  6da947d0754e...  identical  OK    
pressure profile (checksum)                   c9c6ca4072ca...  c9c6ca4072ca...  identical  OK    
Mercier D_I profile (checksum)                26babbe22505...  26babbe22505...  identical  OK    
resistive interchange D_R profile (checksum)  c46830151a0b...  c46830151a0b...  identical  OK    
ballooning Delta' profile (checksum)          c27c6779804a...  c27c6779804a...  identical  OK    
island half-widths                            [5 elem]         [5 elem]         0.0e+00    OK    
Chirikov parameter                            [5 elem]         [5 elem]         0.0e+00    OK    
||resonant area-weighted field||              5.288412e-04     5.288412e-04     0.0e+00    OK    
dominant-coupling singular values             [3 elem]         [3 elem]         0.0e+00    OK    
|forcing overlap with dominant mode|          1.411553e-04     1.411553e-04     0.0e+00    OK    
|delta_nominal| of coil set 1                 7.034649e-05     7.034649e-05     0.0e+00    OK    
||ddelta/d(shift)|| over coil sets            1.245448e-04     1.245448e-04     0.0e+00    OK    
||ddelta/d(tilt)|| over coil sets             4.177341e-07     4.177341e-07     0.0e+00    OK    
PE plasma energy                              3.320466e+00     3.320466e+00     0.0e+00    OK    
PE vacuum energy                              3.174319e+00     3.174319e+00     0.0e+00    OK    
PE surface energy                             5.508585e+00     5.508585e+00     0.0e+00    OK    
PE toroidal torque                            1.119354e-04     1.119354e-04     0.0e+00    OK    
NTV torque FGAR [N·m]                         5.480614e-01     5.480614e-01     0.0e+00    OK    
NTV kinetic energy dW FGAR [J]                8.163291e-02     8.163291e-02     0.0e+00    OK    
Runtime (s)                                   230.7s           232.3s                      --    
||forcing b~|| (root-area-weighted)           4.683171e-04     4.683171e-04     0.0e+00    OK    
resonant area-weighted field b^r              [5 elem]         [5 elem]         0.0e+00    OK    
=================================================================================================
Summary: 53 unchanged


================================================================
Case: diiid_n1_riccati — DIII-D-like equilibrium, n=1, Riccati integrator Δ' matrix
================================================================

Regression Report: diiid_n1_riccati
============================================================================
Ref 1: 7817f0e7a  @ 7817f0e7a (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
Ref 2: 5828895a0  @ 5828895a0 (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
----------------------------------------------------------------------------
Quantity                       7817f0e7a      5828895a0      Diff     Status
----------------------------------------------------------------------------
delta prime (BVP diagonal)     [5 elem]       [5 elem]       0.0e+00  OK    
delta prime (raw side-major)   [10 elem]      [10 elem]      0.0e+00  OK    
edge coil response delta_coil  [10 elem]      [10 elem]      0.0e+00  OK    
total energy Re(et[1])         8.031971e-01   8.031971e-01   0.0e+00  OK    
plasma energy Re(ep[1])        -1.368534e+00  -1.368534e+00  0.0e+00  OK    
vacuum energy Re(ev[1])        2.171732e+00   2.171732e+00   0.0e+00  OK    
total energy (all)             [35 elem]      [35 elem]      0.0e+00  OK    
# singular surfaces            5              5              0.0e+00  OK    
singular psi locations         [5 elem]       [5 elem]       0.0e+00  OK    
singular q values              [5 elem]       [5 elem]       0.0e+00  OK    
ODE steps (saved)              93             93             0.0e+00  OK    
ODE steps (total)              2631           2631           0.0e+00  OK    
mpert                          35             35             0.0e+00  OK    
npert                          1              1              0.0e+00  OK    
q0                             1.204212e+00   1.204212e+00   0.0e+00  OK    
q95                            4.781723e+00   4.781723e+00   0.0e+00  OK    
beta_n                         1.372511e+00   1.372511e+00   0.0e+00  OK    
Runtime (s)                    192.0s         187.3s                  --    
============================================================================
Summary: 17 unchanged


================================================================
Case: diiid_n1_riccati_precompiled — DIII-D-like equilibrium, n=1, Riccati integrator Δ' matrix, precompiled build
================================================================

Regression Report: diiid_n1_riccati_precompiled
============================================================================
Ref 1: 7817f0e7a  @ 7817f0e7a (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, aot build
Ref 2: 5828895a0  @ 5828895a0 (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, aot build
----------------------------------------------------------------------------
Quantity                       7817f0e7a      5828895a0      Diff     Status
----------------------------------------------------------------------------
delta prime (BVP diagonal)     [5 elem]       [5 elem]       0.0e+00  OK    
delta prime (raw side-major)   [10 elem]      [10 elem]      0.0e+00  OK    
edge coil response delta_coil  [10 elem]      [10 elem]      0.0e+00  OK    
total energy Re(et[1])         8.031971e-01   8.031971e-01   0.0e+00  OK    
plasma energy Re(ep[1])        -1.368534e+00  -1.368534e+00  0.0e+00  OK    
vacuum energy Re(ev[1])        2.171732e+00   2.171732e+00   0.0e+00  OK    
total energy (all)             [35 elem]      [35 elem]      0.0e+00  OK    
# singular surfaces            5              5              0.0e+00  OK    
singular psi locations         [5 elem]       [5 elem]       0.0e+00  OK    
singular q values              [5 elem]       [5 elem]       0.0e+00  OK    
ODE steps (saved)              93             93             0.0e+00  OK    
ODE steps (total)              2631           2631           0.0e+00  OK    
mpert                          35             35             0.0e+00  OK    
npert                          1              1              0.0e+00  OK    
q0                             1.204212e+00   1.204212e+00   0.0e+00  OK    
q95                            4.781723e+00   4.781723e+00   0.0e+00  OK    
beta_n                         1.372511e+00   1.372511e+00   0.0e+00  OK    
Runtime (s)                    25.9s          28.8s                   --    
============================================================================
Summary: 17 unchanged


================================================================
Case: diiid_slayer_n1 — DIII-D-like H-mode equilibrium, n=1, SLAYER tearing-mode analysis (uncoupled per-surface, AMR, validity-gated)
================================================================

Regression Report: diiid_slayer_n1
==========================================================================================
Ref 1: 7817f0e7a  @ 7817f0e7a (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
Ref 2: 5828895a0  @ 5828895a0 (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
------------------------------------------------------------------------------------------
Quantity                            7817f0e7a  5828895a0  Diff               Status       
------------------------------------------------------------------------------------------
SLAYER surface indices              [6 elem]   [6 elem]   0.0e+00            OK           
SLAYER poloidal m                   [6 elem]   [6 elem]   0.0e+00            OK           
SLAYER toroidal n                   [6 elem]   [6 elem]   0.0e+00            OK           
SLAYER minor radius rs              [6 elem]   [6 elem]   0.0e+00            OK           
SLAYER r-based shear                [6 elem]   [6 elem]   0.0e+00            OK           
SLAYER Lundquist S                  [6 elem]   [6 elem]   0.0e+00            OK           
SLAYER D_norm                       [6 elem]   [6 elem]   0.0e+00            OK           
SLAYER P_perp                       [6 elem]   [6 elem]   0.0e+00            OK           
SLAYER tauk                         [6 elem]   [6 elem]   0.0e+00            OK           
SLAYER iota_e                       [6 elem]   [6 elem]   0.0e+00            OK           
SLAYER Q_e                          [6 elem]   [6 elem]   0.0e+00            OK           
SLAYER Q_i                          [6 elem]   [6 elem]   0.0e+00            OK           
SLAYER Q_root [2/1,3/1,4/1]         [3 elem]   [3 elem]   6.9e-06            OK           
SLAYER ω_Hz [2/1,3/1,4/1]           [3 elem]   [3 elem]   8.2e-02            OK           
SLAYER γ_Hz [2/1,3/1,4/1]           [3 elem]   [3 elem]   1.305e-01 (0.01%)  ** CHANGED **
SLAYER no_root flags [2/1,3/1,4/1]  [3 elem]   [3 elem]   0.0e+00            OK           
SLAYER enabled flag                 1          1          0.0e+00            OK           
Runtime (s)                         231.4s     229.0s                        --           
==========================================================================================
Summary: 1 changed, 16 unchanged


================================================================
Case: diiid_slayer_n1_chi_perp_e — DIII-D-like H-mode equilibrium, n=1, SLAYER tearing-mode analysis with P_perp_model = chi_perp_e
================================================================

Regression Report: diiid_slayer_n1_chi_perp_e
==========================================================================================
Ref 1: 7817f0e7a  @ 7817f0e7a (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
Ref 2: 5828895a0  @ 5828895a0 (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
------------------------------------------------------------------------------------------
Quantity                            7817f0e7a  5828895a0  Diff               Status       
------------------------------------------------------------------------------------------
SLAYER surface indices              [6 elem]   [6 elem]   0.0e+00            OK           
SLAYER poloidal m                   [6 elem]   [6 elem]   0.0e+00            OK           
SLAYER toroidal n                   [6 elem]   [6 elem]   0.0e+00            OK           
SLAYER minor radius rs              [6 elem]   [6 elem]   0.0e+00            OK           
SLAYER r-based shear                [6 elem]   [6 elem]   0.0e+00            OK           
SLAYER Lundquist S                  [6 elem]   [6 elem]   0.0e+00            OK           
SLAYER D_norm                       [6 elem]   [6 elem]   0.0e+00            OK           
SLAYER P_perp                       [6 elem]   [6 elem]   0.0e+00            OK           
SLAYER tauk                         [6 elem]   [6 elem]   0.0e+00            OK           
SLAYER iota_e                       [6 elem]   [6 elem]   0.0e+00            OK           
SLAYER Q_e                          [6 elem]   [6 elem]   0.0e+00            OK           
SLAYER Q_i                          [6 elem]   [6 elem]   0.0e+00            OK           
SLAYER Q_root [2/1,3/1,4/1]         [3 elem]   [3 elem]   1.1e-05            OK           
SLAYER ω_Hz [2/1,3/1,4/1]           [3 elem]   [3 elem]   1.4e-01            OK           
SLAYER γ_Hz [2/1,3/1,4/1]           [3 elem]   [3 elem]   2.564e-01 (0.02%)  ** CHANGED **
SLAYER no_root flags [2/1,3/1,4/1]  [3 elem]   [3 elem]   0.0e+00            OK           
SLAYER enabled flag                 1          1          0.0e+00            OK           
Runtime (s)                         236.9s     234.2s                        --           
==========================================================================================
Summary: 1 changed, 16 unchanged


================================================================
Case: diiid_slayer_n1_coupled — DIII-D-like H-mode equilibrium, n=1, SLAYER coupled multi-surface determinant with kinetic-file E×B rotation (reuses the n=1 deck via overrides)
================================================================

Regression Report: diiid_slayer_n1_coupled
==================================================================
Ref 1: 7817f0e7a  @ 7817f0e7a (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
Ref 2: 5828895a0  @ 5828895a0 (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
------------------------------------------------------------------
Quantity                     7817f0e7a  5828895a0  Diff     Status
------------------------------------------------------------------
SLAYER tauk                  [6 elem]   [6 elem]   0.0e+00  OK    
SLAYER q_shift               [6 elem]   [6 elem]   0.0e+00  OK    
SLAYER coupled Q_root        [1 elem]   [1 elem]   0.0e+00  OK    
SLAYER coupled ω             [1 elem]   [1 elem]   0.0e+00  OK    
SLAYER coupled γ             [1 elem]   [1 elem]   0.0e+00  OK    
SLAYER coupled no_root flag  [1 elem]   [1 elem]   0.0e+00  OK    
SLAYER enabled flag          1          1          0.0e+00  OK    
Runtime (s)                  234.5s     232.4s              --    
==================================================================
Summary: 7 unchanged


================================================================
Case: diiid_truncation_n1 — DIII-D-like, n=1, psihigh=0.9999 with the resistive-layer overlap cap binding (truncation only)
================================================================

Regression Report: diiid_truncation_n1
====================================================================================
Ref 1: 7817f0e7a  @ 7817f0e7a (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
Ref 2: 5828895a0  @ 5828895a0 (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
------------------------------------------------------------------------------------
Quantity                               7817f0e7a      5828895a0      Diff     Status
------------------------------------------------------------------------------------
layer-overlap cap applied              1              1              0.0e+00  OK    
layer-overlap psilim                   9.985081e-01   9.985081e-01   0.0e+00  OK    
first overlapping surface index        7              7              0.0e+00  OK    
diffusive-resistive layer widths (Δψ)  [7 elem]       [7 elem]       0.0e+00  OK    
qlim                                   6.200000e+00   6.200000e+00   0.0e+00  OK    
psilim                                 9.949767e-01   9.949767e-01   0.0e+00  OK    
mpert                                  37             37             0.0e+00  OK    
# singular surfaces                    5              5              0.0e+00  OK    
singular q values                      [5 elem]       [5 elem]       0.0e+00  OK    
singular psi locations                 [5 elem]       [5 elem]       0.0e+00  OK    
plasma energy Re(ep[1])                -1.372379e+00  -1.372379e+00  0.0e+00  OK    
total energy Re(et[1])                 8.005437e-01   8.005437e-01   0.0e+00  OK    
Runtime (s)                            193.1s         192.6s                  --    
====================================================================================
Summary: 12 unchanged


================================================================
Case: efit_fixedbdy_separatrix — Fixed-boundary EFIT (box hugs LCFS), Newton separatrix-find regression
================================================================

Regression Report: efit_fixedbdy_separatrix
=======================================================================
Ref 1: 7817f0e7a  @ 7817f0e7a (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
Ref 2: 5828895a0  @ 5828895a0 (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
-----------------------------------------------------------------------
Quantity                    7817f0e7a     5828895a0     Diff     Status
-----------------------------------------------------------------------
psio (total poloidal flux)  3.344390e-01  3.344390e-01  0.0e+00  OK    
q0                          1.155202e+00  1.155202e+00  0.0e+00  OK    
q95                         5.741022e+00  5.741022e+00  0.0e+00  OK    
beta_t                      3.945172e-05  3.945172e-05  0.0e+00  OK    
beta_n                      1.009505e-01  1.009505e-01  0.0e+00  OK    
Runtime (s)                 47.7s         55.8s                  --    
=======================================================================
Summary: 5 unchanged


================================================================
Case: gal_resistive_diiid — DIII-D-like, n=1, RDCON outer-region Galerkin Δ′ with rpec coil columns (delta_coil)
================================================================

Regression Report: gal_resistive_diiid
====================================================================
Ref 1: 7817f0e7a  @ 7817f0e7a (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
Ref 2: 5828895a0  @ 5828895a0 (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
--------------------------------------------------------------------
Quantity                 7817f0e7a     5828895a0     Diff     Status
--------------------------------------------------------------------
gal # singular surfaces  4             4             0.0e+00  OK    
gal singular q values    [4 elem]      [4 elem]      0.0e+00  OK    
gal PEST3 Δ diagonal     [4 elem]      [4 elem]      0.0e+00  OK    
||gal Δ′ matrix||        2.302048e+03  2.302048e+03  0.0e+00  OK    
||gal Δ_coil block||     1.581714e+01  1.581714e+01  0.0e+00  OK    
gal D_I per surface      [4 elem]      [4 elem]      0.0e+00  OK    
gal α per surface        [4 elem]      [4 elem]      0.0e+00  OK    
||gal inner-layer Δ||    1.474577e+06  1.474577e+06  0.0e+00  OK    
||gal match cout||       3.048397e-02  3.048397e-02  0.0e+00  OK    
||gal match bpen||       1.206218e+00  1.206218e+00  0.0e+00  OK    
gal match residual       1.709610e-16  1.709610e-16  0.0e+00  OK    
Runtime (s)              241.8s        206.9s                 --    
====================================================================
Summary: 11 unchanged


================================================================
Case: gal_resistive_diiid_galinner — DIII-D-like, n=1, Galerkin Δ′ matched with the Galerkin inner-layer backend
================================================================

Regression Report: gal_resistive_diiid_galinner
====================================================================
Ref 1: 7817f0e7a  @ 7817f0e7a (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
Ref 2: 5828895a0  @ 5828895a0 (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
--------------------------------------------------------------------
Quantity                 7817f0e7a     5828895a0     Diff     Status
--------------------------------------------------------------------
gal # singular surfaces  4             4             0.0e+00  OK    
gal singular q values    [4 elem]      [4 elem]      0.0e+00  OK    
gal PEST3 Δ diagonal     [4 elem]      [4 elem]      0.0e+00  OK    
||gal Δ′ matrix||        2.302048e+03  2.302048e+03  0.0e+00  OK    
||gal Δ_coil block||     1.581714e+01  1.581714e+01  0.0e+00  OK    
gal D_I per surface      [4 elem]      [4 elem]      0.0e+00  OK    
gal α per surface        [4 elem]      [4 elem]      0.0e+00  OK    
||gal inner-layer Δ||    1.474566e+06  1.474566e+06  0.0e+00  OK    
||gal match cout||       3.048397e-02  3.048397e-02  0.0e+00  OK    
||gal match bpen||       1.206218e+00  1.206218e+00  0.0e+00  OK    
gal match residual       1.872671e-16  1.872671e-16  0.0e+00  OK    
Runtime (s)              203.5s        203.4s                 --    
====================================================================
Summary: 11 unchanged


================================================================
Case: gal_resistive_pe — DIII-D-like, n=1, DRIVEN/RPEC: gal-matched resistive ξ → PerturbedEquilibrium (coil-driven singular coupling)
================================================================

Regression Report: gal_resistive_pe
==========================================================
Ref 1: 7817f0e7a  @ 7817f0e7a (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
Ref 2: 5828895a0  @ 5828895a0 (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
----------------------------------------------------------
Quantity                7817f0e7a  5828895a0  Diff  Status
----------------------------------------------------------
rational q values       N/A        N/A        N/A   N/A   
island half-widths      N/A        N/A        N/A   N/A   
Chirikov parameter      N/A        N/A        N/A   N/A   
||resonant b field||    N/A        N/A        N/A   N/A   
resonant b field (all)  N/A        N/A        N/A   N/A   
penetrated b field      N/A        N/A        N/A   N/A   
PE Δ' per surface       N/A        N/A        N/A   N/A   
||C resonant b field||  N/A        N/A        N/A   N/A   
Runtime (s)             205.1s     216.9s           --    
==========================================================
Summary: 8 missing/N/A


================================================================
Case: ggj_ray_q500i — GGJ inner-layer :ray backend, q=4 surface, Q = 500i (beyond :galerkin)
================================================================

Regression Report: ggj_ray_q500i
===============================================================
Ref 1: 7817f0e7a  @ 7817f0e7a (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
Ref 2: 5828895a0  @ 5828895a0 (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
---------------------------------------------------------------
Quantity            7817f0e7a     5828895a0     Diff     Status
---------------------------------------------------------------
Re(Δ₊ interchange)  2.472007e+00  2.472007e+00  0.0e+00  OK    
Im(Δ₊ interchange)  1.335402e+01  1.335402e+01  0.0e+00  OK    
Re(Δ₋ tearing)      1.374966e-01  1.374966e-01  0.0e+00  OK    
Im(Δ₋ tearing)      7.427542e-01  7.427542e-01  0.0e+00  OK    
Runtime (s)         24.6s         22.3s                  --    
===============================================================
Summary: 4 unchanged


================================================================
Case: ggj_reference — GGJ inner-layer Galerkin solver, Glasser & Wang 2020 Eq. 55 with physical τ_A, τ_R, 1 kHz rotation (Q ≈ 0.22i)
================================================================

Regression Report: ggj_reference
=================================================================
Ref 1: 7817f0e7a  @ 7817f0e7a (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
Ref 2: 5828895a0  @ 5828895a0 (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
-----------------------------------------------------------------
Quantity            7817f0e7a      5828895a0      Diff     Status
-----------------------------------------------------------------
Re(Δ₊ interchange)  1.225728e+03   1.225728e+03   0.0e+00  OK    
Im(Δ₊ interchange)  2.064823e+04   2.064823e+04   0.0e+00  OK    
Re(Δ₋ tearing)      -5.345663e+00  -5.345663e+00  0.0e+00  OK    
Im(Δ₋ tearing)      2.592091e+01   2.592091e+01   0.0e+00  OK    
Runtime (s)         10.8s          10.9s                   --    
=================================================================
Summary: 4 unchanged


================================================================
Case: solovev_kinetic_calculated — Solovev, n=1, kinetic_source=calculated, kinetic_factor=1.0, 50/50 D-T multi-ion kinetic matrices, mode-converged band (delta_m=8, mpert=32); pressure-consistent kinetic.dat (n·T tied to the Solovev P₀≈4.27e4 Pa).
================================================================

Regression Report: solovev_kinetic_calculated
================================================================================
Ref 1: 7817f0e7a  @ 7817f0e7a (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
Ref 2: 5828895a0  @ 5828895a0 (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
--------------------------------------------------------------------------------
Quantity                           7817f0e7a      5828895a0      Diff     Status
--------------------------------------------------------------------------------
vacuum energy Re(ev[1])            1.054739e+01   1.054739e+01   0.0e+00  OK    
q0                                 1.900003e+00   1.900003e+00   0.0e+00  OK    
NTV fgar quadrature torque [N·m]   2.267351e-03   2.267351e-03   0.0e+00  OK    
||xi_clebsch_alpha||               6.041963e-01   6.041963e-01   0.0e+00  OK    
total energy Re(et[1])             1.828278e+00   1.828278e+00   0.0e+00  OK    
total energy Im(et[1])             -1.326607e+00  -1.326607e+00  0.0e+00  OK    
plasma energy Re(ep[1])            -8.719112e+00  -8.719112e+00  0.0e+00  OK    
ODE steps (saved)                  608            608            0.0e+00  OK    
# singular surfaces                2              2              0.0e+00  OK    
boundary-response torque [N·m]     2.285518e-03   2.285518e-03   0.0e+00  OK    
singular psi locations             [2 elem]       [2 elem]       0.0e+00  OK    
total energy (all)                 [32 elem]      [32 elem]      0.0e+00  OK    
ODE steps (total)                  607            607            0.0e+00  OK    
mpert                              32             32             0.0e+00  OK    
q95                                3.147422e+00   3.147422e+00   0.0e+00  OK    
||Jb_theta_reg||                   3.945600e-03   3.945600e-03   0.0e+00  OK    
Runtime (s)                        228.7s         229.7s                  --    
T_xe applied-forcing torque [N·m]  2.285518e-03   2.285518e-03   0.0e+00  OK    
||dxi_clebsch_psi/dpsi||           3.791914e+00   3.791914e+00   0.0e+00  OK    
singular q values                  [2 elem]       [2 elem]       0.0e+00  OK    
npert                              1              1              0.0e+00  OK    
================================================================================
Summary: 20 unchanged


================================================================
Case: solovev_kinetic_multiion — Solovev n=1, ideal + PE + multi-ion NTV (D + T + electron summed)
================================================================

Regression Report: solovev_kinetic_multiion
==========================================================================
Ref 1: 7817f0e7a  @ 7817f0e7a (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
Ref 2: 5828895a0  @ 5828895a0 (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
--------------------------------------------------------------------------
Quantity                     7817f0e7a      5828895a0      Diff     Status
--------------------------------------------------------------------------
NTV total (D+T+imp+e) [N·m]  3.141767e+01   3.141767e+01   0.0e+00  OK    
NTV Deuterium [N·m]          1.973730e+01   1.973730e+01   0.0e+00  OK    
NTV Tritium [N·m]            2.046293e+01   2.046293e+01   0.0e+00  OK    
NTV electron [N·m]           -8.782557e+00  -8.782557e+00  0.0e+00  OK    
total energy Re(et[1])       1.090560e-02   1.090560e-02   0.0e+00  OK    
# singular surfaces          2              2              0.0e+00  OK    
Runtime (s)                  221.6s         220.6s                  --    
==========================================================================
Summary: 6 unchanged


================================================================
Case: solovev_kinetic_ntv — Solovev analytical equilibrium, n=1, ideal + PE + NTV torque quadrature
================================================================

Regression Report: solovev_kinetic_ntv
======================================================================================
Ref 1: 7817f0e7a  @ 7817f0e7a (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
Ref 2: 5828895a0  @ 5828895a0 (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
--------------------------------------------------------------------------------------
Quantity                                   7817f0e7a     5828895a0     Diff     Status
--------------------------------------------------------------------------------------
NTV torque fgar [Re, Im]                   [1 elem]      [1 elem]      0.0e+00  OK    
NTV ψ quadrature evaluations               45            45            0.0e+00  OK    
fluid CGL energy fcgl [J]                  1.552303e+01  1.552303e+01  0.0e+00  OK    
root-area-weighted total energy Re(et[1])  1.090560e-02  1.090560e-02  0.0e+00  OK    
# singular surfaces                        2             2             0.0e+00  OK    
singular psi locations                     [2 elem]      [2 elem]      0.0e+00  OK    
q0                                         1.900006e+00  1.900006e+00  0.0e+00  OK    
Runtime (s)                                220.2s        220.3s                 --    
======================================================================================
Summary: 7 unchanged


================================================================
Case: solovev_kinetic_nuzero — Solovev, n=1, kinetic_source=calculated, nutype=zero (collisionless energy integral), 50/50 D-T multi-ion kinetic matrices, mode-converged band (delta_m=8, mpert=32). Reuses the calculated example deck via override; pressure-consistent kinetic.dat.
================================================================

Regression Report: solovev_kinetic_nuzero
======================================================================
Ref 1: 7817f0e7a  @ 7817f0e7a (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
Ref 2: 5828895a0  @ 5828895a0 (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
----------------------------------------------------------------------
Quantity                 7817f0e7a      5828895a0      Diff     Status
----------------------------------------------------------------------
vacuum energy Re(ev[1])  1.058613e+01   1.058613e+01   0.0e+00  OK    
q0                       1.900003e+00   1.900003e+00   0.0e+00  OK    
total energy Re(et[1])   2.290965e+00   2.290965e+00   0.0e+00  OK    
total energy Im(et[1])   -1.564546e+00  -1.564546e+00  0.0e+00  OK    
plasma energy Re(ep[1])  -8.295163e+00  -8.295163e+00  0.0e+00  OK    
ODE steps (saved)        608            608            0.0e+00  OK    
# singular surfaces      2              2              0.0e+00  OK    
singular psi locations   [2 elem]       [2 elem]       0.0e+00  OK    
total energy (all)       [32 elem]      [32 elem]      0.0e+00  OK    
ODE steps (total)        607            607            0.0e+00  OK    
mpert                    32             32             0.0e+00  OK    
q95                      3.147422e+00   3.147422e+00   0.0e+00  OK    
Runtime (s)              237.8s         235.6s                  --    
singular q values        [2 elem]       [2 elem]       0.0e+00  OK    
npert                    1              1              0.0e+00  OK    
======================================================================
Summary: 14 unchanged


================================================================
Case: solovev_multi_n — Solovev analytical equilibrium, multi-n, ideal stability
================================================================

Regression Report: solovev_multi_n
=================================================================================
Ref 1: 7817f0e7a  @ 7817f0e7a (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
Ref 2: 5828895a0  @ 5828895a0 (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
---------------------------------------------------------------------------------
Quantity                      7817f0e7a        5828895a0        Diff       Status
---------------------------------------------------------------------------------
total energy Re(et[1])        -2.134718e+00    -2.134718e+00    0.0e+00    OK    
total energy Im(et[1])        1.968592e-10     1.968592e-10     0.0e+00    OK    
vacuum matrix min eigenvalue  1.730832e+00     1.730832e+00     0.0e+00    OK    
plasma energy (all)           [70 elem]        [70 elem]        0.0e+00    OK    
vacuum energy (all)           [70 elem]        [70 elem]        0.0e+00    OK    
total energy (all)            [70 elem]        [70 elem]        0.0e+00    OK    
ODE steps (saved)             56               56               0.0e+00    OK    
ODE steps (total)             1044             1044             0.0e+00    OK    
q0                            1.900006e+00     1.900006e+00     0.0e+00    OK    
q95                           3.147422e+00     3.147422e+00     0.0e+00    OK    
# singular surfaces           3                3                0.0e+00    OK    
singular psi locations        [3 elem]         [3 elem]         0.0e+00    OK    
mpert                         35               35               0.0e+00    OK    
npert                         2                2                0.0e+00    OK    
q profile (checksum)          2340b888d410...  2340b888d410...  identical  OK    
Runtime (s)                   204.8s           204.4s                      --    
=================================================================================
Summary: 15 unchanged


================================================================
Case: solovev_n1 — Solovev analytical equilibrium, n=1, ideal stability
================================================================

Regression Report: solovev_n1
=================================================================================
Ref 1: 7817f0e7a  @ 7817f0e7a (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
Ref 2: 5828895a0  @ 5828895a0 (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
---------------------------------------------------------------------------------
Quantity                      7817f0e7a        5828895a0        Diff       Status
---------------------------------------------------------------------------------
total energy Re(et[1])        1.090560e-02     1.090560e-02     0.0e+00    OK    
total energy Im(et[1])        1.350301e-10     1.350301e-10     0.0e+00    OK    
plasma energy Re(ep[1])       -1.041640e+01    -1.041640e+01    0.0e+00    OK    
vacuum energy Re(ev[1])       1.042730e+01     1.042730e+01     0.0e+00    OK    
vacuum matrix min eigenvalue  2.170703e+00     2.170703e+00     0.0e+00    OK    
plasma energy (all)           [32 elem]        [32 elem]        0.0e+00    OK    
vacuum energy (all)           [32 elem]        [32 elem]        0.0e+00    OK    
total energy (all)            [32 elem]        [32 elem]        0.0e+00    OK    
ODE steps (saved)             287              287              0.0e+00    OK    
ODE steps (total)             285              285              0.0e+00    OK    
q0                            1.900006e+00     1.900006e+00     0.0e+00    OK    
q95                           3.147422e+00     3.147422e+00     0.0e+00    OK    
beta_t                        4.621027e-02     4.621027e-02     0.0e+00    OK    
beta_n                        3.217775e+00     3.217775e+00     0.0e+00    OK    
# singular surfaces           2                2                0.0e+00    OK    
singular psi locations        [2 elem]         [2 elem]         0.0e+00    OK    
singular q values             [2 elem]         [2 elem]         0.0e+00    OK    
mpert                         32               32               0.0e+00    OK    
npert                         1                1                0.0e+00    OK    
q profile (checksum)          2340b888d410...  2340b888d410...  identical  OK    
pressure profile (checksum)   108b947087e6...  108b947087e6...  identical  OK    
ca_left (checksum)            b7a5bbc5f549...  b7a5bbc5f549...  identical  OK    
Runtime (s)                   210.7s           207.5s                      --    
=================================================================================
Summary: 22 unchanged

Third-party human review and approval are required before merge.

@d-burg
d-burg marked this pull request as ready for review October 29, 2026 01:26
d-burg and others added 2 commits October 29, 2026 10:30
…-holomorphic SLAYER residual converges

SLAYER's solve_inner evaluates conj(Delta_hat(g)) by design (Schwarz reflection,
to keep the scan-plane contour orientation consistent), so the tearing residual
f(Q) = Delta' - S^(1/3) Delta(Q) - Delta_c is a function of conj(Q).
_polish_root modelled f with a complex secant slope, which assumes f is
holomorphic. On an anti-holomorphic f that step is the mirror image of the true
step: an offset along Im Q is doubled, every halving backtrack is also worse, and
the polish returns the unpolished point. The validity gate then rejects any root
whose raw contour intersection is not already accurate, which hits steep roots
first: on an ARC V3A 2/1 surface the least-damped root at the electron
diamagnetic frequency (gamma = -0.029 kHz) was discarded and a far root at
gamma = -13.5 kHz reported instead.

- Model f with the real 2x2 Jacobian of (Re f, Im f) in (Re Q, Im Q) from
  forward differences along both axes; exact for holomorphic and
  anti-holomorphic residuals. Trust region, backtracking and the
  improve-or-no-op contract are unchanged; one extra f evaluation per iteration.
- Tests: anti-holomorphic linear and steep nonlinear residuals, a root offset
  purely along Im Q (all fail with the complex-secant polish), and an
  extraction-level check that a steep anti-holomorphic root from a coarse scan
  passes the validity gate at the true zero.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…d test a residual that is neither holomorphic nor anti-holomorphic

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@matt-pharr
matt-pharr force-pushed the bugfix/slayer-polish-antianalytic branch from 5828895 to aac35ab Compare October 29, 2026 09:30

@matt-pharr matt-pharr left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The math looks good on my end

@matt-pharr
matt-pharr enabled stacked auto-merge October 29, 2026 11:13
stacked auto-merge was automatically disabled October 29, 2026 11:27

Auto-merge was disabled for another pull request in the stack

@matt-pharr
matt-pharr merged commit e192749 into develop Oct 29, 2026
8 of 9 checks passed
@matt-pharr
matt-pharr deleted the bugfix/slayer-polish-antianalytic branch October 29, 2026 12:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bugfix Something was wrong and now is not changed-results Results move or an interface breaks - read before upgrading

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants