2 import matplotlib.pyplot
as plt
4 from scipy.interpolate
import interp1d
5 import astropy.cosmology
as csmm
6 from astropy.constants
import c,G
7 from astropy
import units
as u
10 cosmo=csmm.FlatLambdaCDM(70.,0.3,Tcmb0=2.725)
11 cosmo_h=cosmo.clone(H0=100)
14 cosmo_fid=dict({
'h':0.7,
'Omb':0.0,
'Omd':0.3,
's8':0.8,
'Om':0.3,
15 'As':2.12e-09,
'mnu':0.,
'Omk':0.,
'tau':0.06,
'ns':0.96})
16 pk_params={
'non_linear':1,
'kmax':30,
'kmin':1.e-4,
'nk':5000}
19 def __init__(self,cosmo_params=cosmo_fid,pk_params=pk_params,cosmo=cosmo,cosmo_h=None):
29 def ccl_pk(self,z,cosmo_params=None,pk_params=None):
35 cosmo_ccl=pyccl.Cosmology(h=cosmo_params[
'h'],Omega_c=cosmo_params[
'Omd'],
36 Omega_b=cosmo_params[
'Omb'],sigma8=0.8,
37 n_s=cosmo_params[
'ns'],m_nu=cosmo_params[
'mnu'],
38 transfer_function=
'bbks')
39 kh=np.logspace(np.log10(pk_params[
'kmin']),np.log10(pk_params[
'kmax']),pk_params[
'nk'])
41 ps=np.zeros((nz,pk_params[
'nk']))
45 pyccl_pkf=pyccl.linear_matter_power
46 if pk_params[
'non_linear']==1:
47 pyccl_pkf=pyccl.nonlin_matter_power
48 for i
in np.arange(nz):
49 ps[i]= pyccl_pkf(cosmo_ccl,kh,1./(1+z[i]))
50 return ps*cosmo_params[
'h']**3,kh/cosmo_params[
'h']
52 def cl_z(self,z=[],l=np.arange(3000)+1,pk_params=
None,cosmo_h=
None,cosmo=
None,pk_func=
None):
59 pk,kh=
pk_func(z=z,pk_params=pk_params)
61 cls=np.zeros((nz,nl),dtype=
'float32')*u.Mpc**2
62 for i
in np.arange(nz):
63 DC_i=cosmo_h.comoving_transverse_distance(z[i]).value
65 DC_i=cosmo_h.comoving_transverse_distance(z[i]).value
66 pk_int=interp1d(lz,pk[i]/DC_i**2,bounds_error=
False,fill_value=0)
67 cls[i][:]+=pk_int(l)*u.Mpc*(c/(cosmo_h.efunc(z[i])*cosmo_h.H0))
70 def kappa_cl(self,zl_min=0,zl_max=1100,n_zl=10,log_zl=False,pk_func=None,
71 zs1=[1100],p_zs1=[1],zs2=[1100],p_zs2=[1],
72 pk_params=
None,cosmo_h=
None,l=np.arange(3001)):
77 zl=np.logspace(np.log10(
max(zl_min,1.e-4)),np.log10(zl_max),n_zl)
79 zl=np.linspace(zl_min,zl_max,n_zl)
81 ds1=cosmo_h.comoving_transverse_distance(zs1)
82 ds2=cosmo_h.comoving_transverse_distance(zs2)
83 dl=cosmo_h.comoving_transverse_distance(zl)
84 prefac=1.5*(cosmo_h.H0/c)**2*cosmo_h.Om0
85 sigma_c1=prefac*(1+zl)*dl*(1-np.multiply.outer(1./ds1,dl))
86 sigma_c2=prefac*(1+zl)*dl*(1-np.multiply.outer(1./ds2,dl))
87 clz=self.
cl_z(z=zl,l=l,cosmo_h=cosmo_h,pk_params=pk_params,pk_func=pk_func)
90 dzs1=np.gradient(zs1)
if len(zs1)>1
else 1
91 dzs2=np.gradient(zs2)
if len(zs2)>1
else 1
93 cl_zs_12=np.einsum(
'ji,ki,il',sigma_c2,sigma_c1*dzl,clz)
94 cl=np.dot(p_zs2*dzs2,np.dot(p_zs1*dzs1,cl_zs_12))
95 cl/=np.sum(p_zs2*dzs2)*np.sum(p_zs1*dzs1)
101 if __name__ ==
"__main__":
103 l,cl2=PS.kappa_cl(n_zl=10000,log_zl=
True,zl_min=1.e-4,zl_max=1100,pk_func=PS.ccl_pk)
108 plt.xlabel(
'$\\ell$',fontsize=16)
109 plt.ylabel(
'$C^{\\kappa\\kappa}_\\ell$',fontsize=16)
112 np.savetxt(
'benchmark_cc.txt',np.transpose([l,cl2]),fmt=
'%d %lE')
def __init__(self, cosmo_params=cosmo_fid, pk_params=pk_params, cosmo=cosmo, cosmo_h=None)
static T max(const std::vector< T > &data)
def cl_z(self, z=[], l=np.arange(3000)+1, pk_params=None, cosmo_h=None, cosmo=None, pk_func=None)
def ccl_pk(self, z, cosmo_params=None, pk_params=None)
def kappa_cl(self, zl_min=0, zl_max=1100, n_zl=10, log_zl=False, pk_func=None, zs1=[1100], p_zs1=[1], zs2=[1100], p_zs2=[1], pk_params=None, cosmo_h=None, l=np.arange(3001))