run 027Held
../lab/runs/027-axisymmetric-swirl.mdBlocked ona prediction and a falsifier, and the dt defect below — recompute dt inside the loop
Not launchable. It carries no prediction and no falsifier, and per OPS that is the gate. Both are yours to write.
The local swirl maximum arrests but does not contract at Re ≈ 1500. That is the predecessor result this run exists to push beyond, and it is filed as CASE-21: the unforced annulus builds the collapse geometry — outward Reynolds stress, a single meridional cell, a swirl maximum decoupled from the z-mean at r ≈ 0.5 — and then stops. Writing a prediction without that in front of you is writing it blind to the thing it predicts against.
The predecessor (CASE-21) ran at the script's default ν = 2×10⁻³, Re ≈ 1500, and arrested. This run is three launches, each with its own tag, in order:
run1 — the discriminator. axiswirl.py's own documented decisive case, verbatim from its docstring: --tag run1 --Nr 384 --Nz 1536 --R 3 --L 12 --nu 5e-4 --Gam0 3 --hp 0.3 --rc 0.35 --ra 1.2 --T 60. This is the configuration CASE-21's discriminator names — a satisfactory answer predicts whether the radius of the local swirl maximum contracts at ν = 5×10⁻⁴, box length 12, annulus on r ∈ [0.35, 1.2]. Four times lower viscosity than the predecessor, at four times the resolution.--hp 0.5 --nu 3e-4. Stronger instability, higher Re. Extends run1; does not replace it.--ra 0.8. Narrower annulus, closer to the core. Extends run1.The two viscosities are not in tension: run1 is the discriminator and legs 2 and 3 are the follow-ups that push past whatever it shows. The falsifier will be written against run1. The field stays empty until it is confirmed.
And two defects in the integrator, which have to be fixed first. They share one fix.
dt is set at L114 from umax (L113), which is read off u1 — and both lines sit after the init/resume block (L93–96). So a fresh start computes dt from the initial field, and a checkpoint restart computes it from whatever the field had grown to by the time the checkpoint was written. A restart therefore silently adopts a smaller, more accurate timestep.
A run restarted three times is not the same computation as one that ran straight through, and the restart count is recorded nowhere — the checkpoint at L130 stores u1, w1, t, nxt_d, nxt_s, and nothing about how many times it has resumed. For a blow-up study this is fatal: whether and when a quantity diverges becomes a function of the restart history, which is a property of the operator's scheduling rather than of the fluid. Continuous and resumed runs agree only once dt is recomputed inside the loop.
This is the more dangerous of the two, because it produces no error and no warning. The CFL defect below at least announces itself.
dt is never recomputed inside the main loop — L127 steps with the value fixed at L114. The run exists to detect growth, so a 3× rise in u_theta violates CFL by 3.3×: the timestep that was stable for the initial field is not stable for the field the run is looking for.
There is a NaN check at L128, so it halts rather than reporting a wrong number. That keeps it honest and does not make it usable: a blow-up study that stops on NaN cannot distinguish a real blow-up from a CFL blow-up. Both terminate the same way. The signal the run is built to find is the signal that breaks its integrator, so a positive result is uninterpretable and a negative one means only that growth stayed under the margin.
The NaN guard at L128 tests np.isfinite(u1) only. w1 is stepped alongside it at L127 and never checked, so a divergence beginning in the vorticity field is caught one step late — after it has already fed through rhs into u1.
Recompute dt inside the loop from the current u_max, and both defects go: the timestep tracks the growth, and a resumed run reproduces a continuous one because neither is carrying a stale value. One line. Extending the guard at L128 to w1 is a second, separate one-liner.
027 stays draft until that is made — and until the prediction and falsifier are written. Both reasons are in blocked_on:, so the file says what it is waiting for rather than leaving it to be inferred from a state name.
generated 2026-10-25the lab index