From 461765ceeef585ec441895099eddda456d6a0d41 Mon Sep 17 00:00:00 2001 From: Bryce Lovell <40742705+BryceWDesign@users.noreply.github.com> Date: Sat, 22 Aug 2026 15:50:19 -0700 Subject: [PATCH 1/3] Upgrade IX-StellaratorForge to v0.9.0 integrated campaign --- .github/workflows/quality.yml | 4 +- BOM/SFR2_ACTUATION_OVERLAY_BOM.csv | 25 + BOM/SFR2_ACTUATION_OVERLAY_BOM.md | 18 + BOM/SFR3_DUAL_BOUNDARY_AHIS_BOM.csv | 65 + BOM/SFR3_DUAL_BOUNDARY_AHIS_BOM.md | 32 + BOM/SFR3_FIELD_INTEGRITY_SHELL_BOM.csv | 53 + BOM/SFR3_FIELD_INTEGRITY_SHELL_BOM.md | 25 + BOM/SFR4_INTEGRATED_PROMOTION_BOM.csv | 65 + BOM/SFR4_INTEGRATED_PROMOTION_BOM.md | 13 + CHANGELOG.md | 43 + CITATION.cff | 4 +- FINAL_STATUS.md | 100 +- MANIFEST.sha256 | 102 +- PROOF_OF_CONCEPT.md | 75 +- README.md | 170 ++- VALIDATION_REPORT.md | 69 +- VERSION | 2 +- check_stellarforge.py | 368 ++++- check_vnext.py | 2 +- configs/reactor/sfr2_actuation_overlay_a.json | 52 + .../reactor/sfr3_dual_boundary_ahis_a.json | 370 +++++ .../reactor/sfr3_field_integrity_shell_a.json | 191 +++ .../sfr4_integrated_physical_promotion_a.json | 173 +++ docs/20_RESULTS_LEDGER.md | 53 + docs/reactor/11_WHERE_WE_ARE.md | 57 +- .../14_SFR2_PHASE_PROGRAMMED_BREATHING.md | 51 + .../reactor/15_TRILOBE_CONCEPT_TRANSLATION.md | 25 + .../16_SFR2_ACTUATION_AND_TRILOBE_GATES.md | 39 + .../17_SFR3_DONOR_TRANSLATION_LEDGER.md | 19 + docs/reactor/18_SFR3_FIELD_INTEGRITY_SHELL.md | 33 + .../19_SFR3_MATERIAL_AND_LIQUID_BRANCHES.md | 34 + docs/reactor/20_SFR3_PROMOTION_GATES.md | 20 + .../21_SFR3_DUAL_BOUNDARY_ARCHITECTURE.md | 23 + ...2_SFR3_DUAL_BOUNDARY_MATERIAL_SELECTION.md | 28 + .../23_SFR3_DUAL_BOUNDARY_FAULT_CAMPAIGN.md | 21 + .../24_SFR3_DUAL_BOUNDARY_PROMOTION_GATES.md | 20 + .../25_SFR4_INTEGRATED_PHYSICAL_CAMPAIGN.md | 33 + .../26_SFR4_HEAT_EXHAUST_RESOLUTION.md | 52 + docs/reactor/27_SFR4_SOLVER_ATTEMPTS.md | 15 + docs/reactor/28_SFR4_PROMOTION_GATES.md | 16 + docs/reactor/29_SFR4_DECISION.md | 24 + external_solvers/README.md | 12 + .../sfr3_dual_boundary_evidence_contract.json | 35 + ...fr3_field_integrity_evidence_contract.json | 35 + .../sfr4_integrated_evidence_contract.json | 69 + .../SFR2_ACTUATION_TECHNICAL_BASIS_2026.json | 28 + ...R3_DUAL_BOUNDARY_TECHNICAL_BASIS_2026.json | 98 ++ ..._FIELD_INTEGRITY_TECHNICAL_BASIS_2026.json | 101 ++ .../SFR4_INTEGRATED_TECHNICAL_BASIS_2026.json | 57 + pyproject.toml | 2 +- results/README.md | 13 +- results/evidence/IXFUSION-POC-001.json | 10 +- .../SFR2_ACTUATION_OVERLAY_A_RESULT.md | 34 + .../sfr2_actuation_overlay_a_v060.json | 1259 +++++++++++++++++ .../SFR3_DUAL_BOUNDARY_AHIS_A_RESULT.md | 34 + .../sfr3_dual_boundary_ahis_a_v080.json | 696 +++++++++ .../SFR3_FIELD_INTEGRITY_SHELL_A_RESULT.md | 24 + .../sfr3_field_integrity_shell_a_v070.json | 501 +++++++ ..._INTEGRATED_PHYSICAL_PROMOTION_A_RESULT.md | 29 + ..._integrated_physical_promotion_a_v090.json | 475 +++++++ sbom.spdx.json | 8 +- .../sfr2_actuation_overlay.schema.json | 28 + .../sfr3_dual_boundary_ahis.schema.json | 56 + .../sfr3_field_integrity_shell.schema.json | 50 + ..._integrated_physical_promotion.schema.json | 34 + scripts/generate_release.py | 6 +- scripts/run_sfr2_actuation_overlay.py | 78 + scripts/run_sfr3_dual_boundary.py | 82 ++ scripts/run_sfr3_field_integrity.py | 64 + scripts/run_sfr4_integrated_campaign.py | 80 ++ scripts/run_zero_arg_tests.py | 97 ++ src/ix_stellaratorforge/__init__.py | 23 + src/ix_stellaratorforge/cli.py | 61 +- src/ix_stellaratorforge/sfr2_actuation.py | 361 +++++ src/ix_stellaratorforge/sfr3_dual_boundary.py | 369 +++++ .../sfr3_field_integrity.py | 370 +++++ .../sfr4_integrated_campaign.py | 560 ++++++++ tests/reactor/test_release_contracts.py | 42 + tests/reactor/test_sfr2_actuation_overlay.py | 94 ++ tests/reactor/test_sfr3_dual_boundary.py | 120 ++ tests/reactor/test_sfr3_field_integrity.py | 96 ++ .../reactor/test_sfr4_integrated_campaign.py | 125 ++ 82 files changed, 8719 insertions(+), 181 deletions(-) create mode 100644 BOM/SFR2_ACTUATION_OVERLAY_BOM.csv create mode 100644 BOM/SFR2_ACTUATION_OVERLAY_BOM.md create mode 100644 BOM/SFR3_DUAL_BOUNDARY_AHIS_BOM.csv create mode 100644 BOM/SFR3_DUAL_BOUNDARY_AHIS_BOM.md create mode 100644 BOM/SFR3_FIELD_INTEGRITY_SHELL_BOM.csv create mode 100644 BOM/SFR3_FIELD_INTEGRITY_SHELL_BOM.md create mode 100644 BOM/SFR4_INTEGRATED_PROMOTION_BOM.csv create mode 100644 BOM/SFR4_INTEGRATED_PROMOTION_BOM.md create mode 100644 configs/reactor/sfr2_actuation_overlay_a.json create mode 100644 configs/reactor/sfr3_dual_boundary_ahis_a.json create mode 100644 configs/reactor/sfr3_field_integrity_shell_a.json create mode 100644 configs/reactor/sfr4_integrated_physical_promotion_a.json create mode 100644 docs/reactor/14_SFR2_PHASE_PROGRAMMED_BREATHING.md create mode 100644 docs/reactor/15_TRILOBE_CONCEPT_TRANSLATION.md create mode 100644 docs/reactor/16_SFR2_ACTUATION_AND_TRILOBE_GATES.md create mode 100644 docs/reactor/17_SFR3_DONOR_TRANSLATION_LEDGER.md create mode 100644 docs/reactor/18_SFR3_FIELD_INTEGRITY_SHELL.md create mode 100644 docs/reactor/19_SFR3_MATERIAL_AND_LIQUID_BRANCHES.md create mode 100644 docs/reactor/20_SFR3_PROMOTION_GATES.md create mode 100644 docs/reactor/21_SFR3_DUAL_BOUNDARY_ARCHITECTURE.md create mode 100644 docs/reactor/22_SFR3_DUAL_BOUNDARY_MATERIAL_SELECTION.md create mode 100644 docs/reactor/23_SFR3_DUAL_BOUNDARY_FAULT_CAMPAIGN.md create mode 100644 docs/reactor/24_SFR3_DUAL_BOUNDARY_PROMOTION_GATES.md create mode 100644 docs/reactor/25_SFR4_INTEGRATED_PHYSICAL_CAMPAIGN.md create mode 100644 docs/reactor/26_SFR4_HEAT_EXHAUST_RESOLUTION.md create mode 100644 docs/reactor/27_SFR4_SOLVER_ATTEMPTS.md create mode 100644 docs/reactor/28_SFR4_PROMOTION_GATES.md create mode 100644 docs/reactor/29_SFR4_DECISION.md create mode 100644 external_solvers/sfr3_dual_boundary_evidence_contract.json create mode 100644 external_solvers/sfr3_field_integrity_evidence_contract.json create mode 100644 external_solvers/sfr4_integrated_evidence_contract.json create mode 100644 provenance/SFR2_ACTUATION_TECHNICAL_BASIS_2026.json create mode 100644 provenance/SFR3_DUAL_BOUNDARY_TECHNICAL_BASIS_2026.json create mode 100644 provenance/SFR3_FIELD_INTEGRITY_TECHNICAL_BASIS_2026.json create mode 100644 provenance/SFR4_INTEGRATED_TECHNICAL_BASIS_2026.json create mode 100644 results/sfr2_actuation/SFR2_ACTUATION_OVERLAY_A_RESULT.md create mode 100644 results/sfr2_actuation/sfr2_actuation_overlay_a_v060.json create mode 100644 results/sfr3_dual_boundary/SFR3_DUAL_BOUNDARY_AHIS_A_RESULT.md create mode 100644 results/sfr3_dual_boundary/sfr3_dual_boundary_ahis_a_v080.json create mode 100644 results/sfr3_field_integrity/SFR3_FIELD_INTEGRITY_SHELL_A_RESULT.md create mode 100644 results/sfr3_field_integrity/sfr3_field_integrity_shell_a_v070.json create mode 100644 results/sfr4_integrated/SFR4_INTEGRATED_PHYSICAL_PROMOTION_A_RESULT.md create mode 100644 results/sfr4_integrated/sfr4_integrated_physical_promotion_a_v090.json create mode 100644 schemas/reactor/sfr2_actuation_overlay.schema.json create mode 100644 schemas/reactor/sfr3_dual_boundary_ahis.schema.json create mode 100644 schemas/reactor/sfr3_field_integrity_shell.schema.json create mode 100644 schemas/reactor/sfr4_integrated_physical_promotion.schema.json create mode 100644 scripts/run_sfr2_actuation_overlay.py create mode 100644 scripts/run_sfr3_dual_boundary.py create mode 100644 scripts/run_sfr3_field_integrity.py create mode 100644 scripts/run_sfr4_integrated_campaign.py create mode 100644 scripts/run_zero_arg_tests.py create mode 100644 src/ix_stellaratorforge/sfr2_actuation.py create mode 100644 src/ix_stellaratorforge/sfr3_dual_boundary.py create mode 100644 src/ix_stellaratorforge/sfr3_field_integrity.py create mode 100644 src/ix_stellaratorforge/sfr4_integrated_campaign.py create mode 100644 tests/reactor/test_sfr2_actuation_overlay.py create mode 100644 tests/reactor/test_sfr3_dual_boundary.py create mode 100644 tests/reactor/test_sfr3_field_integrity.py create mode 100644 tests/reactor/test_sfr4_integrated_campaign.py diff --git a/.github/workflows/quality.yml b/.github/workflows/quality.yml index b783adf..89592cd 100644 --- a/.github/workflows/quality.yml +++ b/.github/workflows/quality.yml @@ -18,4 +18,6 @@ jobs: python -m pip install --upgrade pip python -m pip install -e . pytest - name: IX-StellaratorForge quality gate - run: python check_stellarforge.py + run: | + python -m pytest -q + python check_stellarforge.py diff --git a/BOM/SFR2_ACTUATION_OVERLAY_BOM.csv b/BOM/SFR2_ACTUATION_OVERLAY_BOM.csv new file mode 100644 index 0000000..56829c3 --- /dev/null +++ b/BOM/SFR2_ACTUATION_OVERLAY_BOM.csv @@ -0,0 +1,25 @@ +ID,System,Item,Quantity,Architecture decision,Unresolved sizing,Maturity,Gate +AO01,Baseline,Existing SFR-2 Rev A vessel and blanket,1,"Rigid and unchanged","All nuclear and structural qualification remains open",DEFINED,SFR2A_G8 +AO02,Baseline,Existing primary HTS confinement magnet set,1,"Steady DC operation; not pulse driven","Final conductor current stress quench and irradiation design",DEFINED,SFR2A_G2 +AO03,Actuation,Auxiliary saddle-coil triplet stations,8,"Two stations per ABAB field period",Turns current conductor section and placement,SOLVER_DEPENDENT,SFR2A_G1/G2 +AO04,Actuation,Independent normal-conducting coil circuits,24,"Three phase channels per station",Voltage current inductance bandwidth and insulation,SOLVER_DEPENDENT,SFR2A_G2 +AO05,Actuation,Four-quadrant power-converter channels,24,"Independent reversible current control",Semiconductor topology ratings and switching frequency,HARDWARE_DEPENDENT,SFR2A_G2 +AO06,Actuation,Shared DC link and pulse-energy buffer,1,"Recovers reversible field energy where feasible",Stored energy voltage capacitance protection and enclosure,HARDWARE_DEPENDENT,SFR2A_G2/G7 +AO07,Actuation,Fast dump and crowbar channels,24,"Fail-safe isolation for every actuator circuit",Dump resistance voltage and thermal rating,HARDWARE_DEPENDENT,SFR2A_G2 +AO08,Actuation,Buswork and penetrations,24 circuits,"Low-inductance routed services",Geometry shielding insulation and remote joints,HARDWARE_DEPENDENT,SFR2A_G2/G6 +AO09,Thermal,Actuator deionized-water cooling loops,8,"One independently monitored loop per station",Flow pressure heat exchanger and chemistry,HARDWARE_DEPENDENT,SFR2A_G2/G7 +AO10,Structure,Cyclic electromagnetic support frames,8,"Decoupled from primary HTS supports where feasible",Force spectrum fatigue life displacement and attachment,HARDWARE_DEPENDENT,SFR2A_G2 +AO11,Structure,Vibration and displacement sensors,24,"Three-axis station monitoring",Range bandwidth radiation tolerance and calibration,HARDWARE_DEPENDENT,SFR2A_G2/G8 +AO12,Diagnostics,Mirnov magnetic-probe arrays,8,"Toroidally distributed phase and mode observation",Coil count placement bandwidth and radiation life,SOLVER_DEPENDENT,SFR2A_G1/G5 +AO13,Diagnostics,Flux-loop sets,8,"Local boundary response and eddy-current observation",Loop geometry calibration bandwidth and routing,SOLVER_DEPENDENT,SFR2A_G1/G2 +AO14,Diagnostics,Interferometry channels,4,"Density response over the actuation cycle",Sightlines wavelength vibration isolation and calibration,SOLVER_DEPENDENT,SFR2A_G3/G5 +AO15,Diagnostics,Electron-cyclotron-emission channels,4,"Electron-temperature phase response",Frequency coverage access calibration and radiation protection,SOLVER_DEPENDENT,SFR2A_G3/G5 +AO16,Diagnostics,Diamagnetic-loop system,1,"Global stored-energy response",Geometry compensation bandwidth and calibration,SOLVER_DEPENDENT,SFR2A_G3/G7 +AO17,Controls,Deterministic phase controller,1,"Commands synchronous ABAB-opposed and traveling-quadrature patterns",Clock rate latency redundancy and nuclear qualification,CANDIDATE,SFR2A_G2/G8 +AO18,Controls,Machine-protection interlock interface,1,"Trips actuation without disturbing safe primary-field handling",Setpoints voting logic response time and qualification,HARDWARE_DEPENDENT,SFR2A_G8 +AO19,Controls,Real-time state estimator,1,"Uses field density temperature and structural measurements",Model order compute platform latency and validation,SOLVER_DEPENDENT,SFR2A_G1/G5 +AO20,Electromagnetics,Conducting-structure eddy-current model,1,"Required before actuator current or phase is specified",Full vessel blanket shield and support mesh,SOLVER_DEPENDENT,SFR2A_G2 +AO21,Physics,Time-sliced free-boundary equilibrium campaign,1,"Complete phase cycle for every retained waveform",DESC VMEC++ or justified dynamic-equilibrium workflow,SOLVER_DEPENDENT,SFR2A_G1 +AO22,Physics,Kinetic magnetic-pumping calculation,1,"Must resolve collisionality frequency waveform and phase lag",Kinetic solver profiles and validated absorption model,SOLVER_DEPENDENT,SFR2A_G3 +AO23,Physics,Alpha-orbit and transport campaign,1,"Complete-cycle loss and redistribution assessment",Production orbit neoclassical gyrokinetic and MHD tools,SOLVER_DEPENDENT,SFR2A_G4/G5 +AO24,Systems,Integrated actuator power and burn ledger,1,"Debits converters cooling cryogenics and induced losses",Validated actuator demand and plasma absorption,SOLVER_DEPENDENT,SFR2A_G7 diff --git a/BOM/SFR2_ACTUATION_OVERLAY_BOM.md b/BOM/SFR2_ACTUATION_OVERLAY_BOM.md new file mode 100644 index 0000000..12cb3ca --- /dev/null +++ b/BOM/SFR2_ACTUATION_OVERLAY_BOM.md @@ -0,0 +1,18 @@ +# SFR-2 Actuation Overlay A BOM + +This is the architecture-level build inventory for testing phase-programmed magnetic breathing and a repeated poloidal tri-lobe actuator harmonic without changing the SFR-2 Rev A baseline. + +## Locked architectural decisions + +1. The vacuum vessel, blanket and primary HTS confinement magnets remain rigid. +2. The primary HTS magnet current remains steady DC. +3. Eight auxiliary normal-conducting saddle-coil triplet stations are screened, two per ABAB field period. +4. Twenty-four independently driven circuits permit synchronous, ABAB-opposed and traveling-quadrature waveforms. +5. No actuator current, field amplitude, voltage, stored energy, conductor size, cooling rate or support load is claimed before equilibrium and electromagnetic solves. +6. The actuator package cannot be promoted without full-cycle topology, kinetic, alpha-orbit, MHD, eddy-current, fatigue and integrated-power evidence. + +## Meaning of “proper BOM” at this stage + +The companion CSV is complete for the selected test architecture at system level. It is not a procurement or fabrication BOM. Ratings and dimensions that would require a solved magnetic field, conducting-structure response or hardware qualification are explicitly marked solver-dependent or hardware-dependent instead of being invented. + +The main SFR-2 design is not replaced by this overlay. A rejected overlay leaves the v0.5.0 SFR-2 Rev A evidence unchanged. diff --git a/BOM/SFR3_DUAL_BOUNDARY_AHIS_BOM.csv b/BOM/SFR3_DUAL_BOUNDARY_AHIS_BOM.csv new file mode 100644 index 0000000..6a7a3d0 --- /dev/null +++ b/BOM/SFR3_DUAL_BOUNDARY_AHIS_BOM.csv @@ -0,0 +1,65 @@ +ID,System,Item,Quantity_or_basis,Material_or_technology,Disposition,Direct_confinement_role,Authority,Qualification_required +DBI-001,Inner stack,Segmented plasma-facing armor,TBD by CAD,Qualified tungsten baseline,KEEP,None,Candidate,High-heat-flux erosion joining and neutron lifetime +DBI-002,Inner stack,Long-fiber Wf-W witness coupon,At least one replaceable coupon per material campaign,Long-fiber tungsten-reinforced tungsten,DEFER,None,Research candidate,Fusion-neutron and cyclic heat-flux qualification +DBI-003,Inner stack,Armor-to-structure transition,TBD by FEA,Functionally graded W-to-RAFM candidate,NEW,None,Low-authority candidate,Joining thermal fatigue irradiation and fracture qualification +DBI-004,Inner stack,Helium-cooled first-wall structure,TBD by CAD,ODS-Eurofer or qualified RAFM steel,KEEP,None,Reference candidate,Pressure boundary creep fatigue and code qualification +DBI-005,Inner stack,First-wall helium channels,TBD by CFD,RAFM microchannels and high-pressure helium,KEEP,None,Candidate,CFD pressure-drop leak and heat-transfer validation +DBI-006,Breeding blanket,Breeder and neutron multiplier,TBD by neutronics,Enriched PbLi,KEEP,None,Reference candidate,TBR MHD tritium corrosion and safety closure +DBI-007,Breeding blanket,Blanket cassette structure,24 sectorized families,RAFM or ODS-Eurofer,KEEP,None,Candidate,Structural and neutron lifetime qualification +DBI-008,Breeding blanket,Flow-channel insert,TBD by MHD model,SiC composite or alumina electrical barrier,KEEP,None,Candidate,PbLi compatibility irradiation hermeticity and MHD tests +DBI-009,Vacuum boundary,Inner vessel skin,TBD by structural design,316LN-class nuclear stainless or qualified low-activation alternative,KEEP,None,Candidate,Electromagnetic load weld and irradiation qualification +DBI-010,Vacuum boundary,Inter-wall ribs and spacers,TBD by structural design,Qualified stainless or hybrid nonmagnetic structure,KEEP,None,Candidate,Buckling fatigue and field-perturbation analysis +DBI-011,Vacuum boundary,Outer vessel skin,TBD by structural design,316LN-class nuclear stainless,KEEP,None,Candidate,Leak-before-break and weld qualification +DBI-012,Vacuum boundary,Evacuated monitored interspace,One continuous volume with 24 isolatable monitoring zones,Vacuum plumbing and helium leak-test ports,NEW,None,Architecture candidate,Leak sensitivity conductance and isolation tests +DBI-013,Neutron shield,Inner high-density shield,TBD by OpenMC,Tungsten carbide,KEEP,None,Candidate,Full 3-D neutronics heating stress and activation +DBI-014,Neutron shield,Absorber layer,TBD by OpenMC,Boron carbide,KEEP,None,Candidate,Full 3-D neutronics and joining qualification +DBI-015,Neutron shield,Local magnet-adjacent hydride option,Only where OpenMC promotes it,HfH1.7 in stainless or MgO matrix,DEFER,None,Cross-architecture candidate,Stellarator-specific neutronics thermal stability and corrosion +DBI-016,Thermal isolation,Vessel-to-magnet thermal shield,TBD by cryogenic model,Helium-cooled polished stainless panels,KEEP,None,Reference candidate,Cryogenic heat-load and radiation qualification +DBI-017,Cryogenic boundary,Cryostat,TBD by CAD,Nonmagnetic stainless and multilayer insulation,KEEP,None,Candidate,Vacuum structural and thermal qualification +DBI-018,Magnetic system,Primary confinement coils,Preserved SFR-1 basis,Cu-stabilized REBCO,KEEP,Direct field source,Reference candidate,Physical coil optimization radiation lifetime stress strain and quench +DBI-019,Magnetic system,Monitored coil support shell,TBD by coil-support co-design,High-strength nonmagnetic alloy or qualified composite,ADAPT,Preserves field geometry indirectly,Candidate,Coupled electromagnetic structural and modal FEA +DBI-020,Inner AHIS,Localized temperature sensors,384 elements at 192 locations across lanes A and B,Mineral-insulated thermocouple or qualified equivalent,NEW,None,Architecture count,Radiation drift response time calibration and feedthrough tests +DBI-021,Inner AHIS,Localized first-wall strain sensors,384 elements at 192 locations across lanes A and B,All-metal packaged or radiation-qualified optical strain sensor,NEW,None,Architecture count,Temperature compensation irradiation bonding and calibration +DBI-022,Inner AHIS,Sector magnetic flux loops,48 elements across 24 sectors and two lanes,Mineral-insulated conductor with ceramic feedthrough,NEW,Measures disturbance for field correction,Candidate,Magnetic response radiation and vacuum qualification +DBI-023,Inner AHIS,Sector coolant-state channels,48 redundant channel groups,Pressure flow temperature and differential-pressure instrumentation,NEW,None,Candidate,Helium leak response radiation and calibration +DBI-024,Inner AHIS,Protected inner feedthrough assemblies,48 dual-barrier groups,Double-seal ceramic-to-metal feedthrough with monitored interspace,NEW,None,Candidate,Helium leak high-voltage thermal-cycle and neutron qualification +DBI-025,Inner AHIS,Local signal conditioning,TBD by radiation map,Radiation-tolerant analog front ends outside highest-dose region,NEW,None,Candidate,Dose noise drift latency and failure-mode qualification +DBI-026,Inner AHIS,Lane A acquisition network,One independent network per four-field-period architecture,Diverse deterministic acquisition and isolated power,NEW,None,Candidate,Hardware-in-loop timing and common-cause analysis +DBI-027,Inner AHIS,Lane B acquisition network,One diverse independent network per four-field-period architecture,Diverse deterministic acquisition and isolated power,NEW,None,Candidate,Hardware-in-loop timing and common-cause analysis +DBI-028,Outer AHIS,Localized vessel and support strain sensors,384 elements at 192 locations across lanes A and B,Radiation-qualified optical strain sensing,NEW,None,Architecture count,Irradiation temperature compensation attachment and calibration +DBI-029,Outer AHIS,Localized alignment displacement sensors,384 elements at 192 locations across lanes A and B,Optical interferometric or qualified inductive displacement sensing,NEW,Preserves field geometry indirectly,Architecture count,Magnetic compatibility radiation calibration and line-of-sight tests +DBI-030,Outer AHIS,Sector vibration channels,48 elements across 24 sectors and two lanes,Fiber-optic or radiation-isolated accelerometry,NEW,None,Candidate,Measured FRF placement bandwidth and radiation qualification +DBI-031,Outer AHIS,Interspace pressure and leak channels,48 elements across 24 sectors and two lanes,Vacuum pressure and helium mass-spectrometry interfaces,NEW,None,Candidate,Minimum detectable leak latency and false-alarm tests +DBI-032,Outer AHIS,Independent hard-vacuum channels,8 channels at two per field period,Diverse hardwired vacuum instruments,NEW,None,Architecture count,Independent trip validation +DBI-033,Outer AHIS,Neutron and gamma dosimetry,At least one calibrated package per sector,Passive and active radiation dosimeters,NEW,None,Candidate,Dose-to-damage correlation and calibration +DBI-034,Outer AHIS,Absolute alignment fiducials,TBD by metrology plan,Remote optical and kinematic reference targets,NEW,Preserves field geometry indirectly,Candidate,Radiation stability remote visibility and calibration +DBI-035,Outer AHIS,Periodic guided-wave NDE ports,At least one accessible path per replaceable sector,Remote laser or qualified ultrasonic inspection interface,NEW,None,Research candidate,Crack sensitivity baseline drift and inspection coverage +DBI-036,Outer AHIS,Port-based thermal imaging,TBD by optical access,Radiation-hard optics with remotely replaceable detectors,DEFER,None,Research candidate,Calibration deposition neutron damage and sightline protection +DBI-037,Control,State estimator lane A,One deterministic instance,Validated confidence-aware estimator,ADAPT,None,AHIS translation,Formal requirements calibration and fault injection +DBI-038,Control,State estimator lane B,One diverse deterministic instance,Diverse validated estimator,ADAPT,None,AHIS translation,Independence and common-cause analysis +DBI-039,Control,Independent hard watchdog,Two diverse hard channels,Safety PLC FPGA or hardwired protection,ADAPT,None,IX-Breath translation,Formal verification latency and independence +DBI-040,Control,First-wall helium isolation valves,Two isolation boundaries per sector where hydraulic topology permits,Fast qualified helium valves,NEW,None,Candidate,Leak isolation pressure loss radiation and fail-position tests +DBI-041,Control,PbLi sector isolation and drain system,TBD by blanket topology,High-temperature compatible valves drain tank and freeze protection,NEW,None,Candidate,MHD corrosion tritium and loss-of-power tests +DBI-042,Control,Passive hard shutdown path,At least one diverse path per field period,De-energized-to-safe interlock architecture,NEW,None,Candidate,Loss-of-power and common-cause testing +DBI-043,Control,SFR-3 active-trim interface,24 bounded command channels,Existing SFR-3 trim-coil control,ADAPT,Direct correction field source,Low-authority link,CAD-linked response equilibrium and island validation +DBI-044,Control,Primary and trim quench interface,All superconducting circuits,Diverse quench detection and energy extraction,KEEP,None,Candidate,Integrated quench and fault-propagation testing +DBI-045,Control,Evidence recorder,Two independent recorders,Time-synchronized write-once configuration and telemetry,ADAPT,None,AHIS assurance,Timing cybersecurity calibration and traceability +DBI-046,Control,Protected control power,Independent UPS and passive trip energy,Qualified batteries capacitors or flywheel outside radiation zone,NEW,None,Candidate,Seismic fire radiation and endurance qualification +DBI-047,Maintenance,Replaceable wall and blanket cassette,24 service sectors aligned with control sectors,Remote-handled RAFM and shield modules,NEW,None,Candidate,Activation remote handling alignment and replacement demonstration +DBI-048,Maintenance,Kinematic remote-handling interface,One standardized interface family,Nonmagnetic precision features and robotic tooling,NEW,Preserves field geometry indirectly,Candidate,Repeatable alignment hot-cell and contamination testing +DBI-049,Maintenance,Periodic NDE tooling,One remote tool family plus spares,Laser ultrasonics eddy-current or qualified multi-method inspection,NEW,None,Candidate,Probability-of-detection campaign on representative irradiated flaws +DBI-050,Maintenance,Sensor calibration spool and reference standards,One set per sensor technology,Traceable thermal strain vacuum flow and magnetic standards,NEW,None,Candidate,Calibration interval and drift model +DBI-051,Maintenance,Material witness coupons,One monitored set per sector family,W RAFM joint SiC coating and sensor attachment coupons,NEW,None,Candidate,Exposure correlation and destructive post-irradiation examination +DBI-052,Maintenance,Helium leak-test ports,At least two per isolatable interspace zone,Double-valved qualified vacuum ports,NEW,None,Candidate,Factory and in-service sensitivity testing +DBI-053,Safety,Helium purge and recovery,TBD by inventory,Closed recovery train with monitored isolation,KEEP,None,Candidate,Loss-of-coolant and confinement analysis +DBI-054,Safety,Tritium and radioactive inventory monitors,Diverse monitors at vacuum coolant and interspace boundaries,Ionization proportional or optical methods as qualified,KEEP,None,Candidate,Cross-sensitivity calibration and safety classification +DBI-055,Rejected inner sensor,PVDF film directly behind plasma-facing armor,0,Unqualified polymer piezoelectric film,REJECT,None,No credit,Neutron temperature vacuum outgassing and lifetime incompatible until proven +DBI-056,Rejected wall fluid,PressureX shear-thickening layer inside first wall,0,Shear-thickening fluid,REJECT,None,No credit,Not compatible with plasma-facing heat neutron and vacuum environment +DBI-057,Rejected actuator,Mechanical inward-pressure actuator,0,Hydraulic pneumatic or bellows compression,REJECT,None,No credit,Cannot chase plasma dynamics or restore magnetic surfaces +DBI-058,Alternate wall stack,Water-cooled W-Cu-CuCrZr branch,One retained comparison,Pressurized water W-Cu FGM and CuCrZr,DEFER,None,Low-authority comparison,Water-PbLi accident integration copper lifetime and 3-D design +DBI-059,Alternate wall stack,High-temperature W-SiCf-SiC branch,One retained comparison,Helium-cooled SiCf-SiC structure,DEFER,None,Low-authority comparison,Joining hermeticity code path irradiation and manufacturing maturity +DBI-060,Alternate armor,Full Wf-W armor deployment,0 baseline deployment,Long-fiber tungsten-reinforced tungsten,DEFER,None,Research candidate,Reactor-scale joining erosion tritium and neutron lifetime +DBI-061,Separate edge branch,Liquid-lithium surface layer,0 baseline deployment,Controlled local lithium divertor cassette,SEPARATE,None,Experimental branch,Vapor MHD corrosion impurity tritium and exhaust tests +DBI-062,Rejected armor claim,Diamond confinement liner,0,Diamond or CVD diamond,REJECT,None,No credit,May only return as an independently qualified PFC coating +DBI-063,Field co-design,Ferromagnetic material representation,Every RAFM and shield CAD volume,Saturated dipole or validated finite-element model,NEW,Preserves field geometry indirectly,Candidate,CAD-linked validation and differentiable coil correction +DBI-064,Facility boundary,Secondary building confinement and filtered ventilation,One facility system,Reinforced low-activation-compatible structure and filtered detritiation ventilation,KEEP,None,Plant safety candidate,Integrated source-term fire seismic and licensing analysis diff --git a/BOM/SFR3_DUAL_BOUNDARY_AHIS_BOM.md b/BOM/SFR3_DUAL_BOUNDARY_AHIS_BOM.md new file mode 100644 index 0000000..6b5363c --- /dev/null +++ b/BOM/SFR3_DUAL_BOUNDARY_AHIS_BOM.md @@ -0,0 +1,32 @@ +# SFR-3 Dual Boundary AHIS bill of materials + +The companion CSV contains 64 architecture rows. It is a design inventory, not a procurement or fabrication BOM. + +## Selected layer sequence + +From the plasma outward: + +1. segmented qualified tungsten armor, with Wf/W used only as a replaceable qualification coupon; +2. a solver-dependent graded tungsten-to-RAFM transition; +3. helium-cooled ODS-Eurofer or qualified RAFM first-wall structure; +4. a sectorized PbLi DCLL breeder blanket with SiC or alumina flow-channel inserts; +5. an inner vessel skin, monitored evacuated interspace and outer vessel skin; +6. WC and B4C neutron shielding, with local HfH1.7 retained only if 3-D neutronics promotes it; +7. a helium-cooled thermal shield and cryostat; and +8. copper-stabilized REBCO coils on a monitored nonmagnetic support shell. + +This is eight functional layers but only two independently monitored safety and integrity boundaries: the protected inner first-wall/blanket boundary and the outer vessel/shield/support boundary. + +## Monitoring count + +- 24 toroidal sectors aligned with the existing 24 SFR-3 trim channels; +- eight poloidal monitoring locations per sector; +- 192 paired inner and outer locations; +- two independent sensing lanes; +- 1,736 declared sensing elements after localized, sector and hard-vacuum channels are counted. + +The count is an observability architecture, not a final cable or feedthrough count. Multiplexing, radiation placement, maintenance access and common-cause failures remain engineering work. + +## Explicit exclusions + +PVDF directly behind the armor, a PressureX fluid layer, mechanical inward-pressure actuators, diamond confinement and full unqualified Wf/W deployment are not baseline components. The water-cooled W/Cu/CuCrZr and high-temperature SiC wall stacks remain documented comparison branches. diff --git a/BOM/SFR3_FIELD_INTEGRITY_SHELL_BOM.csv b/BOM/SFR3_FIELD_INTEGRITY_SHELL_BOM.csv new file mode 100644 index 0000000..086d12e --- /dev/null +++ b/BOM/SFR3_FIELD_INTEGRITY_SHELL_BOM.csv @@ -0,0 +1,53 @@ +ID,System,Item,Quantity,Primary_material_or_technology,Disposition,Confinement_function,Authority,Donor_translation,Qualification_required +FIS-001,Primary field,Main confinement conductor,TBD,Cu-stabilized REBCO coated conductor,KEEP,Direct magnetic field source,Reference candidate,None,Full coil design and irradiation lifetime +FIS-002,Primary field,Conductor stabilizer,TBD,High-purity copper,KEEP,Protects field source during transients,Reference candidate,None,Quench and radiation testing +FIS-003,Primary field,Coil case,TBD,High-strength nonmagnetic steel or qualified composite,KEEP,Maintains coil geometry,Reference candidate,AHIS structural monitoring,Integrated stress FEA +FIS-004,Primary field,Turn insulation,TBD,Ceramic-polymer or all-ceramic radiation-qualified insulation,KEEP,Electrical integrity only,Candidate,None,Cryogenic irradiation qualification +FIS-005,Primary field,Cryostat and thermal shield,TBD,Nonmagnetic stainless and multilayer insulation,KEEP,Cryogenic support only,Candidate,IX-GCR-SPE protected-zone logic,3-D thermal and neutronics model +FIS-006,Primary field,Coil support and clamps,TBD,Nonmagnetic high-strength alloy or composite,ADAPT,Preserves magnetic alignment,Candidate,IX-Vibe modal control,Joint coil-support optimization and FEA +FIS-007,Active correction,Planar trim-coil cassette,24,Individually driven planar coils,NEW,Corrects measured error harmonics,Low-authority architecture,IX-Vibe targeted-mode translation,CAD-linked Biot-Savart response +FIS-008,Active correction,Trim-coil conductor,24 circuits,Cu-stabilized REBCO or qualified copper depending field and temperature,NEW,Active correction field source,Candidate,AHIS actuator authority,Electromagnetic and cryogenic trade study +FIS-009,Active correction,Bipolar current supply,24 channels,Four-quadrant regulated power electronics,NEW,Commands bounded harmonic corrections,Candidate,IX-Breath resource gate,Efficiency and fault testing +FIS-010,Active correction,Current transducer,24 plus spares,DCCT or radiation-qualified equivalent,NEW,Closes current-control loop,Candidate,AHIS observability,Radiation and calibration testing +FIS-011,Active correction,Energy extraction circuit,24 channels,Dump resistor and isolated switch,NEW,Removes trim-coil stored energy,Candidate,IX-Breath safe hold,Quench validation +FIS-012,Active correction,Quench detector,24 plus redundant,Radiation-qualified differential-voltage system,NEW,Blocks unsafe correction,Candidate,AHIS fault detection,False-positive and latency tests +FIS-013,Active correction,Thermal sensors,TBD,Cryogenic fiber or qualified resistive sensors,NEW,Enforces thermal resource gate,Candidate,AHIS monitoring,Cryogenic radiation qualification +FIS-014,Passive correction,Flux-conserving superconducting loop,24,REBCO loop with protected joint concept,NEW,Attenuates time-varying field error only,Research candidate,IX-Vibe passive response,Physical optimization and quench testing +FIS-015,Passive correction,Loop joint or switch,24,Low-resistance superconducting joint or persistent switch,NEW,Enables induced current path,Research candidate,None,Cyclic and irradiation qualification +FIS-016,Passive correction,Loop support and insulation,24,Nonmagnetic cryogenic structure,NEW,Preserves passive-loop geometry,Candidate,IX-Vibe structural control,Stress and quench FEA +FIS-017,Passive correction,Loop health monitor,24,Voltage temperature and flux sensing,NEW,Removes passive credit after a fault,Candidate,AHIS confidence logic,Detection coverage analysis +FIS-018,Diagnostics,Boundary magnetic pickup array,TBD,Mineral-insulated pickup coils,NEW,Estimates error-field harmonics,Candidate,AHIS distributed sensing,Response calibration in representative field +FIS-019,Diagnostics,Flux-loop array,TBD,Mineral-insulated conductor and ceramic feedthrough,NEW,Tracks slow magnetic state,Candidate,AHIS distributed sensing,Radiation drift testing +FIS-020,Diagnostics,Primary-coil current metrology,All circuits,DCCT and redundant shunts,KEEP,Separates current error from geometry error,Candidate,AHIS state estimation,System calibration +FIS-021,Diagnostics,Cryogenic strain sensors,TBD,Radiation-qualified fiber Bragg grating array,NEW,Detects support deformation,Candidate,AHIS structural health monitoring,Cryogenic neutron qualification +FIS-022,Diagnostics,Support-motion sensors,TBD,Fiber interferometric or qualified displacement sensors,NEW,Detects modal alignment error,Candidate,IX-Vibe measured FRF,Integrated modal test +FIS-023,Control,Confidence-aware state estimator,2 independent,Deterministic validated control computer,NEW,Permits correction only with credible state,Candidate,AHIS observability,Hardware-in-loop fault campaign +FIS-024,Control,Independent watchdog,2 diverse,Safety PLC or FPGA with hard interlocks,NEW,Forces safe hold on control fault,Candidate,IX-Breath FDIR,Diversity and common-cause analysis +FIS-025,Control,Bounded state machine,1 validated baseline,Nominal Active-trim Passive-only Safe-hold Service states,NEW,Prevents uncontrolled field actuation,Candidate,IX-Breath bounded states,Formal verification +FIS-026,Structural control,All-metal tuned mass damper,TBD,Nonmagnetic alloy spring and proof mass,ADAPT,Suppresses measured warm-support modes,Candidate,IX-Vibe targeted damping,FRF-driven placement and fatigue test +FIS-027,Structural control,Eddy-current damper,TBD,Copper conductor with non-field-distorting magnet arrangement,DEFER,Damps warm-side support motion only,Candidate,PressureX rate-dependent load shaping,Magnetic compatibility review +FIS-028,Structural control,Piezoelectric shunt damper,TBD,Radiation-isolated warm-side piezo stack,DEFER,Damps narrow support resonances only,Candidate,AHIS and IX-Vibe shunt control,FRF authority and lifetime tests +FIS-029,Structural control,Alignment fiducials,TBD,Optical and metrology targets outside radiation hot zone,NEW,Tracks as-built geometry,Candidate,AHIS health baseline,Remote metrology demonstration +FIS-030,Magnet shield,Inner fast-neutron shield,TBD,Tungsten carbide,KEEP,Protects REBCO and cryogenics not plasma confinement,Candidate,IX-GCR-SPE graded protection,Full 3-D OpenMC optimization +FIS-031,Magnet shield,Neutron absorber layer,TBD,Boron carbide,KEEP,Absorbs slowed neutrons not plasma,Candidate,IX-Shield layered bookkeeping,Full 3-D OpenMC optimization +FIS-032,Magnet shield,Magnet-adjacent hydride composite,TBD,Stainless or MgO matrix with HfH1.7,DEFER,Potential local fast-neutron protection,Cross-architecture research,IX-GCR-SPE protected-zone logic,Stellarator-specific OpenMC corrosion and thermal qualification +FIS-033,Magnet shield,Shield health instrumentation,TBD,Thermometry leak detection and dosimetry,NEW,Validates protective state,Candidate,IX-GCR-SPE fill and leak monitoring,Radiation-qualified instrumentation +FIS-034,Magnet shield,Penetration labyrinth and local plugs,TBD,WC B4C and qualified structural matrix,NEW,Closes weak streaming paths,Candidate,IX-Shield weak-direction logic,Port-resolved 3-D neutronics +FIS-035,Blanket,Breeder coolant inventory,TBD,Enriched PbLi with helium-cooled alternative retained,KEEP,Breeds tritium and removes neutron heat,Reference candidate,None,MHD corrosion TBR and safety closure +FIS-036,Blanket,Load-bearing blanket structure,TBD,ODS-Eurofer or qualified RAFM steel,KEEP,Structural and low-activation function,Candidate,HfTaZen layered load paths,Code qualification and ferromagnetic field model +FIS-037,Blanket,Flow-channel electrical insert,TBD,SiC composite or alumina barrier,KEEP,Reduces PbLi MHD drag,Candidate,None,Compatibility and irradiation testing +FIS-038,Blanket,Helium cooling circuit,TBD,High-pressure helium and qualified piping,KEEP,Heat removal only,Candidate,IX-Breath resource accounting,Plant thermal-hydraulic closure +FIS-039,Plasma-facing,Segmented first-wall armor,TBD,Tungsten family,KEEP,Survives edge contact but does not confine,Candidate,HfTaZen segmentation,High-heat-flux and neutron testing +FIS-040,Plasma-facing,Toughened armor option,TBD,Long-fiber tungsten-reinforced tungsten,DEFER,Damage-resilient wall option only,Research candidate,HfTaZen strain decoupling,Fusion-neutron and joining qualification +FIS-041,Plasma-facing,Armor heat-sink interface,TBD,Graded or serrated W-Cu interface,DEFER,Transfers wall heat only,Research candidate,HfTaZen compliant interface,High-cycle thermal testing +FIS-042,Plasma-facing,Wall conditioning,TBD,Nanometer boron film or controlled boron powder,DEFER,Reduces impurity and oxygen burden indirectly,Experimental candidate,None,Stellarator-relevant plasma campaign +FIS-043,Divertor,Optional flowing liquid-lithium module,Local test cassette,Thin controlled lithium surface with compatible substrate,DEFER,Edge recycling and exhaust only; zero core confinement credit,Experimental branch,PressureX sealed-fluid discipline,MHD vapor corrosion tritium and contamination tests +FIS-044,Rejected concept,Diamond inner liner,0,Diamond or CVD diamond,REJECT,No magnetic confinement function,No credit,None,PFC research only outside this architecture +FIS-045,Rejected concept,Glitter or conductive particulate,0,Any grade,REJECT,Contaminates plasma and cannot form flux surfaces,No credit,None,No promotion path +FIS-046,Rejected concept,Dense liquid confinement shell,0,Any passive liquid,REJECT,Mass density does not confine charged fusion plasma,No credit,PressureX donor boundary,Separate magneto-inertial architecture required +FIS-047,Rejected concept,Flexible breathing vacuum vessel,0,Metal bellows or pressure shell,REJECT,Cannot safely chase plasma timescales and disturbs geometry,No credit,IX-Breath donor boundary,No promotion path for SFR-1 overlay +FIS-048,Alternate field source,Permanent-magnet shaping array,TBD,High-coercivity rare-earth magnets,DEFER,Can shape field if it is an actual field source,Research candidate,IX-Shield geometry logic,Radiation temperature demagnetization and maintainability tests +FIS-049,Separate architecture,Imploding liquid or solid lithium liner,0 in SFR-3,Magnetized-target compression liner,SEPARATE,Compression confinement for a pulsed MTF machine only,External concept,None,Must not be merged with steady-state stellarator claim +FIS-050,Field co-design,Ferromagnetic blanket contribution model,1 solver input,Saturated dipole or validated finite-element representation,NEW,Accounts for steel-induced field perturbation,Candidate,AHIS disturbance estimation,CAD-linked differentiable field validation +FIS-051,Maintenance,Replaceable correction and shield cassette,TBD,Remote-handled nonmagnetic module,NEW,Maintains field integrity and shielding availability,Candidate,IX-GCR-SPE protected-zone logic,Remote handling and activation study +FIS-052,Evidence,Configuration and fault-evidence recorder,2 independent,Write-once run metadata and calibrated telemetry,NEW,Preserves falsifiable commissioning evidence,Candidate,AHIS and IX-Breath assurance,Cybersecurity timing and traceability validation diff --git a/BOM/SFR3_FIELD_INTEGRITY_SHELL_BOM.md b/BOM/SFR3_FIELD_INTEGRITY_SHELL_BOM.md new file mode 100644 index 0000000..58775ce --- /dev/null +++ b/BOM/SFR3_FIELD_INTEGRITY_SHELL_BOM.md @@ -0,0 +1,25 @@ +# SFR-3 Field Integrity Shell bill of materials + +`SFR3_FIELD_INTEGRITY_SHELL_BOM.csv` is a 52-row architecture inventory. It is not a procurement list and does not assert dimensions, prices, operating lifetime or supplier qualification. + +## Design decision + +The only entries that directly create confinement fields are the primary coils, active trim coils, passive superconducting loops when responding to changing flux, and the deferred permanent-magnet option. Walls, liquids, shielding and damping hardware may protect or preserve the magnetic system but receive zero direct confinement credit. + +The baseline branch uses: + +- steady copper-stabilized REBCO primary coils; +- 24 individually driven correction channels; +- 24 passive superconducting loops as a research option for transient errors only; +- independent magnetic, current, quench, strain and support-motion observability; +- fail-closed resource-gated control; +- warm-side structural-mode suppression; +- WC/B4C shielding with HfH composite retained only as a solver-dependent local option; +- segmented tungsten-family plasma-facing components; and +- the existing PbLi / RAFM / SiC-or-alumina blanket family. + +## Excluded combinations + +Diamond, glitter, passive dense liquids and a flexible pressure-driven vessel are explicitly rejected as confinement mechanisms. Liquid lithium is retained only as a controlled divertor or edge-conditioning experiment. An imploding lithium liner belongs to a separate pulsed magnetized-target-fusion machine and is not merged into SFR-3. + +Every `NEW`, `DEFER` or `SEPARATE` row has a named qualification requirement. No row closes a physical fusion gate by inclusion in this BOM. diff --git a/BOM/SFR4_INTEGRATED_PROMOTION_BOM.csv b/BOM/SFR4_INTEGRATED_PROMOTION_BOM.csv new file mode 100644 index 0000000..2caae55 --- /dev/null +++ b/BOM/SFR4_INTEGRATED_PROMOTION_BOM.csv @@ -0,0 +1,65 @@ +id,workstream,component,selected_material_or_tool,function,status,evidence_gate +SFR4-001,physical_coil_field,primary_conductor,copper-stabilized REBCO coated conductor,generate primary confinement field,KEEP,conductor Ic B T angle and irradiation qualification +SFR4-002,physical_coil_field,conductor_substrate,qualified high-strength nonmagnetic coated-conductor substrate,carry tape strain,KEEP,lot-specific properties required +SFR4-003,physical_coil_field,winding_insulation,radiation-resistant ceramic or cyanate-ester system,electrical isolation,DEFER,irradiation and cryogenic dielectric tests +SFR4-004,physical_coil_field,winding_pack_case,high-strength nonmagnetic steel or composite,react electromagnetic loads,KEEP,3-D structural FEA +SFR4-005,physical_coil_field,trim_coils,copper water-cooled planar trim set,correct measured field errors,KEEP,CAD-linked response matrix +SFR4-006,physical_coil_field,passive_loops,superconducting transient loops,attenuate time-varying field errors,KEEP,quench and coupling tests +SFR4-007,physical_coil_field,field_model,in-repo filament Biot-Savart,execute falsification scan,EXECUTED,intermediate authority only +SFR4-008,physical_coil_field,coil_CAD,configuration-controlled 3-D centerlines,replace analytic curves,NEW,required before physical promotion +SFR4-009,finite_beta_equilibrium,DESC,DESC production solver,solve finite-beta force balance,REQUIRED,not installed in build runtime +SFR4-010,finite_beta_equilibrium,VMEC++,VMEC++ production solver,cross-check finite-beta equilibrium,REQUIRED,not installed in build runtime +SFR4-011,finite_beta_equilibrium,equilibrium_inputs,versioned VMEC-family seed pack,define candidate pressure flux and boundary,KEEP,inputs complete +SFR4-012,finite_beta_equilibrium,convergence_receipt,raw solver output plus residual ledger,prevent unverifiable pass claims,NEW,requires production execution +SFR4-013,finite_beta_equilibrium,island_analysis,SPEC or validated equivalent,quantify islands and stochastic regions,DEFER,requires converged equilibrium +SFR4-014,finite_beta_equilibrium,stability_analysis,validated ideal and resistive MHD tools,test stability limits,DEFER,requires converged equilibrium +SFR4-015,finite_beta_equilibrium,cross_code_comparator,in-repo receipt validator,compare geometry iota beta and force balance,KEEP,requires two real outputs +SFR4-016,finite_beta_equilibrium,free_boundary_model,coils vessel blanket and trim response,include engineering perturbations,NEW,requires physical coil CAD +SFR4-017,coil_plasma_codesign,SIMSOPT,SIMSOPT production optimization,stage-two or single-stage coil optimization,REQUIRED,not installed in build runtime +SFR4-018,coil_plasma_codesign,boundary_variables,Fourier plasma boundary degrees of freedom,search equilibrium geometry,NEW,production solver required +SFR4-019,coil_plasma_codesign,coil_variables,Fourier or spline coil centerlines,search buildable winding geometry,NEW,production solver required +SFR4-020,coil_plasma_codesign,normal_field_objective,held-out B-normal metric,reject poor field reconstruction,EXECUTED,current family fails +SFR4-021,coil_plasma_codesign,clearance_objective,plasma blanket shield and coil distances,preserve nuclear island and maintenance space,KEEP,CAD validation required +SFR4-022,coil_plasma_codesign,curvature_objective,REBCO centerline curvature and tape frame,limit hard-way strain,PARTIAL,winding-pack strain optimizer required +SFR4-023,coil_plasma_codesign,tolerance_ensemble,manufacturing and assembly error distributions,optimize robust rather than nominal field,NEW,metrology data required +SFR4-024,coil_plasma_codesign,trim_authority,24-channel physical response matrix,verify correction after errors,NEW,CAD-linked Biot-Savart required +SFR4-025,particle_confinement,alpha_source,3.5 MeV isotropic alpha birth distribution,seed energetic-particle test,PARTIAL,gyroradius scale executed +SFR4-026,particle_confinement,Boozer_transform,BOOZ_XFORM or validated equivalent,construct magnetic coordinates,REQUIRED,converged equilibrium required +SFR4-027,particle_confinement,guiding_center_tracker,collisionless and collisional orbit solver,calculate alpha retention,REQUIRED,not available in build runtime +SFR4-028,particle_confinement,neoclassical_transport,SFINCS KNOSOS or validated equivalent,calculate thermal transport and bootstrap current,REQUIRED,not executed +SFR4-029,particle_confinement,turbulent_transport,GX GENE or validated equivalent,calculate gyrokinetic turbulence,REQUIRED,not executed +SFR4-030,particle_confinement,loss_maps,wall and divertor strike localization,connect losses to heat loads,NEW,orbit and CAD geometry required +SFR4-031,particle_confinement,field_line_screen,in-repo vacuum field-line integrator,reject open or radially wandering candidates,EXECUTED,current family fails transform +SFR4-032,particle_confinement,profile_iteration,coupled source transport loop,find self-consistent profiles,DEFER,transport coefficients required +SFR4-033,self_consistent_burn,deuterium,fuel-cycle qualified deuterium,50 percent fuel-ion assumption,KEEP,fueling profile unresolved +SFR4-034,self_consistent_burn,tritium,closed-cycle bred tritium,50 percent fuel-ion assumption,KEEP,TBR and inventory unresolved +SFR4-035,self_consistent_burn,reactivity,Bosch-Hale D-T fit,calculate Maxwellian reaction rate,EXECUTED,uniform low-authority screen +SFR4-036,self_consistent_burn,alpha_heating,finite alpha-deposition fraction,close plasma heating ledger,PARTIAL,orbit deposition unresolved +SFR4-037,self_consistent_burn,bremsstrahlung,hydrogenic engineering approximation,add explicit radiative loss,EXECUTED,impurity spectrum unresolved +SFR4-038,self_consistent_burn,ECRH,170 GHz-class heating architecture,startup and control heat,KEEP,3-D deposition unresolved +SFR4-039,self_consistent_burn,fueling,high-field-side pellets plus controlled gas,control density and burn fraction,DEFER,penetration model required +SFR4-040,self_consistent_burn,helium_ash_exhaust,island divertor pumping,prevent ash dilution,DEFER,edge and particle balance required +SFR4-041,magnet_and_heat,first_wall_armor,3 mm segmented tungsten,erosion and thermal protection,SELECTED,joining fatigue and irradiation open +SFR4-042,magnet_and_heat,first_wall_transition,1 mm graded W-to-RAFM candidate,reduce material mismatch,SELECTED,coupon qualification open +SFR4-043,magnet_and_heat,first_wall_structure,3 mm ODS-Eurofer or qualified RAFM,carry first-wall loads,SELECTED,code case and irradiation open +SFR4-044,magnet_and_heat,first_wall_coolant,independent high-pressure helium microchannels,remove distributed wall heat,SELECTED,CFD pressure and leak tests open +SFR4-045,magnet_and_heat,divertor_armor,6 mm segmented tungsten monoblock,receive concentrated exhaust heat,SELECTED,cyclic high-heat-flux tests open +SFR4-046,magnet_and_heat,divertor_interlayer,1 mm OFHC copper compliant layer,reduce W-CuCrZr joint stress,SELECTED,fatigue and irradiation open +SFR4-047,magnet_and_heat,divertor_heat_sink,2 mm CuCrZr,spread heat to coolant channels,SELECTED,temperature and irradiation limits open +SFR4-048,magnet_and_heat,divertor_coolant,independent pressurized water loop,remove 91.6 MW declared divertor load,SELECTED,CHF corrosion accident qualification open +SFR4-049,reactor_systems,divertor_topology,24-sector long-leg island-divertor requirement,expand wetted area and support detachment,SELECTED,3-D edge solution not run +SFR4-050,reactor_systems,radiative_exhaust,controlled impurity-seeded detachment requirement,radiate 60 percent of declared plasma exhaust,SELECTED,stable detachment not demonstrated +SFR4-051,reactor_systems,blanket_breeder,enriched PbLi DCLL,breed tritium and carry neutron heat,KEEP,3-D TBR MHD and corrosion open +SFR4-052,reactor_systems,flow_channel_insert,SiC or alumina electrical barrier,reduce PbLi MHD drag and corrosion,KEEP,loop qualification open +SFR4-053,reactor_systems,water_PbLi_isolation,double wall guard vacuum and independent leak detection,prevent direct coolant-breeder contact,SELECTED,accident and leak-rate tests open +SFR4-054,reactor_systems,vacuum_vessel,monitored 316LN-class double-wall vessel,primary vacuum and confinement-independent safety boundary,KEEP,nuclear code case open +SFR4-055,reactor_systems,neutron_shield,graded WC plus B4C,protect vessel and magnets,KEEP,3-D OpenMC optimization open +SFR4-056,reactor_systems,magnet_local_shield,HfH1.7 matrix local option,attenuate residual fast neutrons,DEFER,3-D placement and compatibility open +SFR4-057,reactor_systems,neutronics_solver,OpenMC plus qualified nuclear data,calculate TBR heating damage and streaming,REQUIRED,not installed in build runtime +SFR4-058,reactor_systems,primary_heat_exchanger,helium PbLi and water isolated trains,transfer heat without cross-contamination,NEW,thermohydraulic design open +SFR4-059,reactor_systems,power_cycle,supercritical steam or helium Brayton down-select,convert blanket heat to electricity,DEFER,temperature and materials closure required +SFR4-060,reactor_systems,tritium_plant,extraction cleanup storage and accountability,close fuel cycle,REQUIRED,inventory and safety analysis open +SFR4-061,reactor_systems,remote_maintenance,replaceable divertor and blanket cassettes,service activated components,REQUIRED,CAD access and dose study open +SFR4-062,reactor_systems,heat_instrumentation,dual-lane temperature flow pressure and leak network,detect heat-removal degradation,KEEP,radiation calibration open +SFR4-063,reactor_systems,protection_logic,sector isolation rundown and safe hold,limit fault propagation,KEEP,integrated hardware validation open +SFR4-064,reactor_systems,heat_test_facility,representative high-heat-flux coupon and channel loop,validate thermal model and fatigue,REQUIRED,physical campaign not performed diff --git a/BOM/SFR4_INTEGRATED_PROMOTION_BOM.md b/BOM/SFR4_INTEGRATED_PROMOTION_BOM.md new file mode 100644 index 0000000..1af22f5 --- /dev/null +++ b/BOM/SFR4_INTEGRATED_PROMOTION_BOM.md @@ -0,0 +1,13 @@ +# SFR-4 Integrated Promotion BOM + +This 64-row architecture inventory supports the seven-workstream v0.9 campaign. It is not a procurement BOM. Rows marked `SELECTED` are selected only for the reduced campaign; final dimensions, grades, enrichment, pressure ratings, vendors, part numbers and fabrication drawings remain unresolved. + +The heat architecture keeps three coolant domains independent: + +1. Helium removes distributed first-wall heat. +2. PbLi breeds tritium and removes blanket neutron heat. +3. Water removes concentrated divertor heat through replaceable W/Cu/CuCrZr targets. + +The water and PbLi domains require separate double boundaries, guard vacuum, independent leak detection and no shared penetration or heat exchanger. This reduces a known integration hazard but does not constitute an accident or safety qualification. + +The authoritative row set is `BOM/SFR4_INTEGRATED_PROMOTION_BOM.csv`. diff --git a/CHANGELOG.md b/CHANGELOG.md index 21e02d8..ac0d9fd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,48 @@ # Changelog +## 0.9.0 — 2026-08-22 — Integrated Physical Promotion and Heat Exhaust + +- Attempted all seven requested workstreams in one fail-closed campaign: physical coils, finite-beta equilibrium, coil/plasma co-design, particle confinement, burn, magnet engineering and reactor systems. +- Expanded the physical filament scan to 80 direct Biot-Savart cases. Zero cases pass both transform and radial-excursion gates, so the scanned classical helical family is rejected. +- Explicitly attempted DESC, VMEC++ and OpenMC adapters. Each stopped because its production dependency is unavailable; the package installation route was also blocked by runtime network policy. +- Added a 3.5 MeV alpha gyroradius scope without assigning guiding-center retention credit. +- Added a Q=20 burn requirement with finite alpha deposition and explicit bremsstrahlung; the design-iota requirement is about H_ISS04 2.00 and is not linked to the failed coil family. +- Split heat into first-wall radiation, island-divertor exhaust and blanket neutron heating. +- Selected a separated helium first-wall, PbLi blanket and independent water-cooled W/Cu/CuCrZr divertor architecture. +- Passed the nominal and declared steady reduced heat envelope at about 0.294 MW/m2 first-wall peak and 5.724 MW/m2 divertor peak, while retaining edge topology, transients, CHF, fatigue, irradiation and hardware as open gates. +- Added a 64-row integrated campaign BOM, evidence contract, schema, provenance, decision records and eleven focused regression tests. + +## 0.8.0 — 2026-08-22 — Dual Boundary Integrity Network + +- Translated the proposed inside-out and outside AHIS concept into two independently monitored engineering boundaries without assigning mechanical plasma-confinement credit. +- Added three comparable wall-stack branches and selected a balanced tungsten / graded W-RAFM / helium-cooled RAFM / DCLL reference under explicit reduced-screen weights. +- Added a 1-D nominal and steady-upset thermal-resistance screen with interface temperature and raw CTE-mismatch strain bookkeeping. +- Added 24 toroidal monitoring sectors, 192 paired inner/outer locations, two independent lanes and 1,736 declared sensing elements. +- Added eleven deterministic fault scenarios covering hotspot, coolant leak, support shift, single-lane losses, dual-bus loss, vacuum breach, power loss, trim unavailability and an intentionally undetected silent armor crack. +- Linked measured support displacement to existing bounded SFR-3 trim logic while retaining exactly zero physical confinement, fusion, ignition and safety-qualification credit. +- Added a 64-row integration BOM, materials decision record, fault campaign, promotion gates, technical provenance, high-authority evidence contract, eight model tests and one BOM contract test. + +## 0.7.0 — 2026-08-21 — Field Integrity Shell + +- Audited AHIS, PressureX, IX-Vibe, IX-Breath, IX-GCR-SPE, IX-Shield and IX-HfTaZen-Shield as mechanism donors with explicit KEEP / ADAPT / DEFER / REJECT boundaries. +- Added SFR-3 Field Integrity Shell A: steady primary confinement coils, 24 independent planar trim channels, 24 passive superconducting-loop research channels, confidence-aware sensing and fail-closed control. +- Added a deterministic 12-by-24 harmonic controllability screen with bounded commands, nominal, single-actuator-failure, low-confidence, passive-loop-quench and passive-only transient scenarios. +- Passed the declared synthetic thresholds while assigning exactly zero confinement, fusion-power, ignition or net-electric credit. +- Added a 52-row architecture BOM covering field sources, control, support-mode damping, magnet shielding, plasma-facing materials, blanket integration and rejected material/liquid concepts. +- Retained WC/B4C, HfH1.7 composites, tungsten-fiber composites, liquid-lithium edge modules and ferromagnetic blanket co-design only at their defensible authority levels. +- Added SFR3-G0 through SFR3-G9 promotion gates, a high-authority solver contract, source provenance, six regression tests and fail-closed v0.7 quality-gate checks. + +## 0.6.0 — 2026-08-21 — Phase-Programmed Breathing and Tri-Lobe Falsification + +- Preserved SFR-2 Rev A geometry, rigid vessel and steady primary HTS field unchanged. +- Added a 720-sample-per-cycle magnetic-breathing screen for synchronous, ABAB-opposed and traveling-quadrature patterns at 0% through 5% modulation depth. +- Used fixed-particle ideal adiabatic bookkeeping, Bosch-Hale D-T reactivity and instantaneous ISS04 comparison without inventing magnetic-pumping, RF, shock, flux-compression or actuator-power credit. +- Found no declared waveform that improves both cycle-average optimistic ignition ratio and cycle-average uniform fusion power. No cycle-average case crosses the proxy. +- Translated the user concept image into an area-preserving poloidal m=3 harmonic repeated within all four field periods. Rejected global three-toroidal-lobe substitution and three-body D-T credit. +- Added an explicit 24-row actuator-overlay architecture BOM built around eight normal-conducting triplet stations and 24 independent circuits; all electrical, magnetic, thermal and structural ratings remain solver or hardware dependent. +- Added separate promotion gates for dynamic equilibrium, electromagnetics, magnetic-pumping kinetics, particle and alpha orbits, transport/MHD, wall loads, integrated power and hardware. +- Added deterministic generated evidence, tests, provenance, CLI access and fail-closed v0.6 quality-gate checks. + ## 0.5.0 — 2026-08-18 — SFR-2 Dynamic-Compression Assumption Breaker - Preserved SFR-1 Rev A and all v0.4 evidence unchanged as the steady-state reference branch. diff --git a/CITATION.cff b/CITATION.cff index 5b0df1b..bf687f1 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -1,8 +1,8 @@ cff-version: 1.2.0 message: "If you cite IX-StellaratorForge, cite this repository and state the evaluated release/version and evidence authority." title: "IX-StellaratorForge: Evidence-Driven Stellarator Fusion Reactor Reference Design Framework" -version: "0.5.0" -date-released: 2026-08-18 +version: "0.9.0" +date-released: 2026-08-22 authors: - family-names: "Lovell" given-names: "Bryce" diff --git a/FINAL_STATUS.md b/FINAL_STATUS.md index 19ff546..9a91354 100644 --- a/FINAL_STATUS.md +++ b/FINAL_STATUS.md @@ -1,92 +1,46 @@ -# IX-StellaratorForge v0.5.0 — SFR-2 assumption-breaker integration +# IX-StellaratorForge v0.9.0: Integrated Physical Promotion and Heat Exhaust -## Current repository verdict +## Bottom line -`GREEN` means the preserved SFR-1 v0.4 evidence and the new SFR-2 Rev A low-authority study reproduce from committed inputs and code. +All seven requested computational workstreams were attempted. The executable reduced campaign completed, but the result is not a fusion promotion. -It does **not** mean fusion, ignition, net energy, net electricity, dynamic MHD stability, a buildable high-field magnet, tritium self-sufficiency, or hardware operation has been demonstrated. +The heat architecture passes its declared nominal and steady screening envelope. The scanned physical coil family fails. -## What v0.5.0 adds +Top-level verdict: -v0.5.0 preserves SFR-1 Rev A unchanged as the steady-state reference program and adds **SFR-2 Rev A** as a separate assumption-breaker candidate. +`INTEGRATED_REDUCED_CAMPAIGN_COMPLETE__NOMINAL_HEAT_ENVELOPE_SCREEN_PASS__PHYSICAL_COIL_EQUILIBRIUM_CONFINEMENT_AND_FUSION_UNPROVEN` -SFR-2 encodes the user-specified `23 / 26 / 23 / 26 ft` pattern as four consecutive sectors of **one closed toroidal plasma system**. It does not model four independent plasma machines connected by ducts. +## What passed -The new implementation includes: +The selected heat architecture separates distributed first-wall heat, concentrated divertor exhaust and blanket neutron heat. At the declared 1 GW fusion target and Q=20 ledger: -- deterministic 23/26/23/26 geometry bookkeeping; -- an explicit 4.5 aspect-ratio circular-torus screening proxy; -- Bosch-Hale D-T reactivity; -- an ideal monatomic radial-compression upper-bound with no magnetic-field amplification credit; -- ISS04 confinement sensitivity to axis field and rotational transform; -- a target-power-matched 1 GW comparison so compression cases are not rewarded merely for producing more fusion power in an unconstrained uniform model; -- zero numerical credit for unmodeled RF resonance, magnetic pumping, traveling-wave phase heating, or flux-compression field gain; -- SFR2-G0 through SFR2-G9 promotion gates; -- reproducibility tests and tracked JSON/Markdown results. +* first-wall peak heat flux: approximately 0.294 MW/m2; +* divertor peak heat flux: approximately 5.724 MW/m2; +* nominal first-wall tungsten surface: approximately 401.2 C; +* first-wall surface at the declared 1 MW/m2 steady upper bound: approximately 523.8 C; +* divertor tungsten surface: approximately 678.3 C; +* divertor water flow: approximately 426.0 kg/s through 960 parallel channels; +* mean channel velocity: approximately 7.56 m/s; and +* hydraulic pumping screen: approximately 0.122 MW. -## Primary SFR-2 result +The selected requirements are a helium-cooled segmented-W/graded-W-RAFM/ODS-RAFM first wall, isolated PbLi DCLL blanket, and a separately bounded water-cooled W/OFHC-Cu/CuCrZr divertor. The water and PbLi systems never share a boundary, penetration or heat exchanger. -The primary screen is defined as: +This resolves the nominal and declared steady heat allocation only at reduced-model authority. Stable detachment, the 3-D island footprint, critical heat flux, boiling stability, erosion, cyclic fatigue, irradiation, disruptions, accidents and hardware qualification remain unproven. -- `H_ISS04 = 1.0`; -- no assumed transient confinement penalty; -- axis-field sweep: 6, 8, 10, 12, 15 T; -- `iota(2/3)` sweep: 0.6, 0.7, 0.8, 0.9; -- radial squeeze: 0%, 5%, 10%; -- each case solved for the base beta that makes the uniform compressed state equal the same 1,000 MW fusion-power target. +## What failed -**Result:** `NO_PRIMARY_CASE_CROSSES_OPTIMISTIC_IGNITION_PROXY`. +Eighty direct-filament Biot-Savart coil configurations were executed. Zero pass both the transform and radial-excursion gates. The best declared scoring case reaches approximately 0.0653 mean iota against a minimum 0.25 requirement. The richer held-out normal-field reconstruction is approximately 6.49% RMS against a 0.5% screen. -The strongest primary point is the **uncompressed** 15 T / `iota=0.9` case. Its ISS04-to-alpha-only required confinement ratio is approximately **0.9611**, corresponding to an `H_ISS04` requirement of approximately **1.0405** in this optimistic screen. +The classical scanned helical family is rejected. Increasing its current did not solve the missing transform without violating other field-quality requirements. -That is **not “3.9% away from fusion”**. It means only that the empirical confinement estimate is about 3.9% below the deliberately optimistic alpha-only balance for that low-authority point. +## What could not run -## Important negative result: compression is not automatically beneficial +DESC, VMEC++, SIMSOPT, OpenMC, kinetic transport, CAD, CFD and structural FEA are unavailable in this runtime. The DESC, VMEC++ and OpenMC adapters were explicitly invoked and stopped with exit code 1. The dependency-installation route was attempted and blocked by runtime network policy. No surrogate output was relabeled as production evidence. -The updated implementation corrects the earlier conversational exploration. +## Remaining scientific result -At fixed 1 GW target power and `H_ISS04=1`, radial compression increases density and temperature but shrinks the minor radius. In ISS04 this confinement-size penalty dominates the first-order benefit for the declared SFR-2 scan: +The 3.5 MeV alpha gyroradius scale is approximately 0.0449 m at 6 T, but no alpha retention is credited. The Q=20 design-iota burn requirement, including the declared alpha-deposition and bremsstrahlung assumptions, requires approximately H_ISS04 2.00. That target cannot be assigned to the failed physical coil family. -- 0% squeeze, 15 T, `iota=0.9`: ratio ~0.9611; -- 5% squeeze: ratio ~0.8885; -- 10% squeeze: ratio ~0.8164. +Earned improvement toward demonstrated confinement, ignition or fusion remains exactly **0.00%**. -Therefore v0.5.0 does **not** claim the traveling-compression idea improves ignition likelihood. Dynamic compression remains scientifically open because ISS04 is not a dynamic-MHD model and the repository gives phase-controlled heating zero numerical credit. - -## Magnetic-rifling sensitivity - -Within ISS04 only, increasing `iota(2/3)` improves the confinement proxy. At 15 T and no compression, the target-power-matched ratios rise monotonically from about 0.814 at `iota=0.6` to about 0.961 at `iota=0.9`. - -This does not prove that an ABAB 3-D equilibrium with `iota=0.9` exists or is stable. Magnetic islands, stochasticity, coil feasibility and transport remain unresolved. - -## Favorable sensitivity is not earned performance - -The repository also evaluates `H_ISS04 = 1.2` and `1.4` as sensitivity variables. Some favorable cases cross the low-authority proxy. Those are **scenario studies only** and cannot be quoted as achieved SFR-2 confinement. - -## SFR-1 status is preserved - -All v0.4 SFR-1 evidence remains intact: - -- 87-row system design inventory; -- finite-pressure DESC/VMEC++ seed pack; -- rejected low/intermediate coil architectures retained as negative evidence; -- HTS geometry-only screens; -- TBR coverage bounds and OpenMC execution path; -- conditional plant thresholds; -- all high-authority production-solver and hardware gates still open where evidence is absent. - -v0.5.0 does not rewrite SFR-1 history to make SFR-2 look successful. - -## SFR-2 authority jumps still required - -1. Dynamic finite-beta ABAB equilibrium. -2. Coil/current solution and high-field structural/strain/quench feasibility. -3. Thermal and alpha-particle orbit confinement through the actuation cycle. -4. Neoclassical/bootstrap, gyrokinetic/profile transport, island/stochastic and ideal/resistive MHD assessment. -5. 3-D edge/divertor transient heat-flux closure. -6. Real RF/wave deposition and phase-control calculation. -7. Full 3-D neutronics/TBR/shielding. -8. Integrated burn/thermal/plant calculation using G1–G7 outputs. -9. Physical hardware evidence. - -The repository explicitly keeps SFR2-G1 through SFR2-G9 at `NOT_RUN`. +The useful advance is narrower and real: the repository now has an executable heat-exhaust requirement and a stronger rejection of an inadequate magnet family. The next design action is a fundamentally different nonplanar modular-coil optimization, not another increase in current through the rejected helices. diff --git a/MANIFEST.sha256 b/MANIFEST.sha256 index 36787ae..6eebe45 100644 --- a/MANIFEST.sha256 +++ b/MANIFEST.sha256 @@ -1,16 +1,24 @@ 47c1d02879f1ababd6b25dc82a556f9513046849031c26c7aec3e344acffdc0d .gitattributes -3c3210868d86bd925638bbee5c5ec1975dfd34472243bde56431a729a8daaa7a .github/workflows/quality.yml +a41d47196590a16cd758bfe61cce8e896624f1a0fed5f89ad76b319473e563f6 .github/workflows/quality.yml 255825ce048ad245222002358dd3b9f8f2f6270125abe8433c96552723505291 .gitignore a8c2ea7b20bc427630193ff248e90d398d0491c8db7f0cf5a41f96130e635ceb BOM/CONCEPTUAL_SYSTEM_BOM.md f8a82eab2a577309d6fd0fa427815c1476a14d62facc0a95ca78f8771e67469c BOM/RESEARCH_BOM.md 68b76fb69bdafe377729d9bfbeaff8bac1a4bf914740b0b92d82c5ab99950b56 BOM/SFR1_FULL_SYSTEM_BOM.csv d6e09e8a129bb2a155717d5ece228932c712059c3f88f7dd7f81d42302d27799 BOM/SFR1_FULL_SYSTEM_BOM.md +678e9c9ea124c27187d0198a8af802da0e461e9dabe734a48aff5eadf0533534 BOM/SFR2_ACTUATION_OVERLAY_BOM.csv +c986f2385001bf16fbad65e77c1c672e5981cc647c6d224e7467431d7b74e44e BOM/SFR2_ACTUATION_OVERLAY_BOM.md +fc00baa5fdd7e6912ec9393401070961ce3fea981061fea0ef29f0c85bef8aea BOM/SFR3_DUAL_BOUNDARY_AHIS_BOM.csv +d138ab79f063031c356d5450cfff33ba7fc0cce921ce4dcc1900c61558019a70 BOM/SFR3_DUAL_BOUNDARY_AHIS_BOM.md +b2925494121094b26d47c1eae3c1c2a2f9e892df44be6db2d882c9b616a9e4fc BOM/SFR3_FIELD_INTEGRITY_SHELL_BOM.csv +1611b09f0b9c069ecd7a359b0b241e956d8b62fbb3341ac30d615dff2516ea62 BOM/SFR3_FIELD_INTEGRITY_SHELL_BOM.md +48f4c9d3354daa0b3cd6cca529883a2fcf01c9ea2fbdfe4863f0cdf8af236758 BOM/SFR4_INTEGRATED_PROMOTION_BOM.csv +eb551aec75bf47e755ac5c6b47cd56e9f305cd2298b9e31b7549d51b269cda54 BOM/SFR4_INTEGRATED_PROMOTION_BOM.md ae5773e56d167372bf7c37ea10191efdf280735f4e0508d5d3f675468bd0e64a BOM/SOFTWARE_BOM.md -4fb19693d8b0f3464d063d35a5ee549aa3a0b4e073b340235540722a19116599 CHANGELOG.md +0367a8a8a698403d8c8a0b652d5638824cb2a40efcb67047dbfa624268f06835 CHANGELOG.md c92c87524f4e6f0cebcdeb8efb9d1530c3e225e0a50c1e0fd0fce73f599fb452 check_green.py -3b1bda4c5b888928a635e40e87465216718adc14da4fc5e406b9fa4ac93d0e5d check_stellarforge.py -c282079fab825a48181df18f08876bc48d4380c20f56212aebde3cb0349b1478 check_vnext.py -169b774b4bbeceb3207b25363a3d52de7f317ca38be414ddc16b65fb1c36569b CITATION.cff +e0e60e54b8f3a610d03cfb39898e2f1856bc06167fc6ca879cc71ee75aa2a3e7 check_stellarforge.py +b9b7a02ec0d6df702cae96e023e7da06b7ca4a2707c8397d2d5440a3c7ca9f1a check_vnext.py +46e9662133144005d128e4f7ab581f1b54a51cb5c217353f1a9bbec3f4cf909c CITATION.cff 213134f9aa49df59e33925b17391fa2d08e64d2463b40eff388ffb3d6083196a configs/baselines/axisymmetric_negative_control.json 1fe77095b374819712f56ba69d5c52cce28de36048977c8a415b8e4918bd8e8f configs/baselines/matched_helical_5fp.json 4f77d1d8b61ce241f7448db70653549c1920e27ab4fd75e38a5d5d9118bc6251 configs/candidates/c6_seed.json @@ -18,7 +26,11 @@ c282079fab825a48181df18f08876bc48d4380c20f56212aebde3cb0349b1478 check_vnext.py 6698d230792ba3b5c46cf18d472051f2fcae4a96107fd4d6fbdc6191e6171f40 configs/optimization/poc_optimizer.json 50e39b05bb4aede7f7b0e87d1a739520d7350b6067533551719921da8220f75f configs/reactor/parameter_ledger.json 216805115993d15a5784870b9789eee80a567a63ac94dc91fcfde57f72a5f968 configs/reactor/sfr1_rev_a.json +43ad0099aa7317613a4e77166bee83b7746684d075a4443f8af630ef3e775e8f configs/reactor/sfr2_actuation_overlay_a.json ac37ec451b99f55bd05723ac70eaa3bd40738dd75f4f2818efb39780bbecd8db configs/reactor/sfr2_rev_a.json +bb0170cde1b77598d8abe50d97f48bbebebd89985c04fb22e6cf432f7a061611 configs/reactor/sfr3_dual_boundary_ahis_a.json +81a94227137cdd9cb6d01ba3b97ec143ac2bf836cabcb84d597bd2d4fecc13ba configs/reactor/sfr3_field_integrity_shell_a.json +789d8fb6c9004fe35de2ff891fca0ece6226323811aaf4983815635199768129 configs/reactor/sfr4_integrated_physical_promotion_a.json fa82e05e890f650da2c292d10ab25052a9ad680b83da8d2baef7d8b5edae5d71 configs/system/claim_gates.json 32521732a38a98c6bbadb75121238b9792e369e5c5b8ee731e81c64dd27df520 configs/system/engineering_screen.json db8b3af721d463adf1b80ac0d12a0cd2da8d6da67b9a4517af5db95d6cb94711 configs/system/geometry_error_monte_carlo.json @@ -46,7 +58,7 @@ ed565c19b881f46ad624be5399acda5c3d4d8b731da7608d2a86461b998ecf72 docs/14_RISK_R a1280c042573e3a358fe76155953ccc1bb84c99787db5be0808232532efc9327 docs/17_REFERENCES.md 1a15bb4d5a73f54661817ac1fd3c56b019d04d0aa09d7132ab14834ee5283c02 docs/18_REVIEWER_GUIDE.md d6f140c6e3429ffd828d9b66cb4c85b4565c1c74c343b24ff004521144f2e3e6 docs/19_RESEARCH_ROADMAP.md -9a8a57720f1e8c052237b1b39616b32ef2762e126dc76578a4775c61afcd60a2 docs/20_RESULTS_LEDGER.md +96b114e56d7cfe6fb61fae3f03b049db100f2b084249c49ba92f2b1dbc439d51 docs/20_RESULTS_LEDGER.md 4343a11317ba89108a21e6e83a439e9292fac89e45f2be6e6eb07142e2cb7c07 docs/21_PHYSICAL_BUILD_BOUNDARY.md bbf883e8431908a9ffc1addb0998412a50f531466c38c80bff1219213d850d62 docs/closure/00_CLOSURE_CAMPAIGN.md eeac8499a492b0d19391294cc9be724479a8f83246662056389b0a428dce7cf4 docs/closure/01_GATE_STATUS.md @@ -69,9 +81,25 @@ e20b20f263bfa036d2a321b20d3870957f4e912da40fa12a6af6417382e5b405 docs/reactor/0 f9d6ed65bf4e5d00b6d60cb40a210a39871e874ebf3668d4f4d3bdce5bba0c90 docs/reactor/08_SAFETY_AND_ASSURANCE.md 6b1bfa02b8e3f6f3a1d358c8a24460b344b5622613a6b593fc2ff7b858387968 docs/reactor/09_2026_TECHNICAL_BASIS.md ce85fc253360439ab35bd2e0a9356568247ac6c623bb93a07fe004626d5067cd docs/reactor/10_DEVELOPMENT_GATES.md -4116b787828c5600c0986b750adac77c66f9002e295029932153b4b9bba16947 docs/reactor/11_WHERE_WE_ARE.md +82fb9a89d0800f0eccab8531a42d0dd1bf16b526587746e16ac2ca0f9c228c2e docs/reactor/11_WHERE_WE_ARE.md b036ca47f9aacc78a7704ee87fc26444e0b18039c8992cf73f09f44597aad5cc docs/reactor/12_SFR2_DYNAMIC_COMPRESSION.md 3c5a8c268b41a6ef6dfab45fba532b2b5595645f85974e1d324b7b46a773e40b docs/reactor/13_SFR2_PROMOTION_GATES.md +4e45cab33a9bc997c399717a53fccd79af459085cf3b784c0691892f2369aa86 docs/reactor/14_SFR2_PHASE_PROGRAMMED_BREATHING.md +e599a4279cac68ad1d7619c9348f0d275608ae056b82c18d767569453dfc0349 docs/reactor/15_TRILOBE_CONCEPT_TRANSLATION.md +7067eb4ccb2d4d109d3121658b156da42cbadcdf3c35414b817c58df5e8ff12b docs/reactor/16_SFR2_ACTUATION_AND_TRILOBE_GATES.md +b26d6c82bf0362b54bda9b1198ab54fb96f6f47cbebb1bac4ee8aee835e4b32c docs/reactor/17_SFR3_DONOR_TRANSLATION_LEDGER.md +ca73d3d8b3e1d09e63bd516029d69ff77dba40e3691406eaaa8ae7b3c611c2d9 docs/reactor/18_SFR3_FIELD_INTEGRITY_SHELL.md +81faef5366a05bddfbc681a4c8884fdf1b79b8589ce3a175fed869c9b738aa06 docs/reactor/19_SFR3_MATERIAL_AND_LIQUID_BRANCHES.md +f8c9fd74c5e9bc4ad2e6203146e90f1917ef009a0e2736c5d2b5ebf728b27953 docs/reactor/20_SFR3_PROMOTION_GATES.md +d6dda8b6f4c902d7d78e570d194a89c43548a03a85d7bd37e71703f3145776eb docs/reactor/21_SFR3_DUAL_BOUNDARY_ARCHITECTURE.md +0819914ae59a67fc639a7c819d11bbd5c76e32700ef5812164dcd19a9e5466d9 docs/reactor/22_SFR3_DUAL_BOUNDARY_MATERIAL_SELECTION.md +523b664b590f9365252d3acd3b62989aeedd89459a647cd605a27ed98dbfbe3f docs/reactor/23_SFR3_DUAL_BOUNDARY_FAULT_CAMPAIGN.md +0a79c89bb2617da5727ea794bcc2a155060e2e4f7fa4e8acb54280736b0d4558 docs/reactor/24_SFR3_DUAL_BOUNDARY_PROMOTION_GATES.md +dc4f17547ee78062e37ec0c257f3ea28a227257ed1028ff79c0157a9e0e84b73 docs/reactor/25_SFR4_INTEGRATED_PHYSICAL_CAMPAIGN.md +545f230eceb47303c48b4b0777d83fd0c91bc571d3c7b4ef4cc35abdf762a0b2 docs/reactor/26_SFR4_HEAT_EXHAUST_RESOLUTION.md +70b2079fcf9ca47e6e6de940fe9283b68336d2940686d69755062331369390cc docs/reactor/27_SFR4_SOLVER_ATTEMPTS.md +579140824242a81e5b2545e3edb23f723ae412e44011a0520ee1de1aab6f4053 docs/reactor/28_SFR4_PROMOTION_GATES.md +3d4b0ac7a4c58bb236694d1869dd8edf05d430503ff73296a8d514dfe7c6a409 docs/reactor/29_SFR4_DECISION.md 3c951d70f8daa038da5d8f266ca5ffe5bffc1e7fd5313e975e86ea226b06cf2e docs/vnext/00_VNEXT_SCIENTIFIC_THESIS.md 5c604754dab8694b0e10b7c6396592067db933d3c9b9432a65c36d98788fb2e3 docs/vnext/01_MULTI_FIDELITY_PROTOCOL.md a16a5af059a9ff1460d8fde2ec78602cb388f104df170ef3a68def16dfebcee0 docs/vnext/02_REPO_REUSE_LEDGER.md @@ -94,19 +122,26 @@ ff148fe0522b7f7e9ab661adb08e7645e69746abbc8b85cb6e090a9c9d260a95 external_solve d8a9bb730e97de9f8eef651c2f972dc81653c160f6276758776166c9c4947078 external_solvers/inputs/input.SFR1_QA_2FP_REF 445ade74d49212ae8d5c00a52b3f77703c5bcc4dc3183ea9c1afc2d654daa7c4 external_solvers/inputs/input.SFR1_QI_3FP a2e09c625aed1dc6ffc47d91508389c21ae435810a27f22a7cb2e9db52a0df91 external_solvers/inputs/input.SFR1_QI_PWO_4FP -e52fb10193d64b5a3af5b7e9ba697c9794cc8f1a2b778ce034d56d6cf70572d8 external_solvers/README.md +becb02d85585127e584c0bad5c4ab91bab35dc4812bfeae4fe1b60611a6db4a3 external_solvers/README.md f654adf4a7ea4c42e13fba20ebf0109220f1b897dd9e0a5fa87e91b1106dda69 external_solvers/requirements-high-fidelity.txt 8927e3e7ea0a235b097c857df78dc99b9a096bfa5c125d85f4945cd17584c239 external_solvers/result_contract.schema.json -72dea389d9f7ba8b475df6f024d52e1593235ea99c515c0c9acc15c17f4e1987 FINAL_STATUS.md +608e08deb9ded6b5fd14518562c712275d6d58b9dee770f292c4036656af992f external_solvers/sfr3_dual_boundary_evidence_contract.json +5b2d6ffab34985d14a37fb6e70d67194a817ab78a921a8e8b1f33d08d2d2ec03 external_solvers/sfr3_field_integrity_evidence_contract.json +9e5999cad412929eae9d18a5391ce34085f9ba9596dc0951c0f15d3880f92838 external_solvers/sfr4_integrated_evidence_contract.json +2a28e6d9246027dc68b8c401b86634d9e60edc3d3229d018572db4d895eaad3d FINAL_STATUS.md a1910a705ab6b4f879c4129e6cd40191c44f7c1574f7528371648eec1f7f9ddf LICENSE 1db51de28df66287ac49a6a8be7e3102d23faefea5b6e55319a374756112970b LICENSING.md 596893249c69f9267165cb132a8dd7f2a79f20c0629d7b038db7d87048fd2bbe NOTICE -445e661eb94c1ea35b3d9eced0f9bccda30fc17f58075ade168e1ac927305dae PROOF_OF_CONCEPT.md +a9e468ad27083404995557f4a8809b302f77753797e7a4229afd9dcfc66168cc PROOF_OF_CONCEPT.md fed86927a74e9d833acabbe7817d737aa3f8fcc6d8f377ae71dfa04eb9e38d57 provenance/EXTERNAL_TECHNICAL_BASIS_2026.json 45b2990ea886b5da071b7d0c1f2a71ff1970b82b586afa3a915a78835e8eb74c provenance/ORIGIN_INPUTS.json +cc595590d7df524ba3e4598fe38144d266bed0cf2964b520533db61f01043016 provenance/SFR2_ACTUATION_TECHNICAL_BASIS_2026.json 5f83bb7089e55097331dd2f434e50825a98b331850448c07b59332f851593b7b provenance/SFR2_TECHNICAL_BASIS_2026.json -19666b567ce3c7258d6f87ff4e009d6fd6299d6a038e66483eec35beb63dd582 pyproject.toml -5f6cc8810841db0c2956502bb3c0906047842e2fac3e4623e55b5e5620180b7b README.md +f7a865cb6659f48f91049f1f64ef98f18ba986a6534959a446b7f30d1f6196d0 provenance/SFR3_DUAL_BOUNDARY_TECHNICAL_BASIS_2026.json +78f0e9c5d85d401a85a7794b8782736918b07bdcd2d07f698e3076f8a54d8d81 provenance/SFR3_FIELD_INTEGRITY_TECHNICAL_BASIS_2026.json +8c4500555af1a84c9b2d16c437c4a06a3c672eb8130e67a7cbdfa6066dcb4ef9 provenance/SFR4_INTEGRATED_TECHNICAL_BASIS_2026.json +2c39b34797cfe3ecf5ce4bbbbb6b0b93a62ad51b840ec2375b6220449f7304cf pyproject.toml +e3fb50283f22e6c01ab825972d2de3fb29f8ce7d6d2f7fe94e2a97c1cfbfcb20 README.md f89b4f5a1f0df6dcee5017ed3ba0dbdd582c26a70f1ae411512c32c403f25f15 results/ablations/c6_ablations.json ef99833f1d6127e24cc360ea040d1c525a9a83dce643a4a7ef0ae55e8276159f results/ablations/README.md 91dfeac7a439599da4382c7bbd1585d75bf63c024716f0696cdd2de5b00114df results/baselines/matched_helical_5fp.json @@ -114,7 +149,7 @@ ef99833f1d6127e24cc360ea040d1c525a9a83dce643a4a7ef0ae55e8276159f results/ablati 16f35ed0499a91b1236419172f4222939e555e6ef88e74e8163a4f5e5954d514 results/closure/sfr1_v030_closure_campaign.json d30d6098d366b94c6304acb972e9a055c1d5e9d41c3c04f037bd43025f2efa86 results/computational_closure/sfr1_v040.json 00f8597c0ff2571a888c7cca08fd3c510c321924bdb64870919a0fc3ccb27f76 results/computational_closure/SFR1_V040_RESULT.md -209f6280b681d6620f710d79f50a45b11ceb6559b4183fe875fdd155d3a68190 results/evidence/IXFUSION-POC-001.json +258d82bf7295127b6e8f2989f0dadea3c63c2436393d0e31b4c828e2ec2c5b3f results/evidence/IXFUSION-POC-001.json 4bf569ceeba36987c5c3750e7a0931b578fc6b568fdfd6bf841ce87a7dac91cc results/evidence/loss_ledger.json 71c531a8f2c324194c78cf7a641b5e09a5ea676622fbb3ba4f2035e98724c0a0 results/evidence/README.md 75c50557949d11ca6c7a326b42550a3e907604a88d9a465d8a0e61c811d168a5 results/figures/baseline_poincare.png @@ -129,22 +164,34 @@ b93ba3547db751236de862c18b7d186553ac824ed97c32d7eae72d854a0f4689 results/monte_ 6fdffc2bd36c0fdf2d3c9935f5da66dea69d76bc8862f10da260fc8f90549805 results/poc/POC_RESULT.md 8f90c172de8d0be2bc788b3eb054901a0f703e4487399f307047ed3a6b66b26a results/poc/verdict.json fb9d8c91204c9cc6947d71b094fede656c053c6faa14ef4294082c4e7b9f2da3 results/reactor/sfr1_rev_a_readiness.json -8799c9e8352c82756152617b2d6e5290c6eb58efe18bd95faef67e41209c2d1c results/README.md +93d08ac321363b34425c26cb5ad076c7c664d1924e1a5793ff8575c6aea2997a results/README.md 732c2fd5a8f2e86f6b2c75ab4b038331a4b4902b7ae6ff98ee8741e6d95031a3 results/sfr1_poc/SFR1_POC_RESULT.md 2f1ad48d4d8aef052bcd61436f622180b013a9364436a640e1944121ae41db0b results/sfr1_poc/sfr1_poc_v030.json 9b0b22934caa8626c900027a340b6f7c65f116bd8ca0c18ba8478799da5ce8d2 results/sfr1_poc/sfr1_poc_v040.json 09f0c08c630702d17d89c0ba99c8585d24c8b25c7ab3f7b3d33d629d5d91ea35 results/sfr2/sfr2_rev_a_screen_v050.json 5d40a8d343023a48a5c5c8d89e9194447d86a8d4c83ca76507eae492251a5193 results/sfr2/SFR2_REVA_SCREEN_RESULT.md +13ce8a27fe47d32d29c66e405adb78eaa0760129281f25772abbd36d34dfcebf results/sfr2_actuation/SFR2_ACTUATION_OVERLAY_A_RESULT.md +ecf8b8c18779ed9e9c8b82bbc86cb1989fbd16d283b65b0f8c2ecf132dfec5dc results/sfr2_actuation/sfr2_actuation_overlay_a_v060.json +5704b81fb39423171c2ded5f374995a9e6c1f24b7be7f92ab053c2e1a499077e results/sfr3_dual_boundary/SFR3_DUAL_BOUNDARY_AHIS_A_RESULT.md +651e01b97691977cfbb6853abe0f6f13fb7e42360206e351282ea4611a3200ec results/sfr3_dual_boundary/sfr3_dual_boundary_ahis_a_v080.json +d6511e149b287cd1d6ff5d9fd720e379bfc95129bae9db5532b9d4378904af26 results/sfr3_field_integrity/SFR3_FIELD_INTEGRITY_SHELL_A_RESULT.md +0ae55f88714ef5d317fa7a5ba267019a5e11f6ffb59b895b13d1d721b3e0c57f results/sfr3_field_integrity/sfr3_field_integrity_shell_a_v070.json +8ccebbd585072c89deeba6c9e637eea89b46b6a9ddef0039fc02eb8f6876b027 results/sfr4_integrated/SFR4_INTEGRATED_PHYSICAL_PROMOTION_A_RESULT.md +0b5b6c55a180a5191e6364130ec737ac7e9212f39f41f9a9b7092ed44d12ac91 results/sfr4_integrated/sfr4_integrated_physical_promotion_a_v090.json ef748a2605b4ad18f1c7e584f950eba589b23713840178e87bb6a99d676912ef results/vnext/CURRENT_VERDICT.md 3ad823aeaa19e17a12dae6cc89aaa08be9274ee0fa9139624ff784d50293ccfd results/vnext/readiness_report.json 999d106c2531098142befeb8d0d91be43dc7138e8e76706accaee1cb9275049f results/vnext/robust_nfp_sweep.json -257e974d2e43b28c2afdee9eb6792f0a2b986b6d1bf4c6cd9cb4a541f00b179e sbom.spdx.json +b6c7286093c2e16ffd831a3b47c3e37add8c50992b836ea93d9453b7ab5ef47e sbom.spdx.json 7c9fabaeb4203bfda860216209ee88dd37394f8ae9924d2e2212181987bcb2cd schemas/candidate_config.schema.json c6d5fbeae5928227c542e363c0c23e77fdb27c9bd0920e2157ad3c9f6edccbd1 schemas/evidence_bundle.schema.json 005aa089d6ff4625b1711409e69fd0930e51c77cdb25f411d285959489d70094 schemas/external_solver_run.schema.json 32a3e94305a063819f3c9bff4b31c5287e54e7756ed978c9604a4c9a4591b44f schemas/reactor/sfr1_reference.schema.json +4adc039b91bf56b1478c885ebb1c5a0a17b087913d6ff48289daf4e0b98c75a2 schemas/reactor/sfr2_actuation_overlay.schema.json 00f596e507f234d10112c1f2401ca8b26eb609cb99ff7e21ab24da0a2f1289c0 schemas/reactor/sfr2_reference.schema.json -5bc5a3fce0cc5956afd7d6cdcc0103fe6ddc53ccf729e095defc92770e4dc382 scripts/generate_release.py +3537095fab27007c60817f7ce99bc9bcd5c6961518b77bb9e512bfe4fb4fa00a schemas/reactor/sfr3_dual_boundary_ahis.schema.json +937b74da6e2d7b9ece5750229098632e05876d88991c49390c23ddcb7ad58a6c schemas/reactor/sfr3_field_integrity_shell.schema.json +6bfc1a14dd79fb0eb697c457e1ca1c0246ccd4d32e6b7bc1c9e180e31b6ab0c9 schemas/reactor/sfr4_integrated_physical_promotion.schema.json +55998b388a2ab0fa8ec901c9254e2cc950e6f30566ab2d2b6608366f7de36ff3 scripts/generate_release.py 93d41bc1427215972a9f063c2634d7e64b4b6f3e949bf2fc606d62e58261db50 scripts/generate_v040_evidence.py 239034ac6eb9cdeacae2d7426c3f39902829cf555bad0700c9e63076bd96cdde scripts/make_manifest.py 10246a789d6d78d33903a35c3faa7794f02ac489f3d8477401d40a3cfbb22a04 scripts/report_closure_status.py @@ -156,7 +203,12 @@ c6d5fbeae5928227c542e363c0c23e77fdb27c9bd0920e2157ad3c9f6edccbd1 schemas/eviden 0a73ab341c285f8a1805b4bb5256f287c3af01ac8548044ec69881bab304ffab scripts/run_poc.py ea5b090f0ebfc509412587d8d1d9820fb45688d628a99060d58bb475138a0b0d scripts/run_secondary_studies.py aa8287248608a082e5389b375b7788d5623b79811dc7312db32cc7d23c4c5e3e scripts/run_sfr1_poc.py +382f43f73d0c3ce26064e183cbe8408d20a89018f572cd66ce96e92cf8d2a9bc scripts/run_sfr2_actuation_overlay.py 93af6d4abc7b07f878f593a7d8e716c6b695cd6ed4fdafdb5312200ed8145e03 scripts/run_sfr2_screen.py +f32430b199feeb5589e2a5e774b2b57c7e038f99202e9c704aa1173c3df2fbc0 scripts/run_sfr3_dual_boundary.py +0ebf5aaf25ba5df3c0d0e55f8fc70c05cef5c734fc34bdfc7ab0bd0e69d41b86 scripts/run_sfr3_field_integrity.py +e62c301900a715fc1f13833d8dd219b6519bb191829c10a6bfb849220aa6e4df scripts/run_sfr4_integrated_campaign.py +1d9e4c599e2576456c630baa2a87c692ac293bc2adf3594018c59faf56059151 scripts/run_zero_arg_tests.py c2c7f4a139c8c4554e185367124f9f3c18a9e2f32f4853a7bdf14c313c3657db scripts/verify_manifest.py 4d4c473db189c494b0ef89bb4b4719dd1f0a6fd1baf9c30885cd7050a22f16af SECURITY.md 6028d8212cdc131f025a4384a82316f80a3b87efba75279cc94d72f862bb39ff src/ix_fusion/__init__.py @@ -194,10 +246,10 @@ fb5ab38d90a59ce276069e36c51618a696375d1378b1bf93cb00cb82970855d3 src/ix_fusion/ 79942b9c36b822df8d5f689ba3c37bcc4aa84ecac96acf921050d452f01a117c src/ix_fusion/vnext/protocol.py dfbe4b75e868c32d7080da8d5cf1c6ef88bb7920360a91edf424f593be3e4acb src/ix_fusion/vnext/seed_league.py 4877068052ed8f357ece164da0668e23a1dd21ae9e5e2e62aebde2ffe6bbee67 src/ix_fusion/vnext/solver_registry.py -5b96d5ebd637d95d653b596158711771e6b4d79e9c880143f7cbfd55582fa55d src/ix_stellaratorforge/__init__.py +71cd52332535065dd3bc7bd05483b404a2003363f835b9bc1d7b91243fd02b70 src/ix_stellaratorforge/__init__.py 935a1c1166b0c1ea35a82256345000bf2c73ded718d77773bc27a71ecce28f7d src/ix_stellaratorforge/__main__.py 6b68c441fd7f404a9f0152ca2c903b000057dd500041db666451a687d1059881 src/ix_stellaratorforge/burn.py -48b697f6a0911166ce75130bb558bd73e017a5440772b9e8fac065f2f902f8fd src/ix_stellaratorforge/cli.py +63e02d3487c8541e2de6a7e7ed532d6f7ff7a3fd6e5d25488edd1f3392b393a8 src/ix_stellaratorforge/cli.py 87837dfe172b5e72e2453214e46ffe9edd9cf78d05bcbb91a69c187f31dc5b28 src/ix_stellaratorforge/closure.py ae883b8b0a781f56af5b41e2e787ad9020b526af20755b0ac34789aa1489cd73 src/ix_stellaratorforge/coil_hybrid.py 5aad440d438fdbaf784b78175b11f92361805af9d1e6eb14eaa430d821b4ac41 src/ix_stellaratorforge/coil_screen.py @@ -212,14 +264,22 @@ facbec720533cac990dff3147e3a351d33fb90e2a41ea9493f095b699ec8d1da src/ix_stellar d6026ef7fe67d9c18a6081f76624b13d7b4a2d7bf7ff55f7fd4dfc1c5a0ed18f src/ix_stellaratorforge/reactor.py 82e9f82e97472fc3bb75355983cb129b246f9518d13a2810038d58ba6f536bf4 src/ix_stellaratorforge/readiness.py af8f3a1d5831c10a754eb6f8b095df5daa889ea49bb12e9768ffbfa52b7dcfa8 src/ix_stellaratorforge/sfr2.py +b67877f03e5006bb440525e33aeb718fa4e9c6afbc4e7ad8ec542207c233e54a src/ix_stellaratorforge/sfr2_actuation.py +9238c0107849203fe6e76739e9e4f8d4253d4560eb1b3e73117bb3ffab5505d7 src/ix_stellaratorforge/sfr3_dual_boundary.py +e368813b2b644eae5594888801162ff266d5852f63d824dd62dc676216c37264 src/ix_stellaratorforge/sfr3_field_integrity.py +f9e252cc26ed0813e714f2c969ba2d45cfbb842238ebad2d0273888ccc32eec9 src/ix_stellaratorforge/sfr4_integrated_campaign.py f021654d07a36fba883764fbd2ec1b27da8baeb777fd464df2bc63569dd32175 src/ix_stellaratorforge/vacuum_codesign.py b9d7d3cb22cb7c62071bea73ecb717fe58d32b77dbbd32446203138cd69de13c tests/conftest.py 2c2e7bce5dbc7c8f3833eee47c7dfe2770589497ce2485780ffc830e2eaecee8 tests/reactor/test_closure_campaign.py 224eb902e0080f5fcedb6d96a0c12073d5f454f8ac3fd35607027c38293f82e0 tests/reactor/test_hybrid_coils.py 329b625e196302d29ffdcaf144564e17d6f10e3e572ee7170055978f03431ee4 tests/reactor/test_reactor_physics.py -80c3dbe9d33822e64d846e318f9bddd5b6b2a8229a8750ae88c0e8f9b0109dea tests/reactor/test_release_contracts.py +d5fd653c55b9ef6f7da31e96c436cd7dfabab9e721c34e725f7d506bbed262df tests/reactor/test_release_contracts.py 3c98731bd6c314491654fddaf8e64aa05df2a78c7950f95e597688fe913954ea tests/reactor/test_sfr1_poc.py +3d86dcb54cdd61beeb8cbe89368db4de12def11f66f2ce32388eeb99b426926c tests/reactor/test_sfr2_actuation_overlay.py 33a06af86683842b3aa2d8b410ce922aabdd12f8673709a7e1f2546c812c5291 tests/reactor/test_sfr2_rev_a.py +3d754d8657cdf8344cb9d62e4cc79b3189af8f60683c51ea397023ede8a964db tests/reactor/test_sfr3_dual_boundary.py +86d88c3140180f74e207e9c71045bb10a0fb2e6db95d2c8e30158be71f65ccaf tests/reactor/test_sfr3_field_integrity.py +e0febca8adfa00fb62b481f8cb9dea982ffbb29f796d1cdd70f644120292cb8f tests/reactor/test_sfr4_integrated_campaign.py 4896b20fd7778a2397d7904dc69b5e32e52669126899d30b821822d4ccc5b879 tests/reactor/test_v040_external_adapters.py 1fce6d8873f9c88d7ec18a83c912e6e044e61c06a3bb57e5f3251d712b7e677c tests/reactor/test_v040_maximum_closure.py e100edacbd2c12d8344eeb2fc931cb9f7e12feb20efb4b3c507966eb047275a3 tests/test_config.py @@ -237,5 +297,5 @@ e6a7cb3065c409f277472594b4d226d6f66d535ef1eee83735774f0b93527b97 tests/test_sen 512cbbeaf5d5552ae1f24d165bb47642ec4736dfe5c6ac66943d7b7801bed7d6 tests/test_solver_contracts.py 9640683b5d434d15c9919affc1139f4c8c7531074abf7423783f0ce656b7429f tests/test_tracing.py f947aa90adebb206ee0b8c7a3a124aa959c3525eec4accecabbd0a2aaf1b1810 tests/vnext/test_vnext_protocol.py -8d23d1bffe42ebbc290e322ebf38a57b7d77a21f401aa9ba4d8f37357014c50f VALIDATION_REPORT.md -a0ad50640139a524f86591157145bf1d4674ea9c065bfea21558f0f7b04430c8 VERSION +f76300a3ff23e047bd60c6078d06ae125273d3f3214989d4341c6f2e5cdc5125 VALIDATION_REPORT.md +9d8c94f1ad3ea96b1e2ac4914fda4cb93c76b4a3e0d8cc6dd8976d6c0b227d15 VERSION diff --git a/PROOF_OF_CONCEPT.md b/PROOF_OF_CONCEPT.md index adb1d0c..dc9d2e3 100644 --- a/PROOF_OF_CONCEPT.md +++ b/PROOF_OF_CONCEPT.md @@ -1,6 +1,36 @@ # IX-StellaratorForge — executable evidence overview -Release: **0.5.0** +Release: **0.9.0** + +## SFR-4 integrated campaign + +v0.9.0 attempts all seven requested computational workstreams. Its executable result is deliberately split: + +> The declared nominal and steady heat envelope can be satisfied in a reduced requirement model by controlled radiation, at least 24 m2 effective island-divertor wetted area, a helium-cooled tungsten/RAFM first wall and an independently bounded water-cooled W/Cu/CuCrZr divertor. The scanned 80-case classical helical coil family cannot supply the required transform and is rejected. + +Result: `INTEGRATED_REDUCED_CAMPAIGN_COMPLETE__NOMINAL_HEAT_ENVELOPE_SCREEN_PASS__PHYSICAL_COIL_EQUILIBRIUM_CONFINEMENT_AND_FUSION_UNPROVEN`. + +This proves only executable bookkeeping, falsification and requirements. It does not prove equilibrium, confinement, detachment, thermal lifetime, safety or fusion. + +## Dual Boundary AHIS A + +v0.8.0 adds the proposed inward-facing and outer AHIS layers to the full repository as a separately gated engineering branch. Its executable proof is intentionally narrow: + +> Three declared wall stacks can be compared with the same low-authority 1-D thermal model; the selected tungsten/RAFM/PbLi stack can be instrumented at 192 paired inner/outer locations; eleven deterministic fault states can fail closed; and all walls and sensors receive exactly zero plasma-confinement and fusion credit. + +Result: `DUAL_BOUNDARY_ARCHITECTURE_SCREEN_PASS__PHYSICAL_SURVIVABILITY_AND_CONFINEMENT_UNPROVEN`. + +This is a material-stack, observability and fault-response architecture result. It is not pressure confinement, equilibrium, transport, thermal FEA, structural survival, sensor qualification, blanket performance, a safety case or fusion. + +## SFR-3 + +v0.7.0 adds Field Integrity Shell A as a separate confinement-support branch. Its executable proof is intentionally narrow: + +> A 24-channel synthetic trim-coil basis spans the declared 12-component harmonic challenge, meets bounded nominal and single-channel-fault reduction thresholds, applies passive-loop credit only to transients, and fails closed when the control state is not trustworthy. + +Result: `SYNTHETIC_HARMONIC_CONTROL_DEMONSTRATED__PHYSICAL_CONFINEMENT_UNPROVEN`. + +This is an architecture and controllability result. It is not a coil field, equilibrium, island, orbit, transport, MHD, neutron, burn, plant or hardware result. ## SFR-1 @@ -15,7 +45,7 @@ None of those artifacts impersonates DESC/VMEC++, kinetic transport, structural ## SFR-2 -v0.5.0 adds SFR-2 Rev A as a separate assumption-breaker, not as a promotion of SFR-1. +v0.5.0 added SFR-2 Rev A as a separate assumption-breaker, not as a promotion of SFR-1. v0.6.0 adds a separately gated magnetic-breathing and tri-lobe actuation overlay while keeping both SFR-1 and SFR-2 Rev A unchanged. Its proof-of-concept claim is intentionally narrower: @@ -34,6 +64,10 @@ python scripts/run_sfr1_poc.py python scripts/run_computational_closure.py python scripts/generate_v040_evidence.py python scripts/run_sfr2_screen.py +python scripts/run_sfr2_actuation_overlay.py +python scripts/run_sfr3_field_integrity.py +python scripts/run_sfr3_dual_boundary.py +python scripts/run_sfr4_integrated_campaign.py python check_stellarforge.py ``` @@ -42,11 +76,46 @@ Tracked SFR-2 outputs: - `configs/reactor/sfr2_rev_a.json` - `results/sfr2/sfr2_rev_a_screen_v050.json` - `results/sfr2/SFR2_REVA_SCREEN_RESULT.md` +- `results/sfr2_actuation/sfr2_actuation_overlay_a_v060.json` +- `results/sfr2_actuation/SFR2_ACTUATION_OVERLAY_A_RESULT.md` - `docs/reactor/12_SFR2_DYNAMIC_COMPRESSION.md` - `docs/reactor/13_SFR2_PROMOTION_GATES.md` +Tracked SFR-3 outputs: + +- `configs/reactor/sfr3_field_integrity_shell_a.json` +- `results/sfr3_field_integrity/sfr3_field_integrity_shell_a_v070.json` +- `results/sfr3_field_integrity/SFR3_FIELD_INTEGRITY_SHELL_A_RESULT.md` +- `BOM/SFR3_FIELD_INTEGRITY_SHELL_BOM.csv` +- `docs/reactor/17_SFR3_DONOR_TRANSLATION_LEDGER.md` +- `docs/reactor/18_SFR3_FIELD_INTEGRITY_SHELL.md` +- `docs/reactor/20_SFR3_PROMOTION_GATES.md` + +Tracked dual-boundary outputs: + +- `configs/reactor/sfr3_dual_boundary_ahis_a.json` +- `results/sfr3_dual_boundary/sfr3_dual_boundary_ahis_a_v080.json` +- `results/sfr3_dual_boundary/SFR3_DUAL_BOUNDARY_AHIS_A_RESULT.md` +- `BOM/SFR3_DUAL_BOUNDARY_AHIS_BOM.csv` +- `docs/reactor/21_SFR3_DUAL_BOUNDARY_ARCHITECTURE.md` +- `docs/reactor/22_SFR3_DUAL_BOUNDARY_MATERIAL_SELECTION.md` +- `docs/reactor/23_SFR3_DUAL_BOUNDARY_FAULT_CAMPAIGN.md` +- `docs/reactor/24_SFR3_DUAL_BOUNDARY_PROMOTION_GATES.md` + +Tracked SFR-4 outputs: + +- `configs/reactor/sfr4_integrated_physical_promotion_a.json` +- `results/sfr4_integrated/sfr4_integrated_physical_promotion_a_v090.json` +- `results/sfr4_integrated/SFR4_INTEGRATED_PHYSICAL_PROMOTION_A_RESULT.md` +- `BOM/SFR4_INTEGRATED_PROMOTION_BOM.csv` +- `docs/reactor/25_SFR4_INTEGRATED_PHYSICAL_CAMPAIGN.md` +- `docs/reactor/26_SFR4_HEAT_EXHAUST_RESOLUTION.md` +- `docs/reactor/27_SFR4_SOLVER_ATTEMPTS.md` +- `docs/reactor/28_SFR4_PROMOTION_GATES.md` +- `docs/reactor/29_SFR4_DECISION.md` + ## Promotion boundary A low-authority model may reject a candidate. It may not declare one successful. -SFR-2 G1–G9 remain unrun until candidate-specific high-authority evidence exists. Actual fusion and net-electric operation remain outside software authority. +SFR-2 G1–G9 and SFR-3 G2–G9 remain unrun until candidate-specific high-authority evidence exists. Dual-boundary high-authority thermal, structural, irradiation, leak, blanket and integrated hardware gates are also unrun. Actual fusion and net-electric operation remain outside software authority. diff --git a/README.md b/README.md index d9e4154..c8003f1 100644 --- a/README.md +++ b/README.md @@ -2,15 +2,129 @@ **Evidence-driven stellarator fusion reactor design and computational co-design program.** -IX-StellaratorForge preserves the original `IX-Fusion` research lineage and builds a reactor-level evidence program above it. **SFR-1 Rev A** remains the steady-state reference architecture; **SFR-2 Rev A** is a separate dynamic-compression assumption breaker introduced in v0.5.0. +IX-StellaratorForge preserves the original `IX-Fusion` research lineage and builds a reactor-level evidence program above it. **SFR-1 Rev A** remains the steady-state reference architecture; **SFR-2 Rev A** remains a separate dynamic-compression assumption breaker; **SFR-3 Field Integrity Shell A** remains the synthetic magnetic-error-control branch; **Dual Boundary AHIS A** remains the independently monitored engineering boundary. Version 0.9.0 adds **SFR-4 Integrated Physical-Promotion Campaign A**, which attempts physical coil fields, equilibrium, co-design, particle confinement, burn, magnet engineering, heat exhaust and reactor systems without promoting unavailable production evidence. -> **Release:** `0.5.0 — SFR-2 Dynamic-Compression Assumption Breaker` +> **Release:** `0.9.0: Integrated Physical Promotion and Heat Exhaust` > -> **Repository verdict:** `GREEN` when the preserved SFR-1 v0.4 evidence and the SFR-2 v0.5 low-authority screen both reproduce. +> **Repository verdict:** `GREEN` when all preserved evidence and the SFR-4 integrated reduced campaign reproduce. > > **SFR-2 primary verdict:** `NO_PRIMARY_CASE_CROSSES_OPTIMISTIC_IGNITION_PROXY` > -> Neither SFR-1 nor SFR-2 claims demonstrated ignition, net energy, tritium self-sufficiency, net electricity, buildable hardware, or reactor feasibility. +> **Actuation-overlay verdict:** `NO_DECLARED_BREATHING_CASE_IMPROVES_BOTH_CYCLE_AVERAGE_PROXY_AND_FUSION_POWER` +> +> **SFR-3 verdict:** `SYNTHETIC_HARMONIC_CONTROL_DEMONSTRATED__PHYSICAL_CONFINEMENT_UNPROVEN` +> +> **Dual-boundary verdict:** `DUAL_BOUNDARY_ARCHITECTURE_SCREEN_PASS__PHYSICAL_SURVIVABILITY_AND_CONFINEMENT_UNPROVEN` +> +> **SFR-4 verdict:** `INTEGRATED_REDUCED_CAMPAIGN_COMPLETE__NOMINAL_HEAT_ENVELOPE_SCREEN_PASS__PHYSICAL_COIL_EQUILIBRIUM_CONFINEMENT_AND_FUSION_UNPROVEN` +> +> No branch claims demonstrated confinement, ignition, net energy, tritium self-sufficiency, net electricity, buildable hardware, reactor safety, or reactor feasibility. + +## What v0.9.0 adds + +All seven requested computational workstreams were attempted. The result is deliberately split: the heat architecture passes its declared nominal and steady reduced envelope, while the scanned physical coil family fails. + +| Workstream | Executed result | Promotion decision | +|---|---|---| +| Physical coil field | 80 direct-filament Biot-Savart and field-line cases | 0 combined topology passes; current family rejected | +| Finite-beta equilibrium | DESC and VMEC++ adapters explicitly attempted | Dependencies unavailable; no equilibrium result fabricated | +| Coil/plasma co-design | Expanded geometry/current scan and held-out normal-field reconstruction | Production SIMSOPT co-design not run | +| Particle confinement | 3.5 MeV alpha gyroradius scope, approximately 0.0449 m at 6 T | No guiding-center or transport credit | +| Burn | Q=20 target requirement with declared alpha deposition and bremsstrahlung | Approximately H_ISS04 2.00 at design iota; not linked to a passing coil | +| Magnet engineering | Centerline strain, magnetic pressure and stored-energy scopes | Winding-pack FEA, peak conductor field and quench qualification open | +| Reactor systems | D-T source, breeding coverage, heat and conditional power ledgers | Full 3-D TBR and net-electric prediction open | + +### Heat-exhaust result + +The heat problem is separated into first-wall radiation, divertor exhaust and blanket neutron heating. At the declared 1 GW fusion target and Q=20 ledger, the selected requirement sends 60% of 228.98 MW plasma exhaust into controlled radiation and 40% to a 24 m2 effective island-divertor wetted area. + +| Quantity | v0.9 reduced result | +|---|---:| +| First-wall peak heat flux | 0.294 MW/m2 | +| Divertor peak heat flux | 5.724 MW/m2 | +| Nominal first-wall tungsten surface | 401.2 C | +| First wall at declared 1 MW/m2 steady upper bound | 523.8 C | +| Divertor tungsten surface | 678.3 C | +| Divertor water mass flow | 426.0 kg/s through 960 parallel channels | +| Mean channel velocity | 7.56 m/s | +| Hydraulic pumping screen | 0.122 MW | + +The retained architecture uses a helium-cooled segmented-tungsten/graded-W-RAFM/ODS-RAFM first wall, an isolated PbLi DCLL blanket, and an independently bounded water-cooled W/OFHC-Cu/CuCrZr divertor. Water and PbLi may not share a boundary, penetration or heat exchanger. + +“Heat resolved” is restricted to requirement authority for nominal and declared steady conditions. Stable detachment, the three-dimensional island footprint, critical heat flux, erosion, cyclic fatigue, irradiation, transient events, accidents and hardware qualification remain open. + +### Magnetic result + +The best scoring direct-filament case reaches approximately 0.0653 mean iota against a minimum 0.25 gate. Its radial-excursion screen passes, but the transform screen fails. The held-out richer basis remains approximately 6.49% RMS normal field against a 0.5% screen. Raising current in this classical helical family is rejected as the next design move; a fundamentally different optimized nonplanar modular-coil family is required. + +Primary v0.9 artifacts: + +- `results/sfr4_integrated/SFR4_INTEGRATED_PHYSICAL_PROMOTION_A_RESULT.md` +- `BOM/SFR4_INTEGRATED_PROMOTION_BOM.md` +- `docs/reactor/25_SFR4_INTEGRATED_PHYSICAL_CAMPAIGN.md` +- `docs/reactor/26_SFR4_HEAT_EXHAUST_RESOLUTION.md` +- `docs/reactor/27_SFR4_SOLVER_ATTEMPTS.md` +- `docs/reactor/28_SFR4_PROMOTION_GATES.md` +- `docs/reactor/29_SFR4_DECISION.md` + +## What v0.8.0 adds + +The user's "AHIS flipped inside out" idea is implemented as two independent, instrumented engineering boundaries around the unchanged magnetic-confinement concept. The inner lane looks inward from protected positions behind the plasma-facing armor and first wall. The outer lane monitors the double-wall vessel, shielding, cryostat and magnet-support alignment. Neither lane enters the plasma volume, presses on plasma, or receives direct confinement credit. + +| Item | Selected v0.8 configuration | Reduced-screen result | +|---|---|---| +| Plasma-facing stack | Segmented tungsten, graded W-to-RAFM transition, helium-cooled ODS-Eurofer/RAFM first wall | 420.7 °C nominal surface; 632.9 °C declared steady-upset upper bound | +| Breeding and shielding | Enriched PbLi DCLL blanket, electrically insulating SiC/alumina channel inserts, WC/B4C shield, local HfH only after 3-D neutronics | Architecture selected; no TBR, corrosion, MHD-pressure-drop or lifetime credit | +| Double boundary | Monitored 316LN-class double-wall vessel and interspace, followed by thermal shield, cryostat and monitored support shell | 192 paired locations across 24 toroidal sectors and eight poloidal stations | +| Instrumentation | Two independent inner/outer lanes, hard vacuum/interspace channels and sector-level references | 1,736 declared sensing elements; radiation survivability and calibration remain unqualified | +| Fault campaign | Eleven nominal and fault scenarios | All expected deterministic states reproduced; a sub-sensitivity armor crack is intentionally not detected and requires periodic NDE | +| Fusion effect | None credited | Earned confinement, fusion, ignition and net-electric improvement remain exactly zero | + +The 1-D temperature and coefficient-of-thermal-expansion calculations are sizing screens, not thermal FEA, fracture mechanics or lifetime predictions. The reported raw mismatch proxy for the selected stack is approximately **0.212%** and is deliberately not converted into stress or pass/fail structural credit. The cooler W/Cu/CuCrZr comparison is deferred because a water-cooled first wall beside PbLi creates a more severe integration and accident problem. The SiCf/SiC comparison remains attractive at high temperature but is deferred by joining, code-qualification and maturity gaps. + +The architecture can trigger magnetic trim, power rundown, coolant isolation, safe hold and inspection. It cannot squeeze plasma with wall pressure. Its purpose is to detect damage, preserve geometry and prevent an engineering fault from silently degrading the magnetic cage. + +Primary v0.8 artifacts: + +- `results/sfr3_dual_boundary/SFR3_DUAL_BOUNDARY_AHIS_A_RESULT.md` +- `BOM/SFR3_DUAL_BOUNDARY_AHIS_BOM.md` +- `docs/reactor/21_SFR3_DUAL_BOUNDARY_ARCHITECTURE.md` +- `docs/reactor/22_SFR3_DUAL_BOUNDARY_MATERIAL_SELECTION.md` +- `docs/reactor/23_SFR3_DUAL_BOUNDARY_FAULT_CAMPAIGN.md` +- `docs/reactor/24_SFR3_DUAL_BOUNDARY_PROMOTION_GATES.md` + +## What v0.7.0 adds + +Seven uploaded repositories—AHIS, PressureX, IX-Vibe, IX-Breath, IX-GCR-SPE, IX-Shield and IX-HfTaZen-Shield—were audited as mechanism donors. No hidden material or liquid confinement mechanism was found. Their defensible patterns were translated into a magnetic field-integrity architecture: + +| SFR-3 layer | Decision | v0.7 evidence state | +|---|---|---| +| Primary confinement | Keep the steady copper-stabilized REBCO field and rigid vessel | Architecture reference only | +| Active correction | Add 24 individually driven planar trim channels | 12-by-24 synthetic response is full row rank; physical response not solved | +| Passive correction | Study 24 flux-conserving superconducting loops | Transient response only; exactly zero DC-error credit | +| Observability and FDIR | Add magnetic/current/quench/strain/motion sensing, confidence gates and independent safe hold | Fault-state logic executes deterministically | +| Structural control | Target measured support modes with warm-side damping and alignment monitoring | Architecture only; no unmeasured damping credit | +| Magnet protection | Concentrate WC/B4C and solver-dependent HfH shielding around REBCO and streaming paths | No transferred tokamak performance; 3-D OpenMC required | +| Plasma-facing/edge | Segmented tungsten family; boron or local liquid lithium only as guarded experiments | Zero direct confinement credit | + +The declared synthetic commissioning challenge produces approximately **65.46% nominal RMS reduction**, **66.36% with one unavailable trim channel**, and **55% passive attenuation of a pure transient challenge**. Low sensor confidence disables active correction. Those numbers validate the mathematical control decomposition only; the repo assigns them **zero confinement, fusion-power, ignition and net-electric gain**. + +The 52-row architecture inventory is `BOM/SFR3_FIELD_INTEGRITY_SHELL_BOM.csv`. The result is `results/sfr3_field_integrity/sfr3_field_integrity_shell_a_v070.json`. Physical promotion begins by replacing the analytic response matrix with CAD-linked Biot-Savart fields and then testing finite-beta equilibria and islands. + +## What v0.6.0 adds + +The baseline 23 / 26 / 23 / 26 ft ABAB geometry, rigid vessel and steady primary HTS field remain unchanged. The new overlay tests three auxiliary magnetic-field patterns over 720 samples per cycle at depths from 0% through 5%. + +| Actuation question | v0.6 result | +|---|---| +| Does synchronous squeeze and expansion sustain an advantage? | **No.** The 5% case produces an instantaneous proxy peak near 0.9981 during expansion, when uniform fusion power has fallen to about 802.5 MW. Its cycle-average proxy is worse than the unchanged baseline. The peak is not ignition capture. | +| Does an ABAB-opposed wave improve both principal metrics? | **No.** No declared case improves both cycle-average optimistic ignition ratio and cycle-average uniform fusion power. | +| Does the traveling-quadrature wave move closer? | **Only nominally in one proxy and not jointly.** At 5% depth the cycle-average ratio changes from about 0.961077 to 0.961559 while cycle-average uniform fusion power falls from 1000.000 to about 997.233 MW, before actuator losses. | +| Does any cycle-average case cross the proxy? | **No.** | +| Does the Gemini tri-lobe image supply a fusion mechanism? | **No earned gain.** Astrophysical accretion and three-body collision claims are rejected. An area-preserving poloidal `m=3` harmonic repeated inside all four field periods is retained only as a testable actuator symmetry. | +| Is the actuator hardware specified? | **At architecture level only.** The 24-row overlay BOM selects eight normal-conducting triplet stations and 24 independent circuits. Currents, turns, voltage, cooling, forces and placement remain solver or hardware dependent. | + +The machine-readable result is `results/sfr2_actuation/sfr2_actuation_overlay_a_v060.json`. The concise interpretation is in `results/sfr2_actuation/SFR2_ACTUATION_OVERLAY_A_RESULT.md`. ## What v0.5.0 adds @@ -53,7 +167,7 @@ At the current 8.0 m major radius, 1.7 m minor-radius screening geometry, 6 T ax - beta screen for the 1 GW target: **~3.574%**; - current screened net-electric algebra: **~204.10 MWe**; - 1 GW target net-electric algebra: **340 MWe**; -- current best simple classical-helical vacuum architecture: **4FP, alternating helices, 0.40 helical/TF current ratio**; it retains the nestedness screen but produces only **~0.0389 mean iota**, so it fails the transform requirement; +- expanded v0.9 best-scoring classical-helical vacuum architecture: **6FP, four alternating helices, 1.0 helical/TF current ratio**; it retains the radial-excursion screen but produces only **~0.0653 mean iota**, so it fails the transform requirement; - continuous winding-surface current-potential held-out RMS `Bn/B0`: **~1.64% (2FP), 2.32% (3FP), 3.05% (4FP), 4.57% (6FP)** — all fail the 0.5% screen; - the geometry-only REBCO strain proxy is below the 0.4% ceiling for the screened TF/helical centerlines, but that is **not** winding-pack qualification. @@ -84,6 +198,10 @@ The adapters **stop** if the real dependency is unavailable. They never silently python scripts/run_computational_closure.py python scripts/generate_v040_evidence.py python scripts/run_sfr2_screen.py +python scripts/run_sfr2_actuation_overlay.py +python scripts/run_sfr3_field_integrity.py +python scripts/run_sfr3_dual_boundary.py +python scripts/run_sfr4_integrated_campaign.py python check_stellarforge.py ``` @@ -112,9 +230,15 @@ No core is privileged: 2FP QA reference, 3FP QI, 4FP QI/piecewise-omnigenous, 6F `BOM/SFR1_FULL_SYSTEM_BOM.csv` and `.md` contain **87 unique system-level rows** spanning plasma, magnets, cryogenics, vacuum, PFCs, blanket/shield, tritium/fueling, RF, diagnostics, controls, heat transport, power conversion, electrical, maintenance, safety, facility and solver infrastructure. +`BOM/SFR3_FIELD_INTEGRITY_SHELL_BOM.csv` contains **52 rows** covering direct field sources, trim and passive correction, diagnostics, guarded control, support-mode damping, magnet shielding, plasma-facing and blanket integration, maintenance and explicit rejected/separate concepts. Diamond, glitter, passive dense liquids and flexible-vessel compression are not hidden as active components. + +`BOM/SFR3_DUAL_BOUNDARY_AHIS_BOM.csv` contains **64 rows** covering the selected tungsten/RAFM/PbLi stack, two comparison stacks, independent inner and outer sensing, interspace leak monitoring, support/alignment surveillance, protection actions, evidence jobs and explicit rejection/defer decisions. PVDF and unqualified electronics are not placed at the plasma-facing surface. + +`BOM/SFR4_INTEGRATED_PROMOTION_BOM.csv` contains **64 rows** covering all seven workstreams, the separated helium/PbLi/water heat architecture, production solver requirements, particle and burn tools, magnet qualification, neutron transport, fuel cycle, remote maintenance and high-heat-flux testing. + “Full” means complete at the system-architecture inventory level. It is **not** falsely labeled a procurement/fabrication BOM: final quantities, nuclear compositions/enrichment, conductor sizing/current, pressure ratings, safety setpoints, vendors, part numbers and drawings remain solver/hardware dependent. -## Evidence gates after v0.5 +## Evidence gates after v0.9 1. **G1 equilibrium — production execution open.** Inputs are complete; real finite-beta DESC and VMEC++ convergence/cross-code evidence has not been executed in this build runtime. 2. **G2 coils — new architectures executed, no promoted set.** Low/intermediate tests reject current fixed boundary/coil combinations; true plasma/coil co-optimization, REBCO Ic/strain over winding packs, loads/support FEA, tolerances and quench remain open. @@ -127,13 +251,21 @@ No core is privileged: 2FP QA reference, 3FP QI, 4FP QI/piecewise-omnigenous, 6F SFR-2 has its own independent gates. Only `SFR2_G0_SPEC` is `PASS_SPEC_ONLY`; dynamic equilibrium, coils/field, particle and alpha orbits, transport/MHD, transient edge heat flux, RF/phase control, neutronics/TBR, integrated burn/plant, and hardware are all `NOT_RUN`. SFR-1 evidence cannot silently promote SFR-2. +The actuation overlay is independently gated. Only `SFR2A_G0_OVERLAY_SPEC` is `PASS_SPEC_ONLY`. Time-dependent equilibrium, coils/electromagnetics, magnetic-pumping kinetics, particle and alpha orbits, transport/MHD, wall loads, integrated power and hardware all remain `NOT_RUN`. + +SFR-3 is independently gated. `SFR3_G0_ARCHITECTURE_SPEC` is `PASS_SPEC_ONLY` and `SFR3_G1_SYNTHETIC_CONTROLLABILITY` is `PASS_LOW_AUTHORITY_SYNTHETIC_ONLY`. Physical Biot-Savart response, free-boundary equilibrium/islands, particle and alpha orbits, transport/MHD, magnet engineering, 3-D neutronics/TBR, integrated burn/plant and hardware are all `NOT_RUN`. The synthetic pass cannot promote any of them. + +Dual Boundary AHIS A is also independently gated. Only its configuration and reduced thermal/fault-logic screens pass. Conjugate thermal FEA, disruption/EM structural FEA, W/RAFM joint qualification, coolant and PbLi MHD/corrosion loops, sensor irradiation/calibration, 3-D neutronics, remote maintenance and integrated hardware tests remain `NOT_RUN`. No passing reduced screen can promote those gates. + +SFR-4 is independently gated. Its specification passes; its scanned coil family fails; its nominal and declared steady reduced heat screen passes. CAD-linked nonplanar coil optimization, DESC/VMEC++ equilibrium, islands/stability, alpha and thermal transport, 3-D edge/divertor physics, CFD/FEA/fatigue/irradiation, OpenMC TBR, integrated burn/plant analysis and hardware remain `NOT_RUN`. + ## Quality gate ```bash python check_stellarforge.py ``` -`IX-STELLARATORFORGE: GREEN` means release integrity, tests, preserved SFR-1 evidence, the SFR-2 deterministic screen, license, tracked computations and solver contracts reproduce. **It never means fusion was achieved.** +`IX-STELLARATORFORGE: GREEN` means release integrity, 114 tests, preserved SFR-1/SFR-2/SFR-3 evidence, the dual-boundary reduced screen, the SFR-4 integrated campaign, BOM contracts, license, tracked computations and solver contracts reproduce. **It never means fusion was achieved.** ## License and permission contact @@ -147,9 +279,33 @@ A LinkedIn connection, message, discussion, download, citation or repository acc - `FINAL_STATUS.md` - `PROOF_OF_CONCEPT.md` +- `docs/reactor/25_SFR4_INTEGRATED_PHYSICAL_CAMPAIGN.md` +- `docs/reactor/26_SFR4_HEAT_EXHAUST_RESOLUTION.md` +- `docs/reactor/27_SFR4_SOLVER_ATTEMPTS.md` +- `docs/reactor/28_SFR4_PROMOTION_GATES.md` +- `docs/reactor/29_SFR4_DECISION.md` +- `results/sfr4_integrated/SFR4_INTEGRATED_PHYSICAL_PROMOTION_A_RESULT.md` +- `BOM/SFR4_INTEGRATED_PROMOTION_BOM.md` +- `docs/reactor/21_SFR3_DUAL_BOUNDARY_ARCHITECTURE.md` +- `docs/reactor/22_SFR3_DUAL_BOUNDARY_MATERIAL_SELECTION.md` +- `docs/reactor/23_SFR3_DUAL_BOUNDARY_FAULT_CAMPAIGN.md` +- `docs/reactor/24_SFR3_DUAL_BOUNDARY_PROMOTION_GATES.md` +- `results/sfr3_dual_boundary/SFR3_DUAL_BOUNDARY_AHIS_A_RESULT.md` +- `BOM/SFR3_DUAL_BOUNDARY_AHIS_BOM.md` +- `docs/reactor/17_SFR3_DONOR_TRANSLATION_LEDGER.md` +- `docs/reactor/18_SFR3_FIELD_INTEGRITY_SHELL.md` +- `docs/reactor/19_SFR3_MATERIAL_AND_LIQUID_BRANCHES.md` +- `docs/reactor/20_SFR3_PROMOTION_GATES.md` +- `results/sfr3_field_integrity/SFR3_FIELD_INTEGRITY_SHELL_A_RESULT.md` +- `BOM/SFR3_FIELD_INTEGRITY_SHELL_BOM.md` - `docs/reactor/12_SFR2_DYNAMIC_COMPRESSION.md` - `docs/reactor/13_SFR2_PROMOTION_GATES.md` - `results/sfr2/SFR2_REVA_SCREEN_RESULT.md` +- `docs/reactor/14_SFR2_PHASE_PROGRAMMED_BREATHING.md` +- `docs/reactor/15_TRILOBE_CONCEPT_TRANSLATION.md` +- `docs/reactor/16_SFR2_ACTUATION_AND_TRILOBE_GATES.md` +- `results/sfr2_actuation/SFR2_ACTUATION_OVERLAY_A_RESULT.md` +- `BOM/SFR2_ACTUATION_OVERLAY_BOM.md` - `docs/closure/06_MAXIMUM_COMPUTATIONAL_CLOSURE.md` - `results/computational_closure/SFR1_V040_RESULT.md` - `BOM/SFR1_FULL_SYSTEM_BOM.md` diff --git a/VALIDATION_REPORT.md b/VALIDATION_REPORT.md index 522313b..bbfd45f 100644 --- a/VALIDATION_REPORT.md +++ b/VALIDATION_REPORT.md @@ -1,56 +1,33 @@ -# IX-Fusion Validation Report +# IX-StellaratorForge Validation Report -Release: **0.1.0** -Date: **2026-08-15** -Authority: **software integrity + reduced-order computational screening only** +Release: **0.9.0** +Date: **2026-08-22** +Authority: **software integrity plus mixed low/intermediate analytical and direct-filament screening** -## Validation summary +## v0.9 validation scope -The release was generated from versioned configurations and validated locally with the same -quality gate committed for GitHub Actions. +The SFR-4 focused suite adds eleven tests covering the seven-workstream specification, 80-case physical coil rejection, production-solver fail-closed behavior, alpha gyroradius boundaries, burn-loss bookkeeping, heat partition, first-wall and divertor temperatures, hydraulic requirements, heat sensitivity, magnet nonqualification, conditional reactor bookkeeping and exact persisted-result reproduction. -Current test suite: **41 deterministic unit/regression tests**, covering configuration -validation, C6 periodicity, field-strength bounds, field-line integration, bounce-action -proxy behavior, optimizer determinism, RF mode purity and feedback, structural/engineering -screens, energy-ledger claim refusal, evidence validation, Monte Carlo reproducibility, -external-solver detection, and release-result claim boundaries. +One additional release-contract test checks the 64-row SFR-4 BOM. The complete suite contains **114 deterministic tests** when combined with the preserved 102-test v0.8 release. -Release reproduction: **PASS**. `scripts/reproduce_release.py --verify` regenerates the -machine-readable proof-of-concept, matched baseline, ablations, RF Monte Carlo, geometry- -error Monte Carlo, loss ledger, and POC report in a temporary directory and compares them -against the committed release. +## Executed evidence -## Current scientific verdict +* 80 direct-filament Biot-Savart and vacuum field-line cases; +* one held-out 120-filament normal-field reconstruction at the selected field-period count; +* 3.5 MeV alpha gyroradius scope; +* Bosch-Hale D-T burn and ISS04 Q=20 requirement with bremsstrahlung; +* 16-point radiation-fraction and divertor-area heat sensitivity matrix; +* multilayer first-wall and divertor 1-D conduction; +* distributed-water-loop mass flow, velocity, pressure drop and pump power; +* REBCO centerline geometry, magnetic-pressure and stored-energy scopes; +* exact D-T neutron and tritium source ledger; +* breeding-coverage constraint; and +* conditional plant arithmetic. -The release's C6 hypothesis verdict is **`FAIL_OR_INCONCLUSIVE`** at the reduced-model gate. -The scientific stage remains **`geometry_hypothesis`**. +## Negative and open evidence -This is a validation success, not a fusion success: the repository is allowed to reject its -own hypothesis and still be GREEN if the rejection is reproducible and internally -consistent. +No physical coil passes. DESC, VMEC++, SIMSOPT and OpenMC are unavailable. Particle confinement, finite-beta equilibrium, transport, stable detachment, thermal transients, structural survival, full 3-D TBR, sustained burn, net electricity, safety and hardware remain unpromoted. -## What GREEN means +## GREEN meaning -`python check_green.py` verifies: - -- required release-contract files; -- parseable JSON/configuration/evidence artifacts; -- absence of common scaffolding markers; -- evaluation-license contract markers; -- conservative claim-boundary state; -- Python compilation; -- full unit/regression suite; -- deterministic scientific reproduction; -- SHA-256 release manifest integrity. - -A GREEN result means the repository's **internal evidence chain** is intact. - -## What GREEN does not mean - -GREEN is not evidence of a solved equilibrium, real nested flux surfaces, particle -confinement, MHD stability, low turbulent transport, RF plasma coupling, blanket -performance, tritium self-sufficiency, ignition, net energy, net electricity, or reactor -safety/buildability. - -Those remain later authority gates and are explicitly recorded as `UNKNOWN` where -applicable. +GREEN means the repository, configuration, persisted reduced result, tests, BOMs, manifests and fail-closed boundaries reproduce. It does not mean the heat solution is physically qualified or that fusion performance improved. diff --git a/VERSION b/VERSION index 8f0916f..ac39a10 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.5.0 +0.9.0 diff --git a/check_stellarforge.py b/check_stellarforge.py index c51509b..73cc21a 100644 --- a/check_stellarforge.py +++ b/check_stellarforge.py @@ -12,11 +12,31 @@ from ix_stellaratorforge.reactor import load_reactor_config, validate_reactor_config from ix_stellaratorforge.sfr2 import run_sfr2_screen, validate_sfr2_config +from ix_stellaratorforge.sfr2_actuation import ( + run_actuation_overlay_screen, + validate_actuation_config, +) +from ix_stellaratorforge.sfr3_field_integrity import ( + PASS_VERDICT as SFR3_VERDICT, + run_sfr3_field_integrity_screen, + validate_sfr3_config, +) +from ix_stellaratorforge.sfr3_dual_boundary import ( + PASS_VERDICT as DUAL_BOUNDARY_VERDICT, + run_dual_boundary_screen, + validate_dual_boundary_config, +) +from ix_stellaratorforge.sfr4_integrated_campaign import ( + PASS_VERDICT as SFR4_VERDICT, + run_integrated_campaign, + validate_integrated_config, +) CONTACT = "https://www.linkedin.com/in/brycewdesign/" LICENSE_REF = "LicenseRef-IX-StellaratorForge-Eval-Only-1.1" V040_VERDICT = "MAXIMUM_IN_REPO_COMPUTATIONAL_CLOSURE_COMPLETE__PRODUCTION_SOLVER_AND_HARDWARE_GATES_REMAIN" SFR2_PRIMARY_VERDICT = "NO_PRIMARY_CASE_CROSSES_OPTIMISTIC_IGNITION_PROXY" +ACTUATION_VERDICT = "NO_DECLARED_BREATHING_CASE_IMPROVES_BOTH_CYCLE_AVERAGE_PROXY_AND_FUSION_POWER" def run(label: str, command: list[str]) -> bool: @@ -30,7 +50,7 @@ def run(label: str, command: list[str]) -> bool: def main() -> int: - print("IX-STELLARATORFORGE v0.5.0 QUALITY GATE\n") + print("IX-STELLARATORFORGE v0.9.0 QUALITY GATE\n") failures: list[str] = [] config = load_reactor_config(ROOT / "configs/reactor/sfr1_rev_a.json") @@ -49,6 +69,64 @@ def main() -> int: print(f"{'SFR-2 Rev A assumption-breaker invariants':.<52} {'PASS' if sfr2_spec_ok else 'FAIL'}") failures.extend(sfr2_errors) + try: + actuation_raw = json.loads( + (ROOT / "configs/reactor/sfr2_actuation_overlay_a.json").read_text(encoding="utf-8") + ) + actuation_errors = validate_actuation_config(actuation_raw) + actuation_spec_ok = not actuation_errors + except Exception as exc: # noqa: BLE001 + actuation_raw = {} + actuation_errors = (f"SFR-2 actuation overlay config parse/validation failed: {exc}",) + actuation_spec_ok = False + print(f"{'SFR-2 actuation-overlay invariants':.<52} {'PASS' if actuation_spec_ok else 'FAIL'}") + failures.extend(actuation_errors) + + try: + sfr3_raw = json.loads( + (ROOT / "configs/reactor/sfr3_field_integrity_shell_a.json").read_text( + encoding="utf-8" + ) + ) + sfr3_errors = validate_sfr3_config(sfr3_raw) + sfr3_spec_ok = not sfr3_errors + except Exception as exc: # noqa: BLE001 + sfr3_raw = {} + sfr3_errors = (f"SFR-3 field-integrity config parse/validation failed: {exc}",) + sfr3_spec_ok = False + print(f"{'SFR-3 field-integrity invariants':.<52} {'PASS' if sfr3_spec_ok else 'FAIL'}") + failures.extend(sfr3_errors) + + try: + dual_boundary_raw = json.loads( + (ROOT / "configs/reactor/sfr3_dual_boundary_ahis_a.json").read_text( + encoding="utf-8" + ) + ) + dual_boundary_errors = validate_dual_boundary_config(dual_boundary_raw) + dual_boundary_spec_ok = not dual_boundary_errors + except Exception as exc: # noqa: BLE001 + dual_boundary_raw = {} + dual_boundary_errors = (f"dual-boundary config parse/validation failed: {exc}",) + dual_boundary_spec_ok = False + print(f"{'SFR-3 dual-boundary invariants':.<52} {'PASS' if dual_boundary_spec_ok else 'FAIL'}") + failures.extend(dual_boundary_errors) + + try: + sfr4_raw = json.loads( + (ROOT / "configs/reactor/sfr4_integrated_physical_promotion_a.json").read_text( + encoding="utf-8" + ) + ) + sfr4_errors = validate_integrated_config(sfr4_raw) + sfr4_spec_ok = not sfr4_errors + except Exception as exc: # noqa: BLE001 + sfr4_raw = {} + sfr4_errors = (f"SFR-4 config parse/validation failed: {exc}",) + sfr4_spec_ok = False + print(f"{'SFR-4 integrated-campaign invariants':.<52} {'PASS' if sfr4_spec_ok else 'FAIL'}") + failures.extend(sfr4_errors) + json_files = ( "configs/reactor/parameter_ledger.json", "provenance/EXTERNAL_TECHNICAL_BASIS_2026.json", @@ -62,6 +140,25 @@ def main() -> int: "schemas/reactor/sfr2_reference.schema.json", "provenance/SFR2_TECHNICAL_BASIS_2026.json", "results/sfr2/sfr2_rev_a_screen_v050.json", + "configs/reactor/sfr2_actuation_overlay_a.json", + "schemas/reactor/sfr2_actuation_overlay.schema.json", + "provenance/SFR2_ACTUATION_TECHNICAL_BASIS_2026.json", + "results/sfr2_actuation/sfr2_actuation_overlay_a_v060.json", + "configs/reactor/sfr3_field_integrity_shell_a.json", + "schemas/reactor/sfr3_field_integrity_shell.schema.json", + "provenance/SFR3_FIELD_INTEGRITY_TECHNICAL_BASIS_2026.json", + "external_solvers/sfr3_field_integrity_evidence_contract.json", + "results/sfr3_field_integrity/sfr3_field_integrity_shell_a_v070.json", + "configs/reactor/sfr3_dual_boundary_ahis_a.json", + "schemas/reactor/sfr3_dual_boundary_ahis.schema.json", + "provenance/SFR3_DUAL_BOUNDARY_TECHNICAL_BASIS_2026.json", + "external_solvers/sfr3_dual_boundary_evidence_contract.json", + "results/sfr3_dual_boundary/sfr3_dual_boundary_ahis_a_v080.json", + "configs/reactor/sfr4_integrated_physical_promotion_a.json", + "schemas/reactor/sfr4_integrated_physical_promotion.schema.json", + "provenance/SFR4_INTEGRATED_TECHNICAL_BASIS_2026.json", + "external_solvers/sfr4_integrated_evidence_contract.json", + "results/sfr4_integrated/sfr4_integrated_physical_promotion_a_v090.json", "sbom.spdx.json", ) json_ok = True @@ -79,18 +176,18 @@ def main() -> int: citation = (ROOT / "CITATION.cff").read_text(encoding="utf-8") sbom = json.loads((ROOT / "sbom.spdx.json").read_text(encoding="utf-8")) version_ok = ( - version == "0.5.0" - and 'version = "0.5.0"' in pyproject - and 'version: "0.5.0"' in citation - and sbom["name"] == "IX-StellaratorForge-0.5.0-SBOM" - and sbom["packages"][0]["versionInfo"] == "0.5.0" + version == "0.9.0" + and 'version = "0.9.0"' in pyproject + and 'version: "0.9.0"' in citation + and sbom["name"] == "IX-StellaratorForge-0.9.0-SBOM" + and sbom["packages"][0]["versionInfo"] == "0.9.0" ) except Exception as exc: # noqa: BLE001 version_ok = False failures.append(f"release-version consistency failed: {exc}") - print(f"{'v0.5 release metadata consistency':.<52} {'PASS' if version_ok else 'FAIL'}") + print(f"{'v0.9 release metadata consistency':.<52} {'PASS' if version_ok else 'FAIL'}") if not version_ok: - failures.append("v0.5 release metadata inconsistent") + failures.append("v0.9 release metadata inconsistent") texts = [(ROOT / name).read_text(encoding="utf-8") for name in ("LICENSE", "LICENSING.md", "NOTICE", "README.md")] license_ok = all(CONTACT in text for text in texts) and LICENSE_REF in texts[0] @@ -111,6 +208,85 @@ def main() -> int: if not bom_ok: failures.append("full system BOM inventory check failed") + try: + with (ROOT / "BOM/SFR2_ACTUATION_OVERLAY_BOM.csv").open( + newline="", encoding="utf-8" + ) as f: + actuation_rows = list(csv.DictReader(f)) + actuation_ids = [row["ID"] for row in actuation_rows] + actuation_bom_ok = ( + len(actuation_rows) == 24 + and len(set(actuation_ids)) == 24 + and any(row["Quantity"] == "8" for row in actuation_rows) + and any(row["Quantity"] == "24" for row in actuation_rows) + ) + except Exception as exc: # noqa: BLE001 + actuation_bom_ok = False + failures.append(f"actuation BOM parse failed: {exc}") + print(f"{'SFR-2 actuation 24-row architecture BOM':.<52} {'PASS' if actuation_bom_ok else 'FAIL'}") + if not actuation_bom_ok: + failures.append("actuation overlay BOM inventory check failed") + + try: + with (ROOT / "BOM/SFR3_FIELD_INTEGRITY_SHELL_BOM.csv").open( + newline="", encoding="utf-8" + ) as f: + sfr3_rows = list(csv.DictReader(f)) + sfr3_ids = [row["ID"] for row in sfr3_rows] + dispositions = {row["Disposition"] for row in sfr3_rows} + sfr3_bom_ok = ( + len(sfr3_rows) == 52 + and len(set(sfr3_ids)) == 52 + and {"KEEP", "ADAPT", "NEW", "DEFER", "REJECT", "SEPARATE"}.issubset( + dispositions + ) + ) + except Exception as exc: # noqa: BLE001 + sfr3_bom_ok = False + failures.append(f"SFR-3 BOM parse failed: {exc}") + print(f"{'SFR-3 field-integrity 52-row BOM':.<52} {'PASS' if sfr3_bom_ok else 'FAIL'}") + if not sfr3_bom_ok: + failures.append("SFR-3 field-integrity BOM inventory check failed") + + try: + with (ROOT / "BOM/SFR3_DUAL_BOUNDARY_AHIS_BOM.csv").open( + newline="", encoding="utf-8" + ) as f: + dual_boundary_rows = list(csv.DictReader(f)) + dual_boundary_ids = [row["ID"] for row in dual_boundary_rows] + dual_boundary_dispositions = {row["Disposition"] for row in dual_boundary_rows} + dual_boundary_bom_ok = ( + len(dual_boundary_rows) == 64 + and len(set(dual_boundary_ids)) == 64 + and {"KEEP", "ADAPT", "NEW", "DEFER", "REJECT", "SEPARATE"}.issubset( + dual_boundary_dispositions + ) + ) + except Exception as exc: # noqa: BLE001 + dual_boundary_bom_ok = False + failures.append(f"dual-boundary BOM parse failed: {exc}") + print(f"{'SFR-3 dual-boundary 64-row BOM':.<52} {'PASS' if dual_boundary_bom_ok else 'FAIL'}") + if not dual_boundary_bom_ok: + failures.append("dual-boundary BOM inventory check failed") + + try: + with (ROOT / "BOM/SFR4_INTEGRATED_PROMOTION_BOM.csv").open( + newline="", encoding="utf-8" + ) as f: + sfr4_rows = list(csv.DictReader(f)) + sfr4_ids = [row["id"] for row in sfr4_rows] + sfr4_bom_ok = ( + len(sfr4_rows) == 64 + and len(set(sfr4_ids)) == 64 + and len({row["workstream"] for row in sfr4_rows}) == 7 + ) + except Exception as exc: # noqa: BLE001 + sfr4_bom_ok = False + failures.append(f"SFR-4 BOM parse failed: {exc}") + print(f"{'SFR-4 integrated 64-row BOM':.<52} {'PASS' if sfr4_bom_ok else 'FAIL'}") + if not sfr4_bom_ok: + failures.append("SFR-4 integrated BOM inventory check failed") + compiled = compileall.compile_dir(ROOT / "src/ix_stellaratorforge", quiet=1) compiled = compiled and compileall.compile_dir(ROOT / "tests/reactor", quiet=1) compiled = compiled and compileall.compile_dir(ROOT / "external_solvers/adapters", quiet=1) @@ -127,7 +303,7 @@ def main() -> int: for label, command in ( ("Inherited IX-Fusion/vNext gate", [sys.executable, "check_vnext.py"]), - ("Full pytest suite", [sys.executable, "-m", "pytest", "-q"]), + ("Full self-contained test suite", [sys.executable, "scripts/run_zero_arg_tests.py"]), ("Release manifest", [sys.executable, "scripts/verify_manifest.py"]), ): if not run(label, command): @@ -181,6 +357,174 @@ def main() -> int: if not sfr2_screen_ok: failures.append("SFR-2 screen stale, overclaimed, or inconsistent") + try: + persisted_actuation = json.loads( + (ROOT / "results/sfr2_actuation/sfr2_actuation_overlay_a_v060.json").read_text( + encoding="utf-8" + ) + ) + recomputed_actuation = run_actuation_overlay_screen(actuation_raw) + actuation_result = persisted_actuation["breathing_result"] + image_result = persisted_actuation["concept_image_result"] + actuation_screen_ok = ( + persisted_actuation == recomputed_actuation + and persisted_actuation["release"] == "0.6.0" + and actuation_result["verdict"] == ACTUATION_VERDICT + and actuation_result["any_joint_cycle_average_improvement"] is False + and actuation_result["any_cycle_average_proxy_pass"] is False + and persisted_actuation["model_rules"]["baseline_geometry_changed"] is False + and persisted_actuation["model_rules"]["magnetic_pumping_heating_credit"] == 0.0 + and persisted_actuation["model_rules"]["three_body_fusion_credit"] == 0.0 + and image_result["zero_D_closer_to_ignition_credit"] == 0.0 + and all( + status == "NOT_RUN" + for gate, status in persisted_actuation["promotion_status"].items() + if gate != "SFR2A_G0_OVERLAY_SPEC" + ) + ) + except Exception as exc: # noqa: BLE001 + actuation_screen_ok = False + failures.append(f"SFR-2 actuation persisted/recomputed screen failed: {exc}") + print(f"{'SFR-2 breathing/tri-lobe no-overclaim screen':.<52} {'PASS' if actuation_screen_ok else 'FAIL'}") + if not actuation_screen_ok: + failures.append("SFR-2 actuation screen stale, overclaimed, or inconsistent") + + try: + persisted_sfr3 = json.loads( + (ROOT / "results/sfr3_field_integrity/sfr3_field_integrity_shell_a_v070.json").read_text( + encoding="utf-8" + ) + ) + recomputed_sfr3 = run_sfr3_field_integrity_screen(sfr3_raw) + scenarios = {scenario["id"]: scenario for scenario in persisted_sfr3["scenarios"]} + sfr3_screen_ok = ( + persisted_sfr3 == recomputed_sfr3 + and persisted_sfr3["release"] == "0.7.0" + and persisted_sfr3["top_level_verdict"] == SFR3_VERDICT + and persisted_sfr3["screen_pass"] is True + and persisted_sfr3["model_definition"]["response_matrix_shape"] == [12, 24] + and persisted_sfr3["model_definition"]["response_matrix_rank"] == 12 + and scenarios["nominal"]["total_rms_reduction_fraction"] >= 0.60 + and scenarios["single_actuator_unavailable"]["total_rms_reduction_fraction"] >= 0.55 + and scenarios["passive_transient_only"]["active_correction_allowed"] is False + and scenarios["low_sensor_confidence"]["control_state"] == "PASSIVE_ONLY_SAFE_HOLD" + and all(value == 0.0 for key, value in persisted_sfr3["claim_boundary"].items() if key.endswith("_credit")) + and all(scenario["fusion_or_ignition_credit"] == 0.0 for scenario in persisted_sfr3["scenarios"]) + and all( + status == "NOT_RUN" + for gate, status in persisted_sfr3["promotion_status"].items() + if gate not in {"SFR3_G0_ARCHITECTURE_SPEC", "SFR3_G1_SYNTHETIC_CONTROLLABILITY"} + ) + ) + except Exception as exc: # noqa: BLE001 + sfr3_screen_ok = False + failures.append(f"SFR-3 persisted/recomputed screen failed: {exc}") + print(f"{'SFR-3 synthetic controllability no-overclaim':.<52} {'PASS' if sfr3_screen_ok else 'FAIL'}") + if not sfr3_screen_ok: + failures.append("SFR-3 screen stale, overclaimed, or inconsistent") + + try: + persisted_dual_boundary = json.loads( + (ROOT / "results/sfr3_dual_boundary/sfr3_dual_boundary_ahis_a_v080.json").read_text( + encoding="utf-8" + ) + ) + recomputed_dual_boundary = run_dual_boundary_screen(dual_boundary_raw, sfr3_raw) + dual_faults = { + scenario["id"]: scenario + for scenario in persisted_dual_boundary["fault_scenarios"] + } + selected_stack = next( + stack + for stack in persisted_dual_boundary["wall_stack_results"] + if stack["id"] == persisted_dual_boundary["selected_stack_id"] + ) + dual_boundary_screen_ok = ( + persisted_dual_boundary == recomputed_dual_boundary + and persisted_dual_boundary["release"] == "0.8.0" + and persisted_dual_boundary["top_level_verdict"] == DUAL_BOUNDARY_VERDICT + and persisted_dual_boundary["screen_pass"] is True + and persisted_dual_boundary["monitoring_inventory"][ + "paired_inner_outer_monitoring_locations" + ] + == 192 + and persisted_dual_boundary["monitoring_inventory"][ + "total_declared_sensing_elements" + ] + == 1736 + and selected_stack["nominal"]["all_layer_temperature_screens_pass"] is True + and selected_stack["upset_steady_upper_bound"][ + "all_layer_temperature_screens_pass" + ] + is True + and dual_faults["inner_hotspot_single_lane_failure"][ + "all_declared_signals_detected" + ] + is True + and dual_faults["silent_armor_crack"]["control_state"].startswith( + "NO_AUTOMATIC_DETECTION" + ) + and all( + value == 0.0 + for key, value in persisted_dual_boundary["claim_boundary"].items() + if key.endswith("_credit") + ) + and all( + scenario["fusion_or_ignition_credit"] == 0.0 + for scenario in persisted_dual_boundary["fault_scenarios"] + ) + and all( + status == "NOT_RUN" + for gate, status in persisted_dual_boundary["promotion_status"].items() + if gate + not in { + "SFR3D_G0_DUAL_BOUNDARY_SPEC", + "SFR3D_G1_REDUCED_THERMAL_AND_FAULT_SCREEN", + } + ) + ) + except Exception as exc: # noqa: BLE001 + dual_boundary_screen_ok = False + failures.append(f"dual-boundary persisted/recomputed screen failed: {exc}") + print(f"{'SFR-3 dual-boundary no-overclaim screen':.<52} {'PASS' if dual_boundary_screen_ok else 'FAIL'}") + if not dual_boundary_screen_ok: + failures.append("dual-boundary screen stale, overclaimed, or inconsistent") + + try: + persisted_sfr4 = json.loads( + (ROOT / "results/sfr4_integrated/sfr4_integrated_physical_promotion_a_v090.json").read_text( + encoding="utf-8" + ) + ) + recomputed_sfr4 = run_integrated_campaign(sfr4_raw) + coil = persisted_sfr4["workstreams"]["1_physical_coil_field"] + particles = persisted_sfr4["workstreams"]["4_particle_confinement"] + magnets = persisted_sfr4["workstreams"]["6_magnet_engineering"] + systems = persisted_sfr4["workstreams"]["7_reactor_systems"] + heat = persisted_sfr4["heat_exhaust_resolution"] + promotion = persisted_sfr4["promotion_summary"] + sfr4_screen_ok = ( + persisted_sfr4 == recomputed_sfr4 + and persisted_sfr4["release"] == "0.9.0" + and persisted_sfr4["top_level_verdict"] == SFR4_VERDICT + and coil["candidate_count"] == 80 + and coil["combined_pass_count"] == 0 + and coil["physical_coil_promoted"] is False + and particles["particle_confinement_promoted"] is False + and heat["nominal_and_declared_steady_heat_envelope_pass"] is True + and heat["transient_disruption_heat_resolved"] is False + and magnets["magnet_promoted"] is False + and systems["full_3D_TBR_calculated"] is False + and promotion["earned_fusion_progress_credit_fraction"] == 0.0 + and all(value == 0.0 for value in persisted_sfr4["claim_boundary"].values()) + ) + except Exception as exc: # noqa: BLE001 + sfr4_screen_ok = False + failures.append(f"SFR-4 persisted/recomputed campaign failed: {exc}") + print(f"{'SFR-4 integrated no-overclaim campaign':.<52} {'PASS' if sfr4_screen_ok else 'FAIL'}") + if not sfr4_screen_ok: + failures.append("SFR-4 campaign stale, overclaimed, or inconsistent") + openmc_adapter = (ROOT / "external_solvers/adapters/build_openmc_axisymmetric_proxy.py").read_text(encoding="utf-8") adapters_ok = "NOT the G7 final 3-D stellarator model" in openmc_adapter and "(n,Xt)" in openmc_adapter print(f"{'External solver fail-closed / OpenMC proxy boundary':.<52} {'PASS' if adapters_ok else 'FAIL'}") @@ -194,8 +538,12 @@ def main() -> int: print("-", failure) return 1 print("IX-STELLARATORFORGE: GREEN") - print("Meaning: release integrity, preserved SFR-1 v0.4 evidence, and the SFR-2 v0.5 assumption-breaker screen reproduce from committed inputs and code.") + print("Meaning: release integrity, preserved SFR-1/SFR-2/SFR-3 evidence, and the v0.9 integrated campaign reproduce from committed inputs and code.") print("SFR-2 primary result: no H_ISS04=1 case crosses its optimistic ignition proxy; dynamic compression receives no unmodeled phase/RF or flux-compression credit.") + print("SFR-2 actuation result: no declared breathing case improves both cycle-average proxy and fusion power; the tri-lobe translation receives zero unearned fusion credit.") + print("SFR-3 result: the synthetic bounded control and fault cases pass their declared thresholds; physical confinement and fusion credit remain zero.") + print("Dual-boundary result: reduced thermal and fault-routing screens pass; mechanical plasma-force, wall-lifetime, safety and fusion credit remain zero.") + print("SFR-4 result: 80 direct-filament coil cases produce zero topology passes; the declared nominal and steady heat envelope passes, but equilibrium, transport, transient heat, qualified magnets, TBR and fusion remain unproven.") print("It does NOT mean finite-beta dynamic MHD, kinetic confinement, qualified high-field magnets, full-3D TBR, ignition, net-electric fusion, safety qualification, or hardware operation has been demonstrated.") return 0 diff --git a/check_vnext.py b/check_vnext.py index f5fce3e..f62bbdd 100644 --- a/check_vnext.py +++ b/check_vnext.py @@ -28,7 +28,7 @@ def validate_json() -> None: print("IX-STELLARATORFORGE INHERITED vNEXT QUALITY GATE\n") validate_json() run("Inherited IX-Fusion foundation gate", [sys.executable, "check_green.py"]) -run("vNext tests", [sys.executable, "-m", "pytest", "-q", "tests/vnext"]) +run("vNext tests", [sys.executable, "scripts/run_zero_arg_tests.py", "tests/vnext"]) run("vNext readiness report", [sys.executable, "scripts/report_vnext_readiness.py"]) print("\nIX-STELLARATORFORGE INHERITED vNEXT: GREEN (architecture/research-contract level)") print("This does NOT mean a plasma, magnet, reactor, Q>1 system, or net-electric plant has been demonstrated.") diff --git a/configs/reactor/sfr2_actuation_overlay_a.json b/configs/reactor/sfr2_actuation_overlay_a.json new file mode 100644 index 0000000..7873116 --- /dev/null +++ b/configs/reactor/sfr2_actuation_overlay_a.json @@ -0,0 +1,52 @@ +{ + "as_of": "2026-08-21", + "baseline_design_id": "SFR-2-RevA", + "claim_boundary": "This phase-programmed actuation overlay is a low-authority analytical falsification screen. It does not demonstrate a realizable time-dependent magnetic field, nested flux surfaces, MHD stability, magnetic-pumping absorption, alpha confinement, ignition, sustained burn, net energy, buildable coils, or hardware.", + "concept_image_translation": { + "area_normalize_repeated_poloidal_m3": true, + "baseline_field_periods": 4, + "credits_astrophysical_gravity_or_accretion": false, + "credits_three_body_fusion": false, + "global_toroidal_lobe_count": 3, + "poloidal_m3_amplitude_fraction_sweep": [0.0, 0.02, 0.05, 0.1], + "statement": "The image is translated into an area-preserving poloidal m=3 shaping harmonic repeated inside each of the four baseline field periods. A global three-toroidal-lobe machine is not substituted for the unchanged 4FP ABAB baseline." + }, + "mechanical_architecture": { + "auxiliary_actuator_type": "normal_conducting_phase_programmed_saddle_coil_triplets", + "flexible_vacuum_vessel": false, + "primary_hts_field_mode": "steady_DC", + "pulses_primary_hts_coils": false, + "station_count": 8, + "independent_coil_circuits_per_station": 3, + "statement": "The vessel, blanket and primary HTS confinement system remain rigid and unchanged. Only an optional auxiliary field overlay is screened." + }, + "program": "IX-StellaratorForge", + "promotion_status": { + "SFR2A_G0_OVERLAY_SPEC": "PASS_SPEC_ONLY", + "SFR2A_G1_TIME_DEPENDENT_EQUILIBRIUM": "NOT_RUN", + "SFR2A_G2_COILS_AND_ELECTROMAGNETICS": "NOT_RUN", + "SFR2A_G3_MAGNETIC_PUMPING_KINETICS": "NOT_RUN", + "SFR2A_G4_PARTICLE_AND_ALPHA_ORBITS": "NOT_RUN", + "SFR2A_G5_TRANSPORT_AND_MHD": "NOT_RUN", + "SFR2A_G6_EDGE_AND_WALL_LOADS": "NOT_RUN", + "SFR2A_G7_INTEGRATED_POWER_BALANCE": "NOT_RUN", + "SFR2A_G8_HARDWARE": "NOT_RUN" + }, + "screen": { + "axis_field_T": 15.0, + "base_temperature_keV": 15.0, + "depth_fraction_sweep": [0.0, 0.0025, 0.005, 0.01, 0.02, 0.05], + "iota_2over3": 0.9, + "phase_patterns_deg": { + "abab_opposed": [0, 180, 0, 180], + "synchronous": [0, 0, 0, 0], + "traveling_quadrature": [0, 90, 180, 270] + }, + "sample_count_per_cycle": 720, + "screening_aspect_ratio": 4.5, + "sector_lengths_ft": [23.0, 26.0, 23.0, 26.0], + "sector_pattern": "ABAB", + "target_fusion_power_MW": 1000.0 + }, + "study_id": "SFR-2-Actuation-Overlay-A" +} diff --git a/configs/reactor/sfr3_dual_boundary_ahis_a.json b/configs/reactor/sfr3_dual_boundary_ahis_a.json new file mode 100644 index 0000000..088e867 --- /dev/null +++ b/configs/reactor/sfr3_dual_boundary_ahis_a.json @@ -0,0 +1,370 @@ +{ + "schema_version": "0.8.0", + "study_id": "SFR3-DUAL-BOUNDARY-AHIS-A", + "baseline_overlay_id": "SFR3-FIELD-INTEGRITY-SHELL-A", + "architecture": { + "name": "Dual Boundary Integrity Network A", + "vacuum_vessel_is_double_walled": true, + "mechanically_pushes_plasma_inward": false, + "inner_boundary_function": "monitor armor first-wall temperature and strain coolant state and local magnetic disturbance", + "outer_boundary_function": "monitor vacuum-vessel interspace shielding supports magnet alignment vibration and leak state", + "allowed_responses": [ + "active magnetic trim when SFR-3 resource gates pass", + "controlled power rundown", + "isolate affected coolant sector", + "passive or hard safe hold", + "inspection and remote replacement" + ], + "prohibited_response": "mechanical pressure against the plasma" + }, + "monitoring_geometry": { + "field_periods": 4, + "toroidal_control_sectors": 24, + "poloidal_locations_per_sector": 8, + "independent_sensor_lanes": 2, + "inner_localized_sensor_types": [ + "mineral_insulated_temperature", + "all_metal_or_radiation_qualified_strain" + ], + "outer_localized_sensor_types": [ + "radiation_qualified_optical_strain", + "optical_or_inductive_displacement" + ], + "sector_sensor_types": [ + "mineral_insulated_flux_loop", + "coolant_pressure_and_flow", + "interspace_pressure_and_leak", + "outer_vibration" + ], + "hard_vacuum_channels_per_field_period": 2, + "placement_rule": "No polymer PVDF or unqualified electronics face the plasma. Inner sensors sit behind armor or in protected feedthroughs; outer sensors sit behind the blanket or on vessel and support structures." + }, + "thermal_screen": { + "nominal_heat_flux_MW_m2": 0.25, + "upset_heat_flux_MW_m2": 1.0, + "upset_interpretation": "steady one-dimensional upper-bound screen only; not a transient disruption calculation", + "decision_weights": { + "thermal_screen_pass": 2.0, + "breeding_blanket_compatible": 2.0, + "low_activation_structure": 2.0, + "avoids_water_pbli_interaction": 1.0, + "structural_code_path": 1.0, + "joining_process_mature": 1.0, + "full_fusion_neutron_qualification": 2.0, + "preserves_magnetic_clearance": 1.0 + } + }, + "selected_stack_id": "DB-A_DCLL_MONITORED_RAFT", + "wall_stack_candidates": [ + { + "id": "DB-A_DCLL_MONITORED_RAFT", + "name": "Segmented tungsten plus graded W-RAFM plus helium-cooled RAFM and DCLL blanket", + "status": "SELECTED_BALANCED_REFERENCE__NOT_QUALIFIED", + "coolant": "high-pressure helium in first-wall channels; PbLi breeder loop remains electrically isolated", + "coolant_bulk_temperature_C": 350.0, + "coolant_heat_transfer_coefficient_W_m2K": 25000.0, + "maximum_raw_cte_mismatch_strain_proxy": 0.003, + "solid_layers_plasma_to_coolant": [ + { + "id": "segmented_tungsten_armor", + "material": "segmented tungsten; long-fiber Wf-W retained as replaceable qualification coupon", + "thickness_m": 0.005, + "effective_k_W_mK": 90.0, + "effective_cte_per_K": 0.0000045, + "declared_max_service_temperature_C": 1600.0 + }, + { + "id": "graded_w_rafm_transition", + "material": "functionally graded tungsten-to-RAFM transition candidate", + "thickness_m": 0.002, + "effective_k_W_mK": 45.0, + "effective_cte_per_K": 0.000008, + "declared_max_service_temperature_C": 800.0 + }, + { + "id": "helium_cooled_rafm_first_wall", + "material": "ODS-Eurofer or qualified RAFM first-wall structure", + "thickness_m": 0.004, + "effective_k_W_mK": 28.0, + "effective_cte_per_K": 0.000012, + "declared_max_service_temperature_C": 550.0 + } + ], + "integration_gates": { + "breeding_blanket_compatible": true, + "low_activation_structure": true, + "avoids_water_pbli_interaction": true, + "structural_code_path": true, + "joining_process_mature": false, + "full_fusion_neutron_qualification": false, + "preserves_magnetic_clearance": true + }, + "downstream_layers": [ + "PbLi DCLL blanket in RAFM cassette with SiC or alumina flow-channel insert", + "monitored 316LN-class double-wall vacuum vessel with evacuated leak-detection interspace", + "WC plus B4C graded neutron shield with HfH1.7 local option uncredited until 3-D OpenMC", + "thermal shield cryostat REBCO coils and monitored nonmagnetic support shell" + ] + }, + { + "id": "DB-B_WCU_WATER", + "name": "Tungsten plus W-Cu graded joint plus water-cooled CuCrZr heat sink", + "status": "THERMALLY_FAVORABLE__DEFERRED_INTEGRATED_REACTOR_BRANCH", + "coolant": "pressurized water", + "coolant_bulk_temperature_C": 150.0, + "coolant_heat_transfer_coefficient_W_m2K": 50000.0, + "maximum_raw_cte_mismatch_strain_proxy": 0.003, + "solid_layers_plasma_to_coolant": [ + { + "id": "segmented_tungsten_armor", + "material": "segmented tungsten", + "thickness_m": 0.005, + "effective_k_W_mK": 90.0, + "effective_cte_per_K": 0.0000045, + "declared_max_service_temperature_C": 1600.0 + }, + { + "id": "w_cu_fgm", + "material": "W-Cu functionally graded transition", + "thickness_m": 0.002, + "effective_k_W_mK": 150.0, + "effective_cte_per_K": 0.00001, + "declared_max_service_temperature_C": 800.0 + }, + { + "id": "cucrzr_heat_sink", + "material": "CuCrZr heat sink", + "thickness_m": 0.01, + "effective_k_W_mK": 250.0, + "effective_cte_per_K": 0.000017, + "declared_max_service_temperature_C": 350.0 + } + ], + "integration_gates": { + "breeding_blanket_compatible": true, + "low_activation_structure": false, + "avoids_water_pbli_interaction": false, + "structural_code_path": true, + "joining_process_mature": true, + "full_fusion_neutron_qualification": false, + "preserves_magnetic_clearance": true + }, + "downstream_layers": [ + "separate breeder blanket required", + "monitored double-wall vacuum vessel", + "graded magnet shield and cryostat" + ] + }, + { + "id": "DB-C_SIC_HIGH_TEMP", + "name": "Tungsten plus graded W-SiC plus helium-cooled SiCf-SiC first wall", + "status": "HIGH_TEMPERATURE_RESEARCH_BRANCH__DEFERRED", + "coolant": "high-pressure helium", + "coolant_bulk_temperature_C": 500.0, + "coolant_heat_transfer_coefficient_W_m2K": 20000.0, + "maximum_raw_cte_mismatch_strain_proxy": 0.003, + "solid_layers_plasma_to_coolant": [ + { + "id": "segmented_tungsten_armor", + "material": "segmented tungsten", + "thickness_m": 0.003, + "effective_k_W_mK": 90.0, + "effective_cte_per_K": 0.0000045, + "declared_max_service_temperature_C": 1600.0 + }, + { + "id": "graded_w_sic_transition", + "material": "graded W-SiC transition candidate", + "thickness_m": 0.002, + "effective_k_W_mK": 30.0, + "effective_cte_per_K": 0.0000048, + "declared_max_service_temperature_C": 1200.0 + }, + { + "id": "sicf_sic_first_wall", + "material": "SiCf-SiC composite first-wall structure", + "thickness_m": 0.005, + "effective_k_W_mK": 25.0, + "effective_cte_per_K": 0.0000048, + "declared_max_service_temperature_C": 1200.0 + } + ], + "integration_gates": { + "breeding_blanket_compatible": true, + "low_activation_structure": true, + "avoids_water_pbli_interaction": true, + "structural_code_path": false, + "joining_process_mature": false, + "full_fusion_neutron_qualification": false, + "preserves_magnetic_clearance": true + }, + "downstream_layers": [ + "PbLi blanket with reduced structural steel fraction", + "monitored double-wall vacuum vessel", + "graded magnet shield and cryostat" + ] + } + ], + "signal_channels": { + "inner_temperature": ["inner_temperature:A", "inner_temperature:B"], + "inner_strain": ["inner_strain:A", "inner_strain:B"], + "coolant_leak": ["coolant_state:A", "coolant_state:B", "interspace_leak:A", "interspace_leak:B"], + "interspace_pressure": ["interspace_leak:A", "interspace_leak:B"], + "outer_displacement": ["outer_displacement:A", "outer_displacement:B"], + "flux_error": ["flux_loop:A", "flux_loop:B"], + "outer_vibration": ["outer_vibration:A", "outer_vibration:B"], + "vacuum_loss": ["hard_vacuum:A", "hard_vacuum:B"] + }, + "fault_scenarios": [ + { + "id": "nominal", + "description": "All boundaries and channels healthy.", + "event_signals": [], + "failed_channels": [], + "latent_fault_without_declared_signal": false, + "observability_lost": false, + "total_control_power_lost": false, + "sfr3_active_trim_available": true, + "expected_control_state": "NOMINAL" + }, + { + "id": "inner_hotspot_single_lane_failure", + "description": "Local first-wall hotspot with lane A temperature channel failed.", + "event_signals": ["inner_temperature"], + "failed_channels": ["inner_temperature:A"], + "latent_fault_without_declared_signal": false, + "observability_lost": false, + "total_control_power_lost": false, + "sfr3_active_trim_available": true, + "expected_control_state": "CONTROLLED_POWER_RUNDOWN_AND_INSPECT" + }, + { + "id": "coolant_leak_single_lane_failure", + "description": "First-wall coolant leak with one interspace leak channel failed.", + "event_signals": ["coolant_leak", "interspace_pressure"], + "failed_channels": ["interspace_leak:A"], + "latent_fault_without_declared_signal": false, + "observability_lost": false, + "total_control_power_lost": false, + "sfr3_active_trim_available": true, + "expected_control_state": "ISOLATE_AFFECTED_SECTOR_AND_SAFE_HOLD" + }, + { + "id": "outer_support_shift", + "description": "Outer support movement is correlated with a measured magnetic error.", + "event_signals": ["outer_displacement", "flux_error"], + "failed_channels": [], + "latent_fault_without_declared_signal": false, + "observability_lost": false, + "total_control_power_lost": false, + "sfr3_active_trim_available": true, + "expected_control_state": "ACTIVE_TRIM_THEN_CONTROLLED_INSPECTION" + }, + { + "id": "inner_lane_a_loss", + "description": "The complete inner lane A is lost without a physical event.", + "event_signals": [], + "failed_channels": ["inner_temperature:A", "inner_strain:A", "coolant_state:A", "flux_loop:A"], + "latent_fault_without_declared_signal": false, + "observability_lost": false, + "total_control_power_lost": false, + "sfr3_active_trim_available": true, + "expected_control_state": "DEGRADED_MONITORING_SINGLE_LANE_RETAINED" + }, + { + "id": "outer_lane_a_loss", + "description": "The complete outer lane A is lost without a physical event.", + "event_signals": [], + "failed_channels": ["outer_displacement:A", "outer_vibration:A", "interspace_leak:A"], + "latent_fault_without_declared_signal": false, + "observability_lost": false, + "total_control_power_lost": false, + "sfr3_active_trim_available": true, + "expected_control_state": "DEGRADED_MONITORING_SINGLE_LANE_RETAINED" + }, + { + "id": "sector_dual_bus_loss", + "description": "Both sensing lanes are lost in one control sector.", + "event_signals": [], + "failed_channels": [], + "latent_fault_without_declared_signal": false, + "observability_lost": true, + "total_control_power_lost": false, + "sfr3_active_trim_available": false, + "expected_control_state": "SAFE_HOLD_LOST_OBSERVABILITY" + }, + { + "id": "vacuum_breach", + "description": "Vacuum loss is detected by independent hard channels and the interspace network.", + "event_signals": ["vacuum_loss", "interspace_pressure"], + "failed_channels": [], + "latent_fault_without_declared_signal": false, + "observability_lost": false, + "total_control_power_lost": false, + "sfr3_active_trim_available": false, + "expected_control_state": "ISOLATE_AFFECTED_SECTOR_AND_SAFE_HOLD" + }, + { + "id": "total_control_power_loss", + "description": "Control power is lost; independent hard protection commands passive safe hold.", + "event_signals": [], + "failed_channels": [], + "latent_fault_without_declared_signal": false, + "observability_lost": false, + "total_control_power_lost": true, + "sfr3_active_trim_available": false, + "expected_control_state": "PASSIVE_HARD_SAFE_HOLD" + }, + { + "id": "silent_armor_crack", + "description": "An armor crack below online sensor sensitivity is deliberately retained as an undetected fault requiring periodic NDE.", + "event_signals": [], + "failed_channels": [], + "latent_fault_without_declared_signal": true, + "observability_lost": false, + "total_control_power_lost": false, + "sfr3_active_trim_available": true, + "expected_control_state": "NO_AUTOMATIC_DETECTION__PERIODIC_NDE_REQUIRED" + }, + { + "id": "support_shift_trim_unavailable", + "description": "A support shift is detected while active trim is unavailable.", + "event_signals": ["outer_displacement", "flux_error"], + "failed_channels": [], + "latent_fault_without_declared_signal": false, + "observability_lost": false, + "total_control_power_lost": false, + "sfr3_active_trim_available": false, + "expected_control_state": "SAFE_HOLD_ALIGNMENT_ERROR_UNCORRECTED" + } + ], + "claim_boundary": { + "mechanical_plasma_confinement_credit": 0.0, + "magnetic_confinement_gain_credit": 0.0, + "fusion_power_gain_credit": 0.0, + "ignition_gain_credit": 0.0, + "safety_qualification_credit": 0.0, + "statement": "The dual boundary protects vacuum coolant radioactive inventory and magnetic alignment. It does not push plasma inward or prove wall lifetime." + }, + "promotion_status": { + "SFR3D_G0_DUAL_BOUNDARY_SPEC": "PASS_SPEC_ONLY", + "SFR3D_G1_REDUCED_THERMAL_AND_FAULT_SCREEN": "PASS_LOW_AUTHORITY_SYNTHETIC_ONLY", + "SFR3D_G2_COUPLED_THERMAL_CFD_AND_STRESS_FEA": "NOT_RUN", + "SFR3D_G3_FRACTURE_EROSION_AND_LIFETIME": "NOT_RUN", + "SFR3D_G4_SENSOR_RADIATION_AND_CALIBRATION": "NOT_RUN", + "SFR3D_G5_3D_MAGNETIC_COUPLING": "NOT_RUN", + "SFR3D_G6_3D_NEUTRONICS_TBR_AND_HEATING": "NOT_RUN", + "SFR3D_G7_INTEGRATED_TRITIUM_AND_COOLANT_SAFETY": "NOT_RUN", + "SFR3D_G8_REMOTE_MAINTENANCE_AND_AVAILABILITY": "NOT_RUN", + "SFR3D_G9_HARDWARE": "NOT_RUN" + }, + "next_required_evidence": [ + "Coupled 3-D heat transfer CFD electromagnetic load and nonlinear structural FEA for every wall interface and port.", + "Fracture creep fatigue erosion and irradiation lifetime with material batch and joining-process data.", + "Radiation and temperature qualification of each sensor feedthrough cable and calibration chain.", + "CAD-linked magnetic analysis proving that vessel blanket sensors and shield materials do not create unacceptable field error.", + "Full 3-D OpenMC neutronics including TBR nuclear heating damage gas production sensor dose and streaming.", + "Helium PbLi tritium leak fire chemical and decay-heat safety analysis with independent protection credit.", + "Instrumented subscale double-wall coupon followed by sector prototype fault injection and high-heat-flux testing." + ] +} diff --git a/configs/reactor/sfr3_field_integrity_shell_a.json b/configs/reactor/sfr3_field_integrity_shell_a.json new file mode 100644 index 0000000..b95d63c --- /dev/null +++ b/configs/reactor/sfr3_field_integrity_shell_a.json @@ -0,0 +1,191 @@ +{ + "schema_version": "0.7.0", + "study_id": "SFR3-FIELD-INTEGRITY-SHELL-A", + "baseline_design_id": "SFR-1-RevA", + "architecture": { + "name": "Field Integrity Shell A", + "primary_field_is_steady": true, + "vacuum_vessel_is_flexible": false, + "passive_material_claimed_to_confine_plasma": false, + "active_layer": "individually driven planar trim coils outside the blanket and vacuum boundary", + "passive_layer": "flux-conserving superconducting loops for time-varying perturbations only", + "observability_layer": "magnetic, coil-current, quench, cryogenic strain and support-motion sensing", + "mechanical_layer": "warm-side modal damping and alignment surveillance", + "shielding_layer": "geometry-aware graded shielding around REBCO and penetrations", + "plasma_facing_layer": "segmented tungsten-family armor; no wall-confinement credit" + }, + "harmonic_screen": { + "field_periods": 4, + "axis_field_T_context_only": 8.0, + "coefficient_unit_Bn_over_Baxis": 0.0001, + "coefficient_note": "All challenge coefficients are synthetic multiples of 1e-4 B_axis, not measurements or a solved coil error spectrum.", + "actuator_count": 24, + "actuator_helical_index": 7, + "gap_attenuation_factor": 0.18, + "response_per_full_command_units": 0.12, + "ridge_regularization": 0.0001, + "max_abs_command": 1.0, + "passive_transient_attenuation_fraction": 0.55, + "minimum_nominal_rms_reduction_fraction": 0.6, + "minimum_single_failure_rms_reduction_fraction": 0.55, + "minimum_passive_transient_reduction_fraction": 0.5, + "maximum_regularized_condition_number": 10.0, + "modes": [ + {"m": 1, "n": 0, "purpose": "axis and vertical-field-like error"}, + {"m": 1, "n": 1, "purpose": "global symmetry-breaking error"}, + {"m": 1, "n": 4, "purpose": "field-period-synchronous boundary error"}, + {"m": 2, "n": 1, "purpose": "low-order resonant challenge"}, + {"m": 2, "n": 4, "purpose": "field-period-synchronous shape error"}, + {"m": 3, "n": 1, "purpose": "tri-lobe translation as a correction harmonic only"} + ], + "static_error_coefficients": [0.9, -0.4, 0.45, 0.25, -0.3, 0.55, 0.18, -0.22, 0.27, 0.16, -0.12, 0.2], + "transient_error_coefficients": [0.18, 0.08, -0.12, 0.05, 0.09, -0.07, 0.06, 0.03, -0.05, 0.04, 0.03, -0.06] + }, + "resource_gate_thresholds": { + "minimum_sensor_confidence": 0.8, + "minimum_trim_thermal_margin_fraction": 0.2 + }, + "scenarios": [ + { + "id": "nominal", + "description": "All passive and active layers healthy.", + "static_error_scale": 1.0, + "transient_error_scale": 1.0, + "active_correction_requested": true, + "sensor_confidence": 0.97, + "trim_power_available": true, + "trim_thermal_margin_fraction": 0.45, + "active_coil_quench_detected": false, + "independent_watchdog_healthy": true, + "passive_loops_available": true, + "passive_loop_quench_detected": false, + "failed_actuator_indices": [] + }, + { + "id": "single_actuator_unavailable", + "description": "One of 24 trim-coil channels is unavailable.", + "static_error_scale": 1.0, + "transient_error_scale": 1.0, + "active_correction_requested": true, + "sensor_confidence": 0.95, + "trim_power_available": true, + "trim_thermal_margin_fraction": 0.4, + "active_coil_quench_detected": false, + "independent_watchdog_healthy": true, + "passive_loops_available": true, + "passive_loop_quench_detected": false, + "failed_actuator_indices": [7] + }, + { + "id": "low_sensor_confidence", + "description": "Sensor disagreement forces passive-only safe hold.", + "static_error_scale": 1.0, + "transient_error_scale": 1.0, + "active_correction_requested": true, + "sensor_confidence": 0.45, + "trim_power_available": true, + "trim_thermal_margin_fraction": 0.45, + "active_coil_quench_detected": false, + "independent_watchdog_healthy": true, + "passive_loops_available": true, + "passive_loop_quench_detected": false, + "failed_actuator_indices": [] + }, + { + "id": "passive_loop_quench", + "description": "Passive loop is isolated; healthy active trim remains resource-gated and bounded.", + "static_error_scale": 1.0, + "transient_error_scale": 1.0, + "active_correction_requested": true, + "sensor_confidence": 0.96, + "trim_power_available": true, + "trim_thermal_margin_fraction": 0.42, + "active_coil_quench_detected": false, + "independent_watchdog_healthy": true, + "passive_loops_available": true, + "passive_loop_quench_detected": true, + "failed_actuator_indices": [] + }, + { + "id": "active_coil_quench", + "description": "An active trim-coil quench blocks all powered correction and leaves only healthy passive response.", + "static_error_scale": 1.0, + "transient_error_scale": 1.0, + "active_correction_requested": true, + "sensor_confidence": 0.96, + "trim_power_available": true, + "trim_thermal_margin_fraction": 0.42, + "active_coil_quench_detected": true, + "independent_watchdog_healthy": true, + "passive_loops_available": true, + "passive_loop_quench_detected": false, + "failed_actuator_indices": [] + }, + { + "id": "thermal_margin_exhausted", + "description": "Insufficient trim thermal margin blocks powered correction before a quench.", + "static_error_scale": 1.0, + "transient_error_scale": 1.0, + "active_correction_requested": true, + "sensor_confidence": 0.96, + "trim_power_available": true, + "trim_thermal_margin_fraction": 0.05, + "active_coil_quench_detected": false, + "independent_watchdog_healthy": true, + "passive_loops_available": true, + "passive_loop_quench_detected": false, + "failed_actuator_indices": [] + }, + { + "id": "passive_transient_only", + "description": "A pure time-varying challenge tests passive attenuation with active trim deliberately disabled.", + "static_error_scale": 0.0, + "transient_error_scale": 1.0, + "active_correction_requested": false, + "sensor_confidence": 0.98, + "trim_power_available": true, + "trim_thermal_margin_fraction": 0.5, + "active_coil_quench_detected": false, + "independent_watchdog_healthy": true, + "passive_loops_available": true, + "passive_loop_quench_detected": false, + "failed_actuator_indices": [] + } + ], + "donor_translation": { + "AHIS": "ADAPT observability, confidence-aware state estimation, watchdog and fault latching; REJECT hull-healing or direct plasma credit.", + "PressureX": "ADAPT passive rate-dependent load shaping to warm supports; REJECT the donor impact model and any plasma-volume fluid.", + "IX-Vibe": "ADAPT measured-mode targeting, shunt damping and alignment surveillance; REJECT broadband material as a field source.", + "IX-Breath": "ADAPT resource gates, bounded states and safe hold; REJECT flexible-vessel breathing.", + "IX-GCR-SPE": "ADAPT shadow-vault placement and graded protection around vulnerable magnets; REJECT space-radiation performance transfer.", + "IX-Shield": "ADAPT weak-direction and areal-density bookkeeping; REJECT hydrogen-rich low-temperature material near the fusion core.", + "IX-HfTaZen-Shield": "ADAPT segmentation, compliant interfaces and hotspot monitoring; REJECT Hf/Ta as routine plasma-facing armor." + }, + "claim_boundary": { + "confinement_gain_credit": 0.0, + "fusion_power_gain_credit": 0.0, + "ignition_gain_credit": 0.0, + "net_electric_gain_credit": 0.0, + "statement": "Passing this screen proves only controllability of a synthetic linear harmonic challenge." + }, + "promotion_status": { + "SFR3_G0_ARCHITECTURE_SPEC": "PASS_SPEC_ONLY", + "SFR3_G1_SYNTHETIC_CONTROLLABILITY": "PASS_LOW_AUTHORITY_SYNTHETIC_ONLY", + "SFR3_G2_BIOT_SAVART_COIL_RESPONSE": "NOT_RUN", + "SFR3_G3_FREE_BOUNDARY_EQUILIBRIUM_AND_ISLANDS": "NOT_RUN", + "SFR3_G4_PARTICLE_AND_ALPHA_ORBITS": "NOT_RUN", + "SFR3_G5_TRANSPORT_AND_MHD": "NOT_RUN", + "SFR3_G6_COIL_STRESS_QUENCH_AND_CRYOGENICS": "NOT_RUN", + "SFR3_G7_FULL_3D_NEUTRONICS_AND_TBR": "NOT_RUN", + "SFR3_G8_INTEGRATED_BURN_AND_PLANT": "NOT_RUN", + "SFR3_G9_HARDWARE": "NOT_RUN" + }, + "next_required_evidence": [ + "Replace the analytic response matrix with CAD-linked Biot-Savart responses including blanket steel and ports.", + "Solve free-boundary finite-beta equilibria and quantify island widths, effective ripple and strike-point motion.", + "Run guiding-center and alpha-orbit loss calculations before any confinement claim.", + "Run structural FEA with coil-support co-optimization and measured modal response.", + "Run 3-D OpenMC neutronics for WC/B4C/HfH candidate shields and REBCO lifetime.", + "Close trim-coil power, cryogenic, quench, radiation and failure-mode budgets in hardware." + ] +} diff --git a/configs/reactor/sfr4_integrated_physical_promotion_a.json b/configs/reactor/sfr4_integrated_physical_promotion_a.json new file mode 100644 index 0000000..a11e525 --- /dev/null +++ b/configs/reactor/sfr4_integrated_physical_promotion_a.json @@ -0,0 +1,173 @@ +{ + "schema_version": "0.9.0", + "study_id": "SFR4-INTEGRATED-PHYSICAL-PROMOTION-A", + "workstreams": [ + "physical_coil_field", + "finite_beta_equilibrium", + "coil_plasma_codesign", + "particle_confinement", + "self_consistent_burn", + "magnet_engineering", + "reactor_systems" + ], + "coil_field_scan": { + "major_radius_m": 8.0, + "minor_radius_m": 1.7, + "axis_field_T": 6.0, + "plasma_to_coil_clearance_m": 1.35, + "field_periods": [2, 3, 4, 6], + "helical_coil_count": 4, + "sign_patterns": ["same", "alternating"], + "helical_to_tf_current_ratios": [0.05, 0.08, 0.12, 0.18, 0.25, 0.35, 0.5, 0.7, 0.85, 1.0], + "field_line_turns": 3, + "steps_per_turn": 48, + "iota_target": 0.55, + "iota_acceptance": [0.25, 0.8], + "max_excursion_fraction": 0.2, + "normal_field_rms_limit": 0.005, + "rebco_strain_target_fraction": 0.0035, + "rebco_strain_ceiling_fraction": 0.004 + }, + "particle_screen": { + "alpha_energy_MeV": 3.5, + "maximum_gyroradius_over_minor_radius": 0.05 + }, + "burn_screen": { + "temperature_keV": 15.0, + "beta": 0.03, + "target_fusion_power_MW": 1000.0, + "plasma_gain_Q": 20.0, + "design_iota_for_requirement_only": 0.55, + "zeff": 1.5, + "alpha_deposition_fraction_assumption": 0.9 + }, + "heat_exhaust": { + "concept": "24-sector long-leg island-divertor requirement with controlled radiation and replaceable W/CuCrZr targets", + "controlled_radiation_fraction": 0.6, + "first_wall_area_multiplier": 1.0, + "first_wall_peaking_factor": 1.15, + "first_wall_nominal_limit_MW_m2": 0.5, + "first_wall_upset_heat_flux_MW_m2": 1.0, + "effective_divertor_wetted_area_m2": 24.0, + "divertor_peaking_factor": 1.5, + "divertor_steady_limit_MW_m2": 10.0, + "radiation_fraction_sensitivity": [0.4, 0.5, 0.6, 0.7], + "wetted_area_sensitivity_m2": [12.0, 18.0, 24.0, 30.0], + "divertor_coolant_bulk_temperature_C": 150.0, + "divertor_heat_transfer_coefficient_W_m2K": 70000.0, + "divertor_layers_coolant_to_surface": [ + { + "id": "CuCrZr_heat_sink", + "thickness_m": 0.002, + "k_W_mK": 250.0, + "declared_max_temperature_C": 350.0 + }, + { + "id": "OFHC_Cu_compliant_interlayer", + "thickness_m": 0.001, + "k_W_mK": 300.0, + "declared_max_temperature_C": 500.0 + }, + { + "id": "segmented_tungsten_monoblock", + "thickness_m": 0.006, + "k_W_mK": 90.0, + "declared_max_temperature_C": 1200.0 + } + ], + "divertor_water_loop": { + "density_kg_m3": 917.0, + "specific_heat_J_kgK": 4300.0, + "outlet_minus_inlet_K": 50.0, + "parallel_channels": 960, + "channel_width_m": 0.008, + "channel_height_m": 0.008, + "channel_length_m": 1.2, + "darcy_friction_factor": 0.02, + "minor_loss_coefficient": 4.0, + "pump_efficiency": 0.7, + "maximum_velocity_m_s": 10.0, + "maximum_pumping_power_MW": 5.0 + }, + "water_PbLi_separation_requirement": "Independent double-wall divertor coolant boundary, guard vacuum and leak detection separate water from every PbLi sector. No shared heat exchanger or common penetration." + }, + "selected_first_wall_stack": { + "id": "DB-A2_DCLL_HEAT_RESOLVED_SCREEN", + "name": "Segmented tungsten, graded W-RAFM, helium-cooled ODS-RAFM first wall and separate PbLi DCLL blanket", + "status": "SELECTED_FOR_REDUCED_HEAT_CAMPAIGN__NOT_QUALIFIED", + "coolant": "high-pressure helium first-wall channels isolated from PbLi and divertor water", + "coolant_bulk_temperature_C": 350.0, + "coolant_heat_transfer_coefficient_W_m2K": 35000.0, + "maximum_raw_cte_mismatch_strain_proxy": 0.003, + "solid_layers_plasma_to_coolant": [ + { + "id": "segmented_tungsten_armor", + "material": "segmented tungsten", + "thickness_m": 0.003, + "effective_k_W_mK": 90.0, + "effective_cte_per_K": 0.0000045, + "declared_max_service_temperature_C": 1600.0 + }, + { + "id": "graded_w_rafm_transition", + "material": "functionally graded tungsten-to-RAFM transition candidate", + "thickness_m": 0.001, + "effective_k_W_mK": 55.0, + "effective_cte_per_K": 0.000008, + "declared_max_service_temperature_C": 800.0 + }, + { + "id": "helium_cooled_ods_rafm_first_wall", + "material": "ODS-Eurofer or qualified RAFM with distributed helium microchannels", + "thickness_m": 0.003, + "effective_k_W_mK": 32.0, + "effective_cte_per_K": 0.000012, + "declared_max_service_temperature_C": 550.0 + } + ], + "integration_gates": { + "breeding_blanket_compatible": true, + "low_activation_structure": true, + "avoids_water_pbli_interaction": true, + "structural_code_path": true, + "joining_process_mature": false, + "full_fusion_neutron_qualification": false, + "preserves_magnetic_clearance": true + }, + "downstream_layers": [ + "electrically insulated PbLi DCLL blanket", + "monitored double-wall vessel interspace", + "WC-B4C neutron shield", + "thermal shield cryostat and REBCO magnets" + ] + }, + "first_wall_decision_weights": { + "thermal_screen_pass": 2.0, + "breeding_blanket_compatible": 2.0, + "low_activation_structure": 2.0, + "avoids_water_pbli_interaction": 1.0, + "structural_code_path": 1.0, + "joining_process_mature": 1.0, + "full_fusion_neutron_qualification": 2.0, + "preserves_magnetic_clearance": 1.0 + }, + "magnet_engineering": { + "peak_field_on_conductor_limit_T": 20.0 + }, + "reactor_systems": { + "global_tbr_target": 1.15, + "breeding_coverage_fraction": 0.85, + "blanket_energy_multiplier": 1.15, + "gross_thermal_efficiency": 0.4, + "base_recirculating_power_MW": 120.0 + }, + "claim_boundary": { + "fusion_progress_credit_fraction": 0.0, + "mechanical_wall_confinement_credit": 0.0, + "production_equilibrium_credit": 0.0, + "particle_confinement_credit": 0.0, + "ignition_credit": 0.0, + "safety_qualification_credit": 0.0, + "hardware_credit": 0.0 + } +} diff --git a/docs/20_RESULTS_LEDGER.md b/docs/20_RESULTS_LEDGER.md index ab5301b..9aecafd 100644 --- a/docs/20_RESULTS_LEDGER.md +++ b/docs/20_RESULTS_LEDGER.md @@ -1,5 +1,58 @@ # Results Ledger +## Release 0.9 status + +| Question | Status | Evidence | +|---|---|---| +| Were all seven computational workstreams attempted? | YES | `results/sfr4_integrated/sfr4_integrated_physical_promotion_a_v090.json` | +| Does the expanded physical coil family pass? | NO | 0 of 80 candidates pass combined topology requirements | +| Did production equilibrium run? | NO | DESC and VMEC++ adapters stop because dependencies are unavailable | +| Is alpha confinement established? | NO | gyroradius scale passes, topology prerequisite and guiding-center evidence do not | +| Does the Q=20 design-iota requirement close at H_ISS04=1? | NO | required H is approximately 2.00 after declared bremsstrahlung and alpha deposition | +| Does the selected nominal and steady heat envelope pass? | YES at low authority | 0.294 MW/m2 first wall and 5.724 MW/m2 divertor peak screens | +| Are heat transients, fatigue and component life resolved? | NO | production edge, CFD, FEA and hardware gates remain unrun | +| Does the conditional plant ledger remain positive? | YES conditionally | approximately 339.88 MWe, with no prediction credit | +| Did v0.9 earn fusion progress? | NO | earned credit remains exactly zero | + +## Release 0.8 status + +| Question | Status | Evidence | +|---|---|---| +| Is the proposed inward/outer AHIS represented as two independent boundaries? | YES at architecture authority | `results/sfr3_dual_boundary/sfr3_dual_boundary_ahis_a_v080.json` | +| Which wall stack wins the declared balanced screen? | DB-A: W/RAFM/PbLi DCLL | score 9 versus 7 and 8 for the comparison stacks | +| Does the selected stack stay under declared temperature ceilings in the 1-D screen? | YES at low authority | 420.7 °C nominal; 632.9 °C steady-upset surface | +| Are inner and outer conditions observable in the declared model? | YES, incompletely | 192 paired locations and 1,736 sensing elements; irradiation/calibration unqualified | +| Do the eleven declared fault scenarios fail as expected? | YES deterministically | expected states exactly reproduce | +| Can every crack be detected? | NO | the silent armor crack remains below sensor sensitivity and requires periodic NDE | +| Do walls or sensors mechanically confine plasma? | NO | magnetic confinement is unchanged; direct credit is zero | +| Did v0.8 move the earned ignition or fusion result? | NO | fusion and ignition improvements remain exactly zero | + +## Release 0.7 status + +| Question | Status | Evidence | +|---|---|---| +| Does the declared 24-channel basis span the 12-component synthetic challenge? | YES at low authority | `results/sfr3_field_integrity/sfr3_field_integrity_shell_a_v070.json` | +| Does nominal bounded control meet the 60% RMS reduction threshold? | YES: about 65.46% | same result artifact | +| Does one unavailable channel meet the 55% threshold? | YES: about 66.36% | same result artifact | +| Do passive loops receive static/DC correction credit? | NO | passive attenuation is applied only to the declared transient vector | +| Does low sensor confidence suppress active commands? | YES | `PASSIVE_ONLY_SAFE_HOLD` fault scenario | +| Does this establish physical coils or improved confinement? | NO | SFR3-G2 through G9 are `NOT_RUN` | +| Did v0.7 move the earned ignition or fusion result? | NO | fusion and ignition credits are exactly zero | + +## Release 0.6 status + +| Question | Status | Evidence | +|---|---|---| +| Does phase-programmed magnetic breathing improve both cycle-average proxy and fusion power? | NO in the low-authority screen | `results/sfr2_actuation/sfr2_actuation_overlay_a_v060.json` | +| Does any declared breathing case cross the cycle-average optimistic ignition proxy? | NO | same result artifact | +| Does the 5% synchronous instantaneous peak establish ignition capture? | NO | peak occurs during expansion with about 802.542 MW uniform fusion power; cycle-average proxy is worse | +| Does the 5% traveling-quadrature case improve the ratio? | NOMINALLY, but fusion power falls | ratio 0.961559491; uniform power 997.233 MW before actuator debit | +| Does a global three-toroidal-lobe pattern preserve the 4FP baseline? | NO | `docs/reactor/15_TRILOBE_CONCEPT_TRANSLATION.md` | +| Does an area-preserving repeated poloidal m=3 harmonic earn fusion credit? | NO | zero-dimensional thermodynamic credit is exactly zero | +| Is magnetic-pumping heating demonstrated? | UNKNOWN | requires SFR2A-G3 kinetic evidence | +| Are the auxiliary coils realizable? | UNKNOWN | requires SFR2A-G1/G2 equilibrium and electromagnetic evidence | +| Is sustained burn or net energy demonstrated? | NO | all higher-authority gates remain open | + ## Release 0.1 status | Question | Status | Evidence | diff --git a/docs/reactor/11_WHERE_WE_ARE.md b/docs/reactor/11_WHERE_WE_ARE.md index e21d60d..e45c584 100644 --- a/docs/reactor/11_WHERE_WE_ARE.md +++ b/docs/reactor/11_WHERE_WE_ARE.md @@ -10,6 +10,48 @@ - The SFR-2 screen reproduces geometry bookkeeping, Bosch-Hale burn physics, ideal radial-compression thermodynamics, target-power matching and ISS04 transform sensitivity. - SFR-2 assigns zero numerical benefit to ABAB staggering, unmodeled traveling-wave/RF heating, magnetic pumping or magnetic-flux amplification. - Every high-authority SFR-2 physics/engineering gate remains `NOT_RUN`. +- Version 0.6 adds an optional, separately gated magnetic-breathing and tri-lobe actuation overlay without modifying SFR-2 Rev A. +- The overlay tests synchronous, ABAB-opposed and traveling-quadrature cycles and rejects all declared cases as joint cycle-average improvements. +- The tri-lobe image is retained only as an area-preserving repeated poloidal m=3 actuator hypothesis; it receives no astrophysical, three-body or thermodynamic fusion credit. +- Version 0.7 adds SFR-3 Field Integrity Shell A after auditing seven donor repositories for transferable mechanisms. +- SFR-3 combines 24 synthetic active trim channels, passive superconducting transient loops, confidence-aware diagnostics, fail-closed control, support-mode damping and geometry-aware magnet shielding. +- Its deterministic low-authority screen passes nominal, one-channel-fault, passive-only and safe-hold requirements while assigning zero physical confinement or fusion credit. +- Version 0.8 adds Dual Boundary AHIS A to the complete repository as an inner first-wall/vessel-health lane and an independent outer shield/support/alignment lane. +- The selected reduced-screen stack uses segmented tungsten, a graded W-to-RAFM transition, helium-cooled ODS-Eurofer/RAFM, PbLi with electrical channel inserts, a monitored double-wall vessel, WC/B4C shielding and REBCO-adjacent monitoring. +- The dual-boundary campaign compares three stacks under identical assumptions, checks eleven deterministic states and explicitly preserves one undetectable sub-sensitivity armor-crack case. +- Walls, liquids and sensors receive zero direct plasma-confinement, ignition, fusion and safety credit. +- Version 0.9 adds SFR-4 Integrated Physical-Promotion Campaign A and attempts all seven requested workstreams. +- Eighty direct-filament coil cases produce zero combined topology passes. The scanned classical helical family is rejected. +- The selected separated first-wall, blanket and divertor architecture passes its nominal and declared steady reduced heat envelope. +- Production equilibrium, transport, stable detachment, transient heat, qualified magnets, full 3-D TBR and hardware remain unrun. + +## What v0.9.0 actually found + +The magnet result is negative. The best scoring six-field-period filament case reaches approximately 0.0653 mean iota, well below the 0.25 minimum, although its radial-excursion screen passes. The richer held-out reconstruction remains approximately 6.49% RMS normal field against a 0.5% screen. + +The heat result is conditionally positive. At the declared 1 GW, Q=20 target ledger, 60% controlled radiation and 24 m2 effective divertor wetted area produce approximately 0.294 MW/m2 first-wall peak and 5.724 MW/m2 divertor peak. One-dimensional temperature and hydraulic screens pass for the selected separated helium/PbLi/water architecture. + +This does not move the earned fusion result because the heat solution has no passing physical magnetic configuration to protect. + +## What v0.8.0 actually found + +The balanced scoring model selects the helium-cooled tungsten/RAFM/PbLi DCLL stack. Its deliberately simple 1-D thermal result is 420.7 °C at the declared nominal heat flux and 632.9 °C at the steady-upset upper bound. The raw coefficient-of-thermal-expansion mismatch proxy is about 0.212%; this is not a stress calculation or structural qualification. + +The architecture provides 192 paired monitoring locations distributed over 24 toroidal control sectors and eight poloidal stations, with 1,736 declared elements across independent inner and outer lanes. All eleven expected deterministic states reproduce. The silent-crack negative control remains undetected, correctly preventing a perfect-detection claim. + +This improves the engineering hypothesis by making fault isolation, coolant isolation, safe hold, inspection and magnetic-alignment response testable. It does not improve the earned ignition proxy or establish plasma confinement. + +## What v0.7.0 actually found + +The declared 12-by-24 synthetic response matrix is full row rank. Bounded active commands reduce the declared combined challenge by about 65.46% nominally and 66.36% with one unavailable channel. A pure transient challenge is reduced by the declared 55% passive coefficient. Low sensor confidence prevents active correction, and a passive-loop quench removes passive credit. + +Those results show only that the proposed control decomposition is internally testable. The response matrix is analytic rather than CAD/Biot-Savart-derived, so v0.7.0 does not move the earned confinement, ignition or fusion result. + +## What v0.6.0 actually found + +No declared breathing waveform improves both the cycle-average optimistic ignition ratio and cycle-average uniform fusion power. The closest ratio is 0.961559491 at 5% traveling quadrature, but uniform fusion power falls to 997.233 MW before actuator losses. The 5% synchronous case has an instantaneous 0.998114154 peak during expansion, when uniform fusion power falls to about 802.542 MW. Its cycle-average ratio is worse than baseline, so it is not credited as ignition capture or sustained burn. + +The concept image helps define a balanced auxiliary actuation experiment. It does not itself move the design closer to fusion. ## What v0.5.0 actually found @@ -23,16 +65,25 @@ An important correction also emerged: ideal radial compression does not automati ## What this means -The project now contains **two reactor-level research branches with different roles**: +The project now contains **four reactor-level research branches plus one integrated engineering layer with different roles**: - **SFR-1:** steady-state reference architecture and production-solver path. - **SFR-2:** dynamic/high-field assumption breaker designed to test whether a staggered, strongly transformed, phase-actuated concept earns survival through progressively higher-authority physics. +- **SFR-3:** field-integrity overlay designed to preserve a steady stellarator field against error, motion and faults without changing the vessel or inventing material confinement. +- **Dual Boundary AHIS A:** engineering-health overlay designed to detect inner-wall, vessel, shield and support problems and coordinate protective actions without touching the plasma or replacing magnetic confinement. +- **SFR-4:** integrated promotion and heat-exhaust campaign that rejects the present coil family while retaining a testable steady heat-removal requirement. -Neither branch has demonstrated ignition or reactor feasibility. +No branch or layer has demonstrated ignition, reactor safety or reactor feasibility. ## The single most important next action -For SFR-2, the decisive next action is **SFR2-G1 dynamic equilibrium**: construct a real finite-beta ABAB 3-D equilibrium and determine whether the requested transform survives the proposed actuation/compression cycle without destructive islands, stochastic regions or MHD failure. +For SFR-3, the decisive next action is **SFR3-G2 physical coil response**: replace the analytic matrix with CAD-linked Biot-Savart responses including primary coils, trim coils, passive loops, blanket steel, shielding, ports and as-built errors. The following SFR3-G3 equilibrium/island campaign must then determine whether correction preserves nested surfaces. + +For Dual Boundary AHIS A, the decisive next action is a coupled CAD-based thermal, electromagnetic and structural model of the selected geometry, followed by W/RAFM joint coupons, PbLi/coolant compatibility loops, calibrated interspace leak tests and sensor irradiation. The low-authority pass cannot substitute for any of those experiments. + +For SFR-4, the decisive next action is a fundamentally different nonplanar modular-coil optimization using a real finite-beta target boundary, followed by DESC and VMEC++ cross-code equilibrium. More current in the rejected classical helices is not a defensible next step. + +For SFR-2, the decisive next action remains **SFR2-G1 dynamic equilibrium**: construct a real finite-beta ABAB 3-D equilibrium and determine whether the requested transform survives the proposed actuation/compression cycle without destructive islands, stochastic regions or MHD failure. For SFR-1, the corresponding next action remains the G1 DESC/VMEC++ finite-beta equilibrium tournament already defined in v0.4. diff --git a/docs/reactor/14_SFR2_PHASE_PROGRAMMED_BREATHING.md b/docs/reactor/14_SFR2_PHASE_PROGRAMMED_BREATHING.md new file mode 100644 index 0000000..28a82e4 --- /dev/null +++ b/docs/reactor/14_SFR2_PHASE_PROGRAMMED_BREATHING.md @@ -0,0 +1,51 @@ +# SFR-2 phase-programmed magnetic breathing + +## Question + +Can timed contraction and expansion of the magnetic flux-surface envelope move the unchanged SFR-2 Rev A design closer to its optimistic ignition proxy while supporting, rather than merely spiking, cycle-averaged fusion output? + +## Preserved design + +The 23 / 26 / 23 / 26 ft ABAB axis-path bookkeeping, four field periods, rigid vacuum vessel and steady primary HTS confinement field remain unchanged. The study adds an optional auxiliary magnetic-field overlay. It does not mechanically flex the reactor. + +## Three declared phase patterns + +| Pattern | Sector phases | Purpose | +|---|---|---| +| Synchronous | 0 / 0 / 0 / 0 degrees | Global contraction and expansion upper-bound | +| ABAB opposed | 0 / 180 / 0 / 180 degrees | Alternating squeeze and expansion between A and B sectors | +| Traveling quadrature | 0 / 90 / 180 / 270 degrees | A phase-stepped perturbation moving around the closed path | + +Depths of 0, 0.25%, 0.5%, 1%, 2% and 5% are sampled at 720 points per cycle. + +## Model + +For sector `j`, the minor-radius scale is + +`s_j(t) = 1 - epsilon sin(omega t + phi_j)`. + +The global volume ratio is the axis-length-weighted sum of `s_j(t)^2`. Particle inventory is fixed. Density and temperature follow ideal monatomic adiabatic bookkeeping. Bosch-Hale D-T reactivity produces an instantaneous uniform-plasma fusion-power screen. Each time sample is compared with the ISS04 alpha-only optimistic ignition proxy at `H_ISS04 = 1`. + +This is a zero-dimensional global-volume screen. It cannot resolve local pressure redistribution, field-line topology, islands, stochasticity, MHD, kinetic absorption, alpha orbits, edge loads or realizable coil currents. + +## No hidden credits + +Numerical credit is zero for magnetic-pumping absorption, RF phase heating, shocks, flux-field amplification, actuator efficiency, astrophysical gravity, accretion and three-body fusion. Actuator, cooling and cryogenic power are not yet known, so no net-power claim is permitted. + +## Result + +The closest cycle-average case is 5% traveling-quadrature actuation: + +| Quantity | Baseline | 5% traveling quadrature | +|---|---:|---:| +| Cycle-average optimistic ignition ratio | 0.961077249 | 0.961559491 | +| Cycle-average uniform fusion power | 1000.000 MW | 997.233 MW | +| Joint improvement | n/a | No | + +The ratio improvement is only about 0.000482 absolute while uniform fusion power falls by about 2.767 MW, before actuator losses. No declared case crosses the cycle-average proxy or improves both primary metrics. + +The synchronous 5% case briefly reaches 0.998114154, but this occurs during the 5% expansion half-cycle, not during compression, while the uniform fusion-power screen falls to about 802.542 MW. Its cycle-average proxy is worse than baseline. It is not ignition capture or sustained burn. + +## Decision + +The breathing overlay is rejected as an earned closer-to-fusion result at this authority. It remains a testable actuator hypothesis only. Promotion requires the evidence in `15_SFR2_ACTUATION_AND_TRILOBE_GATES.md`. diff --git a/docs/reactor/15_TRILOBE_CONCEPT_TRANSLATION.md b/docs/reactor/15_TRILOBE_CONCEPT_TRANSLATION.md new file mode 100644 index 0000000..2c7458c --- /dev/null +++ b/docs/reactor/15_TRILOBE_CONCEPT_TRANSLATION.md @@ -0,0 +1,25 @@ +# Tri-lobe concept-image translation + +## What the image communicates + +The concept image depicts three rotating inflows converging on a hot central region, with helical motion, convergent fronts and a three-fold magnetic architecture. Its useful design intuition is balanced multi-direction actuation around a core. + +## What cannot be transferred + +The reactor does not receive numerical or conceptual performance credit for gravitational accretion, protostellar shocks, formation of multiple stellar objects or a triple-particle fusion event. D-T fusion in the repository remains a binary reaction-rate calculation. Three converging streams do not create a new three-body D-T pathway. + +A global three-lobe toroidal machine would also conflict with the unchanged four-field-period ABAB baseline. Substituting three toroidal lobes would be a new stellarator, not an integration into current SFR-2. + +## Defensible translation + +The retained translation is a poloidal `m = 3` boundary-actuation harmonic repeated in every one of the four field periods. In screening notation: + +`r(theta, phi, t) = a N [1 + epsilon_3 cos(3 theta - 4 phi - omega t)]`. + +`N = 1 / sqrt(1 + epsilon_3^2 / 2)` keeps cross-sectional area constant. This isolates shape from global compression. At amplitudes of 0%, 2%, 5% and 10%, the normalized area remains one and therefore receives zero density, temperature, fusion-power or ignition-proxy gain in the zero-dimensional screen. + +The harmonic may still affect magnetic wells, trapped-particle motion, turbulence, islands, alpha confinement or heating deposition. Those effects can be beneficial or harmful, but none can be determined from the image or the current analytical model. + +## Integration decision + +The image helps specify an auxiliary coil and solver experiment. It does not supply a closer-to-fusion result. The selected BOM uses eight normal-conducting actuator stations, two per field period, with three independently driven channels per station. Currents, turns, locations, field amplitudes and phase frequency remain solver-dependent. diff --git a/docs/reactor/16_SFR2_ACTUATION_AND_TRILOBE_GATES.md b/docs/reactor/16_SFR2_ACTUATION_AND_TRILOBE_GATES.md new file mode 100644 index 0000000..f25bf58 --- /dev/null +++ b/docs/reactor/16_SFR2_ACTUATION_AND_TRILOBE_GATES.md @@ -0,0 +1,39 @@ +# SFR-2 actuation and tri-lobe promotion gates + +Only `SFR2A_G0_OVERLAY_SPEC` is passed. Every physics, engineering and hardware gate remains `NOT_RUN`. + +## SFR2A-G1, time-dependent equilibrium + +Converge free-boundary finite-beta equilibria at sufficient phase resolution for every retained waveform. Demonstrate nested surfaces and acceptable rotational-transform evolution through the complete cycle. + +## SFR2A-G2, coils and electromagnetics + +Produce a realizable auxiliary coil/current solution. Resolve conducting-structure eddy currents, phase lag, forces, deformation, fatigue, heating, insulation, cooling, supply voltage, stored energy, faults and interaction with the primary HTS system. + +## SFR2A-G3, magnetic-pumping kinetics + +Calculate absorbed heating from a kinetic model that resolves frequency, waveform, collisionality, pressure anisotropy, scattering and phase lag. Reversible adiabatic exchange does not pass this gate. + +## SFR2A-G4, particle and alpha orbits + +Demonstrate acceptable fuel-ion and alpha confinement across the complete actuation cycle, including resonances and stochastic transport. + +## SFR2A-G5, transport and MHD + +Resolve neoclassical and turbulent transport plus ideal and resistive nonlinear MHD for the moving perturbation. A static ISS04 value cannot pass this gate. + +## SFR2A-G6, edge and wall loads + +Resolve time-dependent scrape-off-layer, divertor, first-wall, impurity and localized heat-load response. + +## SFR2A-G7, integrated power balance + +Debit converters, buswork, resistive coils, cooling, cryogenics, eddy currents and control overhead. Demonstrate positive cycle-averaged plant benefit rather than an instantaneous plasma peak. + +## SFR2A-G8, hardware + +Validate the actuation field, phase control, diagnostics, protection and plasma response experimentally. Computation cannot pass this gate. + +## Fail-closed rule + +A low-authority screen may reject the overlay. It may not declare ignition, sustained burn, net energy or a buildable reactor. A transient proxy crossing would justify further calculation only. diff --git a/docs/reactor/17_SFR3_DONOR_TRANSLATION_LEDGER.md b/docs/reactor/17_SFR3_DONOR_TRANSLATION_LEDGER.md new file mode 100644 index 0000000..9e22c49 --- /dev/null +++ b/docs/reactor/17_SFR3_DONOR_TRANSLATION_LEDGER.md @@ -0,0 +1,19 @@ +# SFR-3 donor translation ledger + +The seven donor repositories were treated as mechanism libraries, not as transferable physics validation. Their code, materials and claims were screened against the fusion environment before reuse. + +| Donor | Keep or adapt | Reject in SFR-3 | Fusion-specific use | +|---|---|---|---| +| AHIS | Distributed sensing, state estimation, watchdogs, fault latching, actuator-authority accounting | Self-healing-hull implications and unqualified PVDF near cryogenic or neutron-hot zones | Magnetic diagnostics, strain/alignment health, quench-aware control | +| PressureX | Passive rate-dependent load shaping and sealed-fluid discipline | Its dimensionally incomplete impact model and any fluid placed in the plasma volume | Warm support impulse damping only | +| IX-Vibe | Measured-FRF targeting, tuned/shunt damping, distributed modal sensing | A generic broadband damping layer as a magnetic solution | Suppress coil-support modes that can create field error | +| IX-Breath | Resource gates, confidence bands, bounded states, independent hard protection | Flexible-vessel breathing or unbudgeted active correction | Active trim is allowed only when sensing, power, thermal and quench margins close | +| IX-GCR-SPE | Protect the smallest high-value zone, graded shielding, penetration monitoring | Direct transfer of space-radiation material performance | Local shield optimization around REBCO, joints, ports and penetrations | +| IX-Shield | Areal-density ledger, weak-direction analysis and geometric coverage | Low-temperature hydrogen-rich materials next to the fusion core | Port-resolved neutron streaming and shield accounting | +| IX-HfTaZen-Shield | Segmentation, compliant interfaces, thermal paths, seam-first design, hotspot monitoring | Routine Hf/Ta plasma-facing armor and re-entry oxidation assumptions | Segmented tungsten armor, graded joints and monitored interfaces | + +## Rule used throughout + +A pattern survives only if its physical function survives translation. For example, a tuned damper can help preserve coil alignment, but it cannot be relabeled as plasma confinement. A hydride shield can protect a magnet only after 3-D neutronics validates it, and it cannot be credited as an inward force on the plasma. + +No donor repository supplied a hidden confinement material. Their real contribution is a more observable, fault-tolerant and mechanically stable magnetic system. diff --git a/docs/reactor/18_SFR3_FIELD_INTEGRITY_SHELL.md b/docs/reactor/18_SFR3_FIELD_INTEGRITY_SHELL.md new file mode 100644 index 0000000..1948371 --- /dev/null +++ b/docs/reactor/18_SFR3_FIELD_INTEGRITY_SHELL.md @@ -0,0 +1,33 @@ +# SFR-3 Field Integrity Shell A + +## Objective + +Field Integrity Shell A attempts to preserve the intended nested magnetic surfaces in the presence of construction error, support motion, blanket magnetization, current error and time-varying perturbations. It does not replace the primary stellarator field. + +## Architecture + +1. **Steady primary field.** Copper-stabilized REBCO coils remain the only baseline confinement source. The rigid vacuum vessel and plasma-facing surfaces do not move. +2. **Distributed active trim.** Twenty-four independently driven planar correction channels target a declared set of low-order Fourier error harmonics. Commands are bounded and may be withheld. +3. **Passive transient response.** Twenty-four optimized superconducting loops are retained as a research branch. Induced currents may oppose changing flux; the screen assigns them no static-error or DC correction credit. +4. **Observability.** Magnetic pickup coils, flux loops, circuit-current metrology, quench detection, cryogenic strain and support-motion sensing feed a confidence-aware estimator. +5. **Guarded control.** Active trim is allowed only when sensor confidence, power, thermal margin, quench state and an independent watchdog all pass. Failure returns to the known steady baseline or passive-only safe hold. +6. **Mechanical field preservation.** All-metal tuned dampers, optional shunt damping and alignment metrology target measured support modes. They receive no plasma credit; their purpose is to reduce coil motion and field error. +7. **Protected magnets.** WC/B4C and solver-dependent HfH composite options are concentrated around REBCO, joints and streaming paths. Shielding protects the field source but does not confine plasma. + +## What the v0.7 screen actually computes + +The code builds a 12-by-24 deterministic response matrix for cosine/sine components of six `(m,n)` harmonics. A bounded ridge solution commands the active array. A separate attenuation coefficient applies only to a declared transient vector. Seven scenarios test nominal operation, one failed actuator, low sensing confidence, passive-loop quench, active-coil quench, exhausted thermal margin and passive-only transient response. + +The synthetic screen passes its declared thresholds. This means the chosen mathematical actuator basis spans the chosen mathematical error basis with bounded commands. It does **not** show that physical coils fit, survive, generate the response, preserve flux surfaces, suppress islands or improve confinement. + +## The grounded “Tesla” question + +The defensible lesson from Nikola Tesla's engineering—not an invented quotation—is to control fields through resonance, phase, geometry, measurement and energy accounting. In this architecture that becomes: + +- do not fight the plasma with mass; shape the electromagnetic boundary condition; +- identify harmful spatial and structural modes rather than driving everything; +- separate passive response from powered correction; +- measure phase and amplitude before applying feedback; and +- fail to a stable unactuated state when authority or evidence is insufficient. + +The repo therefore tests a field-control network, not a mythical ultra-dense container. diff --git a/docs/reactor/19_SFR3_MATERIAL_AND_LIQUID_BRANCHES.md b/docs/reactor/19_SFR3_MATERIAL_AND_LIQUID_BRANCHES.md new file mode 100644 index 0000000..fa647e7 --- /dev/null +++ b/docs/reactor/19_SFR3_MATERIAL_AND_LIQUID_BRANCHES.md @@ -0,0 +1,34 @@ +# SFR-3 material and liquid branches + +## Materials cannot substitute for magnetic topology + +No known solid, liquid, optical blocker or particulate can passively hold a 100-million-kelvin-class D-T plasma. Charged-particle confinement depends on field topology; 14.1 MeV neutrons are not magnetically confined and must be absorbed outside the plasma. Mass density, darkness, reflectivity and radar attenuation are not the relevant variables. + +## Baseline material stack + +- **Plasma-facing:** segmented tungsten family, with tungsten-fiber-reinforced tungsten and graded W/Cu interfaces retained as qualification branches. +- **Conditioning:** controlled boron film or powder only as an edge impurity-management experiment. +- **Blanket:** PbLi reference family with RAFM/ODS-Eurofer structure and SiC or alumina electrical barriers; ceramic breeders remain an alternate. +- **Shield:** WC plus B4C, with HfH1.7 composites retained only where a stellarator-specific 3-D model shows a net benefit. +- **Magnets:** copper-stabilized REBCO with conservative radiation monitoring because 2026 in-situ irradiation evidence reports earlier critical-current degradation than prior ex-situ projections. + +## Liquid candidates + +### Liquid lithium edge or divertor module — `DEFER` + +Lithium can alter recycling and exhaust behavior, but it does not create closed flux surfaces. Vapor, MHD flow, corrosion, tritium inventory and impurity transport can erase the benefit. SFR-3 therefore allows only a local replaceable test cassette with zero core-confinement credit. + +### PbLi blanket — `KEEP` + +PbLi surrounds the vacuum vessel as breeder, neutron-energy converter and coolant candidate. It is electrically conducting, so strong-field MHD drag and corrosion require inserts and experiments. It remains outside the plasma and cannot be called a confinement fluid. + +### Imploding lithium liner — `SEPARATE` + +An imploding liquid or solid liner is a magnetized-target-fusion architecture: it deliberately compresses a short-lived magnetized plasma. That is incompatible with the unchanged steady-state stellarator, rigid vessel, blanket and divertor. It may be compared as a separate machine, never counted as an SFR-3 improvement. + +## Rejected material ideas + +- Diamond may be studied as a plasma-facing coating, but it does not confine. +- Glitter or conductive dust is a contamination and arcing risk, not a field cage. +- High-Z Hf/Ta material in the plasma volume would create severe radiative contamination. +- A dense liquid shell cannot stop charged plasma transport without an actual electromagnetic or inertial-confinement mechanism. diff --git a/docs/reactor/20_SFR3_PROMOTION_GATES.md b/docs/reactor/20_SFR3_PROMOTION_GATES.md new file mode 100644 index 0000000..ac65505 --- /dev/null +++ b/docs/reactor/20_SFR3_PROMOTION_GATES.md @@ -0,0 +1,20 @@ +# SFR-3 promotion gates + +| Gate | Required evidence | v0.7 status | +|---|---|---| +| SFR3-G0 architecture | Explicit components, donor dispositions, claim boundary and BOM | `PASS_SPEC_ONLY` | +| SFR3-G1 synthetic controllability | Full-row-rank deterministic response, bounded nominal case, single-channel fault, passive-only and safe-hold cases | `PASS_LOW_AUTHORITY_SYNTHETIC_ONLY` | +| SFR3-G2 coil response | CAD-linked Biot-Savart or equivalent response matrix including ports, shields and blanket steel | `NOT_RUN` | +| SFR3-G3 equilibrium and islands | Free-boundary finite-beta equilibria; island widths, effective ripple and strike-point motion with faults | `NOT_RUN` | +| SFR3-G4 orbits | Thermal-ion and alpha guiding-center/full-orbit losses over credible error distributions | `NOT_RUN` | +| SFR3-G5 transport and MHD | Neoclassical and turbulent transport plus stability over the controlled envelope | `NOT_RUN` | +| SFR3-G6 magnet engineering | Integrated electromagnetic stress, support modes, REBCO margin, quench and cryogenic budget | `NOT_RUN` | +| SFR3-G7 neutronics and TBR | Port-resolved 3-D OpenMC or equivalent; TBR, heating, damage, dose and lifetime | `NOT_RUN` | +| SFR3-G8 burn and plant | Self-consistent heating, fueling, exhaust, recirculating power and net-electric balance | `NOT_RUN` | +| SFR3-G9 hardware | Calibrated coil/sensor coupon, fault-injection bench and then plasma experiment | `NOT_RUN` | + +## Kill criteria + +The branch is demoted if physical coil responses are ill-conditioned, required commands exceed engineering limits, passive loops cannot quench safely, correction worsens islands or fast-particle loss, structural motion defeats field tolerance, shielding eliminates maintainability or TBR, or active recirculating power negates plant closure. + +No lower gate may substitute for a higher gate. In particular, SFR3-G1 cannot be described as improved confinement. diff --git a/docs/reactor/21_SFR3_DUAL_BOUNDARY_ARCHITECTURE.md b/docs/reactor/21_SFR3_DUAL_BOUNDARY_ARCHITECTURE.md new file mode 100644 index 0000000..eaef1f9 --- /dev/null +++ b/docs/reactor/21_SFR3_DUAL_BOUNDARY_ARCHITECTURE.md @@ -0,0 +1,23 @@ +# SFR-3 Dual Boundary Integrity Network + +## Translation of the user's proposal + +“AHIS flipped inside out” is interpreted as an inward-facing health-monitoring network behind the plasma-facing wall. It observes temperature, strain, coolant state and magnetic disturbance. It does not exert mechanical pressure on plasma. + +The second AHIS layer faces outward. It observes the vacuum-vessel interspace, shield, supports, vibration and magnet alignment. The two networks share no single sensing lane or power dependency that is intentionally credited as independent. + +## Why a double wall helps + +A double wall provides an interspace that can be evacuated, pressure-monitored and helium-leak tested. It adds defense in depth for vacuum and radioactive inventory, provides space for shielding and cooling, and makes some leak paths observable before the outer boundary is lost. + +It does not add a second magnetic surface. If plasma reaches the material wall, magnetic confinement has already degraded. The permitted response is to correct a measured field error, reduce plasma power, isolate coolant, enter safe hold and inspect or replace the affected sector. + +## Spatial architecture + +The 24 toroidal sectors align with the 24 SFR-3 trim channels. Each sector contains eight poloidal monitoring locations, producing 192 paired inner and outer locations. Two sensing lanes provide nominal single-channel tolerance. Hard vacuum channels are independent of the model-based estimator. + +This layout is deliberately dense because a localized first-wall event cannot be safely inferred from a single global sensor. Final placement must be optimized against neutron dose, feedthrough count, maintenance access and observability rank. + +## Integration with magnetic correction + +An outer support displacement becomes actionable only when it correlates with a magnetic flux error and SFR-3 trim resources remain healthy. The v0.8 screen reuses the SFR-3 synthetic 65.46% correction result solely to verify control routing. It does not convert structural monitoring into physical confinement evidence. diff --git a/docs/reactor/22_SFR3_DUAL_BOUNDARY_MATERIAL_SELECTION.md b/docs/reactor/22_SFR3_DUAL_BOUNDARY_MATERIAL_SELECTION.md new file mode 100644 index 0000000..cd780bc --- /dev/null +++ b/docs/reactor/22_SFR3_DUAL_BOUNDARY_MATERIAL_SELECTION.md @@ -0,0 +1,28 @@ +# Dual-boundary material selection + +## Selected balanced reference + +The selected reduced-screen branch uses segmented tungsten armor, a graded tungsten-to-RAFM transition, helium-cooled RAFM structure and a PbLi DCLL blanket. This is not declared globally optimal. It scores highest under the versioned decision weights because it passes the 1-D thermal screen while retaining a low-activation structural path, breeding compatibility and separation between water and PbLi. + +At the declared effective properties: + +- 0.25 MW/m² gives a plasma-facing surface temperature of approximately 420.7 °C; +- a steady 1.0 MW/m² upset bound gives approximately 632.9 °C; +- the raw coefficient-of-thermal-expansion mismatch strain proxy is approximately 0.212%; and +- every solid-layer temperature remains within its declared screening ceiling. + +These are one-dimensional screening results. They omit geometry, coolant redistribution, volumetric nuclear heating, contact resistance, cracking, plasticity, creep, irradiation swelling, transmutation, erosion, cyclic fatigue and manufacturing defects. + +## Comparison branches + +### W/Cu/CuCrZr with water cooling + +This branch is thermally strongest in the reduced screen, about 182.2 °C nominal surface temperature and 278.9 °C under the steady upset. It is deferred because integrated PbLi/water accident consequences, copper activation and lifetime, and reactor-scale joint qualification remain unresolved. + +### W/SiC with helium cooling + +This branch offers low activation and high-temperature potential. Its reduced-screen surface temperatures are approximately 587.5 °C nominal and 850.0 °C upset. It remains deferred because structural code qualification, hermeticity, complex joining and fusion-neutron maturity are weaker. + +## Material truth boundary + +No selected material confines plasma. Tungsten handles plasma-facing heat and erosion; RAFM carries structural load; PbLi breeds tritium and removes neutron heat; the vessel confines vacuum and radioactive inventory; shielding protects magnets; REBCO and correction coils create the fields. diff --git a/docs/reactor/23_SFR3_DUAL_BOUNDARY_FAULT_CAMPAIGN.md b/docs/reactor/23_SFR3_DUAL_BOUNDARY_FAULT_CAMPAIGN.md new file mode 100644 index 0000000..1c0f52d --- /dev/null +++ b/docs/reactor/23_SFR3_DUAL_BOUNDARY_FAULT_CAMPAIGN.md @@ -0,0 +1,21 @@ +# Dual-boundary fault campaign + +Eleven deterministic scenarios are executed under versioned signal, channel-failure and expected-state definitions. + +| Scenario | Result | +|---|---| +| Nominal | `NOMINAL` | +| Inner hotspot with lane A temperature failure | Detected by lane B; controlled power rundown | +| Coolant leak with one interspace channel failed | Detected by surviving coolant/interspace channels; isolate and safe hold | +| Outer support shift plus flux error | Request bounded SFR-3 trim, then inspect | +| Complete inner lane A loss | Degraded monitoring with lane B retained | +| Complete outer lane A loss | Degraded monitoring with lane B retained | +| Both sector buses lost | Safe hold due to lost observability | +| Vacuum breach | Isolate and safe hold | +| Total control-power loss | Passive hard safe hold | +| Silent armor crack below online sensitivity | No automatic detection; periodic NDE required | +| Support shift with trim unavailable | Safe hold; no uncorrected operation | + +The silent-crack case is essential. A monitoring system cannot be allowed to claim total coverage merely because every simulated signal was detected. Real probability of detection requires seeded flaws, irradiated materials, calibrated inspection hardware and blind tests. + +The campaign validates deterministic control routing only. It does not establish detection probability, safe shutdown time, allowable leak size, structural margin or licensing classification. diff --git a/docs/reactor/24_SFR3_DUAL_BOUNDARY_PROMOTION_GATES.md b/docs/reactor/24_SFR3_DUAL_BOUNDARY_PROMOTION_GATES.md new file mode 100644 index 0000000..0631df9 --- /dev/null +++ b/docs/reactor/24_SFR3_DUAL_BOUNDARY_PROMOTION_GATES.md @@ -0,0 +1,20 @@ +# SFR-3 dual-boundary promotion gates + +| Gate | Evidence required | v0.8 status | +|---|---|---| +| SFR3D-G0 | Versioned architecture, layer stack, monitoring count, fault states and claim boundary | `PASS_SPEC_ONLY` | +| SFR3D-G1 | Three-stack 1-D comparison and eleven-scenario deterministic fault campaign | `PASS_LOW_AUTHORITY_SYNTHETIC_ONLY` | +| SFR3D-G2 | Coupled 3-D thermal, coolant CFD, electromagnetic load and nonlinear structural FEA | `NOT_RUN` | +| SFR3D-G3 | Fracture, creep, fatigue, erosion, joining and irradiation lifetime | `NOT_RUN` | +| SFR3D-G4 | Sensor radiation, temperature, drift, calibration, latency and feedthrough qualification | `NOT_RUN` | +| SFR3D-G5 | CAD-linked vessel, blanket, shield and sensor magnetic perturbation plus trim response | `NOT_RUN` | +| SFR3D-G6 | Full 3-D neutronics, TBR, nuclear heating, damage, gas production, dose and streaming | `NOT_RUN` | +| SFR3D-G7 | Integrated helium, PbLi, tritium, chemical, fire, leak and decay-heat safety analysis | `NOT_RUN` | +| SFR3D-G8 | Remote maintenance, alignment recovery, availability and activated waste | `NOT_RUN` | +| SFR3D-G9 | Instrumented coupon, sector prototype and representative fault-injection hardware | `NOT_RUN` | + +## Kill criteria + +The branch is demoted if the selected stack exceeds structural temperature or strain limits in coupled analysis, coolant isolation cannot prevent escalation, sensor survivability or probability of detection is inadequate, common-cause failure defeats both lanes, vessel or shield materials create unacceptable magnetic error, TBR or REBCO protection fails, or remote replacement cannot restore alignment. + +Neither a G0 specification nor G1 reduced-screen pass may be quoted as physical wall survival, safety qualification or improved plasma confinement. diff --git a/docs/reactor/25_SFR4_INTEGRATED_PHYSICAL_CAMPAIGN.md b/docs/reactor/25_SFR4_INTEGRATED_PHYSICAL_CAMPAIGN.md new file mode 100644 index 0000000..53d8c20 --- /dev/null +++ b/docs/reactor/25_SFR4_INTEGRATED_PHYSICAL_CAMPAIGN.md @@ -0,0 +1,33 @@ +# SFR-4 Integrated Physical-Promotion Campaign A + +## Purpose + +SFR-4 attempts the seven computational workstreams requested after Dual Boundary AHIS A: + +1. physical coil fields; +2. finite-beta equilibrium; +3. coil and plasma co-design; +4. particle confinement; +5. self-consistent burn requirements; +6. magnet and heat engineering; and +7. reactor systems. + +The campaign executes every method available in the build runtime and explicitly attempts the production adapters. DESC, VMEC++, SIMSOPT, OpenMC, kinetic transport, CAD, CFD and structural FEA are unavailable. Their gates therefore remain `NOT_RUN` or fail closed. + +## Executed magnetic campaign + +Eighty physical filament configurations are evaluated with direct Biot-Savart fields and field-line integration. Four field-period counts, two current-sign patterns and ten helical-to-toroidal-field current ratios are compared under identical geometry and acceptance rules. + +No configuration passes both the radial-excursion and rotational-transform screens. The best declared scoring point uses six field periods, four alternating helices and a 1.0 helical-to-TF current ratio. It gives approximately 0.0653 mean iota and 0.1922 normalized maximum excursion. The excursion screen passes; the minimum 0.25 transform gate fails. + +The held-out richer filament reconstruction also fails its 0.5% RMS normal-field criterion. SFR-4 therefore rejects this coil family rather than attaching its design-iota burn target to a nonpassing field. + +## Particle and burn scope + +The maximum-pitch 3.5 MeV alpha gyroradius at 6 T is approximately 0.0449 m, or 2.64% of the 1.7 m screening minor radius. Passing that scale test does not establish alpha retention. Guiding-center, neoclassical and gyrokinetic evidence remain absent, and the magnetic-topology prerequisite fails. + +The Q=20 design-iota burn requirement includes Bosch-Hale D-T reactivity, a declared 90% alpha-deposition assumption and a hydrogenic bremsstrahlung screen. It requires approximately H_ISS04 2.00 at iota 0.55 under the declared assumptions. The value is a requirement, not a prediction, and cannot be credited to the failed physical coil family. + +## Verdict + +SFR-4 completes an integrated reduced campaign and produces a useful heat architecture. It does not promote a physical confinement candidate or move the earned fusion result above zero. diff --git a/docs/reactor/26_SFR4_HEAT_EXHAUST_RESOLUTION.md b/docs/reactor/26_SFR4_HEAT_EXHAUST_RESOLUTION.md new file mode 100644 index 0000000..850495b --- /dev/null +++ b/docs/reactor/26_SFR4_HEAT_EXHAUST_RESOLUTION.md @@ -0,0 +1,52 @@ +# SFR-4 Heat-Exhaust Resolution + +## Problem split + +The heat problem is split into three independent domains: + +1. Distributed plasma radiation reaches the first wall. +2. Parallel exhaust power reaches the divertor targets. +3. Neutron power heats the breeding blanket and shield. + +Treating all three as one wall heat flux would hide the dominant physics and coolant incompatibilities. + +## Selected reduced-screen architecture + +The declared Q=20 target ledger supplies 228.98 MW of plasma exhaust after the 90% alpha-deposition assumption. A controlled-radiation requirement sends 60% to approximately 536.9 m2 of first-wall area. The remaining 40% reaches a 24-sector long-leg island-divertor requirement with 24 m2 effective wetted area and a 1.5 peak factor. + +The selected first wall is: + +* 3 mm segmented tungsten; +* 1 mm graded W-to-RAFM transition; +* 3 mm helium-cooled ODS-RAFM structure; and +* a physically separate PbLi DCLL blanket. + +The selected divertor target is: + +* 6 mm segmented tungsten; +* 1 mm OFHC copper compliant interlayer; +* 2 mm CuCrZr heat sink; and +* an independent pressurized-water circuit. + +Water never shares a boundary, penetration or heat exchanger with PbLi. A double coolant boundary, guard vacuum and independent leak detection are mandatory. + +## Executed result + +| Quantity | Reduced-screen result | Declared gate | +|---|---:|---:| +| First-wall peak heat flux | 0.294 MW/m2 | at most 0.5 MW/m2 nominal | +| Divertor peak heat flux | 5.724 MW/m2 | at most 10 MW/m2 steady | +| First-wall surface temperature | 401.2 C nominal | layer-specific service ceilings | +| First-wall surface at 1 MW/m2 | 523.8 C | layer-specific service ceilings | +| Divertor tungsten surface | 678.3 C | 1200 C screen | +| Divertor water mass flow | 426.0 kg/s | requirement output | +| Mean flow velocity | 7.56 m/s | at most 10 m/s | +| Hydraulic pumping power | 0.122 MW | at most 5 MW | + +At the selected 24 m2 wetted area, at least approximately 30.12% controlled radiation is required to remain below the 10 MW/m2 divertor limit. At 60% radiation, at least approximately 13.74 m2 effective wetted area is required. The selected point therefore has reduced-screen margin. + +## Meaning of resolved + +The nominal and declared steady heat-allocation problem is resolved at requirement authority: a feasible partition, wetted area, material stack, coolant separation and hydraulic target have been identified in the model. + +The physical heat problem is not qualified. The result assumes stable impurity-seeded detachment and the requested island-divertor footprint. It does not solve three-dimensional edge plasma and neutrals, critical heat flux, boiling stability, erosion, redeposition, W/Cu fatigue, neutron degradation, disruptions or accidents. Failure in any of those gates reopens the architecture. diff --git a/docs/reactor/27_SFR4_SOLVER_ATTEMPTS.md b/docs/reactor/27_SFR4_SOLVER_ATTEMPTS.md new file mode 100644 index 0000000..5188250 --- /dev/null +++ b/docs/reactor/27_SFR4_SOLVER_ATTEMPTS.md @@ -0,0 +1,15 @@ +# SFR-4 Production Solver Attempts + +The build runtime was audited before reduced calculations were accepted. + +| Tool or route | Attempt result | Repository behavior | +|---|---|---| +| DESC Python package | Not installed | DESC adapter exited 1 and produced no equilibrium claim | +| VMEC++ Python package | Not installed | VMEC++ adapter exited 1 and produced no equilibrium claim | +| SIMSOPT | Not installed | Production coil/plasma co-design remains not run | +| OpenMC | Not installed | OpenMC builder exited 1 when execution was requested and produced no TBR claim | +| FEniCS or DOLFINx | Not installed | Structural and conjugate thermal FEA remain not run | +| Gmsh and CADQuery | Not installed | Configuration-controlled CAD and mesh gates remain not run | +| Package installation route | Attempted | Runtime network policy prevented dependency retrieval | + +The adapters behaved correctly: each stopped rather than substituting an in-repository surrogate. Generated seed inputs remain available for execution in a qualified external environment. diff --git a/docs/reactor/28_SFR4_PROMOTION_GATES.md b/docs/reactor/28_SFR4_PROMOTION_GATES.md new file mode 100644 index 0000000..ba20b81 --- /dev/null +++ b/docs/reactor/28_SFR4_PROMOTION_GATES.md @@ -0,0 +1,16 @@ +# SFR-4 Promotion Gates + +| Gate | Requirement | Current status | +|---|---|---| +| SFR4-G0 | Versioned seven-workstream specification and claim boundary | `PASS_SPEC_ONLY` | +| SFR4-G1 | CAD-linked optimized coils and independent field validation | `FAIL_REDUCED_FAMILY__PRODUCTION_NOT_RUN` | +| SFR4-G2 | Converged finite-beta DESC and VMEC++ equilibria | `NOT_RUN` | +| SFR4-G3 | Islands, error robustness and MHD stability | `NOT_RUN` | +| SFR4-G4 | Alpha orbits, neoclassical and gyrokinetic transport | `NOT_RUN` | +| SFR4-G5 | Three-dimensional island-divertor detachment and heat footprints | `NOT_RUN` | +| SFR4-G6 | Thermal, hydraulic, structural, fatigue and irradiation qualification | `PASS_LOW_AUTHORITY_STEADY_HEAT_SCREEN_ONLY` | +| SFR4-G7 | Full 3-D neutronics, TBR, heating, damage and streaming | `NOT_RUN` | +| SFR4-G8 | Coupled burn, plant, tritium and accident analysis | `NOT_RUN` | +| SFR4-G9 | Representative component and integrated hardware | `NOT_RUN` | + +SFR4-G6 does not promote the reactor because its pass is limited to heat allocation, 1-D conduction and hydraulic requirements. The first blocking physics gate remains SFR4-G1, followed by finite-beta equilibrium. diff --git a/docs/reactor/29_SFR4_DECISION.md b/docs/reactor/29_SFR4_DECISION.md new file mode 100644 index 0000000..6f45b52 --- /dev/null +++ b/docs/reactor/29_SFR4_DECISION.md @@ -0,0 +1,24 @@ +# SFR-4 Decision + +## Retain + +Retain the separated heat architecture as the new design requirement: + +* helium-cooled tungsten/RAFM first wall; +* isolated PbLi DCLL blanket; +* independent water-cooled W/Cu/CuCrZr divertor; +* 60% controlled-radiation target; +* at least 24 m2 effective divertor wetted area; and +* monitored double boundaries between water, PbLi and vacuum. + +## Reject + +Reject the scanned classical four-helix filament family as the physical confinement solution. Eighty cases produced no combined topology pass, and the richer held-out basis remains above the normal-field threshold. + +## Do not claim + +Do not claim improved confinement, ignition, net electricity, tritium self-sufficiency, component life, safety or fusion. The earned fusion-progress credit remains zero. + +## Next design action + +The next design must change the coil family, not merely raise current in the rejected helices. A production stage-two or single-stage optimization should use nonplanar modular coils, the finite-beta plasma boundary, clearance and REBCO strain objectives, robust manufacturing-error ensembles and the 24-channel trim response. The retained heat architecture then becomes a geometric constraint in that optimization. diff --git a/external_solvers/README.md b/external_solvers/README.md index c4e0163..d74fc51 100644 --- a/external_solvers/README.md +++ b/external_solvers/README.md @@ -2,6 +2,18 @@ This directory is an **execution bridge**, not prefilled evidence. +## SFR-4 integrated campaign + +`sfr4_integrated_evidence_contract.json` defines nine fail-closed promotion gates spanning physical coils, cross-code equilibrium, stability, particle transport, three-dimensional island-divertor exhaust, thermal/structural qualification, OpenMC neutronics, integrated burn/plant analysis and hardware. v0.9 explicitly attempted the DESC, VMEC++ and OpenMC adapters; all stopped because the production dependencies are absent. + +## Dual Boundary AHIS + +`sfr3_dual_boundary_evidence_contract.json` defines the evidence needed to replace the v0.8 1-D thermal and deterministic fault screen: coupled CAD thermal/EM/structural analysis, W/RAFM joint and fatigue qualification, PbLi/coolant MHD and corrosion loops, sensor irradiation/calibration, quantified interspace leak testing, full 3-D neutronics and integrated representative hardware. No reduced-screen pass may be promoted into survivability, safety or confinement evidence. + +## SFR-3 field integrity + +`sfr3_field_integrity_evidence_contract.json` defines the high-authority path that must replace the v0.7 analytic response matrix: CAD-linked magnetic response, free-boundary equilibrium and islands, particle/alpha orbits, coupled magnet engineering and full 3-D neutronics. No missing output may be replaced by the synthetic controllability pass. + ## G1 equilibrium Inputs in `inputs/` are generated from the exact analytic SFR-1 reduced boundary and contain finite-pressure/flux/iota design seeds. diff --git a/external_solvers/sfr3_dual_boundary_evidence_contract.json b/external_solvers/sfr3_dual_boundary_evidence_contract.json new file mode 100644 index 0000000..782694f --- /dev/null +++ b/external_solvers/sfr3_dual_boundary_evidence_contract.json @@ -0,0 +1,35 @@ +{ + "contract_id": "SFR3-DUAL-BOUNDARY-HIGH-AUTHORITY-001", + "release": "0.8.0", + "executed": false, + "purpose": "Replace the v0.8 one-dimensional thermal and deterministic fault screens with coupled physical evidence.", + "required_runs": [ + { + "gate": "SFR3D_G2_COUPLED_THERMAL_CFD_AND_STRESS_FEA", + "solver_class": "coupled conjugate heat transfer coolant CFD electromagnetic load and nonlinear structural FEA", + "required_outputs": ["interface temperatures", "coolant margins", "stress", "strain", "buckling", "fatigue usage", "fault transients"] + }, + { + "gate": "SFR3D_G3_FRACTURE_EROSION_AND_LIFETIME", + "solver_class": "fracture mechanics creep fatigue erosion and irradiation-damage workflow", + "required_outputs": ["critical flaw size", "crack growth", "erosion allowance", "joint life", "replacement interval"] + }, + { + "gate": "SFR3D_G4_SENSOR_RADIATION_AND_CALIBRATION", + "solver_class": "irradiation and environmental qualification campaign", + "required_outputs": ["dose survival", "drift", "latency", "localization error", "probability of detection", "false alarm rate", "calibration interval"] + }, + { + "gate": "SFR3D_G5_3D_MAGNETIC_COUPLING", + "solver_class": "CAD-linked magnetostatic and free-boundary equilibrium workflow", + "required_outputs": ["material-induced field error", "sensor and feedthrough perturbation", "trim authority", "island widths", "effective ripple"] + }, + { + "gate": "SFR3D_G6_3D_NEUTRONICS_TBR_AND_HEATING", + "solver_class": "continuous-energy 3-D OpenMC or equivalent", + "required_outputs": ["TBR", "nuclear heating", "dpa", "gas production", "sensor dose", "REBCO flux", "streaming"] + } + ], + "hardware_entry_requirement": "No hardware safety or wall-lifetime claim is permitted until G2 through G7 outputs close and an instrumented sector prototype passes seeded-fault tests.", + "fail_closed_rule": "Missing physical evidence remains NOT_RUN and cannot be replaced by the v0.8 screen." +} diff --git a/external_solvers/sfr3_field_integrity_evidence_contract.json b/external_solvers/sfr3_field_integrity_evidence_contract.json new file mode 100644 index 0000000..d829580 --- /dev/null +++ b/external_solvers/sfr3_field_integrity_evidence_contract.json @@ -0,0 +1,35 @@ +{ + "contract_id": "SFR3-FIELD-INTEGRITY-HIGH-AUTHORITY-001", + "release": "0.7.0", + "executed": false, + "purpose": "Replace the synthetic harmonic response with physical field and plasma evidence.", + "required_runs": [ + { + "gate": "SFR3_G2_BIOT_SAVART_COIL_RESPONSE", + "solver_class": "Biot-Savart or validated magnetostatic finite element", + "inputs": ["as-built primary coils", "24 trim coils", "passive loops", "blanket steel", "ports", "shield geometry"], + "outputs": ["Bn response matrix", "forces", "inductance matrix", "current and clearance margins"] + }, + { + "gate": "SFR3_G3_FREE_BOUNDARY_EQUILIBRIUM_AND_ISLANDS", + "solver_class": "VMEC++ or DESC plus SPEC or equivalent island-capable workflow", + "outputs": ["finite-beta equilibrium", "island widths", "effective ripple", "strike-point displacement"] + }, + { + "gate": "SFR3_G4_PARTICLE_AND_ALPHA_ORBITS", + "solver_class": "ASCOT5 or equivalent guiding-center and selected full-orbit workflow", + "outputs": ["thermal losses", "alpha losses", "wall loss map", "fault-case sensitivity"] + }, + { + "gate": "SFR3_G6_COIL_STRESS_QUENCH_AND_CRYOGENICS", + "solver_class": "coupled electromagnetic structural thermal and quench analysis", + "outputs": ["stress", "strain", "modal FRF", "temperature margin", "quench voltage", "energy extraction"] + }, + { + "gate": "SFR3_G7_FULL_3D_NEUTRONICS_AND_TBR", + "solver_class": "OpenMC or equivalent continuous-energy 3-D neutronics", + "outputs": ["TBR", "REBCO fast flux", "nuclear heating", "dose", "streaming", "shield comparison"] + } + ], + "fail_closed_rule": "No missing output may be replaced by the v0.7 synthetic result or by a material analogy." +} diff --git a/external_solvers/sfr4_integrated_evidence_contract.json b/external_solvers/sfr4_integrated_evidence_contract.json new file mode 100644 index 0000000..3b70b8e --- /dev/null +++ b/external_solvers/sfr4_integrated_evidence_contract.json @@ -0,0 +1,69 @@ +{ + "contract_version": "0.9.0", + "study_id": "SFR4-INTEGRATED-PHYSICAL-PROMOTION-A", + "promotion_is_fail_closed": true, + "required_jobs": [ + { + "gate": "SFR4-G1", + "job": "CAD-linked coil optimization and independent Biot-Savart validation", + "required_tools": ["SIMSOPT or validated equivalent", "configuration-controlled CAD"], + "status": "NOT_RUN" + }, + { + "gate": "SFR4-G2", + "job": "finite-beta equilibrium cross-code campaign", + "required_tools": ["DESC", "VMEC++"], + "status": "NOT_RUN" + }, + { + "gate": "SFR4-G3", + "job": "islands stability and error-field robustness", + "required_tools": ["SPEC or validated equivalent", "MHD stability suite"], + "status": "NOT_RUN" + }, + { + "gate": "SFR4-G4", + "job": "alpha orbits neoclassical and gyrokinetic transport", + "required_tools": ["Boozer transform", "guiding-center solver", "neoclassical solver", "gyrokinetic solver"], + "status": "NOT_RUN" + }, + { + "gate": "SFR4-G5", + "job": "3-D island-divertor detachment and wall-load solution", + "required_tools": ["3-D edge plasma and neutral transport", "CAD heat-footprint mapping"], + "status": "NOT_RUN" + }, + { + "gate": "SFR4-G6", + "job": "conjugate thermal hydraulic structural and lifetime qualification", + "required_tools": ["CFD", "structural FEA", "fracture and fatigue", "CHF correlation qualification"], + "status": "NOT_RUN" + }, + { + "gate": "SFR4-G7", + "job": "full 3-D neutronics TBR heating damage and streaming", + "required_tools": ["OpenMC", "DAGMC or equivalent CAD transport", "qualified nuclear data"], + "status": "NOT_RUN" + }, + { + "gate": "SFR4-G8", + "job": "integrated burn plant fuel-cycle and accident analysis", + "required_tools": ["profile transport", "plant model", "tritium model", "safety analysis"], + "status": "NOT_RUN" + }, + { + "gate": "SFR4-G9", + "job": "representative component and integrated hardware validation", + "required_tools": ["high heat flux test", "PbLi loop", "irradiation", "magnet prototype", "plasma experiment"], + "status": "NOT_RUN" + } + ], + "prohibited_substitutions": [ + "ISS04 for transport", + "filament fields for qualified coils", + "1-D conduction for conjugate thermal FEA", + "geometric breeding coverage for OpenMC TBR", + "conditional power algebra for net electricity", + "software tests for fusion or safety" + ] +} diff --git a/provenance/SFR2_ACTUATION_TECHNICAL_BASIS_2026.json b/provenance/SFR2_ACTUATION_TECHNICAL_BASIS_2026.json new file mode 100644 index 0000000..ba3650c --- /dev/null +++ b/provenance/SFR2_ACTUATION_TECHNICAL_BASIS_2026.json @@ -0,0 +1,28 @@ +{ + "as_of": "2026-08-21", + "authority_rule": "Sources justify testing mechanisms and risks only. They do not validate this SFR-2 actuation overlay.", + "program": "IX-StellaratorForge", + "sources": [ + { + "doi": "10.1063/1.859025", + "title": "Theory of first-order plasma heating by collisional magnetic pumping", + "use": "Supports the statement that net magnetic-pumping heating requires kinetic irreversibility and depends on waveform; no heating rate is transferred to SFR-2." + }, + { + "title": "Stable compression of a spherical tokamak plasma", + "url": "https://www.osti.gov/servlets/purl/1650654", + "use": "Supports treating compression stability as a required MHD calculation; the device and geometry differ from SFR-2." + }, + { + "title": "Influence of the Trim Coils Operation on Wendelstein 7-X Magnetic Field", + "url": "https://www.ipp.mpg.de/3958422/ishw2015_book_of_abstracts_5.pdf", + "use": "Supports explicit evaluation of magnetic perturbations, structural deformation and correction-coil effects in a stellarator; no W7-X performance is transferred." + }, + { + "title": "Verification of energetic and angular distributions of nuclear-reaction products in beam-plasma fusion", + "url": "https://conferences.iaea.org/event/392/papers/36194/files/13501-Manuscript%20FEC%202025.pdf", + "use": "Supports treating the relevant fusion reaction as binary rather than crediting a three-body collision mechanism." + } + ], + "study_id": "SFR-2-Actuation-Overlay-A" +} diff --git a/provenance/SFR3_DUAL_BOUNDARY_TECHNICAL_BASIS_2026.json b/provenance/SFR3_DUAL_BOUNDARY_TECHNICAL_BASIS_2026.json new file mode 100644 index 0000000..04a5144 --- /dev/null +++ b/provenance/SFR3_DUAL_BOUNDARY_TECHNICAL_BASIS_2026.json @@ -0,0 +1,98 @@ +{ + "release": "0.8.0", + "study_id": "SFR3-DUAL-BOUNDARY-AHIS-A", + "retrieved_utc_date": "2026-08-22", + "authority_rule": "Sources justify material choices, monitoring mechanisms and required tests. Published performance is not transferred numerically unless explicitly identified as a declared low-authority input.", + "sources": [ + { + "id": "ITER-VACUUM-VESSEL", + "title": "Vacuum Vessel", + "url": "https://www.iter.org/machine/vacuum-vessel", + "use": "Supports a double-walled steel vessel with cooling, in-wall shielding and safety-boundary functions.", + "limit": "ITER geometry, loads and materials are not a stellarator reactor qualification." + }, + { + "id": "ITER-LEAK-SENSITIVITY", + "title": "Ensuring leak test sensitivity", + "url": "https://www.iter.org/node/20687/ensuring-leak-test-sensitivity", + "use": "Supports monitored interspace and helium leak testing of double-wall vessel sectors.", + "limit": "Does not establish the v0.8 detection threshold or sector isolation time." + }, + { + "id": "ITER-DOUBLE-BARRIER-FEEDTHROUGH", + "title": "Positioned at the vacuum boundary", + "url": "https://www.iter.org/node/20687/positioned-vacuum-boundary", + "use": "Supports double-seal feedthroughs with a monitored interspace as defense in depth.", + "limit": "Final v0.8 feedthrough count and qualification remain open." + }, + { + "id": "FED-FW-INTEGRITY-2025", + "title": "Integrity assessment of Tokamak-type fusion reactor First Wall and Blanket structures", + "url": "https://doi.org/10.1016/j.fusengdes.2025.114995", + "use": "Supports explicit plastic strain, creep, radiation and lifetime analysis for RAFM first-wall structures.", + "limit": "Tokamak FNSF results and reported lifetime are not transferred to SFR-3." + }, + { + "id": "FED-FW-MULTIPHYSICS-2025", + "title": "Transient multiphysics modeling of the electromagnetic loads on the first wall during plasma disruptions", + "url": "https://doi.org/10.1016/j.fusengdes.2025.114929", + "use": "Supports coupled electromagnetic and structural analysis rather than pressure-only wall logic.", + "limit": "The v0.8 one-dimensional screen cannot reproduce this authority." + }, + { + "id": "ITER-BLANKET", + "title": "ITER Blanket", + "url": "https://www.iter.org/machine/blanket", + "use": "Supports actively cooled blanket modules and tungsten first-wall relevance.", + "limit": "ITER water cooling is not selected as the v0.8 integrated PbLi reference." + }, + { + "id": "NF-WCU-INTERFACE-2026", + "title": "Enhanced thermal fatigue resistance of W/Cu divertor components via serrated interface design", + "url": "https://doi.org/10.1088/1741-4326/ae4111", + "use": "Supports retaining engineered W/Cu interfaces as a comparison branch.", + "limit": "Divertor results do not qualify a first-wall blanket system." + }, + { + "id": "IJRMHM-WCU-FGM-2026", + "title": "Improving interfacial bonding and properties of W/W-Cu FGM/CuCrZr joints", + "url": "https://doi.org/10.1016/j.ijrmhm.2025.107544", + "use": "Supports the thermally favorable W-Cu-CuCrZr comparison stack and its joining challenge.", + "limit": "The joint is not qualified for full fusion-neutron reactor service." + }, + { + "id": "ORNL-PBLI-2025", + "title": "Mitigated Dissimilar Mass Transfer with Aluminized RAFM Steels in Flowing PbLi at 650 C", + "url": "https://doi.org/10.1080/15361055.2025.2498195", + "use": "Supports retaining RAFM, coating and SiC/PbLi compatibility as an experimental qualification path.", + "limit": "Loop exposures do not close reactor corrosion, MHD or lifetime." + }, + { + "id": "MEASUREMENT-OPTICAL-2025", + "title": "All-metal packaged temperature compensation fiber optic Fabry-Perot strain sensor for high-temperature liquid metal environments", + "url": "https://doi.org/10.1016/j.measurement.2025.118501", + "use": "Supports an all-metal temperature-compensated strain-sensing research candidate near liquid-metal systems.", + "limit": "Demonstration to 500 C is not fusion-neutron qualification." + }, + { + "id": "JET-FOCS-2025", + "title": "Assessment of Neutron Radiation Effects on the Fiber Optics Current Sensor Performance During JET DTE2", + "url": "https://doi.org/10.3390/s25216552", + "use": "Supports explicit neutron-effects testing for optical current and magnetic instrumentation.", + "limit": "JET campaign exposure is not a reactor lifetime guarantee." + }, + { + "id": "JMRT-EMBEDDED-FIBER-2025", + "title": "Electric field-assisted embedding of fiber optic sensors in structural materials for structural health monitoring", + "url": "https://doi.org/10.1016/j.jmrt.2024.12.050", + "use": "Supports studying stainless or nickel encapsulation of optical fibers for SHM.", + "limit": "Embedding and bonding performance under fusion irradiation remain unproven." + } + ], + "explicit_non_transfers": [ + "No ITER vessel dimension or pressure is copied into the stellarator geometry.", + "No published wall lifetime is assigned to the selected stack.", + "No sensor probability of detection is invented.", + "No thermal screen result is converted into confinement or ignition credit." + ] +} diff --git a/provenance/SFR3_FIELD_INTEGRITY_TECHNICAL_BASIS_2026.json b/provenance/SFR3_FIELD_INTEGRITY_TECHNICAL_BASIS_2026.json new file mode 100644 index 0000000..bee8416 --- /dev/null +++ b/provenance/SFR3_FIELD_INTEGRITY_TECHNICAL_BASIS_2026.json @@ -0,0 +1,101 @@ +{ + "release": "0.7.0", + "study_id": "SFR3-FIELD-INTEGRITY-SHELL-A", + "retrieved_utc_date": "2026-08-21", + "scope": "Evidence used to select mechanisms and exclusions; no source result is numerically transferred into the synthetic controllability screen except as an explicitly declared hypothesis.", + "sources": [ + { + "id": "APS-PSC-2025", + "title": "Optimization of passive superconductors for shaping stellarator magnetic fields", + "url": "https://doi.org/10.1103/PhysRevE.111.065202", + "role": "Supports studying optimized passive superconducting coils for partial 3-D shaping and passive response.", + "limit": "Does not validate the SFR-3 loop geometry or its declared 55 percent transient attenuation." + }, + { + "id": "NF-PLANAR-2025", + "title": "Stellarator fusion systems enabled by arrays of planar coils", + "url": "https://doi.org/10.1088/1741-4326/ada56c", + "role": "Supports individually controlled planar field-shaping arrays as a credible stellarator architecture.", + "limit": "Published configurations and field errors are not transferred to SFR-3." + }, + { + "id": "IAEA-W7X-TRIM-2016", + "title": "Error field measurement correction and heat flux balancing on Wendelstein 7-X", + "url": "https://conferences.iaea.org/event/98/contributions/12363/", + "role": "Demonstrates practical error-field measurement and trim-coil correction in a stellarator.", + "limit": "W7-X response and capacity are machine-specific." + }, + { + "id": "IPP-W7X-PRECISION-2016", + "title": "Magnetic field of Wendelstein 7-X exact to a hundred-thousandth", + "url": "https://www.ipp.mpg.de/4141626/w7x_nature", + "role": "Establishes the importance and measurability of high field-geometry precision.", + "limit": "Precision achievement is not a reactor confinement or manufacturing guarantee." + }, + { + "id": "FED-FERRO-2026", + "title": "Efficient calculation of magnetic fields from ferromagnetic materials near strong electromagnets and application to stellarator coil optimization", + "url": "https://doi.org/10.1016/j.fusengdes.2026.115627", + "role": "Supports including ferritic blanket magnetization in coil co-design rather than banning all magnetic structure by assumption.", + "limit": "Requires CAD-specific validation and does not guarantee minor effects for SFR-3." + }, + { + "id": "COIL-FEM-2026-PREPRINT", + "title": "Towards joint optimization of stellarator coils and support structures", + "url": "https://arxiv.org/abs/2607.05749", + "role": "Supports integrating support stress and displacement into coil optimization.", + "limit": "Preprint evidence; SFR-3 has not run the tool or reproduced the reported result." + }, + { + "id": "OXFORD-REBCO-2026", + "title": "The performance of REBCO coated conductor during in situ cryogenic irradiation with fusion-spectrum neutrons", + "url": "https://doi.org/10.1088/1361-6668/ae4548", + "role": "Requires conservative real-time radiation lifetime treatment for REBCO.", + "limit": "One conductor and exposure protocol do not define a complete reactor lifetime." + }, + { + "id": "FST-HFH-2026", + "title": "Design and Performance of Metal Hydride Composite Neutron Shields for Compact High-Power Fusion Reactors", + "url": "https://doi.org/10.1080/15361055.2025.2514910", + "role": "Supports retaining HfH1.7 composites as a solver-dependent magnet-shield candidate.", + "limit": "Published reductions are compact-tokamak configuration results and are not credited to SFR-3." + }, + { + "id": "ITER-BLANKET", + "title": "ITER blanket", + "url": "https://www.iter.org/machine/blanket", + "role": "Supports tungsten first-wall relevance and separates plasma-facing survival from confinement.", + "limit": "ITER materials and water-cooling decisions are not a direct reactor prescription." + }, + { + "id": "FED-WFW-2026", + "title": "Demonstrating powder metallurgically produced long tungsten fiber-reinforced tungsten composite to serve as plasma-facing material", + "url": "https://doi.org/10.1016/j.fusengdes.2025.115605", + "role": "Supports retaining tungsten-fiber-reinforced tungsten as a damage-resilience branch.", + "limit": "Does not establish reactor lifetime or make the wall a confinement system." + }, + { + "id": "FST-LI-DIVERTOR-2025", + "title": "Design and Analysis of the Open-Surface Slow Li Flow Divertor and Comparison to the Fast Li Flow Divertor", + "url": "https://doi.org/10.1080/15361055.2025.2454154", + "role": "Supports a local liquid-lithium divertor branch for recycling and heat exhaust.", + "limit": "The reported engineering limits do not imply core confinement improvement." + }, + { + "id": "LHD-LI-2025-PREPRINT", + "title": "Enhancement of Mid-/High-Z Impurity Transport by Continuous Li-granule Dropping in a Stellarator Plasma", + "url": "https://arxiv.org/abs/2506.21141", + "role": "Shows lithium can materially alter impurity transport in a stellarator plasma.", + "limit": "Preprint and machine-specific; both beneficial and adverse impurity consequences require experiment." + } + ], + "donor_archives": [ + "IX-Vibe-main(20260822-015659).zip", + "PressureX-main(20260822-015659).zip", + "ahis-autonomic-hull-integrity-system-main(20260822-015708).zip", + "IX-Breath-main(20260822-015809).zip", + "IX-GCR-SPE-main(20260822-015809).zip", + "IX-HfTaZen-Shield-main(20260822-015810).zip", + "IX-Shield-main(20260822-015809).zip" + ] +} diff --git a/provenance/SFR4_INTEGRATED_TECHNICAL_BASIS_2026.json b/provenance/SFR4_INTEGRATED_TECHNICAL_BASIS_2026.json new file mode 100644 index 0000000..5a91b8f --- /dev/null +++ b/provenance/SFR4_INTEGRATED_TECHNICAL_BASIS_2026.json @@ -0,0 +1,57 @@ +{ + "record_version": "0.9.0", + "study_id": "SFR4-INTEGRATED-PHYSICAL-PROMOTION-A", + "retrieval_date": "2026-08-22", + "sources": [ + { + "title": "DESC 0.17.3 documentation", + "url": "https://desc-docs.readthedocs.io/", + "use": "production fixed-boundary equilibrium and optimization route", + "credit": "method and dependency route only; no DESC result was executed" + }, + { + "title": "VMEC++ documentation", + "url": "https://proximafusion.github.io/vmecpp/", + "use": "independent finite-beta equilibrium cross-check route", + "credit": "method and dependency route only; no VMEC++ result was executed" + }, + { + "title": "SIMSOPT coil optimization documentation", + "url": "https://simsopt.readthedocs.io/v1.10.4/", + "use": "production coil and plasma co-design route", + "credit": "method route only; SIMSOPT was unavailable" + }, + { + "title": "ITER Fusion Divertor", + "url": "https://www.iter.org/machine/divertor", + "use": "10 MW/m2 steady and 20 MW/m2 slow-transient reference context for tungsten targets", + "credit": "reference context only; ITER qualification does not transfer to SFR-4" + }, + { + "title": "Power and particle exhaust for the Infinity Two fusion pilot plant", + "url": "https://www.cambridge.org/core/journals/journal-of-plasma-physics/article/power-and-particle-exhaust-for-the-infinity-two-fusion-pilot-plant/FCE20C6558D7D77C585973F42AB5AC15", + "use": "stellarator island-divertor detachment and exhaust context", + "credit": "architecture context only; no performance is transferred" + }, + { + "title": "OpenMC", + "url": "https://openmc.org/", + "use": "production neutron transport route", + "credit": "method route only; no OpenMC result was executed" + } + ], + "in_repo_methods": [ + "direct filament Biot-Savart", + "vacuum field-line integration", + "held-out normal-field reconstruction", + "Bosch-Hale D-T reactivity", + "ISS04 empirical requirement", + "bremsstrahlung engineering approximation", + "one-dimensional multilayer conduction", + "single-phase hydraulic pressure-drop screen", + "exact D-T source ledger", + "geometric breeding-coverage bound", + "conditional plant algebra" + ], + "nontransfer_rule": "Published component or facility performance is not assigned to SFR-4. Every selected material and limit remains subject to candidate-specific analysis and test." +} diff --git a/pyproject.toml b/pyproject.toml index ea3d94c..8939a2e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -5,7 +5,7 @@ build-backend = "setuptools.build_meta" [project] name = "ix-stellaratorforge" -version = "0.5.0" +version = "0.9.0" description = "Evidence-driven stellarator fusion reactor reference-design and co-design framework." readme = "README.md" requires-python = ">=3.11" diff --git a/results/README.md b/results/README.md index dfecc7b..c547937 100644 --- a/results/README.md +++ b/results/README.md @@ -7,7 +7,18 @@ marked as a non-result/unknown. The authoritative regeneration command is: python scripts/generate_release.py ``` -Primary review path: +Primary v0.9 review path: + +1. `sfr4_integrated/SFR4_INTEGRATED_PHYSICAL_PROMOTION_A_RESULT.md` +2. `sfr4_integrated/sfr4_integrated_physical_promotion_a_v090.json` +3. `sfr3_dual_boundary/SFR3_DUAL_BOUNDARY_AHIS_A_RESULT.md` +4. `sfr3_dual_boundary/sfr3_dual_boundary_ahis_a_v080.json` +5. `sfr3_field_integrity/SFR3_FIELD_INTEGRITY_SHELL_A_RESULT.md` +6. `sfr3_field_integrity/sfr3_field_integrity_shell_a_v070.json` +7. `sfr2_actuation/SFR2_ACTUATION_OVERLAY_A_RESULT.md` +8. `sfr2/SFR2_REVA_SCREEN_RESULT.md` + +Preserved IX-Fusion foundation path: 1. `poc/POC_RESULT.md` 2. `poc/verdict.json` diff --git a/results/evidence/IXFUSION-POC-001.json b/results/evidence/IXFUSION-POC-001.json index d710872..be378b7 100644 --- a/results/evidence/IXFUSION-POC-001.json +++ b/results/evidence/IXFUSION-POC-001.json @@ -7,12 +7,12 @@ "RF Monte Carlo models spatial-mode purity only and does not model plasma-wave coupling." ], "claim_level": "reduced-order computational screening only", - "created_utc": "2026-08-19T03:27:45+00:00", + "created_utc": "2026-08-22T20:42:03+00:00", "input_hashes": { - "/mnt/data/IX-StellaratorForge-evolved/IX-StellaratorForge-main/configs/baselines/matched_helical_5fp.json": "1fe77095b374819712f56ba69d5c52cce28de36048977c8a415b8e4918bd8e8f", - "/mnt/data/IX-StellaratorForge-evolved/IX-StellaratorForge-main/configs/candidates/c6_seed.json": "4f77d1d8b61ce241f7448db70653549c1920e27ab4fd75e38a5d5d9118bc6251", - "/mnt/data/IX-StellaratorForge-evolved/IX-StellaratorForge-main/configs/optimization/poc_optimizer.json": "6698d230792ba3b5c46cf18d472051f2fcae4a96107fd4d6fbdc6191e6171f40", - "/mnt/data/IX-StellaratorForge-evolved/IX-StellaratorForge-main/configs/system/rf_robustness.json": "f500e3b35709497bbc9517b364c10c75e1a49ce79c7c71e01c82c232c7bf7913" + "/workspace/scratch/fe9a4bb2e1bb/release/IX-StellaratorForge-v0.9.0/configs/baselines/matched_helical_5fp.json": "1fe77095b374819712f56ba69d5c52cce28de36048977c8a415b8e4918bd8e8f", + "/workspace/scratch/fe9a4bb2e1bb/release/IX-StellaratorForge-v0.9.0/configs/candidates/c6_seed.json": "4f77d1d8b61ce241f7448db70653549c1920e27ab4fd75e38a5d5d9118bc6251", + "/workspace/scratch/fe9a4bb2e1bb/release/IX-StellaratorForge-v0.9.0/configs/optimization/poc_optimizer.json": "6698d230792ba3b5c46cf18d472051f2fcae4a96107fd4d6fbdc6191e6171f40", + "/workspace/scratch/fe9a4bb2e1bb/release/IX-StellaratorForge-v0.9.0/configs/system/rf_robustness.json": "f500e3b35709497bbc9517b364c10c75e1a49ce79c7c71e01c82c232c7bf7913" }, "limitations": [ "No DESC, VMEC, or equivalent equilibrium has been generated by the internal POC.", diff --git a/results/sfr2_actuation/SFR2_ACTUATION_OVERLAY_A_RESULT.md b/results/sfr2_actuation/SFR2_ACTUATION_OVERLAY_A_RESULT.md new file mode 100644 index 0000000..395216b --- /dev/null +++ b/results/sfr2_actuation/SFR2_ACTUATION_OVERLAY_A_RESULT.md @@ -0,0 +1,34 @@ +# SFR-2 Actuation Overlay A, v0.6.0 result + +## Verdict + +`NO_DECLARED_BREATHING_CASE_IMPROVES_BOTH_CYCLE_AVERAGE_PROXY_AND_FUSION_POWER` + +This is a low-authority analytical and empirical falsification screen. It is not a dynamic equilibrium, magnetic-pumping, ignition, sustained-burn, net-energy or hardware result. + +## Preserved baseline + +The SFR-2 Rev A 23 / 26 / 23 / 26 ft ABAB geometry, rigid vessel and steady primary HTS field remain unchanged. +The baseline H_ISS04=1 optimistic ignition ratio is **0.961077249**, a ratio gap of **3.8923%**. This is not a percentage distance from physical ignition. +The target-matched uniform fusion screen is **1000.000 MW**. + +## Timed squeeze and expansion test + +The closest cycle-average case is `traveling_quadrature` at 5.00% depth. +Its cycle-average optimistic ignition ratio is **0.961559491** and its cycle-average uniform fusion power is **997.233 MW**. +Joint average improvement over the unchanged baseline: **False**. +No declared case crosses the cycle-average proxy: **True**. + +The closest instantaneous point occurs in `synchronous` at 5.00% depth and reaches **0.998114154**. That point is a 5.00% expansion, not a squeeze, with uniform fusion power reduced to **802.542 MW**. It is not credited as ignition capture or sustained burn, and actuator power is not yet debited. + +## Trinity image translation + +`IMAGE_SUGGESTS_A_TESTABLE_ACTUATOR_SYMMETRY_BUT_ADDS_NO_EARNED_FUSION_GAIN` + +The astrophysical accretion, gravity, shock-front and multiple-star claims are not imported into reactor physics. D-T fusion is treated as a binary reaction, so a three-point collision receives zero fusion credit. +A global three-toroidal-lobe pattern conflicts with the unchanged four-field-period baseline. The defensible translation is an area-preserving poloidal m=3 actuator harmonic repeated inside every one of the four ABAB periods. +Because the tri-lobe harmonic is normalized to preserve cross-sectional area, reshaping alone produces no density, temperature, fusion-power or ignition-proxy gain in this screen. + +## Decision + +Do not promote magnetic breathing or the tri-lobe image geometry as a closer-to-fusion result. Retain them as an optional actuator hypothesis for high-authority equilibrium, topology, kinetic, alpha-orbit, electromagnetic and integrated-power testing. diff --git a/results/sfr2_actuation/sfr2_actuation_overlay_a_v060.json b/results/sfr2_actuation/sfr2_actuation_overlay_a_v060.json new file mode 100644 index 0000000..8141492 --- /dev/null +++ b/results/sfr2_actuation/sfr2_actuation_overlay_a_v060.json @@ -0,0 +1,1259 @@ +{ + "authority": "LOW__zero_D_adiabatic_cycle_plus_ISS04_screen__not_dynamic_equilibrium", + "baseline": { + "axis_field_T": 15.0, + "base_beta": 0.011936957296877555, + "base_temperature_keV": 15.0, + "distance_from_ratio_one_fraction": -0.038922751007159695, + "fusion_power_MW_uniform": 1000.0, + "iota_2over3": 0.9, + "optimistic_ignition_tau_ratio": 0.9610772489928403 + }, + "baseline_design_id": "SFR-2-RevA", + "breathing_cases": [ + { + "closest_instantaneous_proxy_point": { + "alpha_heating_MW_uniform": 198.86363636363635, + "beta_at_fixed_B": 0.011936957296877555, + "cycle_phase_deg": 0.0, + "equivalent_radial_squeeze_fraction": 0.0, + "fusion_power_MW_uniform": 1000.0, + "ion_density_m3": 2.2233336968266498e+20, + "ion_temperature_keV": 15.0, + "neutron_power_MW_uniform": 801.1363636363635, + "optimistic_ignition_tau_ratio": 0.9610772489928403, + "thermal_energy_MJ": 167.88650229334363, + "volume_ratio_to_baseline": 1.0 + }, + "cycle_average": { + "alpha_heating_MW_uniform": 198.86363636363635, + "beta_at_fixed_B": 0.011936957296877555, + "distance_from_ratio_one_fraction": -0.038922751007159695, + "fusion_power_MW_uniform": 1000.0, + "optimistic_ignition_tau_ratio": 0.9610772489928403 + }, + "depth_fraction": 0.0, + "full_cycle": { + "maximum_beta_at_fixed_B": 0.011936957296877555, + "maximum_fusion_power_MW_uniform": 1000.0, + "maximum_optimistic_ignition_tau_ratio": 0.9610772489928403, + "minimum_fusion_power_MW_uniform": 1000.0, + "minimum_optimistic_ignition_tau_ratio": 0.9610772489928403 + }, + "maximum_fusion_point": { + "alpha_heating_MW_uniform": 198.86363636363635, + "beta_at_fixed_B": 0.011936957296877555, + "cycle_phase_deg": 0.0, + "equivalent_radial_squeeze_fraction": 0.0, + "fusion_power_MW_uniform": 1000.0, + "ion_density_m3": 2.2233336968266498e+20, + "ion_temperature_keV": 15.0, + "neutron_power_MW_uniform": 801.1363636363635, + "optimistic_ignition_tau_ratio": 0.9610772489928403, + "thermal_energy_MJ": 167.88650229334363, + "volume_ratio_to_baseline": 1.0 + }, + "pattern": "abab_opposed", + "phase_offsets_deg": [ + 0.0, + 180.0, + 0.0, + 180.0 + ], + "screen_decision": { + "cycle_average_fusion_improves_over_baseline": false, + "cycle_average_proxy_pass": false, + "cycle_average_ratio_improves_over_baseline": false, + "entire_cycle_proxy_pass": false, + "joint_average_improvement": false, + "net_power_claim_permitted": false + } + }, + { + "closest_instantaneous_proxy_point": { + "alpha_heating_MW_uniform": 198.86363636363635, + "beta_at_fixed_B": 0.011936957296877555, + "cycle_phase_deg": 0.0, + "equivalent_radial_squeeze_fraction": 0.0, + "fusion_power_MW_uniform": 1000.0, + "ion_density_m3": 2.2233336968266498e+20, + "ion_temperature_keV": 15.0, + "neutron_power_MW_uniform": 801.1363636363635, + "optimistic_ignition_tau_ratio": 0.9610772489928403, + "thermal_energy_MJ": 167.88650229334363, + "volume_ratio_to_baseline": 1.0 + }, + "cycle_average": { + "alpha_heating_MW_uniform": 198.86363636363635, + "beta_at_fixed_B": 0.011936957296877555, + "distance_from_ratio_one_fraction": -0.038922751007159695, + "fusion_power_MW_uniform": 1000.0, + "optimistic_ignition_tau_ratio": 0.9610772489928403 + }, + "depth_fraction": 0.0, + "full_cycle": { + "maximum_beta_at_fixed_B": 0.011936957296877555, + "maximum_fusion_power_MW_uniform": 1000.0, + "maximum_optimistic_ignition_tau_ratio": 0.9610772489928403, + "minimum_fusion_power_MW_uniform": 1000.0, + "minimum_optimistic_ignition_tau_ratio": 0.9610772489928403 + }, + "maximum_fusion_point": { + "alpha_heating_MW_uniform": 198.86363636363635, + "beta_at_fixed_B": 0.011936957296877555, + "cycle_phase_deg": 0.0, + "equivalent_radial_squeeze_fraction": 0.0, + "fusion_power_MW_uniform": 1000.0, + "ion_density_m3": 2.2233336968266498e+20, + "ion_temperature_keV": 15.0, + "neutron_power_MW_uniform": 801.1363636363635, + "optimistic_ignition_tau_ratio": 0.9610772489928403, + "thermal_energy_MJ": 167.88650229334363, + "volume_ratio_to_baseline": 1.0 + }, + "pattern": "synchronous", + "phase_offsets_deg": [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + "screen_decision": { + "cycle_average_fusion_improves_over_baseline": false, + "cycle_average_proxy_pass": false, + "cycle_average_ratio_improves_over_baseline": false, + "entire_cycle_proxy_pass": false, + "joint_average_improvement": false, + "net_power_claim_permitted": false + } + }, + { + "closest_instantaneous_proxy_point": { + "alpha_heating_MW_uniform": 198.86363636363635, + "beta_at_fixed_B": 0.011936957296877555, + "cycle_phase_deg": 0.0, + "equivalent_radial_squeeze_fraction": 0.0, + "fusion_power_MW_uniform": 1000.0, + "ion_density_m3": 2.2233336968266498e+20, + "ion_temperature_keV": 15.0, + "neutron_power_MW_uniform": 801.1363636363635, + "optimistic_ignition_tau_ratio": 0.9610772489928403, + "thermal_energy_MJ": 167.88650229334363, + "volume_ratio_to_baseline": 1.0 + }, + "cycle_average": { + "alpha_heating_MW_uniform": 198.86363636363635, + "beta_at_fixed_B": 0.011936957296877555, + "distance_from_ratio_one_fraction": -0.038922751007159695, + "fusion_power_MW_uniform": 1000.0, + "optimistic_ignition_tau_ratio": 0.9610772489928403 + }, + "depth_fraction": 0.0, + "full_cycle": { + "maximum_beta_at_fixed_B": 0.011936957296877555, + "maximum_fusion_power_MW_uniform": 1000.0, + "maximum_optimistic_ignition_tau_ratio": 0.9610772489928403, + "minimum_fusion_power_MW_uniform": 1000.0, + "minimum_optimistic_ignition_tau_ratio": 0.9610772489928403 + }, + "maximum_fusion_point": { + "alpha_heating_MW_uniform": 198.86363636363635, + "beta_at_fixed_B": 0.011936957296877555, + "cycle_phase_deg": 0.0, + "equivalent_radial_squeeze_fraction": 0.0, + "fusion_power_MW_uniform": 1000.0, + "ion_density_m3": 2.2233336968266498e+20, + "ion_temperature_keV": 15.0, + "neutron_power_MW_uniform": 801.1363636363635, + "optimistic_ignition_tau_ratio": 0.9610772489928403, + "thermal_energy_MJ": 167.88650229334363, + "volume_ratio_to_baseline": 1.0 + }, + "pattern": "traveling_quadrature", + "phase_offsets_deg": [ + 0.0, + 90.0, + 180.0, + 270.0 + ], + "screen_decision": { + "cycle_average_fusion_improves_over_baseline": false, + "cycle_average_proxy_pass": false, + "cycle_average_ratio_improves_over_baseline": false, + "entire_cycle_proxy_pass": false, + "joint_average_improvement": false, + "net_power_claim_permitted": false + } + }, + { + "closest_instantaneous_proxy_point": { + "alpha_heating_MW_uniform": 198.72593377835332, + "beta_at_fixed_B": 0.011930745256620663, + "cycle_phase_deg": 90.0, + "equivalent_radial_squeeze_fraction": -0.00015617402932610602, + "fusion_power_MW_uniform": 999.3075527140054, + "ion_density_m3": 2.2226394055123517e+20, + "ion_temperature_keV": 14.996877088422382, + "neutron_power_MW_uniform": 800.5816189356519, + "optimistic_ignition_tau_ratio": 0.9611978352301627, + "thermal_energy_MJ": 167.85154931322776, + "volume_ratio_to_baseline": 1.0003123724489795 + }, + "cycle_average": { + "alpha_heating_MW_uniform": 198.86228793595393, + "beta_at_fixed_B": 0.01193689636850747, + "distance_from_ratio_one_fraction": -0.03892155636783956, + "fusion_power_MW_uniform": 999.9932193350826, + "optimistic_ignition_tau_ratio": 0.9610784436321604 + }, + "depth_fraction": 0.0025, + "full_cycle": { + "maximum_beta_at_fixed_B": 0.011942925624143882, + "maximum_fusion_power_MW_uniform": 1000.6653246853826, + "maximum_optimistic_ignition_tau_ratio": 0.9611978352301627, + "minimum_fusion_power_MW_uniform": 999.3075527140054, + "minimum_optimistic_ignition_tau_ratio": 0.9609614413079356 + }, + "maximum_fusion_point": { + "alpha_heating_MW_uniform": 198.99594524993404, + "beta_at_fixed_B": 0.011942925624143882, + "cycle_phase_deg": 270.0, + "equivalent_radial_squeeze_fraction": 0.00014994746661112224, + "fusion_power_MW_uniform": 1000.6653246853826, + "ion_density_m3": 2.224000613337103e+20, + "ion_temperature_keV": 15.002999474051975, + "neutron_power_MW_uniform": 801.6693794354485, + "optimistic_ignition_tau_ratio": 0.9609614413079356, + "thermal_energy_MJ": 167.920073707164, + "volume_ratio_to_baseline": 0.9997001275510204 + }, + "pattern": "abab_opposed", + "phase_offsets_deg": [ + 0.0, + 180.0, + 0.0, + 180.0 + ], + "screen_decision": { + "cycle_average_fusion_improves_over_baseline": false, + "cycle_average_proxy_pass": false, + "cycle_average_ratio_improves_over_baseline": true, + "entire_cycle_proxy_pass": false, + "joint_average_improvement": false, + "net_power_claim_permitted": false + } + }, + { + "closest_instantaneous_proxy_point": { + "alpha_heating_MW_uniform": 196.67157638421264, + "beta_at_fixed_B": 0.011838019088410675, + "cycle_phase_deg": 270.0, + "equivalent_radial_squeeze_fraction": -0.0024999999999999467, + "fusion_power_MW_uniform": 988.977069817755, + "ion_density_m3": 2.2122585773239222e+20, + "ion_temperature_keV": 14.95014542933495, + "neutron_power_MW_uniform": 792.3054934335423, + "optimistic_ignition_tau_ratio": 0.9630038480929751, + "thermal_energy_MJ": 167.32850832719083, + "volume_ratio_to_baseline": 1.0050062499999999 + }, + "cycle_average": { + "alpha_heating_MW_uniform": 198.87020064288436, + "beta_at_fixed_B": 0.011937226710926861, + "distance_from_ratio_one_fraction": -0.03892473531299079, + "fusion_power_MW_uniform": 1000.0330089470756, + "optimistic_ignition_tau_ratio": 0.9610752646870092 + }, + "depth_fraction": 0.0025, + "full_cycle": { + "maximum_beta_at_fixed_B": 0.012036973166281384, + "maximum_fusion_power_MW_uniform": 1011.1549664423495, + "maximum_optimistic_ignition_tau_ratio": 0.9630038480929751, + "minimum_fusion_power_MW_uniform": 988.977069817755, + "minimum_optimistic_ignition_tau_ratio": 0.9591427126739391 + }, + "maximum_fusion_point": { + "alpha_heating_MW_uniform": 201.0819535538763, + "beta_at_fixed_B": 0.012036973166281384, + "cycle_phase_deg": 90.0, + "equivalent_radial_squeeze_fraction": 0.0024999999999999467, + "fusion_power_MW_uniform": 1011.1549664423495, + "ion_density_m3": 2.234492192211506e+20, + "ion_temperature_keV": 15.050146239525983, + "neutron_power_MW_uniform": 810.073012888473, + "optimistic_ignition_tau_ratio": 0.9591427126739391, + "thermal_energy_MJ": 168.4477607438224, + "volume_ratio_to_baseline": 0.9950062500000001 + }, + "pattern": "synchronous", + "phase_offsets_deg": [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + "screen_decision": { + "cycle_average_fusion_improves_over_baseline": true, + "cycle_average_proxy_pass": false, + "cycle_average_ratio_improves_over_baseline": false, + "entire_cycle_proxy_pass": false, + "joint_average_improvement": false, + "net_power_claim_permitted": false + } + }, + { + "closest_instantaneous_proxy_point": { + "alpha_heating_MW_uniform": 198.86217378238388, + "beta_at_fixed_B": 0.011936891319088993, + "cycle_phase_deg": 0.0, + "equivalent_radial_squeeze_fraction": -1.6581618906830187e-06, + "fusion_power_MW_uniform": 999.9926453057018, + "ion_density_m3": 2.2233263235505766e+20, + "ion_temperature_keV": 14.999966836826342, + "neutron_power_MW_uniform": 801.1304715233179, + "optimistic_ignition_tau_ratio": 0.9610785294676502, + "thermal_energy_MJ": 167.88613111672828, + "volume_ratio_to_baseline": 1.0000033163265307 + }, + "cycle_average": { + "alpha_heating_MW_uniform": 198.86225816170347, + "beta_at_fixed_B": 0.0119368951254845, + "distance_from_ratio_one_fraction": -0.03892154440574869, + "fusion_power_MW_uniform": 999.9930696131375, + "optimistic_ignition_tau_ratio": 0.9610784555942513 + }, + "depth_fraction": 0.0025, + "full_cycle": { + "maximum_beta_at_fixed_B": 0.011936898931880973, + "maximum_fusion_power_MW_uniform": 999.9934939206886, + "maximum_optimistic_ignition_tau_ratio": 0.9610785294676502, + "minimum_fusion_power_MW_uniform": 999.9926453057018, + "minimum_optimistic_ignition_tau_ratio": 0.9610783817208431 + }, + "maximum_fusion_point": { + "alpha_heating_MW_uniform": 198.86234254104602, + "beta_at_fixed_B": 0.011936898931880973, + "cycle_phase_deg": 90.0, + "equivalent_radial_squeeze_fraction": -1.4668356589364606e-06, + "fusion_power_MW_uniform": 999.9934939206886, + "ion_density_m3": 2.2233271743107046e+20, + "ion_temperature_keV": 14.999970663337026, + "neutron_power_MW_uniform": 801.1311513796425, + "optimistic_ignition_tau_ratio": 0.9610783817208431, + "thermal_energy_MJ": 167.88617394469458, + "volume_ratio_to_baseline": 1.0000029336734695 + }, + "pattern": "traveling_quadrature", + "phase_offsets_deg": [ + 0.0, + 90.0, + 180.0, + 270.0 + ], + "screen_decision": { + "cycle_average_fusion_improves_over_baseline": false, + "cycle_average_proxy_pass": false, + "cycle_average_ratio_improves_over_baseline": true, + "entire_cycle_proxy_pass": false, + "joint_average_improvement": false, + "net_power_claim_permitted": false + } + }, + { + "closest_instantaneous_proxy_point": { + "alpha_heating_MW_uniform": 198.58285223207847, + "beta_at_fixed_B": 0.01192429011854141, + "cycle_phase_deg": 90.0, + "equivalent_radial_squeeze_fraction": -0.0003185717050138148, + "fusion_power_MW_uniform": 998.5880569384517, + "ion_density_m3": 2.2219177910506183e+20, + "ion_temperature_keV": 14.993630933113524, + "neutron_power_MW_uniform": 800.0052047063731, + "optimistic_ignition_tau_ratio": 0.961323194066435, + "thermal_energy_MJ": 167.81521693584747, + "volume_ratio_to_baseline": 1.000637244897959 + }, + "cycle_average": { + "alpha_heating_MW_uniform": 198.85824275860125, + "beta_at_fixed_B": 0.011936713587805101, + "distance_from_ratio_one_fraction": -0.0389179724936517, + "fusion_power_MW_uniform": 999.9728778718235, + "optimistic_ignition_tau_ratio": 0.9610820275063483 + }, + "depth_fraction": 0.005, + "full_cycle": { + "maximum_beta_at_fixed_B": 0.01194864964676002, + "maximum_fusion_power_MW_uniform": 1001.3034554937059, + "maximum_optimistic_ignition_tau_ratio": 0.961323194066435, + "minimum_fusion_power_MW_uniform": 998.5880569384517, + "minimum_optimistic_ignition_tau_ratio": 0.9608504178954587 + }, + "maximum_fusion_point": { + "alpha_heating_MW_uniform": 199.12284626295286, + "beta_at_fixed_B": 0.01194864964676002, + "cycle_phase_deg": 270.0, + "equivalent_radial_squeeze_fraction": 0.0002936655687127976, + "fusion_power_MW_uniform": 1001.3034554937059, + "ion_density_m3": 2.2246401053783287e+20, + "ion_temperature_keV": 15.005875324285263, + "neutron_power_MW_uniform": 802.1806092307529, + "optimistic_ignition_tau_ratio": 0.9608504178954587, + "thermal_energy_MJ": 167.95226146961647, + "volume_ratio_to_baseline": 0.9994127551020408 + }, + "pattern": "abab_opposed", + "phase_offsets_deg": [ + 0.0, + 180.0, + 0.0, + 180.0 + ], + "screen_decision": { + "cycle_average_fusion_improves_over_baseline": false, + "cycle_average_proxy_pass": false, + "cycle_average_ratio_improves_over_baseline": true, + "entire_cycle_proxy_pass": false, + "joint_average_improvement": false, + "net_power_claim_permitted": false + } + }, + { + "closest_instantaneous_proxy_point": { + "alpha_heating_MW_uniform": 194.50544258037755, + "beta_at_fixed_B": 0.011740144285036606, + "cycle_phase_deg": 270.0, + "equivalent_radial_squeeze_fraction": -0.004999999999999893, + "fusion_power_MW_uniform": 978.0845112613272, + "ion_density_m3": 2.2012660051252697e+20, + "ion_temperature_keV": 14.900580110053479, + "neutron_power_MW_uniform": 783.5790686809495, + "optimistic_ignition_tau_ratio": 0.9649225188157589, + "thermal_energy_MJ": 166.7737517879096, + "volume_ratio_to_baseline": 1.0100249999999997 + }, + "cycle_average": { + "alpha_heating_MW_uniform": 198.8898943250629, + "beta_at_fixed_B": 0.011938034995733707, + "distance_from_ratio_one_fraction": -0.03893068818946954, + "fusion_power_MW_uniform": 1000.132040034602, + "optimistic_ignition_tau_ratio": 0.9610693118105305 + }, + "depth_fraction": 0.005, + "full_cycle": { + "maximum_beta_at_fixed_B": 0.01213808117998298, + "maximum_fusion_power_MW_uniform": 1022.4436564261636, + "maximum_optimistic_ignition_tau_ratio": 0.9649225188157589, + "minimum_fusion_power_MW_uniform": 978.0845112613272, + "minimum_optimistic_ignition_tau_ratio": 0.9572002305135972 + }, + "maximum_fusion_point": { + "alpha_heating_MW_uniform": 203.32686349383934, + "beta_at_fixed_B": 0.01213808117998298, + "cycle_phase_deg": 90.0, + "equivalent_radial_squeeze_fraction": 0.0050000000000000044, + "fusion_power_MW_uniform": 1022.4436564261636, + "ion_density_m3": 2.2457349024788765e+20, + "ion_temperature_keV": 15.100586591722205, + "neutron_power_MW_uniform": 819.1167929323241, + "optimistic_ignition_tau_ratio": 0.9572002305135972, + "thermal_energy_MJ": 169.01231103080028, + "volume_ratio_to_baseline": 0.990025 + }, + "pattern": "synchronous", + "phase_offsets_deg": [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + "screen_decision": { + "cycle_average_fusion_improves_over_baseline": true, + "cycle_average_proxy_pass": false, + "cycle_average_ratio_improves_over_baseline": false, + "entire_cycle_proxy_pass": false, + "joint_average_improvement": false, + "net_power_claim_permitted": false + } + }, + { + "closest_instantaneous_proxy_point": { + "alpha_heating_MW_uniform": 198.85778612248268, + "beta_at_fixed_B": 0.011936693389224132, + "cycle_phase_deg": 0.0, + "equivalent_radial_squeeze_fraction": -6.632631065262018e-06, + "fusion_power_MW_uniform": 999.9705816444844, + "ion_density_m3": 2.2233042040157808e+20, + "ion_temperature_keV": 14.999867348405163, + "neutron_power_MW_uniform": 801.1127955220015, + "optimistic_ignition_tau_ratio": 0.9610823708583905, + "thermal_energy_MJ": 167.88501759919154, + "volume_ratio_to_baseline": 1.0000132653061222 + }, + "cycle_average": { + "alpha_heating_MW_uniform": 198.85812363050323, + "beta_at_fixed_B": 0.011936708614419684, + "distance_from_ratio_one_fraction": -0.03891792463148569, + "fusion_power_MW_uniform": 999.9722788276733, + "optimistic_ignition_tau_ratio": 0.9610820753685143 + }, + "depth_fraction": 0.005, + "full_cycle": { + "maximum_beta_at_fixed_B": 0.01193672383963078, + "maximum_fusion_power_MW_uniform": 999.9739760127336, + "maximum_optimistic_ignition_tau_ratio": 0.9610823708583905, + "minimum_fusion_power_MW_uniform": 999.9705816444844, + "minimum_optimistic_ignition_tau_ratio": 0.9610817798784889 + }, + "maximum_fusion_point": { + "alpha_heating_MW_uniform": 198.85846113889588, + "beta_at_fixed_B": 0.01193672383963078, + "cycle_phase_deg": 90.0, + "equivalent_radial_squeeze_fraction": -5.867329726072512e-06, + "fusion_power_MW_uniform": 999.9739760127336, + "ion_density_m3": 2.223307606992486e+20, + "ion_temperature_keV": 14.999882654208738, + "neutron_power_MW_uniform": 801.1155148738376, + "optimistic_ignition_tau_ratio": 0.9610817798784889, + "thermal_energy_MJ": 167.88518890838006, + "volume_ratio_to_baseline": 1.0000117346938775 + }, + "pattern": "traveling_quadrature", + "phase_offsets_deg": [ + 0.0, + 90.0, + 180.0, + 270.0 + ], + "screen_decision": { + "cycle_average_fusion_improves_over_baseline": false, + "cycle_average_proxy_pass": false, + "cycle_average_ratio_improves_over_baseline": true, + "entire_cycle_proxy_pass": false, + "joint_average_improvement": false, + "net_power_claim_permitted": false + } + }, + { + "closest_instantaneous_proxy_point": { + "alpha_heating_MW_uniform": 198.2806140072973, + "beta_at_fixed_B": 0.011910653126293278, + "cycle_phase_deg": 90.0, + "equivalent_radial_squeeze_fraction": -0.0006620257589065037, + "fusion_power_MW_uniform": 997.068230436695, + "ion_density_m3": 2.2203928092079233e+20, + "ion_temperature_keV": 14.986769703793946, + "neutron_power_MW_uniform": 798.7876164293976, + "optimistic_ignition_tau_ratio": 0.9615882045583278, + "thermal_energy_MJ": 167.73842308305439, + "volume_ratio_to_baseline": 1.0013244897959184 + }, + "cycle_average": { + "alpha_heating_MW_uniform": 198.84206363445668, + "beta_at_fixed_B": 0.011935982531107501, + "distance_from_ratio_one_fraction": -0.03890363765347005, + "fusion_power_MW_uniform": 999.8915199904108, + "optimistic_ignition_tau_ratio": 0.96109636234653 + }, + "depth_fraction": 0.01, + "full_cycle": { + "maximum_beta_at_fixed_B": 0.011959362529743422, + "maximum_fusion_power_MW_uniform": 1002.4978646408078, + "maximum_optimistic_ignition_tau_ratio": 0.9615882045583278, + "minimum_fusion_power_MW_uniform": 997.068230436695, + "minimum_optimistic_ignition_tau_ratio": 0.9606427455970882 + }, + "maximum_fusion_point": { + "alpha_heating_MW_uniform": 199.36037080925155, + "beta_at_fixed_B": 0.011959362529743422, + "cycle_phase_deg": 270.0, + "equivalent_radial_squeeze_fraction": 0.0005624030465525287, + "fusion_power_MW_uniform": 1002.4978646408078, + "ion_density_m3": 2.2258366274015445e+20, + "ion_temperature_keV": 15.011255445813427, + "neutron_power_MW_uniform": 803.1374938315562, + "optimistic_ignition_tau_ratio": 0.9606427455970882, + "thermal_energy_MJ": 168.01247812196823, + "volume_ratio_to_baseline": 0.9988755102040816 + }, + "pattern": "abab_opposed", + "phase_offsets_deg": [ + 0.0, + 180.0, + 0.0, + 180.0 + ], + "screen_decision": { + "cycle_average_fusion_improves_over_baseline": false, + "cycle_average_proxy_pass": false, + "cycle_average_ratio_improves_over_baseline": true, + "entire_cycle_proxy_pass": false, + "joint_average_improvement": false, + "net_power_claim_permitted": false + } + }, + { + "closest_instantaneous_proxy_point": { + "alpha_heating_MW_uniform": 190.24965149005874, + "beta_at_fixed_B": 0.011547528983090041, + "cycle_phase_deg": 270.0, + "equivalent_radial_squeeze_fraction": -0.010000000000000009, + "fusion_power_MW_uniform": 956.6839617785811, + "ion_density_m3": 2.1795252395124494e+20, + "ion_temperature_keV": 14.802307685307014, + "neutron_power_MW_uniform": 766.4343102885223, + "optimistic_ignition_tau_ratio": 0.9687361115714498, + "thermal_energy_MJ": 165.67384421040495, + "volume_ratio_to_baseline": 1.0201 + }, + "cycle_average": { + "alpha_heating_MW_uniform": 198.96868172156906, + "beta_at_fixed_B": 0.0119412687749536, + "distance_from_ratio_one_fraction": -0.03895449908015958, + "fusion_power_MW_uniform": 1000.5282280856045, + "optimistic_ignition_tau_ratio": 0.9610455009198404 + }, + "depth_fraction": 0.01, + "full_cycle": { + "maximum_beta_at_fixed_B": 0.0123436327366851, + "maximum_fusion_power_MW_uniform": 1045.4290713655432, + "maximum_optimistic_ignition_tau_ratio": 0.9687361115714498, + "minimum_fusion_power_MW_uniform": 956.6839617785811, + "minimum_optimistic_ignition_tau_ratio": 0.9532913952889004 + }, + "maximum_fusion_point": { + "alpha_heating_MW_uniform": 207.89782669201142, + "beta_at_fixed_B": 0.0123436327366851, + "cycle_phase_deg": 90.0, + "equivalent_radial_squeeze_fraction": 0.010000000000000009, + "fusion_power_MW_uniform": 1045.4290713655432, + "ion_density_m3": 2.2684763767234462e+20, + "ion_temperature_keV": 15.2023595431513, + "neutron_power_MW_uniform": 837.5312446735317, + "optimistic_ignition_tau_ratio": 0.9532913952889004, + "thermal_energy_MJ": 170.151398020367, + "volume_ratio_to_baseline": 0.9801000000000001 + }, + "pattern": "synchronous", + "phase_offsets_deg": [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + "screen_decision": { + "cycle_average_fusion_improves_over_baseline": true, + "cycle_average_proxy_pass": false, + "cycle_average_ratio_improves_over_baseline": false, + "entire_cycle_proxy_pass": false, + "joint_average_improvement": false, + "net_power_claim_permitted": false + } + }, + { + "closest_instantaneous_proxy_point": { + "alpha_heating_MW_uniform": 198.84023674062428, + "beta_at_fixed_B": 0.011935901722273348, + "cycle_phase_deg": 0.0, + "equivalent_radial_squeeze_fraction": -2.6530260317514376e-05, + "fusion_power_MW_uniform": 999.8823333242822, + "ion_density_m3": 2.2232157302776965e+20, + "ion_temperature_keV": 14.999469411216442, + "neutron_power_MW_uniform": 801.0420965836578, + "optimistic_ignition_tau_ratio": 0.961097735916021, + "thermal_energy_MJ": 167.88056371367514, + "volume_ratio_to_baseline": 1.0000530612244898 + }, + "cycle_average": { + "alpha_heating_MW_uniform": 198.84158662460953, + "beta_at_fixed_B": 0.011935962616872796, + "distance_from_ratio_one_fraction": -0.038903445983980434, + "fusion_power_MW_uniform": 999.8891213123222, + "optimistic_ignition_tau_ratio": 0.9610965540160196 + }, + "depth_fraction": 0.01, + "full_cycle": { + "maximum_beta_at_fixed_B": 0.01193602351172078, + "maximum_fusion_power_MW_uniform": 999.8959093302975, + "maximum_optimistic_ignition_tau_ratio": 0.961097735916021, + "minimum_fusion_power_MW_uniform": 999.8823333242822, + "minimum_optimistic_ignition_tau_ratio": 0.9610953721136254 + }, + "maximum_fusion_point": { + "alpha_heating_MW_uniform": 198.8429365145478, + "beta_at_fixed_B": 0.01193602351172078, + "cycle_phase_deg": 90.0, + "equivalent_radial_squeeze_fraction": -2.3469112355511967e-05, + "fusion_power_MW_uniform": 999.8959093302975, + "ion_density_m3": 2.2232293411636973e+20, + "ion_temperature_keV": 14.999530630604538, + "neutron_power_MW_uniform": 801.0529728157496, + "optimistic_ignition_tau_ratio": 0.9610953721136254, + "thermal_energy_MJ": 167.8812489076045, + "volume_ratio_to_baseline": 1.0000469387755102 + }, + "pattern": "traveling_quadrature", + "phase_offsets_deg": [ + 0.0, + 90.0, + 180.0, + 270.0 + ], + "screen_decision": { + "cycle_average_fusion_improves_over_baseline": false, + "cycle_average_proxy_pass": false, + "cycle_average_ratio_improves_over_baseline": true, + "entire_cycle_proxy_pass": false, + "joint_average_improvement": false, + "net_power_claim_permitted": false + } + }, + { + "closest_instantaneous_proxy_point": { + "alpha_heating_MW_uniform": 197.61230027868618, + "beta_at_fixed_B": 0.011880491611248323, + "cycle_phase_deg": 90.0, + "equivalent_radial_squeeze_fraction": -0.0014234766530274445, + "fusion_power_MW_uniform": 993.7075671156791, + "ion_density_m3": 2.217017459330272e+20, + "ion_temperature_keV": 14.97157767227619, + "neutron_power_MW_uniform": 796.0952668369929, + "optimistic_ignition_tau_ratio": 0.9621752090095599, + "thermal_energy_MJ": 167.56838728077125, + "volume_ratio_to_baseline": 1.0028489795918367 + }, + "cycle_average": { + "alpha_heating_MW_uniform": 198.7773724926141, + "beta_at_fixed_B": 0.011933059361705016, + "distance_from_ratio_one_fraction": -0.038846308796023465, + "fusion_power_MW_uniform": 999.5662159628596, + "optimistic_ignition_tau_ratio": 0.9611536912039765 + }, + "depth_fraction": 0.02, + "full_cycle": { + "maximum_beta_at_fixed_B": 0.011977833246559887, + "maximum_fusion_power_MW_uniform": 1004.5575384649836, + "maximum_optimistic_ignition_tau_ratio": 0.9621752090095599, + "minimum_fusion_power_MW_uniform": 993.7075671156791, + "minimum_optimistic_ignition_tau_ratio": 0.9602850379050595 + }, + "maximum_fusion_point": { + "alpha_heating_MW_uniform": 199.76996503565013, + "beta_at_fixed_B": 0.011977833246559887, + "cycle_phase_deg": 270.0, + "equivalent_radial_squeeze_fraction": 0.001025015123920503, + "fusion_power_MW_uniform": 1004.5575384649836, + "ion_density_m3": 2.227898615622742e+20, + "ion_temperature_keV": 15.020524845736835, + "neutron_power_MW_uniform": 804.7875734293334, + "optimistic_ignition_tau_ratio": 0.9602850379050595, + "thermal_energy_MJ": 168.11622526406816, + "volume_ratio_to_baseline": 0.9979510204081633 + }, + "pattern": "abab_opposed", + "phase_offsets_deg": [ + 0.0, + 180.0, + 0.0, + 180.0 + ], + "screen_decision": { + "cycle_average_fusion_improves_over_baseline": false, + "cycle_average_proxy_pass": false, + "cycle_average_ratio_improves_over_baseline": true, + "entire_cycle_proxy_pass": false, + "joint_average_improvement": false, + "net_power_claim_permitted": false + } + }, + { + "closest_instantaneous_proxy_point": { + "alpha_heating_MW_uniform": 182.0351028524932, + "beta_at_fixed_B": 0.011174456288888551, + "cycle_phase_deg": 270.0, + "equivalent_radial_squeeze_fraction": -0.020000000000000018, + "fusion_power_MW_uniform": 915.3765172011086, + "ion_density_m3": 2.1369989396642156e+20, + "ion_temperature_keV": 14.60913032586712, + "neutron_power_MW_uniform": 733.3414143486153, + "optimistic_ignition_tau_ratio": 0.9762685691900495, + "thermal_energy_MJ": 163.5117194638298, + "volume_ratio_to_baseline": 1.0404 + }, + "cycle_average": { + "alpha_heating_MW_uniform": 199.2840340726929, + "beta_at_fixed_B": 0.011954214138561585, + "distance_from_ratio_one_fraction": -0.03904973279791235, + "fusion_power_MW_uniform": 1002.1139999083986, + "optimistic_ignition_tau_ratio": 0.9609502672020876 + }, + "depth_fraction": 0.02, + "full_cycle": { + "maximum_beta_at_fixed_B": 0.012768505108870752, + "maximum_fusion_power_MW_uniform": 1093.0814163117307, + "maximum_optimistic_ignition_tau_ratio": 0.9762685691900495, + "minimum_fusion_power_MW_uniform": 915.3765172011086, + "minimum_optimistic_ignition_tau_ratio": 0.9453780203029907 + }, + "maximum_fusion_point": { + "alpha_heating_MW_uniform": 217.37414528926462, + "beta_at_fixed_B": 0.012768505108870752, + "cycle_phase_deg": 90.0, + "equivalent_radial_squeeze_fraction": 0.020000000000000018, + "fusion_power_MW_uniform": 1093.0814163117307, + "ion_density_m3": 2.3150080141885152e+20, + "ion_temperature_keV": 15.40954533250341, + "neutron_power_MW_uniform": 875.707271022466, + "optimistic_ignition_tau_ratio": 0.9453780203029907, + "thermal_energy_MJ": 172.4703111869811, + "volume_ratio_to_baseline": 0.9603999999999999 + }, + "pattern": "synchronous", + "phase_offsets_deg": [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + "screen_decision": { + "cycle_average_fusion_improves_over_baseline": true, + "cycle_average_proxy_pass": false, + "cycle_average_ratio_improves_over_baseline": false, + "entire_cycle_proxy_pass": false, + "joint_average_improvement": false, + "net_power_claim_permitted": false + } + }, + { + "closest_instantaneous_proxy_point": { + "alpha_heating_MW_uniform": 198.77005933210992, + "beta_at_fixed_B": 0.01193273589439488, + "cycle_phase_deg": 0.0, + "equivalent_radial_squeeze_fraction": -0.00010611681859007405, + "fusion_power_MW_uniform": 999.5294412128957, + "ion_density_m3": 2.222861905728291e+20, + "ion_temperature_keV": 14.997877926348737, + "neutron_power_MW_uniform": 800.7593818807857, + "optimistic_ignition_tau_ratio": 0.961159188062178, + "thermal_energy_MJ": 167.862751125149, + "volume_ratio_to_baseline": 1.0002122448979591 + }, + "cycle_average": { + "alpha_heating_MW_uniform": 198.77545649930968, + "beta_at_fixed_B": 0.011932979373902697, + "distance_from_ratio_one_fraction": -0.03884553858593587, + "fusion_power_MW_uniform": 999.5565812536718, + "optimistic_ignition_tau_ratio": 0.9611544614140641 + }, + "depth_fraction": 0.02, + "full_cycle": { + "maximum_beta_at_fixed_B": 0.011933222857384927, + "maximum_fusion_power_MW_uniform": 999.583721773172, + "maximum_optimistic_ignition_tau_ratio": 0.961159188062178, + "minimum_fusion_power_MW_uniform": 999.5294412128957, + "minimum_optimistic_ignition_tau_ratio": 0.9611497347276876 + }, + "maximum_fusion_point": { + "alpha_heating_MW_uniform": 198.78085376171032, + "beta_at_fixed_B": 0.011933222857384927, + "cycle_phase_deg": 90.0, + "equivalent_radial_squeeze_fraction": -9.387314493669585e-05, + "fusion_power_MW_uniform": 999.583721773172, + "ion_density_m3": 2.2229163329437296e+20, + "ion_temperature_keV": 14.998122742697058, + "neutron_power_MW_uniform": 800.8028680114616, + "optimistic_ignition_tau_ratio": 0.9611497347276876, + "thermal_energy_MJ": 167.86549121584395, + "volume_ratio_to_baseline": 1.0001877551020408 + }, + "pattern": "traveling_quadrature", + "phase_offsets_deg": [ + 0.0, + 90.0, + 180.0, + 270.0 + ], + "screen_decision": { + "cycle_average_fusion_improves_over_baseline": false, + "cycle_average_proxy_pass": false, + "cycle_average_ratio_improves_over_baseline": true, + "entire_cycle_proxy_pass": false, + "joint_average_improvement": false, + "net_power_claim_permitted": false + } + }, + { + "closest_instantaneous_proxy_point": { + "alpha_heating_MW_uniform": 195.10766233320325, + "beta_at_fixed_B": 0.011767365872560125, + "cycle_phase_deg": 90.0, + "equivalent_radial_squeeze_fraction": -0.004301971012499628, + "fusion_power_MW_uniform": 981.1128163041078, + "ion_density_m3": 2.20432699973708e+20, + "ion_temperature_keV": 14.914390354137929, + "neutron_power_MW_uniform": 786.0051539709044, + "optimistic_ignition_tau_ratio": 0.9643876009869523, + "thermal_energy_MJ": 166.9283220262533, + "volume_ratio_to_baseline": 1.0086224489795919 + }, + "cycle_average": { + "alpha_heating_MW_uniform": 198.32566771657463, + "beta_at_fixed_B": 0.011912644433886253, + "distance_from_ratio_one_fraction": -0.03844547682435984, + "fusion_power_MW_uniform": 997.2947862319182, + "optimistic_ignition_tau_ratio": 0.9615545231756402 + }, + "depth_fraction": 0.05, + "full_cycle": { + "maximum_beta_at_fixed_B": 0.01200937529447452, + "maximum_fusion_power_MW_uniform": 1008.075737229055, + "maximum_optimistic_ignition_tau_ratio": 0.9643876009869523, + "minimum_fusion_power_MW_uniform": 981.1128163041078, + "minimum_optimistic_ignition_tau_ratio": 0.9596752170802083 + }, + "maximum_fusion_point": { + "alpha_heating_MW_uniform": 200.46960683532342, + "beta_at_fixed_B": 0.01200937529447452, + "cycle_phase_deg": 270.0, + "equivalent_radial_squeeze_fraction": 0.0018128677345072841, + "fusion_power_MW_uniform": 1008.075737229055, + "ion_density_m3": 2.2314168906652844e+20, + "ion_temperature_keV": 15.036334194213199, + "neutron_power_MW_uniform": 807.6061303937314, + "optimistic_ignition_tau_ratio": 0.9596752170802083, + "thermal_energy_MJ": 168.2931703453504, + "volume_ratio_to_baseline": 0.9963775510204083 + }, + "pattern": "abab_opposed", + "phase_offsets_deg": [ + 0.0, + 180.0, + 0.0, + 180.0 + ], + "screen_decision": { + "cycle_average_fusion_improves_over_baseline": false, + "cycle_average_proxy_pass": false, + "cycle_average_ratio_improves_over_baseline": true, + "entire_cycle_proxy_pass": false, + "joint_average_improvement": false, + "net_power_claim_permitted": false + } + }, + { + "closest_instantaneous_proxy_point": { + "alpha_heating_MW_uniform": 159.59635408183988, + "beta_at_fixed_B": 0.010145247428298136, + "cycle_phase_deg": 270.0, + "equivalent_radial_squeeze_fraction": -0.050000000000000044, + "fusion_power_MW_uniform": 802.5416662401091, + "ion_density_m3": 2.016629203470884e+20, + "ion_temperature_keV": 14.055259240088528, + "neutron_power_MW_uniform": 642.9453121582691, + "optimistic_ignition_tau_ratio": 0.998114153538391, + "thermal_energy_MJ": 157.3125541763108, + "volume_ratio_to_baseline": 1.1025 + }, + "cycle_average": { + "alpha_heating_MW_uniform": 201.50060710116102, + "beta_at_fixed_B": 0.012045292673010228, + "distance_from_ratio_one_fraction": -0.03971592737076013, + "fusion_power_MW_uniform": 1013.2601957086955, + "optimistic_ignition_tau_ratio": 0.9602840726292399 + }, + "depth_fraction": 0.05, + "full_cycle": { + "maximum_beta_at_fixed_B": 0.014162772833788346, + "maximum_fusion_power_MW_uniform": 1250.5749471630445, + "maximum_optimistic_ignition_tau_ratio": 0.998114153538391, + "minimum_fusion_power_MW_uniform": 802.5416662401091, + "minimum_optimistic_ignition_tau_ratio": 0.9208683693016062 + }, + "maximum_fusion_point": { + "alpha_heating_MW_uniform": 248.69388153810542, + "beta_at_fixed_B": 0.014162772833788346, + "cycle_phase_deg": 90.0, + "equivalent_radial_squeeze_fraction": 0.050000000000000044, + "fusion_power_MW_uniform": 1250.5749471630445, + "ion_density_m3": 2.4635276419131854e+20, + "ion_temperature_keV": 16.061759497754228, + "neutron_power_MW_uniform": 1001.881065624939, + "optimistic_ignition_tau_ratio": 0.9208683693016062, + "thermal_energy_MJ": 179.77017485032326, + "volume_ratio_to_baseline": 0.9025 + }, + "pattern": "synchronous", + "phase_offsets_deg": [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + "screen_decision": { + "cycle_average_fusion_improves_over_baseline": true, + "cycle_average_proxy_pass": false, + "cycle_average_ratio_improves_over_baseline": false, + "entire_cycle_proxy_pass": false, + "joint_average_improvement": false, + "net_power_claim_permitted": false + } + }, + { + "closest_instantaneous_proxy_point": { + "alpha_heating_MW_uniform": 198.27971738244796, + "beta_at_fixed_B": 0.011910612667564942, + "cycle_phase_deg": 0.0, + "equivalent_radial_squeeze_fraction": -0.0006630454914604567, + "fusion_power_MW_uniform": 997.0637216945954, + "ion_density_m3": 2.2203882837971232e+20, + "ion_temperature_keV": 14.986749340636509, + "neutron_power_MW_uniform": 798.7840043121473, + "optimistic_ignition_tau_ratio": 0.9615889911649608, + "thermal_energy_MJ": 167.73819516976917, + "volume_ratio_to_baseline": 1.0013265306122447 + }, + "cycle_average": { + "alpha_heating_MW_uniform": 198.31334627199277, + "beta_at_fixed_B": 0.011912130097707214, + "distance_from_ratio_one_fraction": -0.038440508781964255, + "fusion_power_MW_uniform": 997.2328269677351, + "optimistic_ignition_tau_ratio": 0.9615594912180357 + }, + "depth_fraction": 0.05, + "full_cycle": { + "maximum_beta_at_fixed_B": 0.011913647682503867, + "maximum_fusion_power_MW_uniform": 997.4019508705528, + "maximum_optimistic_ignition_tau_ratio": 0.9615889911649608, + "minimum_fusion_power_MW_uniform": 997.0637216945954, + "minimum_optimistic_ignition_tau_ratio": 0.9615299897790484 + }, + "maximum_fusion_point": { + "alpha_heating_MW_uniform": 198.34697886630312, + "beta_at_fixed_B": 0.011913647682503867, + "cycle_phase_deg": 90.0, + "equivalent_radial_squeeze_fraction": -0.0005865626659971035, + "fusion_power_MW_uniform": 997.4019508705528, + "ion_density_m3": 2.2207277408042772e+20, + "ion_temperature_keV": 14.988276769419024, + "neutron_power_MW_uniform": 799.0549720042496, + "optimistic_ignition_tau_ratio": 0.9615299897790484, + "thermal_energy_MJ": 167.75529081482242, + "volume_ratio_to_baseline": 1.0011734693877552 + }, + "pattern": "traveling_quadrature", + "phase_offsets_deg": [ + 0.0, + 90.0, + 180.0, + 270.0 + ], + "screen_decision": { + "cycle_average_fusion_improves_over_baseline": false, + "cycle_average_proxy_pass": false, + "cycle_average_ratio_improves_over_baseline": true, + "entire_cycle_proxy_pass": false, + "joint_average_improvement": false, + "net_power_claim_permitted": false + } + } + ], + "breathing_result": { + "any_cycle_average_proxy_pass": false, + "any_joint_cycle_average_improvement": false, + "closest_cycle_average_case": { + "closest_instantaneous_proxy_point": { + "alpha_heating_MW_uniform": 198.27971738244796, + "beta_at_fixed_B": 0.011910612667564942, + "cycle_phase_deg": 0.0, + "equivalent_radial_squeeze_fraction": -0.0006630454914604567, + "fusion_power_MW_uniform": 997.0637216945954, + "ion_density_m3": 2.2203882837971232e+20, + "ion_temperature_keV": 14.986749340636509, + "neutron_power_MW_uniform": 798.7840043121473, + "optimistic_ignition_tau_ratio": 0.9615889911649608, + "thermal_energy_MJ": 167.73819516976917, + "volume_ratio_to_baseline": 1.0013265306122447 + }, + "cycle_average": { + "alpha_heating_MW_uniform": 198.31334627199277, + "beta_at_fixed_B": 0.011912130097707214, + "distance_from_ratio_one_fraction": -0.038440508781964255, + "fusion_power_MW_uniform": 997.2328269677351, + "optimistic_ignition_tau_ratio": 0.9615594912180357 + }, + "depth_fraction": 0.05, + "full_cycle": { + "maximum_beta_at_fixed_B": 0.011913647682503867, + "maximum_fusion_power_MW_uniform": 997.4019508705528, + "maximum_optimistic_ignition_tau_ratio": 0.9615889911649608, + "minimum_fusion_power_MW_uniform": 997.0637216945954, + "minimum_optimistic_ignition_tau_ratio": 0.9615299897790484 + }, + "maximum_fusion_point": { + "alpha_heating_MW_uniform": 198.34697886630312, + "beta_at_fixed_B": 0.011913647682503867, + "cycle_phase_deg": 90.0, + "equivalent_radial_squeeze_fraction": -0.0005865626659971035, + "fusion_power_MW_uniform": 997.4019508705528, + "ion_density_m3": 2.2207277408042772e+20, + "ion_temperature_keV": 14.988276769419024, + "neutron_power_MW_uniform": 799.0549720042496, + "optimistic_ignition_tau_ratio": 0.9615299897790484, + "thermal_energy_MJ": 167.75529081482242, + "volume_ratio_to_baseline": 1.0011734693877552 + }, + "pattern": "traveling_quadrature", + "phase_offsets_deg": [ + 0.0, + 90.0, + 180.0, + 270.0 + ], + "screen_decision": { + "cycle_average_fusion_improves_over_baseline": false, + "cycle_average_proxy_pass": false, + "cycle_average_ratio_improves_over_baseline": true, + "entire_cycle_proxy_pass": false, + "joint_average_improvement": false, + "net_power_claim_permitted": false + } + }, + "closest_instantaneous_case": { + "closest_instantaneous_proxy_point": { + "alpha_heating_MW_uniform": 159.59635408183988, + "beta_at_fixed_B": 0.010145247428298136, + "cycle_phase_deg": 270.0, + "equivalent_radial_squeeze_fraction": -0.050000000000000044, + "fusion_power_MW_uniform": 802.5416662401091, + "ion_density_m3": 2.016629203470884e+20, + "ion_temperature_keV": 14.055259240088528, + "neutron_power_MW_uniform": 642.9453121582691, + "optimistic_ignition_tau_ratio": 0.998114153538391, + "thermal_energy_MJ": 157.3125541763108, + "volume_ratio_to_baseline": 1.1025 + }, + "cycle_average": { + "alpha_heating_MW_uniform": 201.50060710116102, + "beta_at_fixed_B": 0.012045292673010228, + "distance_from_ratio_one_fraction": -0.03971592737076013, + "fusion_power_MW_uniform": 1013.2601957086955, + "optimistic_ignition_tau_ratio": 0.9602840726292399 + }, + "depth_fraction": 0.05, + "full_cycle": { + "maximum_beta_at_fixed_B": 0.014162772833788346, + "maximum_fusion_power_MW_uniform": 1250.5749471630445, + "maximum_optimistic_ignition_tau_ratio": 0.998114153538391, + "minimum_fusion_power_MW_uniform": 802.5416662401091, + "minimum_optimistic_ignition_tau_ratio": 0.9208683693016062 + }, + "maximum_fusion_point": { + "alpha_heating_MW_uniform": 248.69388153810542, + "beta_at_fixed_B": 0.014162772833788346, + "cycle_phase_deg": 90.0, + "equivalent_radial_squeeze_fraction": 0.050000000000000044, + "fusion_power_MW_uniform": 1250.5749471630445, + "ion_density_m3": 2.4635276419131854e+20, + "ion_temperature_keV": 16.061759497754228, + "neutron_power_MW_uniform": 1001.881065624939, + "optimistic_ignition_tau_ratio": 0.9208683693016062, + "thermal_energy_MJ": 179.77017485032326, + "volume_ratio_to_baseline": 0.9025 + }, + "pattern": "synchronous", + "phase_offsets_deg": [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + "screen_decision": { + "cycle_average_fusion_improves_over_baseline": true, + "cycle_average_proxy_pass": false, + "cycle_average_ratio_improves_over_baseline": false, + "entire_cycle_proxy_pass": false, + "joint_average_improvement": false, + "net_power_claim_permitted": false + } + }, + "verdict": "NO_DECLARED_BREATHING_CASE_IMPROVES_BOTH_CYCLE_AVERAGE_PROXY_AND_FUSION_POWER" + }, + "claim_boundary": "This phase-programmed actuation overlay is a low-authority analytical falsification screen. It does not demonstrate a realizable time-dependent magnetic field, nested flux surfaces, MHD stability, magnetic-pumping absorption, alpha confinement, ignition, sustained burn, net energy, buildable coils, or hardware.", + "concept_image_result": { + "global_three_toroidal_lobes_compatible_with_4fp_baseline": false, + "repeated_poloidal_m3_bookkeeping_compatible_with_4fp": true, + "three_point_collision_is_dt_fusion_mechanism": false, + "tri_lobe_cases": [ + { + "amplitude_fraction": 0.0, + "area_normalization": 1.0, + "maximum_radius_over_a": 1.0, + "minimum_radius_over_a": 1.0, + "normalized_area_ratio": 1.0, + "thermodynamic_ignition_credit": 0.0 + }, + { + "amplitude_fraction": 0.02, + "area_normalization": 0.9999000149975006, + "maximum_radius_over_a": 1.0198980152974506, + "minimum_radius_over_a": 0.9799020146975506, + "normalized_area_ratio": 1.0000000000000002, + "thermodynamic_ignition_credit": 0.0 + }, + { + "amplitude_fraction": 0.05, + "area_normalization": 0.9993755853278152, + "maximum_radius_over_a": 1.049344364594206, + "minimum_radius_over_a": 0.9494068060614245, + "normalized_area_ratio": 1.0, + "thermodynamic_ignition_credit": 0.0 + }, + { + "amplitude_fraction": 0.1, + "area_normalization": 0.9975093361076329, + "maximum_radius_over_a": 1.0972602697183964, + "minimum_radius_over_a": 0.8977584024968697, + "normalized_area_ratio": 0.9999999999999999, + "thermodynamic_ignition_credit": 0.0 + } + ], + "useful_translation": "area-preserving poloidal m=3 actuator harmonic repeated in every one of the four ABAB field periods", + "verdict": "IMAGE_SUGGESTS_A_TESTABLE_ACTUATOR_SYMMETRY_BUT_ADDS_NO_EARNED_FUSION_GAIN", + "zero_D_closer_to_ignition_credit": 0.0 + }, + "model_rules": { + "actuator_and_cryogenic_power_debited": false, + "astrophysical_gravity_or_accretion_credit": 0.0, + "baseline_geometry_changed": false, + "confinement": "instantaneous ISS04 geometry proxy; not valid as dynamic MHD evidence", + "magnetic_pumping_heating_credit": 0.0, + "primary_hts_pulsing_credit": 0.0, + "rf_phase_heating_credit": 0.0, + "shock_heating_credit": 0.0, + "thermodynamics": "fixed particle inventory; ideal monatomic adiabatic global-volume response", + "three_body_fusion_credit": 0.0, + "vacuum_vessel_flex_credit": 0.0 + }, + "program": "IX-StellaratorForge", + "promotion_status": { + "SFR2A_G0_OVERLAY_SPEC": "PASS_SPEC_ONLY", + "SFR2A_G1_TIME_DEPENDENT_EQUILIBRIUM": "NOT_RUN", + "SFR2A_G2_COILS_AND_ELECTROMAGNETICS": "NOT_RUN", + "SFR2A_G3_MAGNETIC_PUMPING_KINETICS": "NOT_RUN", + "SFR2A_G4_PARTICLE_AND_ALPHA_ORBITS": "NOT_RUN", + "SFR2A_G5_TRANSPORT_AND_MHD": "NOT_RUN", + "SFR2A_G6_EDGE_AND_WALL_LOADS": "NOT_RUN", + "SFR2A_G7_INTEGRATED_POWER_BALANCE": "NOT_RUN", + "SFR2A_G8_HARDWARE": "NOT_RUN" + }, + "release": "0.6.0", + "required_next_evidence": [ + "time-sliced free-boundary finite-beta equilibria over a complete actuation cycle", + "Poincare and island/stochasticity maps for every phase", + "coil-current solution plus eddy-current, force, fatigue, cooling and quench analysis", + "kinetic magnetic-pumping calculation resolving frequency, collisionality and phase lag", + "alpha-particle orbit confinement through the complete cycle", + "transport and nonlinear MHD response", + "actuator wall-plug power debit and integrated burn balance" + ], + "study_id": "SFR-2-Actuation-Overlay-A" +} diff --git a/results/sfr3_dual_boundary/SFR3_DUAL_BOUNDARY_AHIS_A_RESULT.md b/results/sfr3_dual_boundary/SFR3_DUAL_BOUNDARY_AHIS_A_RESULT.md new file mode 100644 index 0000000..b83b499 --- /dev/null +++ b/results/sfr3_dual_boundary/SFR3_DUAL_BOUNDARY_AHIS_A_RESULT.md @@ -0,0 +1,34 @@ +# SFR-3 Dual Boundary AHIS A, v0.8.0 result + +## Verdict + +`DUAL_BOUNDARY_ARCHITECTURE_SCREEN_PASS__PHYSICAL_SURVIVABILITY_AND_CONFINEMENT_UNPROVEN` + +The requested inside/outside AHIS concept is retained as two monitored engineering boundaries. It does not mechanically push plasma inward and earns zero confinement, fusion, ignition or safety-qualification credit. + +## Selected reduced-screen stack + +`Segmented tungsten plus graded W-RAFM plus helium-cooled RAFM and DCLL blanket` + +The 1-D nominal screen predicts a plasma-facing surface temperature of **420.7 C** at 0.25 MW/m2. +The deliberately steady upset upper bound predicts **632.9 C** at 1.0 MW/m2. This is not a disruption or lifetime result. +The raw CTE-mismatch strain proxy is **0.2121%**; real interface stress requires nonlinear FEA and irradiation data. + +## Monitoring configuration + +- 24 toroidal sectors aligned to the 24 SFR-3 trim channels. +- 192 paired inner/outer poloidal monitoring locations. +- Two independent sensing lanes. +- 1736 total declared sensing elements, including independent hard-vacuum channels. + +## Fault findings + +- A hotspot and coolant leak remain detectable after the declared single-channel failures. +- Loss of one inner or outer lane enters degraded monitoring, not a false nominal state. +- Loss of both sector buses, vacuum breach or total control power enters safe hold. +- Outer support movement can request the existing SFR-3 synthetic trim response of **65.46%**, but physical confinement credit remains zero. +- A silent armor crack below sensor sensitivity is deliberately not claimed as detected; periodic NDE remains mandatory. + +## Decision + +The dual-boundary arrangement helps safety observability, leak isolation, wall protection and magnetic alignment management. It does not change the repository's earned ignition proxy. Promote only after coupled thermal/CFD/FEA, fracture and irradiation lifetime, sensor qualification, 3-D magnetics, full neutronics and an instrumented sector prototype. diff --git a/results/sfr3_dual_boundary/sfr3_dual_boundary_ahis_a_v080.json b/results/sfr3_dual_boundary/sfr3_dual_boundary_ahis_a_v080.json new file mode 100644 index 0000000..49667b9 --- /dev/null +++ b/results/sfr3_dual_boundary/sfr3_dual_boundary_ahis_a_v080.json @@ -0,0 +1,696 @@ +{ + "architecture": { + "allowed_responses": [ + "active magnetic trim when SFR-3 resource gates pass", + "controlled power rundown", + "isolate affected coolant sector", + "passive or hard safe hold", + "inspection and remote replacement" + ], + "inner_boundary_function": "monitor armor first-wall temperature and strain coolant state and local magnetic disturbance", + "mechanically_pushes_plasma_inward": false, + "name": "Dual Boundary Integrity Network A", + "outer_boundary_function": "monitor vacuum-vessel interspace shielding supports magnet alignment vibration and leak state", + "prohibited_response": "mechanical pressure against the plasma", + "vacuum_vessel_is_double_walled": true + }, + "authority": "LOW__1D_thermal_resistance_plus_deterministic_fault_logic__not_safety_or_confinement", + "baseline_overlay_id": "SFR3-FIELD-INTEGRITY-SHELL-A", + "claim_boundary": { + "fusion_power_gain_credit": 0.0, + "ignition_gain_credit": 0.0, + "magnetic_confinement_gain_credit": 0.0, + "mechanical_plasma_confinement_credit": 0.0, + "safety_qualification_credit": 0.0, + "statement": "The dual boundary protects vacuum coolant radioactive inventory and magnetic alignment. It does not push plasma inward or prove wall lifetime." + }, + "fault_scenarios": [ + { + "all_declared_signals_detected": true, + "control_state": "NOMINAL", + "description": "All boundaries and channels healthy.", + "detections": {}, + "event_signals": [], + "expected_control_state": "NOMINAL", + "expected_state_pass": true, + "failed_channels": [], + "fusion_or_ignition_credit": 0.0, + "id": "nominal", + "latent_fault_retained_without_false_detection": false, + "mechanical_inward_plasma_force_credit": 0.0, + "sfr3_field_integrity_link": { + "available": false, + "physical_confinement_credit": 0.0, + "requested": false, + "synthetic_rms_reduction_fraction": 0.0 + } + }, + { + "all_declared_signals_detected": true, + "control_state": "CONTROLLED_POWER_RUNDOWN_AND_INSPECT", + "description": "Local first-wall hotspot with lane A temperature channel failed.", + "detections": { + "inner_temperature": { + "detected": true, + "surviving_channels": [ + "inner_temperature:B" + ] + } + }, + "event_signals": [ + "inner_temperature" + ], + "expected_control_state": "CONTROLLED_POWER_RUNDOWN_AND_INSPECT", + "expected_state_pass": true, + "failed_channels": [ + "inner_temperature:A" + ], + "fusion_or_ignition_credit": 0.0, + "id": "inner_hotspot_single_lane_failure", + "latent_fault_retained_without_false_detection": false, + "mechanical_inward_plasma_force_credit": 0.0, + "sfr3_field_integrity_link": { + "available": false, + "physical_confinement_credit": 0.0, + "requested": false, + "synthetic_rms_reduction_fraction": 0.0 + } + }, + { + "all_declared_signals_detected": true, + "control_state": "ISOLATE_AFFECTED_SECTOR_AND_SAFE_HOLD", + "description": "First-wall coolant leak with one interspace leak channel failed.", + "detections": { + "coolant_leak": { + "detected": true, + "surviving_channels": [ + "coolant_state:A", + "coolant_state:B", + "interspace_leak:B" + ] + }, + "interspace_pressure": { + "detected": true, + "surviving_channels": [ + "interspace_leak:B" + ] + } + }, + "event_signals": [ + "coolant_leak", + "interspace_pressure" + ], + "expected_control_state": "ISOLATE_AFFECTED_SECTOR_AND_SAFE_HOLD", + "expected_state_pass": true, + "failed_channels": [ + "interspace_leak:A" + ], + "fusion_or_ignition_credit": 0.0, + "id": "coolant_leak_single_lane_failure", + "latent_fault_retained_without_false_detection": false, + "mechanical_inward_plasma_force_credit": 0.0, + "sfr3_field_integrity_link": { + "available": false, + "physical_confinement_credit": 0.0, + "requested": false, + "synthetic_rms_reduction_fraction": 0.0 + } + }, + { + "all_declared_signals_detected": true, + "control_state": "ACTIVE_TRIM_THEN_CONTROLLED_INSPECTION", + "description": "Outer support movement is correlated with a measured magnetic error.", + "detections": { + "flux_error": { + "detected": true, + "surviving_channels": [ + "flux_loop:A", + "flux_loop:B" + ] + }, + "outer_displacement": { + "detected": true, + "surviving_channels": [ + "outer_displacement:A", + "outer_displacement:B" + ] + } + }, + "event_signals": [ + "outer_displacement", + "flux_error" + ], + "expected_control_state": "ACTIVE_TRIM_THEN_CONTROLLED_INSPECTION", + "expected_state_pass": true, + "failed_channels": [], + "fusion_or_ignition_credit": 0.0, + "id": "outer_support_shift", + "latent_fault_retained_without_false_detection": false, + "mechanical_inward_plasma_force_credit": 0.0, + "sfr3_field_integrity_link": { + "available": true, + "physical_confinement_credit": 0.0, + "requested": true, + "synthetic_rms_reduction_fraction": 0.6546225715726142 + } + }, + { + "all_declared_signals_detected": true, + "control_state": "DEGRADED_MONITORING_SINGLE_LANE_RETAINED", + "description": "The complete inner lane A is lost without a physical event.", + "detections": {}, + "event_signals": [], + "expected_control_state": "DEGRADED_MONITORING_SINGLE_LANE_RETAINED", + "expected_state_pass": true, + "failed_channels": [ + "inner_temperature:A", + "inner_strain:A", + "coolant_state:A", + "flux_loop:A" + ], + "fusion_or_ignition_credit": 0.0, + "id": "inner_lane_a_loss", + "latent_fault_retained_without_false_detection": false, + "mechanical_inward_plasma_force_credit": 0.0, + "sfr3_field_integrity_link": { + "available": false, + "physical_confinement_credit": 0.0, + "requested": false, + "synthetic_rms_reduction_fraction": 0.0 + } + }, + { + "all_declared_signals_detected": true, + "control_state": "DEGRADED_MONITORING_SINGLE_LANE_RETAINED", + "description": "The complete outer lane A is lost without a physical event.", + "detections": {}, + "event_signals": [], + "expected_control_state": "DEGRADED_MONITORING_SINGLE_LANE_RETAINED", + "expected_state_pass": true, + "failed_channels": [ + "outer_displacement:A", + "outer_vibration:A", + "interspace_leak:A" + ], + "fusion_or_ignition_credit": 0.0, + "id": "outer_lane_a_loss", + "latent_fault_retained_without_false_detection": false, + "mechanical_inward_plasma_force_credit": 0.0, + "sfr3_field_integrity_link": { + "available": false, + "physical_confinement_credit": 0.0, + "requested": false, + "synthetic_rms_reduction_fraction": 0.0 + } + }, + { + "all_declared_signals_detected": true, + "control_state": "SAFE_HOLD_LOST_OBSERVABILITY", + "description": "Both sensing lanes are lost in one control sector.", + "detections": {}, + "event_signals": [], + "expected_control_state": "SAFE_HOLD_LOST_OBSERVABILITY", + "expected_state_pass": true, + "failed_channels": [], + "fusion_or_ignition_credit": 0.0, + "id": "sector_dual_bus_loss", + "latent_fault_retained_without_false_detection": false, + "mechanical_inward_plasma_force_credit": 0.0, + "sfr3_field_integrity_link": { + "available": false, + "physical_confinement_credit": 0.0, + "requested": false, + "synthetic_rms_reduction_fraction": 0.0 + } + }, + { + "all_declared_signals_detected": true, + "control_state": "ISOLATE_AFFECTED_SECTOR_AND_SAFE_HOLD", + "description": "Vacuum loss is detected by independent hard channels and the interspace network.", + "detections": { + "interspace_pressure": { + "detected": true, + "surviving_channels": [ + "interspace_leak:A", + "interspace_leak:B" + ] + }, + "vacuum_loss": { + "detected": true, + "surviving_channels": [ + "hard_vacuum:A", + "hard_vacuum:B" + ] + } + }, + "event_signals": [ + "vacuum_loss", + "interspace_pressure" + ], + "expected_control_state": "ISOLATE_AFFECTED_SECTOR_AND_SAFE_HOLD", + "expected_state_pass": true, + "failed_channels": [], + "fusion_or_ignition_credit": 0.0, + "id": "vacuum_breach", + "latent_fault_retained_without_false_detection": false, + "mechanical_inward_plasma_force_credit": 0.0, + "sfr3_field_integrity_link": { + "available": false, + "physical_confinement_credit": 0.0, + "requested": false, + "synthetic_rms_reduction_fraction": 0.0 + } + }, + { + "all_declared_signals_detected": true, + "control_state": "PASSIVE_HARD_SAFE_HOLD", + "description": "Control power is lost; independent hard protection commands passive safe hold.", + "detections": {}, + "event_signals": [], + "expected_control_state": "PASSIVE_HARD_SAFE_HOLD", + "expected_state_pass": true, + "failed_channels": [], + "fusion_or_ignition_credit": 0.0, + "id": "total_control_power_loss", + "latent_fault_retained_without_false_detection": false, + "mechanical_inward_plasma_force_credit": 0.0, + "sfr3_field_integrity_link": { + "available": false, + "physical_confinement_credit": 0.0, + "requested": false, + "synthetic_rms_reduction_fraction": 0.0 + } + }, + { + "all_declared_signals_detected": true, + "control_state": "NO_AUTOMATIC_DETECTION__PERIODIC_NDE_REQUIRED", + "description": "An armor crack below online sensor sensitivity is deliberately retained as an undetected fault requiring periodic NDE.", + "detections": {}, + "event_signals": [], + "expected_control_state": "NO_AUTOMATIC_DETECTION__PERIODIC_NDE_REQUIRED", + "expected_state_pass": true, + "failed_channels": [], + "fusion_or_ignition_credit": 0.0, + "id": "silent_armor_crack", + "latent_fault_retained_without_false_detection": true, + "mechanical_inward_plasma_force_credit": 0.0, + "sfr3_field_integrity_link": { + "available": false, + "physical_confinement_credit": 0.0, + "requested": false, + "synthetic_rms_reduction_fraction": 0.0 + } + }, + { + "all_declared_signals_detected": true, + "control_state": "SAFE_HOLD_ALIGNMENT_ERROR_UNCORRECTED", + "description": "A support shift is detected while active trim is unavailable.", + "detections": { + "flux_error": { + "detected": true, + "surviving_channels": [ + "flux_loop:A", + "flux_loop:B" + ] + }, + "outer_displacement": { + "detected": true, + "surviving_channels": [ + "outer_displacement:A", + "outer_displacement:B" + ] + } + }, + "event_signals": [ + "outer_displacement", + "flux_error" + ], + "expected_control_state": "SAFE_HOLD_ALIGNMENT_ERROR_UNCORRECTED", + "expected_state_pass": true, + "failed_channels": [], + "fusion_or_ignition_credit": 0.0, + "id": "support_shift_trim_unavailable", + "latent_fault_retained_without_false_detection": false, + "mechanical_inward_plasma_force_credit": 0.0, + "sfr3_field_integrity_link": { + "available": false, + "physical_confinement_credit": 0.0, + "requested": true, + "synthetic_rms_reduction_fraction": 0.0 + } + } + ], + "monitoring_inventory": { + "independent_hard_vacuum_channels": 8, + "localized_sensing_elements": 1536, + "paired_inner_outer_monitoring_locations": 192, + "sector_sensing_elements": 192, + "total_declared_sensing_elements": 1736 + }, + "next_required_evidence": [ + "Coupled 3-D heat transfer CFD electromagnetic load and nonlinear structural FEA for every wall interface and port.", + "Fracture creep fatigue erosion and irradiation lifetime with material batch and joining-process data.", + "Radiation and temperature qualification of each sensor feedthrough cable and calibration chain.", + "CAD-linked magnetic analysis proving that vessel blanket sensors and shield materials do not create unacceptable field error.", + "Full 3-D OpenMC neutronics including TBR nuclear heating damage gas production sensor dose and streaming.", + "Helium PbLi tritium leak fire chemical and decay-heat safety analysis with independent protection credit.", + "Instrumented subscale double-wall coupon followed by sector prototype fault injection and high-heat-flux testing." + ], + "program": "IX-StellaratorForge", + "promotion_status": { + "SFR3D_G0_DUAL_BOUNDARY_SPEC": "PASS_SPEC_ONLY", + "SFR3D_G1_REDUCED_THERMAL_AND_FAULT_SCREEN": "PASS_LOW_AUTHORITY_SYNTHETIC_ONLY", + "SFR3D_G2_COUPLED_THERMAL_CFD_AND_STRESS_FEA": "NOT_RUN", + "SFR3D_G3_FRACTURE_EROSION_AND_LIFETIME": "NOT_RUN", + "SFR3D_G4_SENSOR_RADIATION_AND_CALIBRATION": "NOT_RUN", + "SFR3D_G5_3D_MAGNETIC_COUPLING": "NOT_RUN", + "SFR3D_G6_3D_NEUTRONICS_TBR_AND_HEATING": "NOT_RUN", + "SFR3D_G7_INTEGRATED_TRITIUM_AND_COOLANT_SAFETY": "NOT_RUN", + "SFR3D_G8_REMOTE_MAINTENANCE_AND_AVAILABILITY": "NOT_RUN", + "SFR3D_G9_HARDWARE": "NOT_RUN" + }, + "release": "0.8.0", + "requirement_results": { + "all_expected_fault_states_reproduce": true, + "declared_single_lane_faults_retain_detection": true, + "selected_stack_is_top_ranked_in_declared_reduced_screen": true, + "sfr3_trim_link_remains_synthetic_only": true, + "silent_armor_crack_is_not_falsely_detected": true + }, + "screen_pass": true, + "selected_stack_id": "DB-A_DCLL_MONITORED_RAFT", + "selected_stack_screen_pass": true, + "study_id": "SFR3-DUAL-BOUNDARY-AHIS-A", + "top_level_verdict": "DUAL_BOUNDARY_ARCHITECTURE_SCREEN_PASS__PHYSICAL_SURVIVABILITY_AND_CONFINEMENT_UNPROVEN", + "wall_stack_results": [ + { + "declared_weighted_architecture_score": 9.0, + "direct_plasma_confinement_credit": 0.0, + "id": "DB-A_DCLL_MONITORED_RAFT", + "integration_gates": { + "avoids_water_pbli_interaction": true, + "breeding_blanket_compatible": true, + "full_fusion_neutron_qualification": false, + "joining_process_mature": false, + "low_activation_structure": true, + "preserves_magnetic_clearance": true, + "structural_code_path": true + }, + "name": "Segmented tungsten plus graded W-RAFM plus helium-cooled RAFM and DCLL blanket", + "nominal": { + "all_layer_temperature_screens_pass": true, + "coolant_bulk_temperature_C": 350.0, + "coolant_film_temperature_rise_K": 10.0, + "heat_flux_MW_m2": 0.25, + "layers_plasma_to_coolant": [ + { + "cold_face_temperature_C": 406.8253968253968, + "declared_max_service_temperature_C": 1600.0, + "hot_face_temperature_C": 420.7142857142857, + "layer_id": "segmented_tungsten_armor", + "material": "segmented tungsten; long-fiber Wf-W retained as replaceable qualification coupon", + "temperature_rise_K": 13.88888888888889, + "temperature_screen_pass": true, + "thermal_resistance_m2K_W": 5.555555555555556e-05 + }, + { + "cold_face_temperature_C": 395.7142857142857, + "declared_max_service_temperature_C": 800.0, + "hot_face_temperature_C": 406.8253968253968, + "layer_id": "graded_w_rafm_transition", + "material": "functionally graded tungsten-to-RAFM transition candidate", + "temperature_rise_K": 11.111111111111112, + "temperature_screen_pass": true, + "thermal_resistance_m2K_W": 4.4444444444444447e-05 + }, + { + "cold_face_temperature_C": 360.0, + "declared_max_service_temperature_C": 550.0, + "hot_face_temperature_C": 395.7142857142857, + "layer_id": "helium_cooled_rafm_first_wall", + "material": "ODS-Eurofer or qualified RAFM first-wall structure", + "temperature_rise_K": 35.714285714285715, + "temperature_screen_pass": true, + "thermal_resistance_m2K_W": 0.00014285714285714287 + } + ], + "plasma_facing_surface_temperature_C": 420.7142857142857, + "raw_cte_mismatch_strain_proxy": 0.000530357142857143, + "raw_cte_mismatch_strain_screen_pass": true, + "solid_thermal_resistance_m2K_W": 0.00024285714285714286, + "total_thermal_resistance_m2K_W": 0.00028285714285714286 + }, + "physical_qualification_complete": false, + "status": "SELECTED_BALANCED_REFERENCE__NOT_QUALIFIED", + "upset_steady_upper_bound": { + "all_layer_temperature_screens_pass": true, + "coolant_bulk_temperature_C": 350.0, + "coolant_film_temperature_rise_K": 40.0, + "heat_flux_MW_m2": 1.0, + "layers_plasma_to_coolant": [ + { + "cold_face_temperature_C": 577.3015873015873, + "declared_max_service_temperature_C": 1600.0, + "hot_face_temperature_C": 632.8571428571429, + "layer_id": "segmented_tungsten_armor", + "material": "segmented tungsten; long-fiber Wf-W retained as replaceable qualification coupon", + "temperature_rise_K": 55.55555555555556, + "temperature_screen_pass": true, + "thermal_resistance_m2K_W": 5.555555555555556e-05 + }, + { + "cold_face_temperature_C": 532.8571428571429, + "declared_max_service_temperature_C": 800.0, + "hot_face_temperature_C": 577.3015873015873, + "layer_id": "graded_w_rafm_transition", + "material": "functionally graded tungsten-to-RAFM transition candidate", + "temperature_rise_K": 44.44444444444445, + "temperature_screen_pass": true, + "thermal_resistance_m2K_W": 4.4444444444444447e-05 + }, + { + "cold_face_temperature_C": 390.0, + "declared_max_service_temperature_C": 550.0, + "hot_face_temperature_C": 532.8571428571429, + "layer_id": "helium_cooled_rafm_first_wall", + "material": "ODS-Eurofer or qualified RAFM first-wall structure", + "temperature_rise_K": 142.85714285714286, + "temperature_screen_pass": true, + "thermal_resistance_m2K_W": 0.00014285714285714287 + } + ], + "plasma_facing_surface_temperature_C": 632.8571428571429, + "raw_cte_mismatch_strain_proxy": 0.002121428571428572, + "raw_cte_mismatch_strain_screen_pass": true, + "solid_thermal_resistance_m2K_W": 0.00024285714285714286, + "total_thermal_resistance_m2K_W": 0.00028285714285714286 + } + }, + { + "declared_weighted_architecture_score": 7.0, + "direct_plasma_confinement_credit": 0.0, + "id": "DB-B_WCU_WATER", + "integration_gates": { + "avoids_water_pbli_interaction": false, + "breeding_blanket_compatible": true, + "full_fusion_neutron_qualification": false, + "joining_process_mature": true, + "low_activation_structure": false, + "preserves_magnetic_clearance": true, + "structural_code_path": true + }, + "name": "Tungsten plus W-Cu graded joint plus water-cooled CuCrZr heat sink", + "nominal": { + "all_layer_temperature_screens_pass": true, + "coolant_bulk_temperature_C": 150.0, + "coolant_film_temperature_rise_K": 5.0, + "heat_flux_MW_m2": 0.25, + "layers_plasma_to_coolant": [ + { + "cold_face_temperature_C": 168.33333333333334, + "declared_max_service_temperature_C": 1600.0, + "hot_face_temperature_C": 182.22222222222223, + "layer_id": "segmented_tungsten_armor", + "material": "segmented tungsten", + "temperature_rise_K": 13.88888888888889, + "temperature_screen_pass": true, + "thermal_resistance_m2K_W": 5.555555555555556e-05 + }, + { + "cold_face_temperature_C": 165.0, + "declared_max_service_temperature_C": 800.0, + "hot_face_temperature_C": 168.33333333333334, + "layer_id": "w_cu_fgm", + "material": "W-Cu functionally graded transition", + "temperature_rise_K": 3.3333333333333335, + "temperature_screen_pass": true, + "thermal_resistance_m2K_W": 1.3333333333333333e-05 + }, + { + "cold_face_temperature_C": 155.0, + "declared_max_service_temperature_C": 350.0, + "hot_face_temperature_C": 165.0, + "layer_id": "cucrzr_heat_sink", + "material": "CuCrZr heat sink", + "temperature_rise_K": 10.0, + "temperature_screen_pass": true, + "thermal_resistance_m2K_W": 4e-05 + } + ], + "plasma_facing_surface_temperature_C": 182.22222222222223, + "raw_cte_mismatch_strain_proxy": 0.00040277777777777783, + "raw_cte_mismatch_strain_screen_pass": true, + "solid_thermal_resistance_m2K_W": 0.00010888888888888889, + "total_thermal_resistance_m2K_W": 0.0001288888888888889 + }, + "physical_qualification_complete": false, + "status": "THERMALLY_FAVORABLE__DEFERRED_INTEGRATED_REACTOR_BRANCH", + "upset_steady_upper_bound": { + "all_layer_temperature_screens_pass": true, + "coolant_bulk_temperature_C": 150.0, + "coolant_film_temperature_rise_K": 20.0, + "heat_flux_MW_m2": 1.0, + "layers_plasma_to_coolant": [ + { + "cold_face_temperature_C": 223.33333333333334, + "declared_max_service_temperature_C": 1600.0, + "hot_face_temperature_C": 278.8888888888889, + "layer_id": "segmented_tungsten_armor", + "material": "segmented tungsten", + "temperature_rise_K": 55.55555555555556, + "temperature_screen_pass": true, + "thermal_resistance_m2K_W": 5.555555555555556e-05 + }, + { + "cold_face_temperature_C": 210.0, + "declared_max_service_temperature_C": 800.0, + "hot_face_temperature_C": 223.33333333333334, + "layer_id": "w_cu_fgm", + "material": "W-Cu functionally graded transition", + "temperature_rise_K": 13.333333333333334, + "temperature_screen_pass": true, + "thermal_resistance_m2K_W": 1.3333333333333333e-05 + }, + { + "cold_face_temperature_C": 170.0, + "declared_max_service_temperature_C": 350.0, + "hot_face_temperature_C": 210.0, + "layer_id": "cucrzr_heat_sink", + "material": "CuCrZr heat sink", + "temperature_rise_K": 40.0, + "temperature_screen_pass": true, + "thermal_resistance_m2K_W": 4e-05 + } + ], + "plasma_facing_surface_temperature_C": 278.8888888888889, + "raw_cte_mismatch_strain_proxy": 0.0016111111111111113, + "raw_cte_mismatch_strain_screen_pass": true, + "solid_thermal_resistance_m2K_W": 0.00010888888888888889, + "total_thermal_resistance_m2K_W": 0.0001288888888888889 + } + }, + { + "declared_weighted_architecture_score": 8.0, + "direct_plasma_confinement_credit": 0.0, + "id": "DB-C_SIC_HIGH_TEMP", + "integration_gates": { + "avoids_water_pbli_interaction": true, + "breeding_blanket_compatible": true, + "full_fusion_neutron_qualification": false, + "joining_process_mature": false, + "low_activation_structure": true, + "preserves_magnetic_clearance": true, + "structural_code_path": false + }, + "name": "Tungsten plus graded W-SiC plus helium-cooled SiCf-SiC first wall", + "nominal": { + "all_layer_temperature_screens_pass": true, + "coolant_bulk_temperature_C": 500.0, + "coolant_film_temperature_rise_K": 12.5, + "heat_flux_MW_m2": 0.25, + "layers_plasma_to_coolant": [ + { + "cold_face_temperature_C": 579.1666666666666, + "declared_max_service_temperature_C": 1600.0, + "hot_face_temperature_C": 587.5, + "layer_id": "segmented_tungsten_armor", + "material": "segmented tungsten", + "temperature_rise_K": 8.333333333333334, + "temperature_screen_pass": true, + "thermal_resistance_m2K_W": 3.3333333333333335e-05 + }, + { + "cold_face_temperature_C": 562.5, + "declared_max_service_temperature_C": 1200.0, + "hot_face_temperature_C": 579.1666666666666, + "layer_id": "graded_w_sic_transition", + "material": "graded W-SiC transition candidate", + "temperature_rise_K": 16.666666666666668, + "temperature_screen_pass": true, + "thermal_resistance_m2K_W": 6.666666666666667e-05 + }, + { + "cold_face_temperature_C": 512.5, + "declared_max_service_temperature_C": 1200.0, + "hot_face_temperature_C": 562.5, + "layer_id": "sicf_sic_first_wall", + "material": "SiCf-SiC composite first-wall structure", + "temperature_rise_K": 50.0, + "temperature_screen_pass": true, + "thermal_resistance_m2K_W": 0.0002 + } + ], + "plasma_facing_surface_temperature_C": 587.5, + "raw_cte_mismatch_strain_proxy": 2.624999999999997e-05, + "raw_cte_mismatch_strain_screen_pass": true, + "solid_thermal_resistance_m2K_W": 0.00030000000000000003, + "total_thermal_resistance_m2K_W": 0.00035000000000000005 + }, + "physical_qualification_complete": false, + "status": "HIGH_TEMPERATURE_RESEARCH_BRANCH__DEFERRED", + "upset_steady_upper_bound": { + "all_layer_temperature_screens_pass": true, + "coolant_bulk_temperature_C": 500.0, + "coolant_film_temperature_rise_K": 50.0, + "heat_flux_MW_m2": 1.0, + "layers_plasma_to_coolant": [ + { + "cold_face_temperature_C": 816.6666666666666, + "declared_max_service_temperature_C": 1600.0, + "hot_face_temperature_C": 850.0, + "layer_id": "segmented_tungsten_armor", + "material": "segmented tungsten", + "temperature_rise_K": 33.333333333333336, + "temperature_screen_pass": true, + "thermal_resistance_m2K_W": 3.3333333333333335e-05 + }, + { + "cold_face_temperature_C": 750.0, + "declared_max_service_temperature_C": 1200.0, + "hot_face_temperature_C": 816.6666666666666, + "layer_id": "graded_w_sic_transition", + "material": "graded W-SiC transition candidate", + "temperature_rise_K": 66.66666666666667, + "temperature_screen_pass": true, + "thermal_resistance_m2K_W": 6.666666666666667e-05 + }, + { + "cold_face_temperature_C": 550.0, + "declared_max_service_temperature_C": 1200.0, + "hot_face_temperature_C": 750.0, + "layer_id": "sicf_sic_first_wall", + "material": "SiCf-SiC composite first-wall structure", + "temperature_rise_K": 200.0, + "temperature_screen_pass": true, + "thermal_resistance_m2K_W": 0.0002 + } + ], + "plasma_facing_surface_temperature_C": 850.0, + "raw_cte_mismatch_strain_proxy": 0.00010499999999999988, + "raw_cte_mismatch_strain_screen_pass": true, + "solid_thermal_resistance_m2K_W": 0.00030000000000000003, + "total_thermal_resistance_m2K_W": 0.00035000000000000005 + } + } + ] +} diff --git a/results/sfr3_field_integrity/SFR3_FIELD_INTEGRITY_SHELL_A_RESULT.md b/results/sfr3_field_integrity/SFR3_FIELD_INTEGRITY_SHELL_A_RESULT.md new file mode 100644 index 0000000..a240d0a --- /dev/null +++ b/results/sfr3_field_integrity/SFR3_FIELD_INTEGRITY_SHELL_A_RESULT.md @@ -0,0 +1,24 @@ +# SFR-3 Field Integrity Shell A, v0.7.0 result + +## Verdict + +`SYNTHETIC_HARMONIC_CONTROL_DEMONSTRATED__PHYSICAL_CONFINEMENT_UNPROVEN` + +This is a deterministic low-authority harmonic controllability screen. It does not solve physical coils, equilibrium, islands, or plasma confinement, and it earns zero fusion or ignition credit. + +## What passed + +- Nominal synthetic RMS field-error reduction: **65.46%**. +- Single-actuator-unavailable reduction: **66.36%**. +- Passive-only transient attenuation: **55.00%**; passive loops receive no DC correction credit. +- Low sensor confidence commands passive-only safe hold rather than active correction. +- A passive-loop quench removes passive credit while leaving the independently gated active layer bounded. +- An active-coil quench or exhausted thermal margin blocks powered correction and retains only healthy passive response. + +## What did not pass + +Biot-Savart coil response, free-boundary equilibrium, magnetic-island suppression, particle and alpha confinement, finite-beta transport/MHD, coil stress and quench, 3-D neutronics/TBR, integrated burn, net electricity and hardware are all unexecuted. + +## Decision + +Retain Field Integrity Shell A as the leading new confinement-support architecture. Promote it only after the analytic response matrix is replaced by physical coil/equilibrium evidence. It currently improves the repo's testability and fault tolerance, not its earned distance to fusion. diff --git a/results/sfr3_field_integrity/sfr3_field_integrity_shell_a_v070.json b/results/sfr3_field_integrity/sfr3_field_integrity_shell_a_v070.json new file mode 100644 index 0000000..6032096 --- /dev/null +++ b/results/sfr3_field_integrity/sfr3_field_integrity_shell_a_v070.json @@ -0,0 +1,501 @@ +{ + "architecture": { + "active_layer": "individually driven planar trim coils outside the blanket and vacuum boundary", + "mechanical_layer": "warm-side modal damping and alignment surveillance", + "name": "Field Integrity Shell A", + "observability_layer": "magnetic, coil-current, quench, cryogenic strain and support-motion sensing", + "passive_layer": "flux-conserving superconducting loops for time-varying perturbations only", + "passive_material_claimed_to_confine_plasma": false, + "plasma_facing_layer": "segmented tungsten-family armor; no wall-confinement credit", + "primary_field_is_steady": true, + "shielding_layer": "geometry-aware graded shielding around REBCO and penetrations", + "vacuum_vessel_is_flexible": false + }, + "authority": "LOW__synthetic_linear_harmonic_controllability__not_physical_confinement", + "baseline_design_id": "SFR-1-RevA", + "claim_boundary": { + "confinement_gain_credit": 0.0, + "fusion_power_gain_credit": 0.0, + "ignition_gain_credit": 0.0, + "net_electric_gain_credit": 0.0, + "statement": "Passing this screen proves only controllability of a synthetic linear harmonic challenge." + }, + "donor_translation": { + "AHIS": "ADAPT observability, confidence-aware state estimation, watchdog and fault latching; REJECT hull-healing or direct plasma credit.", + "IX-Breath": "ADAPT resource gates, bounded states and safe hold; REJECT flexible-vessel breathing.", + "IX-GCR-SPE": "ADAPT shadow-vault placement and graded protection around vulnerable magnets; REJECT space-radiation performance transfer.", + "IX-HfTaZen-Shield": "ADAPT segmentation, compliant interfaces and hotspot monitoring; REJECT Hf/Ta as routine plasma-facing armor.", + "IX-Shield": "ADAPT weak-direction and areal-density bookkeeping; REJECT hydrogen-rich low-temperature material near the fusion core.", + "IX-Vibe": "ADAPT measured-mode targeting, shunt damping and alignment surveillance; REJECT broadband material as a field source.", + "PressureX": "ADAPT passive rate-dependent load shaping to warm supports; REJECT the donor impact model and any plasma-volume fluid." + }, + "model_definition": { + "actuator_count": 24, + "coefficient_count": 12, + "coefficient_unit_Bn_over_Baxis": 0.0001, + "field_periods": 4, + "mode_count": 6, + "passive_loops_have_dc_correction_credit": false, + "response_matrix_rank": 12, + "response_matrix_shape": [ + 12, + 24 + ], + "response_matrix_source": "deterministic analytic heuristic; replace with Biot-Savart/free-boundary response" + }, + "next_required_evidence": [ + "Replace the analytic response matrix with CAD-linked Biot-Savart responses including blanket steel and ports.", + "Solve free-boundary finite-beta equilibria and quantify island widths, effective ripple and strike-point motion.", + "Run guiding-center and alpha-orbit loss calculations before any confinement claim.", + "Run structural FEA with coil-support co-optimization and measured modal response.", + "Run 3-D OpenMC neutronics for WC/B4C/HfH candidate shields and REBCO lifetime.", + "Close trim-coil power, cryogenic, quench, radiation and failure-mode budgets in hardware." + ], + "program": "IX-StellaratorForge", + "promotion_status": { + "SFR3_G0_ARCHITECTURE_SPEC": "PASS_SPEC_ONLY", + "SFR3_G1_SYNTHETIC_CONTROLLABILITY": "PASS_LOW_AUTHORITY_SYNTHETIC_ONLY", + "SFR3_G2_BIOT_SAVART_COIL_RESPONSE": "NOT_RUN", + "SFR3_G3_FREE_BOUNDARY_EQUILIBRIUM_AND_ISLANDS": "NOT_RUN", + "SFR3_G4_PARTICLE_AND_ALPHA_ORBITS": "NOT_RUN", + "SFR3_G5_TRANSPORT_AND_MHD": "NOT_RUN", + "SFR3_G6_COIL_STRESS_QUENCH_AND_CRYOGENICS": "NOT_RUN", + "SFR3_G7_FULL_3D_NEUTRONICS_AND_TBR": "NOT_RUN", + "SFR3_G8_INTEGRATED_BURN_AND_PLANT": "NOT_RUN", + "SFR3_G9_HARDWARE": "NOT_RUN" + }, + "release": "0.7.0", + "requirement_results": { + "active_coil_quench_enters_passive_only_safe_hold": true, + "low_confidence_enters_safe_hold": true, + "nominal_synthetic_controllability_pass": true, + "passive_loop_quench_isolated_without_active_overclaim": true, + "passive_transient_screen_pass": true, + "single_actuator_failure_pass": true, + "thermal_margin_loss_enters_passive_only_safe_hold": true + }, + "requirements": { + "maximum_regularized_condition_number": 10.0, + "nominal_rms_reduction_fraction": 0.6, + "passive_transient_reduction_fraction": 0.5, + "single_failure_rms_reduction_fraction": 0.55 + }, + "scenarios": [ + { + "active_correction_allowed": true, + "after_passive_error_rms_coefficient_units": 0.3960023674171659, + "commands": [ + -0.810809236231859, + 0.40849073788485407, + 0.31934934943278037, + -0.8862722571059305, + -0.381051672147703, + 0.146965176041562, + 0.701994069337559, + -0.08383629900048398, + 0.6071886320599772, + -0.17057678681836164, + -0.8037608453263679, + -0.15352553032050367, + 0.21314652133702852, + -0.22108373398394265, + 0.3001848862486659, + 0.7773506644642523, + 0.011772518989503562, + -0.9999999999999999, + 0.2251035786939923, + 0.5245902417737082, + -0.9279968542034338, + -0.049936553675978386, + 0.5448790518104535, + 0.707834340741252 + ], + "control_state": "ACTIVE_TRIM", + "description": "All passive and active layers healthy.", + "diagnostics": { + "available_response_rank": 12, + "available_response_singular_values": [ + 0.3472153066111489, + 0.3472153066111487, + 0.3452971375188232, + 0.3452971375188231, + 0.32226900835748107, + 0.3222690083574809, + 0.2892072239354681, + 0.289207223935468, + 0.2779532215499495, + 0.27795322154994945, + 0.24179090207130063, + 0.2417909020713005 + ], + "failed_actuators": [], + "peak_command_utilization": 0.9999999999999999, + "regularized_condition_number": 2.060324746487621, + "scaled_to_command_limit": true, + "unconstrained_peak_command": 1.5412289209227392 + }, + "final_error_rms_Bn_over_Baxis": 1.392974721196233e-05, + "final_error_rms_coefficient_units": 0.1392974721196233, + "fusion_or_ignition_credit": 0.0, + "id": "nominal", + "initial_error_rms_Bn_over_Baxis": 4.033195589934447e-05, + "initial_error_rms_coefficient_units": 0.4033195589934447, + "passive_loops_healthy": true, + "passive_only_rms_reduction_fraction": 0.018142416882880985, + "passive_transient_attenuation_fraction_applied": 0.55, + "resource_gate_reasons": [], + "total_rms_reduction_fraction": 0.6546225715726142 + }, + { + "active_correction_allowed": true, + "after_passive_error_rms_coefficient_units": 0.3960023674171659, + "commands": [ + -0.8688951938261256, + 0.4284128254603282, + 0.3318746746987743, + -0.8988082500340429, + -0.3623126336082907, + 0.1631863103048372, + 0.7244106333619357, + 0.0, + 0.6282651357690254, + -0.1588440594977001, + -0.790996736117589, + -0.15570426064919135, + 0.22417068591656242, + -0.2100605850084952, + 0.257802660178987, + 0.7883283239898737, + 0.01607368352886581, + -1.0, + 0.22614541266658, + 0.532017323376858, + -0.9432539179951787, + -0.03650755257645581, + 0.556715595426962, + 0.7178293976929455 + ], + "control_state": "ACTIVE_TRIM", + "description": "One of 24 trim-coil channels is unavailable.", + "diagnostics": { + "available_response_rank": 12, + "available_response_singular_values": [ + 0.3472153066111488, + 0.34631450981851375, + 0.3452971375188232, + 0.3347798668716778, + 0.32226900835748107, + 0.3104796685473366, + 0.28920722393546794, + 0.2838673767622138, + 0.2779532215499494, + 0.2578197806063689, + 0.2417909020713005, + 0.20156785965862933 + ], + "failed_actuators": [ + 7 + ], + "peak_command_utilization": 1.0, + "regularized_condition_number": 2.962426910156671, + "scaled_to_command_limit": true, + "unconstrained_peak_command": 1.5197475227767938 + }, + "final_error_rms_Bn_over_Baxis": 1.3566944947451738e-05, + "final_error_rms_coefficient_units": 0.13566944947451737, + "fusion_or_ignition_credit": 0.0, + "id": "single_actuator_unavailable", + "initial_error_rms_Bn_over_Baxis": 4.033195589934447e-05, + "initial_error_rms_coefficient_units": 0.4033195589934447, + "passive_loops_healthy": true, + "passive_only_rms_reduction_fraction": 0.018142416882880985, + "passive_transient_attenuation_fraction_applied": 0.55, + "resource_gate_reasons": [], + "total_rms_reduction_fraction": 0.663617976244186 + }, + { + "active_correction_allowed": false, + "after_passive_error_rms_coefficient_units": 0.3960023674171659, + "commands": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "control_state": "PASSIVE_ONLY_SAFE_HOLD", + "description": "Sensor disagreement forces passive-only safe hold.", + "diagnostics": { + "available_response_rank": null, + "available_response_singular_values": [], + "failed_actuators": [], + "peak_command_utilization": 0.0, + "regularized_condition_number": null, + "scaled_to_command_limit": false, + "unconstrained_peak_command": 0.0 + }, + "final_error_rms_Bn_over_Baxis": 3.960023674171659e-05, + "final_error_rms_coefficient_units": 0.3960023674171659, + "fusion_or_ignition_credit": 0.0, + "id": "low_sensor_confidence", + "initial_error_rms_Bn_over_Baxis": 4.033195589934447e-05, + "initial_error_rms_coefficient_units": 0.4033195589934447, + "passive_loops_healthy": true, + "passive_only_rms_reduction_fraction": 0.018142416882880985, + "passive_transient_attenuation_fraction_applied": 0.55, + "resource_gate_reasons": [ + "sensor confidence below threshold" + ], + "total_rms_reduction_fraction": 0.018142416882880985 + }, + { + "active_correction_allowed": true, + "after_passive_error_rms_coefficient_units": 0.4033195589934447, + "commands": [ + -0.8262123148306857, + 0.33270745553595665, + 0.32805980459683515, + -0.7910563430135897, + -0.332879605409859, + 0.21031730976905968, + 0.5922899417864397, + -0.1543174306617742, + 0.5528594402336887, + -0.10932186215603637, + -0.7701013318700607, + -0.14197457869790475, + 0.3390216802485875, + -0.2817986580202181, + 0.20275093915515197, + 0.7122875865422307, + 0.11169601292333098, + -1.0, + 0.15845468473824326, + 0.5902325549035702, + -0.8604002541704838, + -0.0754633733156864, + 0.5044610025987127, + 0.7083873391139449 + ], + "control_state": "ACTIVE_TRIM", + "description": "Passive loop is isolated; healthy active trim remains resource-gated and bounded.", + "diagnostics": { + "available_response_rank": 12, + "available_response_singular_values": [ + 0.3472153066111489, + 0.3472153066111487, + 0.3452971375188232, + 0.3452971375188231, + 0.32226900835748107, + 0.3222690083574809, + 0.2892072239354681, + 0.289207223935468, + 0.2779532215499495, + 0.27795322154994945, + 0.24179090207130063, + 0.2417909020713005 + ], + "failed_actuators": [], + "peak_command_utilization": 1.0, + "regularized_condition_number": 2.060324746487621, + "scaled_to_command_limit": true, + "unconstrained_peak_command": 1.6280213746745589 + }, + "final_error_rms_Bn_over_Baxis": 1.558063601475354e-05, + "final_error_rms_coefficient_units": 0.1558063601475354, + "fusion_or_ignition_credit": 0.0, + "id": "passive_loop_quench", + "initial_error_rms_Bn_over_Baxis": 4.033195589934447e-05, + "initial_error_rms_coefficient_units": 0.4033195589934447, + "passive_loops_healthy": false, + "passive_only_rms_reduction_fraction": 0.0, + "passive_transient_attenuation_fraction_applied": 0.0, + "resource_gate_reasons": [], + "total_rms_reduction_fraction": 0.6136900463335382 + }, + { + "active_correction_allowed": false, + "after_passive_error_rms_coefficient_units": 0.3960023674171659, + "commands": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "control_state": "PASSIVE_ONLY_SAFE_HOLD", + "description": "An active trim-coil quench blocks all powered correction and leaves only healthy passive response.", + "diagnostics": { + "available_response_rank": null, + "available_response_singular_values": [], + "failed_actuators": [], + "peak_command_utilization": 0.0, + "regularized_condition_number": null, + "scaled_to_command_limit": false, + "unconstrained_peak_command": 0.0 + }, + "final_error_rms_Bn_over_Baxis": 3.960023674171659e-05, + "final_error_rms_coefficient_units": 0.3960023674171659, + "fusion_or_ignition_credit": 0.0, + "id": "active_coil_quench", + "initial_error_rms_Bn_over_Baxis": 4.033195589934447e-05, + "initial_error_rms_coefficient_units": 0.4033195589934447, + "passive_loops_healthy": true, + "passive_only_rms_reduction_fraction": 0.018142416882880985, + "passive_transient_attenuation_fraction_applied": 0.55, + "resource_gate_reasons": [ + "active-coil quench detected" + ], + "total_rms_reduction_fraction": 0.018142416882880985 + }, + { + "active_correction_allowed": false, + "after_passive_error_rms_coefficient_units": 0.3960023674171659, + "commands": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "control_state": "PASSIVE_ONLY_SAFE_HOLD", + "description": "Insufficient trim thermal margin blocks powered correction before a quench.", + "diagnostics": { + "available_response_rank": null, + "available_response_singular_values": [], + "failed_actuators": [], + "peak_command_utilization": 0.0, + "regularized_condition_number": null, + "scaled_to_command_limit": false, + "unconstrained_peak_command": 0.0 + }, + "final_error_rms_Bn_over_Baxis": 3.960023674171659e-05, + "final_error_rms_coefficient_units": 0.3960023674171659, + "fusion_or_ignition_credit": 0.0, + "id": "thermal_margin_exhausted", + "initial_error_rms_Bn_over_Baxis": 4.033195589934447e-05, + "initial_error_rms_coefficient_units": 0.4033195589934447, + "passive_loops_healthy": true, + "passive_only_rms_reduction_fraction": 0.018142416882880985, + "passive_transient_attenuation_fraction_applied": 0.55, + "resource_gate_reasons": [ + "trim thermal margin below threshold" + ], + "total_rms_reduction_fraction": 0.018142416882880985 + }, + { + "active_correction_allowed": false, + "after_passive_error_rms_coefficient_units": 0.037153398229502504, + "commands": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "control_state": "PASSIVE_ONLY_SAFE_HOLD", + "description": "A pure time-varying challenge tests passive attenuation with active trim deliberately disabled.", + "diagnostics": { + "available_response_rank": null, + "available_response_singular_values": [], + "failed_actuators": [], + "peak_command_utilization": 0.0, + "regularized_condition_number": null, + "scaled_to_command_limit": false, + "unconstrained_peak_command": 0.0 + }, + "final_error_rms_Bn_over_Baxis": 3.7153398229502508e-06, + "final_error_rms_coefficient_units": 0.037153398229502504, + "fusion_or_ignition_credit": 0.0, + "id": "passive_transient_only", + "initial_error_rms_Bn_over_Baxis": 8.256310717667225e-06, + "initial_error_rms_coefficient_units": 0.08256310717667224, + "passive_loops_healthy": true, + "passive_only_rms_reduction_fraction": 0.55, + "passive_transient_attenuation_fraction_applied": 0.55, + "resource_gate_reasons": [ + "active correction not requested" + ], + "total_rms_reduction_fraction": 0.55 + } + ], + "screen_pass": true, + "study_id": "SFR3-FIELD-INTEGRITY-SHELL-A", + "top_level_verdict": "SYNTHETIC_HARMONIC_CONTROL_DEMONSTRATED__PHYSICAL_CONFINEMENT_UNPROVEN" +} diff --git a/results/sfr4_integrated/SFR4_INTEGRATED_PHYSICAL_PROMOTION_A_RESULT.md b/results/sfr4_integrated/SFR4_INTEGRATED_PHYSICAL_PROMOTION_A_RESULT.md new file mode 100644 index 0000000..dc90df2 --- /dev/null +++ b/results/sfr4_integrated/SFR4_INTEGRATED_PHYSICAL_PROMOTION_A_RESULT.md @@ -0,0 +1,29 @@ +# SFR-4 Integrated Physical-Promotion Campaign A + +Verdict: `INTEGRATED_REDUCED_CAMPAIGN_COMPLETE__NOMINAL_HEAT_ENVELOPE_SCREEN_PASS__PHYSICAL_COIL_EQUILIBRIUM_CONFINEMENT_AND_FUSION_UNPROVEN` + +## Seven-workstream result + +1. Physical coil field: 80 direct-filament candidates executed; 0 passes. Best reduced candidate has mean iota 0.065333 and normalized maximum radial excursion 0.192225. No coil is promoted. +2. Finite-beta equilibrium: not run. Available production tools: none. Unavailable: desc, vmecpp, simsopt, openmc, dolfinx, fenics, gmsh, cadquery. +3. Coil/plasma co-design: reduced geometry/current scan executed; production single-stage co-design not run. +4. Particle confinement: 3.5 MeV alpha gyroradius scope is 0.044900 m, but no guiding-center retention is credited because the topology prerequisite fails. +5. Burn: design-iota Q=20 screen requires H_ISS04 1.999672 after the declared bremsstrahlung and alpha-deposition assumptions. It is not linked to a passing physical coil. +6. Magnet engineering: magnetic-pressure, stored-energy and centerline geometry scopes executed; peak conductor field, winding-pack FEA and quench qualification remain open. +7. Reactor systems: exact D-T source and breeding-coverage constraints plus conditional plant ledger executed. Conditional net electric algebra is 339.878 MWe, with no prediction credit. + +## Heat result + +Plasma exhaust in the declared Q=20 target ledger: **228.977 MW**. +Controlled radiation requirement: **137.386 MW**, producing a first-wall peak screen of **0.294 MW/m2**. +Divertor power: **91.591 MW**, producing a selected peak screen of **5.724 MW/m2** over 24 m2 effective wetted area. +Divertor tungsten surface screen: **678.3 C**. +First-wall surface screen: **401.2 C nominal**, **523.8 C at the declared 1 MW/m2 steady upper bound**. +Water-loop screen: **426.0 kg/s**, **7.56 m/s**, **0.122 MW** across 960 parallel channels. +Selected heat-flux envelope pass: **True**. + +The heat result is a requirement-level resolution for nominal and declared steady conditions. Stable detachment, 3-D island footprints, critical heat flux, erosion, cyclic fatigue, disruptions, coolant accidents and component qualification remain unproven. + +## Scientific boundary + +Earned fusion-progress credit remains exactly **0.0** because no physical coil passes, no finite-beta equilibrium is solved, and no particle/transport or sustained-burn calculation is promoted. diff --git a/results/sfr4_integrated/sfr4_integrated_physical_promotion_a_v090.json b/results/sfr4_integrated/sfr4_integrated_physical_promotion_a_v090.json new file mode 100644 index 0000000..568188e --- /dev/null +++ b/results/sfr4_integrated/sfr4_integrated_physical_promotion_a_v090.json @@ -0,0 +1,475 @@ +{ + "authority": "MIXED_LOW_AND_INTERMEDIATE__DIRECT_FILAMENT_BIOT_SAVART_PLUS_ANALYTICAL_THERMAL_HYDRAULIC_BURN_AND_SOURCE_SCREENS__NOT_PRODUCTION_PHYSICS", + "claim_boundary": { + "fusion_progress_credit_fraction": 0.0, + "hardware_credit": 0.0, + "ignition_credit": 0.0, + "mechanical_wall_confinement_credit": 0.0, + "particle_confinement_credit": 0.0, + "production_equilibrium_credit": 0.0, + "safety_qualification_credit": 0.0 + }, + "heat_exhaust_resolution": { + "authority": "power_partition_plus_1D_conduction_and_hydraulics_not_edge_plasma_CFD_FEA_or_CHF_qualification", + "controlled_radiation_MW": 137.38636363636363, + "divertor_hydraulics": { + "mass_flow_kg_s": 426.00422832980973, + "mean_channel_velocity_m_s": 7.56124598742875, + "parallel_channels": 960, + "pressure_drop_Pa_screen": 183494.94901208644, + "pumping_power_MW_screen": 0.1217785077992081 + }, + "divertor_peak_heat_flux_MW_m2": 5.724431818181818, + "divertor_power_MW": 91.5909090909091, + "divertor_thermal_screen": { + "all_temperature_screens_pass": true, + "heat_flux_MW_m2": 5.724431818181818, + "interfaces": [ + { + "location": "coolant_film_wall", + "temperature_C": 231.7775974025974 + }, + { + "declared_max_temperature_C": 350.0, + "layer": "CuCrZr_heat_sink", + "outer_temperature_C": 277.57305194805195, + "temperature_screen_pass": true + }, + { + "declared_max_temperature_C": 500.0, + "layer": "OFHC_Cu_compliant_interlayer", + "outer_temperature_C": 296.65449134199133, + "temperature_screen_pass": true + }, + { + "declared_max_temperature_C": 1200.0, + "layer": "segmented_tungsten_monoblock", + "outer_temperature_C": 678.2832792207793, + "temperature_screen_pass": true + } + ], + "surface_temperature_C": 678.2832792207793 + }, + "first_wall_effective_area_m2": 536.906479419261, + "first_wall_peak_heat_flux_MW_m2": 0.29426785527474164, + "heat_partition_feasibility_window": { + "maximum_controlled_radiation_fraction_from_first_wall_limit": 1.0, + "minimum_controlled_radiation_fraction_at_selected_area": 0.3012406947890819, + "minimum_effective_wetted_area_m2_at_selected_radiation": 13.738636363636363, + "selected_point_inside_flux_window": true + }, + "heat_partition_sensitivity": [ + { + "controlled_radiation_fraction": 0.4, + "divertor_peak_MW_m2": 17.173295454545453, + "effective_wetted_area_m2": 12.0, + "first_wall_peak_MW_m2": 0.19617857018316112, + "heat_flux_limits_pass": false + }, + { + "controlled_radiation_fraction": 0.4, + "divertor_peak_MW_m2": 11.448863636363635, + "effective_wetted_area_m2": 18.0, + "first_wall_peak_MW_m2": 0.19617857018316112, + "heat_flux_limits_pass": false + }, + { + "controlled_radiation_fraction": 0.4, + "divertor_peak_MW_m2": 8.586647727272727, + "effective_wetted_area_m2": 24.0, + "first_wall_peak_MW_m2": 0.19617857018316112, + "heat_flux_limits_pass": true + }, + { + "controlled_radiation_fraction": 0.4, + "divertor_peak_MW_m2": 6.869318181818182, + "effective_wetted_area_m2": 30.0, + "first_wall_peak_MW_m2": 0.19617857018316112, + "heat_flux_limits_pass": true + }, + { + "controlled_radiation_fraction": 0.5, + "divertor_peak_MW_m2": 14.311079545454547, + "effective_wetted_area_m2": 12.0, + "first_wall_peak_MW_m2": 0.2452232127289514, + "heat_flux_limits_pass": false + }, + { + "controlled_radiation_fraction": 0.5, + "divertor_peak_MW_m2": 9.540719696969695, + "effective_wetted_area_m2": 18.0, + "first_wall_peak_MW_m2": 0.2452232127289514, + "heat_flux_limits_pass": true + }, + { + "controlled_radiation_fraction": 0.5, + "divertor_peak_MW_m2": 7.155539772727273, + "effective_wetted_area_m2": 24.0, + "first_wall_peak_MW_m2": 0.2452232127289514, + "heat_flux_limits_pass": true + }, + { + "controlled_radiation_fraction": 0.5, + "divertor_peak_MW_m2": 5.7244318181818175, + "effective_wetted_area_m2": 30.0, + "first_wall_peak_MW_m2": 0.2452232127289514, + "heat_flux_limits_pass": true + }, + { + "controlled_radiation_fraction": 0.6, + "divertor_peak_MW_m2": 11.448863636363637, + "effective_wetted_area_m2": 12.0, + "first_wall_peak_MW_m2": 0.29426785527474164, + "heat_flux_limits_pass": false + }, + { + "controlled_radiation_fraction": 0.6, + "divertor_peak_MW_m2": 7.632575757575758, + "effective_wetted_area_m2": 18.0, + "first_wall_peak_MW_m2": 0.29426785527474164, + "heat_flux_limits_pass": true + }, + { + "controlled_radiation_fraction": 0.6, + "divertor_peak_MW_m2": 5.724431818181818, + "effective_wetted_area_m2": 24.0, + "first_wall_peak_MW_m2": 0.29426785527474164, + "heat_flux_limits_pass": true + }, + { + "controlled_radiation_fraction": 0.6, + "divertor_peak_MW_m2": 4.579545454545455, + "effective_wetted_area_m2": 30.0, + "first_wall_peak_MW_m2": 0.29426785527474164, + "heat_flux_limits_pass": true + }, + { + "controlled_radiation_fraction": 0.7, + "divertor_peak_MW_m2": 8.586647727272728, + "effective_wetted_area_m2": 12.0, + "first_wall_peak_MW_m2": 0.3433124978205319, + "heat_flux_limits_pass": true + }, + { + "controlled_radiation_fraction": 0.7, + "divertor_peak_MW_m2": 5.724431818181819, + "effective_wetted_area_m2": 18.0, + "first_wall_peak_MW_m2": 0.3433124978205319, + "heat_flux_limits_pass": true + }, + { + "controlled_radiation_fraction": 0.7, + "divertor_peak_MW_m2": 4.293323863636364, + "effective_wetted_area_m2": 24.0, + "first_wall_peak_MW_m2": 0.3433124978205319, + "heat_flux_limits_pass": true + }, + { + "controlled_radiation_fraction": 0.7, + "divertor_peak_MW_m2": 3.4346590909090913, + "effective_wetted_area_m2": 30.0, + "first_wall_peak_MW_m2": 0.3433124978205319, + "heat_flux_limits_pass": true + } + ], + "heat_verdict": "NOMINAL_AND_DECLARED_STEADY_HEAT_ENVELOPE_SCREEN_PASS__DETACHMENT_EDGE_TOPOLOGY_TRANSIENTS_FATIGUE_AND_HARDWARE_UNPROVEN", + "nominal_and_declared_steady_heat_envelope_pass": true, + "plasma_exhaust_power_MW": 228.97727272727272, + "selected_first_wall_screen": { + "declared_weighted_architecture_score": 9.0, + "direct_plasma_confinement_credit": 0.0, + "id": "DB-A2_DCLL_HEAT_RESOLVED_SCREEN", + "integration_gates": { + "avoids_water_pbli_interaction": true, + "breeding_blanket_compatible": true, + "full_fusion_neutron_qualification": false, + "joining_process_mature": false, + "low_activation_structure": true, + "preserves_magnetic_clearance": true, + "structural_code_path": true + }, + "name": "Segmented tungsten, graded W-RAFM, helium-cooled ODS-RAFM first wall and separate PbLi DCLL blanket", + "nominal": { + "all_layer_temperature_screens_pass": true, + "coolant_bulk_temperature_C": 350.0, + "coolant_film_temperature_rise_K": 8.407653007849762, + "heat_flux_MW_m2": 0.29426785527474164, + "layers_plasma_to_coolant": [ + { + "cold_face_temperature_C": 391.34558908121573, + "declared_max_service_temperature_C": 1600.0, + "hot_face_temperature_C": 401.1545175903738, + "layer_id": "segmented_tungsten_armor", + "material": "segmented tungsten", + "temperature_rise_K": 9.808928509158056, + "temperature_screen_pass": true, + "thermal_resistance_m2K_W": 3.3333333333333335e-05 + }, + { + "cold_face_temperature_C": 385.9952644398568, + "declared_max_service_temperature_C": 800.0, + "hot_face_temperature_C": 391.34558908121573, + "layer_id": "graded_w_rafm_transition", + "material": "functionally graded tungsten-to-RAFM transition candidate", + "temperature_rise_K": 5.350324641358939, + "temperature_screen_pass": true, + "thermal_resistance_m2K_W": 1.8181818181818182e-05 + }, + { + "cold_face_temperature_C": 358.4076530078498, + "declared_max_service_temperature_C": 550.0, + "hot_face_temperature_C": 385.9952644398568, + "layer_id": "helium_cooled_ods_rafm_first_wall", + "material": "ODS-Eurofer or qualified RAFM with distributed helium microchannels", + "temperature_rise_K": 27.58761143200703, + "temperature_screen_pass": true, + "thermal_resistance_m2K_W": 9.375e-05 + } + ], + "plasma_facing_surface_temperature_C": 401.1545175903738, + "raw_cte_mismatch_strain_proxy": 0.0003836588819278036, + "raw_cte_mismatch_strain_screen_pass": true, + "solid_thermal_resistance_m2K_W": 0.00014526515151515153, + "total_thermal_resistance_m2K_W": 0.00017383658008658008 + }, + "physical_qualification_complete": false, + "status": "SELECTED_FOR_REDUCED_HEAT_CAMPAIGN__NOT_QUALIFIED", + "upset_steady_upper_bound": { + "all_layer_temperature_screens_pass": true, + "coolant_bulk_temperature_C": 350.0, + "coolant_film_temperature_rise_K": 28.57142857142857, + "heat_flux_MW_m2": 1.0, + "layers_plasma_to_coolant": [ + { + "cold_face_temperature_C": 490.50324675324674, + "declared_max_service_temperature_C": 1600.0, + "hot_face_temperature_C": 523.83658008658, + "layer_id": "segmented_tungsten_armor", + "material": "segmented tungsten", + "temperature_rise_K": 33.333333333333336, + "temperature_screen_pass": true, + "thermal_resistance_m2K_W": 3.3333333333333335e-05 + }, + { + "cold_face_temperature_C": 472.32142857142856, + "declared_max_service_temperature_C": 800.0, + "hot_face_temperature_C": 490.50324675324674, + "layer_id": "graded_w_rafm_transition", + "material": "functionally graded tungsten-to-RAFM transition candidate", + "temperature_rise_K": 18.181818181818183, + "temperature_screen_pass": true, + "thermal_resistance_m2K_W": 1.8181818181818182e-05 + }, + { + "cold_face_temperature_C": 378.57142857142856, + "declared_max_service_temperature_C": 550.0, + "hot_face_temperature_C": 472.32142857142856, + "layer_id": "helium_cooled_ods_rafm_first_wall", + "material": "ODS-Eurofer or qualified RAFM with distributed helium microchannels", + "temperature_rise_K": 93.75, + "temperature_screen_pass": true, + "thermal_resistance_m2K_W": 9.375e-05 + } + ], + "plasma_facing_surface_temperature_C": 523.83658008658, + "raw_cte_mismatch_strain_proxy": 0.0013037743506493504, + "raw_cte_mismatch_strain_screen_pass": true, + "solid_thermal_resistance_m2K_W": 0.00014526515151515153, + "total_thermal_resistance_m2K_W": 0.00017383658008658008 + } + }, + "transient_disruption_heat_resolved": false, + "water_PbLi_separation_requirement": "Independent double-wall divertor coolant boundary, guard vacuum and leak detection separate water from every PbLi sector. No shared heat exchanger or common penetration." + }, + "program": "IX-StellaratorForge", + "promotion_summary": { + "earned_fusion_progress_credit_fraction": 0.0, + "full_3D_TBR_pass": false, + "hardware_pass": false, + "magnet_qualification_pass": false, + "nominal_and_declared_steady_heat_envelope_screen_pass": true, + "physical_confinement_pass": false, + "production_equilibrium_pass": false, + "sustained_burn_pass": false + }, + "reduced_campaign_complete": true, + "release": "0.9.0", + "solver_availability": { + "cadquery": false, + "desc": false, + "dolfinx": false, + "fenics": false, + "gmsh": false, + "openmc": false, + "simsopt": false, + "vmecpp": false + }, + "study_id": "SFR4-INTEGRATED-PHYSICAL-PROMOTION-A", + "top_level_verdict": "INTEGRATED_REDUCED_CAMPAIGN_COMPLETE__NOMINAL_HEAT_ENVELOPE_SCREEN_PASS__PHYSICAL_COIL_EQUILIBRIUM_CONFINEMENT_AND_FUSION_UNPROVEN", + "workstreams": { + "1_physical_coil_field": { + "authority": "direct_filament_Biot_Savart_and_field_line_screen_not_MHD_equilibrium", + "best_candidate": { + "authority": "intermediate_vacuum_biot_savart_field_line_screen", + "combined_screen_pass": false, + "helical_coil_count": 4, + "helical_to_tf_current_ratio": 1.0, + "iota_std": 0.020901758467938333, + "max_radial_excursion_m": 0.32678296522935457, + "mean_iota": 0.06533346156901079, + "mean_radial_excursion_m": 0.1804299730131634, + "nestedness_screen_pass": true, + "nfp": 6, + "normalized_max_excursion_over_a": 0.19222527366432623, + "sign_pattern": "alternating", + "tf_current_MA_turn_per_filament": -9.961772570142877, + "transform_screen_pass": false + }, + "candidate_count": 80, + "combined_pass_count": 0, + "held_out_hybrid_reconstruction": { + "authority": "intermediate_held_out_biot_savart_filament_screen", + "axis_field_std_T": 0.0019628375615968123, + "basis": "24_encircling_plus_helical_harmonics_plus_48_saddle_filaments", + "clearance_m": 1.35, + "coil_count": 120, + "max_filament_current_MA_turn": 4.800318617939227, + "mean_axis_field_T": 5.999956193275066, + "nfp": 6, + "passes_reconstruction_screen": false, + "rms_filament_current_MA_turn": 0.9978809803965022, + "train_mean_abs_Bn_over_B0": 0.05366247699520164, + "train_rms_Bn_over_B0": 0.06281297904419832, + "validation_max_abs_Bn_over_B": 0.14388776659782238, + "validation_mean_abs_Bn_over_B": 0.05487239488509926, + "validation_rms_Bn_over_B": 0.06491274876089598 + }, + "physical_coil_promoted": false, + "tf_centerline_geometry": { + "authority": "geometry_only_rebco_strain_proxy_not_winding_pack_FEA", + "hard_way_strain_proxy_fraction": 0.0019672131147569494, + "length_m": 19.16316791644826, + "max_curvature_per_m": 0.32786885245949154, + "min_bend_radius_m": 3.04999999999558, + "passes_geometry_strain_proxy": true, + "rms_curvature_per_m": 0.3278688524590164, + "strain_ceiling_fraction": 0.004, + "strain_target_fraction": 0.0035 + } + }, + "2_finite_beta_equilibrium": { + "cross_code_equilibrium_completed": false, + "desc_available": false, + "fail_closed": true, + "status": "NOT_RUN__PRODUCTION_SOLVERS_UNAVAILABLE_IN_BUILD_RUNTIME", + "vmecpp_available": false + }, + "3_coil_plasma_codesign": { + "direct_filament_candidate_count": 80, + "production_single_stage_codesign_completed": false, + "simsopt_available": false, + "status": "REDUCED_SCAN_EXECUTED__PRODUCTION_CODESIGN_NOT_RUN" + }, + "4_particle_confinement": { + "alpha_energy_MeV": 3.5, + "alpha_speed_m_s_nonrelativistic": 12991757.997689921, + "authority": "alpha_gyroradius_scope_only_not_orbit_retention", + "field_line_topology_prerequisite_pass": false, + "gyroradius_clearance_screen_pass": true, + "gyroradius_over_minor_radius": 0.02641191861509231, + "maximum_pitch_alpha_gyroradius_m": 0.04490026164565693, + "particle_confinement_promoted": false, + "reason": "A gyroradius scale and vacuum field-line test cannot establish guiding-center alpha retention. The physical coil candidate also fails its combined topology gate.", + "required_external_evidence": [ + "finite_beta_equilibrium", + "Boozer_coordinates", + "collisionless_and_collisional_guiding_center_orbits", + "neoclassical_transport", + "gyrokinetic_transport" + ] + }, + "5_self_consistent_burn": { + "authority": "uniform_Bosch_Hale_plus_ISS04_and_bremsstrahlung_screen_not_transport_or_burn_simulation", + "auxiliary_heating_MW": 50.0, + "best_physical_coil_iota_requirement": { + "alpha_heating_MW": 198.86363636363635, + "auxiliary_heating_MW": 50.0, + "iota_screen": 0.06533346156901079, + "iss04_tau_E_H1_s": 0.2821969651931757, + "plasma_gain_Q": 20.0, + "required_H_ISS04": 4.188696983732281, + "required_tau_E_s": 1.1820375769230584, + "total_thermal_energy_MJ": 294.1661697115338 + }, + "bremsstrahlung_MW_screen": 11.33738085563469, + "deposited_alpha_heating_MW_assumption": 178.97727272727272, + "design_iota_requirement": { + "alpha_heating_MW": 198.86363636363635, + "auxiliary_heating_MW": 50.0, + "iota_screen": 0.55, + "iss04_tau_E_H1_s": 0.6759201871053372, + "plasma_gain_Q": 20.0, + "required_H_ISS04": 1.748782769730839, + "required_tau_E_s": 1.1820375769230584, + "total_thermal_energy_MJ": 294.1661697115338 + }, + "net_heating_after_bremsstrahlung_MW": 217.63989187163804, + "physical_coil_linked_burn_promoted": false, + "reason": "The best direct-filament coil fails topology; a design-iota burn target cannot be assigned to it.", + "required_H_ISS04_with_bremsstrahlung_at_design_iota": 1.9996721903444525, + "required_tau_E_with_bremsstrahlung_s": 1.3516188010469619, + "uniform_burn_point": { + "beta": 0.03, + "dt_reactivity_m3_s": 2.7399296107880726e-22, + "field_T": 6.0, + "fusion_power_MW_uniform": 704.5706395923565, + "ion_density_m3": 8.940303193980161e+19, + "pressure_Pa": 429718.34634811745, + "target_fusion_power_MW": 1000.0, + "target_to_uniform_ratio": 1.4193041035297327, + "temperature_keV": 15.0, + "volume_m3": 456.37050750637184 + } + }, + "6_magnet_engineering": { + "authority": "magnetic_pressure_energy_and_centerline_geometry_scope_not_winding_pack_or_support_FEA", + "best_candidate_tf_current_MA_turn_per_filament": -9.961772570142877, + "centerline_geometry_screen_pass": true, + "declared_peak_field_on_conductor_limit_T": 20.0, + "magnet_promoted": false, + "magnetic_pressure_MPa_axis_field_proxy": 14.323944878270579, + "peak_field_on_conductor_calculated": false, + "quench_protection_qualified": false, + "stored_magnetic_energy_GJ_plasma_volume_proxy": 6.53702599358964, + "structural_FEA_completed": false + }, + "7_reactor_systems": { + "authority": "exact_source_and_conditional_plant_ledger_not_3D_neutronics_or_integrated_plant", + "breeding_coverage_constraint": { + "authority": "exact_source_and_geometric_coverage_bound_not_neutron_transport", + "breeding_surface_coverage_fraction": 0.85, + "fusion_power_MW": 1000.0, + "global_tbr_target": 1.15, + "neutron_power_MW": 801.1363636363636, + "neutron_source_rate_s": 3.546311974125433e+20, + "required_bred_tritium_kg_per_day": 0.17647209941383038, + "required_local_tbr_if_uncovered_regions_breed_zero": 1.352941176470588, + "tritium_burn_kg_per_day": 0.1534539994902873 + }, + "conditional_gross_electric_MW": 460.0, + "conditional_net_electric_MW": 339.8782214922008, + "conditional_recirculating_power_MW": 120.1217785077992, + "conditional_thermal_power_MW": 1150.0, + "dt_source_ledger": { + "alpha_power_MW": 198.86363636363635, + "deuterium_burn_kg_per_day": 0.10247577023313308, + "fusion_power_MW": 1000.0, + "neutron_power_MW": 801.1363636363636, + "reaction_rate_per_s": 3.546311974125433e+20, + "tritium_burn_kg_per_day": 0.1534539994902873 + }, + "full_3D_TBR_calculated": false, + "net_electric_prediction_promoted": false + } + } +} diff --git a/sbom.spdx.json b/sbom.spdx.json index f8d713d..d3561eb 100644 --- a/sbom.spdx.json +++ b/sbom.spdx.json @@ -2,17 +2,17 @@ "SPDXID": "SPDXRef-DOCUMENT", "spdxVersion": "SPDX-2.3", "dataLicense": "CC0-1.0", - "name": "IX-StellaratorForge-0.5.0-SBOM", - "documentNamespace": "https://github.com/BryceWDesign/IX-StellaratorForge/spdx/0.5.0", + "name": "IX-StellaratorForge-0.9.0-SBOM", + "documentNamespace": "https://github.com/BryceWDesign/IX-StellaratorForge/spdx/0.9.0", "creationInfo": { - "created": "2026-08-18T00:00:00Z", + "created": "2026-08-22T00:00:00Z", "creators": ["Tool: IX-StellaratorForge release preparation"] }, "packages": [ { "name": "IX-StellaratorForge", "SPDXID": "SPDXRef-Package-IXStellaratorForge", - "versionInfo": "0.5.0", + "versionInfo": "0.9.0", "downloadLocation": "NOASSERTION", "filesAnalyzed": false, "licenseConcluded": "LicenseRef-IX-StellaratorForge-Eval-Only-1.1", diff --git a/schemas/reactor/sfr2_actuation_overlay.schema.json b/schemas/reactor/sfr2_actuation_overlay.schema.json new file mode 100644 index 0000000..253bf51 --- /dev/null +++ b/schemas/reactor/sfr2_actuation_overlay.schema.json @@ -0,0 +1,28 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "properties": { + "as_of": {"type": "string"}, + "baseline_design_id": {"const": "SFR-2-RevA"}, + "claim_boundary": {"minLength": 40, "type": "string"}, + "concept_image_translation": {"type": "object"}, + "mechanical_architecture": {"type": "object"}, + "program": {"const": "IX-StellaratorForge"}, + "promotion_status": {"type": "object"}, + "screen": {"type": "object"}, + "study_id": {"const": "SFR-2-Actuation-Overlay-A"} + }, + "required": [ + "as_of", + "baseline_design_id", + "claim_boundary", + "concept_image_translation", + "mechanical_architecture", + "program", + "promotion_status", + "screen", + "study_id" + ], + "title": "SFR-2 phase-programmed actuation overlay", + "type": "object" +} diff --git a/schemas/reactor/sfr3_dual_boundary_ahis.schema.json b/schemas/reactor/sfr3_dual_boundary_ahis.schema.json new file mode 100644 index 0000000..09661e8 --- /dev/null +++ b/schemas/reactor/sfr3_dual_boundary_ahis.schema.json @@ -0,0 +1,56 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://ix-stellaratorforge.local/schemas/reactor/sfr3_dual_boundary_ahis.schema.json", + "title": "SFR-3 dual-boundary AHIS integration configuration", + "type": "object", + "required": [ + "schema_version", + "study_id", + "baseline_overlay_id", + "architecture", + "monitoring_geometry", + "thermal_screen", + "selected_stack_id", + "wall_stack_candidates", + "signal_channels", + "fault_scenarios", + "claim_boundary", + "promotion_status", + "next_required_evidence" + ], + "properties": { + "schema_version": {"const": "0.8.0"}, + "study_id": {"const": "SFR3-DUAL-BOUNDARY-AHIS-A"}, + "baseline_overlay_id": {"const": "SFR3-FIELD-INTEGRITY-SHELL-A"}, + "architecture": { + "type": "object", + "properties": { + "vacuum_vessel_is_double_walled": {"const": true}, + "mechanically_pushes_plasma_inward": {"const": false} + }, + "required": ["vacuum_vessel_is_double_walled", "mechanically_pushes_plasma_inward"] + }, + "monitoring_geometry": { + "type": "object", + "properties": { + "field_periods": {"const": 4}, + "toroidal_control_sectors": {"const": 24}, + "poloidal_locations_per_sector": {"const": 8}, + "independent_sensor_lanes": {"const": 2} + } + }, + "wall_stack_candidates": {"type": "array", "minItems": 3, "maxItems": 3}, + "fault_scenarios": {"type": "array", "minItems": 11, "maxItems": 11}, + "claim_boundary": { + "type": "object", + "properties": { + "mechanical_plasma_confinement_credit": {"const": 0.0}, + "magnetic_confinement_gain_credit": {"const": 0.0}, + "fusion_power_gain_credit": {"const": 0.0}, + "ignition_gain_credit": {"const": 0.0}, + "safety_qualification_credit": {"const": 0.0} + } + } + }, + "additionalProperties": false +} diff --git a/schemas/reactor/sfr3_field_integrity_shell.schema.json b/schemas/reactor/sfr3_field_integrity_shell.schema.json new file mode 100644 index 0000000..b0e1670 --- /dev/null +++ b/schemas/reactor/sfr3_field_integrity_shell.schema.json @@ -0,0 +1,50 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://ix-stellaratorforge.local/schemas/reactor/sfr3_field_integrity_shell.schema.json", + "title": "SFR-3 field-integrity shell configuration", + "type": "object", + "required": [ + "schema_version", + "study_id", + "baseline_design_id", + "architecture", + "harmonic_screen", + "resource_gate_thresholds", + "scenarios", + "donor_translation", + "claim_boundary", + "promotion_status", + "next_required_evidence" + ], + "properties": { + "schema_version": {"const": "0.7.0"}, + "study_id": {"const": "SFR3-FIELD-INTEGRITY-SHELL-A"}, + "baseline_design_id": {"const": "SFR-1-RevA"}, + "architecture": { + "type": "object", + "required": ["primary_field_is_steady", "vacuum_vessel_is_flexible", "passive_material_claimed_to_confine_plasma"] + }, + "harmonic_screen": { + "type": "object", + "required": ["field_periods", "actuator_count", "modes", "static_error_coefficients", "transient_error_coefficients"], + "properties": { + "field_periods": {"const": 4}, + "actuator_count": {"type": "integer", "minimum": 12, "maximum": 256}, + "modes": {"type": "array", "minItems": 1}, + "static_error_coefficients": {"type": "array", "items": {"type": "number"}}, + "transient_error_coefficients": {"type": "array", "items": {"type": "number"}} + } + }, + "scenarios": {"type": "array", "minItems": 7}, + "claim_boundary": { + "type": "object", + "properties": { + "confinement_gain_credit": {"const": 0.0}, + "fusion_power_gain_credit": {"const": 0.0}, + "ignition_gain_credit": {"const": 0.0}, + "net_electric_gain_credit": {"const": 0.0} + } + } + }, + "additionalProperties": false +} diff --git a/schemas/reactor/sfr4_integrated_physical_promotion.schema.json b/schemas/reactor/sfr4_integrated_physical_promotion.schema.json new file mode 100644 index 0000000..319b1e5 --- /dev/null +++ b/schemas/reactor/sfr4_integrated_physical_promotion.schema.json @@ -0,0 +1,34 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://example.invalid/ix-stellaratorforge/sfr4-integrated-physical-promotion.schema.json", + "title": "SFR-4 Integrated Physical Promotion Campaign", + "type": "object", + "required": [ + "schema_version", + "study_id", + "workstreams", + "coil_field_scan", + "particle_screen", + "burn_screen", + "heat_exhaust", + "selected_first_wall_stack", + "magnet_engineering", + "reactor_systems", + "claim_boundary" + ], + "properties": { + "schema_version": {"const": "0.9.0"}, + "study_id": {"const": "SFR4-INTEGRATED-PHYSICAL-PROMOTION-A"}, + "workstreams": {"type": "array", "minItems": 7, "maxItems": 7, "uniqueItems": true}, + "coil_field_scan": {"type": "object"}, + "particle_screen": {"type": "object"}, + "burn_screen": {"type": "object"}, + "heat_exhaust": {"type": "object"}, + "selected_first_wall_stack": {"type": "object"}, + "first_wall_decision_weights": {"type": "object"}, + "magnet_engineering": {"type": "object"}, + "reactor_systems": {"type": "object"}, + "claim_boundary": {"type": "object"} + }, + "additionalProperties": false +} diff --git a/scripts/generate_release.py b/scripts/generate_release.py index ad64865..3cfca1c 100644 --- a/scripts/generate_release.py +++ b/scripts/generate_release.py @@ -16,7 +16,11 @@ def main()->int: run('scripts/run_computational_closure.py') run('scripts/generate_v040_evidence.py') run('scripts/run_sfr2_screen.py') + run('scripts/run_sfr2_actuation_overlay.py') + run('scripts/run_sfr3_field_integrity.py') + run('scripts/run_sfr3_dual_boundary.py') + run('scripts/run_sfr4_integrated_campaign.py') run('scripts/make_manifest.py') - print('IX-StellaratorForge v0.5.0 release artifacts regenerated') + print('IX-StellaratorForge v0.9.0 release artifacts regenerated') return 0 if __name__=='__main__':raise SystemExit(main()) diff --git a/scripts/run_sfr2_actuation_overlay.py b/scripts/run_sfr2_actuation_overlay.py new file mode 100644 index 0000000..27be245 --- /dev/null +++ b/scripts/run_sfr2_actuation_overlay.py @@ -0,0 +1,78 @@ +#!/usr/bin/env python3 +from __future__ import annotations + +import json +import sys +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[1] +sys.path.insert(0, str(ROOT / "src")) + +from ix_stellaratorforge.sfr2_actuation import run_actuation_overlay_screen + + +def main() -> int: + config_path = ROOT / "configs" / "reactor" / "sfr2_actuation_overlay_a.json" + result = run_actuation_overlay_screen(json.loads(config_path.read_text(encoding="utf-8"))) + out_dir = ROOT / "results" / "sfr2_actuation" + out_dir.mkdir(parents=True, exist_ok=True) + json_path = out_dir / "sfr2_actuation_overlay_a_v060.json" + md_path = out_dir / "SFR2_ACTUATION_OVERLAY_A_RESULT.md" + json_path.write_text(json.dumps(result, indent=2, sort_keys=True) + "\n", encoding="utf-8") + + baseline = result["baseline"] + breathing = result["breathing_result"] + closest = breathing["closest_cycle_average_case"] + instant = breathing["closest_instantaneous_case"] + image = result["concept_image_result"] + lines = [ + "# SFR-2 Actuation Overlay A, v0.6.0 result", + "", + "## Verdict", + "", + f"`{breathing['verdict']}`", + "", + "This is a low-authority analytical and empirical falsification screen. It is not a dynamic equilibrium, magnetic-pumping, ignition, sustained-burn, net-energy or hardware result.", + "", + "## Preserved baseline", + "", + "The SFR-2 Rev A 23 / 26 / 23 / 26 ft ABAB geometry, rigid vessel and steady primary HTS field remain unchanged.", + f"The baseline H_ISS04=1 optimistic ignition ratio is **{baseline['optimistic_ignition_tau_ratio']:.9f}**, a ratio gap of **{abs(baseline['distance_from_ratio_one_fraction']):.4%}**. This is not a percentage distance from physical ignition.", + f"The target-matched uniform fusion screen is **{baseline['fusion_power_MW_uniform']:.3f} MW**.", + "", + "## Timed squeeze and expansion test", + "", + f"The closest cycle-average case is `{closest['pattern']}` at {closest['depth_fraction']:.2%} depth.", + f"Its cycle-average optimistic ignition ratio is **{closest['cycle_average']['optimistic_ignition_tau_ratio']:.9f}** and its cycle-average uniform fusion power is **{closest['cycle_average']['fusion_power_MW_uniform']:.3f} MW**.", + f"Joint average improvement over the unchanged baseline: **{closest['screen_decision']['joint_average_improvement']}**.", + f"No declared case crosses the cycle-average proxy: **{not breathing['any_cycle_average_proxy_pass']}**.", + "", + "The closest instantaneous point occurs in " + f"`{instant['pattern']}` at {instant['depth_fraction']:.2%} depth and reaches " + f"**{instant['full_cycle']['maximum_optimistic_ignition_tau_ratio']:.9f}**. " + f"That point is a {abs(instant['closest_instantaneous_proxy_point']['equivalent_radial_squeeze_fraction']):.2%} expansion, not a squeeze, with uniform fusion power reduced to " + f"**{instant['closest_instantaneous_proxy_point']['fusion_power_MW_uniform']:.3f} MW**. " + "It is not credited as ignition capture or sustained burn, and actuator power is not yet debited.", + "", + "## Trinity image translation", + "", + f"`{image['verdict']}`", + "", + "The astrophysical accretion, gravity, shock-front and multiple-star claims are not imported into reactor physics. D-T fusion is treated as a binary reaction, so a three-point collision receives zero fusion credit.", + "A global three-toroidal-lobe pattern conflicts with the unchanged four-field-period baseline. The defensible translation is an area-preserving poloidal m=3 actuator harmonic repeated inside every one of the four ABAB periods.", + "Because the tri-lobe harmonic is normalized to preserve cross-sectional area, reshaping alone produces no density, temperature, fusion-power or ignition-proxy gain in this screen.", + "", + "## Decision", + "", + "Do not promote magnetic breathing or the tri-lobe image geometry as a closer-to-fusion result. Retain them as an optional actuator hypothesis for high-authority equilibrium, topology, kinetic, alpha-orbit, electromagnetic and integrated-power testing.", + "", + ] + md_path.write_text("\n".join(lines), encoding="utf-8") + print(json_path.relative_to(ROOT)) + print(md_path.relative_to(ROOT)) + print(breathing["verdict"]) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/scripts/run_sfr3_dual_boundary.py b/scripts/run_sfr3_dual_boundary.py new file mode 100644 index 0000000..20617e3 --- /dev/null +++ b/scripts/run_sfr3_dual_boundary.py @@ -0,0 +1,82 @@ +#!/usr/bin/env python3 +from __future__ import annotations + +import json +import sys +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[1] +sys.path.insert(0, str(ROOT / "src")) + +from ix_stellaratorforge.sfr3_dual_boundary import run_dual_boundary_screen + + +def main() -> int: + raw = json.loads( + (ROOT / "configs/reactor/sfr3_dual_boundary_ahis_a.json").read_text( + encoding="utf-8" + ) + ) + sfr3_raw = json.loads( + (ROOT / "configs/reactor/sfr3_field_integrity_shell_a.json").read_text( + encoding="utf-8" + ) + ) + result = run_dual_boundary_screen(raw, sfr3_raw) + out_dir = ROOT / "results/sfr3_dual_boundary" + out_dir.mkdir(parents=True, exist_ok=True) + json_path = out_dir / "sfr3_dual_boundary_ahis_a_v080.json" + md_path = out_dir / "SFR3_DUAL_BOUNDARY_AHIS_A_RESULT.md" + json_path.write_text(json.dumps(result, indent=2, sort_keys=True) + "\n", encoding="utf-8") + + stack = next( + item for item in result["wall_stack_results"] if item["id"] == result["selected_stack_id"] + ) + monitoring = result["monitoring_inventory"] + faults = {scenario["id"]: scenario for scenario in result["fault_scenarios"]} + lines = [ + "# SFR-3 Dual Boundary AHIS A, v0.8.0 result", + "", + "## Verdict", + "", + f"`{result['top_level_verdict']}`", + "", + "The requested inside/outside AHIS concept is retained as two monitored engineering boundaries. It does not mechanically push plasma inward and earns zero confinement, fusion, ignition or safety-qualification credit.", + "", + "## Selected reduced-screen stack", + "", + f"`{stack['name']}`", + "", + f"The 1-D nominal screen predicts a plasma-facing surface temperature of **{stack['nominal']['plasma_facing_surface_temperature_C']:.1f} C** at 0.25 MW/m2.", + f"The deliberately steady upset upper bound predicts **{stack['upset_steady_upper_bound']['plasma_facing_surface_temperature_C']:.1f} C** at 1.0 MW/m2. This is not a disruption or lifetime result.", + f"The raw CTE-mismatch strain proxy is **{stack['upset_steady_upper_bound']['raw_cte_mismatch_strain_proxy']:.4%}**; real interface stress requires nonlinear FEA and irradiation data.", + "", + "## Monitoring configuration", + "", + f"- 24 toroidal sectors aligned to the 24 SFR-3 trim channels.", + f"- 192 paired inner/outer poloidal monitoring locations.", + f"- Two independent sensing lanes.", + f"- {monitoring['total_declared_sensing_elements']} total declared sensing elements, including independent hard-vacuum channels.", + "", + "## Fault findings", + "", + "- A hotspot and coolant leak remain detectable after the declared single-channel failures.", + "- Loss of one inner or outer lane enters degraded monitoring, not a false nominal state.", + "- Loss of both sector buses, vacuum breach or total control power enters safe hold.", + f"- Outer support movement can request the existing SFR-3 synthetic trim response of **{faults['outer_support_shift']['sfr3_field_integrity_link']['synthetic_rms_reduction_fraction']:.2%}**, but physical confinement credit remains zero.", + "- A silent armor crack below sensor sensitivity is deliberately not claimed as detected; periodic NDE remains mandatory.", + "", + "## Decision", + "", + "The dual-boundary arrangement helps safety observability, leak isolation, wall protection and magnetic alignment management. It does not change the repository's earned ignition proxy. Promote only after coupled thermal/CFD/FEA, fracture and irradiation lifetime, sensor qualification, 3-D magnetics, full neutronics and an instrumented sector prototype.", + "", + ] + md_path.write_text("\n".join(lines), encoding="utf-8") + print(json_path.relative_to(ROOT)) + print(md_path.relative_to(ROOT)) + print(result["top_level_verdict"]) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/scripts/run_sfr3_field_integrity.py b/scripts/run_sfr3_field_integrity.py new file mode 100644 index 0000000..879449e --- /dev/null +++ b/scripts/run_sfr3_field_integrity.py @@ -0,0 +1,64 @@ +#!/usr/bin/env python3 +from __future__ import annotations + +import json +import sys +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[1] +sys.path.insert(0, str(ROOT / "src")) + +from ix_stellaratorforge.sfr3_field_integrity import run_sfr3_field_integrity_screen + + +def main() -> int: + config_path = ROOT / "configs/reactor/sfr3_field_integrity_shell_a.json" + result = run_sfr3_field_integrity_screen( + json.loads(config_path.read_text(encoding="utf-8")) + ) + out_dir = ROOT / "results/sfr3_field_integrity" + out_dir.mkdir(parents=True, exist_ok=True) + json_path = out_dir / "sfr3_field_integrity_shell_a_v070.json" + md_path = out_dir / "SFR3_FIELD_INTEGRITY_SHELL_A_RESULT.md" + json_path.write_text(json.dumps(result, indent=2, sort_keys=True) + "\n", encoding="utf-8") + + by_id = {scenario["id"]: scenario for scenario in result["scenarios"]} + nominal = by_id["nominal"] + failed = by_id["single_actuator_unavailable"] + passive = by_id["passive_transient_only"] + lines = [ + "# SFR-3 Field Integrity Shell A, v0.7.0 result", + "", + "## Verdict", + "", + f"`{result['top_level_verdict']}`", + "", + "This is a deterministic low-authority harmonic controllability screen. It does not solve physical coils, equilibrium, islands, or plasma confinement, and it earns zero fusion or ignition credit.", + "", + "## What passed", + "", + f"- Nominal synthetic RMS field-error reduction: **{nominal['total_rms_reduction_fraction']:.2%}**.", + f"- Single-actuator-unavailable reduction: **{failed['total_rms_reduction_fraction']:.2%}**.", + f"- Passive-only transient attenuation: **{passive['passive_only_rms_reduction_fraction']:.2%}**; passive loops receive no DC correction credit.", + "- Low sensor confidence commands passive-only safe hold rather than active correction.", + "- A passive-loop quench removes passive credit while leaving the independently gated active layer bounded.", + "- An active-coil quench or exhausted thermal margin blocks powered correction and retains only healthy passive response.", + "", + "## What did not pass", + "", + "Biot-Savart coil response, free-boundary equilibrium, magnetic-island suppression, particle and alpha confinement, finite-beta transport/MHD, coil stress and quench, 3-D neutronics/TBR, integrated burn, net electricity and hardware are all unexecuted.", + "", + "## Decision", + "", + "Retain Field Integrity Shell A as the leading new confinement-support architecture. Promote it only after the analytic response matrix is replaced by physical coil/equilibrium evidence. It currently improves the repo's testability and fault tolerance, not its earned distance to fusion.", + "", + ] + md_path.write_text("\n".join(lines), encoding="utf-8") + print(json_path.relative_to(ROOT)) + print(md_path.relative_to(ROOT)) + print(result["top_level_verdict"]) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/scripts/run_sfr4_integrated_campaign.py b/scripts/run_sfr4_integrated_campaign.py new file mode 100644 index 0000000..db26935 --- /dev/null +++ b/scripts/run_sfr4_integrated_campaign.py @@ -0,0 +1,80 @@ +#!/usr/bin/env python3 +"""Run and persist the SFR-4 v0.9 integrated physical-promotion campaign.""" +from __future__ import annotations + +import json +from pathlib import Path +import sys + +ROOT = Path(__file__).resolve().parents[1] +sys.path.insert(0, str(ROOT / "src")) + +from ix_stellaratorforge.sfr4_integrated_campaign import run_integrated_campaign + + +def _summary(result: dict) -> str: + coil = result["workstreams"]["1_physical_coil_field"] + best = coil["best_candidate"] + particles = result["workstreams"]["4_particle_confinement"] + burn = result["workstreams"]["5_self_consistent_burn"] + heat = result["heat_exhaust_resolution"] + hydraulics = heat["divertor_hydraulics"] + systems = result["workstreams"]["7_reactor_systems"] + available = [name for name, value in result["solver_availability"].items() if value] + unavailable = [name for name, value in result["solver_availability"].items() if not value] + lines = [ + "# SFR-4 Integrated Physical-Promotion Campaign A", + "", + f"Verdict: `{result['top_level_verdict']}`", + "", + "## Seven-workstream result", + "", + f"1. Physical coil field: {coil['candidate_count']} direct-filament candidates executed; {coil['combined_pass_count']} passes. Best reduced candidate has mean iota {best['mean_iota']:.6f} and normalized maximum radial excursion {best['normalized_max_excursion_over_a']:.6f}. No coil is promoted.", + f"2. Finite-beta equilibrium: not run. Available production tools: {', '.join(available) if available else 'none'}. Unavailable: {', '.join(unavailable)}.", + "3. Coil/plasma co-design: reduced geometry/current scan executed; production single-stage co-design not run.", + f"4. Particle confinement: 3.5 MeV alpha gyroradius scope is {particles['maximum_pitch_alpha_gyroradius_m']:.6f} m, but no guiding-center retention is credited because the topology prerequisite fails.", + f"5. Burn: design-iota Q=20 screen requires H_ISS04 {burn['required_H_ISS04_with_bremsstrahlung_at_design_iota']:.6f} after the declared bremsstrahlung and alpha-deposition assumptions. It is not linked to a passing physical coil.", + "6. Magnet engineering: magnetic-pressure, stored-energy and centerline geometry scopes executed; peak conductor field, winding-pack FEA and quench qualification remain open.", + f"7. Reactor systems: exact D-T source and breeding-coverage constraints plus conditional plant ledger executed. Conditional net electric algebra is {systems['conditional_net_electric_MW']:.3f} MWe, with no prediction credit.", + "", + "## Heat result", + "", + f"Plasma exhaust in the declared Q=20 target ledger: **{heat['plasma_exhaust_power_MW']:.3f} MW**.", + f"Controlled radiation requirement: **{heat['controlled_radiation_MW']:.3f} MW**, producing a first-wall peak screen of **{heat['first_wall_peak_heat_flux_MW_m2']:.3f} MW/m2**.", + f"Divertor power: **{heat['divertor_power_MW']:.3f} MW**, producing a selected peak screen of **{heat['divertor_peak_heat_flux_MW_m2']:.3f} MW/m2** over 24 m2 effective wetted area.", + f"Divertor tungsten surface screen: **{heat['divertor_thermal_screen']['surface_temperature_C']:.1f} C**.", + f"First-wall surface screen: **{heat['selected_first_wall_screen']['nominal']['plasma_facing_surface_temperature_C']:.1f} C nominal**, **{heat['selected_first_wall_screen']['upset_steady_upper_bound']['plasma_facing_surface_temperature_C']:.1f} C at the declared 1 MW/m2 steady upper bound**.", + f"Water-loop screen: **{hydraulics['mass_flow_kg_s']:.1f} kg/s**, **{hydraulics['mean_channel_velocity_m_s']:.2f} m/s**, **{hydraulics['pumping_power_MW_screen']:.3f} MW** across 960 parallel channels.", + f"Selected heat-flux envelope pass: **{heat['nominal_and_declared_steady_heat_envelope_pass']}**.", + "", + "The heat result is a requirement-level resolution for nominal and declared steady conditions. Stable detachment, 3-D island footprints, critical heat flux, erosion, cyclic fatigue, disruptions, coolant accidents and component qualification remain unproven.", + "", + "## Scientific boundary", + "", + "Earned fusion-progress credit remains exactly **0.0** because no physical coil passes, no finite-beta equilibrium is solved, and no particle/transport or sustained-burn calculation is promoted.", + "", + ] + return "\n".join(lines) + + +def main() -> int: + config_path = ROOT / "configs/reactor/sfr4_integrated_physical_promotion_a.json" + raw = json.loads(config_path.read_text(encoding="utf-8")) + result = run_integrated_campaign(raw) + out = ROOT / "results/sfr4_integrated" + out.mkdir(parents=True, exist_ok=True) + (out / "sfr4_integrated_physical_promotion_a_v090.json").write_text( + json.dumps(result, indent=2, sort_keys=True) + "\n", encoding="utf-8" + ) + (out / "SFR4_INTEGRATED_PHYSICAL_PROMOTION_A_RESULT.md").write_text( + _summary(result), encoding="utf-8" + ) + print(json.dumps({ + "verdict": result["top_level_verdict"], + "output": str(out), + }, indent=2)) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/scripts/run_zero_arg_tests.py b/scripts/run_zero_arg_tests.py new file mode 100644 index 0000000..2de9df9 --- /dev/null +++ b/scripts/run_zero_arg_tests.py @@ -0,0 +1,97 @@ +#!/usr/bin/env python3 +"""Dependency-independent runner for this repository's fixture-free tests. + +The suite intentionally contains unittest.TestCase methods and pytest-compatible module +functions with no fixtures. This runner executes both forms and fails closed if a future +module-level test introduces parameters, preventing a silent skip when pytest is absent. +CI still installs and may run pytest independently. +""" +from __future__ import annotations + +import argparse +import inspect +import runpy +import sys +import traceback +import unittest +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[1] +sys.path.insert(0, str(ROOT / "src")) + + +def test_files(search_root: Path) -> list[Path]: + if search_root.is_file(): + return [search_root] + return sorted(search_root.rglob("test_*.py")) + + +def main() -> int: + parser = argparse.ArgumentParser() + parser.add_argument("path", nargs="?", default="tests") + args = parser.parse_args() + search_root = (ROOT / args.path).resolve() + try: + search_root.relative_to(ROOT) + except ValueError: + print("test path must remain inside the repository") + return 2 + files = test_files(search_root) + if not files: + print(f"no tests found under {search_root.relative_to(ROOT)}") + return 2 + + failures: list[str] = [] + executed = 0 + for index, path in enumerate(files): + module_name = f"_ixsf_test_{index}" + namespace = runpy.run_path(str(path), run_name=module_name) + + suite = unittest.TestSuite() + for value in namespace.values(): + if ( + inspect.isclass(value) + and issubclass(value, unittest.TestCase) + and value is not unittest.TestCase + and value.__module__ == module_name + ): + suite.addTests(unittest.defaultTestLoader.loadTestsFromTestCase(value)) + result = unittest.TestResult() + suite.run(result) + executed += result.testsRun + for case, detail in result.failures + result.errors: + failures.append(f"{path.relative_to(ROOT)}::{case}\n{detail}") + + for name, value in sorted(namespace.items()): + if not ( + name.startswith("test_") + and inspect.isfunction(value) + and value.__module__ == module_name + ): + continue + parameters = inspect.signature(value).parameters + if parameters: + failures.append( + f"{path.relative_to(ROOT)}::{name} uses unsupported fixture/parameters: " + + ", ".join(parameters) + ) + continue + executed += 1 + try: + value() + except Exception: # noqa: BLE001 + failures.append( + f"{path.relative_to(ROOT)}::{name}\n{traceback.format_exc()}" + ) + + if failures: + print(f"SELF-CONTAINED TEST SUITE: {executed - len(failures)} passed, {len(failures)} failed") + for failure in failures: + print(failure) + return 1 + print(f"SELF-CONTAINED TEST SUITE: {executed} passed, 0 failed") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/src/ix_stellaratorforge/__init__.py b/src/ix_stellaratorforge/__init__.py index 7e06463..ac18063 100644 --- a/src/ix_stellaratorforge/__init__.py +++ b/src/ix_stellaratorforge/__init__.py @@ -12,6 +12,20 @@ ) from .reactor import ReactorConfig, ReactorValidation, load_reactor_config, validate_reactor_config from .sfr2 import geometry_from_sector_lengths, run_sfr2_screen, validate_sfr2_config +from .sfr2_actuation import run_actuation_overlay_screen, validate_actuation_config +from .sfr3_field_integrity import ( + build_response_matrix, + run_sfr3_field_integrity_screen, + validate_sfr3_config, +) +from .sfr3_dual_boundary import ( + run_dual_boundary_screen, + validate_dual_boundary_config, +) +from .sfr4_integrated_campaign import ( + run_integrated_campaign, + validate_integrated_config, +) __all__ = [ "DTReactionLedger", @@ -27,5 +41,14 @@ "validate_reactor_config", "geometry_from_sector_lengths", "run_sfr2_screen", + "run_actuation_overlay_screen", + "build_response_matrix", + "run_sfr3_field_integrity_screen", + "run_dual_boundary_screen", + "validate_actuation_config", "validate_sfr2_config", + "validate_sfr3_config", + "validate_dual_boundary_config", + "run_integrated_campaign", + "validate_integrated_config", ] diff --git a/src/ix_stellaratorforge/cli.py b/src/ix_stellaratorforge/cli.py index e9ca650..6e9dd56 100644 --- a/src/ix_stellaratorforge/cli.py +++ b/src/ix_stellaratorforge/cli.py @@ -11,17 +11,76 @@ from .poc import run_sfr1_poc from .reactor import load_reactor_config, validate_reactor_config from .sfr2 import run_sfr2_screen +from .sfr2_actuation import run_actuation_overlay_screen +from .sfr3_field_integrity import run_sfr3_field_integrity_screen +from .sfr3_dual_boundary import run_dual_boundary_screen +from .sfr4_integrated_campaign import run_integrated_campaign def main() -> int: parser = argparse.ArgumentParser(prog="ix-stellaratorforge") - parser.add_argument("command", choices=("validate", "report", "closure", "max-closure", "poc", "sfr2-screen")) + parser.add_argument( + "command", + choices=( + "validate", + "report", + "closure", + "max-closure", + "poc", + "sfr2-screen", + "sfr2-actuation-screen", + "sfr3-field-integrity-screen", + "sfr3-dual-boundary-screen", + "sfr4-integrated-campaign", + ), + ) parser.add_argument("--config", default="configs/reactor/sfr1_rev_a.json") args = parser.parse_args() if args.command == "sfr2-screen": raw = json.loads(Path(args.config if args.config != "configs/reactor/sfr1_rev_a.json" else "configs/reactor/sfr2_rev_a.json").read_text(encoding="utf-8")) print(json.dumps(run_sfr2_screen(raw), indent=2, sort_keys=True)) return 0 + if args.command == "sfr2-actuation-screen": + config_path = ( + args.config + if args.config != "configs/reactor/sfr1_rev_a.json" + else "configs/reactor/sfr2_actuation_overlay_a.json" + ) + raw = json.loads(Path(config_path).read_text(encoding="utf-8")) + print(json.dumps(run_actuation_overlay_screen(raw), indent=2, sort_keys=True)) + return 0 + if args.command == "sfr3-field-integrity-screen": + config_path = ( + args.config + if args.config != "configs/reactor/sfr1_rev_a.json" + else "configs/reactor/sfr3_field_integrity_shell_a.json" + ) + raw = json.loads(Path(config_path).read_text(encoding="utf-8")) + print(json.dumps(run_sfr3_field_integrity_screen(raw), indent=2, sort_keys=True)) + return 0 + if args.command == "sfr3-dual-boundary-screen": + config_path = ( + args.config + if args.config != "configs/reactor/sfr1_rev_a.json" + else "configs/reactor/sfr3_dual_boundary_ahis_a.json" + ) + raw = json.loads(Path(config_path).read_text(encoding="utf-8")) + sfr3_raw = json.loads( + Path("configs/reactor/sfr3_field_integrity_shell_a.json").read_text( + encoding="utf-8" + ) + ) + print(json.dumps(run_dual_boundary_screen(raw, sfr3_raw), indent=2, sort_keys=True)) + return 0 + if args.command == "sfr4-integrated-campaign": + config_path = ( + args.config + if args.config != "configs/reactor/sfr1_rev_a.json" + else "configs/reactor/sfr4_integrated_physical_promotion_a.json" + ) + raw = json.loads(Path(config_path).read_text(encoding="utf-8")) + print(json.dumps(run_integrated_campaign(raw), indent=2, sort_keys=True)) + return 0 config = load_reactor_config(Path(args.config)) if args.command == "validate": verdict = validate_reactor_config(config) diff --git a/src/ix_stellaratorforge/sfr2_actuation.py b/src/ix_stellaratorforge/sfr2_actuation.py new file mode 100644 index 0000000..8192280 --- /dev/null +++ b/src/ix_stellaratorforge/sfr2_actuation.py @@ -0,0 +1,361 @@ +"""Low-authority phase-programmed magnetic-breathing screen for SFR-2. + +This module does not solve a time-dependent stellarator equilibrium or wave/plasma +interaction. It asks a narrower falsification question: if the existing SFR-2 Rev A +plasma inventory follows ideal monatomic adiabatic bookkeeping while auxiliary fields +change the sector cross-sectional areas, does any declared phase pattern improve both +the cycle-averaged optimistic ignition proxy and cycle-averaged fusion power? + +The primary HTS field, vessel and baseline ABAB geometry remain unchanged. No +magnetic-pumping, RF, shock, flux-compression, topology or three-body fusion credit is +invented. A tri-lobe boundary harmonic is area-normalized, so reshaping alone receives +zero thermodynamic credit. +""" +from __future__ import annotations + +from math import pi, radians, sin, sqrt +from typing import Any + +from .burn import DT_ALPHA_FRACTION, DT_ENERGY_J, bosch_hale_dt_reactivity, iss04_tau_E_s +from .sfr2 import ( + DT_NEUTRON_FRACTION, + GAMMA_MONATOMIC, + geometry_from_sector_lengths, + ideal_radial_compression_state, + optimistic_ignition_proxy, + solve_base_beta_for_target_fusion_power, +) + +AUTHORITY = "LOW__zero_D_adiabatic_cycle_plus_ISS04_screen__not_dynamic_equilibrium" + + +def weighted_volume_ratio( + *, + sector_lengths_ft: list[float], + depth_fraction: float, + phase_offsets_deg: list[float], + cycle_phase_rad: float, +) -> float: + """Return V(t)/V0 for sector radius factors 1-depth*sin(phase+offset). + + Each sector volume is proportional to its axis length times minor-radius squared. + This is geometry bookkeeping only; it does not assert that a realizable coil set can + produce the boundary or that pressure equilibrates instantaneously between sectors. + """ + if len(sector_lengths_ft) != len(phase_offsets_deg) or not sector_lengths_ft: + raise ValueError("sector lengths and phase offsets must have the same nonzero length") + if any(length <= 0 for length in sector_lengths_ft): + raise ValueError("sector lengths must be positive") + if not 0.0 <= depth_fraction <= 0.10: + raise ValueError("breathing depth must be within [0, 0.10]") + total_length = sum(sector_lengths_ft) + return sum( + length + * (1.0 - depth_fraction * sin(cycle_phase_rad + radians(offset))) ** 2 + for length, offset in zip(sector_lengths_ft, phase_offsets_deg, strict=True) + ) / total_length + + +def area_preserving_trilobe_geometry(amplitude_fraction: float) -> dict[str, float]: + """Describe r(theta)=a*N*(1+eps*cos(3 theta)) with conserved cross-section area. + + The unnormalized polar area is multiplied by 1+eps^2/2. N removes that area + change, isolating the three-lobe shape from global compression. Consequently this + harmonic earns no density, temperature, fusion-power or ignition-proxy credit here. + """ + if not 0.0 <= amplitude_fraction <= 0.20: + raise ValueError("tri-lobe amplitude must be within [0, 0.20]") + raw_area_ratio = 1.0 + 0.5 * amplitude_fraction**2 + normalization = 1.0 / sqrt(raw_area_ratio) + return { + "amplitude_fraction": amplitude_fraction, + "area_normalization": normalization, + "normalized_area_ratio": raw_area_ratio * normalization**2, + "minimum_radius_over_a": normalization * (1.0 - amplitude_fraction), + "maximum_radius_over_a": normalization * (1.0 + amplitude_fraction), + "thermodynamic_ignition_credit": 0.0, + } + + +def validate_actuation_config(raw: dict[str, Any]) -> tuple[str, ...]: + errors: list[str] = [] + try: + if raw["baseline_design_id"] != "SFR-2-RevA": + errors.append("actuation overlay must preserve SFR-2-RevA as its baseline") + if raw["mechanical_architecture"]["flexible_vacuum_vessel"]: + errors.append("the vacuum vessel must remain rigid") + if raw["mechanical_architecture"]["pulses_primary_hts_coils"]: + errors.append("the primary HTS confinement coils must remain steady") + study = raw["screen"] + geometry_from_sector_lengths( + study["sector_lengths_ft"], + screening_aspect_ratio=float(study["screening_aspect_ratio"]), + ) + if study["sector_pattern"] != "ABAB": + errors.append("baseline sector pattern must remain ABAB") + if study["sample_count_per_cycle"] < 360: + errors.append("cycle screen requires at least 360 samples") + if min(study["depth_fraction_sweep"]) < 0 or max(study["depth_fraction_sweep"]) > 0.05: + errors.append("declared breathing-depth sweep must remain within 0 to 5 percent") + patterns = study["phase_patterns_deg"] + if patterns["synchronous"] != [0, 0, 0, 0]: + errors.append("synchronous phase pattern is invalid") + if patterns["abab_opposed"] != [0, 180, 0, 180]: + errors.append("ABAB-opposed phase pattern is invalid") + if patterns["traveling_quadrature"] != [0, 90, 180, 270]: + errors.append("traveling-quadrature phase pattern is invalid") + tri = raw["concept_image_translation"] + if tri["global_toroidal_lobe_count"] != 3 or tri["baseline_field_periods"] != 4: + errors.append("the declared 3-lobe versus 4-field-period comparison changed") + if tri["credits_three_body_fusion"]: + errors.append("D-T fusion must not receive three-body collision credit") + if tri["credits_astrophysical_gravity_or_accretion"]: + errors.append("reactor screen must not credit astrophysical gravity or accretion") + if not tri["area_normalize_repeated_poloidal_m3"]: + errors.append("tri-lobe shape must be area-normalized before comparison") + for gate, status in raw["promotion_status"].items(): + if gate != "SFR2A_G0_OVERLAY_SPEC" and status != "NOT_RUN": + errors.append(f"{gate} must remain NOT_RUN without high-authority evidence") + except (KeyError, TypeError, ValueError) as exc: + errors.append(f"invalid SFR-2 actuation overlay config: {exc}") + return tuple(errors) + + +def _cycle_case( + *, + geometry: Any, + base: Any, + depth: float, + pattern_name: str, + phase_offsets_deg: list[float], + sector_lengths_ft: list[float], + axis_field_T: float, + iota_2over3: float, + sample_count: int, +) -> dict[str, Any]: + samples: list[dict[str, float]] = [] + for index in range(sample_count): + phase = 2.0 * pi * index / sample_count + volume_ratio = weighted_volume_ratio( + sector_lengths_ft=sector_lengths_ft, + depth_fraction=depth, + phase_offsets_deg=phase_offsets_deg, + cycle_phase_rad=phase, + ) + density_ratio = 1.0 / volume_ratio + density = base.ion_density_m3 * density_ratio + temperature = base.ion_temperature_keV * density_ratio ** (GAMMA_MONATOMIC - 1.0) + volume = base.volume_m3 * volume_ratio + pressure = base.pressure_Pa * density_ratio**GAMMA_MONATOMIC + beta = base.beta_at_fixed_B * density_ratio**GAMMA_MONATOMIC + reactivity = bosch_hale_dt_reactivity(temperature) + fusion_MW = 0.25 * density**2 * reactivity * DT_ENERGY_J * volume / 1.0e6 + alpha_MW = fusion_MW * DT_ALPHA_FRACTION + thermal_MJ = 1.5 * pressure * volume / 1.0e6 + effective_minor_radius = geometry.screening_minor_radius_m * sqrt(volume_ratio) + tau_iss04 = iss04_tau_E_s( + a_m=effective_minor_radius, + R_m=geometry.equivalent_major_radius_m, + absorbed_power_MW=alpha_MW, + ne_1e19_m3=density / 1.0e19, + B_T=axis_field_T, + iota=iota_2over3, + H=1.0, + ) + required_tau = thermal_MJ / alpha_MW + samples.append( + { + "cycle_phase_deg": 360.0 * index / sample_count, + "volume_ratio_to_baseline": volume_ratio, + "equivalent_radial_squeeze_fraction": 1.0 - sqrt(volume_ratio), + "ion_density_m3": density, + "ion_temperature_keV": temperature, + "beta_at_fixed_B": beta, + "fusion_power_MW_uniform": fusion_MW, + "alpha_heating_MW_uniform": alpha_MW, + "neutron_power_MW_uniform": fusion_MW * DT_NEUTRON_FRACTION, + "thermal_energy_MJ": thermal_MJ, + "optimistic_ignition_tau_ratio": tau_iss04 / required_tau, + } + ) + + def mean(key: str) -> float: + return sum(sample[key] for sample in samples) / len(samples) + + ratio_peak = max(samples, key=lambda sample: sample["optimistic_ignition_tau_ratio"]) + fusion_peak = max(samples, key=lambda sample: sample["fusion_power_MW_uniform"]) + avg_ratio = mean("optimistic_ignition_tau_ratio") + avg_fusion = mean("fusion_power_MW_uniform") + baseline_ratio = base._baseline_ignition_ratio # attached by run function; internal only + baseline_fusion = base.fusion_power_MW_uniform + return { + "pattern": pattern_name, + "phase_offsets_deg": phase_offsets_deg, + "depth_fraction": depth, + "cycle_average": { + "optimistic_ignition_tau_ratio": avg_ratio, + "distance_from_ratio_one_fraction": avg_ratio - 1.0, + "fusion_power_MW_uniform": avg_fusion, + "alpha_heating_MW_uniform": mean("alpha_heating_MW_uniform"), + "beta_at_fixed_B": mean("beta_at_fixed_B"), + }, + "full_cycle": { + "minimum_optimistic_ignition_tau_ratio": min(s["optimistic_ignition_tau_ratio"] for s in samples), + "maximum_optimistic_ignition_tau_ratio": ratio_peak["optimistic_ignition_tau_ratio"], + "minimum_fusion_power_MW_uniform": min(s["fusion_power_MW_uniform"] for s in samples), + "maximum_fusion_power_MW_uniform": fusion_peak["fusion_power_MW_uniform"], + "maximum_beta_at_fixed_B": max(s["beta_at_fixed_B"] for s in samples), + }, + "closest_instantaneous_proxy_point": ratio_peak, + "maximum_fusion_point": fusion_peak, + "screen_decision": { + "cycle_average_proxy_pass": avg_ratio >= 1.0, + "entire_cycle_proxy_pass": all(s["optimistic_ignition_tau_ratio"] >= 1.0 for s in samples), + "cycle_average_ratio_improves_over_baseline": avg_ratio > baseline_ratio, + "cycle_average_fusion_improves_over_baseline": avg_fusion > baseline_fusion, + "joint_average_improvement": avg_ratio > baseline_ratio and avg_fusion > baseline_fusion, + "net_power_claim_permitted": False, + }, + } + + +class _BaselineCarrier: + """Small mutable carrier used only to attach the baseline proxy to a state.""" + + def __init__(self, state: Any, ignition_ratio: float) -> None: + self.__dict__.update(state.__dict__) + self._baseline_ignition_ratio = ignition_ratio + + +def run_actuation_overlay_screen(raw: dict[str, Any]) -> dict[str, Any]: + errors = validate_actuation_config(raw) + if errors: + raise ValueError("; ".join(errors)) + screen = raw["screen"] + geometry = geometry_from_sector_lengths( + screen["sector_lengths_ft"], + screening_aspect_ratio=float(screen["screening_aspect_ratio"]), + ) + axis_field_T = float(screen["axis_field_T"]) + iota = float(screen["iota_2over3"]) + base_beta = solve_base_beta_for_target_fusion_power( + geometry=geometry, + base_temperature_keV=float(screen["base_temperature_keV"]), + axis_field_T=axis_field_T, + radial_squeeze_fraction=0.0, + target_fusion_power_MW=float(screen["target_fusion_power_MW"]), + ) + state = ideal_radial_compression_state( + geometry=geometry, + base_temperature_keV=float(screen["base_temperature_keV"]), + base_beta=base_beta, + axis_field_T=axis_field_T, + radial_squeeze_fraction=0.0, + ) + ignition = optimistic_ignition_proxy( + geometry=geometry, + state=state, + axis_field_T=axis_field_T, + iota_2over3=iota, + H_ISS04=1.0, + transient_confinement_retention=1.0, + ) + base = _BaselineCarrier(state, ignition.tau_ratio_to_optimistic_ignition) + + cases = [ + _cycle_case( + geometry=geometry, + base=base, + depth=float(depth), + pattern_name=name, + phase_offsets_deg=[float(value) for value in phases], + sector_lengths_ft=[float(value) for value in screen["sector_lengths_ft"]], + axis_field_T=axis_field_T, + iota_2over3=iota, + sample_count=int(screen["sample_count_per_cycle"]), + ) + for depth in screen["depth_fraction_sweep"] + for name, phases in screen["phase_patterns_deg"].items() + ] + active_cases = [case for case in cases if case["depth_fraction"] > 0.0] + closest_average = max( + active_cases, + key=lambda case: case["cycle_average"]["optimistic_ignition_tau_ratio"], + ) + closest_instantaneous = max( + active_cases, + key=lambda case: case["full_cycle"]["maximum_optimistic_ignition_tau_ratio"], + ) + + tri = raw["concept_image_translation"] + tri_cases = [ + area_preserving_trilobe_geometry(float(amplitude)) + for amplitude in tri["poloidal_m3_amplitude_fraction_sweep"] + ] + any_joint_improvement = any( + case["screen_decision"]["joint_average_improvement"] for case in active_cases + ) + any_average_pass = any( + case["screen_decision"]["cycle_average_proxy_pass"] for case in active_cases + ) + return { + "program": "IX-StellaratorForge", + "release": "0.6.0", + "study_id": raw["study_id"], + "baseline_design_id": raw["baseline_design_id"], + "authority": AUTHORITY, + "claim_boundary": raw["claim_boundary"], + "baseline": { + "axis_field_T": axis_field_T, + "iota_2over3": iota, + "base_temperature_keV": float(screen["base_temperature_keV"]), + "base_beta": base_beta, + "fusion_power_MW_uniform": state.fusion_power_MW_uniform, + "optimistic_ignition_tau_ratio": ignition.tau_ratio_to_optimistic_ignition, + "distance_from_ratio_one_fraction": ignition.tau_ratio_to_optimistic_ignition - 1.0, + }, + "model_rules": { + "baseline_geometry_changed": False, + "vacuum_vessel_flex_credit": 0.0, + "primary_hts_pulsing_credit": 0.0, + "magnetic_pumping_heating_credit": 0.0, + "rf_phase_heating_credit": 0.0, + "shock_heating_credit": 0.0, + "astrophysical_gravity_or_accretion_credit": 0.0, + "three_body_fusion_credit": 0.0, + "actuator_and_cryogenic_power_debited": False, + "thermodynamics": "fixed particle inventory; ideal monatomic adiabatic global-volume response", + "confinement": "instantaneous ISS04 geometry proxy; not valid as dynamic MHD evidence", + }, + "breathing_cases": cases, + "breathing_result": { + "closest_cycle_average_case": closest_average, + "closest_instantaneous_case": closest_instantaneous, + "any_joint_cycle_average_improvement": any_joint_improvement, + "any_cycle_average_proxy_pass": any_average_pass, + "verdict": ( + "NO_DECLARED_BREATHING_CASE_IMPROVES_BOTH_CYCLE_AVERAGE_PROXY_AND_FUSION_POWER" + if not any_joint_improvement + else "LOW_AUTHORITY_JOINT_IMPROVEMENT_REQUIRES_HIGH_AUTHORITY_REVIEW" + ), + }, + "concept_image_result": { + "useful_translation": "area-preserving poloidal m=3 actuator harmonic repeated in every one of the four ABAB field periods", + "global_three_toroidal_lobes_compatible_with_4fp_baseline": False, + "repeated_poloidal_m3_bookkeeping_compatible_with_4fp": True, + "three_point_collision_is_dt_fusion_mechanism": False, + "tri_lobe_cases": tri_cases, + "zero_D_closer_to_ignition_credit": 0.0, + "verdict": "IMAGE_SUGGESTS_A_TESTABLE_ACTUATOR_SYMMETRY_BUT_ADDS_NO_EARNED_FUSION_GAIN", + }, + "required_next_evidence": [ + "time-sliced free-boundary finite-beta equilibria over a complete actuation cycle", + "Poincare and island/stochasticity maps for every phase", + "coil-current solution plus eddy-current, force, fatigue, cooling and quench analysis", + "kinetic magnetic-pumping calculation resolving frequency, collisionality and phase lag", + "alpha-particle orbit confinement through the complete cycle", + "transport and nonlinear MHD response", + "actuator wall-plug power debit and integrated burn balance", + ], + "promotion_status": raw["promotion_status"], + } diff --git a/src/ix_stellaratorforge/sfr3_dual_boundary.py b/src/ix_stellaratorforge/sfr3_dual_boundary.py new file mode 100644 index 0000000..2da2d1c --- /dev/null +++ b/src/ix_stellaratorforge/sfr3_dual_boundary.py @@ -0,0 +1,369 @@ +"""Low-authority dual-boundary AHIS integration screen for SFR-3. + +The user-proposed "inside-out" AHIS is translated into two independently monitored +engineering boundaries. The inner boundary observes plasma-facing armor, first-wall +temperature/strain and coolant state. The outer boundary observes the double-wall +vacuum vessel, shield, supports and magnet alignment. Neither boundary mechanically +confines plasma. Corrective authority is limited to power rundown, coolant isolation, +safe hold and the already-declared SFR-3 synthetic trim-coil layer. + +The thermal calculation is one-dimensional steady conduction with declared effective +properties. The fault campaign is deterministic logic coverage. Neither is structural +FEA, CFD, neutronics, fracture mechanics, a safety case or physical confinement evidence. +""" +from __future__ import annotations + +from typing import Any + +from .sfr3_field_integrity import run_sfr3_field_integrity_screen + +AUTHORITY = ( + "LOW__1D_thermal_resistance_plus_deterministic_fault_logic__not_safety_or_confinement" +) +PASS_VERDICT = ( + "DUAL_BOUNDARY_ARCHITECTURE_SCREEN_PASS__PHYSICAL_SURVIVABILITY_AND_CONFINEMENT_UNPROVEN" +) +FAIL_VERDICT = "DUAL_BOUNDARY_ARCHITECTURE_SCREEN_REQUIREMENTS_NOT_MET" + + +def _thermal_case(stack: dict[str, Any], heat_flux_MW_m2: float) -> dict[str, Any]: + heat_flux_W_m2 = heat_flux_MW_m2 * 1.0e6 + coolant_C = float(stack["coolant_bulk_temperature_C"]) + h = float(stack["coolant_heat_transfer_coefficient_W_m2K"]) + film_r = 1.0 / h + film_delta = heat_flux_W_m2 * film_r + current_C = coolant_C + film_delta + interfaces_from_coolant: list[dict[str, Any]] = [] + layer_results_by_id: dict[str, dict[str, Any]] = {} + for layer in reversed(stack["solid_layers_plasma_to_coolant"]): + resistance = float(layer["thickness_m"]) / float(layer["effective_k_W_mK"]) + delta = heat_flux_W_m2 * resistance + cold_C = current_C + current_C += delta + result = { + "layer_id": layer["id"], + "material": layer["material"], + "cold_face_temperature_C": cold_C, + "hot_face_temperature_C": current_C, + "temperature_rise_K": delta, + "thermal_resistance_m2K_W": resistance, + "declared_max_service_temperature_C": float( + layer["declared_max_service_temperature_C"] + ), + "temperature_screen_pass": current_C + <= float(layer["declared_max_service_temperature_C"]), + } + interfaces_from_coolant.append(result) + layer_results_by_id[layer["id"]] = result + plasma_order = [ + layer_results_by_id[layer["id"]] + for layer in stack["solid_layers_plasma_to_coolant"] + ] + solid_resistance = sum( + float(layer["thickness_m"]) / float(layer["effective_k_W_mK"]) + for layer in stack["solid_layers_plasma_to_coolant"] + ) + surface_C = current_C + cte_values = [ + float(layer["effective_cte_per_K"]) + for layer in stack["solid_layers_plasma_to_coolant"] + ] + mismatch_strain = (max(cte_values) - min(cte_values)) * (surface_C - coolant_C) + return { + "heat_flux_MW_m2": heat_flux_MW_m2, + "coolant_bulk_temperature_C": coolant_C, + "coolant_film_temperature_rise_K": film_delta, + "solid_thermal_resistance_m2K_W": solid_resistance, + "total_thermal_resistance_m2K_W": solid_resistance + film_r, + "plasma_facing_surface_temperature_C": surface_C, + "layers_plasma_to_coolant": plasma_order, + "all_layer_temperature_screens_pass": all( + layer["temperature_screen_pass"] for layer in plasma_order + ), + "raw_cte_mismatch_strain_proxy": mismatch_strain, + "raw_cte_mismatch_strain_screen_pass": mismatch_strain + <= float(stack["maximum_raw_cte_mismatch_strain_proxy"]), + } + + +def evaluate_stack(stack: dict[str, Any], thermal_screen: dict[str, Any]) -> dict[str, Any]: + nominal = _thermal_case(stack, float(thermal_screen["nominal_heat_flux_MW_m2"])) + upset = _thermal_case(stack, float(thermal_screen["upset_heat_flux_MW_m2"])) + gates = stack["integration_gates"] + weighted_score = sum( + float(thermal_screen["decision_weights"][key]) * int(bool(value)) + for key, value in gates.items() + ) + weighted_score += float(thermal_screen["decision_weights"]["thermal_screen_pass"]) * int( + nominal["all_layer_temperature_screens_pass"] + and upset["all_layer_temperature_screens_pass"] + and upset["raw_cte_mismatch_strain_screen_pass"] + ) + return { + "id": stack["id"], + "name": stack["name"], + "status": stack["status"], + "nominal": nominal, + "upset_steady_upper_bound": upset, + "integration_gates": gates, + "declared_weighted_architecture_score": weighted_score, + "physical_qualification_complete": False, + "direct_plasma_confinement_credit": 0.0, + } + + +def _monitoring_inventory(geometry: dict[str, Any]) -> dict[str, int]: + sectors = int(geometry["toroidal_control_sectors"]) + nodes = int(geometry["poloidal_locations_per_sector"]) + lanes = int(geometry["independent_sensor_lanes"]) + paired_locations = sectors * nodes + localized = ( + paired_locations + * lanes + * ( + len(geometry["inner_localized_sensor_types"]) + + len(geometry["outer_localized_sensor_types"]) + ) + ) + sector_channels = sectors * lanes * len(geometry["sector_sensor_types"]) + hard_vacuum = int(geometry["field_periods"]) * int( + geometry["hard_vacuum_channels_per_field_period"] + ) + return { + "paired_inner_outer_monitoring_locations": paired_locations, + "localized_sensing_elements": localized, + "sector_sensing_elements": sector_channels, + "independent_hard_vacuum_channels": hard_vacuum, + "total_declared_sensing_elements": localized + sector_channels + hard_vacuum, + } + + +def _signal_detected( + signal: str, + failed_channels: set[str], + signal_channels: dict[str, list[str]], +) -> tuple[bool, list[str]]: + candidates = signal_channels.get(signal, []) + surviving = [channel for channel in candidates if channel not in failed_channels] + return bool(surviving), surviving + + +def _fault_state( + scenario: dict[str, Any], + *, + signal_channels: dict[str, list[str]], + sfr3_nominal: dict[str, Any], +) -> dict[str, Any]: + failed = set(scenario["failed_channels"]) + detections: dict[str, dict[str, Any]] = {} + for signal in scenario["event_signals"]: + detected, surviving = _signal_detected(signal, failed, signal_channels) + detections[signal] = { + "detected": detected, + "surviving_channels": surviving, + } + all_signals_detected = all(value["detected"] for value in detections.values()) + latent = bool(scenario["latent_fault_without_declared_signal"]) + field_link: dict[str, Any] = { + "requested": False, + "available": False, + "synthetic_rms_reduction_fraction": 0.0, + "physical_confinement_credit": 0.0, + } + + signals = set(scenario["event_signals"]) + if scenario["total_control_power_lost"]: + state = "PASSIVE_HARD_SAFE_HOLD" + elif scenario["observability_lost"]: + state = "SAFE_HOLD_LOST_OBSERVABILITY" + elif latent and not signals: + state = "NO_AUTOMATIC_DETECTION__PERIODIC_NDE_REQUIRED" + elif not all_signals_detected: + state = "SAFE_HOLD_INCOMPLETE_EVENT_OBSERVABILITY" + elif {"vacuum_loss", "coolant_leak"} & signals: + state = "ISOLATE_AFFECTED_SECTOR_AND_SAFE_HOLD" + elif "inner_temperature" in signals: + state = "CONTROLLED_POWER_RUNDOWN_AND_INSPECT" + elif {"outer_displacement", "flux_error"}.issubset(signals): + field_link["requested"] = True + field_link["available"] = bool(scenario["sfr3_active_trim_available"]) + if scenario["sfr3_active_trim_available"]: + state = "ACTIVE_TRIM_THEN_CONTROLLED_INSPECTION" + field_link["synthetic_rms_reduction_fraction"] = float( + sfr3_nominal["total_rms_reduction_fraction"] + ) + else: + state = "SAFE_HOLD_ALIGNMENT_ERROR_UNCORRECTED" + elif failed: + state = "DEGRADED_MONITORING_SINGLE_LANE_RETAINED" + else: + state = "NOMINAL" + + return { + "id": scenario["id"], + "description": scenario["description"], + "event_signals": scenario["event_signals"], + "failed_channels": scenario["failed_channels"], + "detections": detections, + "all_declared_signals_detected": all_signals_detected, + "control_state": state, + "expected_control_state": scenario["expected_control_state"], + "expected_state_pass": state == scenario["expected_control_state"], + "latent_fault_retained_without_false_detection": latent and not signals, + "sfr3_field_integrity_link": field_link, + "mechanical_inward_plasma_force_credit": 0.0, + "fusion_or_ignition_credit": 0.0, + } + + +def validate_dual_boundary_config(raw: dict[str, Any]) -> tuple[str, ...]: + errors: list[str] = [] + try: + if raw["baseline_overlay_id"] != "SFR3-FIELD-INTEGRITY-SHELL-A": + errors.append("dual boundary must remain an overlay on SFR-3 Field Integrity Shell A") + if raw["architecture"]["mechanically_pushes_plasma_inward"]: + errors.append("the monitored wall cannot receive inward plasma-force credit") + if not raw["architecture"]["vacuum_vessel_is_double_walled"]: + errors.append("the requested architecture requires a double-wall vacuum vessel") + geometry = raw["monitoring_geometry"] + if int(geometry["field_periods"]) != 4: + errors.append("the preserved four-field-period baseline changed") + if int(geometry["toroidal_control_sectors"]) != 24: + errors.append("dual-boundary sectors must align with the 24 SFR-3 trim channels") + if int(geometry["independent_sensor_lanes"]) != 2: + errors.append("two independent sensor lanes are required") + inventory = _monitoring_inventory(geometry) + if inventory["paired_inner_outer_monitoring_locations"] != 192: + errors.append("monitoring geometry must contain 192 paired locations") + stack_ids = [stack["id"] for stack in raw["wall_stack_candidates"]] + if len(stack_ids) != 3 or len(set(stack_ids)) != 3: + errors.append("exactly three unique wall-stack candidates are required") + if raw["selected_stack_id"] not in stack_ids: + errors.append("selected wall stack is missing") + required_scenarios = { + "nominal", + "inner_hotspot_single_lane_failure", + "coolant_leak_single_lane_failure", + "outer_support_shift", + "inner_lane_a_loss", + "outer_lane_a_loss", + "sector_dual_bus_loss", + "vacuum_breach", + "total_control_power_loss", + "silent_armor_crack", + "support_shift_trim_unavailable", + } + scenario_ids = {scenario["id"] for scenario in raw["fault_scenarios"]} + if scenario_ids != required_scenarios: + errors.append("the complete eleven-scenario fault campaign changed") + boundary = raw["claim_boundary"] + for key in ( + "mechanical_plasma_confinement_credit", + "magnetic_confinement_gain_credit", + "fusion_power_gain_credit", + "ignition_gain_credit", + "safety_qualification_credit", + ): + if float(boundary[key]) != 0.0: + errors.append(f"{key} must remain zero") + promotion = raw["promotion_status"] + allowed = { + "SFR3D_G0_DUAL_BOUNDARY_SPEC": "PASS_SPEC_ONLY", + "SFR3D_G1_REDUCED_THERMAL_AND_FAULT_SCREEN": "PASS_LOW_AUTHORITY_SYNTHETIC_ONLY", + } + for gate, status in promotion.items(): + if gate in allowed: + if status != allowed[gate]: + errors.append(f"{gate} must be {allowed[gate]}") + elif status != "NOT_RUN": + errors.append(f"{gate} must remain NOT_RUN") + except (KeyError, TypeError, ValueError) as exc: + errors.append(f"invalid dual-boundary config: {exc}") + return tuple(errors) + + +def run_dual_boundary_screen( + raw: dict[str, Any], sfr3_raw: dict[str, Any] +) -> dict[str, Any]: + errors = validate_dual_boundary_config(raw) + if errors: + raise ValueError("; ".join(errors)) + sfr3 = run_sfr3_field_integrity_screen(sfr3_raw) + sfr3_by_id = {scenario["id"]: scenario for scenario in sfr3["scenarios"]} + stack_results = [ + evaluate_stack(stack, raw["thermal_screen"]) + for stack in raw["wall_stack_candidates"] + ] + stack_by_id = {stack["id"]: stack for stack in stack_results} + selected = stack_by_id[raw["selected_stack_id"]] + best_score = max(stack["declared_weighted_architecture_score"] for stack in stack_results) + selected_stack_pass = ( + selected["declared_weighted_architecture_score"] == best_score + and selected["nominal"]["all_layer_temperature_screens_pass"] + and selected["upset_steady_upper_bound"]["all_layer_temperature_screens_pass"] + and selected["upset_steady_upper_bound"]["raw_cte_mismatch_strain_screen_pass"] + ) + scenarios = [ + _fault_state( + scenario, + signal_channels=raw["signal_channels"], + sfr3_nominal=sfr3_by_id["nominal"], + ) + for scenario in raw["fault_scenarios"] + ] + scenario_logic_pass = all(scenario["expected_state_pass"] for scenario in scenarios) + by_id = {scenario["id"]: scenario for scenario in scenarios} + single_lane_faults_detected = all( + by_id[scenario_id]["all_declared_signals_detected"] + for scenario_id in ( + "inner_hotspot_single_lane_failure", + "coolant_leak_single_lane_failure", + ) + ) + silent_fault_honest = by_id["silent_armor_crack"][ + "latent_fault_retained_without_false_detection" + ] and by_id["silent_armor_crack"]["control_state"].startswith("NO_AUTOMATIC_DETECTION") + field_link_no_overclaim = ( + by_id["outer_support_shift"]["sfr3_field_integrity_link"][ + "synthetic_rms_reduction_fraction" + ] + > 0.0 + and by_id["outer_support_shift"]["sfr3_field_integrity_link"][ + "physical_confinement_credit" + ] + == 0.0 + ) + screen_pass = all( + ( + selected_stack_pass, + scenario_logic_pass, + single_lane_faults_detected, + silent_fault_honest, + field_link_no_overclaim, + ) + ) + return { + "program": "IX-StellaratorForge", + "release": "0.8.0", + "study_id": raw["study_id"], + "baseline_overlay_id": raw["baseline_overlay_id"], + "authority": AUTHORITY, + "top_level_verdict": PASS_VERDICT if screen_pass else FAIL_VERDICT, + "screen_pass": screen_pass, + "architecture": raw["architecture"], + "monitoring_inventory": _monitoring_inventory(raw["monitoring_geometry"]), + "wall_stack_results": stack_results, + "selected_stack_id": raw["selected_stack_id"], + "selected_stack_screen_pass": selected_stack_pass, + "fault_scenarios": scenarios, + "requirement_results": { + "selected_stack_is_top_ranked_in_declared_reduced_screen": selected_stack_pass, + "all_expected_fault_states_reproduce": scenario_logic_pass, + "declared_single_lane_faults_retain_detection": single_lane_faults_detected, + "silent_armor_crack_is_not_falsely_detected": silent_fault_honest, + "sfr3_trim_link_remains_synthetic_only": field_link_no_overclaim, + }, + "claim_boundary": raw["claim_boundary"], + "promotion_status": raw["promotion_status"], + "next_required_evidence": raw["next_required_evidence"], + } diff --git a/src/ix_stellaratorforge/sfr3_field_integrity.py b/src/ix_stellaratorforge/sfr3_field_integrity.py new file mode 100644 index 0000000..338414e --- /dev/null +++ b/src/ix_stellaratorforge/sfr3_field_integrity.py @@ -0,0 +1,370 @@ +"""Low-authority harmonic controllability screen for the SFR-3 field-integrity shell. + +The screen translates useful patterns from the donor repositories into a fusion-specific +architecture without importing their unrelated material physics. A deterministic +Fourier response matrix asks whether a distributed trim-coil set has enough *synthetic* +authority to reduce a declared normal-field-error challenge. Passive superconducting +loops attenuate only the declared time-varying component. A resource gate suppresses +active commands when sensing, power, thermal or quench state is unacceptable. + +This is not a Biot-Savart coil design, free-boundary equilibrium, island calculation, +particle-orbit calculation, transport model, MHD result, neutronics model or hardware +demonstration. It earns zero confinement, fusion-power or ignition credit. +""" +from __future__ import annotations + +from math import cos, exp, pi, sin, sqrt +from typing import Any + +import numpy as np + +AUTHORITY = "LOW__synthetic_linear_harmonic_controllability__not_physical_confinement" +PASS_VERDICT = ( + "SYNTHETIC_HARMONIC_CONTROL_DEMONSTRATED__PHYSICAL_CONFINEMENT_UNPROVEN" +) +FAIL_VERDICT = "SYNTHETIC_HARMONIC_CONTROL_REQUIREMENTS_NOT_MET" + + +def _rms(values: np.ndarray) -> float: + return float(np.sqrt(np.mean(np.square(values)))) + + +def build_response_matrix(screen: dict[str, Any]) -> np.ndarray: + """Return the deterministic dimensionless mode/actuator response matrix. + + Actuator positions follow a declared helical index around a toroidal array. The + exponential factor is only a transparent gap/spectral attenuation heuristic. It + must eventually be replaced by a field solver response matrix. + """ + count = int(screen["actuator_count"]) + field_periods = int(screen["field_periods"]) + helical_index = int(screen["actuator_helical_index"]) + gap_factor = float(screen["gap_attenuation_factor"]) + response_scale = float(screen["response_per_full_command_units"]) + rows: list[list[float]] = [] + for mode in screen["modes"]: + m = int(mode["m"]) + n = int(mode["n"]) + attenuation = exp(-gap_factor * sqrt(m * m + (n / field_periods) ** 2)) + cosine_row: list[float] = [] + sine_row: list[float] = [] + for index in range(count): + phi = 2.0 * pi * index / count + theta = 2.0 * pi * ((helical_index * index) % count) / count + phase = m * theta - n * phi + cosine_row.append(response_scale * attenuation * cos(phase)) + sine_row.append(response_scale * attenuation * sin(phase)) + rows.extend((cosine_row, sine_row)) + return np.asarray(rows, dtype=float) + + +def validate_sfr3_config(raw: dict[str, Any]) -> tuple[str, ...]: + errors: list[str] = [] + try: + if raw["baseline_design_id"] != "SFR-1-RevA": + errors.append("SFR-3 must remain an overlay on SFR-1-RevA") + architecture = raw["architecture"] + if not architecture["primary_field_is_steady"]: + errors.append("the primary stellarator field must remain steady") + if architecture["vacuum_vessel_is_flexible"]: + errors.append("the vacuum vessel must remain rigid") + if architecture["passive_material_claimed_to_confine_plasma"]: + errors.append("passive material cannot receive plasma-confinement credit") + screen = raw["harmonic_screen"] + count = int(screen["actuator_count"]) + if count < 2 * len(screen["modes"]): + errors.append("actuator count must be at least twice the harmonic count") + if count < 12 or count > 256: + errors.append("actuator count must remain within the declared screening range") + if int(screen["field_periods"]) != 4: + errors.append("the SFR-1 four-field-period baseline changed") + if not 0.0 < float(screen["passive_transient_attenuation_fraction"]) < 1.0: + errors.append("passive transient attenuation must be strictly between zero and one") + if float(screen["max_abs_command"]) <= 0.0: + errors.append("trim-coil command limit must be positive") + coefficient_count = 2 * len(screen["modes"]) + for name in ("static_error_coefficients", "transient_error_coefficients"): + if len(screen[name]) != coefficient_count: + errors.append(f"{name} must contain cosine/sine coefficients for every mode") + matrix = build_response_matrix(screen) + if matrix.shape != (coefficient_count, count): + errors.append("response matrix shape is inconsistent") + if np.linalg.matrix_rank(matrix) < coefficient_count: + errors.append("declared trim array does not span every screened harmonic") + scenario_ids = [scenario["id"] for scenario in raw["scenarios"]] + required = { + "nominal", + "single_actuator_unavailable", + "low_sensor_confidence", + "passive_loop_quench", + "active_coil_quench", + "thermal_margin_exhausted", + "passive_transient_only", + } + if not required.issubset(scenario_ids): + errors.append("required nominal, fault and passive-only scenarios are missing") + promotion = raw["promotion_status"] + allowed = { + "SFR3_G0_ARCHITECTURE_SPEC": "PASS_SPEC_ONLY", + "SFR3_G1_SYNTHETIC_CONTROLLABILITY": "PASS_LOW_AUTHORITY_SYNTHETIC_ONLY", + } + for gate, status in promotion.items(): + if gate in allowed: + if status != allowed[gate]: + errors.append(f"{gate} must be {allowed[gate]}") + elif status != "NOT_RUN": + errors.append(f"{gate} must remain NOT_RUN without higher-authority evidence") + boundary = raw["claim_boundary"] + for key in ( + "confinement_gain_credit", + "fusion_power_gain_credit", + "ignition_gain_credit", + "net_electric_gain_credit", + ): + if float(boundary[key]) != 0.0: + errors.append(f"{key} must remain zero") + except (KeyError, TypeError, ValueError) as exc: + errors.append(f"invalid SFR-3 field-integrity config: {exc}") + return tuple(errors) + + +def _resource_gate( + scenario: dict[str, Any], thresholds: dict[str, Any] +) -> tuple[bool, list[str]]: + reasons: list[str] = [] + if not scenario["active_correction_requested"]: + reasons.append("active correction not requested") + if float(scenario["sensor_confidence"]) < float(thresholds["minimum_sensor_confidence"]): + reasons.append("sensor confidence below threshold") + if not scenario["trim_power_available"]: + reasons.append("trim power unavailable") + if float(scenario["trim_thermal_margin_fraction"]) < float( + thresholds["minimum_trim_thermal_margin_fraction"] + ): + reasons.append("trim thermal margin below threshold") + if scenario["active_coil_quench_detected"]: + reasons.append("active-coil quench detected") + if not scenario["independent_watchdog_healthy"]: + reasons.append("independent watchdog unhealthy") + return not reasons, reasons + + +def _bounded_ridge_solution( + matrix: np.ndarray, + error: np.ndarray, + *, + failed_actuators: list[int], + regularization: float, + max_abs_command: float, +) -> tuple[np.ndarray, dict[str, Any]]: + available = matrix.copy() + for index in failed_actuators: + available[:, index] = 0.0 + lhs = available.T @ available + regularization * np.eye(available.shape[1]) + command = np.linalg.solve(lhs, -(available.T @ error)) + unconstrained_peak = float(np.max(np.abs(command))) + scaled_to_limit = unconstrained_peak > max_abs_command + if scaled_to_limit: + command *= max_abs_command / unconstrained_peak + nonfailed = [index for index in range(matrix.shape[1]) if index not in failed_actuators] + available_singular_values = np.linalg.svd(available[:, nonfailed], compute_uv=False) + regularized_condition = float( + np.linalg.cond(available @ available.T + regularization * np.eye(available.shape[0])) + ) + diagnostics = { + "failed_actuators": failed_actuators, + "unconstrained_peak_command": unconstrained_peak, + "scaled_to_command_limit": scaled_to_limit, + "peak_command_utilization": float(np.max(np.abs(command)) / max_abs_command), + "available_response_rank": int(np.linalg.matrix_rank(available[:, nonfailed])), + "available_response_singular_values": [float(value) for value in available_singular_values], + "regularized_condition_number": regularized_condition, + } + return command, diagnostics + + +def _evaluate_scenario( + scenario: dict[str, Any], + *, + screen: dict[str, Any], + thresholds: dict[str, Any], + matrix: np.ndarray, +) -> dict[str, Any]: + static = np.asarray(screen["static_error_coefficients"], dtype=float) * float( + scenario["static_error_scale"] + ) + transient = np.asarray(screen["transient_error_coefficients"], dtype=float) * float( + scenario["transient_error_scale"] + ) + initial = static + transient + passive_healthy = bool(scenario["passive_loops_available"]) and not bool( + scenario["passive_loop_quench_detected"] + ) + passive_fraction = ( + float(screen["passive_transient_attenuation_fraction"]) if passive_healthy else 0.0 + ) + after_passive = static + transient * (1.0 - passive_fraction) + active_allowed, gate_reasons = _resource_gate(scenario, thresholds) + if active_allowed: + command, diagnostics = _bounded_ridge_solution( + matrix, + after_passive, + failed_actuators=[int(value) for value in scenario["failed_actuator_indices"]], + regularization=float(screen["ridge_regularization"]), + max_abs_command=float(screen["max_abs_command"]), + ) + final = after_passive + matrix @ command + state = "ACTIVE_TRIM" + else: + command = np.zeros(matrix.shape[1]) + final = after_passive + state = "PASSIVE_ONLY_SAFE_HOLD" if passive_healthy else "BASELINE_SAFE_HOLD" + diagnostics = { + "failed_actuators": [int(value) for value in scenario["failed_actuator_indices"]], + "unconstrained_peak_command": 0.0, + "scaled_to_command_limit": False, + "peak_command_utilization": 0.0, + "available_response_rank": None, + "available_response_singular_values": [], + "regularized_condition_number": None, + } + initial_rms = _rms(initial) + after_passive_rms = _rms(after_passive) + final_rms = _rms(final) + passive_reduction = 0.0 if initial_rms == 0.0 else 1.0 - after_passive_rms / initial_rms + final_reduction = 0.0 if initial_rms == 0.0 else 1.0 - final_rms / initial_rms + coefficient_unit = float(screen["coefficient_unit_Bn_over_Baxis"]) + return { + "id": scenario["id"], + "description": scenario["description"], + "control_state": state, + "active_correction_allowed": active_allowed, + "resource_gate_reasons": gate_reasons, + "passive_loops_healthy": passive_healthy, + "passive_transient_attenuation_fraction_applied": passive_fraction, + "initial_error_rms_coefficient_units": initial_rms, + "after_passive_error_rms_coefficient_units": after_passive_rms, + "final_error_rms_coefficient_units": final_rms, + "initial_error_rms_Bn_over_Baxis": initial_rms * coefficient_unit, + "final_error_rms_Bn_over_Baxis": final_rms * coefficient_unit, + "passive_only_rms_reduction_fraction": passive_reduction, + "total_rms_reduction_fraction": final_reduction, + "commands": [float(value) for value in command], + "diagnostics": diagnostics, + "fusion_or_ignition_credit": 0.0, + } + + +def run_sfr3_field_integrity_screen(raw: dict[str, Any]) -> dict[str, Any]: + """Run the declared SFR-3 screen and return a deterministic evidence artifact.""" + errors = validate_sfr3_config(raw) + if errors: + raise ValueError("; ".join(errors)) + screen = raw["harmonic_screen"] + matrix = build_response_matrix(screen) + scenarios = [ + _evaluate_scenario( + scenario, + screen=screen, + thresholds=raw["resource_gate_thresholds"], + matrix=matrix, + ) + for scenario in raw["scenarios"] + ] + by_id = {scenario["id"]: scenario for scenario in scenarios} + nominal = by_id["nominal"] + single_failure = by_id["single_actuator_unavailable"] + passive_only = by_id["passive_transient_only"] + nominal_pass = ( + nominal["active_correction_allowed"] + and nominal["total_rms_reduction_fraction"] + >= float(screen["minimum_nominal_rms_reduction_fraction"]) + and nominal["diagnostics"]["regularized_condition_number"] + <= float(screen["maximum_regularized_condition_number"]) + ) + single_failure_pass = ( + single_failure["active_correction_allowed"] + and single_failure["total_rms_reduction_fraction"] + >= float(screen["minimum_single_failure_rms_reduction_fraction"]) + ) + passive_transient_pass = ( + not passive_only["active_correction_allowed"] + and passive_only["passive_only_rms_reduction_fraction"] + >= float(screen["minimum_passive_transient_reduction_fraction"]) + ) + low_confidence_safe = ( + by_id["low_sensor_confidence"]["control_state"] == "PASSIVE_ONLY_SAFE_HOLD" + and not by_id["low_sensor_confidence"]["active_correction_allowed"] + ) + loop_quench_safe = ( + by_id["passive_loop_quench"]["control_state"] == "ACTIVE_TRIM" + and not by_id["passive_loop_quench"]["passive_loops_healthy"] + ) + active_quench_safe = ( + by_id["active_coil_quench"]["control_state"] == "PASSIVE_ONLY_SAFE_HOLD" + and not by_id["active_coil_quench"]["active_correction_allowed"] + ) + thermal_margin_safe = ( + by_id["thermal_margin_exhausted"]["control_state"] == "PASSIVE_ONLY_SAFE_HOLD" + and not by_id["thermal_margin_exhausted"]["active_correction_allowed"] + ) + screen_pass = all( + ( + nominal_pass, + single_failure_pass, + passive_transient_pass, + low_confidence_safe, + loop_quench_safe, + active_quench_safe, + thermal_margin_safe, + ) + ) + return { + "program": "IX-StellaratorForge", + "release": "0.7.0", + "study_id": raw["study_id"], + "baseline_design_id": raw["baseline_design_id"], + "authority": AUTHORITY, + "top_level_verdict": PASS_VERDICT if screen_pass else FAIL_VERDICT, + "screen_pass": screen_pass, + "architecture": raw["architecture"], + "claim_boundary": raw["claim_boundary"], + "model_definition": { + "field_periods": int(screen["field_periods"]), + "actuator_count": int(screen["actuator_count"]), + "mode_count": len(screen["modes"]), + "coefficient_count": 2 * len(screen["modes"]), + "coefficient_unit_Bn_over_Baxis": float(screen["coefficient_unit_Bn_over_Baxis"]), + "response_matrix_rank": int(np.linalg.matrix_rank(matrix)), + "response_matrix_shape": list(matrix.shape), + "response_matrix_source": "deterministic analytic heuristic; replace with Biot-Savart/free-boundary response", + "passive_loops_have_dc_correction_credit": False, + }, + "requirements": { + "nominal_rms_reduction_fraction": float( + screen["minimum_nominal_rms_reduction_fraction"] + ), + "single_failure_rms_reduction_fraction": float( + screen["minimum_single_failure_rms_reduction_fraction"] + ), + "passive_transient_reduction_fraction": float( + screen["minimum_passive_transient_reduction_fraction"] + ), + "maximum_regularized_condition_number": float( + screen["maximum_regularized_condition_number"] + ), + }, + "requirement_results": { + "nominal_synthetic_controllability_pass": nominal_pass, + "single_actuator_failure_pass": single_failure_pass, + "passive_transient_screen_pass": passive_transient_pass, + "low_confidence_enters_safe_hold": low_confidence_safe, + "passive_loop_quench_isolated_without_active_overclaim": loop_quench_safe, + "active_coil_quench_enters_passive_only_safe_hold": active_quench_safe, + "thermal_margin_loss_enters_passive_only_safe_hold": thermal_margin_safe, + }, + "scenarios": scenarios, + "donor_translation": raw["donor_translation"], + "promotion_status": raw["promotion_status"], + "next_required_evidence": raw["next_required_evidence"], + } diff --git a/src/ix_stellaratorforge/sfr4_integrated_campaign.py b/src/ix_stellaratorforge/sfr4_integrated_campaign.py new file mode 100644 index 0000000..e4548d2 --- /dev/null +++ b/src/ix_stellaratorforge/sfr4_integrated_campaign.py @@ -0,0 +1,560 @@ +"""SFR-4 integrated physical-promotion and heat-exhaust campaign. + +This module attempts all seven requested computational workstreams with the strongest +methods available in the release runtime. It uses direct filament Biot-Savart fields, +field-line integration, Bosch-Hale D-T reactivity, ISS04 confinement scaling, exact +source bookkeeping, one-dimensional thermal resistance, and deterministic hydraulic +and fault envelopes. It fails closed where DESC, VMEC++, SIMSOPT, OpenMC, kinetic +transport, structural FEA, or physical qualification are required. + +Passing a reduced screen can down-select an architecture. It cannot demonstrate +equilibrium, confinement, ignition, component life, safety, or fusion. +""" +from __future__ import annotations + +from dataclasses import asdict +import importlib.util +from math import pi, sqrt +from typing import Any + +import numpy as np + +from .burn import ( + DT_ALPHA_FRACTION, + confinement_requirement, + iss04_tau_E_s, + uniform_dt_burn_point, +) +from .coil_hybrid import helical_hybrid_coil_screen +from .coil_screen import _poloidal_loop +from .hts_screen import screen_curve_geometry +from .neutronics_constraints import breeding_coverage_constraint +from .physics import dt_reaction_ledger +from .sfr3_dual_boundary import evaluate_stack +from .vacuum_codesign import evaluate_helical_architecture + +AUTHORITY = ( + "MIXED_LOW_AND_INTERMEDIATE__DIRECT_FILAMENT_BIOT_SAVART_PLUS_ANALYTICAL_" + "THERMAL_HYDRAULIC_BURN_AND_SOURCE_SCREENS__NOT_PRODUCTION_PHYSICS" +) +PASS_VERDICT = ( + "INTEGRATED_REDUCED_CAMPAIGN_COMPLETE__NOMINAL_HEAT_ENVELOPE_SCREEN_PASS__" + "PHYSICAL_COIL_EQUILIBRIUM_CONFINEMENT_AND_FUSION_UNPROVEN" +) +FAIL_VERDICT = ( + "INTEGRATED_REDUCED_CAMPAIGN_COMPLETE__ONE_OR_MORE_REDUCED_GATES_FAIL__" + "NO_FUSION_PROMOTION" +) + +E_CHARGE = 1.602176634e-19 +ALPHA_MASS_KG = 6.6446573357e-27 +MU0 = 4e-7 * pi + + +def solver_availability() -> dict[str, bool]: + return { + name: importlib.util.find_spec(name) is not None + for name in ( + "desc", + "vmecpp", + "simsopt", + "openmc", + "dolfinx", + "fenics", + "gmsh", + "cadquery", + ) + } + + +def _expanded_coil_scan(raw: dict[str, Any]) -> dict[str, Any]: + scan = raw["coil_field_scan"] + results: list[dict[str, Any]] = [] + for nfp in scan["field_periods"]: + for pattern in scan["sign_patterns"]: + for ratio in scan["helical_to_tf_current_ratios"]: + result = evaluate_helical_architecture( + nfp=int(nfp), + R=float(scan["major_radius_m"]), + a=float(scan["minor_radius_m"]), + clearance_m=float(scan["plasma_to_coil_clearance_m"]), + target_B_T=float(scan["axis_field_T"]), + helical_coil_count=int(scan["helical_coil_count"]), + sign_pattern=str(pattern), + helical_to_tf_current_ratio=float(ratio), + turns=int(scan["field_line_turns"]), + steps_per_turn=int(scan["steps_per_turn"]), + iota_min=float(scan["iota_acceptance"][0]), + iota_max=float(scan["iota_acceptance"][1]), + max_excursion_fraction=float(scan["max_excursion_fraction"]), + ) + results.append(asdict(result)) + + def score(item: dict[str, Any]) -> tuple[float, float, float]: + target = float(scan["iota_target"]) + excursion_penalty = max( + 0.0, + float(item["normalized_max_excursion_over_a"]) + - float(scan["max_excursion_fraction"]), + ) + return ( + abs(float(item["mean_iota"]) - target) + 3.0 * excursion_penalty, + float(item["normalized_max_excursion_over_a"]), + abs(float(item["helical_to_tf_current_ratio"])), + ) + + best = min(results, key=score) + hybrid = helical_hybrid_coil_screen( + nfp=int(best["nfp"]), + R=float(scan["major_radius_m"]), + a=float(scan["minor_radius_m"]), + clearance_m=float(scan["plasma_to_coil_clearance_m"]), + target_B_T=float(scan["axis_field_T"]), + reconstruction_rms_limit=float(scan["normal_field_rms_limit"]), + ) + coil_r = float(scan["minor_radius_m"]) + float(scan["plasma_to_coil_clearance_m"]) + tf_curve = _poloidal_loop( + 0.0, float(scan["major_radius_m"]), coil_r, nseg=240 + ) + hts_geometry = screen_curve_geometry( + tf_curve, + strain_target_fraction=float(scan["rebco_strain_target_fraction"]), + strain_ceiling_fraction=float(scan["rebco_strain_ceiling_fraction"]), + ) + return { + "candidate_count": len(results), + "best_candidate": best, + "combined_pass_count": sum(bool(x["combined_screen_pass"]) for x in results), + "held_out_hybrid_reconstruction": asdict(hybrid), + "tf_centerline_geometry": asdict(hts_geometry), + "physical_coil_promoted": bool( + best["combined_screen_pass"] + and hybrid.passes_reconstruction_screen + and hts_geometry.passes_geometry_strain_proxy + ), + "authority": "direct_filament_Biot_Savart_and_field_line_screen_not_MHD_equilibrium", + } + + +def _alpha_orbit_scope(raw: dict[str, Any], coil: dict[str, Any]) -> dict[str, Any]: + cfg = raw["particle_screen"] + energy_J = float(cfg["alpha_energy_MeV"]) * 1.0e6 * E_CHARGE + speed = sqrt(2.0 * energy_J / ALPHA_MASS_KG) + charge = 2.0 * E_CHARGE + field = float(raw["coil_field_scan"]["axis_field_T"]) + gyro = ALPHA_MASS_KG * speed / (charge * field) + a = float(raw["coil_field_scan"]["minor_radius_m"]) + best = coil["best_candidate"] + field_line_gate = bool(best["combined_screen_pass"]) + return { + "alpha_energy_MeV": float(cfg["alpha_energy_MeV"]), + "alpha_speed_m_s_nonrelativistic": speed, + "maximum_pitch_alpha_gyroradius_m": gyro, + "gyroradius_over_minor_radius": gyro / a, + "gyroradius_clearance_screen_pass": gyro / a + <= float(cfg["maximum_gyroradius_over_minor_radius"]), + "field_line_topology_prerequisite_pass": field_line_gate, + "particle_confinement_promoted": False, + "reason": ( + "A gyroradius scale and vacuum field-line test cannot establish guiding-center " + "alpha retention. The physical coil candidate also fails its combined topology gate." + ), + "required_external_evidence": [ + "finite_beta_equilibrium", + "Boozer_coordinates", + "collisionless_and_collisional_guiding_center_orbits", + "neoclassical_transport", + "gyrokinetic_transport", + ], + "authority": "alpha_gyroradius_scope_only_not_orbit_retention", + } + + +def _radiation_MW(*, electron_density_m3: float, temperature_keV: float, + volume_m3: float, zeff: float) -> float: + # Common hydrogenic bremsstrahlung engineering approximation with T in keV. + return 5.35e-37 * zeff * electron_density_m3**2 * sqrt(temperature_keV) * volume_m3 / 1e6 + + +def _burn_and_confinement(raw: dict[str, Any], coil: dict[str, Any]) -> dict[str, Any]: + cfg = raw["burn_screen"] + R = float(raw["coil_field_scan"]["major_radius_m"]) + a = float(raw["coil_field_scan"]["minor_radius_m"]) + B = float(raw["coil_field_scan"]["axis_field_T"]) + volume = 2.0 * pi**2 * R * a**2 + burn = uniform_dt_burn_point( + temperature_keV=float(cfg["temperature_keV"]), + beta=float(cfg["beta"]), + field_T=B, + volume_m3=volume, + target_fusion_power_MW=float(cfg["target_fusion_power_MW"]), + ) + design_iota = float(cfg["design_iota_for_requirement_only"]) + physical_iota = max(float(coil["best_candidate"]["mean_iota"]), 1.0e-3) + q_design = confinement_requirement( + burn=burn, + major_radius_m=R, + minor_radius_m=a, + iota_screen=design_iota, + plasma_gain_Q=float(cfg["plasma_gain_Q"]), + ) + q_physical = confinement_requirement( + burn=burn, + major_radius_m=R, + minor_radius_m=a, + iota_screen=physical_iota, + plasma_gain_Q=float(cfg["plasma_gain_Q"]), + ) + brem = _radiation_MW( + electron_density_m3=burn.ion_density_m3, + temperature_keV=burn.temperature_keV, + volume_m3=burn.volume_m3, + zeff=float(cfg["zeff"]), + ) + alpha_MW = burn.target_fusion_power_MW * DT_ALPHA_FRACTION + deposited_alpha = alpha_MW * float(cfg["alpha_deposition_fraction_assumption"]) + auxiliary = burn.target_fusion_power_MW / float(cfg["plasma_gain_Q"]) + available = deposited_alpha + auxiliary - brem + required_tau_with_brem = ( + q_design.total_thermal_energy_MJ / available if available > 0 else float("inf") + ) + h_with_brem = required_tau_with_brem / q_design.iss04_tau_E_H1_s + return { + "uniform_burn_point": asdict(burn), + "design_iota_requirement": asdict(q_design), + "best_physical_coil_iota_requirement": asdict(q_physical), + "bremsstrahlung_MW_screen": brem, + "deposited_alpha_heating_MW_assumption": deposited_alpha, + "auxiliary_heating_MW": auxiliary, + "net_heating_after_bremsstrahlung_MW": available, + "required_tau_E_with_bremsstrahlung_s": required_tau_with_brem, + "required_H_ISS04_with_bremsstrahlung_at_design_iota": h_with_brem, + "physical_coil_linked_burn_promoted": False, + "reason": "The best direct-filament coil fails topology; a design-iota burn target cannot be assigned to it.", + "authority": "uniform_Bosch_Hale_plus_ISS04_and_bremsstrahlung_screen_not_transport_or_burn_simulation", + } + + +def _layer_temperatures( + *, heat_flux_MW_m2: float, coolant_C: float, h_W_m2K: float, + layers_coolant_to_surface: list[dict[str, Any]], +) -> dict[str, Any]: + q = heat_flux_MW_m2 * 1.0e6 + temperature = coolant_C + q / h_W_m2K + interfaces = [{"location": "coolant_film_wall", "temperature_C": temperature}] + pass_all = True + for layer in layers_coolant_to_surface: + temperature += q * float(layer["thickness_m"]) / float(layer["k_W_mK"]) + layer_pass = temperature <= float(layer["declared_max_temperature_C"]) + interfaces.append( + { + "layer": layer["id"], + "outer_temperature_C": temperature, + "declared_max_temperature_C": float(layer["declared_max_temperature_C"]), + "temperature_screen_pass": layer_pass, + } + ) + pass_all = pass_all and layer_pass + return { + "heat_flux_MW_m2": heat_flux_MW_m2, + "surface_temperature_C": temperature, + "interfaces": interfaces, + "all_temperature_screens_pass": pass_all, + } + + +def _heat_exhaust(raw: dict[str, Any], burn: dict[str, Any]) -> dict[str, Any]: + cfg = raw["heat_exhaust"] + target_fusion = float(raw["burn_screen"]["target_fusion_power_MW"]) + alpha = target_fusion * DT_ALPHA_FRACTION + auxiliary = target_fusion / float(raw["burn_screen"]["plasma_gain_Q"]) + exhaust = alpha * float(raw["burn_screen"]["alpha_deposition_fraction_assumption"]) + auxiliary + radiation_fraction = float(cfg["controlled_radiation_fraction"]) + radiated = exhaust * radiation_fraction + divertor = exhaust - radiated + R = float(raw["coil_field_scan"]["major_radius_m"]) + a = float(raw["coil_field_scan"]["minor_radius_m"]) + first_wall_area = 4.0 * pi**2 * R * a * float(cfg["first_wall_area_multiplier"]) + wall_peak = radiated / first_wall_area * float(cfg["first_wall_peaking_factor"]) + target_peak = ( + divertor + / float(cfg["effective_divertor_wetted_area_m2"]) + * float(cfg["divertor_peaking_factor"]) + ) + first_wall_limit = float(cfg["first_wall_nominal_limit_MW_m2"]) + divertor_limit = float(cfg["divertor_steady_limit_MW_m2"]) + minimum_radiation_for_selected_area = max( + 0.0, + 1.0 + - divertor_limit + * float(cfg["effective_divertor_wetted_area_m2"]) + / (exhaust * float(cfg["divertor_peaking_factor"])), + ) + maximum_radiation_from_first_wall_limit = min( + 1.0, + first_wall_limit + * first_wall_area + / (exhaust * float(cfg["first_wall_peaking_factor"])), + ) + minimum_area_at_selected_radiation = ( + exhaust + * (1.0 - radiation_fraction) + * float(cfg["divertor_peaking_factor"]) + / divertor_limit + ) + sensitivity: list[dict[str, Any]] = [] + for radiation in cfg["radiation_fraction_sensitivity"]: + for area in cfg["wetted_area_sensitivity_m2"]: + q_wall = exhaust * float(radiation) / first_wall_area * float( + cfg["first_wall_peaking_factor"] + ) + q_target = exhaust * (1.0 - float(radiation)) / float(area) * float( + cfg["divertor_peaking_factor"] + ) + sensitivity.append( + { + "controlled_radiation_fraction": float(radiation), + "effective_wetted_area_m2": float(area), + "first_wall_peak_MW_m2": q_wall, + "divertor_peak_MW_m2": q_target, + "heat_flux_limits_pass": bool( + q_wall <= first_wall_limit and q_target <= divertor_limit + ), + } + ) + + divertor_thermal = _layer_temperatures( + heat_flux_MW_m2=target_peak, + coolant_C=float(cfg["divertor_coolant_bulk_temperature_C"]), + h_W_m2K=float(cfg["divertor_heat_transfer_coefficient_W_m2K"]), + layers_coolant_to_surface=cfg["divertor_layers_coolant_to_surface"], + ) + water = cfg["divertor_water_loop"] + cp = float(water["specific_heat_J_kgK"]) + delta_T = float(water["outlet_minus_inlet_K"]) + mass_flow = divertor * 1e6 / (cp * delta_T) + channels = int(water["parallel_channels"]) + area_channel = float(water["channel_width_m"]) * float(water["channel_height_m"]) + velocity = mass_flow / (float(water["density_kg_m3"]) * channels * area_channel) + hydraulic_diameter = 2.0 * float(water["channel_width_m"]) * float(water["channel_height_m"]) / ( + float(water["channel_width_m"]) + float(water["channel_height_m"]) + ) + dynamic_pressure = 0.5 * float(water["density_kg_m3"]) * velocity**2 + pressure_drop = ( + float(water["darcy_friction_factor"]) + * float(water["channel_length_m"]) + / hydraulic_diameter + * dynamic_pressure + + float(water["minor_loss_coefficient"]) * dynamic_pressure + ) + pumping = pressure_drop * (mass_flow / float(water["density_kg_m3"])) / float(water["pump_efficiency"]) / 1e6 + + first_wall_stack = raw["selected_first_wall_stack"] + first_wall = evaluate_stack( + first_wall_stack, + { + "nominal_heat_flux_MW_m2": wall_peak, + "upset_heat_flux_MW_m2": float(cfg["first_wall_upset_heat_flux_MW_m2"]), + "decision_weights": raw["first_wall_decision_weights"], + }, + ) + steady_pass = all( + ( + wall_peak <= first_wall_limit, + target_peak <= divertor_limit, + divertor_thermal["all_temperature_screens_pass"], + first_wall["nominal"]["all_layer_temperature_screens_pass"], + first_wall["upset_steady_upper_bound"]["all_layer_temperature_screens_pass"], + velocity <= float(water["maximum_velocity_m_s"]), + pumping <= float(water["maximum_pumping_power_MW"]), + ) + ) + return { + "plasma_exhaust_power_MW": exhaust, + "controlled_radiation_MW": radiated, + "divertor_power_MW": divertor, + "first_wall_effective_area_m2": first_wall_area, + "first_wall_peak_heat_flux_MW_m2": wall_peak, + "divertor_peak_heat_flux_MW_m2": target_peak, + "heat_partition_feasibility_window": { + "minimum_controlled_radiation_fraction_at_selected_area": minimum_radiation_for_selected_area, + "maximum_controlled_radiation_fraction_from_first_wall_limit": maximum_radiation_from_first_wall_limit, + "minimum_effective_wetted_area_m2_at_selected_radiation": minimum_area_at_selected_radiation, + "selected_point_inside_flux_window": bool( + minimum_radiation_for_selected_area + <= radiation_fraction + <= maximum_radiation_from_first_wall_limit + and float(cfg["effective_divertor_wetted_area_m2"]) + >= minimum_area_at_selected_radiation + ), + }, + "heat_partition_sensitivity": sensitivity, + "divertor_thermal_screen": divertor_thermal, + "selected_first_wall_screen": first_wall, + "divertor_hydraulics": { + "mass_flow_kg_s": mass_flow, + "parallel_channels": channels, + "mean_channel_velocity_m_s": velocity, + "pressure_drop_Pa_screen": pressure_drop, + "pumping_power_MW_screen": pumping, + }, + "nominal_and_declared_steady_heat_envelope_pass": steady_pass, + "transient_disruption_heat_resolved": False, + "water_PbLi_separation_requirement": cfg["water_PbLi_separation_requirement"], + "heat_verdict": ( + "NOMINAL_AND_DECLARED_STEADY_HEAT_ENVELOPE_SCREEN_PASS__DETACHMENT_" + "EDGE_TOPOLOGY_TRANSIENTS_FATIGUE_AND_HARDWARE_UNPROVEN" + if steady_pass + else "DECLARED_HEAT_ENVELOPE_SCREEN_FAIL" + ), + "authority": "power_partition_plus_1D_conduction_and_hydraulics_not_edge_plasma_CFD_FEA_or_CHF_qualification", + } + + +def _magnet_engineering(raw: dict[str, Any], coil: dict[str, Any]) -> dict[str, Any]: + cfg = raw["magnet_engineering"] + B = float(raw["coil_field_scan"]["axis_field_T"]) + magnetic_pressure = B**2 / (2.0 * MU0) + R = float(raw["coil_field_scan"]["major_radius_m"]) + a = float(raw["coil_field_scan"]["minor_radius_m"]) + plasma_volume = 2.0 * pi**2 * R * a**2 + stored_proxy = magnetic_pressure * plasma_volume / 1e9 + current = float(coil["best_candidate"]["tf_current_MA_turn_per_filament"]) + return { + "magnetic_pressure_MPa_axis_field_proxy": magnetic_pressure / 1e6, + "stored_magnetic_energy_GJ_plasma_volume_proxy": stored_proxy, + "best_candidate_tf_current_MA_turn_per_filament": current, + "centerline_geometry_screen_pass": bool(coil["tf_centerline_geometry"]["passes_geometry_strain_proxy"]), + "declared_peak_field_on_conductor_limit_T": float(cfg["peak_field_on_conductor_limit_T"]), + "peak_field_on_conductor_calculated": False, + "quench_protection_qualified": False, + "structural_FEA_completed": False, + "magnet_promoted": False, + "authority": "magnetic_pressure_energy_and_centerline_geometry_scope_not_winding_pack_or_support_FEA", + } + + +def _reactor_systems(raw: dict[str, Any], heat: dict[str, Any]) -> dict[str, Any]: + cfg = raw["reactor_systems"] + target = float(raw["burn_screen"]["target_fusion_power_MW"]) + ledger = dt_reaction_ledger(target) + breeding = breeding_coverage_constraint( + fusion_power_MW=target, + global_tbr_target=float(cfg["global_tbr_target"]), + coverage_fraction=float(cfg["breeding_coverage_fraction"]), + ) + thermal = target * float(cfg["blanket_energy_multiplier"]) + gross = thermal * float(cfg["gross_thermal_efficiency"]) + recirc = float(cfg["base_recirculating_power_MW"]) + float( + heat["divertor_hydraulics"]["pumping_power_MW_screen"] + ) + net = gross - recirc + return { + "dt_source_ledger": asdict(ledger), + "breeding_coverage_constraint": asdict(breeding), + "conditional_thermal_power_MW": thermal, + "conditional_gross_electric_MW": gross, + "conditional_recirculating_power_MW": recirc, + "conditional_net_electric_MW": net, + "full_3D_TBR_calculated": False, + "net_electric_prediction_promoted": False, + "authority": "exact_source_and_conditional_plant_ledger_not_3D_neutronics_or_integrated_plant", + } + + +def validate_integrated_config(raw: dict[str, Any]) -> tuple[str, ...]: + errors: list[str] = [] + try: + if raw["schema_version"] != "0.9.0": + errors.append("schema_version must be 0.9.0") + if raw["study_id"] != "SFR4-INTEGRATED-PHYSICAL-PROMOTION-A": + errors.append("unexpected study_id") + if set(raw["workstreams"]) != { + "physical_coil_field", + "finite_beta_equilibrium", + "coil_plasma_codesign", + "particle_confinement", + "self_consistent_burn", + "magnet_engineering", + "reactor_systems", + }: + errors.append("all seven workstreams are required") + if float(raw["claim_boundary"]["fusion_progress_credit_fraction"]) != 0.0: + errors.append("fusion progress credit must remain zero before promotion") + if not raw["heat_exhaust"]["water_PbLi_separation_requirement"]: + errors.append("water divertor and PbLi blanket require independent double boundaries") + if float(raw["heat_exhaust"]["divertor_steady_limit_MW_m2"]) > 10.0: + errors.append("declared steady divertor limit may not exceed 10 MW/m2") + if int(raw["heat_exhaust"]["divertor_water_loop"]["parallel_channels"]) < 100: + errors.append("divertor channel count is not reactor distributed") + except (KeyError, TypeError, ValueError) as exc: + errors.append(f"invalid integrated config: {exc}") + return tuple(errors) + + +def run_integrated_campaign(raw: dict[str, Any]) -> dict[str, Any]: + errors = validate_integrated_config(raw) + if errors: + raise ValueError("; ".join(errors)) + solvers = solver_availability() + coil = _expanded_coil_scan(raw) + particles = _alpha_orbit_scope(raw, coil) + burn = _burn_and_confinement(raw, coil) + heat = _heat_exhaust(raw, burn) + magnets = _magnet_engineering(raw, coil) + systems = _reactor_systems(raw, heat) + equilibrium = { + "desc_available": solvers["desc"], + "vmecpp_available": solvers["vmecpp"], + "cross_code_equilibrium_completed": False, + "status": "NOT_RUN__PRODUCTION_SOLVERS_UNAVAILABLE_IN_BUILD_RUNTIME", + "fail_closed": True, + } + codesign = { + "direct_filament_candidate_count": coil["candidate_count"], + "simsopt_available": solvers["simsopt"], + "production_single_stage_codesign_completed": False, + "status": "REDUCED_SCAN_EXECUTED__PRODUCTION_CODESIGN_NOT_RUN", + } + reduced_complete = all( + ( + coil["candidate_count"] > 0, + heat["nominal_and_declared_steady_heat_envelope_pass"], + systems["conditional_net_electric_MW"] > 0.0, + equilibrium["fail_closed"], + not particles["particle_confinement_promoted"], + not magnets["magnet_promoted"], + ) + ) + return { + "program": "IX-StellaratorForge", + "release": "0.9.0", + "study_id": raw["study_id"], + "authority": AUTHORITY, + "top_level_verdict": PASS_VERDICT if reduced_complete else FAIL_VERDICT, + "reduced_campaign_complete": reduced_complete, + "solver_availability": solvers, + "workstreams": { + "1_physical_coil_field": coil, + "2_finite_beta_equilibrium": equilibrium, + "3_coil_plasma_codesign": codesign, + "4_particle_confinement": particles, + "5_self_consistent_burn": burn, + "6_magnet_engineering": magnets, + "7_reactor_systems": systems, + }, + "heat_exhaust_resolution": heat, + "promotion_summary": { + "nominal_and_declared_steady_heat_envelope_screen_pass": heat[ + "nominal_and_declared_steady_heat_envelope_pass" + ], + "production_equilibrium_pass": False, + "physical_confinement_pass": False, + "sustained_burn_pass": False, + "magnet_qualification_pass": False, + "full_3D_TBR_pass": False, + "hardware_pass": False, + "earned_fusion_progress_credit_fraction": 0.0, + }, + "claim_boundary": raw["claim_boundary"], + } diff --git a/tests/reactor/test_release_contracts.py b/tests/reactor/test_release_contracts.py index 0ac2e9d..5944758 100644 --- a/tests/reactor/test_release_contracts.py +++ b/tests/reactor/test_release_contracts.py @@ -28,3 +28,45 @@ def test_external_solver_matrix_is_explicitly_unexecuted() -> None: matrix = json.loads((ROOT / "external_solvers/g1_candidate_matrix.json").read_text(encoding="utf-8")) assert matrix["executed"] is False assert len(matrix["candidates"]) == 5 + + +def test_sfr3_bom_has_52_unique_rows_and_explicit_rejection_classes() -> None: + with (ROOT / "BOM/SFR3_FIELD_INTEGRITY_SHELL_BOM.csv").open( + newline="", encoding="utf-8" + ) as f: + rows = list(csv.DictReader(f)) + assert len(rows) == 52 + assert len({row["ID"] for row in rows}) == 52 + assert {"KEEP", "ADAPT", "NEW", "DEFER", "REJECT", "SEPARATE"}.issubset( + {row["Disposition"] for row in rows} + ) + + +def test_dual_boundary_bom_has_64_unique_rows_and_explicit_dispositions() -> None: + with (ROOT / "BOM/SFR3_DUAL_BOUNDARY_AHIS_BOM.csv").open( + newline="", encoding="utf-8" + ) as f: + rows = list(csv.DictReader(f)) + assert len(rows) == 64 + assert len({row["ID"] for row in rows}) == 64 + assert {"KEEP", "ADAPT", "NEW", "DEFER", "REJECT", "SEPARATE"}.issubset( + {row["Disposition"] for row in rows} + ) + + +def test_sfr4_integrated_bom_has_64_unique_rows_and_all_workstreams() -> None: + with (ROOT / "BOM/SFR4_INTEGRATED_PROMOTION_BOM.csv").open( + newline="", encoding="utf-8" + ) as f: + rows = list(csv.DictReader(f)) + assert len(rows) == 64 + assert len({row["id"] for row in rows}) == 64 + assert { + "physical_coil_field", + "finite_beta_equilibrium", + "coil_plasma_codesign", + "particle_confinement", + "self_consistent_burn", + "magnet_and_heat", + "reactor_systems", + } == {row["workstream"] for row in rows} diff --git a/tests/reactor/test_sfr2_actuation_overlay.py b/tests/reactor/test_sfr2_actuation_overlay.py new file mode 100644 index 0000000..bd70c4d --- /dev/null +++ b/tests/reactor/test_sfr2_actuation_overlay.py @@ -0,0 +1,94 @@ +from __future__ import annotations + +import json +import math +from pathlib import Path + +from ix_stellaratorforge.sfr2_actuation import ( + area_preserving_trilobe_geometry, + run_actuation_overlay_screen, + validate_actuation_config, + weighted_volume_ratio, +) + +ROOT = Path(__file__).resolve().parents[2] + + +def _config() -> dict: + return json.loads( + (ROOT / "configs/reactor/sfr2_actuation_overlay_a.json").read_text(encoding="utf-8") + ) + + +def test_overlay_preserves_rigid_vessel_steady_hts_and_open_high_authority_gates() -> None: + raw = _config() + assert validate_actuation_config(raw) == () + assert raw["mechanical_architecture"]["flexible_vacuum_vessel"] is False + assert raw["mechanical_architecture"]["pulses_primary_hts_coils"] is False + assert raw["promotion_status"]["SFR2A_G0_OVERLAY_SPEC"] == "PASS_SPEC_ONLY" + assert all( + status == "NOT_RUN" + for gate, status in raw["promotion_status"].items() + if gate != "SFR2A_G0_OVERLAY_SPEC" + ) + + +def test_traveling_quadrature_has_no_first_order_global_compression() -> None: + values = [ + weighted_volume_ratio( + sector_lengths_ft=[23.0, 26.0, 23.0, 26.0], + depth_fraction=0.05, + phase_offsets_deg=[0.0, 90.0, 180.0, 270.0], + cycle_phase_rad=2.0 * math.pi * index / 720, + ) + for index in range(720) + ] + assert min(values) > 1.0011 + assert max(values) < 1.0014 + assert max(values) - min(values) < 0.0002 + + +def test_area_normalized_m3_trilobe_gets_zero_thermodynamic_credit() -> None: + shape = area_preserving_trilobe_geometry(0.10) + assert math.isclose(shape["normalized_area_ratio"], 1.0, rel_tol=0, abs_tol=1e-15) + assert shape["minimum_radius_over_a"] < 0.90 + assert shape["maximum_radius_over_a"] > 1.09 + assert shape["thermodynamic_ignition_credit"] == 0.0 + + +def test_breathing_screen_rejects_joint_cycle_average_improvement() -> None: + result = run_actuation_overlay_screen(_config()) + assert result["baseline_design_id"] == "SFR-2-RevA" + assert math.isclose( + result["baseline"]["optimistic_ignition_tau_ratio"], + 0.9610772489928403, + rel_tol=1e-12, + ) + breathing = result["breathing_result"] + assert breathing["verdict"] == ( + "NO_DECLARED_BREATHING_CASE_IMPROVES_BOTH_CYCLE_AVERAGE_PROXY_AND_FUSION_POWER" + ) + assert breathing["any_joint_cycle_average_improvement"] is False + assert breathing["any_cycle_average_proxy_pass"] is False + closest = breathing["closest_cycle_average_case"] + assert closest["pattern"] == "traveling_quadrature" + assert closest["depth_fraction"] == 0.05 + assert 0.9615 < closest["cycle_average"]["optimistic_ignition_tau_ratio"] < 0.9616 + assert closest["cycle_average"]["fusion_power_MW_uniform"] < 1000.0 + + +def test_image_translation_does_not_claim_three_body_or_global_three_lobe_gain() -> None: + image = run_actuation_overlay_screen(_config())["concept_image_result"] + assert image["global_three_toroidal_lobes_compatible_with_4fp_baseline"] is False + assert image["repeated_poloidal_m3_bookkeeping_compatible_with_4fp"] is True + assert image["three_point_collision_is_dt_fusion_mechanism"] is False + assert image["zero_D_closer_to_ignition_credit"] == 0.0 + + +def test_persisted_overlay_result_matches_recomputation() -> None: + expected = json.loads( + (ROOT / "results/sfr2_actuation/sfr2_actuation_overlay_a_v060.json").read_text( + encoding="utf-8" + ) + ) + assert run_actuation_overlay_screen(_config()) == expected diff --git a/tests/reactor/test_sfr3_dual_boundary.py b/tests/reactor/test_sfr3_dual_boundary.py new file mode 100644 index 0000000..ec8d3bb --- /dev/null +++ b/tests/reactor/test_sfr3_dual_boundary.py @@ -0,0 +1,120 @@ +from __future__ import annotations + +import json +from pathlib import Path + +from ix_stellaratorforge.sfr3_dual_boundary import ( + PASS_VERDICT, + run_dual_boundary_screen, + validate_dual_boundary_config, +) + +ROOT = Path(__file__).resolve().parents[2] + + +def _configs() -> tuple[dict, dict]: + raw = json.loads( + (ROOT / "configs/reactor/sfr3_dual_boundary_ahis_a.json").read_text( + encoding="utf-8" + ) + ) + sfr3 = json.loads( + (ROOT / "configs/reactor/sfr3_field_integrity_shell_a.json").read_text( + encoding="utf-8" + ) + ) + return raw, sfr3 + + +def test_dual_boundary_preserves_magnetic_not_mechanical_confinement() -> None: + raw, _ = _configs() + assert validate_dual_boundary_config(raw) == () + assert raw["architecture"]["vacuum_vessel_is_double_walled"] is True + assert raw["architecture"]["mechanically_pushes_plasma_inward"] is False + assert all( + value == 0.0 + for key, value in raw["claim_boundary"].items() + if key.endswith("_credit") + ) + + +def test_monitoring_geometry_has_two_lanes_and_192_paired_locations() -> None: + raw, sfr3 = _configs() + result = run_dual_boundary_screen(raw, sfr3) + inventory = result["monitoring_inventory"] + assert inventory["paired_inner_outer_monitoring_locations"] == 192 + assert inventory["total_declared_sensing_elements"] == 1736 + + +def test_selected_dcll_stack_passes_declared_1d_thermal_screens() -> None: + raw, sfr3 = _configs() + result = run_dual_boundary_screen(raw, sfr3) + selected = next( + stack + for stack in result["wall_stack_results"] + if stack["id"] == result["selected_stack_id"] + ) + assert selected["id"] == "DB-A_DCLL_MONITORED_RAFT" + assert selected["nominal"]["all_layer_temperature_screens_pass"] is True + assert selected["upset_steady_upper_bound"]["all_layer_temperature_screens_pass"] is True + assert selected["upset_steady_upper_bound"]["raw_cte_mismatch_strain_screen_pass"] is True + assert 420.0 < selected["nominal"]["plasma_facing_surface_temperature_C"] < 421.0 + assert 632.0 < selected["upset_steady_upper_bound"]["plasma_facing_surface_temperature_C"] < 634.0 + + +def test_fault_logic_keeps_single_lane_detection_and_fails_closed() -> None: + raw, sfr3 = _configs() + result = run_dual_boundary_screen(raw, sfr3) + by_id = {scenario["id"]: scenario for scenario in result["fault_scenarios"]} + assert by_id["inner_hotspot_single_lane_failure"]["all_declared_signals_detected"] is True + assert by_id["coolant_leak_single_lane_failure"]["all_declared_signals_detected"] is True + assert by_id["sector_dual_bus_loss"]["control_state"] == "SAFE_HOLD_LOST_OBSERVABILITY" + assert by_id["vacuum_breach"]["control_state"] == "ISOLATE_AFFECTED_SECTOR_AND_SAFE_HOLD" + assert by_id["total_control_power_loss"]["control_state"] == "PASSIVE_HARD_SAFE_HOLD" + + +def test_silent_crack_is_retained_as_unobservable_negative_evidence() -> None: + raw, sfr3 = _configs() + result = run_dual_boundary_screen(raw, sfr3) + silent = next( + scenario for scenario in result["fault_scenarios"] if scenario["id"] == "silent_armor_crack" + ) + assert silent["latent_fault_retained_without_false_detection"] is True + assert silent["control_state"] == "NO_AUTOMATIC_DETECTION__PERIODIC_NDE_REQUIRED" + + +def test_sfr3_trim_link_remains_synthetic_and_zero_credit() -> None: + raw, sfr3 = _configs() + result = run_dual_boundary_screen(raw, sfr3) + shift = next( + scenario for scenario in result["fault_scenarios"] if scenario["id"] == "outer_support_shift" + ) + assert shift["sfr3_field_integrity_link"]["synthetic_rms_reduction_fraction"] > 0.60 + assert shift["sfr3_field_integrity_link"]["physical_confinement_credit"] == 0.0 + assert shift["fusion_or_ignition_credit"] == 0.0 + + +def test_dual_boundary_result_passes_only_at_low_authority() -> None: + raw, sfr3 = _configs() + result = run_dual_boundary_screen(raw, sfr3) + assert result["top_level_verdict"] == PASS_VERDICT + assert result["screen_pass"] is True + assert result["promotion_status"]["SFR3D_G0_DUAL_BOUNDARY_SPEC"] == "PASS_SPEC_ONLY" + assert all( + status == "NOT_RUN" + for gate, status in result["promotion_status"].items() + if gate not in { + "SFR3D_G0_DUAL_BOUNDARY_SPEC", + "SFR3D_G1_REDUCED_THERMAL_AND_FAULT_SCREEN", + } + ) + + +def test_persisted_dual_boundary_result_matches_recomputation() -> None: + raw, sfr3 = _configs() + expected = json.loads( + (ROOT / "results/sfr3_dual_boundary/sfr3_dual_boundary_ahis_a_v080.json").read_text( + encoding="utf-8" + ) + ) + assert run_dual_boundary_screen(raw, sfr3) == expected diff --git a/tests/reactor/test_sfr3_field_integrity.py b/tests/reactor/test_sfr3_field_integrity.py new file mode 100644 index 0000000..f24690b --- /dev/null +++ b/tests/reactor/test_sfr3_field_integrity.py @@ -0,0 +1,96 @@ +from __future__ import annotations + +import json +import math +from pathlib import Path + +import numpy as np + +from ix_stellaratorforge.sfr3_field_integrity import ( + PASS_VERDICT, + build_response_matrix, + run_sfr3_field_integrity_screen, + validate_sfr3_config, +) + +ROOT = Path(__file__).resolve().parents[2] + + +def _config() -> dict: + return json.loads( + (ROOT / "configs/reactor/sfr3_field_integrity_shell_a.json").read_text( + encoding="utf-8" + ) + ) + + +def test_sfr3_spec_preserves_steady_field_rigid_vessel_and_zero_material_credit() -> None: + raw = _config() + assert validate_sfr3_config(raw) == () + assert raw["architecture"]["primary_field_is_steady"] is True + assert raw["architecture"]["vacuum_vessel_is_flexible"] is False + assert raw["architecture"]["passive_material_claimed_to_confine_plasma"] is False + assert all(value == 0.0 for key, value in raw["claim_boundary"].items() if key.endswith("_credit")) + + +def test_synthetic_response_is_full_row_rank_but_not_physical_evidence() -> None: + raw = _config() + matrix = build_response_matrix(raw["harmonic_screen"]) + assert matrix.shape == (12, 24) + assert np.linalg.matrix_rank(matrix) == 12 + result = run_sfr3_field_integrity_screen(raw) + assert result["authority"].startswith("LOW__synthetic") + assert "analytic heuristic" in result["model_definition"]["response_matrix_source"] + + +def test_nominal_and_single_failure_synthetic_controllability_pass() -> None: + result = run_sfr3_field_integrity_screen(_config()) + by_id = {scenario["id"]: scenario for scenario in result["scenarios"]} + assert result["top_level_verdict"] == PASS_VERDICT + assert result["screen_pass"] is True + assert by_id["nominal"]["total_rms_reduction_fraction"] >= 0.60 + assert by_id["single_actuator_unavailable"]["total_rms_reduction_fraction"] >= 0.55 + assert by_id["nominal"]["diagnostics"]["peak_command_utilization"] <= 1.0 + + +def test_passive_loops_only_attenuate_transients_and_safe_hold_is_fail_closed() -> None: + result = run_sfr3_field_integrity_screen(_config()) + by_id = {scenario["id"]: scenario for scenario in result["scenarios"]} + passive = by_id["passive_transient_only"] + assert passive["active_correction_allowed"] is False + assert math.isclose(passive["passive_only_rms_reduction_fraction"], 0.55, abs_tol=1e-12) + low_confidence = by_id["low_sensor_confidence"] + assert low_confidence["control_state"] == "PASSIVE_ONLY_SAFE_HOLD" + assert "sensor confidence below threshold" in low_confidence["resource_gate_reasons"] + loop_quench = by_id["passive_loop_quench"] + assert loop_quench["passive_loops_healthy"] is False + assert loop_quench["passive_transient_attenuation_fraction_applied"] == 0.0 + active_quench = by_id["active_coil_quench"] + assert active_quench["control_state"] == "PASSIVE_ONLY_SAFE_HOLD" + assert "active-coil quench detected" in active_quench["resource_gate_reasons"] + thermal = by_id["thermal_margin_exhausted"] + assert thermal["control_state"] == "PASSIVE_ONLY_SAFE_HOLD" + assert "trim thermal margin below threshold" in thermal["resource_gate_reasons"] + + +def test_high_authority_gates_remain_unrun_and_no_fusion_credit_is_created() -> None: + result = run_sfr3_field_integrity_screen(_config()) + assert result["promotion_status"]["SFR3_G0_ARCHITECTURE_SPEC"] == "PASS_SPEC_ONLY" + assert result["promotion_status"]["SFR3_G1_SYNTHETIC_CONTROLLABILITY"] == ( + "PASS_LOW_AUTHORITY_SYNTHETIC_ONLY" + ) + assert all( + status == "NOT_RUN" + for gate, status in result["promotion_status"].items() + if gate not in {"SFR3_G0_ARCHITECTURE_SPEC", "SFR3_G1_SYNTHETIC_CONTROLLABILITY"} + ) + assert all(scenario["fusion_or_ignition_credit"] == 0.0 for scenario in result["scenarios"]) + + +def test_persisted_sfr3_result_matches_recomputation() -> None: + expected = json.loads( + (ROOT / "results/sfr3_field_integrity/sfr3_field_integrity_shell_a_v070.json").read_text( + encoding="utf-8" + ) + ) + assert run_sfr3_field_integrity_screen(_config()) == expected diff --git a/tests/reactor/test_sfr4_integrated_campaign.py b/tests/reactor/test_sfr4_integrated_campaign.py new file mode 100644 index 0000000..3bb636c --- /dev/null +++ b/tests/reactor/test_sfr4_integrated_campaign.py @@ -0,0 +1,125 @@ +from __future__ import annotations + +import json +from functools import lru_cache +from pathlib import Path + +from ix_stellaratorforge.sfr4_integrated_campaign import ( + PASS_VERDICT, + run_integrated_campaign, + validate_integrated_config, +) + +ROOT = Path(__file__).resolve().parents[2] + + +def _raw() -> dict: + return json.loads( + (ROOT / "configs/reactor/sfr4_integrated_physical_promotion_a.json").read_text( + encoding="utf-8" + ) + ) + + +@lru_cache(maxsize=1) +def _result() -> dict: + return run_integrated_campaign(_raw()) + + +def test_config_declares_all_seven_workstreams_and_zero_credit(): + raw = _raw() + assert validate_integrated_config(raw) == () + assert len(raw["workstreams"]) == 7 + assert all(value == 0.0 for value in raw["claim_boundary"].values()) + + +def test_direct_biot_savart_scan_executes_and_rejects_current_family(): + coil = _result()["workstreams"]["1_physical_coil_field"] + assert coil["candidate_count"] == 80 + assert coil["combined_pass_count"] == 0 + assert not coil["physical_coil_promoted"] + assert coil["held_out_hybrid_reconstruction"]["validation_rms_Bn_over_B"] > 0.005 + + +def test_equilibrium_and_codesign_fail_closed_when_production_solvers_absent(): + result = _result() + equilibrium = result["workstreams"]["2_finite_beta_equilibrium"] + codesign = result["workstreams"]["3_coil_plasma_codesign"] + assert equilibrium["fail_closed"] + assert not equilibrium["cross_code_equilibrium_completed"] + assert not codesign["production_single_stage_codesign_completed"] + + +def test_alpha_scale_pass_cannot_promote_particle_confinement(): + particles = _result()["workstreams"]["4_particle_confinement"] + assert particles["gyroradius_clearance_screen_pass"] + assert not particles["field_line_topology_prerequisite_pass"] + assert not particles["particle_confinement_promoted"] + + +def test_burn_requirement_includes_radiation_and_is_not_linked_to_failed_coil(): + burn = _result()["workstreams"]["5_self_consistent_burn"] + assert burn["bremsstrahlung_MW_screen"] > 0.0 + assert burn["required_H_ISS04_with_bremsstrahlung_at_design_iota"] > 1.0 + assert not burn["physical_coil_linked_burn_promoted"] + + +def test_selected_heat_partition_and_both_component_stacks_pass_declared_steady_screen(): + heat = _result()["heat_exhaust_resolution"] + assert heat["first_wall_peak_heat_flux_MW_m2"] < 0.5 + assert heat["divertor_peak_heat_flux_MW_m2"] < 10.0 + assert heat["divertor_thermal_screen"]["all_temperature_screens_pass"] + assert heat["selected_first_wall_screen"]["nominal"]["all_layer_temperature_screens_pass"] + assert heat["selected_first_wall_screen"]["upset_steady_upper_bound"]["all_layer_temperature_screens_pass"] + assert heat["nominal_and_declared_steady_heat_envelope_pass"] + + +def test_heat_sensitivity_contains_pass_and_fail_regions(): + heat = _result()["heat_exhaust_resolution"] + states = {point["heat_flux_limits_pass"] for point in heat["heat_partition_sensitivity"]} + assert states == {False, True} + assert heat["heat_partition_feasibility_window"]["selected_point_inside_flux_window"] + + +def test_transient_heat_and_magnet_qualification_remain_open(): + result = _result() + assert not result["heat_exhaust_resolution"]["transient_disruption_heat_resolved"] + magnet = result["workstreams"]["6_magnet_engineering"] + assert not magnet["peak_field_on_conductor_calculated"] + assert not magnet["structural_FEA_completed"] + assert not magnet["magnet_promoted"] + + +def test_reactor_ledger_is_conditional_and_tbr_remains_unrun(): + systems = _result()["workstreams"]["7_reactor_systems"] + assert systems["conditional_net_electric_MW"] > 0.0 + assert systems["breeding_coverage_constraint"]["required_local_tbr_if_uncovered_regions_breed_zero"] > 1.15 + assert not systems["full_3D_TBR_calculated"] + assert not systems["net_electric_prediction_promoted"] + + +def test_top_level_pass_is_reduced_campaign_only_with_zero_fusion_credit(): + result = _result() + assert result["top_level_verdict"] == PASS_VERDICT + assert result["reduced_campaign_complete"] + promotion = result["promotion_summary"] + assert promotion["nominal_and_declared_steady_heat_envelope_screen_pass"] + assert promotion["earned_fusion_progress_credit_fraction"] == 0.0 + assert not any( + promotion[key] + for key in ( + "production_equilibrium_pass", + "physical_confinement_pass", + "sustained_burn_pass", + "magnet_qualification_pass", + "full_3D_TBR_pass", + "hardware_pass", + ) + ) + + +def test_persisted_result_matches_recomputation(): + expected = _result() + path = ROOT / "results/sfr4_integrated/sfr4_integrated_physical_promotion_a_v090.json" + persisted = json.loads(path.read_text(encoding="utf-8")) + assert persisted == expected From 88aa45dce470393a6c0286a805227cc696867697 Mon Sep 17 00:00:00 2001 From: Bryce Lovell <40742705+BryceWDesign@users.noreply.github.com> Date: Sat, 22 Aug 2026 16:46:53 -0700 Subject: [PATCH 2/3] Fix cross-platform numerical evidence reproducibility --- MANIFEST.sha256 | 13 +- .../sfr3_dual_boundary_ahis_a_v080.json | 142 ++++---- .../sfr3_field_integrity_shell_a_v070.json | 318 +++++++++--------- ..._integrated_physical_promotion_a_v090.json | 284 ++++++++-------- src/ix_stellaratorforge/evidence_canonical.py | 40 +++ src/ix_stellaratorforge/sfr3_dual_boundary.py | 3 +- .../sfr3_field_integrity.py | 4 +- .../sfr4_integrated_campaign.py | 3 +- 8 files changed, 425 insertions(+), 382 deletions(-) create mode 100644 src/ix_stellaratorforge/evidence_canonical.py diff --git a/MANIFEST.sha256 b/MANIFEST.sha256 index 6eebe45..2cfc644 100644 --- a/MANIFEST.sha256 +++ b/MANIFEST.sha256 @@ -173,11 +173,11 @@ fb9d8c91204c9cc6947d71b094fede656c053c6faa14ef4294082c4e7b9f2da3 results/reacto 13ce8a27fe47d32d29c66e405adb78eaa0760129281f25772abbd36d34dfcebf results/sfr2_actuation/SFR2_ACTUATION_OVERLAY_A_RESULT.md ecf8b8c18779ed9e9c8b82bbc86cb1989fbd16d283b65b0f8c2ecf132dfec5dc results/sfr2_actuation/sfr2_actuation_overlay_a_v060.json 5704b81fb39423171c2ded5f374995a9e6c1f24b7be7f92ab053c2e1a499077e results/sfr3_dual_boundary/SFR3_DUAL_BOUNDARY_AHIS_A_RESULT.md -651e01b97691977cfbb6853abe0f6f13fb7e42360206e351282ea4611a3200ec results/sfr3_dual_boundary/sfr3_dual_boundary_ahis_a_v080.json +a48c48f5682ba925b4e52604c3622592a92b761160cee9799ea3b92fb718bf9b results/sfr3_dual_boundary/sfr3_dual_boundary_ahis_a_v080.json d6511e149b287cd1d6ff5d9fd720e379bfc95129bae9db5532b9d4378904af26 results/sfr3_field_integrity/SFR3_FIELD_INTEGRITY_SHELL_A_RESULT.md -0ae55f88714ef5d317fa7a5ba267019a5e11f6ffb59b895b13d1d721b3e0c57f results/sfr3_field_integrity/sfr3_field_integrity_shell_a_v070.json +c6f1194fd691ecab4977e58a06d7c668bc7783e79c2fc7a558548cba6a1b7dee results/sfr3_field_integrity/sfr3_field_integrity_shell_a_v070.json 8ccebbd585072c89deeba6c9e637eea89b46b6a9ddef0039fc02eb8f6876b027 results/sfr4_integrated/SFR4_INTEGRATED_PHYSICAL_PROMOTION_A_RESULT.md -0b5b6c55a180a5191e6364130ec737ac7e9212f39f41f9a9b7092ed44d12ac91 results/sfr4_integrated/sfr4_integrated_physical_promotion_a_v090.json +dbd1aeaca5fedf6a0832b636ab4975c2bfa1847ae94162469f59a201db5b5c3c results/sfr4_integrated/sfr4_integrated_physical_promotion_a_v090.json ef748a2605b4ad18f1c7e584f950eba589b23713840178e87bb6a99d676912ef results/vnext/CURRENT_VERDICT.md 3ad823aeaa19e17a12dae6cc89aaa08be9274ee0fa9139624ff784d50293ccfd results/vnext/readiness_report.json 999d106c2531098142befeb8d0d91be43dc7138e8e76706accaee1cb9275049f results/vnext/robust_nfp_sweep.json @@ -256,6 +256,7 @@ ae883b8b0a781f56af5b41e2e787ad9020b526af20755b0ac34789aa1489cd73 src/ix_stellar 8798532e5df34141747cf3afd123ed73e068c1bad0903851c08003bdb143c596 src/ix_stellaratorforge/computational_closure.py 5d309da8e8d7c8f85a6d9808e7f74e01e3591cd0acfc7f3a5235c1ac0d487331 src/ix_stellaratorforge/current_potential_screen.py facbec720533cac990dff3147e3a351d33fb90e2a41ea9493f095b699ec8d1da src/ix_stellaratorforge/equilibrium_inputs.py +d8499032505bef894ded8e08fec88bbc6e46adc41a0667fe4d6a92dad154ba90 src/ix_stellaratorforge/evidence_canonical.py 623b93765636b1291828d15fdfb976576f4766ab545ec0a61061b5328e3658f6 src/ix_stellaratorforge/hts_screen.py 2abf967d97b7d9c2704e93d2b985a836d94973d4120d194ad85ff88bcc63978f src/ix_stellaratorforge/neutronics_constraints.py 95d114c348a77948fe7e480fdb58a72443dd9052491fe2112c2297f41d836777 src/ix_stellaratorforge/physics.py @@ -265,9 +266,9 @@ d6026ef7fe67d9c18a6081f76624b13d7b4a2d7bf7ff55f7fd4dfc1c5a0ed18f src/ix_stellar 82e9f82e97472fc3bb75355983cb129b246f9518d13a2810038d58ba6f536bf4 src/ix_stellaratorforge/readiness.py af8f3a1d5831c10a754eb6f8b095df5daa889ea49bb12e9768ffbfa52b7dcfa8 src/ix_stellaratorforge/sfr2.py b67877f03e5006bb440525e33aeb718fa4e9c6afbc4e7ad8ec542207c233e54a src/ix_stellaratorforge/sfr2_actuation.py -9238c0107849203fe6e76739e9e4f8d4253d4560eb1b3e73117bb3ffab5505d7 src/ix_stellaratorforge/sfr3_dual_boundary.py -e368813b2b644eae5594888801162ff266d5852f63d824dd62dc676216c37264 src/ix_stellaratorforge/sfr3_field_integrity.py -f9e252cc26ed0813e714f2c969ba2d45cfbb842238ebad2d0273888ccc32eec9 src/ix_stellaratorforge/sfr4_integrated_campaign.py +f46fd4cef387895948ed38f5e13aa630c35f119d9c8851610e48b1ad63e8d77e src/ix_stellaratorforge/sfr3_dual_boundary.py +c739b16fbe3958ffea1b981bae84ee01e0ea5ccfb24e0e9b4e131905126633c6 src/ix_stellaratorforge/sfr3_field_integrity.py +515939cddc545c80fdd3e9b60ac4446429285059d090f78cccf1b96a13340d1a src/ix_stellaratorforge/sfr4_integrated_campaign.py f021654d07a36fba883764fbd2ec1b27da8baeb777fd464df2bc63569dd32175 src/ix_stellaratorforge/vacuum_codesign.py b9d7d3cb22cb7c62071bea73ecb717fe58d32b77dbbd32446203138cd69de13c tests/conftest.py 2c2e7bce5dbc7c8f3833eee47c7dfe2770589497ce2485780ffc830e2eaecee8 tests/reactor/test_closure_campaign.py diff --git a/results/sfr3_dual_boundary/sfr3_dual_boundary_ahis_a_v080.json b/results/sfr3_dual_boundary/sfr3_dual_boundary_ahis_a_v080.json index 49667b9..920aecd 100644 --- a/results/sfr3_dual_boundary/sfr3_dual_boundary_ahis_a_v080.json +++ b/results/sfr3_dual_boundary/sfr3_dual_boundary_ahis_a_v080.json @@ -151,7 +151,7 @@ "available": true, "physical_confinement_credit": 0.0, "requested": true, - "synthetic_rms_reduction_fraction": 0.6546225715726142 + "synthetic_rms_reduction_fraction": 0.6546225716 } }, { @@ -404,41 +404,41 @@ "heat_flux_MW_m2": 0.25, "layers_plasma_to_coolant": [ { - "cold_face_temperature_C": 406.8253968253968, + "cold_face_temperature_C": 406.8253968, "declared_max_service_temperature_C": 1600.0, - "hot_face_temperature_C": 420.7142857142857, + "hot_face_temperature_C": 420.7142857, "layer_id": "segmented_tungsten_armor", "material": "segmented tungsten; long-fiber Wf-W retained as replaceable qualification coupon", - "temperature_rise_K": 13.88888888888889, + "temperature_rise_K": 13.88888889, "temperature_screen_pass": true, - "thermal_resistance_m2K_W": 5.555555555555556e-05 + "thermal_resistance_m2K_W": 5.555555556e-05 }, { - "cold_face_temperature_C": 395.7142857142857, + "cold_face_temperature_C": 395.7142857, "declared_max_service_temperature_C": 800.0, - "hot_face_temperature_C": 406.8253968253968, + "hot_face_temperature_C": 406.8253968, "layer_id": "graded_w_rafm_transition", "material": "functionally graded tungsten-to-RAFM transition candidate", - "temperature_rise_K": 11.111111111111112, + "temperature_rise_K": 11.11111111, "temperature_screen_pass": true, - "thermal_resistance_m2K_W": 4.4444444444444447e-05 + "thermal_resistance_m2K_W": 4.444444444e-05 }, { "cold_face_temperature_C": 360.0, "declared_max_service_temperature_C": 550.0, - "hot_face_temperature_C": 395.7142857142857, + "hot_face_temperature_C": 395.7142857, "layer_id": "helium_cooled_rafm_first_wall", "material": "ODS-Eurofer or qualified RAFM first-wall structure", - "temperature_rise_K": 35.714285714285715, + "temperature_rise_K": 35.71428571, "temperature_screen_pass": true, - "thermal_resistance_m2K_W": 0.00014285714285714287 + "thermal_resistance_m2K_W": 0.0001428571429 } ], - "plasma_facing_surface_temperature_C": 420.7142857142857, - "raw_cte_mismatch_strain_proxy": 0.000530357142857143, + "plasma_facing_surface_temperature_C": 420.7142857, + "raw_cte_mismatch_strain_proxy": 0.0005303571429, "raw_cte_mismatch_strain_screen_pass": true, - "solid_thermal_resistance_m2K_W": 0.00024285714285714286, - "total_thermal_resistance_m2K_W": 0.00028285714285714286 + "solid_thermal_resistance_m2K_W": 0.0002428571429, + "total_thermal_resistance_m2K_W": 0.0002828571429 }, "physical_qualification_complete": false, "status": "SELECTED_BALANCED_REFERENCE__NOT_QUALIFIED", @@ -449,41 +449,41 @@ "heat_flux_MW_m2": 1.0, "layers_plasma_to_coolant": [ { - "cold_face_temperature_C": 577.3015873015873, + "cold_face_temperature_C": 577.3015873, "declared_max_service_temperature_C": 1600.0, - "hot_face_temperature_C": 632.8571428571429, + "hot_face_temperature_C": 632.8571429, "layer_id": "segmented_tungsten_armor", "material": "segmented tungsten; long-fiber Wf-W retained as replaceable qualification coupon", - "temperature_rise_K": 55.55555555555556, + "temperature_rise_K": 55.55555556, "temperature_screen_pass": true, - "thermal_resistance_m2K_W": 5.555555555555556e-05 + "thermal_resistance_m2K_W": 5.555555556e-05 }, { - "cold_face_temperature_C": 532.8571428571429, + "cold_face_temperature_C": 532.8571429, "declared_max_service_temperature_C": 800.0, - "hot_face_temperature_C": 577.3015873015873, + "hot_face_temperature_C": 577.3015873, "layer_id": "graded_w_rafm_transition", "material": "functionally graded tungsten-to-RAFM transition candidate", - "temperature_rise_K": 44.44444444444445, + "temperature_rise_K": 44.44444444, "temperature_screen_pass": true, - "thermal_resistance_m2K_W": 4.4444444444444447e-05 + "thermal_resistance_m2K_W": 4.444444444e-05 }, { "cold_face_temperature_C": 390.0, "declared_max_service_temperature_C": 550.0, - "hot_face_temperature_C": 532.8571428571429, + "hot_face_temperature_C": 532.8571429, "layer_id": "helium_cooled_rafm_first_wall", "material": "ODS-Eurofer or qualified RAFM first-wall structure", - "temperature_rise_K": 142.85714285714286, + "temperature_rise_K": 142.8571429, "temperature_screen_pass": true, - "thermal_resistance_m2K_W": 0.00014285714285714287 + "thermal_resistance_m2K_W": 0.0001428571429 } ], - "plasma_facing_surface_temperature_C": 632.8571428571429, - "raw_cte_mismatch_strain_proxy": 0.002121428571428572, + "plasma_facing_surface_temperature_C": 632.8571429, + "raw_cte_mismatch_strain_proxy": 0.002121428571, "raw_cte_mismatch_strain_screen_pass": true, - "solid_thermal_resistance_m2K_W": 0.00024285714285714286, - "total_thermal_resistance_m2K_W": 0.00028285714285714286 + "solid_thermal_resistance_m2K_W": 0.0002428571429, + "total_thermal_resistance_m2K_W": 0.0002828571429 } }, { @@ -507,24 +507,24 @@ "heat_flux_MW_m2": 0.25, "layers_plasma_to_coolant": [ { - "cold_face_temperature_C": 168.33333333333334, + "cold_face_temperature_C": 168.3333333, "declared_max_service_temperature_C": 1600.0, - "hot_face_temperature_C": 182.22222222222223, + "hot_face_temperature_C": 182.2222222, "layer_id": "segmented_tungsten_armor", "material": "segmented tungsten", - "temperature_rise_K": 13.88888888888889, + "temperature_rise_K": 13.88888889, "temperature_screen_pass": true, - "thermal_resistance_m2K_W": 5.555555555555556e-05 + "thermal_resistance_m2K_W": 5.555555556e-05 }, { "cold_face_temperature_C": 165.0, "declared_max_service_temperature_C": 800.0, - "hot_face_temperature_C": 168.33333333333334, + "hot_face_temperature_C": 168.3333333, "layer_id": "w_cu_fgm", "material": "W-Cu functionally graded transition", - "temperature_rise_K": 3.3333333333333335, + "temperature_rise_K": 3.333333333, "temperature_screen_pass": true, - "thermal_resistance_m2K_W": 1.3333333333333333e-05 + "thermal_resistance_m2K_W": 1.333333333e-05 }, { "cold_face_temperature_C": 155.0, @@ -537,11 +537,11 @@ "thermal_resistance_m2K_W": 4e-05 } ], - "plasma_facing_surface_temperature_C": 182.22222222222223, - "raw_cte_mismatch_strain_proxy": 0.00040277777777777783, + "plasma_facing_surface_temperature_C": 182.2222222, + "raw_cte_mismatch_strain_proxy": 0.0004027777778, "raw_cte_mismatch_strain_screen_pass": true, - "solid_thermal_resistance_m2K_W": 0.00010888888888888889, - "total_thermal_resistance_m2K_W": 0.0001288888888888889 + "solid_thermal_resistance_m2K_W": 0.0001088888889, + "total_thermal_resistance_m2K_W": 0.0001288888889 }, "physical_qualification_complete": false, "status": "THERMALLY_FAVORABLE__DEFERRED_INTEGRATED_REACTOR_BRANCH", @@ -552,24 +552,24 @@ "heat_flux_MW_m2": 1.0, "layers_plasma_to_coolant": [ { - "cold_face_temperature_C": 223.33333333333334, + "cold_face_temperature_C": 223.3333333, "declared_max_service_temperature_C": 1600.0, - "hot_face_temperature_C": 278.8888888888889, + "hot_face_temperature_C": 278.8888889, "layer_id": "segmented_tungsten_armor", "material": "segmented tungsten", - "temperature_rise_K": 55.55555555555556, + "temperature_rise_K": 55.55555556, "temperature_screen_pass": true, - "thermal_resistance_m2K_W": 5.555555555555556e-05 + "thermal_resistance_m2K_W": 5.555555556e-05 }, { "cold_face_temperature_C": 210.0, "declared_max_service_temperature_C": 800.0, - "hot_face_temperature_C": 223.33333333333334, + "hot_face_temperature_C": 223.3333333, "layer_id": "w_cu_fgm", "material": "W-Cu functionally graded transition", - "temperature_rise_K": 13.333333333333334, + "temperature_rise_K": 13.33333333, "temperature_screen_pass": true, - "thermal_resistance_m2K_W": 1.3333333333333333e-05 + "thermal_resistance_m2K_W": 1.333333333e-05 }, { "cold_face_temperature_C": 170.0, @@ -582,11 +582,11 @@ "thermal_resistance_m2K_W": 4e-05 } ], - "plasma_facing_surface_temperature_C": 278.8888888888889, - "raw_cte_mismatch_strain_proxy": 0.0016111111111111113, + "plasma_facing_surface_temperature_C": 278.8888889, + "raw_cte_mismatch_strain_proxy": 0.001611111111, "raw_cte_mismatch_strain_screen_pass": true, - "solid_thermal_resistance_m2K_W": 0.00010888888888888889, - "total_thermal_resistance_m2K_W": 0.0001288888888888889 + "solid_thermal_resistance_m2K_W": 0.0001088888889, + "total_thermal_resistance_m2K_W": 0.0001288888889 } }, { @@ -610,24 +610,24 @@ "heat_flux_MW_m2": 0.25, "layers_plasma_to_coolant": [ { - "cold_face_temperature_C": 579.1666666666666, + "cold_face_temperature_C": 579.1666667, "declared_max_service_temperature_C": 1600.0, "hot_face_temperature_C": 587.5, "layer_id": "segmented_tungsten_armor", "material": "segmented tungsten", - "temperature_rise_K": 8.333333333333334, + "temperature_rise_K": 8.333333333, "temperature_screen_pass": true, - "thermal_resistance_m2K_W": 3.3333333333333335e-05 + "thermal_resistance_m2K_W": 3.333333333e-05 }, { "cold_face_temperature_C": 562.5, "declared_max_service_temperature_C": 1200.0, - "hot_face_temperature_C": 579.1666666666666, + "hot_face_temperature_C": 579.1666667, "layer_id": "graded_w_sic_transition", "material": "graded W-SiC transition candidate", - "temperature_rise_K": 16.666666666666668, + "temperature_rise_K": 16.66666667, "temperature_screen_pass": true, - "thermal_resistance_m2K_W": 6.666666666666667e-05 + "thermal_resistance_m2K_W": 6.666666667e-05 }, { "cold_face_temperature_C": 512.5, @@ -641,10 +641,10 @@ } ], "plasma_facing_surface_temperature_C": 587.5, - "raw_cte_mismatch_strain_proxy": 2.624999999999997e-05, + "raw_cte_mismatch_strain_proxy": 2.625e-05, "raw_cte_mismatch_strain_screen_pass": true, - "solid_thermal_resistance_m2K_W": 0.00030000000000000003, - "total_thermal_resistance_m2K_W": 0.00035000000000000005 + "solid_thermal_resistance_m2K_W": 0.0003, + "total_thermal_resistance_m2K_W": 0.00035 }, "physical_qualification_complete": false, "status": "HIGH_TEMPERATURE_RESEARCH_BRANCH__DEFERRED", @@ -655,24 +655,24 @@ "heat_flux_MW_m2": 1.0, "layers_plasma_to_coolant": [ { - "cold_face_temperature_C": 816.6666666666666, + "cold_face_temperature_C": 816.6666667, "declared_max_service_temperature_C": 1600.0, "hot_face_temperature_C": 850.0, "layer_id": "segmented_tungsten_armor", "material": "segmented tungsten", - "temperature_rise_K": 33.333333333333336, + "temperature_rise_K": 33.33333333, "temperature_screen_pass": true, - "thermal_resistance_m2K_W": 3.3333333333333335e-05 + "thermal_resistance_m2K_W": 3.333333333e-05 }, { "cold_face_temperature_C": 750.0, "declared_max_service_temperature_C": 1200.0, - "hot_face_temperature_C": 816.6666666666666, + "hot_face_temperature_C": 816.6666667, "layer_id": "graded_w_sic_transition", "material": "graded W-SiC transition candidate", - "temperature_rise_K": 66.66666666666667, + "temperature_rise_K": 66.66666667, "temperature_screen_pass": true, - "thermal_resistance_m2K_W": 6.666666666666667e-05 + "thermal_resistance_m2K_W": 6.666666667e-05 }, { "cold_face_temperature_C": 550.0, @@ -686,10 +686,10 @@ } ], "plasma_facing_surface_temperature_C": 850.0, - "raw_cte_mismatch_strain_proxy": 0.00010499999999999988, + "raw_cte_mismatch_strain_proxy": 0.000105, "raw_cte_mismatch_strain_screen_pass": true, - "solid_thermal_resistance_m2K_W": 0.00030000000000000003, - "total_thermal_resistance_m2K_W": 0.00035000000000000005 + "solid_thermal_resistance_m2K_W": 0.0003, + "total_thermal_resistance_m2K_W": 0.00035 } } ] diff --git a/results/sfr3_field_integrity/sfr3_field_integrity_shell_a_v070.json b/results/sfr3_field_integrity/sfr3_field_integrity_shell_a_v070.json index 6032096..3bc8df5 100644 --- a/results/sfr3_field_integrity/sfr3_field_integrity_shell_a_v070.json +++ b/results/sfr3_field_integrity/sfr3_field_integrity_shell_a_v070.json @@ -83,139 +83,139 @@ "scenarios": [ { "active_correction_allowed": true, - "after_passive_error_rms_coefficient_units": 0.3960023674171659, + "after_passive_error_rms_coefficient_units": 0.3960023674, "commands": [ - -0.810809236231859, - 0.40849073788485407, - 0.31934934943278037, - -0.8862722571059305, - -0.381051672147703, - 0.146965176041562, - 0.701994069337559, - -0.08383629900048398, - 0.6071886320599772, - -0.17057678681836164, - -0.8037608453263679, - -0.15352553032050367, - 0.21314652133702852, - -0.22108373398394265, - 0.3001848862486659, - 0.7773506644642523, - 0.011772518989503562, - -0.9999999999999999, - 0.2251035786939923, - 0.5245902417737082, - -0.9279968542034338, - -0.049936553675978386, - 0.5448790518104535, - 0.707834340741252 + -0.8108092362, + 0.4084907379, + 0.3193493494, + -0.8862722571, + -0.3810516721, + 0.146965176, + 0.7019940693, + -0.083836299, + 0.6071886321, + -0.1705767868, + -0.8037608453, + -0.1535255303, + 0.2131465213, + -0.221083734, + 0.3001848862, + 0.7773506645, + 0.01177251899, + -1.0, + 0.2251035787, + 0.5245902418, + -0.9279968542, + -0.04993655368, + 0.5448790518, + 0.7078343407 ], "control_state": "ACTIVE_TRIM", "description": "All passive and active layers healthy.", "diagnostics": { "available_response_rank": 12, "available_response_singular_values": [ - 0.3472153066111489, - 0.3472153066111487, - 0.3452971375188232, - 0.3452971375188231, - 0.32226900835748107, - 0.3222690083574809, - 0.2892072239354681, - 0.289207223935468, - 0.2779532215499495, - 0.27795322154994945, - 0.24179090207130063, - 0.2417909020713005 + 0.3472153066, + 0.3472153066, + 0.3452971375, + 0.3452971375, + 0.3222690084, + 0.3222690084, + 0.2892072239, + 0.2892072239, + 0.2779532215, + 0.2779532215, + 0.2417909021, + 0.2417909021 ], "failed_actuators": [], - "peak_command_utilization": 0.9999999999999999, - "regularized_condition_number": 2.060324746487621, + "peak_command_utilization": 1.0, + "regularized_condition_number": 2.060324746, "scaled_to_command_limit": true, - "unconstrained_peak_command": 1.5412289209227392 + "unconstrained_peak_command": 1.541228921 }, - "final_error_rms_Bn_over_Baxis": 1.392974721196233e-05, - "final_error_rms_coefficient_units": 0.1392974721196233, + "final_error_rms_Bn_over_Baxis": 1.392974721e-05, + "final_error_rms_coefficient_units": 0.1392974721, "fusion_or_ignition_credit": 0.0, "id": "nominal", - "initial_error_rms_Bn_over_Baxis": 4.033195589934447e-05, - "initial_error_rms_coefficient_units": 0.4033195589934447, + "initial_error_rms_Bn_over_Baxis": 4.03319559e-05, + "initial_error_rms_coefficient_units": 0.403319559, "passive_loops_healthy": true, - "passive_only_rms_reduction_fraction": 0.018142416882880985, + "passive_only_rms_reduction_fraction": 0.01814241688, "passive_transient_attenuation_fraction_applied": 0.55, "resource_gate_reasons": [], - "total_rms_reduction_fraction": 0.6546225715726142 + "total_rms_reduction_fraction": 0.6546225716 }, { "active_correction_allowed": true, - "after_passive_error_rms_coefficient_units": 0.3960023674171659, + "after_passive_error_rms_coefficient_units": 0.3960023674, "commands": [ - -0.8688951938261256, - 0.4284128254603282, - 0.3318746746987743, - -0.8988082500340429, - -0.3623126336082907, - 0.1631863103048372, - 0.7244106333619357, - 0.0, - 0.6282651357690254, - -0.1588440594977001, - -0.790996736117589, - -0.15570426064919135, - 0.22417068591656242, - -0.2100605850084952, - 0.257802660178987, - 0.7883283239898737, - 0.01607368352886581, + -0.8688951938, + 0.4284128255, + 0.3318746747, + -0.89880825, + -0.3623126336, + 0.1631863103, + 0.7244106334, + 0.0, + 0.6282651358, + -0.1588440595, + -0.7909967361, + -0.1557042606, + 0.2241706859, + -0.210060585, + 0.2578026602, + 0.788328324, + 0.01607368353, -1.0, - 0.22614541266658, - 0.532017323376858, - -0.9432539179951787, - -0.03650755257645581, - 0.556715595426962, - 0.7178293976929455 + 0.2261454127, + 0.5320173234, + -0.943253918, + -0.03650755258, + 0.5567155954, + 0.7178293977 ], "control_state": "ACTIVE_TRIM", "description": "One of 24 trim-coil channels is unavailable.", "diagnostics": { "available_response_rank": 12, "available_response_singular_values": [ - 0.3472153066111488, - 0.34631450981851375, - 0.3452971375188232, - 0.3347798668716778, - 0.32226900835748107, - 0.3104796685473366, - 0.28920722393546794, - 0.2838673767622138, - 0.2779532215499494, - 0.2578197806063689, - 0.2417909020713005, - 0.20156785965862933 + 0.3472153066, + 0.3463145098, + 0.3452971375, + 0.3347798669, + 0.3222690084, + 0.3104796685, + 0.2892072239, + 0.2838673768, + 0.2779532215, + 0.2578197806, + 0.2417909021, + 0.2015678597 ], "failed_actuators": [ 7 ], "peak_command_utilization": 1.0, - "regularized_condition_number": 2.962426910156671, + "regularized_condition_number": 2.96242691, "scaled_to_command_limit": true, - "unconstrained_peak_command": 1.5197475227767938 + "unconstrained_peak_command": 1.519747523 }, - "final_error_rms_Bn_over_Baxis": 1.3566944947451738e-05, - "final_error_rms_coefficient_units": 0.13566944947451737, + "final_error_rms_Bn_over_Baxis": 1.356694495e-05, + "final_error_rms_coefficient_units": 0.1356694495, "fusion_or_ignition_credit": 0.0, "id": "single_actuator_unavailable", - "initial_error_rms_Bn_over_Baxis": 4.033195589934447e-05, - "initial_error_rms_coefficient_units": 0.4033195589934447, + "initial_error_rms_Bn_over_Baxis": 4.03319559e-05, + "initial_error_rms_coefficient_units": 0.403319559, "passive_loops_healthy": true, - "passive_only_rms_reduction_fraction": 0.018142416882880985, + "passive_only_rms_reduction_fraction": 0.01814241688, "passive_transient_attenuation_fraction_applied": 0.55, "resource_gate_reasons": [], - "total_rms_reduction_fraction": 0.663617976244186 + "total_rms_reduction_fraction": 0.6636179762 }, { "active_correction_allowed": false, - "after_passive_error_rms_coefficient_units": 0.3960023674171659, + "after_passive_error_rms_coefficient_units": 0.3960023674, "commands": [ 0.0, 0.0, @@ -253,88 +253,88 @@ "scaled_to_command_limit": false, "unconstrained_peak_command": 0.0 }, - "final_error_rms_Bn_over_Baxis": 3.960023674171659e-05, - "final_error_rms_coefficient_units": 0.3960023674171659, + "final_error_rms_Bn_over_Baxis": 3.960023674e-05, + "final_error_rms_coefficient_units": 0.3960023674, "fusion_or_ignition_credit": 0.0, "id": "low_sensor_confidence", - "initial_error_rms_Bn_over_Baxis": 4.033195589934447e-05, - "initial_error_rms_coefficient_units": 0.4033195589934447, + "initial_error_rms_Bn_over_Baxis": 4.03319559e-05, + "initial_error_rms_coefficient_units": 0.403319559, "passive_loops_healthy": true, - "passive_only_rms_reduction_fraction": 0.018142416882880985, + "passive_only_rms_reduction_fraction": 0.01814241688, "passive_transient_attenuation_fraction_applied": 0.55, "resource_gate_reasons": [ "sensor confidence below threshold" ], - "total_rms_reduction_fraction": 0.018142416882880985 + "total_rms_reduction_fraction": 0.01814241688 }, { "active_correction_allowed": true, - "after_passive_error_rms_coefficient_units": 0.4033195589934447, + "after_passive_error_rms_coefficient_units": 0.403319559, "commands": [ - -0.8262123148306857, - 0.33270745553595665, - 0.32805980459683515, - -0.7910563430135897, - -0.332879605409859, - 0.21031730976905968, - 0.5922899417864397, - -0.1543174306617742, - 0.5528594402336887, - -0.10932186215603637, - -0.7701013318700607, - -0.14197457869790475, - 0.3390216802485875, - -0.2817986580202181, - 0.20275093915515197, - 0.7122875865422307, - 0.11169601292333098, + -0.8262123148, + 0.3327074555, + 0.3280598046, + -0.791056343, + -0.3328796054, + 0.2103173098, + 0.5922899418, + -0.1543174307, + 0.5528594402, + -0.1093218622, + -0.7701013319, + -0.1419745787, + 0.3390216802, + -0.281798658, + 0.2027509392, + 0.7122875865, + 0.1116960129, -1.0, - 0.15845468473824326, - 0.5902325549035702, - -0.8604002541704838, - -0.0754633733156864, - 0.5044610025987127, - 0.7083873391139449 + 0.1584546847, + 0.5902325549, + -0.8604002542, + -0.07546337332, + 0.5044610026, + 0.7083873391 ], "control_state": "ACTIVE_TRIM", "description": "Passive loop is isolated; healthy active trim remains resource-gated and bounded.", "diagnostics": { "available_response_rank": 12, "available_response_singular_values": [ - 0.3472153066111489, - 0.3472153066111487, - 0.3452971375188232, - 0.3452971375188231, - 0.32226900835748107, - 0.3222690083574809, - 0.2892072239354681, - 0.289207223935468, - 0.2779532215499495, - 0.27795322154994945, - 0.24179090207130063, - 0.2417909020713005 + 0.3472153066, + 0.3472153066, + 0.3452971375, + 0.3452971375, + 0.3222690084, + 0.3222690084, + 0.2892072239, + 0.2892072239, + 0.2779532215, + 0.2779532215, + 0.2417909021, + 0.2417909021 ], "failed_actuators": [], "peak_command_utilization": 1.0, - "regularized_condition_number": 2.060324746487621, + "regularized_condition_number": 2.060324746, "scaled_to_command_limit": true, - "unconstrained_peak_command": 1.6280213746745589 + "unconstrained_peak_command": 1.628021375 }, - "final_error_rms_Bn_over_Baxis": 1.558063601475354e-05, - "final_error_rms_coefficient_units": 0.1558063601475354, + "final_error_rms_Bn_over_Baxis": 1.558063601e-05, + "final_error_rms_coefficient_units": 0.1558063601, "fusion_or_ignition_credit": 0.0, "id": "passive_loop_quench", - "initial_error_rms_Bn_over_Baxis": 4.033195589934447e-05, - "initial_error_rms_coefficient_units": 0.4033195589934447, + "initial_error_rms_Bn_over_Baxis": 4.03319559e-05, + "initial_error_rms_coefficient_units": 0.403319559, "passive_loops_healthy": false, "passive_only_rms_reduction_fraction": 0.0, "passive_transient_attenuation_fraction_applied": 0.0, "resource_gate_reasons": [], - "total_rms_reduction_fraction": 0.6136900463335382 + "total_rms_reduction_fraction": 0.6136900463 }, { "active_correction_allowed": false, - "after_passive_error_rms_coefficient_units": 0.3960023674171659, + "after_passive_error_rms_coefficient_units": 0.3960023674, "commands": [ 0.0, 0.0, @@ -372,23 +372,23 @@ "scaled_to_command_limit": false, "unconstrained_peak_command": 0.0 }, - "final_error_rms_Bn_over_Baxis": 3.960023674171659e-05, - "final_error_rms_coefficient_units": 0.3960023674171659, + "final_error_rms_Bn_over_Baxis": 3.960023674e-05, + "final_error_rms_coefficient_units": 0.3960023674, "fusion_or_ignition_credit": 0.0, "id": "active_coil_quench", - "initial_error_rms_Bn_over_Baxis": 4.033195589934447e-05, - "initial_error_rms_coefficient_units": 0.4033195589934447, + "initial_error_rms_Bn_over_Baxis": 4.03319559e-05, + "initial_error_rms_coefficient_units": 0.403319559, "passive_loops_healthy": true, - "passive_only_rms_reduction_fraction": 0.018142416882880985, + "passive_only_rms_reduction_fraction": 0.01814241688, "passive_transient_attenuation_fraction_applied": 0.55, "resource_gate_reasons": [ "active-coil quench detected" ], - "total_rms_reduction_fraction": 0.018142416882880985 + "total_rms_reduction_fraction": 0.01814241688 }, { "active_correction_allowed": false, - "after_passive_error_rms_coefficient_units": 0.3960023674171659, + "after_passive_error_rms_coefficient_units": 0.3960023674, "commands": [ 0.0, 0.0, @@ -426,23 +426,23 @@ "scaled_to_command_limit": false, "unconstrained_peak_command": 0.0 }, - "final_error_rms_Bn_over_Baxis": 3.960023674171659e-05, - "final_error_rms_coefficient_units": 0.3960023674171659, + "final_error_rms_Bn_over_Baxis": 3.960023674e-05, + "final_error_rms_coefficient_units": 0.3960023674, "fusion_or_ignition_credit": 0.0, "id": "thermal_margin_exhausted", - "initial_error_rms_Bn_over_Baxis": 4.033195589934447e-05, - "initial_error_rms_coefficient_units": 0.4033195589934447, + "initial_error_rms_Bn_over_Baxis": 4.03319559e-05, + "initial_error_rms_coefficient_units": 0.403319559, "passive_loops_healthy": true, - "passive_only_rms_reduction_fraction": 0.018142416882880985, + "passive_only_rms_reduction_fraction": 0.01814241688, "passive_transient_attenuation_fraction_applied": 0.55, "resource_gate_reasons": [ "trim thermal margin below threshold" ], - "total_rms_reduction_fraction": 0.018142416882880985 + "total_rms_reduction_fraction": 0.01814241688 }, { "active_correction_allowed": false, - "after_passive_error_rms_coefficient_units": 0.037153398229502504, + "after_passive_error_rms_coefficient_units": 0.03715339823, "commands": [ 0.0, 0.0, @@ -480,12 +480,12 @@ "scaled_to_command_limit": false, "unconstrained_peak_command": 0.0 }, - "final_error_rms_Bn_over_Baxis": 3.7153398229502508e-06, - "final_error_rms_coefficient_units": 0.037153398229502504, + "final_error_rms_Bn_over_Baxis": 3.715339823e-06, + "final_error_rms_coefficient_units": 0.03715339823, "fusion_or_ignition_credit": 0.0, "id": "passive_transient_only", - "initial_error_rms_Bn_over_Baxis": 8.256310717667225e-06, - "initial_error_rms_coefficient_units": 0.08256310717667224, + "initial_error_rms_Bn_over_Baxis": 8.256310718e-06, + "initial_error_rms_coefficient_units": 0.08256310718, "passive_loops_healthy": true, "passive_only_rms_reduction_fraction": 0.55, "passive_transient_attenuation_fraction_applied": 0.55, diff --git a/results/sfr4_integrated/sfr4_integrated_physical_promotion_a_v090.json b/results/sfr4_integrated/sfr4_integrated_physical_promotion_a_v090.json index 568188e..30b7c88 100644 --- a/results/sfr4_integrated/sfr4_integrated_physical_promotion_a_v090.json +++ b/results/sfr4_integrated/sfr4_integrated_physical_promotion_a_v090.json @@ -11,170 +11,170 @@ }, "heat_exhaust_resolution": { "authority": "power_partition_plus_1D_conduction_and_hydraulics_not_edge_plasma_CFD_FEA_or_CHF_qualification", - "controlled_radiation_MW": 137.38636363636363, + "controlled_radiation_MW": 137.3863636, "divertor_hydraulics": { - "mass_flow_kg_s": 426.00422832980973, - "mean_channel_velocity_m_s": 7.56124598742875, + "mass_flow_kg_s": 426.0042283, + "mean_channel_velocity_m_s": 7.561245987, "parallel_channels": 960, - "pressure_drop_Pa_screen": 183494.94901208644, - "pumping_power_MW_screen": 0.1217785077992081 + "pressure_drop_Pa_screen": 183494.949, + "pumping_power_MW_screen": 0.1217785078 }, - "divertor_peak_heat_flux_MW_m2": 5.724431818181818, - "divertor_power_MW": 91.5909090909091, + "divertor_peak_heat_flux_MW_m2": 5.724431818, + "divertor_power_MW": 91.59090909, "divertor_thermal_screen": { "all_temperature_screens_pass": true, - "heat_flux_MW_m2": 5.724431818181818, + "heat_flux_MW_m2": 5.724431818, "interfaces": [ { "location": "coolant_film_wall", - "temperature_C": 231.7775974025974 + "temperature_C": 231.7775974 }, { "declared_max_temperature_C": 350.0, "layer": "CuCrZr_heat_sink", - "outer_temperature_C": 277.57305194805195, + "outer_temperature_C": 277.5730519, "temperature_screen_pass": true }, { "declared_max_temperature_C": 500.0, "layer": "OFHC_Cu_compliant_interlayer", - "outer_temperature_C": 296.65449134199133, + "outer_temperature_C": 296.6544913, "temperature_screen_pass": true }, { "declared_max_temperature_C": 1200.0, "layer": "segmented_tungsten_monoblock", - "outer_temperature_C": 678.2832792207793, + "outer_temperature_C": 678.2832792, "temperature_screen_pass": true } ], - "surface_temperature_C": 678.2832792207793 + "surface_temperature_C": 678.2832792 }, - "first_wall_effective_area_m2": 536.906479419261, - "first_wall_peak_heat_flux_MW_m2": 0.29426785527474164, + "first_wall_effective_area_m2": 536.9064794, + "first_wall_peak_heat_flux_MW_m2": 0.2942678553, "heat_partition_feasibility_window": { "maximum_controlled_radiation_fraction_from_first_wall_limit": 1.0, - "minimum_controlled_radiation_fraction_at_selected_area": 0.3012406947890819, - "minimum_effective_wetted_area_m2_at_selected_radiation": 13.738636363636363, + "minimum_controlled_radiation_fraction_at_selected_area": 0.3012406948, + "minimum_effective_wetted_area_m2_at_selected_radiation": 13.73863636, "selected_point_inside_flux_window": true }, "heat_partition_sensitivity": [ { "controlled_radiation_fraction": 0.4, - "divertor_peak_MW_m2": 17.173295454545453, + "divertor_peak_MW_m2": 17.17329545, "effective_wetted_area_m2": 12.0, - "first_wall_peak_MW_m2": 0.19617857018316112, + "first_wall_peak_MW_m2": 0.1961785702, "heat_flux_limits_pass": false }, { "controlled_radiation_fraction": 0.4, - "divertor_peak_MW_m2": 11.448863636363635, + "divertor_peak_MW_m2": 11.44886364, "effective_wetted_area_m2": 18.0, - "first_wall_peak_MW_m2": 0.19617857018316112, + "first_wall_peak_MW_m2": 0.1961785702, "heat_flux_limits_pass": false }, { "controlled_radiation_fraction": 0.4, - "divertor_peak_MW_m2": 8.586647727272727, + "divertor_peak_MW_m2": 8.586647727, "effective_wetted_area_m2": 24.0, - "first_wall_peak_MW_m2": 0.19617857018316112, + "first_wall_peak_MW_m2": 0.1961785702, "heat_flux_limits_pass": true }, { "controlled_radiation_fraction": 0.4, - "divertor_peak_MW_m2": 6.869318181818182, + "divertor_peak_MW_m2": 6.869318182, "effective_wetted_area_m2": 30.0, - "first_wall_peak_MW_m2": 0.19617857018316112, + "first_wall_peak_MW_m2": 0.1961785702, "heat_flux_limits_pass": true }, { "controlled_radiation_fraction": 0.5, - "divertor_peak_MW_m2": 14.311079545454547, + "divertor_peak_MW_m2": 14.31107955, "effective_wetted_area_m2": 12.0, - "first_wall_peak_MW_m2": 0.2452232127289514, + "first_wall_peak_MW_m2": 0.2452232127, "heat_flux_limits_pass": false }, { "controlled_radiation_fraction": 0.5, - "divertor_peak_MW_m2": 9.540719696969695, + "divertor_peak_MW_m2": 9.540719697, "effective_wetted_area_m2": 18.0, - "first_wall_peak_MW_m2": 0.2452232127289514, + "first_wall_peak_MW_m2": 0.2452232127, "heat_flux_limits_pass": true }, { "controlled_radiation_fraction": 0.5, - "divertor_peak_MW_m2": 7.155539772727273, + "divertor_peak_MW_m2": 7.155539773, "effective_wetted_area_m2": 24.0, - "first_wall_peak_MW_m2": 0.2452232127289514, + "first_wall_peak_MW_m2": 0.2452232127, "heat_flux_limits_pass": true }, { "controlled_radiation_fraction": 0.5, - "divertor_peak_MW_m2": 5.7244318181818175, + "divertor_peak_MW_m2": 5.724431818, "effective_wetted_area_m2": 30.0, - "first_wall_peak_MW_m2": 0.2452232127289514, + "first_wall_peak_MW_m2": 0.2452232127, "heat_flux_limits_pass": true }, { "controlled_radiation_fraction": 0.6, - "divertor_peak_MW_m2": 11.448863636363637, + "divertor_peak_MW_m2": 11.44886364, "effective_wetted_area_m2": 12.0, - "first_wall_peak_MW_m2": 0.29426785527474164, + "first_wall_peak_MW_m2": 0.2942678553, "heat_flux_limits_pass": false }, { "controlled_radiation_fraction": 0.6, - "divertor_peak_MW_m2": 7.632575757575758, + "divertor_peak_MW_m2": 7.632575758, "effective_wetted_area_m2": 18.0, - "first_wall_peak_MW_m2": 0.29426785527474164, + "first_wall_peak_MW_m2": 0.2942678553, "heat_flux_limits_pass": true }, { "controlled_radiation_fraction": 0.6, - "divertor_peak_MW_m2": 5.724431818181818, + "divertor_peak_MW_m2": 5.724431818, "effective_wetted_area_m2": 24.0, - "first_wall_peak_MW_m2": 0.29426785527474164, + "first_wall_peak_MW_m2": 0.2942678553, "heat_flux_limits_pass": true }, { "controlled_radiation_fraction": 0.6, - "divertor_peak_MW_m2": 4.579545454545455, + "divertor_peak_MW_m2": 4.579545455, "effective_wetted_area_m2": 30.0, - "first_wall_peak_MW_m2": 0.29426785527474164, + "first_wall_peak_MW_m2": 0.2942678553, "heat_flux_limits_pass": true }, { "controlled_radiation_fraction": 0.7, - "divertor_peak_MW_m2": 8.586647727272728, + "divertor_peak_MW_m2": 8.586647727, "effective_wetted_area_m2": 12.0, - "first_wall_peak_MW_m2": 0.3433124978205319, + "first_wall_peak_MW_m2": 0.3433124978, "heat_flux_limits_pass": true }, { "controlled_radiation_fraction": 0.7, - "divertor_peak_MW_m2": 5.724431818181819, + "divertor_peak_MW_m2": 5.724431818, "effective_wetted_area_m2": 18.0, - "first_wall_peak_MW_m2": 0.3433124978205319, + "first_wall_peak_MW_m2": 0.3433124978, "heat_flux_limits_pass": true }, { "controlled_radiation_fraction": 0.7, - "divertor_peak_MW_m2": 4.293323863636364, + "divertor_peak_MW_m2": 4.293323864, "effective_wetted_area_m2": 24.0, - "first_wall_peak_MW_m2": 0.3433124978205319, + "first_wall_peak_MW_m2": 0.3433124978, "heat_flux_limits_pass": true }, { "controlled_radiation_fraction": 0.7, - "divertor_peak_MW_m2": 3.4346590909090913, + "divertor_peak_MW_m2": 3.434659091, "effective_wetted_area_m2": 30.0, - "first_wall_peak_MW_m2": 0.3433124978205319, + "first_wall_peak_MW_m2": 0.3433124978, "heat_flux_limits_pass": true } ], "heat_verdict": "NOMINAL_AND_DECLARED_STEADY_HEAT_ENVELOPE_SCREEN_PASS__DETACHMENT_EDGE_TOPOLOGY_TRANSIENTS_FATIGUE_AND_HARDWARE_UNPROVEN", "nominal_and_declared_steady_heat_envelope_pass": true, - "plasma_exhaust_power_MW": 228.97727272727272, + "plasma_exhaust_power_MW": 228.9772727, "selected_first_wall_screen": { "declared_weighted_architecture_score": 9.0, "direct_plasma_confinement_credit": 0.0, @@ -192,78 +192,78 @@ "nominal": { "all_layer_temperature_screens_pass": true, "coolant_bulk_temperature_C": 350.0, - "coolant_film_temperature_rise_K": 8.407653007849762, - "heat_flux_MW_m2": 0.29426785527474164, + "coolant_film_temperature_rise_K": 8.407653008, + "heat_flux_MW_m2": 0.2942678553, "layers_plasma_to_coolant": [ { - "cold_face_temperature_C": 391.34558908121573, + "cold_face_temperature_C": 391.3455891, "declared_max_service_temperature_C": 1600.0, - "hot_face_temperature_C": 401.1545175903738, + "hot_face_temperature_C": 401.1545176, "layer_id": "segmented_tungsten_armor", "material": "segmented tungsten", - "temperature_rise_K": 9.808928509158056, + "temperature_rise_K": 9.808928509, "temperature_screen_pass": true, - "thermal_resistance_m2K_W": 3.3333333333333335e-05 + "thermal_resistance_m2K_W": 3.333333333e-05 }, { - "cold_face_temperature_C": 385.9952644398568, + "cold_face_temperature_C": 385.9952644, "declared_max_service_temperature_C": 800.0, - "hot_face_temperature_C": 391.34558908121573, + "hot_face_temperature_C": 391.3455891, "layer_id": "graded_w_rafm_transition", "material": "functionally graded tungsten-to-RAFM transition candidate", - "temperature_rise_K": 5.350324641358939, + "temperature_rise_K": 5.350324641, "temperature_screen_pass": true, - "thermal_resistance_m2K_W": 1.8181818181818182e-05 + "thermal_resistance_m2K_W": 1.818181818e-05 }, { - "cold_face_temperature_C": 358.4076530078498, + "cold_face_temperature_C": 358.407653, "declared_max_service_temperature_C": 550.0, - "hot_face_temperature_C": 385.9952644398568, + "hot_face_temperature_C": 385.9952644, "layer_id": "helium_cooled_ods_rafm_first_wall", "material": "ODS-Eurofer or qualified RAFM with distributed helium microchannels", - "temperature_rise_K": 27.58761143200703, + "temperature_rise_K": 27.58761143, "temperature_screen_pass": true, "thermal_resistance_m2K_W": 9.375e-05 } ], - "plasma_facing_surface_temperature_C": 401.1545175903738, - "raw_cte_mismatch_strain_proxy": 0.0003836588819278036, + "plasma_facing_surface_temperature_C": 401.1545176, + "raw_cte_mismatch_strain_proxy": 0.0003836588819, "raw_cte_mismatch_strain_screen_pass": true, - "solid_thermal_resistance_m2K_W": 0.00014526515151515153, - "total_thermal_resistance_m2K_W": 0.00017383658008658008 + "solid_thermal_resistance_m2K_W": 0.0001452651515, + "total_thermal_resistance_m2K_W": 0.0001738365801 }, "physical_qualification_complete": false, "status": "SELECTED_FOR_REDUCED_HEAT_CAMPAIGN__NOT_QUALIFIED", "upset_steady_upper_bound": { "all_layer_temperature_screens_pass": true, "coolant_bulk_temperature_C": 350.0, - "coolant_film_temperature_rise_K": 28.57142857142857, + "coolant_film_temperature_rise_K": 28.57142857, "heat_flux_MW_m2": 1.0, "layers_plasma_to_coolant": [ { - "cold_face_temperature_C": 490.50324675324674, + "cold_face_temperature_C": 490.5032468, "declared_max_service_temperature_C": 1600.0, - "hot_face_temperature_C": 523.83658008658, + "hot_face_temperature_C": 523.8365801, "layer_id": "segmented_tungsten_armor", "material": "segmented tungsten", - "temperature_rise_K": 33.333333333333336, + "temperature_rise_K": 33.33333333, "temperature_screen_pass": true, - "thermal_resistance_m2K_W": 3.3333333333333335e-05 + "thermal_resistance_m2K_W": 3.333333333e-05 }, { - "cold_face_temperature_C": 472.32142857142856, + "cold_face_temperature_C": 472.3214286, "declared_max_service_temperature_C": 800.0, - "hot_face_temperature_C": 490.50324675324674, + "hot_face_temperature_C": 490.5032468, "layer_id": "graded_w_rafm_transition", "material": "functionally graded tungsten-to-RAFM transition candidate", - "temperature_rise_K": 18.181818181818183, + "temperature_rise_K": 18.18181818, "temperature_screen_pass": true, - "thermal_resistance_m2K_W": 1.8181818181818182e-05 + "thermal_resistance_m2K_W": 1.818181818e-05 }, { - "cold_face_temperature_C": 378.57142857142856, + "cold_face_temperature_C": 378.5714286, "declared_max_service_temperature_C": 550.0, - "hot_face_temperature_C": 472.32142857142856, + "hot_face_temperature_C": 472.3214286, "layer_id": "helium_cooled_ods_rafm_first_wall", "material": "ODS-Eurofer or qualified RAFM with distributed helium microchannels", "temperature_rise_K": 93.75, @@ -271,11 +271,11 @@ "thermal_resistance_m2K_W": 9.375e-05 } ], - "plasma_facing_surface_temperature_C": 523.83658008658, - "raw_cte_mismatch_strain_proxy": 0.0013037743506493504, + "plasma_facing_surface_temperature_C": 523.8365801, + "raw_cte_mismatch_strain_proxy": 0.001303774351, "raw_cte_mismatch_strain_screen_pass": true, - "solid_thermal_resistance_m2K_W": 0.00014526515151515153, - "total_thermal_resistance_m2K_W": 0.00017383658008658008 + "solid_thermal_resistance_m2K_W": 0.0001452651515, + "total_thermal_resistance_m2K_W": 0.0001738365801 } }, "transient_disruption_heat_resolved": false, @@ -314,45 +314,45 @@ "combined_screen_pass": false, "helical_coil_count": 4, "helical_to_tf_current_ratio": 1.0, - "iota_std": 0.020901758467938333, - "max_radial_excursion_m": 0.32678296522935457, - "mean_iota": 0.06533346156901079, - "mean_radial_excursion_m": 0.1804299730131634, + "iota_std": 0.02090175847, + "max_radial_excursion_m": 0.3267829652, + "mean_iota": 0.06533346157, + "mean_radial_excursion_m": 0.180429973, "nestedness_screen_pass": true, "nfp": 6, - "normalized_max_excursion_over_a": 0.19222527366432623, + "normalized_max_excursion_over_a": 0.1922252737, "sign_pattern": "alternating", - "tf_current_MA_turn_per_filament": -9.961772570142877, + "tf_current_MA_turn_per_filament": -9.96177257, "transform_screen_pass": false }, "candidate_count": 80, "combined_pass_count": 0, "held_out_hybrid_reconstruction": { "authority": "intermediate_held_out_biot_savart_filament_screen", - "axis_field_std_T": 0.0019628375615968123, + "axis_field_std_T": 0.001962837562, "basis": "24_encircling_plus_helical_harmonics_plus_48_saddle_filaments", "clearance_m": 1.35, "coil_count": 120, - "max_filament_current_MA_turn": 4.800318617939227, - "mean_axis_field_T": 5.999956193275066, + "max_filament_current_MA_turn": 4.800318618, + "mean_axis_field_T": 5.999956193, "nfp": 6, "passes_reconstruction_screen": false, - "rms_filament_current_MA_turn": 0.9978809803965022, - "train_mean_abs_Bn_over_B0": 0.05366247699520164, - "train_rms_Bn_over_B0": 0.06281297904419832, - "validation_max_abs_Bn_over_B": 0.14388776659782238, - "validation_mean_abs_Bn_over_B": 0.05487239488509926, - "validation_rms_Bn_over_B": 0.06491274876089598 + "rms_filament_current_MA_turn": 0.9978809804, + "train_mean_abs_Bn_over_B0": 0.053662477, + "train_rms_Bn_over_B0": 0.06281297904, + "validation_max_abs_Bn_over_B": 0.1438877666, + "validation_mean_abs_Bn_over_B": 0.05487239489, + "validation_rms_Bn_over_B": 0.06491274876 }, "physical_coil_promoted": false, "tf_centerline_geometry": { "authority": "geometry_only_rebco_strain_proxy_not_winding_pack_FEA", - "hard_way_strain_proxy_fraction": 0.0019672131147569494, - "length_m": 19.16316791644826, - "max_curvature_per_m": 0.32786885245949154, - "min_bend_radius_m": 3.04999999999558, + "hard_way_strain_proxy_fraction": 0.001967213115, + "length_m": 19.16316792, + "max_curvature_per_m": 0.3278688525, + "min_bend_radius_m": 3.05, "passes_geometry_strain_proxy": true, - "rms_curvature_per_m": 0.3278688524590164, + "rms_curvature_per_m": 0.3278688525, "strain_ceiling_fraction": 0.004, "strain_target_fraction": 0.0035 } @@ -372,12 +372,12 @@ }, "4_particle_confinement": { "alpha_energy_MeV": 3.5, - "alpha_speed_m_s_nonrelativistic": 12991757.997689921, + "alpha_speed_m_s_nonrelativistic": 12991758.0, "authority": "alpha_gyroradius_scope_only_not_orbit_retention", "field_line_topology_prerequisite_pass": false, "gyroradius_clearance_screen_pass": true, - "gyroradius_over_minor_radius": 0.02641191861509231, - "maximum_pitch_alpha_gyroradius_m": 0.04490026164565693, + "gyroradius_over_minor_radius": 0.02641191862, + "maximum_pitch_alpha_gyroradius_m": 0.04490026165, "particle_confinement_promoted": false, "reason": "A gyroradius scale and vacuum field-line test cannot establish guiding-center alpha retention. The physical coil candidate also fails its combined topology gate.", "required_external_evidence": [ @@ -392,55 +392,55 @@ "authority": "uniform_Bosch_Hale_plus_ISS04_and_bremsstrahlung_screen_not_transport_or_burn_simulation", "auxiliary_heating_MW": 50.0, "best_physical_coil_iota_requirement": { - "alpha_heating_MW": 198.86363636363635, + "alpha_heating_MW": 198.8636364, "auxiliary_heating_MW": 50.0, - "iota_screen": 0.06533346156901079, - "iss04_tau_E_H1_s": 0.2821969651931757, + "iota_screen": 0.06533346157, + "iss04_tau_E_H1_s": 0.2821969652, "plasma_gain_Q": 20.0, - "required_H_ISS04": 4.188696983732281, - "required_tau_E_s": 1.1820375769230584, - "total_thermal_energy_MJ": 294.1661697115338 + "required_H_ISS04": 4.188696984, + "required_tau_E_s": 1.182037577, + "total_thermal_energy_MJ": 294.1661697 }, - "bremsstrahlung_MW_screen": 11.33738085563469, - "deposited_alpha_heating_MW_assumption": 178.97727272727272, + "bremsstrahlung_MW_screen": 11.33738086, + "deposited_alpha_heating_MW_assumption": 178.9772727, "design_iota_requirement": { - "alpha_heating_MW": 198.86363636363635, + "alpha_heating_MW": 198.8636364, "auxiliary_heating_MW": 50.0, "iota_screen": 0.55, - "iss04_tau_E_H1_s": 0.6759201871053372, + "iss04_tau_E_H1_s": 0.6759201871, "plasma_gain_Q": 20.0, - "required_H_ISS04": 1.748782769730839, - "required_tau_E_s": 1.1820375769230584, - "total_thermal_energy_MJ": 294.1661697115338 + "required_H_ISS04": 1.74878277, + "required_tau_E_s": 1.182037577, + "total_thermal_energy_MJ": 294.1661697 }, - "net_heating_after_bremsstrahlung_MW": 217.63989187163804, + "net_heating_after_bremsstrahlung_MW": 217.6398919, "physical_coil_linked_burn_promoted": false, "reason": "The best direct-filament coil fails topology; a design-iota burn target cannot be assigned to it.", - "required_H_ISS04_with_bremsstrahlung_at_design_iota": 1.9996721903444525, - "required_tau_E_with_bremsstrahlung_s": 1.3516188010469619, + "required_H_ISS04_with_bremsstrahlung_at_design_iota": 1.99967219, + "required_tau_E_with_bremsstrahlung_s": 1.351618801, "uniform_burn_point": { "beta": 0.03, - "dt_reactivity_m3_s": 2.7399296107880726e-22, + "dt_reactivity_m3_s": 2.739929611e-22, "field_T": 6.0, - "fusion_power_MW_uniform": 704.5706395923565, - "ion_density_m3": 8.940303193980161e+19, - "pressure_Pa": 429718.34634811745, + "fusion_power_MW_uniform": 704.5706396, + "ion_density_m3": 8.940303194e+19, + "pressure_Pa": 429718.3463, "target_fusion_power_MW": 1000.0, - "target_to_uniform_ratio": 1.4193041035297327, + "target_to_uniform_ratio": 1.419304104, "temperature_keV": 15.0, - "volume_m3": 456.37050750637184 + "volume_m3": 456.3705075 } }, "6_magnet_engineering": { "authority": "magnetic_pressure_energy_and_centerline_geometry_scope_not_winding_pack_or_support_FEA", - "best_candidate_tf_current_MA_turn_per_filament": -9.961772570142877, + "best_candidate_tf_current_MA_turn_per_filament": -9.96177257, "centerline_geometry_screen_pass": true, "declared_peak_field_on_conductor_limit_T": 20.0, "magnet_promoted": false, - "magnetic_pressure_MPa_axis_field_proxy": 14.323944878270579, + "magnetic_pressure_MPa_axis_field_proxy": 14.32394488, "peak_field_on_conductor_calculated": false, "quench_protection_qualified": false, - "stored_magnetic_energy_GJ_plasma_volume_proxy": 6.53702599358964, + "stored_magnetic_energy_GJ_plasma_volume_proxy": 6.537025994, "structural_FEA_completed": false }, "7_reactor_systems": { @@ -450,23 +450,23 @@ "breeding_surface_coverage_fraction": 0.85, "fusion_power_MW": 1000.0, "global_tbr_target": 1.15, - "neutron_power_MW": 801.1363636363636, - "neutron_source_rate_s": 3.546311974125433e+20, - "required_bred_tritium_kg_per_day": 0.17647209941383038, - "required_local_tbr_if_uncovered_regions_breed_zero": 1.352941176470588, - "tritium_burn_kg_per_day": 0.1534539994902873 + "neutron_power_MW": 801.1363636, + "neutron_source_rate_s": 3.546311974e+20, + "required_bred_tritium_kg_per_day": 0.1764720994, + "required_local_tbr_if_uncovered_regions_breed_zero": 1.352941176, + "tritium_burn_kg_per_day": 0.1534539995 }, "conditional_gross_electric_MW": 460.0, - "conditional_net_electric_MW": 339.8782214922008, - "conditional_recirculating_power_MW": 120.1217785077992, + "conditional_net_electric_MW": 339.8782215, + "conditional_recirculating_power_MW": 120.1217785, "conditional_thermal_power_MW": 1150.0, "dt_source_ledger": { - "alpha_power_MW": 198.86363636363635, - "deuterium_burn_kg_per_day": 0.10247577023313308, + "alpha_power_MW": 198.8636364, + "deuterium_burn_kg_per_day": 0.1024757702, "fusion_power_MW": 1000.0, - "neutron_power_MW": 801.1363636363636, - "reaction_rate_per_s": 3.546311974125433e+20, - "tritium_burn_kg_per_day": 0.1534539994902873 + "neutron_power_MW": 801.1363636, + "reaction_rate_per_s": 3.546311974e+20, + "tritium_burn_kg_per_day": 0.1534539995 }, "full_3D_TBR_calculated": false, "net_electric_prediction_promoted": false diff --git a/src/ix_stellaratorforge/evidence_canonical.py b/src/ix_stellaratorforge/evidence_canonical.py new file mode 100644 index 0000000..6584d6e --- /dev/null +++ b/src/ix_stellaratorforge/evidence_canonical.py @@ -0,0 +1,40 @@ +"""Cross-platform canonicalization for persisted numerical evidence.""" +from __future__ import annotations + +from functools import wraps +from math import isfinite +from typing import Any, Callable + + +def canonicalize_evidence(value: Any) -> Any: + """Return evidence with finite floats rounded to 10 significant digits. + + LAPACK and BLAS implementations can differ in the last few floating-point + bits. Persisted evidence needs a stable representation across supported + platforms while retaining substantially more precision than any declared + screening threshold. + """ + if isinstance(value, float): + return float(format(value, ".10g")) if isfinite(value) else value + if isinstance(value, dict): + return { + key: canonicalize_evidence(item) + for key, item in value.items() + } + if isinstance(value, list): + return [canonicalize_evidence(item) for item in value] + if isinstance(value, tuple): + return tuple(canonicalize_evidence(item) for item in value) + return value + + +def canonical_evidence( + function: Callable[..., dict[str, Any]], +) -> Callable[..., dict[str, Any]]: + """Canonicalize the evidence dictionary returned by a calculation.""" + + @wraps(function) + def wrapped(*args: Any, **kwargs: Any) -> dict[str, Any]: + return canonicalize_evidence(function(*args, **kwargs)) + + return wrapped \ No newline at end of file diff --git a/src/ix_stellaratorforge/sfr3_dual_boundary.py b/src/ix_stellaratorforge/sfr3_dual_boundary.py index 2da2d1c..48fe794 100644 --- a/src/ix_stellaratorforge/sfr3_dual_boundary.py +++ b/src/ix_stellaratorforge/sfr3_dual_boundary.py @@ -16,6 +16,7 @@ from typing import Any from .sfr3_field_integrity import run_sfr3_field_integrity_screen +from .evidence_canonical import canonical_evidence AUTHORITY = ( "LOW__1D_thermal_resistance_plus_deterministic_fault_logic__not_safety_or_confinement" @@ -281,7 +282,7 @@ def validate_dual_boundary_config(raw: dict[str, Any]) -> tuple[str, ...]: errors.append(f"invalid dual-boundary config: {exc}") return tuple(errors) - +@canonical_evidence def run_dual_boundary_screen( raw: dict[str, Any], sfr3_raw: dict[str, Any] ) -> dict[str, Any]: diff --git a/src/ix_stellaratorforge/sfr3_field_integrity.py b/src/ix_stellaratorforge/sfr3_field_integrity.py index 338414e..1b82728 100644 --- a/src/ix_stellaratorforge/sfr3_field_integrity.py +++ b/src/ix_stellaratorforge/sfr3_field_integrity.py @@ -17,7 +17,7 @@ from typing import Any import numpy as np - +from .evidence_canonical import canonical_evidence AUTHORITY = "LOW__synthetic_linear_harmonic_controllability__not_physical_confinement" PASS_VERDICT = ( "SYNTHETIC_HARMONIC_CONTROL_DEMONSTRATED__PHYSICAL_CONFINEMENT_UNPROVEN" @@ -254,7 +254,7 @@ def _evaluate_scenario( "fusion_or_ignition_credit": 0.0, } - +@canonical_evidence def run_sfr3_field_integrity_screen(raw: dict[str, Any]) -> dict[str, Any]: """Run the declared SFR-3 screen and return a deterministic evidence artifact.""" errors = validate_sfr3_config(raw) diff --git a/src/ix_stellaratorforge/sfr4_integrated_campaign.py b/src/ix_stellaratorforge/sfr4_integrated_campaign.py index e4548d2..0d7b2f9 100644 --- a/src/ix_stellaratorforge/sfr4_integrated_campaign.py +++ b/src/ix_stellaratorforge/sfr4_integrated_campaign.py @@ -31,6 +31,7 @@ from .neutronics_constraints import breeding_coverage_constraint from .physics import dt_reaction_ledger from .sfr3_dual_boundary import evaluate_stack +from .evidence_canonical import canonical_evidence from .vacuum_codesign import evaluate_helical_architecture AUTHORITY = ( @@ -491,7 +492,7 @@ def validate_integrated_config(raw: dict[str, Any]) -> tuple[str, ...]: errors.append(f"invalid integrated config: {exc}") return tuple(errors) - +@canonical_evidence def run_integrated_campaign(raw: dict[str, Any]) -> dict[str, Any]: errors = validate_integrated_config(raw) if errors: From 99ef31adc6d60ad4d87951e814cfdbeb7d78926b Mon Sep 17 00:00:00 2001 From: Bryce Lovell <40742705+BryceWDesign@users.noreply.github.com> Date: Sat, 22 Aug 2026 17:23:39 -0700 Subject: [PATCH 3/3] Fix manifest hashes for LF-normalized release files --- MANIFEST.sha256 | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/MANIFEST.sha256 b/MANIFEST.sha256 index 2cfc644..809c43b 100644 --- a/MANIFEST.sha256 +++ b/MANIFEST.sha256 @@ -172,12 +172,12 @@ fb9d8c91204c9cc6947d71b094fede656c053c6faa14ef4294082c4e7b9f2da3 results/reacto 5d40a8d343023a48a5c5c8d89e9194447d86a8d4c83ca76507eae492251a5193 results/sfr2/SFR2_REVA_SCREEN_RESULT.md 13ce8a27fe47d32d29c66e405adb78eaa0760129281f25772abbd36d34dfcebf results/sfr2_actuation/SFR2_ACTUATION_OVERLAY_A_RESULT.md ecf8b8c18779ed9e9c8b82bbc86cb1989fbd16d283b65b0f8c2ecf132dfec5dc results/sfr2_actuation/sfr2_actuation_overlay_a_v060.json -5704b81fb39423171c2ded5f374995a9e6c1f24b7be7f92ab053c2e1a499077e results/sfr3_dual_boundary/SFR3_DUAL_BOUNDARY_AHIS_A_RESULT.md -a48c48f5682ba925b4e52604c3622592a92b761160cee9799ea3b92fb718bf9b results/sfr3_dual_boundary/sfr3_dual_boundary_ahis_a_v080.json -d6511e149b287cd1d6ff5d9fd720e379bfc95129bae9db5532b9d4378904af26 results/sfr3_field_integrity/SFR3_FIELD_INTEGRITY_SHELL_A_RESULT.md -c6f1194fd691ecab4977e58a06d7c668bc7783e79c2fc7a558548cba6a1b7dee results/sfr3_field_integrity/sfr3_field_integrity_shell_a_v070.json -8ccebbd585072c89deeba6c9e637eea89b46b6a9ddef0039fc02eb8f6876b027 results/sfr4_integrated/SFR4_INTEGRATED_PHYSICAL_PROMOTION_A_RESULT.md -dbd1aeaca5fedf6a0832b636ab4975c2bfa1847ae94162469f59a201db5b5c3c results/sfr4_integrated/sfr4_integrated_physical_promotion_a_v090.json +020d0157fe920b1b5e17d43229c4ddf8ee85d3258f3eba3db293e33683c057a1 results/sfr3_dual_boundary/SFR3_DUAL_BOUNDARY_AHIS_A_RESULT.md +6bc13c036a693fadbb52f2ceabe1959021c4e2b637d4962e2e2c05758dc8fc31 results/sfr3_dual_boundary/sfr3_dual_boundary_ahis_a_v080.json +958324b6953d6fef86ac023636ddcaea6ef213567f51f56c2850dcf1a37cbbbb results/sfr3_field_integrity/SFR3_FIELD_INTEGRITY_SHELL_A_RESULT.md +396673ad083c45a5fd79d40c447f158d2d3021821e8abac024a5171756b6d69b results/sfr3_field_integrity/sfr3_field_integrity_shell_a_v070.json +b8f300c8dbab375a66b39cc4812ed30bdbab4f0c6d70f114f1b79452a9e796ad results/sfr4_integrated/SFR4_INTEGRATED_PHYSICAL_PROMOTION_A_RESULT.md +42aa9e0de1b2f332ec12ee426a2cc87231f92ff7d7dc148a2e1b0db0b6b139fb results/sfr4_integrated/sfr4_integrated_physical_promotion_a_v090.json ef748a2605b4ad18f1c7e584f950eba589b23713840178e87bb6a99d676912ef results/vnext/CURRENT_VERDICT.md 3ad823aeaa19e17a12dae6cc89aaa08be9274ee0fa9139624ff784d50293ccfd results/vnext/readiness_report.json 999d106c2531098142befeb8d0d91be43dc7138e8e76706accaee1cb9275049f results/vnext/robust_nfp_sweep.json @@ -256,7 +256,7 @@ ae883b8b0a781f56af5b41e2e787ad9020b526af20755b0ac34789aa1489cd73 src/ix_stellar 8798532e5df34141747cf3afd123ed73e068c1bad0903851c08003bdb143c596 src/ix_stellaratorforge/computational_closure.py 5d309da8e8d7c8f85a6d9808e7f74e01e3591cd0acfc7f3a5235c1ac0d487331 src/ix_stellaratorforge/current_potential_screen.py facbec720533cac990dff3147e3a351d33fb90e2a41ea9493f095b699ec8d1da src/ix_stellaratorforge/equilibrium_inputs.py -d8499032505bef894ded8e08fec88bbc6e46adc41a0667fe4d6a92dad154ba90 src/ix_stellaratorforge/evidence_canonical.py +ccfe1d85a8ce307e13a0dd6741f9641021249f8c3281e36e7266a3972b9cce58 src/ix_stellaratorforge/evidence_canonical.py 623b93765636b1291828d15fdfb976576f4766ab545ec0a61061b5328e3658f6 src/ix_stellaratorforge/hts_screen.py 2abf967d97b7d9c2704e93d2b985a836d94973d4120d194ad85ff88bcc63978f src/ix_stellaratorforge/neutronics_constraints.py 95d114c348a77948fe7e480fdb58a72443dd9052491fe2112c2297f41d836777 src/ix_stellaratorforge/physics.py