Every physical model in beamprop, with its governing equation, where it is
implemented, the validation gate that pins it, and the literature it comes
from. This file is the citation record for the solver: if a formula is in the
code, it is in this table.
Conventions: λ vacuum wavelength (m), k = 2π/λ (rad/m), z propagation
distance (m), κ transverse spatial frequency (rad/m), intensity I = |u|².
D- and T-numbered tags (D5, T4, …) label the project's design decisions
and implementation tasks. They are shorthand, not citations: wherever one
carries weight the substance is stated in full alongside it, so nothing here
depends on looking a number up.
Read this before the test count. cargo test runs 245 tests. That number is
not a measure of how much of this solver is validated against the world, and
reading it as one would be a mistake: most of those tests check that the code
solves the equations it was given, several deliberately assert a known
disagreement so it cannot drift silently, and some of the constants that move
the answer most are not gated at all. This section says which is which.
Every claim below carries exactly one of four statuses:
- verified — reproduces a closed form or analytic result the model does not itself assume (an exact Riemann solution, Noll's Zernike coefficients, the Rytov weak-fluctuation variance, the Keldysh limits), or a numerical property the model must have (observed order of accuracy, step/window/seed independence, thread-count determinism). Verification says the code is right about the equations. It says nothing about whether the equations are right about air.
- validated — compared against something external and measured: a digitized published dataset, or an independent third-party code. This is the only status that puts the model against the world.
- pinned — a known disagreement, asserted green so that its size is fixed in CI and any change to it has to be argued for. A pinned gate passing means the gap is still exactly as big as we said it was. It does not mean the model agrees with anything.
- ungated — asserted from literature or from geometry, with no test behind it. These are where the model is most exposed.
Two rows carry an extra flag in the number column:
- circular — the reference is the construction the model is built from, so
agreement is arithmetic, not evidence (
lsd_front_speed_matches_the_raizer_closed_form). - same lineage — the reference is a closed form from the same paper whose
data is the comparison target, so it establishes agreement with that theory,
not with the measurement (
tt2012_cascade_theory_reference,tt2012_wavelength_scaling_matches_cascade_theory).
Census of the 122 rows below: 83 verified, 10 validated, 17 pinned, 12 ungated.
Every site names a test function or a src/ symbol; a claim with neither does
not belong in this table. The remaining unit tests in src/ are code-level
verification (constructors, guards, closed-form limits of individual rate terms)
and are counted here only where they carry a physics claim in their own right.
| claim | site | status | number |
|---|---|---|---|
| Gaussian beam evolution matches the closed form | gaussian_free_space_evolution |
verified | width and divergence < 1 % |
| Lossless propagation conserves power | power_conservation_lossless |
verified | ~1e-14 |
| The boundary absorbs rather than wrapping around | boundary_absorbs_instead_of_wrapping |
verified | wraparound suppressed |
Split-step is 2nd order in dz |
split_step_is_second_order |
verified | observed order 2 |
| Long-throw path matches the Fresnel impulse response | fresnel_impulse_response_long_throw |
verified | closed form |
| Phase bends the beam toward higher index | medium_phase_bends_toward_higher_index |
verified | sign of the deflection |
| A positive-index duct focuses | positive_index_duct_focuses |
verified | focusing recovered |
Medium implementations are interchangeable |
medium_trait_interchangeability |
verified | identical results |
| claim | site | status | number |
|---|---|---|---|
Uniform extinction matches exp(−α z) |
beer_lambert_matches_closed_form |
verified | ~1e-13 |
α = 0 is bit-identical to vacuum |
zero_extinction_matches_vacuum |
verified | bitwise |
| A transverse absorber removes exactly the predicted power | transverse_extinction_removes_predicted_power |
verified | exact |
| claim | site | status | number |
|---|---|---|---|
| Phase-screen structure function is Kolmogorov | phase_screen_structure_function_matches_kolmogorov |
verified | < 10 % over a decade of lags |
| Long-exposure spread matches Andrews–Phillips | long_exposure_beam_spread_matches_theory |
verified | 0.5 % |
| Scintillation index matches Rytov weak theory | scintillation_index_matches_rytov_weak_theory |
verified | 1.6 % |
| Monte-Carlo is thread-count reproducible | monte_carlo_reproducible_across_thread_counts |
verified | bitwise |
| claim | site | status | number |
|---|---|---|---|
| Closed-form erf blooming phase | b1_closed_form_blooming_phase |
verified | 0.39 % max |
| Weak-blooming first-order limit, quadratic back-reaction | b2_weak_blooming_linear_limit |
verified | 0.008 %; ratio 3.65 vs 4 |
| Slab coupling is 2nd order by self-convergence | coupling_is_second_order |
verified | slope 2.000 |
Stable at N_φ = 20 with a closed power budget |
strong_blooming_is_stable |
verified | budget closes |
| The beam bends upwind | beam_bends_upwind |
verified | sign of the centroid shift |
| Crescent + irradiance-rollover signatures | b3_qualitative_signatures |
verified | qualitative |
Smith (1977) whole-beam I_REL(N) curve |
b3_smith1977_curve_quantitative |
validated | 7.2 % over N ∈ [0.5, 1.8], F₀ = 5 |
IntensityScale extraction is arithmetically identical |
g0_intensity_scale_extraction_is_arithmetically_identical |
verified | bitwise |
| The M4 air table is untouched by T4 | g0_m4_air_table_is_untouched |
verified | bitwise |
The milestone with the most pins, and the reason this ledger exists. Its
external status in one line: K_m is validated, the digitizations are
validated, the shape is not — the kernel's I_thr(p) disagrees with both
measured datasets, and the disagreement is pinned rather than papered over.
| claim | site | status | number |
|---|---|---|---|
Electron-neutral collision frequency K_m vs T&T's E_eff/E_B |
tt2012_collision_frequency_matches_literature |
validated | ratio 1.05×, flat to < 0.15 over 46–1858 Torr |
E_eff rises with pressure (the sign is the physics) |
tt2012_effective_field_rises_with_pressure |
validated | p^+0.695 vs predicted p^+0.642 |
| Chylek Fig. 3 air trace reproduces the printed exponent | chylek1990_digitization_reproduces_the_published_slope |
validated | α = 0.43–0.46 vs printed 0.45 ± 0.01 |
| Chylek Fig. 2 He/Ar/Xe traces reproduce six printed exponents | chylek1990_fig2_digitization_reproduces_the_published_slopes |
validated | all six inside their printed tolerances |
| Level vs T&T's cascade closed form (Eq. 4) | tt2012_cascade_theory_reference |
verified (same lineage) | 4.1–5.1× (climb), 1.3–3.2× (fixed ⟨ε⟩) |
I_thr ∝ λ⁻², and the plateau is Eq. 4's λ⁻² coefficient |
tt2012_wavelength_scaling_matches_cascade_theory |
verified (same lineage) | −2.000 over 0.53–10.6 µm; coefficient 1.01× |
Keldysh γ → ∞ recovers the multiphoton photon order |
keldysh_multiphoton_limit_recovers_the_photon_order |
verified | K = U_i/ħω |
Keldysh γ → 0 recovers the static-field tunnelling exponent |
keldysh_tunnelling_limit_matches_the_static_field_exponent |
verified | closed form |
The small-γ series joins the direct form |
keldysh_exponent_series_matches_direct_form |
verified | join pinned at γ = 0.1 |
| Dawson's integral against its closed forms and its ODE | breakdown0d::tests::dawson_matches_its_closed_forms |
verified | max at 0.5410442246; Φ' = 1 − 2xΦ to 1e-5 |
| The two Dawson branches join continuously | breakdown0d::tests::dawson_series_join_is_continuous |
verified | 3e-7 at the x = 4 seam |
ln Γ against factorials, Γ(½), and the reflection formula |
breakdown0d::tests::ln_gamma_matches_its_closed_forms |
verified | 1e-12 |
The PPT above-threshold sum is converged at every γ it is evaluated at |
breakdown0d::tests::ppt_ati_sum_is_converged |
verified | adaptive vs 2²¹ terms, 1e-6, down to the γ = 0.1 cutover |
PPT reduces to the ADK closed form as γ → 0 |
breakdown0d::tests::ppt_reduces_to_adk_in_the_tunnelling_limit |
verified | residual O(γ²) and falling, 3e-2 → 1e-3 |
| The tunnelling branch joins the sum without a step | breakdown0d::tests::ppt_tunnelling_branch_joins_the_sum |
verified | converged A₀ = 0.994 vs the limit's 1 at the cutover |
| The PPT rate is monotonic across the bisection bracket | breakdown0d::tests::ppt_rate_is_monotonic_across_the_bisection_bracket |
verified | 201 samples over 10¹²–10²² W/m², both λ |
PPT gives an integer photon order K = ⌈ν⌉ |
ppt_multiphoton_order_is_the_integer_photon_count |
verified | 7.998 / 10.998 / 6.000 at 800 / 1064 / 532 nm |
| PPT and Keldysh share one exponent | ppt_and_keldysh_share_the_same_exponent |
verified | ratio is I^0.66 while the rates are I^9.9 |
| PPT's absolute rate vs a measured O₂ cross-section | ppt_rate_matches_the_measured_o2_cross_section |
validated | 1.99× of σ₈ = 3.3e-130 W⁻⁸m¹⁶s⁻¹ (Sci. Rep. 8, 2874 (2018)), nothing fitted; theory high, the direction the paper reports |
| PPT does not close the wavelength gap either | ppt_does_not_close_the_wavelength_gap_either |
pinned | derived prefactor lands at 2.947 vs measured 0.80 — 16 % of the gap; 2n* − 3/2 < 0 for Z_eff = 0.53, so the Coulomb correction is order-unity, not orders |
| The two anchor experiments sit either side of the MPI seeding threshold | ppt_seeding_thresholds_separate_the_two_experiments |
validated | at each paper's own measured I_th: N_seed = 5.4e-9 (1064 nm) vs 3.15 (532 nm); seeding threshold 5.73× above measured at 1064 nm, 0.83× at 532 nm |
| Threshold is independent of the integration window | breakdown0d::tests::threshold_is_window_independent |
verified | invariant in w |
| The high-pressure slope lies between the model's analytic limits | breakdown0d::tests::high_pressure_threshold_slope_lies_between_analytic_limits |
verified | n ∈ (0, 1), below the loss-only floor of 1; the closures give 0.086 / 0.264 / 0.440 |
| The literature-range inelastic envelope brackets the slope | breakdown0d::tests::inelastic_loss_envelope_brackets_the_slope |
verified | over δ_eff 0.01–0.05, ⟨ε⟩ 2–5 eV |
| Per-slice integrator is exact and step-size independent | breakdown0d::tests::{pure_cascade_is_exponential_growth, pure_loss_is_exponential_decay, mpi_only_seeding_is_linear, balance_point_is_linear_from_seed, slice_refinement_is_consistent} |
verified | 1e-9 relative |
Measured I_thr(p) slope, against the δ_eff literature envelope |
tt2012_threshold_slope_matches_measurement |
validated | measured 0.329 inside [0.174, 0.382]; centre 0.264. Red and #[ignore]d 2026-07-25 → 2026-07-30, retired by the closure change, not by re-banding |
| Chylek's low-pressure branch: the kernel is still far too steep | chylek1990_air_is_a_power_law_and_the_cascade_kernel_is_not |
pinned | 10–100 Torr: kernel 0.501 vs measured 0.428 (1.17×), down from 1.292 once seed production landed. The residual is now the 100–300 Torr window, 0.857 vs 0.413 |
| The residual against Chylek is localised to 70–350 Torr | chylek1990_residual_is_localised_to_mid_pressure |
pinned | six matched bands: kernel tracks to <0.25 outside, 2.0–2.3× too steep inside; the measurement is not locally flat (0.31–0.55) |
| The mid-pressure residual is not a level artifact | the_mid_pressure_residual_is_not_a_level_artifact |
verified | walking δ_eff from a 15.8× level to 3.4× makes the peak local exponent rise, 1.04 → 1.42 |
| The wavelength ratio is falsified against measurement, in sign | chylek1990_tt2012_wavelength_ratio_falsifies_cascade_lambda_squared |
pinned | kernel 2.85 vs measured ≈ 0.80; overshoot ≈ 3.57× (4.00 cascade-only → 3.39 after the closure change → 2.85 after seed production) |
| Keldysh MPI does not close the wavelength gap | keldysh_mpi_does_not_close_the_wavelength_gap |
pinned | order-unity prefactor lands at 2.89 vs measured 0.80; the 18 % of the gap it closes is a smaller denominator, not a better rate |
| T&T's own MPI calibration undershoots their own measurement | breakdown0d::tests::tt2012_mpi_calibration_undershoots_the_data |
pinned | 37× below |
| Level offset stays inside the inter-lab scatter, with a drift pin | tt2012_level_ratio_is_bounded_within_scatter |
pinned | 3.90–4.69× high; drift 1.48× → 1.20× as the slope error shrank |
| The two cascade limits bracket the measurement | breakdown0d::tests::the_two_cascade_models_bracket_the_measurement |
pinned | 0.440 / 0.086 straddle 0.329 — but this is a one-parameter sensitivity, not two independent limits |
| The continuum diffusion loss is invalid at low pressure | the_diffusion_approximation_is_invalid_at_low_pressure |
verified | Kn = 0.013 at 760 Torr → 0.96 at 10 Torr; Kn ∝ 1/p exactly |
| Escape rate recovers the continuum and free-molecular limits | escape_rate_recovers_both_limits |
verified | 0.9375 / 0.9757 / 0.9951 of D_e/Λ² at 760 / 2000 / 10⁴ Torr; saturates at v̄/ℓ |
| The escape correction adds no constant | the_escape_correction_adds_no_constant |
verified | v̄ reproduces D_e to 1e-12; 6.740 eV, the same energy D_e implies |
Λ, the Cauchy chord and V are separate scales from one geometry |
focus_geometry_separates_its_three_length_scales |
verified | Λ = 7.74 µm, ℓ = 4V/S = 30.72 µm, ratio 3.97 |
| Free-molecular escape halves the low-pressure slope error, and no more | free_molecular_escape_flattens_the_low_pressure_branch |
pinned | 10–100 Torr: 1.954 → 1.293 vs measured 0.428 — still 2.6× steep; the high-pressure window is undisturbed (0.431 vs 0.468) |
First-passage rate reduces to the mean-trajectory closed form as D_ε → 0 |
first_passage_reduces_to_the_mean_energy_climb |
verified | ratio 0.821 → 0.990 as ħω falls 1.166 → 0.05 eV; grid-converged at each point |
First-passage quadrature is 2nd order and the shipped N is converged |
first_passage_quadrature_is_converged |
verified | order ≈2; N = 512 within 2e-4 at 1064 and 532 nm |
The ε_∞ = U_i bifurcation is gone |
distribution_resolved_has_no_bifurcation |
verified | ν_i > 0 below the old cutoff, continuous through it to 2 % |
| The distribution-resolved rate adds no constant | first_passage_rate_depends_only_on_two_dimensionless_groups |
verified | function of (ε_∞/U_i, ħω/U_i) alone; ν_i ∝ p preserved |
| High-pressure slope, resolving the electron energy distribution | distribution_resolved_cascade_fixes_the_high_pressure_slope |
validated | T&T 0.0859 → 0.2636 vs 0.329; Chylek 0.1509 → 0.4313 vs 0.468; the one-free-constant envelope moves from excluding the measurement to containing it |
| It does not fix the low-pressure branch | distribution_resolved_does_not_fix_the_low_pressure_branch |
pinned | 1.289 → 1.293 vs measured 0.428 — localises that failure to the loss term, not the cascade closure |
| It does not close the wavelength gap | distribution_resolved_does_not_close_the_wavelength_gap |
pinned | 4.00 → 3.39 vs ≈0.80 — right sign at last, 15 % of a 5× gap |
| The hard plateau floor stops being a bound | distribution_resolved_softens_the_plateau_floor |
verified | threshold/floor 1.09 → 0.75 → 0.63 at 300 / 760 / 2000 Torr |
| The cascade plateau floor is free of every transport constant | cascade_plateau_floor_is_independent_of_the_transport_constants |
verified | invariant under D_e ×0.01…×100; ν_i ≡ 0 below it at every pressure |
| Parameter-free noble-gas floor: ordering right, spacing wrong | chylek1990_noble_gas_plateau_floors_are_unequally_tight |
pinned | He/Ar predicted 15.6 vs measured ≈2.5; Ar/Xe 4.27 vs ≈3.0. Headroom 1.85×/7.8×/13.2× is a bound for the mean-trajectory closure only — see the plateau-softening row |
Noble-gas K_m and D_e |
Gas::from_monatomic |
ungated | required arguments, not defaults — no citable momentum-transfer table; Ar/Xe cross sections swing 100× across the Ramsauer minimum |
Chylek's focal geometry (Λ, focal volume) |
— | ungated | the paper gives the lens and spot but not the beam diameter, so the divergence-limited depth of focus cannot be reconstructed as T&T's Eq. 5 was |
D_e,ref = 0.2 m²/s is consistent with the gated K_m |
d_e_ref_implies_a_stated_electron_energy |
verified | ⟺ ε = 6.740 eV at p_ref, inside the (2, U_i] eV band the cascade occupies |
| Diffusion and inelastic loss assume different electron energies | d_e_ref_implies_a_stated_electron_energy |
pinned | 6.74 eV vs ⟨ε⟩ = 3 eV — 2.25×, same population, two terms of one balance |
D_e cannot explain the slope gap |
d_e_sensitivity_is_pinned_across_the_kinetic_band |
pinned | a 6.0× band in D_e moves n by 0.078 (0.0523 → 0.1305) against a 0.243 shortfall to the measured 0.329 |
| Absolute threshold level | — | ungated | published thresholds scatter 3–10× across labs |
D_e,ref against a measurement |
— | ungated | swarm data sits at 0.1–2 eV and reaches 6.7 eV only through the same formula, so it would re-validate K_m, not D_e; needs a measurement at the cascade's own energy |
δ_eff = 0.02 |
AirBreakdown::new |
ungated | free within ≈0.01–0.05; sets the plateau level |
⟨ε⟩ = 3 eV (FixedMeanEnergy only) |
AirBreakdown::new |
ungated | free within ≈2–5 eV |
n_bd = 10²³ m⁻³ |
AirBreakdown::new |
ungated | asserted; audit says the slope is insensitive to ×0.1/×10 |
| The seed is the attachment/ionization equilibrium | breakdown0d::tests::background_electron_density_is_the_attachment_equilibrium |
verified | n_e0·ν_att = q to 1e-12, against the same ν_att the loss term uses |
| The focus holds essentially no free electrons | breakdown0d::tests::the_focus_holds_essentially_no_free_electrons |
verified | n_e0 = 0.149 m⁻³ at 1 atm → 1.2×10⁻¹⁴ electrons in the focus |
| The ionization background is not load-bearing | breakdown0d::tests::ionization_background_is_not_load_bearing |
verified | threshold bit-identical over 12 decades of seed (10⁻⁶–10⁶ m⁻³) |
| The seed floor applies to an explicit seed only | breakdown0d::tests::seed_floor_applies_only_to_an_explicit_seed |
verified | floored vs free peak differ by >10³ at 8×10¹⁵ W/m² |
Λ = 7.74 µm and ℓ = 30.72 µm |
Focus::cylinder |
ungated | both pinned from T&T's Eq. 5 geometry, never fit; Λ matches the 8 µm the paper states |
The ε_∞ → U_i margin at threshold |
— | ungated | ε_∞/U_i = 1.032 at 760 Torr, 1.011 at 1500. Mean-trajectory closure only — that closure sits on the bifurcation that is its plateau, which is what the shipped DistributionResolved removed |
| claim | site | status | number |
|---|---|---|---|
| Tip/tilt-removed residual variance vs Noll (1976) | noll_tip_tilt_removed_variance_matches_the_closed_form |
verified | 0.1407 vs 0.134, banded at ±12 % by the ensemble spread |
| Piston-removed variance converges to Kolmogorov | noll_piston_removed_variance_converges_to_kolmogorov |
verified | 0.34 → 0.99 over L₀/D = 10 → 2000 |
RMS focal-spot wander ∝ Cn²^(1/2) |
wander_follows_the_square_root_of_cn2 |
verified | +0.4953 / +0.4977 / +0.4987 |
| The ignition ensemble converges | ignition_ensemble_converges |
verified | numerical hygiene |
| The ignition ensemble is thread-count reproducible | ignition_ensemble_is_reproducible_across_thread_counts |
verified | bitwise |
Where the ignition curve sits on the Cn² axis |
— | ungated | rides M6a's absolute threshold; the shape is the result, the position is not — the figure says so in-panel |
Three gates here were landed and then withdrawn, which the ledger records
because a retired gate is a claim that was made and taken back: an aperture-dependence
exponent (seed-dependent — it was measuring the draw, swinging −0.10 to −0.32
across seeds), a (D/r₀)^(5/3) exponent (a tautology — the generator scales the
screen linearly in r₀), and a width gate (no independent anchor).
| claim | site | status | number |
|---|---|---|---|
| G1 — Sod vs the exact Riemann solution | sod_shock_tube_matches_exact_riemann_solution |
verified | L1(ρ) 6.55e-3 → 6.55e-4, rate 0.79–0.88 |
| G2 — 2nd order on smooth flow | euler_muscl_hancock_is_second_order_on_smooth_flow |
verified | 1.86 → 1.94 |
| G2b — coupled hydro↔source is 2nd order | lsd_source_coupling_is_second_order |
verified | 1.99/2.03/1.99 vs a 1st-order contrast at 0.88/1.02/1.07 |
| G3 — LSD velocity vs Raizer's closed form | lsd_front_speed_matches_the_raizer_closed_form |
verified (circular) | 5402 vs 5392 m/s, +0.19 % — it is the Chapman–Jouguet construction the model is built from |
| G3b — residual falls as the absorption layer thins | lsd_front_speed_converges_as_the_absorption_layer_thins |
verified | −8.26 % → +0.19 % |
| G3c — front speed is seed-independent | lsd_front_speed_is_seed_independent |
verified | 1.1e-3 |
G4 — parameter-free D ∝ S^(1/3), ρ₀^(−1/3) |
lsd_velocity_follows_the_parameter_free_one_third_scaling |
verified | S^+0.33190 over 1.52 decades, ρ₀^−0.33020 over 1.50, gated inside ±0.01 |
| The level rides the EOS coefficient while the exponents do not | lsd_velocity_level_tracks_the_eos_coefficient |
verified | level moves 59 % under γ; exponents move 0.001 |
| G5 — energy budget closes | lsd_energy_budget_closes |
verified | 2.1e-16 |
| G6 — frozen plasma table vs direct Mutation++ off-grid | plasma_table_matches_direct_mutationpp_off_grid |
validated | worst 1.48e-3 in n_e (independent third-party code) |
G8 — a real beam through the plasma column is Beer–Lambert, δn ≡ 0 |
plasma_column_absorbs_as_beer_lambert |
verified | 1.7e-13 at τ = 339 |
| The table's charge-state ceiling | plasma_table_charge_state_ceiling_is_pinned |
pinned | regression pin on the table's extrapolation limit |
| G7 — absolute LSD velocity vs measurement | — | ungated | Amended by M6d. Radial relief is no longer the excuse — it is modelled and pinned at δ = 0.23 (R_b·α = 3.2), i.e. ~23 % of the front speed, which covers part but not all of the ~2× gap to measurement. G7 stays ungated for exactly one reason now: there is no anchored measured dataset (the M6a-D5-style debt, inherited by M6d). Remaining candidates for the rest: radiation losses, incomplete absorption, the production EOS, and the un-refracted beam |
| claim | site | status | number |
|---|---|---|---|
G9 — the planar 2-D solver reproduces Euler1d bit for bit |
euler2d_planar_limit_reproduces_euler1d_bit_for_bit |
verified | bit-identical over 240 cells x 40 steps, with both non-vacuity legs |
| G10 — Sedov–Taylor point blast | sedov_blast_matches_the_self_similar_solution |
verified | exponent 0.38628 vs 2/5; level 1.0842x falling to 1.0587 under refinement; peak compression 2.09 → 2.62 climbing toward 6 |
The Sedov reference reproduces the published ξ₀ |
sedov_xi_0_matches_the_published_value |
verified | ξ₀ = 1.03278 derived from the energy integral vs the published ≈1.033 |
| The Sedov profile solves the Euler equations it was derived from | sedov_profile_satisfies_the_euler_equations |
verified | worst residual 6.9e-5, falling as the finite-difference step squared |
| G11 — 2nd order on smooth axisymmetric flow | euler2d_is_second_order_on_smooth_axisymmetric_flow |
verified | 1.861 / 1.964 against a split-source contrast at 1.030 / 1.155 |
G12 — conservation in the r-weighted measure |
euler2d_conserves_mass_and_energy_in_the_r_weighted_measure |
verified | mass and energy < 1e-13 closed box; escape term needed and sufficient when the wall is brought in |
| G13 — the axis is not a wall | the_axis_boundary_does_not_heat_or_starve_the_on_axis_cells |
verified | on-axis entropy defect 2.99e-7 → 3.12e-8 under refinement, vs 3.02e-6 for an even-parity contrast |
| G13(i) — a radially uniform state is a fixed point | a_radially_uniform_state_is_a_fixed_point_of_the_axisymmetric_operator |
verified | bit-identical in mass and both momenta; energy drift < 1e-13 |
| G14 — the wide-beam limit reproduces the 1-D column | lsd2d_with_a_full_width_beam_reproduces_the_one_dimensional_column |
verified | 3.1e-13 while the front is smooth |
| The modelled LSD front is transversely unstable | lsd2d_with_a_full_width_beam_reproduces_the_one_dimensional_column |
pinned | grows out of round-off, amplitude-proportional (10⁶× seed → 10⁶× response), saturating at |u_r| ≈ 200–400 m/s. Identical in planar and axisymmetric geometry, so it is not the geometric source. A planar solver structurally cannot show it |
| G15 — radial relief lowers the front speed | radial_relief_lowers_the_lsd_front_speed_by_a_pinned_amount |
pinned | δ = 0.230 at R_b·α = 3.2 and 0.305 at 1.6, monotone in R_b; banded at ±13 %, which is the measured spread over grid (+6 %), seed (−7 %) and ignition threshold (±8 %) |
| The relief deficit is not a boundary effect | src/lsd2d.rs (rim_undisturbed) |
verified | 21.1 / 21.3 / 21.3 % at domain radii of 3 / 5 / 8 beam radii |
| G16 — the one-third scaling survives relief | the_one_third_scaling_survives_radial_relief |
verified | S^0.34666 at finite R_b against the parameter-free 1/3, while the level moves 23 % |
| The beam is not refracted by the plasma | src/lsd2d.rs (BeamProfile) |
ungated | independent parallel pencils, by assumption; a two-way beam↔plasma loop is a later milestone |
Eight claims in this solver are checked against something external and measured,
and two of those eight are M6a data-integrity checks — they establish that a
digitization reproduces its own published figure, not that the model reproduces
the gas. Of the rest, K_m and the sign of E_eff(p) are agreements about
model inputs rather than outputs. M6a's threshold curve has exactly one
validated agreement, and it is recent and partial: resolving the electron
energy distribution brought the high-pressure slope from outside the model's
literature envelope to inside it, on both measured datasets, which retired a gate
that had been failing on purpose for five days. It is envelope containment over a
constant still free within a 5× literature range, not a point agreement. The
low-pressure branch, the wavelength ratio, and the noble-gas spacing remain
pinned disagreements — and the fact that one change moved the first and left the
others untouched is what now separates M6a's failures into distinct mechanisms.
M1–M4 are in a different position: their physics is
diffraction, extinction and turbulence, where closed forms are exact and
verification is close to the whole job, and M4 additionally reproduces a
published experimental curve. M6c's core is verified to high order but its one
headline agreement (Raizer) is circular by construction, which is why G4 — a
parameter-free scaling exponent — is the milestone's real physics gate.
M6d changes two things about that picture and neither is a validation. First, it
adds the repo's first multidimensional verification anchor: the Sedov–Taylor
blast is a self-similar solution the model is not built from, and its
coefficient ξ₀ is derived here from the energy integral rather than quoted, so
agreeing with the published value to 0.03 % is evidence rather than bookkeeping.
Second, it retires an excuse. M6c's G7 was ungated on the grounds that a
planar solver structurally cannot show radial relief; relief is now modelled and
pinned at 23 % of the front speed, which is a real effect and not the whole ~2×
gap to measurement. G7 remains ungated, but only because no anchored measured
dataset has been acquired — a smaller and more actionable claim than the one it
replaces. M6d also produced something nobody asked it for: the modelled front is
transversely unstable, growing cellular structure out of round-off, which a
1-D solver has no way to exhibit and which had to be separated from relief before
the relief number meant anything.
The field u(x, y, z) obeys the paraxial Helmholtz equation; each slab dz
is advanced by the symmetric (Strang) splitting
u(z + dz) = D(dz/2) · M(dz) · D(dz/2) · u(z)
with D the free-space (vacuum) spectral propagator and M the medium
operator applied at the slab centre — second-order accurate in dz
(verified: observed order ≈ 2).
Duses the angular-spectrum transfer functionH(κ) = exp(−i·κ²·dz/(2k))when the grid resolves it, switching to the Fresnel impulse-response form for long throws (criterionz_c = N·dx²/λ).- Implemented in
src/propagate.rs; gates intests/validation.rs(Gaussian width/divergence < 1 %, power conservation ~1e-14, second-order convergence, long-throw Fresnel path).
References:
- J. A. Fleck, J. R. Morris, M. D. Feit, Time-dependent propagation of high energy laser beams through the atmosphere, Appl. Phys. 10, 129–160 (1976) — the original split-step beam-propagation method.
- G. Strang, On the construction and comparison of difference schemes, SIAM J. Numer. Anal. 5, 506–517 (1968) — symmetric operator splitting.
- J. W. Goodman, Introduction to Fourier Optics, 3rd ed., Roberts & Co. (2005) — angular spectrum and Fresnel propagators.
- J. D. Schmidt, Numerical Simulation of Optical Wave Propagation with Examples in MATLAB, SPIE Press (2010) — sampling criteria, TF vs IR propagator selection.
w(z) = w0·√(1 + (z/zR)²), zR = π·w0²/λ, θ = λ/(π·w0)
Implemented in src/validate.rs (GaussianBeam).
Reference: A. E. Siegman, Lasers, University Science Books (1986), ch. 17.
Power extinction coefficient α (1/m) applied as amplitude decay inside the
medium operator: u ← u·exp(−α·dz/2), giving transmission
T(z) = exp(−α·z). Supports transversely varying α(x, y) per slab.
Implemented in src/medium.rs (Medium::extinction, UniformExtinction) and
src/propagate.rs; gates: uniform extinction matches exp(−α·z) to ~1e-13,
transverse absorber removes exactly the predicted power, α = 0 bit-identical
to vacuum.
Reference: standard radiative transfer (Bouguer–Lambert–Beer); see e.g. E. J. McCartney, Optics of the Atmosphere, Wiley (1976).
α = (3.912 / V) · (λ / 550 nm)^(−q)
q = 1.6 (V > 50 km), 1.3 (6–50 km), 0.585·V_km^(1/3) (V ≤ 6 km)
with V the meteorological visibility (Koschmieder 2 % contrast). Implemented
in src/medium.rs (kruse_extinction).
References:
- P. W. Kruse, L. D. McGlauchlin, R. B. McQuistan, Elements of Infrared Technology, Wiley (1962).
- I. I. Kim, B. McArthur, E. Korevaar, Comparison of laser beam propagation at 785 nm and 1550 nm in fog and haze, Proc. SPIE 4214, 26–37 (2001) — the q-exponent branches.
Refractive-index fluctuations with structure constant Cn² (m^(−2/3))
integrated over a slab give a phase screen with power spectral density
Φ_φ(κ) = 0.4896 · r0^(−5/3) · (κ² + κ0²)^(−11/6), κ0 = 2π/L0
(L0 outer scale; the pure Kolmogorov κ^(−11/3) limit for κ ≫ κ0), with
the plane-wave Fried parameter of the slab
r0 = (0.423 · k² · Cn² · dz)^(−3/5)
Implemented in src/turbulence.rs, src/validate.rs (fried_r0).
References:
- A. N. Kolmogorov, Dokl. Akad. Nauk SSSR 30, 301 (1941) — the −11/3 inertial-range spectrum.
- D. L. Fried, Optical resolution through a randomly inhomogeneous medium
for very long and very short exposures, J. Opt. Soc. Am. 56, 1372
(1966) —
r0. - L. C. Andrews, R. L. Phillips, Laser Beam Propagation through Random Media, 2nd ed., SPIE Press (2005) — von Kármán form, coefficient values.
Screens are drawn as φ = N²·Re(IFFT(a)) with complex-Gaussian mode
amplitudes a(κ) = (g₁ + i·g₂)·√Φ_φ(κ)·Δκ, plus 6 levels of Lane-style
subharmonics (3×3 modes at spacing Δκ/3^p) to restore the large-scale power
the FFT grid cannot represent. Subharmonic modes use a cell-averaged PSD
(5×5 midpoint rule); the FFT modes use the point value — see the quadrature
note in src/turbulence.rs::cell_mean_psd.
Gate: Kolmogorov structure function D_φ(r) = 6.88·(r/r0)^(5/3) reproduced
to < 10 % over a decade of separations; screen variance vs the von Kármán
total σ² ≈ 0.0863·(L0/r0)^(5/3) within 15 %.
References:
- B. L. McGlamery, Computer simulation studies of compensation of turbulence degraded images, Proc. SPIE 74, 225–233 (1976) — FFT screen method.
- R. G. Lane, A. Glindemann, J. C. Dainty, Simulation of a Kolmogorov phase screen, Waves in Random Media 2, 209–224 (1992) — subharmonic compensation.
Rytov variance (plane wave): σ_R² = 1.23·Cn²·k^(7/6)·z^(11/6)
Scintillation index: σ_I² = ⟨I²⟩/⟨I⟩² − 1 ≈ σ_R² (σ_R² ≲ 0.3)
Long-exposure beam radius: W_LT = W(z)·√(1 + 1.33·σ_R²·Λ^(5/6)),
Λ = 2z/(k·W(z)²)
Implemented in src/validate.rs; gates: long-exposure spread 0.5 % off
theory, scintillation index 1.6 % off Rytov.
Reference: L. C. Andrews, R. L. Phillips, Laser Beam Propagation through Random Media, 2nd ed., SPIE Press (2005), chs. 6–8.
Realization i draws from ChaCha12Rng::seed_from_u64(master).set_stream(i)
with fixed draw order, so ensembles are bitwise reproducible across thread
counts (gated).
Reference: D. J. Bernstein, ChaCha, a variant of Salsa20 (2008); rand / rand_chacha crates.
A high-power beam deposits α_abs·I (W/m³) into the air; with crosswind v
along +x and Péclet number Pe = ρ·c_p·v·w/κ_t ≫ 1 (asserted > 100 at
construction) the CW steady state is the upwind line integral
ΔT(x, y, z) = (α_abs / (ρ·c_p·v)) · ∫_{−∞}^{x} I(x', y, z) dx'
δn(x, y, z) = −(n₀ − 1)/T₀ · ΔT (isobaric: Δρ/ρ₀ = −ΔT/T₀, Gladstone–Dale)
evaluated slab-locally as a trapezoid cumulative sum. Implemented in
src/blooming.rs (ThermalBlooming) through the field-aware
Medium::index_response path: the propagator hands over the intensity after
the leading half-step of diffraction (the slab-centre field), and the medium
applies the half-slab Beer–Lambert factor e^(−α_abs·dz/2) so the heating is
a midpoint rule in absorbed power — without that factor the coupling
measurably degrades to 1st order. Ambient ρ, c_p, κ_t, n₀−1 come from the
frozen air table (src/airprops.rs, embedded data/air_properties.npy,
bilinear in (T, p), refractivity rescaled to the run wavelength by Ciddor
dispersion). The absorbed power also leaves the beam (extinction = α_abs).
The absolute intensity the heating needs comes from
IntensityScale — I_phys = (P_beam/P_field)·|u|², pinned
from the launch field, since propagation conserves P_field and any
extinction is already carried by |u|². Blooming computed this inline until
M6c's T4 extraction moved it to src/field.rs for the LSD driver to share;
the move is gated as an exact no-op (G0a below).
Gates (tests/blooming.rs):
- B1 closed-form crosswind phase (erf profile) reproduced to 0.39 % max
over all points with
I > 10⁻⁶·I₀; - coupling order by self-convergence: observed slope 2.000 / 2.000;
- B2 weak-blooming limit vs an analytic first-order (no back-reaction)
screen reference, transmission-normalized: 0.008 % agreement at
N_φ = 0.1, back-reaction residual scaling ratio 3.65 (theory: 4, quadratic); - upwind bend sign, strong-blooming (
N_φ = 20) boundedness with a closed power budget, and the qualitative Smith/Gebhardt signatures (upwind peak shift, downwind crescent, peak-irradiance rollover); - B3 quantitative — the coupled solver reproduces Smith's (1977)
whole-beam steady-state peak-irradiance curve
I_REL(N)along theF₀ = 5branch to 7.2 % max overN ∈ [0.5, 1.8](rollover minimum atN ≈ 1matched to 0.7 %), against the WebPlotDigitizer trace intests/data/smith1977_F5.csv. The largest deviation is at the high-N end, where the wave solver shows a mild diffractive recovery (I_RELrising 0.757 → 0.807) that Smith's flatF₀ = 5curve does not — it behaves like a marginally higher effective Fresnel number there; still inside the ±15 % gate.
Two distortion numbers appear. The phase number (spec convention, reported in run notes) measures peak on-axis blooming phase in radians:
N_φ = √(2/π) · k·(n₀−1)·α_abs·P·L / (T₀·ρ·c_p·v·w)
Smith's geometrical-optics number N_c (the x-axis of his curves) carries
no wavenumber — it is a ray-bending measure — with a = w/√2 the 1/e amplitude
radius and an absorption path factor that → 1 as α·z → 0:
N_c = (n₀−1)/T₀ · I₀·α·z² / (n₀·ρ·c_p·v·a) · [2/(αz) − 2/(αz)²·(1 − e^(−αz))]
Smith plots against an effective N = N_c·{path factor with diffraction Q, Ω};
for the B3 sub-Rayleigh geometry (F₀ = 5 ⟹ z_R = 5z, Q ≤ 1.02; αz = 0.05) that factor is within a few percent of unity, so N ≈ N_c to ≲4 %.
Both implemented in src/validate.rs (BloomingCase: closed-form ΔT/phase
references, distortion_number, smith_distortion_number, A&S 7.1.26 erf).
References:
- D. C. Smith, High-power laser propagation: Thermal blooming, Proc. IEEE
65, 1679–1714 (1977) — steady-state crosswind theory, the
N_cdistortion number and the whole-beamI_REL(N)curves (B3, F₀ = 5 branch digitized intests/data/smith1977_F5.csv). - F. G. Gebhardt, High power laser propagation, Appl. Opt. 15, 1479–1493 (1976) — scaling laws, distortion-number phenomenology.
- R. M. Manning, NASA/TM—2012-217634 (2012) — forced-convection heat budget and the closed-form erf thin-screen phase behind B1.
- P. E. Ciddor, Appl. Opt. 35, 1566–1573 (1996) — air refractivity and dispersion.
- E. W. Lemmon et al., J. Phys. Chem. Ref. Data 33, 111 (2004) — NIST air
data gating the property table's
κ_t(seedocs/M4_SPEC.md).
At a point in dry air the electron density obeys the avalanche balance
dn_e/dt = (ν_i(I, p) − ν_att(p) − ν_esc(p))·n_e + S(I, p)
with cascade ionization driven by the net power — inverse-bremsstrahlung
heating minus the inelastic excitation losses the electron pays climbing to
U_i:
ν_i(I, p) = max(0, heating − L)/U_i
heating(I, p) = (e²·I)/(m_e·c·ε₀) · ν_m/(ν_m² + ω²), ν_m = K_m·p, ω = 2πc/λ
L(p) = δ_eff·ν_m·⟨ε⟩ ≡ L′·p
Both terms scale ∝ p, so their difference gives I_thr(p) = L′/h + …/p — a
constant high-pressure plateau on top of the 1/p avalanche term. Without
L the model's flattest reachable slope is exactly p^-1; the plateau is what
lets it approach the measured trend at all. L′ = δ_eff·K_m·⟨ε⟩ is one lumped
constant taken from the centre of its literature range and never tuned.
That closed form is the mean-trajectory closure (CascadeModel::SelfConsistentClimb).
It is no longer what ships: the default since 2026-07-30 is
CascadeModel::DistributionResolved, which replaces the trajectory with a
first-passage rate and removes the ε_∞ = U_i bifurcation the expression above
sits on. See § "Distribution-resolved cascade" below for the shipped rate; the
mean-trajectory form is kept here because the plateau argument is clearest in it
and because both closures are still selectable.
The loss terms are attachment from measured rate coefficients (dissociative
k₂·n_O₂ ∝ p plus three-body k₃·n_O₂·n ∝ p²; the two-body channel leads at
1 atm, 5.4×10⁷ against 1.4×10⁷ s⁻¹, with three-body overtaking it only above
n = k₂/k₃ = 10²⁶ m⁻³ ≈ 4 atm) and free-electron escape from the focal
volume. Attachment is negligible against escape throughout the gate window —
6.7×10⁷ vs 3.3×10⁹ s⁻¹ at 1 atm.
Escape is not D_e/Λ². That is a continuum random-walk result and assumes the
electron collides many times while crossing the focus, which fails badly at low
pressure: the Knudsen number Kn = λ_mfp/ℓ runs 0.013 at 760 Torr to 0.96 at
10 Torr (3.8× against the diffusion length Λ), so at the bottom of Chylek's
range the electron leaves ballistically without colliding. An electron cannot
cross the region faster than it can travel across it, so the escape time is the
diffusive time plus the ballistic transit time:
ν_esc = 1/(τ_diff + τ_ballistic), τ_diff = Λ²/D_e, τ_ballistic = ℓ/v̄
reducing to D_e/Λ² for Kn ≪ 1 and saturating at v̄/ℓ — pressure-independent
— for Kn ≫ 1. Site: breakdown0d::AirBreakdown::escape_rate,
knudsen_number. No new constant: v̄ = √(3·D_e,ref·p_ref·K_m) follows from
D_e = v̄²/(3ν_m) with the pressure cancelling, giving 1.540e6 m/s — the same
6.740 eV that d_e_ref_implies_a_stated_electron_energy reads out of D_e.
The three focal length scales are distinct and now come from one geometry
(breakdown0d::Focus): Λ = 7.74 µm is a diffusion eigenvalue, the Cauchy
mean chord ℓ = 4V/S = 30.7 µm is a distance (the mean free path of an
isotropically-directed particle leaving a convex body — a theorem, not a model
choice), and V sets the seed density. Using Λ as the ballistic transit
distance understates the correction by 4.0×.
D_e,ref used to be M6a's largest ungated number. It is no longer free: kinetic
theory ties it to the externally-gated K_m by D_e = 2ε/(3 m_e K_m p), so
D_e,ref = 0.2 m²/s is the statement ε = 6.740 eV
(d_e_ref_implies_a_stated_electron_energy). Sweeping the whole band that
formula admits — ε from 2 eV to U_i, a 6.0× range in D_e — moves the fitted
slope by less than 0.1, against a shortfall to the measured 0.329 that is more
than twice that, so D_e cannot account for the slope gap
(d_e_sensitivity_is_pinned_across_the_kinetic_band). Two debts remain, both
recorded rather than papered over: diffusion assumes 6.74 eV while the
FixedMeanEnergy loss term assumes ⟨ε⟩ = 3 eV (a 2.25× internal
inconsistency), and there is still no measurement of D_e at the cascade's own
energy — swarm data reaches only 0.1–2 eV.
Λ is the diffusion length of T&T's divergence-limited focus, from their
Eq. 5: (1/Λ)² = (π/l₀)² + (2.405/r₀)² with r₀ = f·α/2 = 20 µm and
l₀ = 0.414·(α/d)·f² = 66 µm, giving Λ = 7.74 µm — matching the 8 µm the
paper states. Pinned from geometry, never fit. Because the focus is set by
the beam's 1 mrad divergence rather than by diffraction, Λ and the focal volume
are wavelength-independent — which is what makes the wavelength gate below a
clean one-variable test.
The seed and the multiphoton source. The kernel does not assume a starting
electron. n_e0(p) = q(p)/ν_att(p) is the physical ambient free-electron
density — the equilibrium between cosmic-ray ionization and the kernel's own
attachment rate — and the pulse produces its own electrons through PPT
photoionization, which is on by default. Both are covered in § "Seed
production" below. The older S_mpi = σ_K·I^K·N term and the Keldysh rate remain
implemented and selectable, but both are off by default.
Breakdown at n_e ≥ n_bd = 10²³ m⁻³. The per-slice ODE is advanced by its exact
solution: with no source term the slice is Bernoulli — growth is logistic,
since ionization depletes the neutrals it feeds on — and is evaluated as
n_e' = n_e/(e^{−βdt} + b·n_e·(1 − e^{−βdt})/β) with β = ν_i − ν_loss,
b = ν_i/N; that form underflows harmlessly instead of overflowing to NaN far
above threshold, and n_e saturates at full ionization rather than running away.
Threshold intensity is found by log-bisection; a pressure sweep gives I_thr(p).
Implemented in src/breakdown0d.rs.
Solving the avalanche criterion for the mean-trajectory closure gives
I_thr(p) = L′/h + U_i·(ν_att + ν_esc + G)/(h·p), G = ln(n_bd/n_seed)/τ
Attachment is negligible here, so the exponent runs between two exact
limits — plateau-dominated n → 0 and escape-dominated n → 2 — with the
growth-limited p^-1 in between. The two selectable closures give 0.086
(SelfConsistentClimb) and 0.440 (FixedMeanEnergy) over the pinned
300–2000 Torr window, straddling the measured 0.329; that bracket is gated by
the_two_cascade_models_bracket_the_measurement and must be read narrowly — the
two variants differ only in where the cascade cuts off (⟨ε⟩ = 3 eV vs
U_i = 12.06 eV), so it is a one-parameter sensitivity, not two independent
limits and not a bound. The shipped distribution-resolved closure gives
0.264 at the untouched literature centre. Absolute threshold level is
not gated (3–10× inter-lab scatter). Integrator sub-gates are unit tests of
the exact per-slice solver, not physics validation.
External gates (Thiyagarajan & Thompson 2012 and Chylek et al. 1990, digitized
into tests/data/; T&T's setup — 1064 nm, 6 ns FWHM, 20 µm radius focus,
10–2000 Torr — is exactly what the kernel assumes, so nothing is fitted):
K_mcollision frequency — validated.E_eff/E_B = ν_m/√(ν_m²+ω²), so the paper's two curves measureν_mindependently of this crate. ImpliedK_m = 4.21×10⁷vs the kernel's3.90×10⁷ s⁻¹Pa⁻¹; ratio flat at 1.05 ± 0.01 over 46–1858 Torr. Non-circular anchor.E_eff(p)slope — validated. Predictedp^+0.642, measuredp^+0.695; the positive sign confirms theν_m ≪ ωbranch.I_thr(p)slope vs the MEASURED curve — validated since 2026-07-30. Measuredp^-0.329. Sweeping the literature range of the model's one free constant,δ_eff ∈ [0.01, 0.05], the shipped closure gives an envelope[0.174, 0.382]which contains the measurement, centre 0.264; the mean-trajectory closure's[0.023, 0.231]excluded it. The gate pins the envelope as well as the containment, so "contains the measurement" cannot later be satisfied by an envelope that has quietly grown. This gate was red and#[ignore]d from 2026-07-25 to 2026-07-30 and was retired by the closure change, with no tolerance moved and no constant touched — the history is indocs/M6A_SPEC.md§ "Distribution-resolved cascade", and it matters, because the same test once passed for a bad reason (an integration artifact that let an arbitrary bound supply most of the threshold).- Chylek's curve: the residual is a shape defect, and it is localised. The
kernel is not a power law across two further decades of pressure. On three wide
windows it gives 0.501 / 0.857 / 0.386 against a measurement holding 0.428 /
0.413 / 0.468 (
chylek1990_air_is_a_power_law_and_the_cascade_kernel_is_not). Redone like-for-like on six narrow bands the failure narrows sharply — see § "The mid-pressure residual" below, which is the honest statement of where the kernel is wrong and by how much. - Cascade theory (T&T Eq. 4) — verified, same lineage.
I_B(CC) = 1.44×10⁶(p_atm² + 2.2×10⁵λ_µm⁻²)W/cm², implemented asvalidate::tt2012_cascade_threshold. Flat at 1064 nm becauseλ⁻²dominatesp²by 10⁵ — so the kernel's flatness agrees with cascade theory. Level: 4.1–5.1× high (climb), 1.3–3.2× (fixed⟨ε⟩). - Wavelength scaling vs Eq. 4 — verified, same lineage, and the strongest
shape check in M6a. Both terms of
I_thrcarry1/h ∝ ω², so the kernel predictsI_thr ∝ λ⁻², the same exponent as Eq. 4's dominant term. Over 0.53–10.6 µm (a 20× span, geometry frozen — legitimate, since the focus is divergence- not diffraction-limited) both give −2.000, with the ratio between them constant to2×10⁻⁵. Sharper still: the plateauL′/hand Eq. 4'sλ⁻²coefficient are the same physical quantity —ω²times the inelastic energy loss per collision — and agree to 1.01× at the literature centre. This is a shape agreement on an axis where nothing is tunable. It does not independently discover the scaling (theλ⁻²is analytic in theν_m ≪ ωlimit) — it establishes that the two theories share it exactly, and fails loudly if that limit is left. Not a pin: re-pinningδ_eff·⟨ε⟩from Eq. 4 would make the level assertions here and intt2012_cascade_theory_referencecircular. - Level vs the measured curve — bounded, drifting, ungated. 3.90–4.69× high
across the window, inside the ungated 3–10× inter-lab scatter, with the
remaining 1.20× drift being the residual slope error in absolute clothing.
Converting
E_Bto intensity usesI = ε₀cE_rms², since theE_effratio establishesE_Bis an RMS amplitude. - T&T's own MPI calibration undershoots their own measurement — pinned.
Anchoring a rate to their
I_B(MPI) = 4.42×10⁹ W/cm²collapses the threshold to 5.5×10⁹, 37× below their own measurement, and contradicts the paper's own 88 %-cascade accounting. Their number is an order-of-magnitude significance indicator (Nelson's flux-density criterion, whose constant the paper never states), not a rate anchor.
The wavelength ratio is falsified against measurement, in sign. Chylek et al. 1990 is the independent anchor D5 asked for — different group, different apparatus, and exactly half T&T's wavelength at a nearly identical pulse length (6.5 vs 6 ± 1 ns) and focal radius (16.5 vs 20 µm). That match is what makes the 532/1064 comparison a measurement of wavelength scaling rather than of two different benches. It does not corroborate the model:
kernel (shipped): I_th(532)/I_th(1064) = 2.85
measured: ≈ 0.80 (532 nm breaks down EASIER)
An overshoot of 3.57×, and wrong in sign. Gated as
chylek1990_tt2012_wavelength_ratio_falsifies_cascade_lambda_squared. λ⁻²
remains a correct statement about the kernel's internal structure and its gate
stays — it fails loudly if the IB Lorentzian limit is ever left — but it may
not be called external agreement with measurement.
Three candidate explanations have been implemented and gated, and none closes
the gap: Keldysh photoionization (order-unity prefactor, 2.89), PPT with the
published Z_eff (2.947, and the Coulomb correction is order-unity rather than
orders for a molecule), and seed production (which moved it 3.39 → 2.85). What
did come out of the attempt is the finding in § "PPT photoionization" below:
the two anchor experiments sit on opposite sides of the multiphoton seeding
threshold, so their threshold ratio is not a measurement of one mechanism's
wavelength scaling at all. The full history of these attempts, including two
claims of mine that were withdrawn, is in docs/M6A_SPEC.md.
The mean-trajectory closure ionizes only once ε_∞ > U_i, a hard bifurcation
that the model is evaluated on top of (ε_∞/U_i = 1.032 at 760 Torr). Resolving
the distribution removes it. An electron absorbs inverse-bremsstrahlung quanta of
size ħω, so its energy is an Ornstein–Uhlenbeck process rather than a
trajectory:
dε = δ_eff·ν_m·(ε_∞ − ε)·dt + √(2·D_ε)·dW, D_ε = ½·P_heat·ħω
The drift is unchanged; D_ε is photon shot noise and adds no new constant.
Ionization is first passage to U_i with a reflecting wall at ε = 0, from
Siegert's formula:
ν_i = 1/T, T = (1/D_ε)·∫₀^{U_i} dy e^{+φ(y)} ∫₀^y dz e^{−φ(z)},
φ(ε) = (ε² − 2·ε_∞·ε)/(ε_∞·ħω)
Site: breakdown0d::first_passage_ionization_rate, first_passage_integral.
Evaluated by an O(N) recurrence in the differences of φ — the naive form
splits a bounded product into factors of 10^±274.
Verification: exact reduction to the mean-trajectory closed form as
D_ε → 0, ratio 0.821 → 0.990 as ħω falls 1.166 → 0.05 eV
(first_passage_reduces_to_the_mean_energy_climb, self-refining); quadrature 2nd
order with the shipped N = 512 inside 2e-4 at both photon energies
(first_passage_quadrature_is_converged); the bifurcation is gone and the rate
continuous through ε_∞ = U_i (distribution_resolved_has_no_bifurcation); and
the rate is a function of (ε_∞/U_i, ħω/U_i) alone, preserving ν_i ∝ p
(first_passage_rate_depends_only_on_two_dimensionless_groups).
Validated — the high-pressure slope (distribution_resolved_cascade_fixes_the_high_pressure_slope).
At the untouched literature centre δ_eff = 0.02: T&T 300–2000 Torr goes
0.086 → 0.264 against a measured 0.329, and Chylek 300–786 Torr goes
0.151 → 0.431 against 0.468. Over the literature range of that single free
constant the envelope moves from [0.023, 0.231], which excludes 0.329, to
[0.174, 0.382], which contains it. (These are the isolating comparison — both
closures run with seeding suppressed, so the change measured is the closure's
alone. The shipped default also produces its own seed; § "Seed production" gives
the numbers with everything on.)
Pinned — what it does not fix. The low-pressure branch is unmoved,
1.289 → 1.293 against a measured 0.428, which localises that failure to diffusion
loss rather than to the cascade closure
(distribution_resolved_does_not_fix_the_low_pressure_branch). The wavelength
ratio moves 4.00 → 3.39 against ≈0.80 — the right sign at last, since D_ε ∝ ħω
makes a shorter wavelength take bigger energy steps, but a 15 % move against a 5×
gap (distribution_resolved_does_not_close_the_wavelength_gap). And the hard
plateau floor no longer bounds anything: the threshold slides under it,
1.09× → 0.75× → 0.63× at 300 / 760 / 2000 Torr
(distribution_resolved_softens_the_plateau_floor), so the noble-gas headroom
figures below are a bound for the mean-trajectory closure only.
The default since 2026-07-30. It landed as a variant first so that its
effect on every published number was measured rather than asserted, then was
promoted. The promotion retired M6a's long-standing red gate:
tt2012_threshold_slope_matches_measurement had been #[ignore]d and failing
since 2026-07-25 and now passes — with no tolerance moved and no constant
touched, because the model changed rather than the test. Numbers that moved with
it: the level-ratio drift 1.48× → 1.20× (a smaller drift is a smaller residual
slope error), the λ-ratio baseline 3.99 → 3.39, and the M6c pulse-length floor,
which is now asymptotic rather than flat — 8.510e15 at 6 ns converging to
6.797e15 by ~10 µs, a bounded 1.25 % … 1.25× fall rather than the fluence
criterion that would break M6c's two-stage argument.
Reference: A. J. F. Siegert, On the first passage time probability problem, Phys. Rev. 81, 617 (1951) — the mean-first-passage quadrature; the energy-space diffusion picture of cascade breakdown is standard, see Raizer (above) and Zel'dovich & Raizer, Physics of Shock Waves and High-Temperature Hydrodynamic Phenomena, ch. VI.
The gas-dependent constants live in breakdown0d::Gas; the laser and the focal
geometry stay on AirBreakdown. Gas::dry_air() is a re-packaging that changes
no number — the breakdown case is bit-identical across the split.
Writing out the equilibrium energy,
ε_∞ = (e²I/(m_e c ε₀))·ν_m/((ν_m²+ω²)·δ_eff·ν_m), the collision frequency
cancels exactly in the optical regime ν_m ≪ ω, because heating and
inelastic loss both scale ∝ ν_m. Ionization needs ε_∞ > U_i, so the cascade
has a hard floor with no transport constant in it at all:
I_plateau = δ_eff · U_i · m_e·c·ε₀·ω² / e²
Site: breakdown0d::cascade_plateau_intensity, AirBreakdown::plateau_intensity.
Gated as cascade_plateau_floor_is_independent_of_the_transport_constants,
which perturbs D_e by 100× either way and demands the floor not move, and
checks cascade_rate is identically zero just below it at every pressure.
For a monatomic gas this is a prediction with nothing to choose:
δ = 2m_e/M is the atomic mass, U_i is spectroscopy. breakdown0d::MonatomicGas
carries only those exactly-known constants:
| gas | U_i (eV) |
first excitation (eV) | M (u) |
δ = 2m_e/M |
K @ 532 nm |
floor (W/cm²) |
|---|---|---|---|---|---|---|
| He | 24.587 | 19.82 | 4.0026 | 2.741e-4 | 11 | 1.275e11 |
| Ar | 15.760 | 11.55 | 39.948 | 2.747e-5 | 7 | 8.190e9 |
| Xe | 12.130 | 8.32 | 131.293 | 8.357e-6 | 6 | 1.918e9 |
Against Chylek's Fig. 2 measurements
(chylek1990_noble_gas_plateau_floors_are_unequally_tight): every curve sits
above its own floor, and the ordering He > Ar > Xe is right. The spacing is
not — predicted floor ratios He/Ar = 15.6 and Ar/Xe = 4.27 against measured
threshold ratios ≈2.5 and ≈3.0, so He/Ar is over by 6.3× and He/Xe by 8.8×, with
no constant left to turn. The headroom above the floors is 1.85× (He), 7.8× (Ar),
13.2× (Xe) — monotone in atomic mass, which a cascade-only kernel gives no reason
for. And δ_elastic is a lower bound: the last leg of every climb runs above
the first excitation threshold (19 % of the ascent in He, 27 % Ar, 31 % Xe),
where inelastic loss dwarfs elastic recoil, so the true floors are higher and He
— with 1.85× of room — is the gas that breaks first.
Three gases at one wavelength and one bench span K = 11/7/6, which is the
only way in this repository to separate photon order from wavelength; the air
data confounds them. Gas::from_monatomic takes K_m and D_e as required
arguments rather than defaults, because no citable momentum-transfer table was
landed and for Ar and Xe those cross sections swing two orders of magnitude
across the Ramsauer minimum. Full noble-gas threshold curves are therefore not
computed here; the plateau gate needs neither constant.
Milestone record and the reasoning behind these choices: docs/M6A_SPEC.md.
References:
-
Yu. P. Raizer, Gas Discharge Physics, Springer (1991) — cascade ionization and the inverse-bremsstrahlung heating rate.
-
N. Kroll, K. M. Watson, Theoretical study of ionization of air by intense laser pulses, Phys. Rev. A 5, 1883 (1972).
-
C. G. Morgan, Laser-induced breakdown of gases, Rep. Prog. Phys. 38, 621 (1975) — regime map and threshold scaling.
-
A. Thiyagarajan, J. B. Thompson, Optical breakdown threshold investigation of 1064 nm laser induced air plasmas, J. Appl. Phys. 111, 073302 (2012) — the external anchor:
E_BandE_effcurves digitized intotests/data/tt2012_*.csv, focal geometry from their Eq. 5, and the cascade closed form from their Eq. 4. -
P. Chylek, M. A. Jarzembski, V. Srivastava, R. G. Pinnick, Pressure dependence of the laser-induced breakdown thresholds of gases and droplets, Appl. Opt. 29, 2303 (1990) — the independent D5 anchor: the clean-air threshold at 532 nm (their Fig. 3,
α = 0.45 ± 0.01), digitized intotests/data/chylek1990_air_threshold_vs_pressure.csvbyscripts/digitize_chylek1990.py. Second group, second apparatus, second wavelength, matched pulse and focus. Their Fig. 2 additionally gives clean He, Ar and Xe thresholds on the same bench, hand-traced intotests/data/chylek1990_{he,ar,xe}_threshold_vs_pressure.csvand cross-checked against an independent programmatic trace to 0.3 % on Ar and Xe. Those three gases spanU_i= 24.59 / 15.76 / 12.13 eV, i.e. multiphoton order K = 11 / 7 / 6 at a single wavelength and a single apparatus — the one dataset here that separates photon order fromλ— and having no attachment channel they isolate cascade + diffusion + MPI. Consumed since 2026-07-30 bychylek1990_noble_gas_plateau_floors_are_unequally_tight, which tests the parameter-free plateau floorδ·U_i·m_e c ε₀ ω²/e²against them —δ = 2m_e/Mis the atomic mass, so for these gases the cascade has no free constant at all. Their own integrity gate (chylek1990_fig2_digitization_reproduces_the_published_slopes) stays. -
A. Sharma, M. N. Slipchenko, M. N. Shneider, X. Wang, K. A. Rahman, A. Shashurin, Counting the electrons in a multiphoton ionization by elastic scattering of microwaves, Sci. Rep. 8, 2874 (2018); arXiv:1710.03361 — the absolute eight-photon ionization cross-section of O₂ at 800 nm,
σ₈ = (3.3 ± 0.3)×10⁻¹³⁰ W⁻⁸m¹⁶s⁻¹, from direct electron counting by Rayleigh microwave scattering calibrated against dielectric scatterers of known properties. Consumed byppt_rate_matches_the_measured_o2_cross_section. This is the only anchor in this file that constrains an ionization rate rather than a breakdown threshold, which is why it can test the MPI channel without the circularity that sank the earlier attempts. -
A. Talebpour, C.-Y. Chien, S. L. Chin, The effects of dissociative recombination in multiphoton ionization of O₂, J. Phys. B 32, 1229 (1999) — the source of
Z_eff= 0.53 for molecular O₂ (breakdown0d::Z_EFF_O2), from their PPT fit to measured O₂ ionization at 800 nm, and of an independent rate point (3×10⁹ s⁻¹ at 3×10¹³ W/cm²) that sits 7× belowσ₈·I⁸at the same intensity. The two published anchors disagree by more than either disagrees with PPT, which is what bounds the prefactor to about an order of magnitude.
Added 2026-07-31, to settle the prefactor branch left open above. Site:
breakdown0d::ppt_rate, on by default since seed production landed (the
other two multiphoton paths stay off); AirBreakdown::with_ppt_mpi(Z_EFF_O2)
selects it explicitly.
W = |C_n*|²·√(6/π)·U_i·(2F₀/(F√(1+γ²)))^{2n*−3/2}·A₀(ω,γ)·exp[−(2U_i/ħω)·f(γ)]
in atomic units, with κ = √(2U_i), F₀ = κ³, n* = Z_eff/κ,
|C_n*|² = 2^{2n*}/(n*Γ(n*+1)Γ(n*)), and the above-threshold sum
A₀(ω,γ) = (4/√(3π))·(γ²/(1+γ²))·Σ_{n≥⌈ν⌉} e^{−α(n−ν)}·Φ(√(β(n−ν)))
ν = (U_i/ħω)(1 + 1/2γ²) α = 2[asinh γ − γ/√(1+γ²)] β = 2γ/√(1+γ²)
Φ is Dawson's integral (breakdown0d::dawson). The sum's truncation is
derived, not fixed: α → ⅔γ³ as γ → 0, so the number of terms needed to
reach a stated depth diverges as 1/γ³ — 10 terms at γ = 10, tens of
thousands by γ = 0.1. ppt_ati_terms sizes it from α, and below
γ = 0.1 the tunnelling limit A₀ → 1 takes over, which makes the whole
expression ADK. A fixed 64-term truncation was tried first and is wrong by
29 % at γ = 0.2 in a way that looks like physics; the gates that catch it are
ppt_reduces_to_adk_in_the_tunnelling_limit and
ppt_rate_is_monotonic_across_the_bisection_bracket, the latter because an
un-converged sum makes the rate fall with intensity inside the bracket that
threshold_intensity bisects on.
The exponent is the same
object as Keldysh's — PPT's (2F₀/3F)g(γ) is algebraically (2U_i/ħω)f(γ) —
so keldysh_tunnel_exponent is reused rather than re-derived, and
ppt_and_keldysh_share_the_same_exponent gates that the two have not drifted.
Why this is a test and not a fit. Keldysh's prefactor is an order-unity
function no derivation pins, which is why keldysh_rate exposes it as an
argument. PPT's is fully determined once Z_eff is given, and Z_eff = 0.53
for O₂ is published (Talebpour 1999). ppt_rate therefore takes no prefactor
argument, and its absolute magnitude is a prediction.
It passes an absolute validation. Against the measured σ₈ at 800 nm, with
nothing fitted:
I (W/cm²) |
W_PPT / σ₈I⁸ |
|---|---|
| 10¹⁰ | 1.995 |
| 10¹¹ | 1.974 |
| 10¹² | 1.768 |
Within a factor of 2 of an absolutely calibrated measurement, and high — the
direction the source paper reports for purely theoretical predictions. The
comparison is made below 10¹² W/cm² because PPT's fitted order softens as γ
falls, and a magnitude ratio between two different powers of I means nothing.
A structural result found by a gate that expected something else. PPT
returns an integer photon order, K = ⌈ν⌉ — 7.998 at 800 nm, 10.998 at
1064 nm, 6.000 at 532 nm — where the bare Keldysh exponential gives the
fractional U_i/ħω. The leading ATI term carries e^{−α(γ)(⌈ν⌉−ν)} and
dα/d ln I = −1, which contributes exactly ⌈ν⌉ − ν to the log-log slope. You
cannot absorb 10.34 photons; the fractional order is an artifact of dropping the
sum, and restoring it is what makes reading σ₈ as an eight-photon
cross-section legitimate.
And it does not close the wavelength gap.
| source | I_th(532)/I_th(1064) |
gap closed |
|---|---|---|
| cascade only | 3.349 | — |
| Keldysh, prefactor 1 | 2.89 | 18 % |
PPT, Z_eff = 0.53 |
2.947 | 16 % |
| PPT + a physical seed (10⁹ m⁻³) | 2.835 | 20 % |
| measured | 0.80 |
The reason is worth stating because it inverts the expectation that motivated
the work: n* = Z_eff/κ = 0.563 makes the Coulomb exponent 2n* − 3/2
negative, so the correction that lifts an atomic rate by orders of magnitude
at Z = 1 is order-unity for a molecule at Z_eff = 0.53. "Coulomb corrections
can lift the prefactor by orders of magnitude" is true of atoms and false here.
The finding that does explain something. Evaluated at each paper's own measured threshold — no model threshold anywhere in the calculation, so the kernel's pinned 3.90–4.69× level offset cannot contaminate it:
| 1064 nm (T&T) | 532 nm (Chylek) | |
|---|---|---|
measured I_th (W/cm²) |
2.06×10¹¹ | 1.56×10¹¹ |
N_seed = W·N·V·τ there |
5.4×10⁻⁹ | 3.15 |
I where N_seed = 1 |
1.18×10¹² | 1.30×10¹¹ |
that, over measured I_th |
5.73× | 0.83× |
At 532 nm the measured breakdown threshold is the multiphoton seeding threshold, to 17 %. At 1064 nm multiphoton ionization is 5.7× short of making a single electron, so breakdown there is seeded by something else — background ionization, impurities, dust — as the classical picture of ns IR breakdown has it. The two experiments are on opposite sides of that transition, so their threshold ratio is not a measurement of one mechanism's wavelength scaling. That is the "systematic in the two-paper comparison" branch, made specific.
Gated by ppt_multiphoton_order_is_the_integer_photon_count,
ppt_and_keldysh_share_the_same_exponent,
ppt_rate_matches_the_measured_o2_cross_section,
ppt_does_not_close_the_wavelength_gap_either,
ppt_seeding_thresholds_separate_the_two_experiments, and the four
special-function checks in breakdown0d::tests.
References. V. S. Popov, Tunnel and multiphoton ionization of atoms and ions in a strong laser field (Keldysh theory), Phys.-Usp. 47, 855 (2004), for the PPT rate in the form used here; the two anchors above.
Added 2026-07-31. The last knowingly-false assumption on M6a's default path.
The kernel used to start every pulse from n_e0 = 1/V_focal = 1.2×10¹³ m⁻³ —
one electron sitting in the focus — and to clamp n_e at that value throughout
the integration. Both are now gone. The initial condition is the physical
ambient density and the pulse produces its own electrons.
n_e0(p) = q(p)/ν_att(p), q(p) = q_ref·(p/p_ref), q_ref = 10⁷ m⁻³s⁻¹
ν_att is the same expression the loss term uses (Gas::attachment_rate,
factored out so the two cannot drift), and q_ref ≈ 10 ion pairs cm⁻³ s⁻¹ is a
standard atmospheric-electricity value (AFRL Handbook of Geophysics and the
Space Environment, ch. 20, Sagalyn & Burke, 1985). Multiphoton production is
ppt_rate, on by default — without it a physical background would never break
down.
The retired assumption was wrong by ~14 orders, not the ~10⁴ this file used to
claim. That claim compared 1/V_focal against the cosmic-ray ion density,
10⁹–10¹⁰ m⁻³. Air is electronegative: ν_att = 6.7×10⁷ s⁻¹ at 1 atm, so a free
electron survives ~15 ns and the free-electron background is
q/ν_att = 0.149 m⁻³ — about 1.2×10⁻¹⁴ electrons in an 8.3×10⁻¹⁴ m³
focus. The lower atmosphere holds essentially no free electrons, and a tight
focus cannot expect to find one waiting.
The new constant is not load-bearing, and that is the argument for it.
Sweeping the seed over twelve decades (10⁻⁶ → 10⁶ m⁻³) leaves the threshold
bit-identical; it takes ~10 orders before it moves 0.04 %. The retired
1/V_focal sat in the range where the seed does matter (2.6 % at 10¹²), so
the old constant was load-bearing and wrong while the new one is neither.
Gated as ionization_background_is_not_load_bearing.
An explicit seed still behaves as a floor; the derived one does not. Setting
with_seed_density is a modelling assumption — "this many electrons are
available" — and holding it constant is what keeps a source-free run independent
of the integration window. The derived background is a physical initial
condition and must be free to deplete. That distinction is what lets the gates
that isolate a cascade closure or a loss term (seeding_suppressed in
tests/validation.rs) keep their published baselines unchanged, and it is gated
by seed_floor_applies_only_to_an_explicit_seed.
What it does to the measurements. The low-pressure branch — this milestone's worst residual for its whole life, and the one both source papers attribute to multiphoton ionization — is essentially repaired:
| Chylek window (Torr) | seeding off | default | measured |
|---|---|---|---|
| 10–100 | 1.292 | 0.501 | 0.428 |
| 100–300 | 0.947 | 0.857 | 0.413 |
| 300–786 | 0.431 | 0.386 | 0.468 |
3.0× too steep → 1.17×. It is the largest single improvement M6a has had,
and it came from deleting an assumption rather than adding a term. The
wavelength ratio also moves, 3.39 → 2.854 against a measured 0.80 (overshoot
4.24× → 3.57×), because multiphoton production is I⁶ at 532 nm against I¹¹
at 1064.
What it costs, recorded rather than smoothed over. The 300–786 Torr window slips from 0.431 to 0.386 against 0.468, absolute thresholds rise 3.3–4.2 %, and a mid-pressure residual survives — see below, where it is diagnosed properly.
The three wide windows above are the right shape for asking is the kernel a power law and the wrong shape for asking where is it wrong: they compare the model's local behaviour against a measured window average. Redone like-for-like on six narrow bands, both fitted over the same measured abscissae:
| band (Torr) | measured | model | cascade only |
|---|---|---|---|
| 4–12 | 0.308 | 0.238 | 2.203 |
| 12–30 | 0.485 | 0.316 | 1.275 |
| 30–70 | 0.553 | 0.580 | 1.300 |
| 70–150 | 0.455 | 1.045 | 1.191 |
| 150–350 | 0.339 | 0.690 | 0.769 |
| 350–800 | 0.458 | 0.350 | 0.389 |
The measurement is not locally flat — it runs 0.31–0.55 — and the kernel
tracks it to better than 0.25 everywhere except 70–350 Torr, where it is
2.0–2.3× too steep. That is much narrower than "the kernel is not a power law",
and it is exactly the band nothing masks: below ~30 Torr free-molecular escape
and multiphoton seeding both bite, above ~350 Torr diffusion is sub-dominant to
the cascade plateau, and in between D_e/Λ² carries the pressure dependence
alone, at Kn = 0.03–0.14 where the free-molecular correction is a few per cent.
Two candidate explanations have been tested and both fail:
- It is not the absolute level. The tidy story would be that a model running
14–33× high overstates an
I⁶source by ~10⁶, with a drift because the offset drifts. Sweepingδ_effwalks the level from 15.8× to 3.4× and the bump gets worse, peak local exponent 1.04 → 1.42. Gated asthe_mid_pressure_residual_is_not_a_level_artifact, which also rules out fittingδ_eff— the tempting move, since it is the milestone's one remaining free constant. - It is not space-charge screening. Free diffusion is only valid while the
plasma is tenuous; above
n_e≈ε₀ε_e/(e²Λ²)= 6.2×10¹⁸ m⁻³ — four decades belown_bd— diffusion should become ambipolar and ~130× weaker. Prototyped with a cited ion mobility: it redistributes the error rather than removing it (70–150 Torr 1.022 → 0.339, but 4–12 Torr 0.237 → 0.702 against a measured 0.308), for a net improvement of ~13 % in total absolute error at the cost of a new constant. Not landed: a marginal gain bought with a new constant is what this project's rules exist to refuse.
So the residual is a genuine shape defect in the continuum diffusion loss, it is not reachable by any constant the model already has, and the obvious missing mechanism does not account for it. That is M6a's sharpest open question.
Window independence now holds for a better reason. It used to hold because
the seed was clamped, which patched a symptom; with production replacing the
initial condition there is nothing left to decay, and the spread over
w ∈ [1,4] is 5×10⁻⁵ against the 1 % the gate tolerates. The threshold stays an
intensity floor rather than a fluence criterion — 8.815×10¹⁵ at 6 ns converging
to 6.745×10¹⁵ by ~10 µs, a bounded 1.31× fall (was 1.25×), so M6c's two-stage
argument is untouched.
In the Fraunhofer regime the focal field is the Fourier transform of the aperture field, so the on-axis focal amplitude is its DC component:
U_focus(0) = (1/(λf))·∫∫ U(x, y) dA
I_focus = |∫ U dA|² / (λf)²
Site: src/aperture.rs (Aperture). Exact given Fraunhofer and a thin
lens — not a small-aberration approximation; the Maréchal form S ≈ exp(−σ_φ²)
is a weak-aberration limit of it, and is gated as a limit rather than used as
the definition.
This is what lets M6a.2 exist at all. Turbulence is resolved on a centimetre
grid over a kilometre path while the focal spot that ignites a spark is
micrometres across; resolving λf/D while spanning D needs N ≳ 10⁴ per
side. There is no focal grid anywhere — every quantity is a pupil integral
on the grid the propagator already produced.
Two degradations are reported and deliberately never conflated:
focal_intensity_ratio— against the same beam through vacuum. Total degradation, wavefront and amplitude scintillation, because the pupil field carries both. This is the quantity that feeds an ignition test.phase_only_strehl=|∫U dA|²/(∫|U| dA)²— normalised against the beam's own amplitude, so scintillation divides out and the wavefront contribution is isolated. Diagnostic only. Calling the first one "the Strehl ratio" would be wrong, which is why both exist.
Gates (src/aperture.rs unit tests): a flat wavefront gives exactly S = 1 and
nothing exceeds it (the triangle inequality on the coherent sum); a pure tilt
steers the spot without dimming it — S unchanged, wander = f·θ — which is
the sharpest statement of why the two quantities differ; an amplitude-only
perturbation leaves phase_only_strehl at 1 while costing focal intensity; and
S → exp(−σ_φ²) as the aberration shrinks, with the residual gated to fall.
Reference: J. W. Goodman, Introduction to Fourier Optics, 3rd ed., Roberts & Co. (2005), § 5.2. V. N. Mahajan, J. Opt. Soc. Am. 73, 860 (1983) — the Maréchal limit.
Kolmogorov phase over a circular pupil, with the low-order Zernike terms projected out:
piston removed σ_φ² = 1.0299·(D/r₀)^(5/3) (Noll 1976, Δ₁)
piston + tilts removed σ_φ² = 0.134 ·(D/r₀)^(5/3) (Noll 1976, Δ₃)
Site: src/aperture.rs (Aperture::residual_phase_variance, TiltRemoval).
Both coefficients are parameter-free. Taken on phase screens, not propagated
fields: arg(u) is only recoverable modulo 2π and wraps many times at these
D/r₀, so a variance from a propagated field would be measuring the wrapping.
These are an independent projection of the statistics M3 already gates through
the structure function — a pupil integral in the Zernike basis versus D_φ(r)
in the plane. Passing one does not imply the other.
- N1 (
noll_tip_tilt_removed_variance_matches_the_closed_form) — measured 0.1407 at the pinned seed, +5.0 % on Noll, banded at ±12 %. The band is set by the ensemble spread, not the central value: across three seed sets at 64 and 128 screens the coefficient runs 0.129–0.143, and that spread does not shrink with screen count because it is dominated by how much low-order power an ensemble happened to draw. A tighter band would gate the draw. - N2 (
noll_piston_removed_variance_converges_to_kolmogorov) — Noll assumes an infinite outer scale; the screens are von Kármán. Piston-removed variance is dominated by the largest scales, so it is stronglyL₀-dependent:L₀/D= 10 → 0.345, 40 → 0.541, 200 → 0.842, 2000 → 1.001, against Noll's 1.0299. Gated as the convergence. Runs 32 screens, not N1's 128: the trend is identical at either count because the noise is common-mode across the sweep, so the extra screens buy nothing and cost 4× the runtime. A trend gate is the stronger choice here — the absolute coefficient swings 1.02–1.23 between seed sets, and that noise is common-mode across anL₀sweep on the same seeds, so it cancels in the trend while dominating any level.
A (D/r₀)^(5/3) exponent gate was specified and withdrawn, and the reason is
recorded because it is the M6a "D5" trap in new costume. Sweeping r₀ at fixed
screens is a tautology: phase_psd takes r₀ only through the multiplicative
0.4896·r₀^(−5/3), so identical draws scale the screen as r₀^(−5/6) and the
variance as r₀^(−5/3) by construction. Measured that way the exponent came back
1.66667 for both modes — five decimals that establish nothing but correct
multiplication. Sweeping the aperture is a real geometric change but is
Monte-Carlo limited (deviation from 5/3 up to 0.09 at 24 screens, 0.05 at 96,
0.007 at 256), and a coefficient constant across apertures is a 5/3 exponent,
so N1 is the better-conditioned form of the same claim.
Reference: R. J. Noll, Zernike polynomials and atmospheric turbulence, J. Opt. Soc. Am. 66, 207 (1976).
cases::run_ignition. Per realization: propagate a launch beam through a
TurbulentPath, take the pupil integral at the receiver, turn it into W/m²
through IntensityScale (the T4 helper's third consumer), and hand that one
number to AirBreakdown. Reductions over the ensemble give the ignition
probability, the focal-intensity ratio distribution, and the focal-spot wander.
seeded_ensemble supplies the parallelism; realizations derive all randomness
from their index and come back in index order, so every reduction is bitwise
thread-count independent (E2).
The position of P_ig on the Cn² axis is not a claim about the world. It
carries AirBreakdown's absolute threshold, which is M6a's explicitly ungated
quantity, and must be labelled so wherever it is plotted. Everything upstream of
that one boolean is independent of it and is gated.
- E1 (
ignition_ensemble_converges) — the spec asked forP_igwithin ±0.02 on a realization doubling; that is not achievable and the gate says so.P_igis a Bernoulli mean whose binomial standard error is 0.030 at n = 256 and 0.022 at n = 512, so ±0.02 at any affordablenwould gate the draw. Gated instead: the continuous reductions converge (wander_rmsunder 5 % on doubling, measured 1.15 → 1.11 ×10⁻⁴ m over n = 32 → 512) andP_igmoves within two binomial standard errors (measured 1.8σ, 0.0σ, 0.6σ, 0.7σ), plus a non-vacuity check thatP_igis not saturated. - W1 (
wander_follows_the_square_root_of_cn2) — PHYSICS. RMS wander∝ Cn²^(1/2); measured 0.4953 / 0.4977 / 0.4987 over two decades and three seeds, gated at ±0.02. Parameter-free: path length, aperture, outer scale and beam all enter as coefficients, and none can produce a 1/2. - W2 — retired, not gated. An aperture-dependence gate was landed and then
withdrawn as seed-dependent. The observation stands: the textbook
σ_α² ∝ D^(−1/3)impliesD^(−1/6)= −0.167 for the RMS and the default geometry does not show it (−0.003), because the tilt estimator is intensity-weighted and a 5 cm beam in a 15–40 cm pupil is weighted by its own footprint while the closed form assumes uniform illumination. The measurement cannot carry a gate: it fits a slope across four nested apertures on shared screens, and across three seeds the overfilled exponent runs −0.183/−0.249/+0.004 at 16 realizations and −0.102/−0.318/−0.143 at 32, a spread that does not shrink with ensemble size. The gate passed only at the seed it pinned. Documented observation, not a validated claim.
The ignition CLI case (cases::run_ignition_sweep, rendered by
scripts/render_ignition.py) sweeps Cn² and reports the ignition probability
with its binomial error bars, the focal-intensity distribution behind it,
and the wander law. The figure carries the shape/position caveat inside the
panel rather than in a caption.
It also reports the transition width — the span from P_ig = 0.9 to 0.1,
measured 1.42 decades, and roughly invariant (1.49 at 2× drive, 1.39 at
0.5×, 1.44 at a 1.33× larger pupil) while a 4× drive change slides the curve
0.6 decades sideways. Deliberately not gated: no closed form for the width
has been derived, so gating it would check the measured number against itself —
the same trap that retired the (D/r₀)^(5/3) exponent gate above.
Reference: L. C. Andrews, R. L. Phillips, Laser Beam Propagation through Random Media, 2nd ed., SPIE Press (2005) — angle of arrival and beam wander.
∂U/∂t + ∂F(U)/∂x = Ṡ
U = (ρ, ρu, E)ᵀ, F = (ρu, ρu² + p, (E + p)u)ᵀ, E = p/(γ−1) + ½ρu²
Site: src/euler1d.rs. Ideal gas at constant γ (the verification EOS of the
two docs/M6C_SPEC.md pins; the plasma-range table EOS attaches later without
touching the flux routines). HLLC approximate Riemann solver with
Einfeldt/Davis wave speeds, MUSCL-Hancock reconstruction under a minmod
limiter, CFL ≤ 0.8 recomputed per step from the current wave speeds, and a
positivity guard that bails with the cell and step rather than clamping.
No laser physics is in this module, deliberately (spec gate decision 4).
Ṡ is exposed only as step_with_source, the seam the LSD driver attaches to;
deposition, ignition, and the plasma column live one layer up. That is what
keeps the two gates below independent of the model that will use them.
Gate G0 guards the T4 extraction that this milestone required
(tests/blooming.rs): G0a reproduces the pre-extraction δn arithmetic
from scratch and demands bit-for-bit equality with ThermalBlooming's output —
a tolerance would not see a reassociation — and G0b pins the size and hash
of data/air_properties.npy, since M4's numbers are calibrated to that table
and M6c's plasma properties belong in a separate file (D8). G0a deliberately
avoids FFTs so it stays deterministic on every platform the M5 wheels target;
a whole-run field fingerprint would look stronger and be flakier, as FFT
results are not bit-portable across libraries.
The G1/G2 gates are verification — "the code solves the equations written
down" — not validation. Nothing here is yet a claim about the world; the physics
gate for M6c is the parameter-free D ∝ S^(1/3), ρ₀^(−1/3) scaling (G4),
which arrives with the deposition layer.
- G1 — Sod shock tube vs the exact Riemann solution
(
sod_shock_tube_matches_exact_riemann_solution). Exact solution from the Newton-iterated star-state solver insrc/validate.rs(RiemannProblem, which shares only the plain(ρ, u, p)struct with the solver under test). Measured L1(ρ) = 6.55e-3 at n = 100 falling to 6.55e-4 at n = 1600, observed rate 0.79–0.88. First order is the ceiling on a solution containing a shock and a contact; ~0.8 is the textbook minmod value. - G2 — observed order on smooth flow
(
euler_muscl_hancock_is_second_order_on_smooth_flow). Isentropic advection ofρ = 1 + 0.2·sin(2πx)at uniformu,pover one period. L1(ρ) falls 7.50e-4 → 3.78e-6 over n = 128 → 2048, observed order rising monotonically 1.86 → 1.94. It approaches 2 from below because minmod clips the two smooth extrema, degrading the scheme to 1st order in a shrinking region — so the gate is on the finest pair (> 1.85) plus the monotone climb, not on hitting 2 exactly.
Equilibrium air from 200 K to 30,000 K and 10⁴–10⁸ Pa, tabulated offline by
scripts/make_plasma_table.py from Mutation++ (air_11 mixture, RRHO thermo
database, equilibrium state model) into data/plasma_properties.npy, and read
through src/plasmaprops.rs. Shape (4, 597, 33), property axis
[ln ρ, e, γ_eff, ln n_e], on a grid uniform in T and uniform in log₁₀ p,
bilinearly interpolated. The pressure ceiling is set by the CJ state behind an
LSD front (~1.5×10⁷ Pa) and the temperature ceiling by its post-front
temperature. No runtime FFI, no LGPL in the build or the M5 wheels — the
airprops.rs discipline. data/air_properties.npy (M4) is a separate file and
is untouched (G0b).
ρ and n_e are stored as logarithms: both cross dozens of decades
through the ionization onset, where interpolating raw values fails badly.
e changes sign near 800 K so no log is available, and neither it nor γ_eff
needs one.
Two quantities are deliberately absent. n_i is not stored — every ion in
the mixture is singly charged, so quasi-neutrality makes it identical to n_e
(verified to 6.2×10⁻¹¹ wherever n_e matters); it is returned as n_e.
Z̄ is not stored and is not a prediction: it is identically 1 and cannot
be otherwise, because the RRHO database ships no doubly ionized N or O (He⁺⁺ is
the only ++ species in it).
Limitation — no second ionization. Real equilibrium air begins to doubly
ionize above ~20,000–25,000 K; air_11 structurally cannot. Toward the top of
the range the table therefore understates n_e, and so understates the
inverse-bremsstrahlung absorption α_IB ∝ n_e·n_i·Z̄² the LSD front runs on.
The range is still built to 30,000 K because the CJ state needs it, but above
SECOND_IONIZATION_K = 20,000 K the table is a singly-ionized approximation,
flagged by PlasmaTable::is_singly_ionized_approximation.
Per D8, Mutation++ is trusted for the physics and the gate is on the tabulation:
- G6 (
plasma_table_matches_direct_mutationpp_off_grid) interpolates the frozen table to 99 points deliberately off its grid — 75 of them in the 6,000–18,000 K ionization onset, where bilinear interpolation is worst — and compares against direct Mutation++ evaluations frozen intotests/data/plasma_reference_samples.csvat generation time (thett2012_*.csvprecedent, since the solver cannot call Mutation++). Measured max relative error: ρ 4.10e-4, e 8.61e-4, γ_eff 1.68e-4, n_e 1.48e-3. - The generator runs its own harsher cell-midpoint sweep over 17,683 points
before it will write anything (ρ 4.53e-4, e 1.05e-3, γ_eff 2.40e-4,
n_e 3.61e-3), plus a quasi-neutrality gate and a cold-limit check that
γ_eff(300 K, 1 atm)= 1.39883 — the one point whose answer is known without Mutation++. - Neither gate makes an accuracy claim below
NE_ACCURACY_FLOOR= 10¹⁵ m⁻³. Thereln n_eis nearly linear in1/Trather thanT, so the uniform-Tgrid interpolates it poorly — but the values are ~10³ m⁻³ against ~10²³ in an LSD plasma, and gating that error would be theatre.
The beam ignites a plasma and the resulting absorption wave runs back up the
beam toward the laser as a detonation. src/lsd.rs, driven by
LsdColumn::advance.
The column's x axis is the beam axis: the laser sits beyond x_min, so the
beam travels in +x and the front travels in −x. Everything upstream of the
front is cold transparent air, which is why the front sees the full incident
intensity S. Beam attenuation is Beer–Lambert in the direction of travel,
dI/dx = −α_pl·I, and the source term in the energy equation is the absorbed
power density:
∂U/∂t + ∂F(U)/∂x = (0, 0, q)ᵀ, I_{k+1} = I_k·exp(−α_k·dx),
q_k = (I_k − I_{k+1})/dx
The deposition is discretised conservatively — each cell takes exactly what
it removes from the beam, so Σ q·dx ≡ I_in − I_out with no quadrature error.
Hydro and source are coupled by Strang splitting
(source(dt/2) → hydro(dt) → recompute α, I → source(dt/2)), matching the
propagator's own splitting discipline and for the same reason. The step is sized
from the post-deposition wave speeds: the leading half-step raises p and so
c before the flux update sees it, and sizing from the pre-deposition state
overshoots the CFL bound.
Two absorption closures:
Absorption::GreyThreshold— verification. A fixedαwherever the specific internal energy exceeds a threshold, zero below. Nothing that can drift between refinements. Keying on internal energy rather than temperature keeps it well defined under the constant-γEOS, which has no gas constant.Absorption::InverseBremsstrahlung— production. Thermal free-free absorption,α_IB = C·Z̄² n_e n_i T^(−1/2) ν^(−3) (1 − e^(−hν/kT))·ḡ, withn_efrom the plasma table above (n_i = n_e,Z̄ ≡ 1, both structural).C = 3.7×10⁻²in SI, converted from the CGS3.7×10⁸of Rybicki & Lightman Eq. 5.18b. The Gaunt factorḡis a dimensionless multiplier of order unity, set to 1: a proper Gaunt table is out of scope, and it need not be in scope, becauseḡenters as a coefficient and no coefficient can shift the1/3exponent the physics gate measures. One honest inconsistency: the hydro carries a constant-γideal gas while the ionization comes from the equilibrium table, soTis the table's inversion of the hydro's(ρ, p)rather than a self-consistent EOS.
Per D7 the plasma couples to the beam through absorption only. PlasmaColumn
is the read-only Medium the propagator sees: extinction(z_slab) from the
hydro state, and δn ≡ 0 — no Drude index, which is what keeps M6c clear of the
near-critical failure a Drude plasma column would hit in a paraxial envelope.
In the M4 Péclet spirit, check_regime refuses rather than mis-models: the
absorption length must be resolved by ≥ 4 cells and be under a quarter of the
domain (thicker is the LSC regime, out of scope), ≥ 90 % of the beam must reach
the front, and the front must be a strong detonation (p₁ ≥ 10·p₀).
"Reaching the front" is measured at the leading edge of the strongly
absorbing region (first cell with α ≥ ½·α_max), not at the pressure
half-maximum that front_position reports. The two genuinely differ — in a
detonation the reaction zone leads the pressure peak — and using the pressure
front here would score normal front structure as upstream extinction. Under the
grey model this check is ~1 by construction, since cold gas is exactly
transparent; it earns its keep under inverse bremsstrahlung, where a long
weakly ionized precursor really can eat the beam before it arrives.
SECOND_IONIZATION_K is enforced, not just documented. The CJ state behind
a strong LSD front sits at 1.5–2.5×10⁴ K and so legitimately crosses the table's
singly-ionized ceiling. IonizationCeiling::Refuse (the default) bails naming
the temperature; ::Flag proceeds and records it on the run
(used_singly_ionized_approximation). Extending the table is not currently
possible from shipped data — no Mutation++ thermodynamic database contains
doubly ionized N or O — so the bias is converted into an explicit boundary
instead of being carried silently.
Gates (tests/validation.rs):
-
G3 (
lsd_front_speed_matches_the_raizer_closed_form) — VERIFICATION, not validation. AtS = 10¹¹ W/m²,ρ₀ = 1.225 kg/m³,γ = 1.4, and an absorption length1/α = 50 µm, the measured front speed is 5402 m/s against Raizer'sD = [2(γ²−1)S/ρ₀]^(1/3)= 5392 m/s,+0.19 %; gated below 1 %. Refiningdxfrom 10 µm to 5 µm moves it by 5×10⁻⁵, so the answer is grid-converged and the residual is physical, not numerical. Both boundaries are asserted undisturbed alongsidecheck_regime: once the wave runs off the laser-side end,front_positiondegrades to the first cell centre and would report a plausible speed for a front that no longer exists. G3b carries the same assertion.The label matters. Raizer's expression is not an independent check on this model — it is the Chapman–Jouguet construction the deposition model is built from, with the chemical heat release replaced by
q = S/(ρ₀D). Reproducing it establishes that HLLC, the Strang-split source, and the EOS together solve a nontrivial self-similar problem correctly. It establishes nothing about whether that problem describes the world.raizer_lsd_velocitytherefore lives insrc/lsd.rsbeside the model and not insrc/validate.rsamong the independent reference solutions — filing it there would quietly assert otherwise, which is precisely the M6a "D5" trap. -
G3b (
lsd_front_speed_converges_as_the_absorption_layer_thins) — the refinement that actually bites. Over1/α = 400 → 200 → 100 → 50 µmatdx = 10 µmthe residual runs −8.26 % → −2.66 % → −0.43 % → +0.19 %, monotone, each halving taking at least 2.3× off the error.The residual is a relaxation transient, not a permanent thick-layer deficit: held at
1/α = 400 µmand given longer to settle (0.15 → 0.30 → 0.50 of the domain) it runs−8.3 % → −3.7 % → −1.5 %and does not plateau. A thicker deposition zone relaxes onto the self-sustaining speed more slowly, so at a fixed settle it sits further from it; given long enough they all reach the same CJ speed. That is the textbook result — a CJ velocity depends on total heat release, not reaction-zone length — and it is worth stating because an earlier version of this entry claimed a steady-state deficit instead, which contradicted the theory the gate checks against. -
G3c (
lsd_front_speed_is_seed_independent) — the answer must not depend on how the wave was lit. A seeded detonation starts overdriven and relaxes onto the CJ speed slowly, and G3's 1 % tolerance is the same order as that transient, so the seed is a free parameter sitting directly under the headline number unless it is checked. Between a 1× and a 2× CJ-pressure seed the results differ by5.3e-3at a 1.0 µs settle,2.7e-3at 1.4 µs and1.1e-3at the 1.8 µs used, both converging on≈ +0.2 %. Gated below2e-3, with both boundaries asserted undisturbed. -
G2b (
lsd_source_coupling_is_second_order) — the hydro↔source coupling is 2nd order, the M6c counterpart of M1'ssplit_step_is_second_orderand M4'scoupling_is_second_order. Refiningdxanddttogether at fixed CFL (the limit the claim is stated in; MUSCL-Hancock degenerates to forward Euler in time ifdt→0at fixeddx), the Strang cadence gives observed order 1.99 / 2.03 / 1.99. The gate also runs a deliberate 1st-order contrast — folding the source into the update gives 0.88 / 1.02 / 1.07 — so it demonstrably resolves the difference rather than passing vacuously.This is why
Euler1d::step_with_sourcecarries a warning: used on its own it is that 1st-order contrast. Nothing about its output looks wrong; it simply converges half as fast. The driver's four-call Strang sandwich is the supported path. -
G5 (
lsd_energy_budget_closes) — absorbed laser energy versus the domain's energy gain. Measured relative residual 2.1×10⁻¹⁶ to 4.6×10⁻¹⁵, five orders inside the 10⁻¹⁰ the spec asks. Exact rather than approximate for two reasons: the conservative deposition above, and a boundary flux that is verified zero rather than estimated — with transmissive ends and undisturbed ambient gas at both,(E + p)uvanishes identically, andboundaries_undisturbedasserts that premise rather than assuming it. -
G4 (
lsd_velocity_follows_the_parameter_free_one_third_scaling) — THE PHYSICS GATE.D ∝ S^(1/3)over 1.52 decades of absorbed intensity andD ∝ ρ₀^(−1/3)over 1.50 decades of ambient density, exponents gated inside±0.01. Measured atγ = 1.4: +0.33190 and −0.33020.Everything above this line is verification — it establishes that the code solves the equations it was given, and G3 in particular is checked against a closed form the model is derived from. This gate is different in kind. Every quantity uncertain about the level of
D—γ_eff, the absorbed fraction, radial relief, radiation losses, the Gaunt factor — enters as a coefficient, and no coefficient can produce a1/3exponent. The exponent is what the model predicts independently of the coefficient soup, and it is what measured LSD velocities are reported to follow.The EOS-independence leg is done by moving
γ, since the table EOS is not wired into the hydro.2(γ²−1)runs 0.88 → 3.56 fromγ = 1.2to5/3, shifting the level ofDby 1.59×, while the fitted exponents move by 0.001 and 0.002:γ 2(γ²−1) D at S = 10¹¹ S exponent ρ₀ exponent 1.2 0.88 4169 m/s +0.33127 −0.32895 1.3 1.38 4842 m/s +0.33176 −0.32977 1.4 1.92 5400 m/s +0.33190 −0.33020 5/3 3.56 6632 m/s +0.33213 −0.33096 This is not a demonstration that a real equilibrium EOS leaves the exponent alone — a
γ_effvarying with local state is not a different constantγ— and the gate does not claim it is.The density sweep holds ambient temperature fixed (
p₀ ∝ ρ₀), not pressure: at fixedp₀a decade ofρ₀moves the ambient internal energy by a decade, and at the thin end the undisturbed gas would cross the ignition threshold and the whole column would absorb. The threshold itself is 5× ambiente₀, not G3's fixed 2 MJ/kg — at the sweep corner (γ = 1.2,ρ₀ = 12.25) the post-shock state is only 11× ambient, so a 10× threshold there starts controlling the front rather than enabling it and drives the fitted exponent to −0.459. That the exponents agree to 1e-3 between 3× and 5× thresholds is the evidence the threshold is out of the loop. -
lsd_velocity_level_tracks_the_eos_coefficient— the counterpart to G4, pinning what the level is worth. Movingγ1.4 → 1.2 must scaleDby(0.88/1.92)^(1/3) = 0.772; measured 0.7722. The solver tracks the coefficient exactly where the coefficient is knowable, which is the sharpest statement of why agreement on the level would not be evidence about the physics. -
G8 (
plasma_column_absorbs_as_beer_lambert) — the D7 coupling itself, end to end. A real beam marched through aPlasmaColumnbuilt from G3's settled hydro state, againstexp(−τ),τ = Σ α_k·dx. The M2 twin (beer_lambert_matches_closed_form) does this for a constant absorber; this is its M6c counterpart with the absorber coming from gas dynamics. Added at step 6: until then D7's claim was carried byPlasmaColumn's unit tests, which exercise itsMediummethods in isolation, and no field had ever been marched through one.δn ≡ 0is asserted at every slab rather than assumed — a Drude index appearing there is the near-critical failure D7 avoids.Measured at
τ = 339: 1.7e-13 at 500 slabs, 8.4e-14 at 100, across 500 successive amplitude multiplications against a single exponential. Two slab resolutions becausePlasmaColumn::from_column_resampled— meanαover each bin, soα_slab·dz = Σ α_k·dxexactly — is what makes marching a 2500-cell hydro state through an FFT propagator affordable.
Not yet gated: G7, absolute velocity against measurement. It is expected to
land high, and as of M6d the reason is no longer that a planar solver has no
radial relief — relief is modelled and pinned at δ = 0.230 of the front
speed, which covers part but not all of the ~2× gap. G7 stays ungated for one
reason only: no measured dataset has been anchored. The remaining candidates for
the rest of the gap are radiation losses, incomplete absorption, the production
EOS, and the un-refracted beam. See docs/M6C_SPEC.md § G7 and
docs/M6D_SPEC.md.
beamprop lsd (src/cases.rs::run_lsd, written by src/main.rs, rendered by
scripts/render_lsd.py) is the case that puts M6a and M6c in the same run: a
spark is lit at M6a's breakdown threshold and the absorption wave it launches is
tracked back up the beam. The igniting pulse's peak intensity comes from its
power and focal radius through IntensityScale — the T4 extraction's second
consumer, and the reason it was extracted.
Its headline is a result, not a demonstration. The case takes a short igniting pulse and a separate long sustaining drive, and the two models together say the second could never have produced the first:
- M6a's threshold in air at 1 atm converges to an intensity floor of ≈6.75×10¹⁵ W/m², not a fluence criterion: 8.815×10¹⁵ at 6 ns falling to 6.745×10¹⁵ by 1 ms, and flat to 1 % over the last two decades of pulse length. The fall is bounded at 1.31× — the distribution-resolved closure has no hard cutoff, so a longer pulse buys something, and then stops. Widening the focus buys about as little: 6 % over a 500× range of spot radius, saturating.
- The sustaining LSD drive is ~10¹¹ W/m² — five orders of magnitude below.
So the detonation must be initiated by something far brighter than what
sustains it, which is the known experimental situation: LSD waves in clean air
are started on a target, on an aerosol, or by a separate spike. Pinned by
the_sustaining_drive_is_far_below_the_breakdown_threshold, so a future change
to either model that closes the gap fails rather than quietly invalidating the
write-up.
What each half is worth. When and where the spark lights inherits M6a's
explicitly ungated absolute level (3.90–4.69× above the measured T&T curve). The
front speed does not: it depends on the absorbed intensity at the front and on
ρ₀, not on where the spark was lit — which is why G3/G3b/G3c and the G4
physics gate all use seeded ignition and never touch AirBreakdown. The gap
above is likewise untouched by that uncertainty: 10⁵ against ~7×. Default run:
D = 5401 m/s against Raizer's 5391 (+0.19 %), energy budget closing to 1.3e-16,
final column optical depth 374.
Why the grey closure drives it. GreyThreshold is what G3–G5 gate and it
introduces nothing that can drift. The run evaluates the production
inverse-bremsstrahlung closure at its own measured post-front state rather than
asserting a reason for not using it, and the answer is informative: α ≈ 6.8 1/m
at 1064 nm, making the whole 2.5 cm column 0.17 optical depths — nearly
transparent to the beam driving it, with no front, and check_regime would
correctly refuse it as volumetric — against α ≈ 1.1×10³ 1/m at 10.6 µm, an
absorption length of 0.92 mm that is 92 cells on the demo grid and 3.7 % of the
domain. Free-free absorption falls steeply toward short wavelengths, so this is
the model reproducing why LSD experiments are done with CO₂ lasers. What
blocks running that closure coupled is cost, and specifically the table
inversion: PlasmaTable::temperature bisects ~45 times per cell per deposition
call, three deposition calls per step. A faster inversion, not a finer grid, and
a separate change with its own gate.
References:
- E. F. Toro, Riemann Solvers and Numerical Methods for Fluid Dynamics, 3rd ed., Springer (2009) — HLLC (§10.4–10.6), MUSCL-Hancock (§14.4), and the exact Riemann solver and Test 1 tabulation (§4.3, §6.4) the gates use.
- Yu. P. Raizer, Laser-Induced Discharge Phenomena, Consultants Bureau (1977) — LSD wave theory, the detonation analogy, and the velocity closed form.
- G. B. Rybicki, A. P. Lightman, Radiative Processes in Astrophysics, Wiley (1979), Eq. 5.18b — the thermal free-free absorption coefficient.
- G. Strang, SIAM J. Numer. Anal. 5, 506 (1968) — the operator splitting.
- J. B. Scoggins et al., Mutation++: multicomponent thermodynamic and transport properties for ionized gases, SoftwareX 12, 100575 (2020) — the equilibrium thermochemistry behind the plasma table.
- B. Einfeldt, On Godunov-type methods for gas dynamics, SIAM J. Numer. Anal. 25, 294 (1988) — the wave-speed estimates.
- G. A. Sod, A survey of several finite difference methods…, J. Comput. Phys. 27, 1 (1978) — the shock-tube problem.
Full model, the remaining gates (G3–G7), and which of them are verification
versus validation: docs/M6C_SPEC.md.
The solver writes data only (.npy arrays + _meta.json/_notes.md
sidecars; collection helpers in src/viz.rs). All images come from
scripts/render.py (matplotlib): the perceptually-uniform magma colormap
applied to t = (I/I_max)^γ with γ = 0.5 to lift the dim wings; I_max is
the global peak (across all frames of a GIF), so brightness differences
between frames are physical. Colorbars are labeled in I/I_max, axes in
metres.
Reference: S. van der Walt, N. Smith, matplotlib colormaps (magma), https://bids.github.io/colormap/.
∂U/∂t + (1/r)·∂(r·F_r)/∂r + ∂F_x/∂x = Ṡ_geom + Ṡ_laser
U = (ρ, ρu_r, ρu_x, E)ᵀ
F_r = (ρu_r, ρu_r² + p, ρu_r u_x, (E + p)u_r)ᵀ
F_x = (ρu_x, ρu_r u_x, ρu_x² + p, (E + p)u_x)ᵀ
Ṡ_geom = (0, p/r, 0, 0)ᵀ
Site: src/euler2d.rs. HLLC + MUSCL-Hancock with minmod, Strang-split
dimensionally as R(dt/2) → X(dt) → R(dt/2), CFL asserted per step in both
directions, positivity guard that bails with the cell and stage rather than
clamping. No laser physics is in this module, deliberately — M6c gate
decision 4, carried forward.
Two implementation facts carry the milestone and both are recorded in the code:
- The
1/rnever appears. Cells are annuli, interfaces carry areaA ∝ r, and the axis interface has zero area, so nothing crossesr = 0by construction.(A_+ − A_−)/Vis1/r_janalytically, finite in the innermost ring without a floor. - The geometric source is written as the same floating-point expression as the pressure part of the flux difference, so a radially uniform state is a bit-exact fixed point. That is what lets G9, G13(i) and G14 assert equality rather than a tolerance.
The 1-D Riemann solver is reused, not reimplemented: a sweep packs
(ρ, ρu_∥, E − ½ρv_t²) into euler1d's Conserved, calls its hllc_flux, and
recovers the transverse flux as F_ρ·v_t with the upwind side read off
sign(F_ρ). Both identities are exact.
- G9 — the planar limit reproduces
Euler1dbit for bit (euler2d_planar_limit_reproduces_euler1d_bit_for_bit). Not a tolerance: the same floating-point operations. Two non-vacuity legs. - G10 — Sedov–Taylor (
sedov_blast_matches_the_self_similar_solution). Exponent 0.38628 vs the exact 2/5; level and peak compression both gated as trends under refinement, because a spherical blast's density spike is one or two cells wide at any affordable resolution. - G11 — 2nd order on smooth axisymmetric flow (1.861 / 1.964 against a split-source contrast at 1.030 / 1.155). This gate found a real defect: the Hancock predictor originally built the geometric source from the reconstructed face pressures, which is well-balanced and wrong — the pressure terms then cancel identically against the flux difference and the gradient disappears from the predictor. It cost an order.
- G12 — conservation in the
r dr dxmeasure, with radial momentum deliberately not conserved, and an escape-flux leg that closes the budget when relief reaches the wall. - G13 — the axis is not a wall, against a deliberate even-parity contrast.
Site: src/validate.rs (SedovBlast). The self-similar ODEs are integrated
inward from the strong-shock Rankine–Hugoniot state and ξ₀ follows from the
energy integral, so nothing external is quoted: the published ≈1.033 for
γ = 1.4 is an independent cross-check that the derived 1.03278 passes to
0.03 %. Its own unit tests include putting the profile back into the Euler PDEs,
where the residual is 6.9e-5 and falls as the finite-difference step squared —
the check that verifies the hand derivation rather than the arithmetic.
Site: src/lsd2d.rs. M6c's LsdColumn with a beam of finite radius: one
independent Beer–Lambert march per ring, no refraction, no diffraction.
Absorption, IonizationCeiling and raizer_lsd_velocity are reused
unchanged — the closures depend on (ρ, p) alone.
The transverse instability, found rather than sought. A radially uniform
run diverges exponentially from the 1-D column, out of round-off, reaching 3 %
by M6c's settle. Three measurements identify it: it is bit-identical in planar
and axisymmetric geometry (so not the geometric source), amplitude-proportional
(a 10⁶× larger seed gives a 10⁶× larger early response), and it saturates at
|u_r| ≈ 200–400 m/s. That is a linear instability going nonlinear — the
mechanism behind the cellular structure real detonations have. It is pinned, not
validated: no measurement has been compared to.
The relief deficit (G15, pinned). Because the instability is present at
every beam radius including infinite, the deficit is measured against the
wide-beam 2-D run, not the 1-D column — otherwise the instability would be
reported as relief. Measured δ = 1 − D/D_wide = 0.305 at R_b·α = 1.6 and
0.230 at 3.2, monotone in R_b, with the wide-beam limit itself within 1 % of
Raizer. The pinned claim is a band of ±13 %, and that width is measured
rather than chosen: grid (+6 % on halving Δx), seed (−7 % at a 1× rather than
2× CJ-pressure seed), and ignition threshold (±8 % over a 4× sweep). Pinning a
third digit would assert a precision three separate knobs say is not there.
A failure radius is predicted and was not reached: check_regime requires
eight cells across R_b, so the smallest beam affordable at this Δr still
carries a healthy wave. Recorded as an open item rather than asserted.
- G16 — the one-third scaling survives relief
(
the_one_third_scaling_survives_radial_relief):S^0.34666against the parameter-free 1/3 while the level moves 23 %. M6c's G4 argues that relief can only enter as a coefficient; this measures it.
cargo run --release -- lsd2d seeds a wave, drives it with a 160 µm top-hat
beam at R_b·α = 3.2, and reports the deficit against a matching wide-beam run.
Writes _fields.npy [frame, quantity, ring, cell], a front-track CSV carrying
both the axis and the beam edge, _meta.json and _notes.md; images come from
scripts/render_lsd2d.py. No M6a ignition stage, deliberately — the lsd case
owns that story, and seeding keeps this one from re-inheriting M6a's ungated
absolute threshold.