Skip to content

ForceFreeStates - BUGFIX! - ⚠️ Remove the resonant solution at ideal crossings regardless of reduction timing - #489

Merged
d-burg merged 17 commits into
developfrom
bugfix/ffs-crossing-resonant-elimination
Oct 29, 2026
Merged

d-burg merged 17 commits into
developfrom
bugfix/ffs-crossing-resonant-elimination

Conversation

@d-burg

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

Copy link
Copy Markdown
Collaborator

Release note

  • Audience: users
  • Numerical impact: runs in which a Gaussian reduction fires a step or two before an ideal rational-surface crossing are now correct; on the coarse Solovev n = 1 test deck at renorm_threshold = 5, et[1] went from 13.74 to 16.4037, its value at the default renorm_threshold (Apple Silicon, develop 6fc89d021). The shipped decks move little: Solovev n = 1 et[1] moves by 1.153e-8 absolute (1.06e-6 relative); DIII-D-like headline energies move by up to 1.710e-8 absolute; saved ODE step counts move by up to 0.32%; some kinetic/error-field quantities move by approximately 0.02%. (harness @ a319ed2)
  • Migration: no deck changes. Runs in which a Gaussian reduction fired just before an ideal rational-surface crossing gave wrong free-boundary energies and should be rerun.

In the standard ForceFreeStates (FFS) integration, an ideal rational-surface crossing could remove the wrong solution when a Gaussian reduction had just fired. It did so silently, and the free-boundary energies came out arbitrarily wrong. The crossing now always removes the resonant solution.

Regression report

Latest SDCC fanout rerun (2026-10-28): develop 057c4af0d vs a319ed295 — 21 cases; seven cases have numerical changes; no run failures. Full report and limitations. This comparison also includes the existing gal_resistive_pe case with all quantities missing. Earlier reports are retained below.

Full SDCC fanout run on 2026-10-28: regress_fanout.sh --refs 057c4af0dd3c3a834140fad4645b995552944a56,a319ed2955ed3603a75bf074a4a66e4b201d5e46 --name pr489_a319ed2. Baseline: develop 057c4af0d; tested head: a319ed295. All 21 cases ran on sirius with Julia 1.12.6 and CI manifest pin 4c9d54fa. Cases used 2 Julia threads / 1 BLAS thread, except diiid_error_field at 16 / 8; sizing matched between refs. All 42 tasks and report job 1298694 completed with exit code zero.

  • 13 cases unchanged, including both Riccati builds, all three SLAYER cases, both extracted Galerkin cases, both GGJ cases, fixed-boundary EFIT, calculated/collisionless kinetic cases and Solovev multi-n.
  • 7 cases changed: solovev_n1, diiid_n1, diiid_multi_n, diiid_truncation_n1, solovev_kinetic_multiion, solovev_kinetic_ntv, diiid_error_field.
  • Solovev n = 1: et[1] changes by 1.153e-8 absolute (about 1.06e-6 relative), also seen in the ideal-path kinetic diagnostics.
  • DIII-D-like: n = 1 et[1] changes by 3.686e-9 absolute; multi-n by 1.570e-9; truncation-case et[1] by 1.241e-8. Saved ODE steps change by +1 for n = 1 and -2 for multi-n (0.13% and 0.32%). Some kinetic/error-field quantities change by approximately 0.02%.
  • gal_resistive_pe: all eight quantities are missing on both refs, as in the previous report; this case provides no numerical validation.

The targeted unit/full-run test results documented below are historical results, not reruns at this merge head. Current validation is the full regression harness above.

