Skip to content

Commit 1d86333

Browse files
authored
perf: remove unused work from FO Gauss-2 energy tests (#590)
Accelerate the full-orbit Gauss-2 energy tests with exact sparse/recurrent field evaluation, a joint FortSym kernel from embedding jets through inverse metric and Hessian, and prepared radial polynomials. The full registered target now takes **295.38 s** on sCluster node12, versus **366.86 s** for the prior branch head on the same node (19.5% faster). ## Risk tier - [x] T4: numerical kernels and generated-source integration; inherited test scheduling changes. ## Correctness contract Reduce evaluator cost while retaining canonical coordinates, Gaussian units, seeds, all 33,333,334 steps, step policy, Newton tolerances, every-step diagnostics and the 1e-5 energy criterion. No unsafe FP flags, sampling, shortened orbit or new test tier. The [joint generator](https://github.com/itpplasma/SIMPLE/blob/c398473965a7a0e36b3efdf07e17390bf1e4b997/concept/fo_symplectic_proof/gen/gen_fo_joint.f90) shares metric/inverse/Hessian expressions without expanding dense metric-derivative tensors. The [radial generator](https://github.com/itpplasma/SIMPLE/blob/c398473965a7a0e36b3efdf07e17390bf1e4b997/concept/fo_symplectic_proof/gen/gen_fo_poly.f90) prepares exact polynomials through degree eight; higher orders retain their complete recurrence evaluation. The [axis generator](https://github.com/itpplasma/SIMPLE/blob/c398473965a7a0e36b3efdf07e17390bf1e4b997/concept/fo_symplectic_proof/gen/gen_fo_poly_axis.f90) omits only powers proved structurally zero. [Handwritten code](https://github.com/itpplasma/SIMPLE/blob/c398473965a7a0e36b3efdf07e17390bf1e4b997/concept/fo_symplectic_proof/spectre_fo_gauss2.f90) owns orchestration; normal builds need no CAS. ## Tests added - Exact simplification/readback checks: 778 total, including 177 joint-kernel, 93 radial-preparation and 54 axis-jet checks. - Existing frozen-provider bitwise, phase, derivative, first/full RHS, map and gauge-rejection oracles retain their thresholds. Eight affected Make fast tests and registered FortSym regeneration pass. - All 19 normal cases pass on both current origin/main f189f16 and this revision. `GL_A(1,2)+=2e-3` gives identical 15 FAIL / 4 PASS matrices, causes and failure steps. - Every state and H compared over all 33,333,334 steps: largest state-component difference **2.08952e-09**, H difference **1.54824e-13** (5.1608e-12 relative). Differences are roundoff-only; bitwise states are not claimed. ## Golden-record impact - [x] Production golden-reference files unchanged. All 51 concept energy envelopes differ through rounding. Maximum energy-margin delta: **1.3531e-09**; closest final margin: **2.45953782e-06**. The target error is 6.9313566e-7 with margin 9.30686434e-6. No acceptance criterion was relaxed. ## Failure modes considered Wrong derivatives, radial scaling, invalid power omission, Fourier signs, gauge jumps and weakened energy detection are checked by the independent provider/map oracles, exact identities and deliberate tableau corruption. Public direct-phase geometry and potential queries retain the bitwise frozen-provider check. ## Manual validation GCC 12.2, deterministic Release, one thread, AMD EPYC 9455. Node12 sequential registered runs: prior head 366.86 s, final 295.38 s. Node10 full traced qualification: 332.21 s; its prior-head screening run was 424.70 s. All benchmark probes used the complete target orbit. Two authorized Slurm bundles requested 16 CPUs / 32 GiB each and completed successfully. Peak guarded memory was 20,324 / 10,263 MiB. Node-local scratch and both remote home staging directories are removed; evidence is retained locally under `build/fo_perf_round4/`. Both fixtures, all 22 changed sources and both instrumented drivers were audited against frozen sources. ## Verification Make fast tests, registered regeneration, pre-commit and changed-line lint pass. CI: six successful checks / eight skips under the existing draft policy. The complete science suite and fault audit were verified manually above. The PR remains a draft; no reviewer, mention or merge is requested. Chris&AI
2 parents bf494d4 + c398473 commit 1d86333

53 files changed

Lines changed: 4966 additions & 510 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎CHANGELOG.md‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ compared to earlier versions.
55

66
| Differing behavior | commit hash / tag and timestamp | Summary |
77
| ---------------- | ------------------------------- | ------- |
8+
| Y | 2026-10-20 | Accelerate the standalone full-orbit Gauss-2 energy/oracle evaluator with exact coefficient sparsity, shared recurrent Fourier phases and FortSym-generated field/Hessian contractions. The algebraically equivalent factored Hessian can change roundoff; orbit length, seeds, step policy, tolerances and energy checks are unchanged. |
89
| Y | 2026-10-20 | Keep classifier surface Bmin/Bmax per particle. Multi-surface OpenMP classification plots now retain the serial trapped-passing boundary in `fort.20000`; particle classification and loss accounting are unchanged. |
910
| N | 2026-10-16 | SIMPLE no longer imports the IEEE intrinsic modules; `finite_check` provides `is_finite` and `quiet_nan`. gfortran saved and restored the floating-point environment in every procedure with a local `USE` of a module whose dependencies imported IEEE, including `velo_can` and `integ_to_ref_albert` in the tracing loop. Albert-coordinate tracing is about 1.2x faster; outputs are byte-identical. |
1011
| Y | 2026-10-16 | SPECTRE hybrid tests the full-orbit exit distance once per radian of gyration and at the end of each microstep instead of after every RK45 substep (about 40% of full-orbit time). Exits occur up to 1 rad later; FO-everywhere orbits are unchanged. See `concept/spectre_loss_study/results/profile/`. |

‎DOC/coordinates-and-fields.md‎

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -379,6 +379,31 @@ $N_\text{fp}$, `fper` $= 2\pi/N_\text{fp}$ and `rmajor`, the $m = n = 0$
379379
harmonic of $R$ on the outermost interface (m), so that `params_init` derives
380380
$\Delta\tau$ as for VMEC.
381381

382+
The canonical Gauss-2 full-orbit evaluator in
383+
`concept/fo_symplectic_proof/spectre_fo_gauss2.f90` retains the same smooth
384+
embedding and vector potential. It caches field-constant angular factors and
385+
shares radial profiles between Fourier modes. Preparation packs the nonzero
386+
potential coefficient tuples without changing their mode/degree order; an
387+
identically zero interface gauge is skipped as a whole. FortSym emits the fixed
388+
geometry contractions and the two-component potential accumulation. The field-jet
389+
call passes geometry's Fourier phases to the potential at the same point,
390+
avoiding a second trigonometric evaluation. The internal metric path constructs
391+
integer Fourier harmonics by complex-product recurrence from two fundamental
392+
phases; FortSym proves the addition identities and emitted expressions. Sparse
393+
high harmonics retain direct trigonometric evaluation. The public geometry
394+
helper retains direct phases for the bitwise frozen-provider oracle; the hot
395+
path also has an independent phase roundoff check and the Hamiltonian/map
396+
oracles. Predictor and residual-only
397+
stage evaluations request first-order field jets and a FortSym-generated
398+
Hamiltonian leaf without Hessian outputs, including first-order radial-metric
399+
and monitor leaves without unused second derivatives; Newton corrections and tangent maps
400+
use the complete jets. The full Hessian uses the factored inverse-metric
401+
identity generated and checked by FortSym; energy and force retain the original
402+
first-order expressions. The generated array interface binds the scalar DAG
403+
directly to arrays. Small stage evaluations run serially. Energy tests reuse
404+
H at the next step's start and evaluate the final endpoint explicitly, retaining
405+
the energy envelope and drift diagnostics at every accepted step.
406+
382407
### 6.1 Field lines
383408

384409
`src/field_line_spectre.f90` traces field lines inside one volume as a

‎concept/fo_gc_derivations/B_provider_jets/gen_provider_jets.f90‎

Lines changed: 54 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -771,21 +771,21 @@ subroutine gram_cylindrical
771771
type(expr_t) :: rz(2), metric, dg, d2g, ev(3)
772772
integer :: i, j, k, l, c
773773
character(40) :: lab
774-
call expect(fprov, 321, 'x = [rz(1)*cz, rz(1)*sz, rz(2)]')
775-
call expect(fprov, 323, 'e(:, i) = [d(1, i)*cz, d(1, i)*sz, d(2, i)]')
776-
call expect(fprov, 325, 'e(:, 3) = e(:, 3) + [-rz(1)*sz, rz(1)*cz, 0.0_dp]')
777-
call expect(fprov, 326, 'metric = matmul(transpose(d), d)')
778-
call expect(fprov, 327, 'metric(3, 3) = metric(3, 3) + rz(1)**2')
779-
call expect(fprov, 331, 'dg(i, j, k) = dot_product(d2(:, i, k), d(:, j)) &')
780-
call expect(fprov, 332, '+ dot_product(d(:, i), d2(:, j, k))')
781-
call expect(fprov, 334, &
774+
call expect(fprov, 373, 'x = [rz(1)*cz, rz(1)*sz, rz(2)]')
775+
call expect(fprov, 375, 'e(:, i) = [d(1, i)*cz, d(1, i)*sz, d(2, i)]')
776+
call expect(fprov, 377, 'e(:, 3) = e(:, 3) + [-rz(1)*sz, rz(1)*cz, 0.0_dp]')
777+
call expect(fprov, 378, 'metric = matmul(transpose(d), d)')
778+
call expect(fprov, 379, 'metric(3, 3) = metric(3, 3) + rz(1)**2')
779+
call expect(fprov, 384, 'dg(i, j, k) = dot_product(d2(:, i, k), d(:, j)) &')
780+
call expect(fprov, 385, '+ dot_product(d(:, i), d2(:, j, k))')
781+
call expect(fprov, 388, &
782782
'd2g(i, j, k, l) = dot_product(d3(:, i, k, l), d(:, j)) &')
783-
call expect(fprov, 335, '+ dot_product(d2(:, i, k), d2(:, j, l)) &')
784-
call expect(fprov, 336, '+ dot_product(d2(:, i, l), d2(:, j, k)) &')
785-
call expect(fprov, 337, '+ dot_product(d(:, i), d3(:, j, k, l))')
786-
call expect(fprov, 341, 'dg(3, 3, k) = dg(3, 3, k) + 2.0_dp*rz(1)*d(1, k)')
787-
call expect(fprov, 343, 'd2g(3, 3, k, l) = d2g(3, 3, k, l) + &')
788-
call expect(fprov, 344, '2.0_dp*(d(1, k)*d(1, l) + rz(1)*d2(1, k, l))')
783+
call expect(fprov, 389, '+ dot_product(d2(:, i, k), d2(:, j, l)) &')
784+
call expect(fprov, 390, '+ dot_product(d2(:, i, l), d2(:, j, k)) &')
785+
call expect(fprov, 391, '+ dot_product(d(:, i), d3(:, j, k, l))')
786+
call expect(fprov, 395, 'dg(3, 3, k) = dg(3, 3, k) + 2.0_dp*rz(1)*d(1, k)')
787+
call expect(fprov, 398, 'd2g(3, 3, k, l) = d2g(3, 3, k, l) + &')
788+
call expect(fprov, 399, '2.0_dp*(d(1, k)*d(1, l) + rz(1)*d2(1, k, l))')
789789
q = [s('rho'), s('theta'), s('zeta')]
790790
rf = func('R', q); zf = func('Z', q)
791791
xc = [rf*cos(q(3)), rf*sin(q(3)), zf]
@@ -893,15 +893,15 @@ subroutine blend_potential
893893
type(expr_t) :: da(3), d2a(3, 3), tv
894894
integer :: i, j
895895
character(32) :: lab
896-
call expect(fprov, 139, 'a = al + s(0)*(ar - al)')
897-
call expect(fprov, 140, 'da = dl + s(0)*(dr - dl)')
898-
call expect(fprov, 141, 'da(:, 1) = da(:, 1) + s(1)*(ar - al)')
899-
call expect(fprov, 142, 'd2a = hl + s(0)*(hr - hl)')
900-
call expect(fprov, 145, 'if (i == 1) d2a(:, i, j) = d2a(:, i, j) &')
901-
call expect(fprov, 146, '+ s(1)*(dr(:, j) - dl(:, j))')
902-
call expect(fprov, 147, 'if (j == 1) d2a(:, i, j) = d2a(:, i, j) &')
903-
call expect(fprov, 148, '+ s(1)*(dr(:, i) - dl(:, i))')
904-
call expect(fprov, 151, 'd2a(:, 1, 1) = d2a(:, 1, 1) + s(2)*(ar - al)')
896+
call expect(fprov, 157, 'a = al + s(0)*(ar - al)')
897+
call expect(fprov, 158, 'da = dl + s(0)*(dr - dl)')
898+
call expect(fprov, 159, 'da(:, 1) = da(:, 1) + s(1)*(ar - al)')
899+
call expect(fprov, 166, 'd2a = hl + s(0)*(hr - hl)')
900+
call expect(fprov, 169, 'if (i == 1) d2a(:, i, j) = d2a(:, i, j) &')
901+
call expect(fprov, 170, '+ s(1)*(dr(:, j) - dl(:, j))')
902+
call expect(fprov, 171, 'if (j == 1) d2a(:, i, j) = d2a(:, i, j) &')
903+
call expect(fprov, 172, '+ s(1)*(dr(:, i) - dl(:, i))')
904+
call expect(fprov, 175, 'd2a(:, 1, 1) = d2a(:, 1, 1) + s(2)*(ar - al)')
905905
q = [s('rho'), s('theta'), s('zeta')]
906906
al = func('AL', q); arr = func('AR', q); w = func('W', [q(1)])
907907
a = al + w*(arr - al)
@@ -954,9 +954,10 @@ subroutine blend_leibniz
954954
1, 0, 0, 0, 1, 1, 0, 0, 1, 2, 1, 0, 1, 3, 3, 1], [4, 4])
955955
character(LN) :: o(4), wn(4)
956956
character(32) :: lab
957-
call expect(fprov, 260, &
957+
call expect(fprov, 298, &
958958
'integer, parameter :: binom(0:3, 0:3) = reshape([ &')
959-
call expect(fprov, 261, '1, 0, 0, 0, 1, 1, 0, 0, 1, 2, 1, 0, 1, 3, 3, 1], [4, 4])')
959+
call expect(fprov, 299, &
960+
'1, 0, 0, 0, 1, 1, 0, 0, 1, 2, 1, 0, 1, 3, 3, 1], [4, 4])')
960961
o = [character(LN) :: 'coeff(:, r)', 'real(binom(l, r), dp)', 'sw(l)', &
961962
'(cr(:, r - l) - cl(:, r - l))']
962963
wn = [character(LN) :: 'OLD', 'BIN', 'SW', 'DIFF']
@@ -968,7 +969,7 @@ subroutine blend_leibniz
968969
jl(r) = diff(jl(r - 1), rho); jr(r) = diff(jr(r - 1), rho)
969970
sw(r) = diff(sw(r - 1), rho)
970971
end do
971-
t = src(fprov, 285, o, wn)
972+
t = src(fprov, 333, o, wn)
972973
do r = 0, 3
973974
cf = jl(r)
974975
do l = 0, r
@@ -1021,33 +1022,33 @@ subroutine switch_chain
10211022
w = [character(LN) :: 'S0', 'S1', 'S2', 'S3']
10221023
rho = s('rho'); k = s('k'); width = s('width')
10231024
! Line 97 parsed with real(k, dp) -> (k).
1024-
t = src(fprov, 97, o, w)
1025-
phi = subs_many(src(fprov, 104, o, w), [s('t')], [t])
1025+
t = src(fprov, 109, o, w)
1026+
phi = subs_many(src(fprov, 116, o, w), [s('t')], [t])
10261027
call ident('switch phi', phi - (-1/t + 1/(1 - t)))
10271028
do br = 1, 2
10281029
! br=1: phi<0, small=exp(phi) (line 109 abs), s0 line 111.
10291030
! br=2: phi>=0, small=exp(-phi), s0 line 113.
10301031
if (br == 1) then
10311032
small = exp(phi)
1032-
s0 = subs_many(src(fprov, 111, o, w), [s('small')], [small])
1033+
s0 = subs_many(src(fprov, 123, o, w), [s('small')], [small])
10331034
else
10341035
small = exp(-phi)
1035-
s0 = subs_many(src(fprov, 113, o, w), [s('small')], [small])
1036+
s0 = subs_many(src(fprov, 125, o, w), [s('small')], [small])
10361037
end if
1037-
sp = subs_many(src(fprov, 115, o, w), [s('small')], [small])
1038-
p1 = subs_many(src(fprov, 116, o, w), [s('t')], [t])
1039-
p2 = subs_many(src(fprov, 117, o, w), [s('t')], [t])
1040-
p3 = subs_many(src(fprov, 118, o, w), [s('t')], [t])
1038+
sp = subs_many(src(fprov, 127, o, w), [s('small')], [small])
1039+
p1 = subs_many(src(fprov, 128, o, w), [s('t')], [t])
1040+
p2 = subs_many(src(fprov, 129, o, w), [s('t')], [t])
1041+
p3 = subs_many(src(fprov, 130, o, w), [s('t')], [t])
10411042
call ident('switch ph1 = dphi/dt', p1 - dt(phi))
10421043
call ident('switch ph2 = d2phi/dt2', p2 - dt(dt(phi)))
10431044
call ident('switch ph3 = d3phi/dt3', p3 - dt(dt(dt(phi))))
10441045
call ident('switch s0 = logistic(phi)', s0 - 1/(1 + exp(-phi)))
10451046
d(0) = s0
1046-
d(1) = subs_many(src(fprov, 119, o, w), &
1047+
d(1) = subs_many(src(fprov, 131, o, w), &
10471048
[s('sp'), s('ph1'), s('width')], [sp, p1, width])
1048-
d(2) = subs_many(src(fprov, 120, o, w), &
1049+
d(2) = subs_many(src(fprov, 132, o, w), &
10491050
[s('sp'), s('ph1'), s('ph2'), s('S0'), s('width')], [sp, p1, p2, s0, width])
1050-
d(3) = subs_many(src(fprov, 121, o, w), &
1051+
d(3) = subs_many(src(fprov, 133, o, w), &
10511052
[s('sp'), s('ph1'), s('ph2'), s('ph3'), s('S0'), s('width')], &
10521053
[sp, p1, p2, p3, s0, width])
10531054
do m = 1, 3
@@ -1071,11 +1072,11 @@ subroutine gauge_projection
10711072
type(expr_t) :: m, nn, dth, dze, wave(2), c, proj(2), th, ze, arg, chi
10721073
type(expr_t) :: gc(2), gs(2), val(2), cc, cs
10731074
m = s('m'); nn = s('n'); dth = s('dth'); dze = s('dze')
1074-
call expect(fprov, 72, 'wave = [real(m, dp), -real(n, dp)]')
1075-
call expect(fprov, 73, 'defect = maxval(abs(m*delta(2, :) + n*delta(1, :)))')
1076-
call expect(fprov, 80, &
1075+
call expect(fprov, 84, 'wave = [real(m, dp), -real(n, dp)]')
1076+
call expect(fprov, 85, 'defect = maxval(abs(m*delta(2, :) + n*delta(1, :)))')
1077+
call expect(fprov, 92, &
10771078
'c = dot_product(wave, delta(:, r))/dot_product(wave, wave)')
1078-
call expect(fprov, 81, 'delta(:, r) = c*wave')
1079+
call expect(fprov, 93, 'delta(:, r) = c*wave')
10791080
wave = [m, -nn]
10801081
c = (wave(1)*dth + wave(2)*dze)/(wave(1)**2 + wave(2)**2)
10811082
proj = [c*wave(1), c*wave(2)]
@@ -1258,14 +1259,14 @@ subroutine spectral_volume_chain
12581259
type(expr_t) :: rho, th, ze, ow, sarg, g, q(3), u(3), gg, e
12591260
integer :: i, j, slot(3, 3), nr
12601261
character(32) :: lab
1261-
call expect(fprov, 171, &
1262+
call expect(fprov, 196, &
12621263
'integer, parameter :: slot(3, 3) = reshape([1, 2, 3, 2, 4, 5, 3, 5, 6], [3, 3])')
1263-
call expect(fprov, 179, 'da(:, 1) = 2.0_dp*da(:, 1)')
1264-
call expect(fprov, 186, 'real(2**(merge(1, 0, i == 1) + merge(1, 0, j == 1)), dp)')
1264+
call expect(fprov, 204, 'da(:, 1) = 2.0_dp*da(:, 1)')
1265+
call expect(fprov, 212, 'real(2**(merge(1, 0, i == 1) + merge(1, 0, j == 1)), dp)')
12651266
slot = reshape([1, 2, 3, 2, 4, 5, 3, 5, 6], [3, 3])
12661267
rho = s('rho'); th = s('theta'); ze = s('zeta'); ow = s('owner')
12671268
sarg = parse_rhs(ar, '2.0_dp*(q(1) - owner + 1) - 1.0_dp', ['q(1)'], ['rho '])
1268-
call expect(fprov, 174, '2.0_dp*(q(1) - owner + 1) - 1.0_dp, q(2), q(3), av)')
1269+
call expect(fprov, 199, '2.0_dp*(q(1) - owner + 1) - 1.0_dp, q(2), q(3), av, second)')
12691270
q = [rho, th, ze]
12701271
u = [s('u'), s('v'), s('w')]
12711272
g = func('G', [sarg, th, ze])
@@ -1301,12 +1302,14 @@ subroutine geometry_fourier
13011302
type(expr_t) :: k1(0:3), k2(0:3)
13021303
integer :: r, t, z, i
13031304
character(32) :: lab
1304-
call expect(fprov, 273, 'wave = [real(m, dp), -real(n, dp)]')
1305-
call expect(fprov, 275, 'c = [cos(arg), -sin(arg), -cos(arg), sin(arg)]')
1306-
call expect(fprov, 293, 'factor = wave(1)**t*wave(2)**z')
1307-
call expect(fprov, 294, 'jets(r, t, z, comp) = jets(r, t, z, comp) + factor* &')
1308-
call expect(fprov, 295, '(coeff(1, r)*c(mod(t + z, 4)) &')
1309-
call expect(fprov, 296, '- coeff(2, r)*c(mod(t + z + 1, 4)))')
1305+
call expect(fprov, 321, 'wave = [real(m, dp), -real(n, dp)]')
1306+
call expect(fprov, 323, 'c = [cos(arg), -sin(arg), -cos(arg), sin(arg)]')
1307+
call expect(fprov, 44, &
1308+
'angular_factor(t, z, j) = real(spectre_field%data%im(j), dp)**t* &')
1309+
call expect(fprov, 341, 'factor = angular_factor(t, z, ii)')
1310+
call expect(fprov, 342, 'jets(r, t, z, comp) = jets(r, t, z, comp) + factor* &')
1311+
call expect(fprov, 343, '(coeff(1, r)*c(mod(t + z, 4)) &')
1312+
call expect(fprov, 344, '- coeff(2, r)*c(mod(t + z + 1, 4)))')
13101313
rho = s('rho'); th = s('theta'); ze = s('zeta'); m = s('m'); nn = s('n')
13111314
wave = [m, -nn]
13121315
arg = wave(1)*th + wave(2)*ze

‎concept/fo_gc_derivations/B_provider_jets/mutation_check.sh‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,12 @@ muts=(
1010
"batch_interpolate_3d.f90|2216|s/k2\*coeff_23/2*k2*coeff_23/"
1111
"batch_interpolate_3d.f90|1835|s/kk\*(kk - 1)/kk*(kk + 1)/"
1212
"batch_interpolate_3d.f90|1805|s/b1(k3, 3)/b0(k3, 3)/"
13-
"spectre_fo_gauss2.f90|120|s/2.0_dp\*s(0)/3.0_dp*s(0)/"
14-
"spectre_fo_gauss2.f90|117|s/-2.0_dp\/t/-3.0_dp\/t/"
15-
"spectre_fo_gauss2.f90|336|s/d2(:, j, k)/d2(:, j, l)/"
13+
"spectre_fo_gauss2.f90|132|s/2.0_dp\*s(0)/3.0_dp*s(0)/"
14+
"spectre_fo_gauss2.f90|129|s/-2.0_dp\/t/-3.0_dp\/t/"
15+
"spectre_fo_gauss2.f90|390|s/d2(:, j, k)/d2(:, j, l)/"
1616
"spectre_basis.f90|43|s/2.0_dp\*cheby(ll - 1, 0)/3.0_dp*cheby(ll - 1, 0)/"
1717
"spectre_basis.f90|289|s/+ rmi\*rni/- rmi*rni/"
18-
"spectre_basis.f90|93|s/(m + 1)\*m\*(m - 1)/(m + 1)*m*(m + 1)/"
18+
"spectre_basis.f90|94|s/(m + 1)\*m\*(m - 1)/(m + 1)*m*(m + 1)/"
1919
)
2020
status=0
2121
for m in "${muts[@]}"; do

‎concept/fo_gc_derivations/B_provider_jets/run_provider_jets.sh‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ cp "$fo_gauss2" "$here/build/src/spectre_fo_gauss2.f90"
1414
cp "$libneo/src/interpolate/batch_interpolate_3d.f90" "$here/build/src/"
1515
cp "$libneo/src/spectre/spectre_basis.f90" "$here/build/src/"
1616
( cd "$here/build/src" && sha256sum -c --quiet - ) <<'SUMS'
17-
2257b247f459ce61f5ee0c5d9b131ee8541bfae1ad3cf00d4316dd575f141818 spectre_fo_gauss2.f90
17+
74018be12704da9032d6a4a33cca9155a92c2cf27cbdbc7d9a5aa3de8e8c8039 spectre_fo_gauss2.f90
1818
a249da9ca99fc217f621f498ad727d1c7dd3cc6ff02fd7ea079e6b43ab8adfc9 batch_interpolate_3d.f90
1919
21c3cefd7c6a518a9090e9a98fc2547a14fe7521c46479ff6e8e8a5f2d406d7d spectre_basis.f90
2020
SUMS

‎concept/fo_symplectic_proof/README.md‎

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,12 @@ more steps and an h/4 safety refinement, and the L4 obligations below are
1414
open. The test tree builds `spectre_fo_gauss2.f90` and the kernel as the
1515
test-only library `fo_gauss2_concept` so the proof chain stays executable.
1616

17-
The six `generated/` leaves and the scalar generator in `gen/` are unchanged
18-
from that commit (only the regeneration scripts' paths were adapted). SIMPLE
19-
compiles the committed kernel without requiring a CAS. The registered regeneration test re-emits and compares all six
20-
leaves and runs the exact symbolic/readback checks (257/257 Hamiltonian and 6/6
21-
monitor identities). Thus the shipped expressions remain tied to L1/L2.
17+
The FortSym generators in `gen/` emit the Hamiltonian, monitor, factored
18+
Hessian, geometry contractions and potential accumulation in `generated/`.
19+
Verified: `gen/check_fo_generated.sh` checks byte regeneration, 271 exact
20+
Hamiltonian/readback identities, 153 factored-Hessian/readback identities and
21+
six monitor/product identities. The frozen reference is checked separately by
22+
its source hash and the executable field, derivative and map oracles.
2223

2324
`results.json` and `proof-foundation.md` retain the original a27d1ec evidence;
2425
they are historical records, not a new run of the consolidated checkout. The

0 commit comments

Comments
 (0)