IMRPhenomHM N61 six-mode QNM off-grid gate
Specification ID: hm.qnm.n61.offgrid-six-mode/v1.
Scope and status
This gate checks the named n61_main runtime QNM polynomial artifact against
new Kerr eigenproblem solutions away from its hypothesized training grid.
The six fundamental gravitational modes are (2,2,0), (2,1,0), (3,3,0),
(3,2,0), (4,4,0), and (4,3,0). The checked spin set is exactly
a = {-0.71, 0.37, 0.79}. It is a selected interior interval, not a
full-domain or near-extremal claim. The associated
validation receipt
records the measured outcome.
Inputs, conventions, and options
The input a is oriented, dimensionless remnant Kerr spin. The independent
solver uses remnant mass M_f=1, spin weight s=-2, overtone n=0, and
exp(-i omega t): a physical root has Re(omega)>0, Im(omega)<0. The
runtime returns (M_f omega_R, M_f/tau), with positive angular damping.
For a binary, the public class converts both components to dimensionless
total-mass cyclic frequency with (M_total/M_f)/(2 pi); this gate tests that
conversion on supplied remnant states and does not qualify the remnant fit.
Mathematics and components
The London--Fauchon-Jones paper (2019), Eq. (19) defines
Its Eqs. (20) and (21) motivate the zero-damped and damped polynomial
families. The runtime n61_main variant has five complex coefficients for
(2,2), (3,3), (4,4), (4,3) and seven for (2,1), (3,2):
The fit uses the paper's positive-imaginary display convention; the
independent root uses negative imaginary damping. Therefore the complex
comparison is between omega_fit = omega_R - i/tau and the solver's root.
No LAL implementation or constants enter the reference.
Implementation mapping
The Cook--Zalutskiy Kerr eigenproblem (2014), Eqs. (23)--(56)
supplies the angular spectral problem and radial continued fraction.
scripts/generate_hm_qnm_n61_offgrid_reference.py
loads only src/torchwave/qnm/solver.py, with no fit-derived seed, runtime
coefficient import, QNM table, or waveform oracle. It continues the
fundamental branch from a large-ell Schwarzschild WKB seed and requires
strict solver convergence plus estimated frequency error below 1e-9.
The frozen root fixture
records each root, angular eigenvalue, radial residual, continued-fraction
depth/error, solver estimate, branch origin, and solver SHA-256. Regeneration
is an explicit maintenance action; ordinary frontend tests read the frozen
roots and fail on missing data or a changed solver hash.
The frozen roots are independent of the fit. The test compares them with
evaluate_n61_qnm in both
torchwave
and jaxwave,
then checks the IMRPhenomHM.mode_qnm_frequencies adapter with supplied
remnant states. No production coefficients are changed by this gate.
Evidence and limitations
The three spins are at least 1e-3 from every point of the declared
a=0.995 sin(theta), 61-point grid. That grid and its count are a project
sampling hypothesis, not identified historical author training data. For
each mode/spin, the project acceptance bound is
abs(omega_fit - omega_root)/abs(omega_root) <= 0.01 in complex frequency.
The paper reports sub-1% fractional error for its own printed models (Fig. 1
and text following Eq. (30)); applying this numerical bound to the separate
N61 refit is a declared project criterion, not a claim inherited from that
paper. Torch and JAX FP64 evaluations must agree within 1e-12 relative
complex error and the public total-mass conversion within 2e-12 relative
error after supplied remnant mass/spin injection.
The paper does not specify enough historical fit training data and fitting details to reproduce the authors' coefficients. The gate establishes bounded agreement of this clean-room N61 approximation with independent Kerr solutions and native frontend evaluation. It does not establish historical London coefficient identity, uncertainty relative to numerical relativity, near-extremal behavior, remnant-provider accuracy, amplitude/phase assembly, polarizations, or a whole-waveform qualification.
Reproduce the checks
On a CPU environment with NumPy, SciPy, Torch, JAX and pytest installed:
PYTHONPATH=src python scripts/generate_hm_qnm_n61_offgrid_reference.py --output /tmp/hm_qnm_n61_offgrid_roots.json
JAX_ENABLE_X64=1 JAX_PLATFORMS=cpu PYTHONPATH=src:tests pytest -q tests/test_imrphenomhm_qnm_n61_offgrid_math_reference.py --reference-device=cpu -ra
Compare the regenerated JSON with the committed fixture before accepting a solver or dependency update. The test command requires the committed fixture and does not silently regenerate it.