Full SDCC 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: 057c4af0d  @ 057c4af0d (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 16 threads/8 BLAS, jit build
Ref 2: a319ed295  @ a319ed295 (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 16 threads/8 BLAS, jit build
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
Quantity  057c4af0d  a319ed295  Diff  Status       
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
EFC overlap per kAt  [1 elem]  [1 elem]  4.211e-10 (0.00%)  ** CHANGED **
EFC whole-field NTV torque per kAt² [N·m]  [1 elem]  [1 elem]  5.865e-08 (0.00%)  ** CHANGED **
EFC residual-field NTV torque per kAt² [N·m]     [1 elem]  [1 elem]  2.976e-07 (0.01%)  ** CHANGED **
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]  9.940e-07 (0.02%)  ** CHANGED **
dominant-coupling singular values  [3 elem]  [3 elem]  1.751e-04 (0.01%)  ** CHANGED **
|delta_nominal| of coil set 1  1.406930e-06  1.406896e-06  3.4e-11  OK  
|Σ δ_as_designed| of the error-field coils       1.358875e-18  1.359053e-18  1.8e-22  OK  
Monte Carlo mean |δ| of the error-field coils    4.701300e-05  4.701298e-05  2.8e-11  OK  
Runtime (s)  258.6s  248.7s  --  
=====================================================================================================================================================================
Summary: 5 changed, 5 unchanged


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

Regression Report: diiid_multi_n
==================================================================================================================================================================================
Ref 1: 057c4af0d  @ 057c4af0d (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
Ref 2: a319ed295  @ a319ed295 (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Quantity  057c4af0d  a319ed295  Diff  Status       
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
total energy Re(et[1])  -5.750527e-01  -5.750527e-01  1.570e-09 (0.00%)  ** CHANGED **
total energy (all)  [58 elem]  [58 elem]  1.294e-06 (0.00%)  ** CHANGED **
ODE steps (saved)  628  626  2.000e+00 (0.32%)  ** CHANGED **
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]  1.594e-07 (0.00%)  ** CHANGED **
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]  2.8e-12  OK  
PE plasma energy (sum over n)  2.936559e+00  2.936559e+00  4.422e-10 (0.00%)  ** CHANGED **
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  1.145e-09 (0.00%)  ** CHANGED **
PE toroidal torque sum_n -2n Im(Phi_n' Lambda_nn^-1 Phi_n)/4  1.820337e-06  1.820338e-06  6.5e-13  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]  6.0e-09  OK  
island half-widths per row  [7 elem]  [7 elem]  1.299e-06 (0.01%)  ** CHANGED **
Chirikov parameter per row  [7 elem]  [7 elem]  1.753e-05 (0.00%)  ** CHANGED **
forcing-driven Delta' per row  [7 elem]  [7 elem]  3.796e-07 (0.01%)  ** CHANGED **
Runtime (s)  195.2s  197.5s  --  
==================================================================================================================================================================================
Summary: 9 changed, 10 unchanged


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

Regression Report: diiid_n1
==================================================================================================================================================================
Ref 1: 057c4af0d  @ 057c4af0d (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
Ref 2: a319ed295  @ a319ed295 (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
------------------------------------------------------------------------------------------------------------------------------------------------------------------
Quantity  057c4af0d  a319ed295  Diff  Status       
------------------------------------------------------------------------------------------------------------------------------------------------------------------
total energy Re(et[1])  8.006122e-01  8.006122e-01  3.686e-09 (0.00%)  ** CHANGED **
total energy Im(et[1])  7.924882e-05  7.924882e-05  2.5e-12  OK  
plasma energy Re(ep[1])  -1.372261e+00  -1.372261e+00  6.509e-09 (0.00%)  ** CHANGED **
vacuum energy Re(ev[1])  2.172874e+00  2.172874e+00  2.823e-09 (0.00%)  ** CHANGED **
vacuum matrix min eigenvalue  1.873975e-01  1.873975e-01  0.0e+00  OK  
plasma energy (all)  [35 elem]  [35 elem]  1.032e-06 (0.00%)  ** CHANGED **
vacuum energy (all)  [35 elem]  [35 elem]  4.088e-07 (0.00%)  ** CHANGED **
total energy (all)  [35 elem]  [35 elem]  1.055e-06 (0.00%)  ** CHANGED **
ODE steps (saved)  788  789  1.000e+00 (0.13%)  ** CHANGED **
ODE steps (total)  783  784  1.000e+00 (0.13%)  ** CHANGED **
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]  1.746e-06 (0.01%)  ** CHANGED **
Chirikov parameter  [5 elem]  [5 elem]  4.512e-05 (0.01%)  ** CHANGED **
||resonant area-weighted field||  5.288412e-04  5.288611e-04  1.988e-08 (0.00%)  ** CHANGED **
dominant-coupling singular values  [3 elem]  [3 elem]  1.751e-04 (0.01%)  ** CHANGED **
|forcing overlap with dominant mode|  1.411553e-04  1.411520e-04  3.4e-09  OK  
|delta_nominal| of coil set 1  7.034649e-05  7.034480e-05  1.685e-09 (0.00%)  ** CHANGED **
||ddelta/d(shift)|| over coil sets  1.245448e-04  1.245436e-04  1.194e-09 (0.00%)  ** CHANGED **
||ddelta/d(tilt)|| over coil sets  4.177341e-07  4.177322e-07  1.9e-12  OK  
PE plasma energy  3.320466e+00  3.320466e+00  6.898e-10 (0.00%)  ** CHANGED **
PE vacuum energy  3.174319e+00  3.174319e+00  0.0e+00  OK  
PE surface energy  5.508585e+00  5.508585e+00  1.459e-08 (0.00%)  ** CHANGED **
PE toroidal torque  1.119354e-04  1.119354e-04  2.614e-12 (0.00%)  ** CHANGED **
NTV torque FGAR [N·m]  5.480614e-01  5.480624e-01  9.4e-07  OK  
NTV kinetic energy dW FGAR [J]  8.163291e-02  8.163328e-02  3.7e-07  OK  
Runtime (s)  226.0s  230.0s  --  
||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]  3.246e-08 (0.01%)  ** CHANGED **
==================================================================================================================================================================
Summary: 18 changed, 35 unchanged


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

Regression Report: diiid_n1_riccati
==================================================================================================================================
Ref 1: 057c4af0d  @ 057c4af0d (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
Ref 2: a319ed295  @ a319ed295 (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
----------------------------------------------------------------------------------------------------------------------------------
Quantity  057c4af0d  a319ed295  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)  185.7s  189.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: 057c4af0d  @ 057c4af0d (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, aot build
Ref 2: a319ed295  @ a319ed295 (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, aot build
----------------------------------------------------------------------------------------------------------------------------------
Quantity  057c4af0d  a319ed295  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.4s  25.2s  --    
==================================================================================================================================
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: 057c4af0d  @ 057c4af0d (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
Ref 2: a319ed295  @ a319ed295 (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
---------------------------------------------------------------------------------------------------------------------------------------
Quantity  057c4af0d  a319ed295  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]  0.0e+00  OK    
SLAYER ω_Hz [2/1,3/1,4/1]  [3 elem]  [3 elem]  0.0e+00  OK    
SLAYER γ_Hz [2/1,3/1,4/1]  [3 elem]  [3 elem]  0.0e+00  OK    
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)  216.2s  218.3s  --    
=======================================================================================================================================
Summary: 17 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: 057c4af0d  @ 057c4af0d (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
Ref 2: a319ed295  @ a319ed295 (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
---------------------------------------------------------------------------------------------------------------------------------------
Quantity  057c4af0d  a319ed295  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]  0.0e+00  OK    
SLAYER ω_Hz [2/1,3/1,4/1]  [3 elem]  [3 elem]  0.0e+00  OK    
SLAYER γ_Hz [2/1,3/1,4/1]  [3 elem]  [3 elem]  0.0e+00  OK    
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)  214.1s  217.5s  --    
=======================================================================================================================================
Summary: 17 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: 057c4af0d  @ 057c4af0d (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
Ref 2: a319ed295  @ a319ed295 (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
--------------------------------------------------------------------------------------------------------------------------------
Quantity  057c4af0d  a319ed295  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)  216.9s  219.5s  --    
================================================================================================================================
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: 057c4af0d  @ 057c4af0d (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
Ref 2: a319ed295  @ a319ed295 (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
-----------------------------------------------------------------------------------------------------------------------------------------------------------
Quantity  057c4af0d  a319ed295  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  1.710e-08 (0.00%)  ** CHANGED **
total energy Re(et[1])  8.005437e-01  8.005436e-01  1.241e-08 (0.00%)  ** CHANGED **
Runtime (s)  175.9s  180.4s  --  
===========================================================================================================================================================
Summary: 2 changed, 10 unchanged


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

Regression Report: efit_fixedbdy_separatrix
===============================================================================================================================
Ref 1: 057c4af0d  @ 057c4af0d (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
Ref 2: a319ed295  @ a319ed295 (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
-------------------------------------------------------------------------------------------------------------------------------
Quantity  057c4af0d  a319ed295  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)  45.9s  46.6s  --    
===============================================================================================================================
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: 057c4af0d  @ 057c4af0d (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
Ref 2: a319ed295  @ a319ed295 (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
----------------------------------------------------------------------------------------------------------------------------
Quantity  057c4af0d  a319ed295  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)  176.2s  178.0s  --    
============================================================================================================================
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: 057c4af0d  @ 057c4af0d (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
Ref 2: a319ed295  @ a319ed295 (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
----------------------------------------------------------------------------------------------------------------------------
Quantity  057c4af0d  a319ed295  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)  177.1s  176.5s  --    
============================================================================================================================
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: 057c4af0d  @ 057c4af0d (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
Ref 2: a319ed295  @ a319ed295 (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
------------------------------------------------------------------------------------------------------------------------
Quantity  057c4af0d  a319ed295  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)  180.1s  178.0s  --    
========================================================================================================================
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: 057c4af0d  @ 057c4af0d (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
Ref 2: a319ed295  @ a319ed295 (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
-----------------------------------------------------------------------------------------------------------------------
Quantity  057c4af0d  a319ed295  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)  21.1s  21.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: 057c4af0d  @ 057c4af0d (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
Ref 2: a319ed295  @ a319ed295 (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
-----------------------------------------------------------------------------------------------------------------------
Quantity  057c4af0d  a319ed295  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.4s  9.8s  --    
=======================================================================================================================
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: 057c4af0d  @ 057c4af0d (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
Ref 2: a319ed295  @ a319ed295 (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
--------------------------------------------------------------------------------------------------------------------------------------
Quantity  057c4af0d  a319ed295  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)  217.7s  222.9s  --    
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: 057c4af0d  @ 057c4af0d (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
Ref 2: a319ed295  @ a319ed295 (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
-------------------------------------------------------------------------------------------------------------------------------------------------
Quantity  057c4af0d  a319ed295  Diff  Status       
-------------------------------------------------------------------------------------------------------------------------------------------------
NTV total (D+T+imp+e) [N·m]  3.141767e+01  3.141935e+01  1.681e-03 (0.01%)  ** CHANGED **
NTV Deuterium [N·m]  1.973730e+01  1.973825e+01  9.476e-04 (0.00%)  ** CHANGED **
NTV Tritium [N·m]  2.046293e+01  2.046391e+01  9.804e-04 (0.00%)  ** CHANGED **
NTV electron [N·m]  -8.782557e+00  -8.782805e+00  2.475e-04 (0.00%)  ** CHANGED **
total energy Re(et[1])       1.090560e-02  1.090559e-02  1.153e-08 (0.00%)  ** CHANGED **
# singular surfaces  2  2  0.0e+00  OK  
Runtime (s)  218.8s  217.5s  --  
=================================================================================================================================================
Summary: 5 changed, 1 unchanged


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

Regression Report: solovev_kinetic_ntv
===============================================================================================================================================================
Ref 1: 057c4af0d  @ 057c4af0d (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
Ref 2: a319ed295  @ a319ed295 (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
---------------------------------------------------------------------------------------------------------------------------------------------------------------
Quantity  057c4af0d  a319ed295  Diff  Status       
---------------------------------------------------------------------------------------------------------------------------------------------------------------
NTV torque fgar [Re, Im]  [1 elem]  [1 elem]  1.895e-03 (0.00%)  ** CHANGED **
NTV ψ quadrature evaluations  45  45  0.0e+00  OK  
fluid CGL energy fcgl [J]  1.552303e+01  1.552025e+01  2.778e-03 (0.02%)  ** CHANGED **
root-area-weighted total energy Re(et[1])  1.090560e-02  1.090559e-02  1.153e-08 (0.00%)  ** CHANGED **
# 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.7s  219.7s  --  
===============================================================================================================================================================
Summary: 3 changed, 4 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: 057c4af0d  @ 057c4af0d (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
Ref 2: a319ed295  @ a319ed295 (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
----------------------------------------------------------------------------------------------------------------------------
Quantity  057c4af0d  a319ed295  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)  230.0s  228.9s  --    
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: 057c4af0d  @ 057c4af0d (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
Ref 2: a319ed295  @ a319ed295 (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
-----------------------------------------------------------------------------------------------------------------------------------
Quantity  057c4af0d  a319ed295  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)  196.7s  196.7s  --    
===================================================================================================================================
Summary: 15 unchanged


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

Regression Report: solovev_n1
==================================================================================================================================================
Ref 1: 057c4af0d  @ 057c4af0d (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
Ref 2: a319ed295  @ a319ed295 (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
--------------------------------------------------------------------------------------------------------------------------------------------------
Quantity  057c4af0d  a319ed295  Diff  Status       
--------------------------------------------------------------------------------------------------------------------------------------------------
total energy Re(et[1])  1.090560e-02  1.090559e-02  1.153e-08 (0.00%)  ** CHANGED **
total energy Im(et[1])  1.350301e-10  1.446796e-10  9.6e-12  OK  
plasma energy Re(ep[1])       -1.041640e+01  -1.041640e+01  3.614e-08 (0.00%)  ** CHANGED **
vacuum energy Re(ev[1])       1.042730e+01  1.042730e+01  2.461e-08 (0.00%)  ** CHANGED **
vacuum matrix min eigenvalue  2.170703e+00  2.170703e+00  0.0e+00  OK  
plasma energy (all)  [32 elem]  [32 elem]  2.364e-05 (0.00%)  ** CHANGED **
vacuum energy (all)  [32 elem]  [32 elem]  5.320e-06 (0.00%)  ** CHANGED **
total energy (all)  [32 elem]  [32 elem]  2.344e-05 (0.00%)  ** CHANGED **
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...  fc761aba9205...  0.000e+00 (0.00%)  ** CHANGED **
Runtime (s)  200.2s  199.8s  --  
==================================================================================================================================================
Summary: 7 changed, 15 unchanged

What was wrong

At a crossing, cross_ideal_singular_surf! reduces the solution columns and then zeroes the one it takes to be the large resonant solution. The reduction orders columns by their growth since the previous reduction (unorm ./ unorm0) and zeroes the first.

That order carries no information when a renorm_threshold reduction fired only a few steps earlier: every column has grown by about 1. The lead column's pivot then lands on an arbitrary harmonic, and the crossing removes a non-resonant solution. A crossing on the very step after a reduction was worse: compute_solution_norms! skipped the crossing's reduction altogether, and the crossing zeroed a column chosen by the previous reduction's ordering.

On develop as of 97bd878d3 (before #480), Solovev n = 1 with renorm_threshold = 2–5 hits this for most tolerances. Examples (reference et[1] = 0.6773399618, from Vern9 at reltol 1e-12, abstol 1e-14):

renorm_threshold tolerance develop et[1] column zeroed at q = 2 / q = 3 this PR
2 1e-10 −30.75 m = −8 / m = 0 0.6773399618
2 1.2e-10 3.363 m = −10 / m = 2 0.6773399622
3 1e-9 1.013 m = 2 / m = −6 0.6773399623
5 1e-8 −0.657 m = 2 / m = −12 0.6773399701
5 1.4e-10 −1.310 m = −12 / m = 1 0.6773399619

Every correct run zeroes m = 2 at q = 2 and m = 3 at q = 3. Across all 18 develop-failing configurations (renorm_threshold ∈ {2, 3, 5} at six tolerances from 1e-7 to 1.4e-10), this PR gives et[1] within 1.8e-7 of the reference at tolerance 1e-7, and within 7.5e-10 at 1e-9 and tighter. At the deck values of renorm_threshold (1e3 and 1e4) reductions are rare enough that this was seldom hit, but nothing prevented it.

The fix

  • cross_ideal_singular_surf!: computes the resonant rows before its reduction, and passes them in as resonant_rows.
  • compute_solution_norms!: with resonant_rows, always reduces, including right after a renorm_threshold reduction.
  • apply_gaussian_reduction!:
    • takes the resonant rows as its first pivots, each on the free column with the largest component on that row, so that column alone keeps the resonant harmonic;
    • the remaining columns keep the growth order.
  • Zeroing: the crossing zeroes exactly those lead columns, and zeroed_idx records their positions (1:nres) for transform_u! as before. The kinetic_factor == 0 guards in the ideal crossing are removed: that function is only reached on the ideal branch.
  • Multi-n: each lead column lies in the n-block of its resonance, so the block structure the old findfirst preserved is kept.
  • Unchanged: kinetic crossings and renorm_threshold reductions are unchanged. The Riccati path has its own crossing, which zeroes by ipert_res directly; its harness case is bit-identical.

Tests

  • test/runtests_eulerlagrange.jl, new testset "ideal-crossing reduction isolates the resonant harmonic": a 3 × 3 case in which the resonant component is not in the largest column. It checks three things:

    • that the reduction leads with and pivots on the resonant column, leaving the resonant row zero in every other column;
    • that it still does so right after a reduction;
    • that the growth-ordered reduction is unchanged without resonant rows.

    The file passes 126/126 and 26/26.

  • test/runtests_fullruns.jl, new testset "et[1] is independent of the reduction frequency": the coarse Solovev test deck at renorm_threshold = 2, 3, 5 and 10 must give the same et[1] as at its default renorm_threshold = 1e3, to rtol = 1e-6.

    • On this branch the four agree to ≤ 1.4e-9 relative.
    • On develop 6fc89d021 (Apple Silicon) two of the four fail: 13.74 at renorm_threshold = 5 and 16.397 at renorm_threshold = 10, against 16.4037. Which values fail on develop depends on where the steps land, so it can differ by platform.
    • This replaces the solovev_n1_frequent_reduction harness case from the first version of this PR.

Changes since the first review

Notes for reviewers


🤖 Generated with Claude Code

d-burg and others added 2 commits September 28, 2026 11:21
…sings regardless of reduction timing

At an ideal rational-surface crossing the Gaussian reduction ordered columns by growth since
the previous reduction and the crossing zeroed the first one. When a ucrit reduction had fired
a few steps earlier every column had grown alike, the order was arbitrary, the lead column's
pivot fell on a non-resonant harmonic, and the crossing removed the wrong solution. A crossing
that landed on the step right after a reduction skipped its own reduction and zeroed a column
chosen from the previous one.

The ideal crossing now always reduces, leads with the column carrying the most of each
resonant harmonic, and pivots it on the resonant row, so that column alone holds the resonant
component and is the one zeroed. Kinetic crossings and ucrit reductions are unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… rational-surface crossings

ucrit = 2 at eulerlagrange_tolerance 1e-10 makes a ucrit reduction fire two steps before the
q = 2 crossing, which on develop leaves the crossing removing a non-resonant solution.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@jhalpern30

Copy link
Copy Markdown
Collaborator

@d-burg I actually remember what I think is this exact same bug come up in the process of identifying #480. During that, it seemed that this issue had disappeared when using the column wise absolute tolerance. Can you confirm if these results are with that change included, and if not, can you quote the combination of the two fixes and if they are both necessary?

@d-burg

d-burg commented Oct 2, 2026 •

Copy link
Copy Markdown
Collaborator Author

@jhalpern30 my claude answers: the main table in the body is on develop, without the column tolerance. I also ran your #480 head (3d6acd813) and #480 with this branch merged in. Same deck (Solovev n = 1), same reference; a run counts as wrong when et[1] is off by more than 1e-5:

runs with a wrong et[1] develop #480 this PR #480 + this PR
ucrit = 2, 3, 5 (18 runs) 12 8 0 0
ucrit = 10 (9 runs) 0 6 not run 0
ucrit = 1e2 (9 runs) 0 0 not run 0

So the column tolerance does not remove it. Every wrong run on #480 still zeroes a non-resonant column at a crossing (m = −10, 12, −6, 17, …). At ucrit = 10, #480 fails where develop does not, most likely because it takes about half the steps, so a reduction lands a step or two before a crossing more often. That may be why it looked fixed: it depends on where the steps land, so it comes and goes with tolerance and step count.

The two fixes do different jobs. #480 controls the error of the small columns; this PR makes the crossing remove the resonant solution whatever the reduction timing. Both are needed, and this branch merges onto #480 without conflicts.

To reproduce on your branch: the new solovev_n1_frequent_reduction harness case (ucrit = 2, tolerance 1e-10) gives et[1] = 1.013 on #480, against 0.67734.

@jhalpern30

Copy link
Copy Markdown
Collaborator

Cool thanks, I'll give this a review at some point in the near future

…tity

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@d-burg d-burg changed the title ForceFreeStates - BUGFIX - Remove the resonant solution at ideal crossings regardless of reduction timing ForceFreeStates - BUGFIX - ⚠️ Remove the resonant solution at ideal crossings regardless of reduction timing Oct 5, 2026

@jhalpern30 jhalpern30 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.

Take what you like, most of my recommendations are for clarity in a section that I think is already confusing and this adds even more logic too.

I'll note that I've found even more bugs in our singular crossing logic and will be documenting them in #481 for further input.

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.

I am not a fan of our overpopulation of regression harnesses. Is this not a bugfix that can get a targeted unit test for expected behavior? Its a rather niche thing to get an entire regression case, and no one is realistically running with urit = 2 anyway. Is there something covered here that isn't touched by the unit tests below?

Comment thread src/ForceFreeStates/EulerLagrange.jl Outdated

# Fixup solution at singular surface; the ideal jump reduces on the resonant rows so the
# solution it removes below is the resonant one
compute_solution_norms!(odet.u, odet, ctrl, intr, true; resonant_rows=(ctrl.kinetic_factor == 0 ? ipert_res : Int[]))

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.

This is an ideal crossing - I don't think kinetic factor can ever be nonzero here

Comment thread src/ForceFreeStates/EulerLagrange.jl Outdated
# The reduction above placed the column pivoted on ipert_res[i] at index position i, which also
# keeps each zeroed column in the same n-block as the resonant mode introduced below; zeroed_idx
# records the positions for transforming u back to the full solution after integration.
if ctrl.kinetic_factor == 0

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.

This wasn't changed in this function (and maybe is why the above expression has it too), but I think the same logic applies - this crossing is only called when kinetic factor is > 0.

Comment thread src/ForceFreeStates/EulerLagrange.jl Outdated

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.

Same here- I think remove unless you can see a reason to keep

compute_solution_norms!(odet.u, odet, ctrl, intr, true)
singp = intr.sing[ising]
ipert_res = 1 .+ singp.m .- intr.mlow .+ (singp.n .- intr.nlow) .* intr.mpert

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.

For clarity/concistency, maybe define

nres = length(ipert_res)

here, and then use for loop bounds below?

Comment thread src/ForceFreeStates/EulerLagrange.jl Outdated

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.

Claude says with your changes, this could be reduced to

odet.u[:, odet.index[i, odet.ifix], :] .= ua[:, ipert_res[i]+intr.numpert_total, :]

with the loop for i in 1:nres

Comment thread src/ForceFreeStates/EulerLagrange.jl Outdated

- u: Current solution vector array, updated in-place if fixfac is called
- sing_flag: Indicates if normalization is occuring at a singular surface or not
- resonant_rows: Rows of the resonant harmonics at an ideal crossing. When given, the reduction

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.

"resonant_rows: Resonant rows at an ideal crossing; when given, the reduction always runs and pivots on them." is shorter and gets the same point across

Comment thread src/ForceFreeStates/EulerLagrange.jl Outdated

# Normalize unorm and perform Gaussian reduction if required
if odet.new
if odet.new && isempty(resonant_rows)

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.

Completely up to you on this, but I had to read it a few times to understand the control flow here. An option I think is a bit more clear:

# The first call after a reduction records the reference norms; an ideal crossing reduces regardless
at_ideal_crossing = !isempty(resonant_rows)
if odet.new && !at_ideal_crossing
    odet.new = false
    odet.unorm0 .= odet.unorm
    return
end

# Growth since the last reduction (raw norms if a crossing comes right after one), then reduce if required
if !odet.new
    odet.unorm ./= odet.unorm0
end
uratio = maximum(odet.unorm) / minimum(odet.unorm)

# Perform Gaussian reduction if ucrit ratio is reached or at singular surface
if uratio > ctrl.ucrit || sing_flag
    # …
    apply_gaussian_reduction!(u, odet, intr, sing_flag; resonant_rows)
    odet.new = true
end

Comment thread src/ForceFreeStates/EulerLagrange.jl Outdated
description of `compute_solution_norms!` for more details on the benefits of in-place `u`
updates.

Columns are triangularized in order of their growth since the last reduction. At an ideal

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.

Shorter option: "At an ideal crossing, the first pivots are the resonant_rows, each on the remaining column largest there. Growth order cannot pick the resonant solution if a ucrit reduction fired just before the crossing, since every column has then grown alike."

Comment thread src/ForceFreeStates/EulerLagrange.jl Outdated
end
# Sort unorm in descending order (since we triangularize from largest to smallest)
odet.index[:, ifix] = sortperm(odet.unorm; rev=true)
# Resonant columns first, then the rest in descending unorm (we triangularize from largest to smallest)

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.

Claude's suggested cleanup for this section that I actually kinda like:

# Triangularize primary solutions, resonant rows first, then columns from largest to smallest growth
growth_order = sortperm(odet.unorm; rev=true)
row_free = trues(intr.numpert_total)
col_free = trues(intr.numpert_total)
for isol in 1:intr.numpert_total
    if isol <= length(resonant_rows)
        kpert = resonant_rows[isol]
        ksol = argmax(j -> col_free[j] ? abs(u[kpert, j, 1]) : -Inf, 1:intr.numpert_total)
    else
        ksol = growth_order[findfirst(j -> col_free[j], growth_order)]
        @views kpert = argmax(abs.(u[:, ksol, 1]) .* row_free)
    end
    odet.index[isol, ifix] = ksol
    col_free[ksol] = false
    row_free[kpert] = false
    # Eliminate other solution vectors below the pivot
    for jsol in 1:intr.numpert_total
        if col_free[jsol]
            # … elimination body unchanged …

Note that some of it (i.e. renaming mask to row_free/col_free is outside the scope of your PR but can be done here if you agree with it). This fix put the resonant logic in the same loops and removes some of this complicated lead/filter logic

d-burg and others added 4 commits October 9, 2026 12:58
…deal crossings and flatten the reduction control flow

The ideal crossing is only reached with kinetic_factor = 0, so its guards never
took the other branch. Review suggestions; no change in behavior intended.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…duction loop

One loop picks each resonant row's column from the columns still free at that
step, then continues in growth order. Identical for a single resonant row; with
several, later resonant columns are chosen after the earlier eliminations.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…tion frequency in the full-run tests

Runs the coarse Solovev deck at ucrit = 2, 3, 5 and 10 against its default and
replaces the solovev_n1_frequent_reduction harness case.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@d-burg
d-burg marked this pull request as ready for review October 9, 2026 22:16
@d-burg

d-burg commented Oct 9, 2026

Copy link
Copy Markdown
Collaborator Author

@jhalpern30 thanks, all taken. Pushed as d309eeb, c9cb55d and 50130ba on a merge of current develop, and the body has the new regression report.

From claude: "Harness case: dropped. The end-to-end check is now in runtests_fullruns.jl: the coarse Solovev deck at ucrit = 2, 3, 5, 10 must give the same et[1] as its default (rtol 1e-6). On develop two of the four fail on my machine (13.74 and 16.397 against 16.4037); on this branch all agree to about 1e-9.
kinetic_factor guards: removed. You’re right, that function is only reached from the ideal branch.
nres, zeroed_idx, the OdeState docstring, both shorter docstrings, and the control flow in compute_solution_norms!: taken as suggested.
Single-loop pivot selection: taken, with row_free / col_free. With several resonant rows it picks the later resonant columns after the earlier eliminations, so I checked it separately: bit-identical to the previous version on solovev_n1, solovev_multi_n, diiid_n1 and diiid_multi_n.

One thing to look at in the new report: against current develop, solovev_n1 et[1] moves 3.8e-6 relative, where it moved 3.5e-9 against the September develop. The review edits contribute nothing to that, so it is the original fix on post-#480 develop, and it is the size of the scatter in #490."

@d-burg d-burg changed the title ForceFreeStates - BUGFIX - ⚠️ Remove the resonant solution at ideal crossings regardless of reduction timing ForceFreeStates - BUGFIX! - ⚠️ Remove the resonant solution at ideal crossings regardless of reduction timing Oct 9, 2026
@github-actions github-actions Bot added the changed-results Results move or an interface breaks - read before upgrading label Oct 9, 2026
@jhalpern30

Copy link
Copy Markdown
Collaborator

From claude: "Harness case: dropped. The end-to-end check is now in runtests_fullruns.jl: the coarse Solovev deck at ucrit = 2, 3, 5, 10 must give the same et[1] as its default (rtol 1e-6). On develop two of the four fail on my machine (13.74 and 16.397 against 16.4037); on this branch all agree to about 1e-9.

I mean I guess, but this still feels like not a good fix. We really need 4 full runthroughs of the code in the unit tests suite to test a relatively niche behavior? Up to you if you think its worth it to change it but I'm not a fan

@d-burg

d-burg commented Oct 16, 2026

Copy link
Copy Markdown
Collaborator Author

@jhalpern30 The testset costs about 6 s in CI (five coarse Solovev runs, 23:34:15 → 23:34:21 on the last 1.11 job), and it is the only check that fails on develop for this bug; #520 keeps it with its own ucrit ladder, so it will carry over. I'd keep it, but I can cut it to two values if you prefer.

Before this merges I'll bring in current develop (#503 moves the vacuum results, so the report needs rerunning). Once that's pushed, could you re-approve the head? Your approval is on d3de61ca5, from before the review fixes.

@matt-pharr
matt-pharr added this pull request to stack #545 October 20, 2026 08:53
Carries the TOML rename of ucrit to renorm_threshold into the crossing-reduction logic and
its tests.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@logan-nc

Copy link
Copy Markdown
Collaborator

@d-burg @jhalpern30 — can we wrap this up by next week? It's an approved ! correctness fix, so it's cheap to land before v2.0 (due 11-02).

What's left:

  • @d-burg: merge current develop (it conflicts now) and redo the regression report, as you planned on 10-16. That should also clear the failing "Title and release note" check.
  • @jhalpern30: take a quick look after the update to confirm your approval still holds, and say whether any of your optional suggestions should go in first.

This should land before #520, since #520 keeps this PR's ucrit test.

@d-burg
d-burg requested a review from jhalpern30 October 23, 2026 18:00
@d-burg

d-burg commented Oct 23, 2026

Copy link
Copy Markdown
Collaborator Author

Merged develop (2f436c897) and redid the report; the description is updated. @jhalpern30 could you confirm your approval still holds?

@jhalpern30

Copy link
Copy Markdown
Collaborator

Sure, go ahead and merge

d-burg and others added 2 commits October 26, 2026 14:38
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@matt-pharr matt-pharr added this to the GPEC v2.0.0 milestone Oct 27, 2026
@matt-pharr

Copy link
Copy Markdown
Collaborator

@d-burg is this waiting on anything?

@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.

Changing this to approved on behalf of Jake's comment

@matt-pharr

Copy link
Copy Markdown
Collaborator

@d-burg — completed the requested full SDCC fanout comparison against develop 057c4af0d, testing PR head a319ed295 on 2026-10-28.

Result: seven cases have changed quantities; harness exit code 0 (no run failures).

  • 13 cases are entirely unchanged, including both Riccati builds, all three SLAYER cases, both extracted Galerkin cases, both GGJ cases, fixed-boundary EFIT, calculated/collisionless kinetic cases, and Solovev multi-n.
  • Changed cases: diiid_error_field, diiid_multi_n, diiid_n1, diiid_truncation_n1, solovev_kinetic_multiion, solovev_kinetic_ntv, and solovev_n1.
  • Solovev n=1 Re(et[1]) changes by 1.153e-8 absolute (about 1.06e-6 relative). DIII-D-like n=1 Re(et[1]) changes by 3.686e-9; multi-n by 1.570e-9; the truncation case by 1.241e-8. The full energy spectra also change; see the complete vectors' maximum differences in the report.
  • Saved ODE steps change by +1 for DIII-D-like n=1 and -2 for multi-n. Some kinetic/error-field quantities change by approximately 0.02%.
  • gal_resistive_pe: all eight quantities are missing on both refs. It supplies no numerical validation.

These are numerical differences, not an unchanged-results claim; their magnitudes agree with the changes already described in this PR's release note.

Environment: Julia 1.12.6, x86_64 Linux, CI manifest pin 4c9d54fa, partition sirius. There were 21 cases / 42 per-ref tasks. Each case used the same allocation at both refs: 2 Julia threads / 1 BLAS thread normally, and 16 / 8 for diiid_error_field. The precompiled Riccati case was compared in its precompiled build at both refs. Each PR head's own harness case definitions were used.

./regress_fanout.sh --refs 057c4af0d,a319ed295 --harness-ref a319ed295 --name pr489_a319ed295_vs_057c4af0d_20261028

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

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: 057c4af0d  @ 057c4af0d (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 16 threads/8 BLAS, jit build
Ref 2: a319ed295  @ a319ed295 (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 16 threads/8 BLAS, jit build
-------------------------------------------------------------------------------------------------------------
Quantity                                         057c4af0d     a319ed295     Diff               Status       
-------------------------------------------------------------------------------------------------------------
EFC overlap per kAt                              [1 elem]      [1 elem]      4.211e-10 (0.00%)  ** CHANGED **
EFC whole-field NTV torque per kAt² [N·m]        [1 elem]      [1 elem]      5.865e-08 (0.00%)  ** CHANGED **
EFC residual-field NTV torque per kAt² [N·m]     [1 elem]      [1 elem]      2.976e-07 (0.01%)  ** CHANGED **
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]      9.940e-07 (0.02%)  ** CHANGED **
dominant-coupling singular values                [3 elem]      [3 elem]      1.751e-04 (0.01%)  ** CHANGED **
|delta_nominal| of coil set 1                    1.406930e-06  1.406896e-06  3.4e-11            OK           
|Σ δ_as_designed| of the error-field coils       1.358875e-18  1.359053e-18  1.8e-22            OK           
Monte Carlo mean |δ| of the error-field coils    4.701300e-05  4.701298e-05  2.8e-11            OK           
Runtime (s)                                      265.3s        258.4s                           --           
=============================================================================================================
Summary: 5 changed, 5 unchanged


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

Regression Report: diiid_multi_n
================================================================================================================================
Ref 1: 057c4af0d  @ 057c4af0d (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
Ref 2: a319ed295  @ a319ed295 (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
--------------------------------------------------------------------------------------------------------------------------------
Quantity                                                      057c4af0d        a319ed295        Diff               Status       
--------------------------------------------------------------------------------------------------------------------------------
total energy Re(et[1])                                        -5.750527e-01    -5.750527e-01    1.570e-09 (0.00%)  ** CHANGED **
total energy (all)                                            [58 elem]        [58 elem]        1.294e-06 (0.00%)  ** CHANGED **
ODE steps (saved)                                             628              626              2.000e+00 (0.32%)  ** CHANGED **
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]        1.594e-07 (0.00%)  ** CHANGED **
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]        2.8e-12            OK           
PE plasma energy (sum over n)                                 2.936559e+00     2.936559e+00     4.422e-10 (0.00%)  ** CHANGED **
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     1.145e-09 (0.00%)  ** CHANGED **
PE toroidal torque sum_n -2n Im(Phi_n' Lambda_nn^-1 Phi_n)/4  1.820337e-06     1.820338e-06     6.5e-13            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]         6.0e-09            OK           
island half-widths per row                                    [7 elem]         [7 elem]         1.299e-06 (0.01%)  ** CHANGED **
Chirikov parameter per row                                    [7 elem]         [7 elem]         1.753e-05 (0.00%)  ** CHANGED **
forcing-driven Delta' per row                                 [7 elem]         [7 elem]         3.796e-07 (0.01%)  ** CHANGED **
Runtime (s)                                                   207.7s           204.9s                              --           
================================================================================================================================
Summary: 9 changed, 10 unchanged


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

Regression Report: diiid_n1
================================================================================================================
Ref 1: 057c4af0d  @ 057c4af0d (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
Ref 2: a319ed295  @ a319ed295 (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
----------------------------------------------------------------------------------------------------------------
Quantity                                      057c4af0d        a319ed295        Diff               Status       
----------------------------------------------------------------------------------------------------------------
total energy Re(et[1])                        8.006122e-01     8.006122e-01     3.686e-09 (0.00%)  ** CHANGED **
total energy Im(et[1])                        7.924882e-05     7.924882e-05     2.5e-12            OK           
plasma energy Re(ep[1])                       -1.372261e+00    -1.372261e+00    6.509e-09 (0.00%)  ** CHANGED **
vacuum energy Re(ev[1])                       2.172874e+00     2.172874e+00     2.823e-09 (0.00%)  ** CHANGED **
vacuum matrix min eigenvalue                  1.873975e-01     1.873975e-01     0.0e+00            OK           
plasma energy (all)                           [35 elem]        [35 elem]        1.032e-06 (0.00%)  ** CHANGED **
vacuum energy (all)                           [35 elem]        [35 elem]        4.088e-07 (0.00%)  ** CHANGED **
total energy (all)                            [35 elem]        [35 elem]        1.055e-06 (0.00%)  ** CHANGED **
ODE steps (saved)                             788              789              1.000e+00 (0.13%)  ** CHANGED **
ODE steps (total)                             783              784              1.000e+00 (0.13%)  ** CHANGED **
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]         1.746e-06 (0.01%)  ** CHANGED **
Chirikov parameter                            [5 elem]         [5 elem]         4.512e-05 (0.01%)  ** CHANGED **
||resonant area-weighted field||              5.288412e-04     5.288611e-04     1.988e-08 (0.00%)  ** CHANGED **
dominant-coupling singular values             [3 elem]         [3 elem]         1.751e-04 (0.01%)  ** CHANGED **
|forcing overlap with dominant mode|          1.411553e-04     1.411520e-04     3.4e-09            OK           
|delta_nominal| of coil set 1                 7.034649e-05     7.034480e-05     1.685e-09 (0.00%)  ** CHANGED **
||ddelta/d(shift)|| over coil sets            1.245448e-04     1.245436e-04     1.194e-09 (0.00%)  ** CHANGED **
||ddelta/d(tilt)|| over coil sets             4.177341e-07     4.177322e-07     1.9e-12            OK           
PE plasma energy                              3.320466e+00     3.320466e+00     6.898e-10 (0.00%)  ** CHANGED **
PE vacuum energy                              3.174319e+00     3.174319e+00     0.0e+00            OK           
PE surface energy                             5.508585e+00     5.508585e+00     1.459e-08 (0.00%)  ** CHANGED **
PE toroidal torque                            1.119354e-04     1.119354e-04     2.614e-12 (0.00%)  ** CHANGED **
NTV torque FGAR [N·m]                         5.480614e-01     5.480624e-01     9.4e-07            OK           
NTV kinetic energy dW FGAR [J]                8.163291e-02     8.163328e-02     3.7e-07            OK           
Runtime (s)                                   244.3s           243.6s                              --           
||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]         3.246e-08 (0.01%)  ** CHANGED **
================================================================================================================
Summary: 18 changed, 35 unchanged


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

Regression Report: diiid_n1_riccati
============================================================================
Ref 1: 057c4af0d  @ 057c4af0d (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
Ref 2: a319ed295  @ a319ed295 (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
----------------------------------------------------------------------------
Quantity                       057c4af0d      a319ed295      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)                    202.5s         202.6s                  --    
============================================================================
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: 057c4af0d  @ 057c4af0d (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, aot build
Ref 2: a319ed295  @ a319ed295 (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, aot build
----------------------------------------------------------------------------
Quantity                       057c4af0d      a319ed295      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.5s          25.5s                   --    
============================================================================
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: 057c4af0d  @ 057c4af0d (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
Ref 2: a319ed295  @ a319ed295 (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
-------------------------------------------------------------------------
Quantity                            057c4af0d  a319ed295  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]   0.0e+00  OK    
SLAYER ω_Hz [2/1,3/1,4/1]           [3 elem]   [3 elem]   0.0e+00  OK    
SLAYER γ_Hz [2/1,3/1,4/1]           [3 elem]   [3 elem]   0.0e+00  OK    
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.7s     230.8s              --    
=========================================================================
Summary: 17 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: 057c4af0d  @ 057c4af0d (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
Ref 2: a319ed295  @ a319ed295 (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
-------------------------------------------------------------------------
Quantity                            057c4af0d  a319ed295  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]   0.0e+00  OK    
SLAYER ω_Hz [2/1,3/1,4/1]           [3 elem]   [3 elem]   0.0e+00  OK    
SLAYER γ_Hz [2/1,3/1,4/1]           [3 elem]   [3 elem]   0.0e+00  OK    
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)                         238.2s     215.3s              --    
=========================================================================
Summary: 17 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: 057c4af0d  @ 057c4af0d (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
Ref 2: a319ed295  @ a319ed295 (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
------------------------------------------------------------------
Quantity                     057c4af0d  a319ed295  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)                  228.2s     228.8s              --    
==================================================================
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: 057c4af0d  @ 057c4af0d (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
Ref 2: a319ed295  @ a319ed295 (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
-----------------------------------------------------------------------------------------------------
Quantity                               057c4af0d      a319ed295      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  1.710e-08 (0.00%)  ** CHANGED **
total energy Re(et[1])                 8.005437e-01   8.005436e-01   1.241e-08 (0.00%)  ** CHANGED **
Runtime (s)                            185.9s         184.9s                            --           
=====================================================================================================
Summary: 2 changed, 10 unchanged


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

Regression Report: efit_fixedbdy_separatrix
=======================================================================
Ref 1: 057c4af0d  @ 057c4af0d (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
Ref 2: a319ed295  @ a319ed295 (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
-----------------------------------------------------------------------
Quantity                    057c4af0d     a319ed295     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)                 45.9s         45.7s                  --    
=======================================================================
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: 057c4af0d  @ 057c4af0d (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
Ref 2: a319ed295  @ a319ed295 (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
--------------------------------------------------------------------
Quantity                 057c4af0d     a319ed295     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)              178.2s        177.7s                 --    
====================================================================
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: 057c4af0d  @ 057c4af0d (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
Ref 2: a319ed295  @ a319ed295 (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
--------------------------------------------------------------------
Quantity                 057c4af0d     a319ed295     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)              182.1s        180.9s                 --    
====================================================================
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: 057c4af0d  @ 057c4af0d (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
Ref 2: a319ed295  @ a319ed295 (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
----------------------------------------------------------
Quantity                057c4af0d  a319ed295  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)             183.3s     184.8s           --    
==========================================================
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: 057c4af0d  @ 057c4af0d (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
Ref 2: a319ed295  @ a319ed295 (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
---------------------------------------------------------------
Quantity            057c4af0d     a319ed295     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)         21.9s         19.7s                  --    
===============================================================
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: 057c4af0d  @ 057c4af0d (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
Ref 2: a319ed295  @ a319ed295 (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
-----------------------------------------------------------------
Quantity            057c4af0d      a319ed295      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.5s          10.5s                   --    
=================================================================
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: 057c4af0d  @ 057c4af0d (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
Ref 2: a319ed295  @ a319ed295 (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
--------------------------------------------------------------------------------
Quantity                           057c4af0d      a319ed295      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)                        246.0s         250.6s                  --    
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: 057c4af0d  @ 057c4af0d (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
Ref 2: a319ed295  @ a319ed295 (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
-------------------------------------------------------------------------------------------
Quantity                     057c4af0d      a319ed295      Diff               Status       
-------------------------------------------------------------------------------------------
NTV total (D+T+imp+e) [N·m]  3.141767e+01   3.141935e+01   1.681e-03 (0.01%)  ** CHANGED **
NTV Deuterium [N·m]          1.973730e+01   1.973825e+01   9.476e-04 (0.00%)  ** CHANGED **
NTV Tritium [N·m]            2.046293e+01   2.046391e+01   9.804e-04 (0.00%)  ** CHANGED **
NTV electron [N·m]           -8.782557e+00  -8.782805e+00  2.475e-04 (0.00%)  ** CHANGED **
total energy Re(et[1])       1.090560e-02   1.090559e-02   1.153e-08 (0.00%)  ** CHANGED **
# singular surfaces          2              2              0.0e+00            OK           
Runtime (s)                  235.9s         236.1s                            --           
===========================================================================================
Summary: 5 changed, 1 unchanged


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

Regression Report: solovev_kinetic_ntv
=======================================================================================================
Ref 1: 057c4af0d  @ 057c4af0d (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
Ref 2: a319ed295  @ a319ed295 (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
-------------------------------------------------------------------------------------------------------
Quantity                                   057c4af0d     a319ed295     Diff               Status       
-------------------------------------------------------------------------------------------------------
NTV torque fgar [Re, Im]                   [1 elem]      [1 elem]      1.895e-03 (0.00%)  ** CHANGED **
NTV ψ quadrature evaluations               45            45            0.0e+00            OK           
fluid CGL energy fcgl [J]                  1.552303e+01  1.552025e+01  2.778e-03 (0.02%)  ** CHANGED **
root-area-weighted total energy Re(et[1])  1.090560e-02  1.090559e-02  1.153e-08 (0.00%)  ** CHANGED **
# 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)                                235.3s        234.6s                           --           
=======================================================================================================
Summary: 3 changed, 4 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: 057c4af0d  @ 057c4af0d (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
Ref 2: a319ed295  @ a319ed295 (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
----------------------------------------------------------------------
Quantity                 057c4af0d      a319ed295      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)              242.4s         243.3s                  --    
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: 057c4af0d  @ 057c4af0d (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
Ref 2: a319ed295  @ a319ed295 (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
---------------------------------------------------------------------------------
Quantity                      057c4af0d        a319ed295        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)                   199.4s           198.1s                      --    
=================================================================================
Summary: 15 unchanged


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

Regression Report: solovev_n1
================================================================================================
Ref 1: 057c4af0d  @ 057c4af0d (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
Ref 2: a319ed295  @ a319ed295 (2026-10-28)
       env: julia 1.12.6, x86_64-linux-gnu, manifest 4c9d54fa (pinned), 2 threads/1 BLAS, jit build
------------------------------------------------------------------------------------------------
Quantity                      057c4af0d        a319ed295        Diff               Status       
------------------------------------------------------------------------------------------------
total energy Re(et[1])        1.090560e-02     1.090559e-02     1.153e-08 (0.00%)  ** CHANGED **
total energy Im(et[1])        1.350301e-10     1.446796e-10     9.6e-12            OK           
plasma energy Re(ep[1])       -1.041640e+01    -1.041640e+01    3.614e-08 (0.00%)  ** CHANGED **
vacuum energy Re(ev[1])       1.042730e+01     1.042730e+01     2.461e-08 (0.00%)  ** CHANGED **
vacuum matrix min eigenvalue  2.170703e+00     2.170703e+00     0.0e+00            OK           
plasma energy (all)           [32 elem]        [32 elem]        2.364e-05 (0.00%)  ** CHANGED **
vacuum energy (all)           [32 elem]        [32 elem]        5.320e-06 (0.00%)  ** CHANGED **
total energy (all)            [32 elem]        [32 elem]        2.344e-05 (0.00%)  ** CHANGED **
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...  fc761aba9205...  0.000e+00 (0.00%)  ** CHANGED **
Runtime (s)                   200.4s           201.4s                              --           
================================================================================================
Summary: 7 changed, 15 unchanged

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

Copilot AI balanced review requested due to automatic review settings October 28, 2026 20:16

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Copilot was unable to review this pull request because the user who requested the review has insufficient remaining quota.

@d-burg
d-burg enabled stacked auto-merge October 28, 2026 20:18
@d-burg
d-burg merged commit f43b5be into develop Oct 29, 2026
7 of 8 checks passed
@d-burg
d-burg deleted the bugfix/ffs-crossing-resonant-elimination branch October 29, 2026 01:20
@d-burg

d-burg commented Oct 29, 2026

Copy link
Copy Markdown
Collaborator Author

Restamp for the record, since the develop merges after @matt-pharr's run left the stamp behind. regress --refs 7817f0e7a,db86ea2c8 --force (all cases) on feynman (SLURM, 8 threads, manifest pinned): the same seven cases move as in the SDCC run (solovev_n1, diiid_n1, diiid_multi_n, diiid_truncation_n1, solovev_kinetic_ntv, solovev_kinetic_multiion, diiid_error_field), by the same small amounts; the other 14 are unchanged, and gal_resistive_pe is N/A on both refs as on develop. runtests_eulerlagrange.jl (126, 26, 38, 2) and runtests_fullruns.jl (25) pass. The final develop merge (38107e0c4) brought in only #415's critical-resonant-field code and #471's docstrings, neither of which touches the crossing path.

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.

5 participants