Source code for cosmofit.cosmology.models.cpl

"""
Chevallier-Polarski-Linder (CPL) dark-energy model.
"""

from __future__ import annotations

import numpy as np

from cosmofit.typing import Array, Redshift

from cosmofit.cosmology.numerics.powers import cube

from cosmofit.cosmology.core import Cosmology


[docs] class CPL(Cosmology): """ Chevallier-Polarski-Linder (CPL) dark-energy model. Equation of state w(z) = w0 + wa * z / (1 + z) """ MODEL_NAME = "CPL" # --------------------------------------------------------- def w( self, z: Redshift, ) -> Array: """ Dark-energy equation of state. """ z = np.asarray( z, dtype=float, ) return ( self.w0 + self.wa * z / (1.0 + z) ) # --------------------------------------------------------- def fde( self, z: Redshift, ) -> Array: """ Dark-energy density evolution factor. Returns ------- ndarray ρ_DE(z) / ρ_DE(0) """ z = np.asarray( z, dtype=float, ) return ( (1.0 + z) ** ( 3.0 * ( 1.0 + self.w0 + self.wa ) ) * np.exp( -3.0 * self.wa * z / (1.0 + z) ) ) # --------------------------------------------------------- def E( self, z: Redshift, ) -> Array: """ Dimensionless Hubble parameter. """ z = np.asarray( z, dtype=float, ) return np.sqrt( self.Omega_m * cube(1.0 + z) + self.Omega_k * (1.0 + z) ** 2 + self.Omega_de0 * self.fde(z) ) # --------------------------------------------------------- def dEdz( self, z: Redshift, ) -> Array: """ Derivative of E(z). """ z = np.asarray( z, dtype=float, ) fde = self.fde(z) dlnf_dz = ( 3.0 * ( 1.0 + self.w0 + self.wa ) / (1.0 + z) - 3.0 * self.wa / (1.0 + z) ** 2 ) dE2_dz = ( 3.0 * self.Omega_m * (1.0 + z) ** 2 + 2.0 * self.Omega_k * (1.0 + z) + self.Omega_de0 * fde * dlnf_dz ) return ( dE2_dz / ( 2.0 * self.E(z) ) ) # --------------------------------------------------------- def Omega_de( self, z: Redshift, ) -> Array: """ Dark-energy density parameter. """ z = np.asarray( z, dtype=float, ) return ( self.Omega_de0 * self.fde(z) )