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)
)