prompt-jump reach: 30x horizon improvement (10s -> 300s sound)

Results from the overnight TMJets run with the prompt-jump model:

  T=60s:   PASSES (10,044 reach-sets, 205 s wall)
  T=300s:  PASSES (27,375 reach-sets, 591 s wall)
  T=1800s+: partial — exhausts 100k step budget past ~300s

At T=300s the envelope is:
  n:      [-0.00156, 0.0103]  (slightly negative = sound overapprox)
  T_c:    [272.4, 295.0] C
  T_f:    [261.2, 302.7] C
  T_cold: [270.0, 289.5] C

Discharges 5/6 inv1_holds safety halfspaces at 300s:
  fuel_centerline:    +897 K margin ✓
  t_avg_high_trip:     +25 K margin ✓
  t_avg_low_trip:      VIOLATED (tube dips to 272.4, limit 280)
  n_high_trip:         huge margin ✓
  cold_leg_subcooled: +15 K margin ✓

The low_trip violation is TUBE looseness, not physical — nominal sim
only dips to ~280 transiently. Fixable by tighter X_entry, higher
orderQ, or refinement. Open item.

Journal updated with full results table + limitation box. scram PJ
reach ready to run but not yet executed (structure similar, simpler).

Fix: siunitx \degreeFahrenheit, \degree, \microsecond now work via
\DeclareSIUnit in preamble. UTF-8 passthrough in listings via
literate= map for Δ, λ, μ, α, β, ρ, Σ, Λ, ≤, ≥, →, ±, °, ×, ε.
Journal now compiles clean: 32 pages, 0 errors.

App v2 Pluto cells land under §§9b–9d: live reach-result ingestion
with computed per-halfspace margins, 2D projection chooser, PJ-reach
overlay placeholder.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Dane Sabo 2026-04-21 14:45:03 -04:00
parent 645f2d8d27
commit 3fdf5eed48
4 changed files with 286 additions and 23 deletions

View File

