Stage: SIMPLE / physics validation (milestone M3)
Source language: Fortran 2008 + Python test drivers
Manuals to read first: DOC/spectre-interface-crossing.md; src/orbit_fo_boris.f90 (full-orbit Boris, orbit_model = 7 — the in-house non-adiabatic reference); examples/golden_record.py and docs/review-policy.md (golden-record rules); SPECTRE examples/optimization/qa_vac_vol7 (the multi-volume stellarator case to convert into the validation fixture).
Depends on: #441
Goal
End-to-end validation of SPECTRE support at production scope: confinement statistics and orbit classification on a multi-volume stellarator case, cross-validation of the crossing map against full-orbit physics, and a golden-record entry that locks the behavior.
Files to edit
test/tests/test_spectre_losses.py: NEW. Full loss run on a low-resolution qa_vac_vol7-derived fixture.
test/tests/test_spectre_fullorbit_crossing.py: NEW. Boris-vs-guiding-center interface crossing comparison.
examples/: SPECTRE example input (simple_spectre.in) + fixture-generation provenance.
- Golden-record integration per
docs/review-policy.md.
DOC/coordinates-and-fields.md: final consistency pass over all SPECTRE sections added by spectre-05..10.
Acceptance scenarios (BDD)
- Given the multi-volume stellarator fixture and a standard alpha-loss configuration, when
simple.x runs with symplectic integration, then confined_fraction.dat and times_lost.dat are produced, every particle is accounted (confined + lost + crossing events consistent), and results are reproducible with fixed seed.
- Given the same ensemble with RK45 and with symplectic integration, then confined fractions agree within two-sigma Monte-Carlo error.
- Given trapped/passing and regular/chaotic classification enabled, then classification completes on SPECTRE fields and the trapped-passing split matches the analytic mirror criterion on sampled orbits.
- Given a full-orbit (Boris, Cartesian evaluation through the coordinate map) ensemble crossing one interface with gyro-phase-uniform initialization, then the guiding-center Level-1 map reproduces the gyro-averaged post-crossing
(v_par, position) within the gyro-scatter band, and the measured mu scatter is quantified and recorded in DOC/spectre-interface-crossing.md (validates and bounds the conserved-mu model assumption).
- Given the golden-record runner, then the SPECTRE case passes against its committed reference.
Success criteria
make && make test TEST=spectre_losses && make test TEST=spectre_fullorbit_crossing
Non-goals
- No performance optimization (basis-evaluation batching/splining is a separate future issue if profiling demands).
- No free-boundary vacuum-region tracing beyond the outermost interface (future work; loss surface stays the outermost interface).
- No optimization-loop integration (pysimple/batch API exposure is follow-up).
Verification
make test TEST=spectre_losses
Stage: SIMPLE / physics validation (milestone M3)
Source language: Fortran 2008 + Python test drivers
Manuals to read first:
DOC/spectre-interface-crossing.md;src/orbit_fo_boris.f90(full-orbit Boris,orbit_model = 7— the in-house non-adiabatic reference);examples/golden_record.pyanddocs/review-policy.md(golden-record rules); SPECTREexamples/optimization/qa_vac_vol7(the multi-volume stellarator case to convert into the validation fixture).Depends on: #441
Goal
End-to-end validation of SPECTRE support at production scope: confinement statistics and orbit classification on a multi-volume stellarator case, cross-validation of the crossing map against full-orbit physics, and a golden-record entry that locks the behavior.
Files to edit
test/tests/test_spectre_losses.py: NEW. Full loss run on a low-resolutionqa_vac_vol7-derived fixture.test/tests/test_spectre_fullorbit_crossing.py: NEW. Boris-vs-guiding-center interface crossing comparison.examples/: SPECTRE example input (simple_spectre.in) + fixture-generation provenance.docs/review-policy.md.DOC/coordinates-and-fields.md: final consistency pass over all SPECTRE sections added by spectre-05..10.Acceptance scenarios (BDD)
simple.xruns with symplectic integration, thenconfined_fraction.datandtimes_lost.datare produced, every particle is accounted (confined + lost + crossing events consistent), and results are reproducible with fixed seed.(v_par, position)within the gyro-scatter band, and the measured mu scatter is quantified and recorded inDOC/spectre-interface-crossing.md(validates and bounds the conserved-mu model assumption).Success criteria
Non-goals
Verification
make test TEST=spectre_losses