Source code for pyccl.halos.hmfunc.despali16

__all__ = ("MassFuncDespali16",)

import numpy as np

from . import MassFunc, get_delta_c


[docs]class MassFuncDespali16(MassFunc): """Implements the mass function of `Despali et al. 2016 <https://arxiv.org/abs/1507.05627>`_. This parametrization accepts any S.O. masses. Args: mass_def (:class:`~pyccl.halos.massdef.MassDef` or :obj:`str`): a mass definition object, or a name string. mass_def_strict (:obj:`bool`): if ``False``, consistency of the mass definition will be ignored. ellipsoidal (:obj:`bool`): use the ellipsoidal parametrization. """ __repr_attrs__ = __eq_attrs__ = ("mass_def", "mass_def_strict", "ellipsoidal",) name = 'Despali16' def __init__(self, *, mass_def="200m", mass_def_strict=True, ellipsoidal=False): self.ellipsoidal = ellipsoidal super().__init__(mass_def=mass_def, mass_def_strict=mass_def_strict) def _check_mass_def_strict(self, mass_def): # True for FoF since Despali16 is not defined for this mass def. return mass_def.Delta == "fof" def _setup(self): # key: ellipsoidal vals = {True: (0.3953, -0.1768, 0.7057, 0.2125, 0.3268, 0.2206, 0.1937, -0.04570), False: (0.3292, -0.1362, 0.7665, 0.2263, 0.4332, 0.2488, 0.2554, -0.1151)} A0, A1, a0, a1, a2, p0, p1, p2 = vals[self.ellipsoidal] coeffs = [[A1, A0], [a2, a1, a0], [p2, p2, p0]] self.poly_A, self.poly_a, self.poly_p = map(np.poly1d, coeffs) def _get_fsigma(self, cosmo, sigM, a, lnM): delta_c = get_delta_c(cosmo, a, 'NakamuraSuto97') Dv = self.mass_def.get_Delta_vir(cosmo, a) x = np.log10(self.mass_def.get_Delta(cosmo, a) / Dv) A, a, p = self.poly_A(x), self.poly_a(x), self.poly_p(x) nu_p = a * (delta_c/sigM)**2 return 2.0 * A * np.sqrt(nu_p / 2.0 / np.pi) * ( np.exp(-0.5 * nu_p) * (1.0 + nu_p**-p))