Tutorial: Extrapolation

In numerical relativity simulations, waveform quantities are extracted at finite radii in the simulation domain. These extraction radii are usually at distances \(R\lesssim \mathcal{O}(10^3 M)\). As a result, the waveforms are contaminated by gauge and near-field effects. One way to compute the waveform at asymptotic null infinity \(\mathscr{I}^+\) is by using an extrapolation procedure in post-processing. Such a procedure is provided by scri through the function scri.extrapolation.extrapolate(); see arXiv:2010.15200 for details.

Extrapolating Finite-Radius Waveforms

This function will accept an HDF5 file containing the coefficients of a waveform quantity expanded in the appropriate spin-weighted spherical harmonic basis. The format should be that of the rh_FiniteRadii_CodeUnits.h5 files in the SXS Waveform Catalog, which will now be described in detail.

The internal group structure of the HDF5 file should be as follows. The root group should contain one group for each extraction radius, named R####.dir where #### is a four digit number corresponding to the extraction radius. For example, if an extraction radius is \(123\, M\), the group should be named R0123.dir. Within each extraction radius group, there should be datasets named Y_l#_m#.dat corresponding to each \((\ell,m) = (\#,\#)\) mode. For example, the modes \((3,2)\) and \((4,-2)\) would be named Y_l3_m2.dat and Y_l4_-2.dat. Each dataset should be of size (n_times, 3), where n_times is the number of timesteps. The first column should be the simulation time, the second column should be the real part of the coefficient, and the third column should be the imaginary part of the coefficient. The array of times should be the same for every mode and every extraction radius. Isn’t this quite a waste of space? Absolutely.

To extrapolate the finite radius waveform data,

>>> scri.extrapolate(
...     InputDirectory = "path/to/FiniteRadii_waveform_dir",
...     OutputDirectory = "path/to/output_dir",
...     DataFile = "waveform_FiniteRadii_CodeUnits.h5",
...     ChMass = 1.0, # or whatever the initial system (Christodoulou) mass is.
...     UseStupidNRARFormat = True,
...     DifferenceFiles = '',
...     PlotFormat = '',
... )

Despite the fact that the NRAR format for HDF5 files (described in detail above) is quite wasteful, it’s better to output the extrapolated files in this format for two reasons. First, the NRAR format extrapolated files interface more widely with functions in scri. Second, these files can be highly compressed with the RPXMB scheme described in the next section below. The RPXMB-compressed files are far smaller than the default scri-format extrapolated files.

The last two options, DifferenceFiles='' and PlotFormat='', are set to supress the output of diagnostic plots. Only do this if you have your own set of diagnostic tests to measure the performance of the extrapolation. If you wish the default diagnostic plots to be produced then leave off the last two options:

>>> # Outputs diagnostic plots in addition to the waveforms
>>> scri.extrapolate(
...     InputDirectory = "path/to/FiniteRadii_waveform_dir",
...     OutputDirectory = "path/to/output_dir",
...     DataFile = "waveform_FiniteRadii_CodeUnits.h5",
...     ChMass = 1.0, # or whatever the initial system (Christodoulou) mass is.
...     UseStupidNRARFormat = True,
... )

For more options of extrapolation function, see the documentation for scri.extrapolation.extrapolate().

Compressing Extrapolated Waveforms with RPXMB

Extrapolated waveforms in the NRAR format (described in the previous section) use an extravagant amount of needless space. Instead, a highly compressed HDF5 file can be produced using scri.rpxmb. Files can be reduced by anywhere from a factor 6 to a factor of 10, depending on the waveform data.

This compression can be performed in scri. For example, let’s say we want to compress an extrapolated file rhOverM_Extrapolated_N4.h5 and output the compressed waveform to the same directory with the name rhOverM_Extrapolated_N4_RPXMB.h5. This can be done as follows:

>>> w_in = scri.SpEC.read_from_h5("path/to/rhOverM_Extrapolated_N4.h5")
>>> scri.rpxmb.save(
...     w_in,
...     "path/to/rhOverM_Extrapolated_N4_RPXMB.h5",
... )