Skip to content

Field-scaled closure rate for the asymmetric-Hermite top-mode instability - #66

Open
rogeriojorge wants to merge 2 commits into
adaptive/p5-hypercollisionfrom
highk/field-closure
Open

rogeriojorge wants to merge 2 commits into
adaptive/p5-hypercollisionfrom
highk/field-closure

Conversation

@rogeriojorge

@rogeriojorge rogeriojorge commented Oct 5, 2026 •

Copy link
Copy Markdown
Member

Stacked on #60 (adaptive/p5-hypercollision, d3379cc). Lands on main after the foundation PRs and #56–#60.

What

field_scaled_closure_rate(F, alpha_s, qs, Omega_cs, Nn, Nm, Np, Ns, c) returns a per-species rate
nu_s = c |q/m|_s max_i sqrt(2 N_i) max_x |E_i - <E_i>| / a_{s,i} shaped (Ns,1,1,1,1,1,1), so it can be passed as
nu to Hermite_Fourier_system (whose Col = -nu * col * Ck already broadcasts) together with
hypercollision_spectrum(order>=2). The docstring of nu now states it may be per species. No default changes:
nothing calls it unless the user does. 2 files, +93/-3 (_model.py +42/-3, new tests/test_field_closure.py).

Why (defect it addresses)

The truncated asymmetric-Hermite (AW) Fourier–Hermite operator -v d/dx + (q/m) E d/dv is not anti-self-adjoint.
In a non-uniform field it has spurious growing modes in the top third of the Hermite ladder at the largest kept |k|:

  • frozen field E1 cos(k1 x), a = sqrt(2) v_te, Nn = 64: max Re(lambda) = 0.26 (|k| <= 2), 0.42 (|k| <= 5), 0.58 (|k| <= 10)
    at E1 = 4e-3; the symmetric (SW) basis gives 1e-15;
  • oscillating field (omega = 1): Floquet exponent 0.044 (|k| <= 2) and 0.146 (|k| <= 5) at E1 = 0.02, zero below
    E1 ~ 8e-3; SW zero throughout.

The rate grows with the Fourier cut-off and with Nn, which is why, in the pump-frame strong-drive H05 runs,
x-refinement failed earlier (Nx 16 at t = 476 vs Nx 8 at 632) and Nn-refinement did not help. Aliasing
(padded-convolution check: 1e-16), step size (fixed dt 0.01: same failure time) and segment remaps (disabled:
same failure) were ruled out. A fixed nu is overtaken because the self-consistent field grows secularly; a rate
that follows max|E| is not.

Evidence (Dark-SPECTRAX branch highk, studies/highk_*.py, macOS, py3.12, JAX 0.11.2, CPU x64)

H05 pump frame, v_q/v_te = 0.1, c = 1, order-2 spectrum:

  • Nx 16: reaches t = 700 (baseline failed at 476); c = 0.5 and 2 and Nn 128 agree with it to t = 700 (10% rule) on
    electron dK and W_ext; no negative kinetic energy or k=0 temperature; mobile-ion grid agreement on dK_e to 691.5
    and W_ext to 700. Before 550 the closure run equals the unregularized run to 5 digits.
  • v_q/v_te = 0.03, Nx 16: reaches t = 1000; c halved/doubled agree to 1000; Nn 128 agrees to 980.5 (dK_e).
  • Nx 32 (with the noise floor of Dark-SPECTRAX main): agrees with Nx 16 on dK_e and W_ext to 680 (v_q 0.1) and
    952 (0.03), then loses positivity at 672 / 942. That late loss is a physical broadband finite-k instability of the
    quivering plasma (growth rising with k up to k lambda_D ~ 0.1; exact Volterra, linear Hermite and the grid agree on
    it), which the closure correctly does not suppress; the grid at Nx 32 blows up at the same time.
    The study wrapper used there equals this helper used as nu to 4e-16 relative.

Tests

tests/test_field_closure.py: c = 0 gives exactly zero; analytic value (uniform field excluded, axes with N <= 3
inactive); per-species nu in the RHS gives exactly -nu_s col C and zero rate of n, M_i, M_ii; jit.
Local: python -m pytest -q -n 2 tests -> 187 passed (tested SHA d0f371f). GitHub CI does not run on stacked PRs.

Open questions

  • c = 1 is a choice; the H05 results are insensitive to c in [0.5, 2]. It is a regularization: report it.
  • An L2-stable alternative is the symmetric (SW) basis, which trades exact momentum/energy conservation.

…lity

field_scaled_closure_rate returns nu_s = c |q/m|_s max_i sqrt(2 N_i) max_x|E_i - <E_i>| / a_{s,i},
shaped (Ns,1,1,1,1,1,1) so it can be passed as nu to Hermite_Fourier_system with an order >= 2
hypercollision spectrum (density, momentum and energy rows untouched). c = 0 is exactly zero.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant