Source code for pyccl.baryons.vandaalen19

__all__ = ("BaryonsvanDaalen19",)

import numpy as np

from .. import Pk2D
from . import Baryons


[docs]class BaryonsvanDaalen19(Baryons): """The baryonic boost factor model of `van Daalen et al. 2019, <https://arxiv.org/abs/1906.00968>`_. The boost factor is applied multiplicatively so that :math:`P_{\\rm bar.}(k, a) = P_{\\rm DMO}(k, a)\\, f_{\\rm vD19}(k, a)`. .. note:: The model has only been tested at z=0 and is valid for :math:`k\\leq 1 \\,h/{\\rm Mpc}`. Args: fbar (:obj:`float`): the fraction of baryons in a halo in units of the ratio of :math:`\\Omega_b` to :math:`\\Omega_m`. Default to 0.7 which is approximately compatible with observations (see Fig. 16 of the paper). mass_def (:obj:`string`): spherical overdensity mass definition. Options are "500c" or "200c". """ name = 'vanDaalen19' __repr_attrs__ = __eq_attrs__ = ("fbar", "mass_def",) def __init__(self, fbar=0.7, mass_def='500c'): self.fbar = fbar self.mass_def = mass_def if mass_def not in ["500c", "200c"]: raise ValueError(f"Mass definition {mass_def} not supported " "for van Daalen 2019 model.")
[docs] def boost_factor(self, cosmo, k, a): """The vD19 model boost factor for baryons. Args: cosmo (:class:`~pyccl.cosmology.Cosmology`): Cosmological parameters. k (:obj:`float` or `array`): Wavenumber (in :math:`{\\rm Mpc}^{-1}`). a (:obj:`float` or `array`): Scale factor. Returns: :obj:`float` or `array`: Correction factor to apply \ to the power spectrum. """ # noqa a_use, k_use = map(np.atleast_1d, [a, k]) # [k]=1/Mpc [k_use]=h/Mpc a_use, k_use = a_use[:, None], k_use[None, :]/cosmo['h'] if self.mass_def == '500c': avD19 = 2.215 bvD19 = 0.1276 cvD19 = 1.309 dvD19 = -5.99 evD19 = -0.5107 else: avD19 = 2.111 bvD19 = 0.0038 cvD19 = 1.371 dvD19 = -5.816 evD19 = -0.4005 numf = (2**avD19 + 2**bvD19*(cvD19*self.fbar)**(bvD19-avD19)) expf = np.exp(dvD19*self.fbar+evD19) denf1 = (cvD19*self.fbar)**(bvD19-avD19) denf = k_use**(-avD19)+k_use**(-bvD19)*denf1 fka = 1-numf/denf*expf if np.ndim(k) == 0: fka = np.squeeze(fka, axis=-1) if np.ndim(a) == 0: fka = np.squeeze(fka, axis=0) return fka
[docs] def update_parameters(self, fbar=None, mass_def=None): """Update van Daalen 2019 parameters. All parameters set to ``None`` will be left untouched. Args: fbar (:obj:`float`): baryonic fraction in halos. mass_def (:obj:`string`): mass definition ("500c" or "200c") """ if fbar is not None: self.fbar = fbar if mass_def is not None: self.mass_def = mass_def if mass_def not in ["500c", "200c"]: raise ValueError(f"Mass definition {mass_def} not supported " "for van Daalen 2019 model.")
def _include_baryonic_effects(self, cosmo, pk): # Applies boost factor a_arr, lk_arr, pk_arr = pk.get_spline_arrays() k_arr = np.exp(lk_arr) fka = self.boost_factor(cosmo, k_arr, a_arr) pk_arr *= fka if pk.psp.is_log: np.log(pk_arr, out=pk_arr) # in-place log return Pk2D(a_arr=a_arr, lk_arr=lk_arr, pk_arr=pk_arr, is_logp=pk.psp.is_log, extrap_order_lok=pk.extrap_order_lok, extrap_order_hik=pk.extrap_order_hik)