Simulation time windows

MHX now treats simulation duration as a first-class validation object. The rule for any linear-growth or nonlinear-island production claim is

\[ t_\mathrm{end} \ge s_f\frac{N_e}{\gamma}, \]

where \(N_e\) is the required number of e-folds, \(\gamma\) is the relevant growth rate, and \(s_f\) is a safety factor. The default production policy uses \(N_e=10\) and \(s_f=1\) for linear-growth observation; the Rutherford/island template uses \(s_f=3\) to leave room for a resolved linear phase plus nonlinear tracking.

Duration policy command

mhx benchmark duration-policy --outdir outputs/benchmarks/duration_policy

Expected files:

  • outputs/benchmarks/duration_policy/duration_policy.json

  • outputs/benchmarks/duration_policy/duration_policy.md

  • outputs/benchmarks/duration_policy/validation.json

  • outputs/benchmarks/duration_policy/manifest.json

The policy intentionally separates intended-scope sufficiency from nonlinear-claim sufficiency:

  • FAST smoke, linear operator replay, nonlinear energy-budget, and differentiability gates may be long enough for their engineering/validation purpose while remaining invalid as nonlinear reconnection claims.

  • Future production templates must satisfy the e-fold rule, otherwise the policy validation fails.

Long campaign template

The next nonlinear result should start from a generated campaign template rather than a smoke-test config:

mhx campaign rutherford-template \
  --outdir outputs/campaigns/rutherford_template \
  --nx 128 --ny 128 \
  --dt 0.1 \
  --target-saved-frames 400

This command does not run the expensive simulation. It writes a campaign_config.toml, a duration_assessment.json, and a manifest with claim_level = "production_template". The generated config uses \(t_\mathrm{end}\approx2290.1\) for the default Harris growth-rate anchor, so it is long enough for a ten-e-fold linear phase plus nonlinear island tracking.

Current duration classification

Workflow

Current/default time

Intended scope

Nonlinear claim status

linear_tearing_fast

\(t=0.1\)

smoke/IO/plotting

not a nonlinear claim

linear_tearing_timedomain

\(t=80\)

exact eigenmode replay and growth-fit plumbing

not a nonlinear claim

nonlinear_energy_budget

default FAST \(t=0.8\)

nonlinear conservation/dissipation identity

not a nonlinear island/plasmoid claim

future_harris_linear_growth_campaign

\(t\approx763.4\)

production linear growth

long enough for 10 e-folds

rutherford_current_schema_validation

\(t\approx2290.1\)

duration-complete executor validation

not production until promotion passes

future_rutherford_island_campaign

\(t\approx2290.1\) plus convergence/seed-QI

production island tracking

long enough with safety factor 3

The direct Harris benchmark anchor is \(\gamma\simeq0.0131\), so ten e-folds require \(10/0.0131\approx763.4\). This is why the default FAST nonlinear budget run is explicitly labeled a code-validity gate rather than a Rutherford or plasmoid simulation.

Promotion evidence lane

Duration is the first gate in the promotion lane, but passing it never promotes a bundle by itself. A candidate campaign remains claim_level = "validation" until a local gate summary or mhx campaign rutherford-promotion-check shows all of the following evidence in the same campaign bundle:

  • completed target duration from campaign_plan.json, diagnostics.json, and production_history.npz;

  • at least two passing convergence bundles with their manifests and artifact hashes;

  • a passing seed-QI bundle for the same diagnostic family;

  • finite X/O critical-point histories with both detected X points and detected O points;

  • reconnecting-flux and Rutherford island-width histories that exceed their amplification thresholds;

  • fixed-scale flux and current-density movies;

  • manifest.json, validation.json, diagnostics.json, production_history.npz, and artifact_manifest.json with hashes.

For a local evidence audit:

python tools/nonlinear_campaign_evidence.py \
  --campaign-dir outputs/campaigns/rutherford_production \
  --output-json outputs/campaigns/rutherford_production/promotion_gate_summary.json \
  --output-md outputs/campaigns/rutherford_production/promotion_gate_summary.md \
  --require-production-ready

