Skip to content

Commit d7e6e6f

Browse files
authored
Repo - API! - Replace FourFitVars with immutable MatrixSplines split into ideal and kinetic (#383)
2 parents 6b5e801 + 05f3126 commit d7e6e6f

31 files changed

Lines changed: 556 additions & 528 deletions

benchmarks/benchmark_delta_prime_methods.jl

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,16 +41,16 @@ function setup_and_run_solovev()
4141
intr.mpert = intr.mhigh - intr.mlow + 1
4242
intr.numpert_total = intr.mpert * intr.npert
4343
metric = FFS.make_metric(equil, intr.mpert)
44-
ffit = FFS.make_matrix(equil, intr, metric)
45-
odet, _, _, _ = FFS.riccati_eulerlagrange_integration(ctrl, equil, ffit, intr)
46-
return ctrl, equil, ffit, intr, odet
44+
mats = FFS.build_matrix_splines(equil, intr, metric)
45+
odet, _, _, _ = FFS.riccati_eulerlagrange_integration(ctrl, equil, mats, intr)
46+
return ctrl, equil, mats, intr, odet
4747
end
4848

4949
println("\n=== compute_delta_prime_from_ca! consistency check ===")
5050
println("Verifies the standalone Δ' formula matches the inline Riccati crossing computation.")
5151
println("Expected error: exactly zero (same formula, same data).\n")
5252

53-
ctrl, equil, ffit, intr, odet = setup_and_run_solovev()
53+
ctrl, equil, mats, intr, odet = setup_and_run_solovev()
5454
msing = intr.msing
5555

5656
# Capture Δ' values set inline by riccati_cross_ideal_singular_surf! during integration

benchmarks/benchmark_riccati_der.jl

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -42,19 +42,19 @@ function setup_solovev()
4242
intr.mpert = intr.mhigh - intr.mlow + 1
4343
intr.numpert_total = intr.mpert * intr.npert
4444
metric = FFS.make_metric(equil, intr.mpert)
45-
ffit = FFS.make_matrix(equil, intr, metric)
46-
return ctrl, equil, ffit, intr
45+
mats = FFS.build_matrix_splines(equil, intr, metric)
46+
return ctrl, equil, mats, intr
4747
end
4848

4949
# Evaluate the Riccati RHS explicitly from splines: dS = w†·F̄⁻¹·w - S·Ḡ·S
50-
function riccati_rhs_manual(S, psi, equil, ffit, intr)
50+
function riccati_rhs_manual(S, psi, equil, mats, intr)
5151
N = intr.numpert_total
5252
L = zeros(ComplexF64, N, N)
5353
Kmat = zeros(ComplexF64, N, N)
5454
Gmat = zeros(ComplexF64, N, N)
55-
ffit.fmats_lower(vec(L), psi; hint=ffit._hint)
56-
ffit.kmats(vec(Kmat), psi; hint=ffit._hint)
57-
ffit.gmats(vec(Gmat), psi; hint=ffit._hint)
55+
mats.ideal.F_spline_lower(vec(L), psi; hint=mats._hint)
56+
mats.ideal.K_spline(vec(Kmat), psi; hint=mats._hint)
57+
mats.ideal.G_spline(vec(Gmat), psi; hint=mats._hint)
5858

5959
q = equil.profiles.q_spline(psi)
6060
singfac = vec(1.0 ./ ((intr.mlow:intr.mhigh) .- q .* (intr.nlow:intr.nhigh)'))
@@ -77,7 +77,7 @@ println("\n=== riccati_der! formula verification ===")
7777
println("Verifies riccati_der! output matches manual evaluation of Glasser 2018 Eq. 19.")
7878
println("Test state: Hermitian S (physical constraint). Expected error: ~machine epsilon.\n")
7979

80-
ctrl, equil, ffit, intr = setup_solovev()
80+
ctrl, equil, mats, intr = setup_solovev()
8181
N = intr.numpert_total
8282

8383
odet = FFS.OdeState(N, ctrl.numsteps_init, ctrl.numunorms_init, intr.msing)
@@ -101,15 +101,15 @@ max_err = let max_err = 0.0
101101
S = (A + A') / 2 # Hermitian by construction
102102

103103
# Manual RHS
104-
dS_manual = riccati_rhs_manual(S, psi, equil, ffit, intr)
104+
dS_manual = riccati_rhs_manual(S, psi, equil, mats, intr)
105105

106106
# riccati_der! RHS
107107
u_ric = zeros(ComplexF64, N, N, 2)
108108
du_ric = zeros(ComplexF64, N, N, 2)
109109
u_ric[:, :, 1] .= S
110110
u_ric[:, :, 2] .= Matrix{ComplexF64}(I, N, N)
111111
dummy_chunk = FFS.IntegrationChunk(psi, psi, false, 0, 1)
112-
params = (ctrl, equil, ffit, intr, odet, dummy_chunk)
112+
params = (ctrl, equil, mats, intr, odet, dummy_chunk)
113113
FFS.riccati_der!(du_ric, u_ric, params, psi)
114114
dS_ric = du_ric[:, :, 1]
115115

benchmarks/benchmark_threads.jl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,9 @@ function run_ffs(ex; integrator)
3030
intr.mpert = intr.mhigh - intr.mlow + 1
3131
intr.numpert_total = intr.mpert * intr.npert
3232
metric = GeneralizedPerturbedEquilibrium.ForceFreeStates.make_metric(equil, intr.mpert)
33-
ffit = GeneralizedPerturbedEquilibrium.ForceFreeStates.make_matrix(equil, intr, metric)
34-
odet, _, _, _ = GeneralizedPerturbedEquilibrium.ForceFreeStates.eulerlagrange_integration(ctrl, equil, ffit, intr)
35-
vac = GeneralizedPerturbedEquilibrium.ForceFreeStates.free_run(odet, ctrl, equil, ffit, intr)
33+
mats = GeneralizedPerturbedEquilibrium.ForceFreeStates.build_matrix_splines(equil, intr, metric)
34+
odet, _, _, _ = GeneralizedPerturbedEquilibrium.ForceFreeStates.eulerlagrange_integration(ctrl, equil, mats, intr)
35+
vac = GeneralizedPerturbedEquilibrium.ForceFreeStates.free_run(odet, ctrl, equil, mats, intr)
3636
return real(vac.et[1]), intr.numpert_total
3737
end
3838

docs/development/architecture.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ Splines are provided by the external `FastInterpolations` package rather than by
6464
- `Riccati/` - Chunked fundamental-matrix (STRIDE) driver and Δ' boundary-value problem
6565
- `Galerkin/` - RDCON outer-region singular Galerkin Δ' solver
6666
- `Matching/` - Outer↔inner resistive matching (`DeltaPrimeData`, `resonant_match_rpec`)
67-
- `Fourfit.jl` - Fourier fitting routines (`FourFitVars`)
67+
- `Fourfit.jl` - Fourier fitting routines (`MatrixSplines`)
6868
- `FixedBoundaryStability.jl` - Fixed boundary analysis
6969
- `Free.jl` - Free boundary stability
7070
- Status: Stable, core DCON functionality implemented

docs/src/stability.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -324,15 +324,15 @@ intr.mpert = intr.mhigh - intr.mlow + 1
324324
intr.numpert_total = intr.mpert * intr.npert
325325

326326
metric = FFS.make_metric(equil, intr.mpert)
327-
ffit = FFS.make_matrix(equil, intr, metric)
327+
mats = FFS.build_matrix_splines(equil, intr, metric)
328328

329329
# Choose integration driver. The top-level `eulerlagrange_integration` dispatches
330330
# on ctrl.integrator and always returns a 4-tuple
331331
# (odet, propagators, chunks, S_at_surface_left). The trailing three are `nothing`
332332
# on the forward path.
333-
odet, _, _, _ = FFS.eulerlagrange_integration(ctrl, equil, ffit, intr)
333+
odet, _, _, _ = FFS.eulerlagrange_integration(ctrl, equil, mats, intr)
334334

335-
vac = FFS.free_run(odet, ctrl, equil, ffit, intr)
335+
vac = FFS.free_run(odet, ctrl, equil, mats, intr)
336336
println("Energy eigenvalue et[1] = ", real(vac.et[1]))
337337
```
338338

0 commit comments

Comments
 (0)