Source code for caustics.cosmology.base
# mypy: disable-error-code="operator"
from abc import abstractmethod
from math import pi
from typing import Optional, Annotated
from ..backend_obj import ArrayLike
from caskade import Module, forward
from ..constants import G_over_c2
NameType = Annotated[Optional[str], "Name of the cosmology"]
[docs]
class Cosmology(Module):
"""
Abstract base class for cosmological models.
This class provides an interface for cosmological computations used in lensing
such as comoving distance and critical surface density.
Distance
*Unit: Mpc*
Mass
*Unit: Msun*
Attributes
----------
name: str
Name of the cosmological model.
"""
def __init__(self, name: NameType = None):
"""
Initialize the Cosmology.
Parameters
----------
name: str
Name of the cosmological model.
"""
super().__init__(name)
[docs]
@abstractmethod
@forward
def critical_density(self, z: ArrayLike) -> ArrayLike:
"""
Compute the critical density at redshift z.
Parameters
----------
z: ArrayLike
The redshift.
*Unit: unitless*
Returns
-------
ArrayLike
The critical density at each redshift.
*Unit: Msun/Mpc^3*
"""
...
[docs]
@abstractmethod
@forward
def comoving_distance(self, z: ArrayLike, *args, **kwargs) -> ArrayLike:
"""
Compute the comoving distance to redshift z.
Parameters
----------
z: ArrayLike
The redshift.
*Unit: unitless*
Returns
-------
ArrayLike
The comoving distance to each redshift.
*Unit: Mpc*
"""
...
[docs]
@abstractmethod
@forward
def transverse_comoving_distance(self, z: ArrayLike, *args, **kwargs) -> ArrayLike:
"""
Compute the transverse comoving distance to redshift z (Mpc).
Parameters
----------
z: ArrayLike
The redshift.
*Unit: unitless*
Returns
-------
ArrayLike
The transverse comoving distance to each redshift in Mpc.
*Unit: Mpc*
"""
...
[docs]
@forward
def comoving_distance_z1z2(self, z1: ArrayLike, z2: ArrayLike) -> ArrayLike:
"""
Compute the comoving distance between two redshifts.
Parameters
----------
z1: ArrayLike
The starting redshift.
*Unit: unitless*
z2: ArrayLike
The ending redshift.
*Unit: unitless*
Returns
-------
ArrayLike
The comoving distance between each pair of redshifts.
*Unit: Mpc*
"""
return self.comoving_distance(z2) - self.comoving_distance(z1)
[docs]
@forward
def transverse_comoving_distance_z1z2(
self, z1: ArrayLike, z2: ArrayLike
) -> ArrayLike:
"""
Compute the transverse comoving distance between two redshifts (Mpc).
Parameters
----------
z1: ArrayLike
The starting redshift.
*Unit: unitless*
z2: ArrayLike
The ending redshift.
*Unit: unitless*
Returns
-------
ArrayLike
The transverse comoving distance between each pair of redshifts in Mpc.
*Unit: Mpc*
"""
return self.transverse_comoving_distance(
z2
) - self.transverse_comoving_distance(z1)
[docs]
@forward
def angular_diameter_distance(self, z: ArrayLike) -> ArrayLike:
"""
Compute the angular diameter distance to redshift z.
Parameters
-----------
z: ArrayLike
The redshift.
*Unit: unitless*
Returns
-------
ArrayLike
The angular diameter distance to each redshift.
*Unit: Mpc*
"""
return self.comoving_distance(z) / (1 + z)
[docs]
@forward
def angular_diameter_distance_z1z2(self, z1: ArrayLike, z2: ArrayLike) -> ArrayLike:
"""
Compute the angular diameter distance between two redshifts.
Parameters
----------
z1: ArrayLike
The starting redshift.
*Unit: unitless*
z2: ArrayLike
The ending redshift.
*Unit: unitless*
Returns
-------
ArrayLike
The angular diameter distance between each pair of redshifts.
*Unit: Mpc*
"""
return self.comoving_distance_z1z2(z1, z2) / (1 + z2)
[docs]
@forward
def time_delay_distance(
self,
z_l: ArrayLike,
z_s: ArrayLike,
) -> ArrayLike:
"""
Compute the time delay distance between lens and source planes.
Parameters
----------
z_l: ArrayLike
The lens redshift.
*Unit: unitless*
z_s: ArrayLike
The source redshift.
*Unit: unitless*
Returns
-------
ArrayLike
The time delay distance for each pair of lens and source redshifts.
*Unit: Mpc*
"""
d_l = self.angular_diameter_distance(z_l)
d_s = self.angular_diameter_distance(z_s)
d_ls = self.angular_diameter_distance_z1z2(z_l, z_s)
return (1 + z_l) * d_l * d_s / d_ls
[docs]
@forward
def critical_surface_density(
self,
z_l: ArrayLike,
z_s: ArrayLike,
) -> ArrayLike:
"""
Compute the critical surface density between lens and source planes.
Parameters
----------
z_l: ArrayLike
The lens redshift.
*Unit: unitless*
z_s: ArrayLike
The source redshift.
*Unit: unitless*
Returns
-------
ArrayLike
The critical surface density for each pair of lens and source redshifts.
*Unit: Msun/Mpc^2*
"""
d_l = self.angular_diameter_distance(z_l)
d_s = self.angular_diameter_distance(z_s)
d_ls = self.angular_diameter_distance_z1z2(z_l, z_s)
return d_s / (4 * pi * G_over_c2 * d_l * d_ls) # fmt: skip