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.
- The (2,1) mode of the action-angle model is a real regression against the previous generation, by about 5 percent. It is small, but it is statistically solid rather than noise. If your analysis is sensitive to (2,1), the previous generation is better on that mode.
- The merger-ringdown arm is worse than its predecessor on (3,2) and (4,4), by roughly 20 percent and 10 percent respectively. Both models in this release use that arm, so this applies to both. It is the price of extending the waveform further past the peak, and it is a deliberate trade rather than a defect.
- The spread across configurations is wide. Quoted accuracy figures are medians. Individual points in the parameter space vary by roughly a factor of three either way. Do not treat a median as a guarantee at your particular parameters.
- Higher modes are less accurate than (2,2), by roughly an order of magnitude, which is normal for this class of model but worth stating.
- Accuracy figures are computed without weighting by a detector noise curve. A detector-weighted comparison is harsher, roughly a factor of two overall and more on the higher modes.
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.