Source code for nbodykit.cosmology.power.halofit

import numpy

[docs]class HalofitPower(object): """ Nonlinear power spectrum computed using HaloFit via CLASS. Parameters ---------- cosmo : :class:`Cosmology`, astropy.cosmology.FLRW the Cosmology instance; astropy cosmology objects are automatically converted redshift : float the redshift of the power spectrum Attributes ---------- cosmo : class:`Cosmology` the object giving the cosmological parameters sigma8 : float the z=0 amplitude of matter fluctuations redshift : float the redshift to compute the power at """ def __init__(self, cosmo, redshift): from astropy.cosmology import FLRW # convert astropy if isinstance(cosmo, FLRW): from nbodykit.cosmology import Cosmology cosmo = Cosmology.from_astropy(cosmo) # internal cosmology clone with nonlinear enabled self.cosmo = cosmo.clone(nonlinear=True) self.redshift = redshift self._sigma8 = self.cosmo.sigma8 # store meta-data self._attrs = {} self._attrs['cosmo'] = dict(cosmo) @property def attrs(self): """ The meta-data dictionary """ self._attrs['redshift'] = self.redshift self._attrs['sigma8'] = self.sigma8 return self._attrs @property def sigma8(self): """ The amplitude of matter fluctuations at :math:`z=0`. """ return self._sigma8 @sigma8.setter def sigma8(self, value): self._sigma8 = value self.cosmo = self.cosmo.match(sigma8=value) self._attrs['cosmo'] = dict(self.cosmo)
[docs] def __call__(self, k): r""" Return the power in units of :math:`h^{-3} \mathrm{Mpc}^3`. Parameters ---------- k : float, array_like the wavenumbers in units of :math:`h \mathrm{Mpc}^{-1}` Returns ------- Pk : float, array_like the linear power spectrum evaluated at ``k`` in units of :math:`h^{-3} \mathrm{Mpc}^3` """ k = numpy.asarray(k) if k.max() > self.cosmo.P_k_max: msg = "results can only be computed up to k=%.2e h/Mpc; " %self.cosmo.P_k_max msg += "try increasing the Cosmology parameter 'P_k_max'" raise ValueError(msg) kmin = self.cosmo.P_k_min inrange = k > 1.00001*kmin Pk = numpy.zeros_like(k) k_in = k[inrange]; k_out = k[~inrange] # nonlinear power in range Pk[inrange] = self.cosmo.get_pk(k=k_in, z=self.redshift) # linear power on large scales (small k) Pk[~inrange] = self.cosmo.get_pklin(k=k_out, z=self.redshift) return Pk