NRHJSur3dq8 release notes

This release contains three files, and you need all three:

file what it is
NRHJSur3dq8_AA_v3.h5 the action-angle model
NRHJSur3dq8_AdA_v3.h5 the adiabatic-angle model
NRHJSur3dq8_MR_v3.h5 the merger-ringdown arm both models use

The merger-ringdown arm is not optional. Both models refer to it by name and resolve it when they load, so a copy of this release without it gives you two models that cannot produce a waveform. The loader refuses to serve a model whose arm is missing rather than quietly returning an inspiral, and it refuses to serve a model paired with an arm it was not validated against.

What the models cover

Aligned-spin, non-precessing binary black holes. Mass ratio up to 8, with dimensionless aligned spins on both bodies. Seven spin-weighted spherical harmonic modes: (2,2), (2,1), (3,3), (3,2), (4,4), (4,3), (5,5). Waveforms run from the start of the fitted inspiral through merger and ringdown, reaching about 124 M after the amplitude peak.

Both models describe the same physics through different internal parameterisations. The action-angle model is callable directly; the adiabatic-angle model is used through its modes method. Which one suits you depends on what you are doing, and docs/USAGE.md shows both.

Ask the model rather than assuming: the parameter range, the mode list and the time span are all recorded inside the artifact, and evaluating outside the fitted range raises a warning saying so.

Accuracy

Both models are compared against the numerical relativity waveforms they were built to reproduce, using a leave-one-out procedure, so the quoted figures are what to expect at parameters the model was not shown.

The adiabatic-angle model in this release improves on the previous generation by a factor of about 1.56 in all-mode error, and is better on every one of the seven modes. The largest single improvement is on the (2,2) mode.

Both models also satisfy the body-exchange symmetry exactly. Swapping the two bodies, together with their spins, returns the same waveform to machine precision. This matters most near equal mass and near equal spins, where the symmetry binds, and it matters for parameter derivatives as well as for the waveform itself. The previous generation violated it.

Where these models are WORSE

Read this section. A model is only useful if you know where not to trust it.

Time inversion

Converting from the model's internal phase variable to time does not converge on a small set of points, of measure zero, at about 2.5e-4 of the peak amplitude. Anything computed by integrating over the waveform is unaffected. A calculation that reads the waveform at individual sample points could notice it.

Getting started

pip install nrhjsurrogate installs the pure-Python wheel: every model, waveform, derivative and error estimate works with NumPy alone. The compiled Kokkos backend, which is what batched evaluation and parameter estimation want, is built by installing the SOURCE distribution (pip install --no-binary nrhjsurrogate nrhjsurrogate): it needs a C++17 compiler (GCC 10.4, Clang 14, Apple Clang or Visual Studio 2022 and later) and downloads and builds Kokkos 5.2.0 itself, or uses an installed Kokkos found through Kokkos_ROOT. Measured on an AMD EPYC with GCC 14 at eight parallel jobs, the compile takes about half a minute and the whole install about two, most of it dependency downloads. Without a usable compiler the install still succeeds with the NumPy backend and says so once; NRHJ_BUILD_KOKKOS=0 skips the attempt. INSTALL.md section 2 has the details.

Which backend gets built is NRHJ_BACKEND: auto (default), numpy, serial, openmp (a missing OpenMP becomes a build error rather than a quietly single-threaded module) or cuda with NRHJ_CUDA_ARCH, e.g. NRHJ_BACKEND=cuda NRHJ_CUDA_ARCH=sm_75. INSTALL.md section 1b has the table. Whatever the outcome, the build record is written into the installed package: python -m nrhjsurrogate.compiled_backend prints it, the first import after an install reports it once, and a build that succeeded but got no OpenMP warns, because that is a success to pip and single-threaded to you.

Linux is verified, on two machines and for all four backend modes, CUDA included (GTX 1650 Ti, Turing sm_75, CUDA 13.0). macOS and Windows builds are written for but were not run before this release; the one macOS report we have built cleanly and Serial-only, because CMake could not see a libomp that was present in the environment -- fixed by searching the interpreter's own prefix, but that fix is itself unverified on macOS.

The model files download themselves the first time you name a released model and no copy is found: from the deposit into your per-user cache, SHA-256 checked against the registry, and kept only if it matches. Set NRHJ_AUTO_FETCH=0 to switch that off and place the files yourself.

One keyword is named backwards, and is left that way for this release. On the evaluation methods, safe=False selects the fast path rather than the one that reproduces bit for bit. It is not less accurate: over nine parameter points and seven modes the largest departure is 4.53e-10 relative on the waveform and 1.43e-09 on the derivatives, a millionth of the implementation divergence already present. What it costs is bit identity. It is also set for the whole process rather than for the calling thread, so a threaded likelihood can take the fast path everywhere without saying so. A later release renames it bitwise_reproducible and keeps safe= working.

docs/QUICKSTART.md gets you a waveform. docs/USAGE.md covers modes and polarizations, physical units, extending the inspiral to a lower starting frequency, parameter derivatives, the model's own error estimate, and the two evaluation backends. examples/usage/ has a runnable script for each.

Citing

See CITATION.cff.