106M2_BINS = (4, 6, 8, 12, 16, 24, 32)
120M2R_BINS = (2, 3, 4, 6, 8, 12, 16, 24, 32)
131M2D_IDISC = (25, 50, 100, 200, 400, 800)
165 """The full study, in execution order (plan S5)."""
166 runs: list[dict] = []
191 T4 = {
"I": 4000,
"V": 4000,
"dose": 2.0,
"n_points": 37,
192 "dose_read": DOSE_READ_T4}
193 runs.append(
_r(
"T4_D_4k",
"T4",
"D (exact)",
194 "Fully discrete: the exact solution of the same equations. "
195 "Cost probe -- run first (plan S5.2).",
196 equations=
"discrete", **T4))
200 for rid, lbl, ratio, g
in (
201 (
"T4_C1_4k",
"C1", 10, {
"i_discrete": 400,
"I_bin": 6,
"v_discrete": 400,
"V_bin": 6}),
202 (
"T4_C2_4k",
"C2", 40, {
"i_discrete": 100,
"I_bin": 10,
"v_discrete": 100,
"V_bin": 9}),
203 (
"T4_C3_4k",
"C3", 160, {
"i_discrete": 25,
"I_bin": 14,
"v_discrete": 25,
"V_bin": 12}),
204 (
"T4_C4_4k",
"C4", 800, {
"i_discrete": 5,
"I_bin": 18,
"v_discrete": 5,
"V_bin": 16}),
206 note = f
"resolution 1/{ratio} on both axes"
207 if rid ==
"T4_C4_4k":
208 note = (
"SIA axis is EXACTLY production: i_discrete/I = 5/4000 = "
209 "1/800, and holding r_i returns I_bin = 18, the production "
210 "value. The vacancy axis is 1/800, FINER than production's "
211 "5/20000 = 1/4000 -- matching it would need v_discrete = 1, "
212 "below v_mobile = 5. So this column if anything UNDERSTATES "
213 "the production vacancy closure error; state that rather "
214 "than claiming an exact two-axis analogue.")
215 runs.append(
_r(rid,
"T4", lbl, note, **T4, **g))
217 C4 = {
"i_discrete": 5,
"I_bin": 18,
"v_discrete": 5,
"V_bin": 16}
218 runs.append(
_r(
"T4_C4_P1_4k",
"T4",
"C4, P=1 constant",
219 "Closure order scored against the exact column.",
220 shape_function=
"constant", timeout_s=TIMEOUT_NONLINEAR_CLOSURE,
222 runs.append(
_r(
"T4_C4_P3_4k",
"T4",
"C4, P=3 lognormal",
223 "Closure order scored against the exact column. RAN and "
224 "did not advance: 0.0022 of 2 dpa in 1866 s, all three "
225 "scoring rungs MISSING. Kept as a 'did not reach' row.",
226 shape_function=
"lognormal", excluded=P3_EXCLUDED,
227 timeout_s=TIMEOUT_NONLINEAR_CLOSURE,
251 DIAG = {
"I": 4000,
"V": 4000,
"dose": 0.2,
"n_points": 37,
252 "dose_read": (0.05, 0.1, 0.2),
"table":
"TD"}
253 runs.append(
_r(
"TD_BM_FULL",
"TD",
"bin_moment, i_discrete = I",
254 "The bin_moment code path with NO closure (I_bin = V_bin = 0). "
255 "SUPERSEDED: it was queued to find the path difference, which "
256 "cfce995 then found and fixed, and "
257 "codes/Python_Testing/check_bm_vs_discrete.py now settles the "
258 "same question in 20 s to 7e-8 rather than in ~2 days. Stopped "
259 "at 0.063 of 0.2 dpa with steps at 148 min and lengthening.",
260 excluded=TD_SUPERSEDED,
261 equations=
"bin_moment", i_discrete=4000, I_bin=0,
262 v_discrete=4000, V_bin=0,
263 **{k: v
for k, v
in DIAG.items()
if k !=
"table"}))
264 runs.append(
_r(
"TD_DISC_REF",
"TD",
"discrete, same grid",
265 "Matched-grid discrete reference for TD_BM_FULL. SUPERSEDED "
266 "with its pair: half a comparison proves nothing.",
267 excluded=TD_SUPERSEDED,
268 equations=
"discrete",
269 **{k: v
for k, v
in DIAG.items()
if k !=
"table"}))
294 NC = {
"I": 4000,
"V": 4000,
"dose": 2.0,
"n_points": 37,
295 "dose_read": (2.0,),
"loop_coal": 0}
300 (
"T4_C0_nc",
"C0 (no coarsening)", {
"i_discrete": 1600,
"I_bin": 2,
"v_discrete": 1600,
"V_bin": 2}),
305 (
"T4_C0b_nc",
"C0b (no coarsening)", {
"i_discrete": 800,
"I_bin": 4,
"v_discrete": 800,
"V_bin": 4}),
311 (
"T4_C0c_nc",
"C0c (no coarsening)", {
"i_discrete": 600,
"I_bin": 5,
"v_discrete": 600,
"V_bin": 5}),
312 (
"T4_C1_nc",
"C1 (no coarsening)", {
"i_discrete": 400,
"I_bin": 6,
"v_discrete": 400,
"V_bin": 6}),
313 (
"T4_C2_nc",
"C2 (no coarsening)", {
"i_discrete": 100,
"I_bin": 10,
"v_discrete": 100,
"V_bin": 9}),
314 (
"T4_C3_nc",
"C3 (no coarsening)", {
"i_discrete": 25,
"I_bin": 14,
"v_discrete": 25,
"V_bin": 12}),
315 (
"T4_C4_nc",
"C4 (no coarsening)", {
"i_discrete": 5,
"I_bin": 18,
"v_discrete": 5,
"V_bin": 16}),
317 runs.append(
_r(rid,
"T4NC", lbl,
318 "Scored against the 2026-09-07 discrete arm at 2.0 dpa.",
320 runs.append(
_r(
"T4_C4_P1_nc",
"T4NC",
"C4, P=1 (no coarsening)",
321 "Closure ORDER against the same discrete arm.",
322 shape_function=
"constant", **NC,
323 **{
"i_discrete": 5,
"I_bin": 18,
"v_discrete": 5,
"V_bin": 16}))
335 NC40 = {
"I": 4000,
"V": 4000,
"dose": 40.0,
"n_points": 37,
336 "dose_read": (2.0, 15.72),
"loop_coal": 0}
338 (
"T4_C2_40",
"C2 to 40 dpa", {
"i_discrete": 100,
"I_bin": 10,
"v_discrete": 100,
"V_bin": 9}),
339 (
"T4_C3_40",
"C3 to 40 dpa", {
"i_discrete": 25,
"I_bin": 14,
"v_discrete": 25,
"V_bin": 12}),
340 (
"T4_C4_40",
"C4 to 40 dpa", {
"i_discrete": 5,
"I_bin": 18,
"v_discrete": 5,
"V_bin": 16}),
342 runs.append(
_r(rid,
"T4NC40", lbl,
343 "Same grid as its 2 dpa twin, carried to the production "
344 "horizon for the size-effect figures.", **NC40, **g))
350 (
"T1_B1",
"B1", {
"i_discrete": 6400,
"I_bin": 7,
"v_discrete": 1600,
"V_bin": 6}),
351 (
"T1_B2",
"B2", {
"i_discrete": 1600,
"I_bin": 11,
"v_discrete": 400,
"V_bin": 9}),
352 (
"T1_B3",
"B3", {
"i_discrete": 400,
"I_bin": 14,
"v_discrete": 100,
"V_bin": 13}),
354 runs.append(
_r(rid,
"T1", lbl,
355 "B1 is the most-resolved rung; deviations in Table 1 are "
356 "quoted relative to it." if rid ==
"T1_B1" else "", **g))
361 runs.append(
_r(
"T2_P1",
"T2",
"P=1 constant",
362 "May be unstable -- that is a result, not a failure (S6).",
363 shape_function=
"constant", timeout_s=TIMEOUT_NONLINEAR_CLOSURE,
365 runs.append(
_r(
"T2_P3",
"T2",
"P=3 lognormal",
366 "May time out -- that is a result, not a failure (S6). It "
367 "did: 0.00054 of 40 dpa in 174 min, 2.9 h on a single output "
368 "step, stopped by hand rather than left to burn a core to "
370 shape_function=
"lognormal", excluded=P3_EXCLUDED,
371 timeout_s=TIMEOUT_NONLINEAR_CLOSURE,
373 runs.append(
_r(
"T2_IBIN10",
"T2",
"I_bin 10",
374 **{**B4_GRID,
"I_bin": 10}))
375 runs.append(
_r(
"T2_IBIN40",
"T2",
"I_bin 40",
376 **{**B4_GRID,
"I_bin": 40}))
377 runs.append(
_r(
"T2_RTOL4",
"T2",
"rtol 1e-4", rtol=1e-4, **B4_GRID))
378 runs.append(
_r(
"T2_RTOL6",
"T2",
"rtol 1e-6", rtol=1e-6, **B4_GRID))
397 runs.append(
_r(
"T3_FISS_QSS",
"T3",
"fission QSS (control)",
398 "Controlled twin of T3_FISS_DYN: identical in every respect "
399 "except he_kinetics. Replaces the plan's uncomputed "
400 "'= B4' column, which was not a controlled comparator.",
402 runs.append(
_r(
"T3_FISS_DYN",
"T3",
"fission dynamic",
403 he_kinetics=
"dynamic", **B4_GRID))
404 runs.append(
_r(
"T3_FUS_QSS",
"T3",
"fusion QSS",
405 cascade=
"fusion", **B4_GRID))
406 runs.append(
_r(
"T3_FUS_DYN",
"T3",
"fusion dynamic",
407 cascade=
"fusion", he_kinetics=
"dynamic", **B4_GRID))
411 runs.append(
_r(
"T3_FUS_CASE1",
"T3",
"fusion Case 1",
412 "BLOCKED on plan S3.1 (unweld he_model from cascade).",
413 cascade=
"fusion", he_model=
"case1", blocked_on=
"S3.1", **B4_GRID))
414 runs.append(
_r(
"T3_FUS_CASE2",
"T3",
"fusion Case 2",
415 "BLOCKED on plan S3.1 (unweld he_model from cascade).",
416 cascade=
"fusion", he_model=
"case2", blocked_on=
"S3.1", **B4_GRID))
421 runs.append(
_r(
"T5_WOODBURY",
"T5",
"Woodbury",
422 "Null test: preconditioner enters no rate kernel.",
423 preconditioner=
"woodbury", **B4_GRID))
424 runs.append(
_r(
"T5_JACOBI",
"T5",
"Jacobi",
425 "Null test: must agree with Woodbury to many sig figs.",
426 preconditioner=
"jacobi", **B4_GRID))
427 runs.append(
_r(
"T5_THREADS1",
"T5",
"1 thread",
428 "Null test: thread count must not move the answer.",
429 omp_threads=1, **B4_GRID))
430 runs.append(
_r(
"T5_THREADS12",
"T5",
"12 threads",
431 "Null test: paired with T5_THREADS1.",
432 omp_threads=12, **B4_GRID))
480 MONO = {
"equations":
"discrete",
"i_mobile": 5,
"v_mobile": 5,
486 "dose": 20.0,
"n_points": 45,
487 "dose_read": (2.0, 15.72, 20.0),
508 M1_LADDER = (1000, 2000, 4000, 8000, 16000, 32000)
509 for dom
in M1_LADDER:
510 runs.append(
_r(f
"M1_D{dom}",
"M1", f
"discrete I=V={dom}",
511 "Exact solution of the monomer-mobility model at this "
512 "domain. Truncation error only: the closure is absent.",
513 I=dom, V=dom, **MONO))
575 M1REF_DIVERGED = (
"loop_coal O(NC^2) blow-up: ~4x per output step, 2643 s "
576 "on step 28 of 45 at 0.005 of 20 dpa, single-core in the "
577 "serial pair sum. Measured 2026-09-09.")
578 runs.append(
_r(f
"M1_D{M_REF_DOMAIN}",
"M1REF",
579 f
"REFERENCE discrete I=V={M_REF_DOMAIN}",
580 "Exact arm for campaign M. Run to completion, one core, "
581 "no time limit. Every M2 rung is a closure error against "
582 "THIS trajectory. DID NOT COMPLETE -- see M1REF_DIVERGED.",
583 excluded=M1REF_DIVERGED,
584 I=M_REF_DOMAIN, V=M_REF_DOMAIN,
585 omp_threads=12, **{**MONO,
"timeout_s": 30 * 86400}))
596 if M_BIN_DOMAIN
is not None:
599 r_i = (dom / 50.0) ** (1.0 / nb)
600 runs.append(
_r(f
"M2_B{nb}",
"M2", f
"I_bin=V_bin={nb}",
601 f
"i_discrete = v_discrete = 50, r = {r_i:.3f}. "
602 f
"Scored against M1_D{dom}, the exact arm on the "
603 f
"same domain and grid. Runs alongside it on the "
604 f
"remaining cores; the reference is pinned to one.",
606 equations=
"bin_moment", i_mobile=1, v_mobile=1,
607 i_discrete=50, v_discrete=50,
609 dose=MONO[
"dose"], n_points=MONO[
"n_points"],
610 dose_read=MONO[
"dose_read"],
637 r_i = (M2R_DOMAIN / 50.0) ** (1.0 / nb)
638 runs.append(
_r(f
"M2R_B{nb}",
"M2R", f
"I_bin=V_bin={nb} @ ref domain",
639 f
"i_discrete = v_discrete = 50, r = {r_i:.3f}. Scored "
640 f
"against {M_REF_RUN}, the exact arm on the same domain "
642 I=M2R_DOMAIN, V=M2R_DOMAIN,
643 equations=
"bin_moment",
644 i_discrete=50, v_discrete=50, I_bin=nb, V_bin=nb,
645 dose=MONO[
"dose"], n_points=MONO[
"n_points"],
646 dose_read=MONO[
"dose_read"], timeout_s=3600))
659 for i_d
in M2D_IDISC:
661 runs.append(
_r(f
"M2D_I{i_d}_B{nb}",
"M2D",
662 f
"i_d={i_d} I_bin={nb}",
663 f
"2-D sweep cell. Scored against {M_REF_RUN}.",
664 I=M2R_DOMAIN, V=M2R_DOMAIN, equations=
"bin_moment",
665 i_discrete=i_d, v_discrete=i_d,
667 dose=MONO[
"dose"], n_points=MONO[
"n_points"],
668 dose_read=MONO[
"dose_read"], timeout_s=3600))