Source code for harmonia.cosmology.geometry
"""
Background geometry (:mod:`~harmonia.cosmology.geometry`)
===========================================================================
Compute geometrical quantities in a cosmological background.
.. autosummary::
redshift_from_distance
differential_AP_distortion
|
"""
import numpy as np
from scipy.interpolate import InterpolatedUnivariateSpline as Spline
[docs]def redshift_from_distance(cosmo, lg_num_sample=5):
"""Invert redshift-to-distance relationship of a cosmological model
to redshift-from-distance.
Notes
-----
This is useful when the Alcock--Paczynski effect needs to be included
in modelling. Only valid for redshift between 1.e-3 and 100.
Parameters
----------
cosmo : :class:`nbodykit.cosmology.cosmology.Cosmology`
Cosmological model.
lg_num_sample : float, optional
Base-10 logarithm of the number of redshift points to sample
the comoving distance as a function of redshift (default
is 5, i.e. 100000 samle points).
Returns
-------
callable
Redshift-from-distance function.
"""
Z_LOG_RANGE = (-3, 2)
z_samples = np.logspace(*Z_LOG_RANGE, num=10**lg_num_sample)
r_samples = cosmo.comoving_distance(z_samples)
return Spline(r_samples, z_samples, ext='raise')
# pylint: disable=assignment-from-no-return
[docs]def differential_AP_distortion(fiducial_z_to_r, variable_z_to_r,
max_redshift=10., lg_num_sample=5):
"""Compute the differential Alcock--Paczynski distortion between a
fiducial and a cosmological redshift-to-distance conversion as a
fuction of redshift.
Parameters
----------
fiducial_z_to_r : callable
Fiducial redshift-to-distance conversion.
variable_z_to_r : callable
Variable redshift-to-distance conversion.
max_redshift : float, optional
Maximum redshift to sample for interpolation (default is 10).
lg_num_sample : float, optional
Base-10 logarithm of the number of redshift points to sample
the differential distortion as a function of redshift (default
is 5, i.e. 100000 samle points).
Returns
-------
callable
Differential distortion as a fuction of redshift.
"""
z_samples = np.linspace(0., max_redshift, 10 ** lg_num_sample)
r_tilde = fiducial_z_to_r(z_samples)
r = variable_z_to_r(z_samples)
with np.errstate(divide='ignore'):
dr_tilde_over_dr = np.gradient(r_tilde) / np.gradient(r)
# Filter out where possibly the gradient of r(z) is close to zero.
valid_samples = np.isfinite(dr_tilde_over_dr)
z_samples = z_samples[valid_samples]
dr_tilde_over_dr = dr_tilde_over_dr[valid_samples]
return Spline(z_samples, dr_tilde_over_dr, check_finite=False)