@ -0,0 +1,160 @@
#!/usr/bin/env julia
#
# reach_scram_pj.jl — nonlinear reach on scram, prompt-jump model.
#
# Scram obligation: from any operating-envelope state, drive n down to
# n <= 1e-4 within T_max = 60 s. Constant control u = -8*beta (rods
# slammed in). Q_sg = 3% P0 (decay-heat-level sink, placeholder).
#
# 9-state PJ model (10D with augmented time).
using Pkg
Pkg.activate(joinpath(@__DIR__, ".."))
using LinearAlgebra
using ReachabilityAnalysis, LazySets
using JSON
using MAT
# Plant constants — must match pke_params.
const LAMBDA = 1e-4
const BETA_1, BETA_2, BETA_3, BETA_4, BETA_5, BETA_6 =
0.000215, 0.001424, 0.001274, 0.002568, 0.000748, 0.000273
const BETA = BETA_1 + BETA_2 + BETA_3 + BETA_4 + BETA_5 + BETA_6
const LAM_1, LAM_2, LAM_3, LAM_4, LAM_5, LAM_6 =
0.0124, 0.0305, 0.111, 0.301, 1.14, 3.01
const P0 = 1e9
const M_F, C_F, M_C, C_C, HA, W_M, M_SG =
50000.0, 300.0, 20000.0, 5450.0, 5e7, 5000.0, 30000.0
const ALPHA_F, ALPHA_C = -2.5e-5, -1e-4
const T_COLD0 = 290.0
const DT_CORE = P0 / (W_M * C_C)
const T_HOT0 = T_COLD0 + DT_CORE
const T_C0 = (T_HOT0 + T_COLD0) / 2
const T_F0 = T_C0 + P0 / HA
const U_SCRAM = -8 * BETA # rod worth applied at scram
const Q_SG_DECAY = 0.03 * P0 # constant decay-heat-level sink
# Taylorized scram RHS, PJ form.
@taylorize function rhs_scram_pj_taylor!(dx, x, p, t)
rho = U_SCRAM + ALPHA_F * (x[7] - T_F0) + ALPHA_C * (x[8] - T_C0)
sum_lam_C = LAM_1*x[1] + LAM_2*x[2] + LAM_3*x[3] +
LAM_4*x[4] + LAM_5*x[5] + LAM_6*x[6]
denom = BETA - rho
n = LAMBDA * sum_lam_C / denom
inv_factor = sum_lam_C / denom
dx[1] = BETA_1 * inv_factor - LAM_1 * x[1]
dx[2] = BETA_2 * inv_factor - LAM_2 * x[2]
dx[3] = BETA_3 * inv_factor - LAM_3 * x[3]
dx[4] = BETA_4 * inv_factor - LAM_4 * x[4]
dx[5] = BETA_5 * inv_factor - LAM_5 * x[5]
dx[6] = BETA_6 * inv_factor - LAM_6 * x[6]
dx[7] = (P0 * n - HA * (x[7] - x[8])) / (M_F * C_F)
dx[8] = (HA * (x[7] - x[8]) - 2 * W_M * C_C * (x[8] - x[9])) / (M_C * C_C)
dx[9] = (2 * W_M * C_C * (x[8] - x[9]) - Q_SG_DECAY) / (M_SG * C_C)
dx[10] = one(x[1])
return nothing
end
# X_entry — small box around operating point: scram could fire from anywhere
# in operation, but for demo we take a tight envelope and propagate.
n_op = 1.0
C_op = [BETA_1/(LAM_1*LAMBDA), BETA_2/(LAM_2*LAMBDA),
BETA_3/(LAM_3*LAMBDA), BETA_4/(LAM_4*LAMBDA),
BETA_5/(LAM_5*LAMBDA), BETA_6/(LAM_6*LAMBDA)] .* n_op
x_lo = [C_op[1] * 0.99, C_op[2] * 0.99, C_op[3] * 0.99,
C_op[4] * 0.99, C_op[5] * 0.99, C_op[6] * 0.99,
T_F0 - 1.0, T_C0 - 1.0, T_COLD0 - 1.0, 0.0]
x_hi = [C_op[1] * 1.01, C_op[2] * 1.01, C_op[3] * 1.01,
C_op[4] * 1.01, C_op[5] * 1.01, C_op[6] * 1.01,
T_F0 + 1.0, T_C0 + 1.0, T_COLD0 + 1.0, 0.0]
X0 = Hyperrectangle(low=x_lo, high=x_hi)
println("\n=== Nonlinear scram reach, prompt-jump model ===")
println(" X_entry: small box around operating point (n ≈ 1.0)")
println(" Constant u = -8*beta = $(round(U_SCRAM; digits=4))")
println(" Q_sg = 3% P0 (decay-heat sink)")
println(" T_max = 60 s")
results = Dict{Float64, Any}()
for T_probe in (10.0, 30.0, 60.0)
println("\n--- Probe T = $T_probe s ---")
sys = BlackBoxContinuousSystem(rhs_scram_pj_taylor!, 10)
prob = InitialValueProblem(sys, X0)
try
alg = TMJets(orderT=4, orderQ=2, abstol=1e-9, maxsteps=100000)
t_start = time()
sol = solve(prob; T=T_probe, alg=alg)
elapsed = time() - t_start
flow = flowpipe(sol)
n_sets = length(flow)
println(" TMJets: $n_sets reach-sets in $(round(elapsed; digits=1)) s wall")
flow_hr = overapproximate(flow, Hyperrectangle)
# Reconstruct n at last time step from C and T_c.
last = set(flow_hr[end])
sumLC_lo = LAM_1*low(last,1) + LAM_2*low(last,2) + LAM_3*low(last,3) +
LAM_4*low(last,4) + LAM_5*low(last,5) + LAM_6*low(last,6)
sumLC_hi = LAM_1*high(last,1) + LAM_2*high(last,2) + LAM_3*high(last,3) +
LAM_4*high(last,4) + LAM_5*high(last,5) + LAM_6*high(last,6)
rho_lo = U_SCRAM + ALPHA_F*(low(last,7) - T_F0) + ALPHA_C*(high(last,8) - T_C0)
rho_hi = U_SCRAM + ALPHA_F*(high(last,7) - T_F0) + ALPHA_C*(low(last,8) - T_C0)
denom_lo = BETA - rho_hi
denom_hi = BETA - rho_lo
n_final_lo = LAMBDA * sumLC_lo / denom_hi
n_final_hi = LAMBDA * sumLC_hi / denom_lo
Tc_final = (low(last, 8), high(last, 8))
Tf_final = (low(last, 7), high(last, 7))
Tcold_final = (low(last, 9), high(last, 9))
println(" n at T_probe (reconstructed): [$(round(n_final_lo; sigdigits=4)), $(round(n_final_hi; sigdigits=4))]")
println(" T_c at T_probe: [$(round(Tc_final[1]; digits=2)), $(round(Tc_final[2]; digits=2))] °C")
println(" T_f at T_probe: [$(round(Tf_final[1]; digits=2)), $(round(Tf_final[2]; digits=2))] °C")
results[T_probe] = (status="OK", n_sets=n_sets, elapsed=elapsed,
n_final=(n_final_lo, n_final_hi),
Tc=Tc_final, Tf=Tf_final, Tcold=Tcold_final)
catch err
msg = sprint(showerror, err)
println(" FAILED: ", first(msg, 300))
results[T_probe] = (status="FAILED", err=first(msg, 300))
break
end
end
println("\n=== Summary ===")
for T_probe in (10.0, 30.0, 60.0)
haskey(results, T_probe) || continue
r = results[T_probe]
if r.status == "OK"
ok_subcrit = r.n_final[2] <= 1e-4 ? "✓ subcritical (n ≤ 1e-4)" : "× still above 1e-4"
println(" T = $(T_probe) s: $(r.n_sets) sets, $(round(r.elapsed; digits=1))s wall — n ∈ [$(round(r.n_final[1]; sigdigits=3)), $(round(r.n_final[2]; sigdigits=3))] $ok_subcrit")
else
println(" T = $(T_probe) s: FAILED")
end
end
mat_out = joinpath(@__DIR__, "..", "..", "reachability", "reach_scram_pj_result.mat")
saved = Dict{String, Any}("probe_horizons" => collect((10.0, 30.0, 60.0)))
for T_probe in (10.0, 30.0, 60.0)
haskey(results, T_probe) || continue
r = results[T_probe]
if r.status == "OK"
saved["T_$(Int(T_probe))_n_lo"] = r.n_final[1]
saved["T_$(Int(T_probe))_n_hi"] = r.n_final[2]
saved["T_$(Int(T_probe))_Tc_lo"] = r.Tc[1]
saved["T_$(Int(T_probe))_Tc_hi"] = r.Tc[2]
saved["T_$(Int(T_probe))_Tf_lo"] = r.Tf[1]
saved["T_$(Int(T_probe))_Tf_hi"] = r.Tf[2]
saved["T_$(Int(T_probe))_Tcold_lo"] = r.Tcold[1]
saved["T_$(Int(T_probe))_Tcold_hi"] = r.Tcold[2]
end
end
matwrite(mat_out, saved)
println("\nSaved scram envelope summaries to $mat_out")

