def __init__(self, params): #omr=0.0, omb=0.05, omc=0.25, oml=0.7, H0=70. ): assert (1 - np.abs(params['omegab'] + params['omegac'] + params['omegav']) <= 0.05) self.omegar = 0. # TODO: add radiation density self.omegab = params['omegab'] self.omegac = params['omegac'] self.omegav = params['omegav'] self.H0 = params['H0'] self.h = self.H0 / 100. self.omegam = params['omegab']+params['omegac'] self.zvec = np.concatenate( [np.linspace(0., 20., 500., endpoint=False), np.linspace( 20., 200., 200., endpoint=False), np.linspace(200., 1500., 100)] ) # self.xvec = np.array( [ integrate.quad( lambda z : (const.c.value * 1.e-3) / self.H_z(z), 0., zmax )[0] for zmax in self.zvec ] ) self.xvec = np.array( [ integrate.quad( lambda z : (const.c.to('km/s').value) / self.H_z(z), 0., zmax )[0] for zmax in self.zvec ] ) self.zmin = np.min(self.zvec) self.zmax = np.max(self.zvec) self.xmin = np.min(self.xvec) self.xmax = np.max(self.xvec) self.spl_x_z = interpolate.UnivariateSpline( self.zvec, self.xvec, k=1, s=0 ) self.spl_z_x = interpolate.UnivariateSpline( self.xvec, self.zvec, k=1, s=0 ) self.chi_rec = self.spl_x_z(1090.) # Evaluating Matter PS max_kappa = 80. kappa = np.logspace(-3,np.log10(max_kappa),50) z = np.logspace(-3,1,num=50) z = np.insert(z,0,0.) redshifts = z[::-1] mps = pycamb.matter_power(redshifts, k=kappa, **params) mps = np.asarray(mps) @np.vectorize def pk_hi(k, z): return mps[1,-1,z]*(k/mps[0,-1,z])**-3 k_hi = np.linspace(mps[0,-1,0],2000,1000)[1:] mps_hi = np.zeros((2, k_hi.size, redshifts.size)) for i in xrange(0, redshifts.size): mps_hi[1,:,i] = pk_hi(k_hi,i) mps_hi[0,:,i] = k_hi mps_ext_hi = np.hstack((mps, mps_hi)) self.pkz = interpolate.RectBivariateSpline(mps_ext_hi[0,:,0], z, mps_ext_hi[1,:,::-1], kx=3, ky=2, s=0) # (Mpc/h)^3
def __init__(self,cosmo,z,kmax=10,nk=32768): self.cosmo=cosmo.copy() kvals = np.linspace(0,kmax,nk) self.k = kvals.copy() pk=pycamb.matter_power(redshifts=[z], k=kvals, **cosmo)[1] pk[0]=0 self.pk=pk r=2*pi/kmax*np.arange(nk) pkk=self.k*self.pk cric=-np.imag(fft(pkk)/nk)/r/2/pi**2*kmax cric[0]=0 h=cosmo['H0']/100 self.xi=interpolate.interp1d(r,cric)
def PK ( koverh , redshiftlist = [0] , maxk = 1.0 , logk_spacing =0.02 , **params ) : """returns the interpolated matter power spectrum """ kh, PK , sigma8 = pyc.matter_power (redshifts = redshiftlist, maxk = maxk , logk_spacing = logk_spacing , get_sigma8 = True, **params ) return np.interp( koverh, kh, PK )
def __init__(self, cosmomo, NonLinear=0): self.omegab=cosmomo.omegab self.omegam=cosmomo.omegam self.omegal=cosmomo.omegal self.omegac= self.omegam-self.omegab self.H0=cosmomo.H0 self.h=self.H0/100. self.camb_params={"omegab":self.omegab, "omegac":self.omegac, 'omegav':self.omegal, "H0":self.H0, "scalar_amp":2.1e-9, "reion__optical_depth":0.09, "reion__reionization":True, "reion__use_optical_depth":True, "reion__redshift":11, "scalar_index":0.9692, "reion__delta_redshift":1.5, "TCMB":2.726, "Num_Nu_massless":3.046, "yhe":0.24, "NonLinear":NonLinear} self.z_tab=[0, 0.1, 0.2, 0.3, 0.5, 0.7,1., 1.5,2,2.5,3.,3.5,4,5,7,9.,10.,15,20, 50, 70, 100, 200, 400, 600, 1000,1100, 2000] self.AA=pc.matter_power(redshifts=self.z_tab[::-1], maxk=1000, **self.camb_params) self.Pdek=scipy.interpolate.RectBivariateSpline( nm.log10(self.AA[0][:,0]*self.h),self.z_tab,(self.AA[1][:,::-1]/self.h**3), kx=3, ky=3, s=0)
def powerspectrum(A): assert A.WhichSpectrum == 2 import pycamb a = dict(H0=A.h * 100., omegac=A.OmegaM- A.OmegaB, omegab=A.OmegaB, omegav=A.OmegaL, omegak=0.0, omegan=0, scalar_index=A.PrimordialIndex ) print a fakesigma8 = pycamb.transfers(scalar_amp=1, **a)[2] scalar_amp = fakesigma8 ** -2 * A.Sigma8 ** 2 k, p = pycamb.matter_power(scalar_amp=scalar_amp, maxk=500, **a) p[numpy.isnan(p)] = 0 numpy.savetxt(A.PowerSpectrumFile, zip(k, p), fmt='%g')
def __init__(self, cosmomo, NonLinear=0): self.omegab=cosmomo.omegab self.omegam=cosmomo.omegam self.omegal=cosmomo.omegal self.omegac= self.omegam-self.omegab self.H0=cosmomo.H0 self.h=self.H0/100. self.camb_params={"omegab":self.omegab, "omegac":self.omegac, 'omegav':self.omegal, 'omegan':0.0, "H0":self.H0, "scalar_amp":2.215e-9, "reion__optical_depth":0.0925, "reion__reionization":True, "reion__use_optical_depth":True, "reion__redshift":11.37, "scalar_index":0.9619, "reion__delta_redshift":1.5, "TCMB":2.725, "Num_Nu_massless":3.046, "yhe":0.248, "NonLinear":NonLinear, "lSampleBoost":1, "AccuracyBoost":1, "lAccuracyBoost":1} self.z_tab=[0.001, 0.1, 0.2, 0.3,0.4, 0.5,0.6, 0.7,0.8,0.9,1., 1.1, 1.2, 1.3, 1.4, 1.5,1.7, 2,2.3, 2.5,2.7, 3.,3.5,4,5,7,9.,10.,15,20, 50, 70, 100, 200, 400, 600, 1000,1100, 2000] #self.z_tab=[0, 0.1, 0.2, 0.3, 0.5, 0.7, 70, 100, 200, 400, 600, 1000,1100, 2000] self.AA=pc.matter_power(redshifts=self.z_tab[::-1], maxk=100, logk_spacing=0.1, **self.camb_params) self.Pdek=scipy.interpolate.RectBivariateSpline( (self.AA[0][:,0]*self.h),self.z_tab,(self.AA[1][:,::-1]/self.h**3), kx=3, ky=3, s=0)
def powerspectrum(A): assert A.WhichSpectrum == 2 import pycamb a = dict(H0=A.h * 100., omegac=A.OmegaM - A.OmegaB, omegab=A.OmegaB, omegav=A.OmegaL, omegak=0.0, omegan=0, scalar_index=A.PrimordialIndex) print a fakesigma8 = pycamb.transfers(scalar_amp=1, **a)[2] scalar_amp = fakesigma8**-2 * A.Sigma8**2 k, p = pycamb.matter_power(scalar_amp=scalar_amp, maxk=500, **a) p[numpy.isnan(p)] = 0 numpy.savetxt(A.PowerSpectrumFile, zip(k, p), fmt='%g')
def sigma8(redshiftlist = [0] , maxk = 1.0 , logk_spacing = 0.02, **params ): """ returns the value of sigma8 at the redshift specified for the set of parameters passed in. args: redshiftlist: list of floats, optional, defaults to [0] maxk : float, optional, defaults to 1.0 max value of k to which the matter power spectrum is calculated logk_spacing: float, optional , defaults to 0.02 spacing in log(k *Mpc/h) **params: dictionary/keyword argument for CAMB parameters returns: float, sigma8 for the parameters passed example usage: >>> import camb as cp >>> params = {"scalar_amp":2.3e-9} >>> cp.sigma8(**params) >>> 0.8339590551185299 >>> #This value may change if the defaults of pycamb change status: Tested to work correctly for single redshifts. See testlinearityofsigma8withAs() in tests. R. Biswas, Mon Aug 26 10:31:00 CDT 2013 """ sigma8 = pyc.matter_power(redshifts = redshiftlist, maxk = maxk , logk_spacing = logk_spacing , get_sigma8 = True, **params )[-1] return float(sigma8)
def Pk(self): import pycamb a = dict(H0=self.h * 100., omegac=self.M- self.B, omegab=self.B, omegav=self.L, omegak=1 - self.M - self.L, omegan=0) DH = 299792.468 / 100. fakesigma8 = pycamb.transfers(scalar_amp=1, **a)[2] scalar_amp = fakesigma8 ** -2 * self.sigma8 ** 2 k, p = pycamb.matter_power(scalar_amp=scalar_amp, maxk=500, **a) k *= DH p /= DH ** 3 p[numpy.isnan(p)] = 0 func = interp1d(k, p, kind=5, bounds_error=False, fill_value=0) func.__doc__ = \ """power spectrum P(k) normalized to sigma8. k is in 1/DH and p is in DH**3 """ return func
def Pk(self): import pycamb a = dict(H0=self.h * 100., omegac=self.M - self.B, omegab=self.B, omegav=self.L, omegak=1 - self.M - self.L, omegan=0) DH = 299792.468 / 100. fakesigma8 = pycamb.transfers(scalar_amp=1, **a)[2] scalar_amp = fakesigma8**-2 * self.sigma8**2 k, p = pycamb.matter_power(scalar_amp=scalar_amp, maxk=500, **a) k *= DH p /= DH**3 p[numpy.isnan(p)] = 0 func = interp1d(k, p, kind=5, bounds_error=False, fill_value=0) func.__doc__ = \ """power spectrum P(k) normalized to sigma8. k is in 1/DH and p is in DH**3 """ return func
def power(self, OmegaB, sigma8): """ returns matter power spectrum. need pycamb the power spectrum will be in GADGET normalization, normalized to (2 * numpy.pi) ** -3 * P_phys(k) This takes a long time to calculate; and no caching is implemented. returns a function P_k(k). """ import pycamb from scipy.interpolation import interp1d assert self.M + self.L + self.K == 1.0 args = dict(H0=self.h * 100, omegac=self.M - OmegaB, omegab=OmegaB, omegav=self.L, omegak=0, omegan=0) fakesigma8 = pycamb.transfers(scalar_amp=1, **args)[2] scalar_amp = fakesigma8 ** -2 * sigma8 ** 2 k, p = pycamb.matter_power(scalar_amp=scalar_amp, maxk=10, **args) k /= self.U.MPC_h p *= (self.U.MPC_h) ** 3 * (2 * numpy.pi) ** -3 # xiao to GADGET return interp1d(k, p, kind='linear', copy=True, bounds_error=False, fill_value=0)
def get_pk(cosmo,z, kmax=10, nk=32768): h = cosmo['H0']/100 kvals = np.linspace(0,kmax/h,nk) pk=pycamb.matter_power(redshifts=[z], k=kvals, **cosmo)[1] pk[0]=0 return kvals*h, pk / h**3
def get_pk(cosmo,z, kmax=10, nk=32768): kvals = np.linspace(0,kmax,nk) pk=pycamb.matter_power(redshifts=[z], k=kvals, **cosmo)[1] pk[0]=0 return kvals, pk