The command exits nonzero with --require-production-ready unless every gate passes, so short runs, missing movies, missing seed-QI evidence, or flux/width non-response cannot be promoted by documentation alone.

Seeded double-Harris validation-media bundles use the same local summary, but with their native artifact names: periodic_double_harris_seeded_long_run.npz, figures/periodic_double_harris_flux.gif, and figures/periodic_double_harris_current.gif. If the attached promotion report declares claim_level_if_passed = "validation", the summary can mark the validation gate as ready while still keeping production_claim_ready = false.

Latest bounded GPU validation campaign

On 2026-05-22 a bounded office GPU campaign ran under a 30-minute timeout and completed in about three minutes of wall time. The promoted validation bundle is

outputs/campaigns/gpu_nonlinear_20260522_085049/double_harris_long_n128_t160.

It used a 128×128 periodic double-Harris replay to t_end=160 with fixed flux/current movies, one 64/96/128 convergence bundle, width and resistivity sweeps, seed-QI evidence, artifact manifests, and a double-Harris promotion check. The local gate summary reports:

  • gate_ready = true, because duration, convergence, X/O, flux, width, movies, and manifest gates passed;

  • production_claim_ready = false, because the attached promotion report explicitly declares claim_level_if_passed = "validation";

  • reconnected_flux_amplification = 8.356, island_width_amplification = 2.891, max_x_point_count = 4, and max_o_point_count = 2.

Visual audit matters: the raw total-flux/current GIFs remain dominated by the static equilibrium sheet, so public-facing media should show residual flux perturbed - base, reconnection proxies, and gate summaries alongside any raw field movie. These outputs are suitable for validation-media evidence, not for a Rutherford, Sweet–Parker, or plasmoid-chain production claim.

Python guard for future workflows

Future production runners should call the guard before launching expensive jobs:

from mhx.benchmarks import require_duration_for_claim

require_duration_for_claim(
    name="rutherford_campaign",
    purpose="nonlinear island-width growth",
    t_end=800.0,
    growth_rate=1.31e-2,
    required_efolds=10.0,
)

If t_end is too short, the guard raises a ValueError with the required minimum. Tests cover the short-run failure path and the future-template pass path.

What remains for nonlinear publication plots

A duration that satisfies the e-fold rule is necessary but not sufficient. Publication-grade nonlinear plots also need:

  • resolution/time-step convergence;

  • fixed color limits for flux and current movies;

  • reconnected-flux and island-width histories;

  • current-sheet length/thickness and reconnection-rate proxies;

  • magnetic/kinetic/total energy and integrated dissipation residuals;

  • artifact manifests with code commit, API version, and dependency set.

Practical duration labels

Use these labels consistently in docs, figures, and manifests:

Label

Duration status

Allowed use

short_validation

Shorter than the relevant e-fold window.

Operator, IO, schema, differentiability, and energy-budget checks.

fast_validation

A short non-CI validation run below the README media minimum.

Local smoke/plotting checks only; not README or release media.

ci_fast

Explicitly bounded CI run, currently t_end=10 for double-Harris media plumbing.

CI artifact generation and schema/movie checks.

readme_release_media

Longer validation media run, currently t_end=160 for the Harris-sheet README residual-field movies and validation preset.

README/release morphology media with validation claim level, not production physics.

linear_window

At least \(N_e/\gamma\).

Linear growth-rate measurement if the mode remains in the linear regime.

nonlinear_window

At least \(s_fN_e/\gamma\) with \(s_f>1\).

Candidate island-growth or plasmoid campaign, still subject to convergence.

overresolved_window

Longer than the nonlinear window and accompanied by convergence checks.

Preferred for production paper figures.

The label should be stored in the run notes or manifest claim scope. If the label is short_validation, fast_validation, or ci_fast, figures should not use wording such as “Rutherford phase”, “plasmoid onset”, or “nonlinear saturation”. The readme_release_media label permits public visual previews, but it is still a validation-media label rather than a production reconnection claim.