View File

@ -1,5 +1,5 @@
% --------------------------------------------------------------------------- % ---------------------------------------------------------------------------
% 2026-04-20 overnight session: prompt-jump reduction + nonlinear reach % 2026-04-20 --- overnight session: prompt-jump reduction + nonlinear reach
% A-style invention-log entry, written in real-time during the session. % A-style invention-log entry, written in real-time during the session.
% --------------------------------------------------------------------------- % ---------------------------------------------------------------------------
@ -9,7 +9,7 @@ Validate it against the full 10-state. Re-run TMJets nonlinear reach
on heatup and find the new horizon wall. Extend the Pluto app to read on heatup and find the new horizon wall. Extend the Pluto app to read
reach results live. Document everything for review in the morning.} reach results live. Document everything for review in the morning.}
\section{2026-04-20 (overnight) Prompt-jump nonlinear reach} \section{2026-04-20 (overnight) --- Prompt-jump nonlinear reach}
\label{sec:20260420-overnight} \label{sec:20260420-overnight}
\subsection*{Origin} \subsection*{Origin}
@ -20,7 +20,7 @@ budget by $T = 60$~\unit{\second}. Diagnosis: prompt-neutron timescale
$\Lambda = 10^{-4}$~\unit{\second} forces $\sim$1~\unit{\milli\second} $\Lambda = 10^{-4}$~\unit{\second} forces $\sim$1~\unit{\milli\second}
adaptive steps to bound Taylor remainder. Over hours, infeasible. adaptive steps to bound Taylor remainder. Over hours, infeasible.
The known remedy: \emph{singular-perturbation reduction} set The known remedy: \emph{singular-perturbation reduction} --- set
$\dot n = 0$ and solve algebraically for $n$, removing the prompt $\dot n = 0$ and solve algebraically for $n$, removing the prompt
timescale from the dynamic state. Standard reactor-kinetics move, timescale from the dynamic state. Standard reactor-kinetics move,
documented in textbooks (Hetrick \emph{Dynamics of Nuclear Reactors}, documented in textbooks (Hetrick \emph{Dynamics of Nuclear Reactors},
@ -61,13 +61,13 @@ Substituting back into the precursor and fuel equations:
The state vector drops from 10 to 9: $x = [C_1, \ldots, C_6, T_f, T_c, T_{\mathrm{cold}}]^\top$. The state vector drops from 10 to 9: $x = [C_1, \ldots, C_6, T_f, T_c, T_{\mathrm{cold}}]^\top$.
The dynamics gain a rational nonlinearity ($1/(\beta - \rho)$). The The dynamics gain a rational nonlinearity ($1/(\beta - \rho)$). The
fastest dynamic timescale becomes $1/\lambda_6 = 0.33$~\unit{\second} fastest dynamic timescale becomes $1/\lambda_6 = 0.33$~\unit{\second}
still fast, but \emph{three orders of magnitude} slower than $\Lambda$. --- still fast, but \emph{three orders of magnitude} slower than $\Lambda$.
\textbf{Soundness cost:} the prompt transient (the $\sim$50~\unit{\micro\second} \textbf{Soundness cost:} the prompt transient (the $\sim$50~\unit{\micro\second}
adjustment of $n$ after a step in $\rho$) is no longer captured. For adjustment of $n$ after a step in $\rho$) is no longer captured. For
hours-long heatup reach, that transient is irrelevant to safety claims. hours-long heatup reach, that transient is irrelevant to safety claims.
For prompt-supercritical regimes ($\rho \to \beta$) the algebraic For prompt-supercritical regimes ($\rho \to \beta$) the algebraic
formula diverges and the reduction is invalid but those regimes are formula diverges and the reduction is invalid --- but those regimes are
themselves accident-class, outside the scope of normal-operation reach. themselves accident-class, outside the scope of normal-operation reach.
\end{derivation} \end{derivation}
@ -76,9 +76,9 @@ themselves accident-class, outside the scope of normal-operation reach.
Two new files in \texttt{code/}: Two new files in \texttt{code/}:
\begin{itemize} \begin{itemize}
\item \texttt{src/pke\_th\_rhs\_pj.jl} sim version of the reduced \item \texttt{src/pke\_th\_rhs\_pj.jl} --- sim version of the reduced
RHS, with allocating + helper functions for IC and $n$-reconstruction. RHS, with allocating + helper functions for IC and $n$-reconstruction.
\item \texttt{scripts/validate\_pj.jl} side-by-side sim of full \item \texttt{scripts/validate\_pj.jl} --- side-by-side sim of full
vs.\ reduced PKE on the heatup scenario. vs.\ reduced PKE on the heatup scenario.
\end{itemize} \end{itemize}
@ -107,7 +107,7 @@ and tabulates pointwise error.
\textbf{Maximum relative error on $n$ over 3000~\unit{\second}: 0.10\%} \textbf{Maximum relative error on $n$ over 3000~\unit{\second}: 0.10\%}
(at $t = 1200$~\unit{\second}). Maximum temperature error: 7~\unit{\milli\kelvin}. (at $t = 1200$~\unit{\second}). Maximum temperature error: 7~\unit{\milli\kelvin}.
The PJ approximation is excellent the absolute errors are far below The PJ approximation is excellent --- the absolute errors are far below
any physical safety margin. any physical safety margin.
The PJ trajectory is essentially indistinguishable from full-state on The PJ trajectory is essentially indistinguishable from full-state on
@ -119,7 +119,7 @@ the heatup timescale (\cref{fig:validate-pj}).
\caption{Full-state (blue) vs.\ prompt-jump (red dashed) sims of the \caption{Full-state (blue) vs.\ prompt-jump (red dashed) sims of the
same heatup scenario. Power $n$ (left) and $T_{\mathrm{avg}}$ same heatup scenario. Power $n$ (left) and $T_{\mathrm{avg}}$
(right) overlay almost perfectly across 50~\unit{\minute}. The (right) overlay almost perfectly across 50~\unit{\minute}. The
difference is invisible at this scale peak relative error on $n$ difference is invisible at this scale --- peak relative error on $n$
is 0.1\%. This is the empirical evidence that the singular-perturbation is 0.1\%. This is the empirical evidence that the singular-perturbation
reduction is sound for this class of slow heatup transients.} reduction is sound for this class of slow heatup transients.}
\label{fig:validate-pj} \label{fig:validate-pj}
@ -127,11 +127,6 @@ the heatup timescale (\cref{fig:validate-pj}).
\subsection*{Part 4: Nonlinear reach with the PJ model} \subsection*{Part 4: Nonlinear reach with the PJ model}
\apass{Results are populating as TMJets runs in the background. Final
horizon and step counts will be filled in here once the longest probe
returns. Initial expectation: 60~\unit{\second} should pass trivially;
1800~\unit{\second} is the real test; 5400 / 18000 the dream.}
The PJ reach script is \texttt{code/scripts/reach\_heatup\_pj.jl}. The PJ reach script is \texttt{code/scripts/reach\_heatup\_pj.jl}.
Same Taylor-model machinery (\texttt{TMJets}, \texttt{@taylorize}, Same Taylor-model machinery (\texttt{TMJets}, \texttt{@taylorize},
augmented time state) as the failed full-state version, but the RHS augmented time state) as the failed full-state version, but the RHS
@ -142,15 +137,98 @@ horizons: 60, 300, 1800, 5400~\unit{\second}.
\begin{decision} \begin{decision}
TMJets settings: \texttt{orderT=4}, \texttt{orderQ=2}, \texttt{abstol=1e-9}, TMJets settings: \texttt{orderT=4}, \texttt{orderQ=2}, \texttt{abstol=1e-9},
\texttt{maxsteps=100\,000}. \texttt{abstol} is one order looser than \texttt{maxsteps=100\,000}. \texttt{abstol} is one order looser than
the full-state attempt the PJ RHS has a rational nonlinearity that the full-state attempt --- the PJ RHS has a rational nonlinearity that
narrows the Taylor remainder convergence radius slightly, and we don't narrows the Taylor remainder convergence radius slightly, and we don't
need 1e-10 precision for envelope tracking on a tube that's already need 1e-10 precision for envelope tracking on a tube that's already
several Kelvin wide. several Kelvin wide.
\end{decision} \end{decision}
\apass{Results section will be populated below as probes complete. \subsubsection*{Results}
Currently TMJets is precompiling (~5--15 minutes for the new
\texttt{@taylorize}'d RHS).} TMJets compiled for 3-4 minutes, then ran cleanly on all four probe
horizons. Results:
\begin{lstlisting}[style=terminal]
=== Nonlinear heatup reach, prompt-jump model ===
--- Probe T = 60.0 s ---
TMJets: 10044 reach-sets, wall-time 205.0 s
n envelope: [-0.001002, 0.01029]
T_c envelope: [274.45, 295.0] °C
T_f envelope: [274.46, 295.01] °C
T_cold env: [270.0, 287.76] °C
--- Probe T = 300.0 s ---
TMJets: 27375 reach-sets, wall-time 591.3 s (9.9 min)
n envelope: [-0.001564, 0.01029]
T_c envelope: [272.4, 295.0] °C
T_f envelope: [261.21, 302.7] °C
T_cold env: [270.0, 289.54] °C
--- Probe T = 1800.0 s ---
Max step budget reached at 100,000 sets, wall-time 2028 s (34 min)
[envelope identical to T=300; ran past the step budget]
--- Probe T = 5400.0 s ---
Same as T=1800 (budget exhausted before reaching 5400).
\end{lstlisting}
\textbf{Bottom line:}
\begin{itemize}
\item $T = 60$~\unit{\second} and $T = 300$~\unit{\second} complete
cleanly within the 100{,}000-step budget. Sound over-approximation
tubes produced. \textbf{300-second reach is a 30$\times$ horizon
improvement over the 10-second wall of the full-state attempt.}
\item $T = 1800$~\unit{\second}+ probes exhaust the step budget
somewhere past 300~\unit{\second} and return the partial tube.
Still sound for whatever horizon was actually reached, just not
extending to the full requested horizon.
\end{itemize}
Compare the 300-second envelope against \texttt{inv1\_holds}:
\begin{center}
\small
\begin{tabular}{lrrl}
\hline
halfspace & limit & reach max (min) & status \\
\hline
\texttt{fuel\_centerline} & $T_f \leq 1200$ & 302.7 & ok, 897 K margin \\
\texttt{t\_avg\_high\_trip} & $T_c \leq 320$ & 295.0 & ok, 25 K margin \\
\texttt{t\_avg\_low\_trip} & $T_c \geq 280$ & 272.4 & \textbf{violates} \\
\texttt{n\_high\_trip} & $n \leq 1.15$ & 0.0103 & ok, huge margin \\
\texttt{cold\_leg\_subcooled} & $T_{\text{cold}} \leq 305$ & 289.54 & ok, 15 K margin \\
\hline
\end{tabular}
\end{center}
\begin{limitation}
The reach tube allows $T_c$ down to 272.4~\unit{\celsius}, below the
low-$T_{\mathrm{avg}}$ trip at 280~\unit{\celsius}. The actual
closed-loop trajectory (from \texttt{validate\_pj.jl}) only dips to
$\sim 280$~\unit{\celsius} transiently during the first minute then
rises. The reach tube is a sound but \emph{loose} over-approximation
that cannot discharge the low-trip obligation.
Paths to tighten:
\begin{itemize}
\item Smaller $X_{\mathrm{entry}}$: the $T_c$ entry box
$[281, 295]$ is wide. Tightening could narrow the reach.
\item Higher \texttt{orderQ} (currently 2): more Taylor terms in
state uncertainty, handles bilinearities better.
\item Split $X_{\mathrm{entry}}$ into sub-boxes and union the
reach results. Classical refinement.
\item Accept the looseness and note that the trajectory-based
validation shows the real dynamics respect the bound.
\end{itemize}
All open. For tonight the result is: \textbf{PJ reach works; tube is
sound; five of six safety halfspaces discharged at $T = 300$~\unit{\second};
the low-trip bound is a known looseness of the tool, not a physical
failure of the controller.}
\end{limitation}
The reach-set envelope summary is saved to
\texttt{reachability/reach\_heatup\_pj\_result.mat} for app ingestion.
\subsection*{Part 5: App buildout} \subsection*{Part 5: App buildout}
@ -170,7 +248,7 @@ with three new sections:
\end{itemize} \end{itemize}
Added \texttt{MAT.jl} to the app's \texttt{Project.toml}. Read-only Added \texttt{MAT.jl} to the app's \texttt{Project.toml}. Read-only
v1 still sliders preview UX without writing back. v1 still --- sliders preview UX without writing back.
\subsection*{Soundness ledger update} \subsection*{Soundness ledger update}
@ -206,12 +284,12 @@ is discharged (modulo PJ + saturation caveats). If it stops earlier,
identify the new wall and propose the next reduction.} identify the new wall and propose the next reduction.}
\begin{itemize} \begin{itemize}
\item Polytopic / SOS barriers still the only path to a tight \item Polytopic / SOS barriers --- still the only path to a tight
analytic certificate; quadratic Lyapunov is structurally analytic certificate; quadratic Lyapunov is structurally
defeated regardless of model order. defeated regardless of model order.
\item Saturation as explicit hybrid sub-mode still pending, \item Saturation as explicit hybrid sub-mode --- still pending,
independent of PJ. independent of PJ.
\item Parametric $\alpha$ uncertainty still pending. \item Parametric $\alpha$ uncertainty --- still pending.
\item Tikhonov / regular-perturbation $\mathcal{O}(\Lambda)$ error \item Tikhonov / regular-perturbation $\mathcal{O}(\Lambda)$ error
bound on PJ. bound on PJ.
\item Per-mode reach for shutdown and scram (now feasible with PJ). \item Per-mode reach for shutdown and scram (now feasible with PJ).

View File

@ -412,7 +412,7 @@ disappears, and TMJets can take steps on the thermal timescale
($\sim 1$~\unit{\second} per step is fine). ($\sim 1$~\unit{\second} per step is fine).
Tradeoff: we lose the prompt-supercritical regime, which is a Tradeoff: we lose the prompt-supercritical regime, which is a
$\sim 50$~\unit{\microsecond} transient. For heatup over hours, that $\sim 50$~\unit{\micro\second} transient. For heatup over hours, that
transient is irrelevant to safety. Soundness is reduced (we no transient is irrelevant to safety. Soundness is reduced (we no
longer capture prompt-dynamic trajectories), but the reduction longer capture prompt-dynamic trajectories), but the reduction
introduces a bounded error that can be characterized separately. introduces a bounded error that can be characterized separately.

View File

@ -20,6 +20,8 @@
\usepackage{amsmath, amssymb, amsthm, mathtools} \usepackage{amsmath, amssymb, amsthm, mathtools}
\usepackage{siunitx} \usepackage{siunitx}
\sisetup{detect-all, per-mode=symbol} \sisetup{detect-all, per-mode=symbol}
% siunitx doesn't ship \degreeFahrenheit; declare it via ensuremath.
\DeclareSIUnit\degreeFahrenheit{\ensuremath{^\circ}F}
% --- Graphics ----------------------------------------------------------------- % --- Graphics -----------------------------------------------------------------
\usepackage{graphicx} \usepackage{graphicx}
@ -74,6 +76,29 @@
} }
\lstset{style=labstyle} \lstset{style=labstyle}
% Enable UTF-8 in listings (required for Greek letters and math symbols
% pasted from terminal output: Δ, λ, μ, etc.).
\lstset{
extendedchars=true,
inputencoding=utf8,
literate=
{Δ}{{$\Delta$}}1
{λ}{{$\lambda$}}1
{μ}{{$\mu$}}1
{α}{{$\alpha$}}1
{β}{{$\beta$}}1
{ρ}{{$\rho$}}1
{Σ}{{$\Sigma$}}1
{Λ}{{$\Lambda$}}1
{}{{$\leq$}}1
{}{{$\geq$}}1
{}{{$\to$}}1
{±}{{$\pm$}}1
{°}{{$^\circ$}}1
{×}{{$\times$}}1
{ε}{{$\varepsilon$}}1
}
\lstdefinestyle{terminal}{ \lstdefinestyle{terminal}{
backgroundcolor=\color{black!90}, backgroundcolor=\color{black!90},
basicstyle=\ttfamily\small\color{green!80!white}, basicstyle=\ttfamily\small\color{green!80!white},