IMRPhenomT dominant inspiral time and sampling adapter
Scope and status
T-INSP-TIME-ADAPTER-v1 checks the aligned (2,2) carrier only, with the
frequency root between the author carrier's first collocation time and the
inspiral frequency join. It composes the already checked TaylorT3 PN terms,
six-node pseudo-PN solve, and pinned finite-grid fit inputs. The checked
outputs are seconds-to-mass-time conversion, time at frequency, inspiral
phase differences, reference-phase anchoring, and the public fixed time grid
and lower-frequency mask. It does not qualify amplitude, merger/ringdown,
higher modes, precession, physical calibration, or the full T-SAMPLING-v0
family contract.
Inputs, conventions, and options
Use ordered solar masses m1 >= m2 > 0, aligned spins in [-1,1],
M=m1+m2, eta=m1*m2/M², and delta=(m1-m2)/M. The source-backed grid is
(30,30,0,0), (35,25,0.7,-0.5), and (60,6,0.9,0.1) from the pinned
author-fit fixture; inversion targets are generated at carrier
theta=0.45,0.65,0.75, with reference-phase checks at 0.55,0.65,0.75.
All numerical checks run in CPU float64, including JAX x64. Times are seconds
relative to the (2,2) amplitude peak, and f is the (2,2) cyclic
frequency in Hz. The project adapter takes delta_t, duration, t_pad,
tc, f_lower, and optional f_ref; this gate uses finite positive values,
f_lower below Nyquist, and explicit duration.
Mathematics and components
Estellés et al., THM, Eqs. (8)–(11)
give theta=[eta(t0-t/M)/5]^(-1/8) and the orbital TaylorT3-plus-pseudo-PN
frequency. The native and pinned MIT author inspiral ansatz instead evaluates
the collocated carrier with theta=(-eta*u/5)^(-1/8), where
u=(t-tc)/(M*MSUN_SEC). Thus this gate uses the author carrier time
origin, u=-5/(eta*theta^8), after the first collocation time; it does not
silently identify the paper's t0 with this origin. The source-backed t0
still enters the first collocation target and the phase continuity offset.
The pinned MIT author
internals.py
also applies an explicit time-t0 shift when inverting frequencies before
its tEarly; that earlier branch is outside this gate and differs from the
native inversion. No LAL algorithm or constants are used.
With dimensionless (2,2) angular frequency Omega(theta) from
T-PN-T3-v1 and T-PN-FREQ-COLLOC-v0, solve the scalar equation
Omega(theta)=2*pi*f*M*MSUN_SEC on 0.33 < theta < 0.82 and return
t=-5*M*MSUN_SEC/(eta*theta^8). MSUN_SEC=G_SI*MSUN_SI/C_SI^3 uses the
project's CODATA/IAU constants. The scalar solver bisects in theta and does
not call a native time_at_frequency or duplicate its time-domain bracketing.
Estellés et al., T/TP, Eq. (19)
integrates the carrier frequency. Up to a constant, the independent phase is
Phi(theta)=Phi_T3(theta)+(10/eta)*sum_j[w_j*theta^(j+3)/(j+3)] for j=0..5.
Only phase differences are checked, so the author phase-continuity constant
and amplitude sign cancel. For face-on polarization, the unit complex strain
ratio at time t and reference-root time t_ref is
exp(i[Phi(t)-Phi(t_ref)]); a change from f_ref1 to f_ref2 at the same
sample rotates it by exp(-i[Phi(t_ref2)-Phi(t_ref1)]). These assertions
exercise the native f_ref subtraction and the 2*phic convention without
claiming that the paper prescribes the public reference-frequency API.
The diffGW interface grid has n=ceil(duration/delta_t) and
t_k=k*delta_t-[n*delta_t-t_pad] when centered, or t_k=k*delta_t otherwise.
It resolves omitted or zero f_ref to f_lower, evaluates the unmasked
waveform, then sets both polarizations to exactly zero where
t_k < tc+t(f_lower). These grid, mask, and f_ref=0 rules are project
adapter contracts, not equations claimed from the paper or author code.
Implementation mapping
| Layer | Entry points |
|---|---|
| Scalar | diffgw_reference/phenomt_inspiral_time_adapter.py; independent mpmath theta root and phase, pure-Python grid/mask |
| Torch | IMRPhenomT.frequency, time_at_frequency, time_domain; _phenomt_td.generate_td |
| JAX | same public names and adapter in jaxwave |
| Frozen inputs | tests/data/phenomt_author_inspiral_fits_4121.json, independently checked in T-PN-FIT-INPUT-v1 |
Neither native backend imports the scalar module or fixture.
Evidence and limitations
Freeze before implementation: root time rtol=2e-9, atol=2e-9 s, forward
frequency rtol=2e-9, atol=2e-9 Hz, phase unit-complex ratios
atol=3e-7, grid coordinates atol=2e-14 s, and exact zeros before the
mask boundary. The strict gate has no skips. It tests three source-backed
intrinsic points but is no physical-error bound. Inversion at or above the
inspiral join, the author pre-tEarly branch, automatic duration, waveform
amplitude, and higher-mode adapters remain open.
Reproduce the checks
On len, with current CPU Torch/JAX and mpmath installed, run
JAX_ENABLE_X64=1 JAX_PLATFORMS=cpu PYTHONPATH=src:tests python -m pytest -q tests/test_phenomt_inspiral_time_adapter_math_reference.py --reference-device=cpu -ra.
Record the exact Git revision, package versions, result, and source boundary
in a dated validation receipt. Revise this spec and component version before
changing the contract or thresholds.