Fast Methods for Cosmological Simulations
FastSim serves as a tool for quick N-body simulations in modified gravity.
cl_cmbl_bm.py
Go to the documentation of this file.
1 import pyccl
2 import matplotlib.pyplot as plt
3 import numpy as np
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
8 #If you have issues running this script, contact Sukhdeep Singh (nabsukh@gmail.com)
9 
10 cosmo=csmm.FlatLambdaCDM(70.,0.3,Tcmb0=2.725)
11 cosmo_h=cosmo.clone(H0=100)
12 c=c.to(u.km/u.second)
13 
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}
17 
18 class Power_Spectra():
19  def __init__(self,cosmo_params=cosmo_fid,pk_params=pk_params,cosmo=cosmo,cosmo_h=None):
20  self.cosmo_params=cosmo_params
21  self.pk_params=pk_params
22  self.cosmo=cosmo
23 
24  if not cosmo_h:
25  self.cosmo_h=cosmo.clone(H0=100)
26  else:
27  self.cosmo_h=cosmo_h
28 
29  def ccl_pk(self,z,cosmo_params=None,pk_params=None):
30  if not cosmo_params:
31  cosmo_params=self.cosmo_params
32  if not pk_params:
33  pk_params=self.pk_params
34 
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'])
40  nz=len(z)
41  ps=np.zeros((nz,pk_params['nk']))
42  ps0=[]
43  z0=9.#PS(z0) will be rescaled using growth function when CCL fails.
44 
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'] #factors of h to get in same units as camb output
51 
52  def cl_z(self,z=[],l=np.arange(3000)+1,pk_params=None,cosmo_h=None,cosmo=None,pk_func=None):
53  if not cosmo_h:
54  cosmo_h=self.cosmo_h
55 
56  nz=len(z)
57  nl=len(l)
58 
59  pk,kh=pk_func(z=z,pk_params=pk_params)
60 
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#because camb k in h/mpc
64  lz=kh*DC_i-0.5
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))
68  return cls
69 
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)):
73  if not cosmo_h:
74  cosmo_h=self.cosmo_h
75 
76  if log_zl:#bins for z_lens.
77  zl=np.logspace(np.log10(max(zl_min,1.e-4)),np.log10(zl_max),n_zl)
78  else:
79  zl=np.linspace(zl_min,zl_max,n_zl)
80 
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)
88 
89  dzl=np.gradient(zl)
90  dzs1=np.gradient(zs1) if len(zs1)>1 else 1
91  dzs2=np.gradient(zs2) if len(zs2)>1 else 1
92 
93  cl_zs_12=np.einsum('ji,ki,il',sigma_c2,sigma_c1*dzl,clz)#integrate over zl..
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)
96  f=l*(l+1.)/(l+0.5)**2 #correction from Kilbinger+ 2017
97  cl*=f**2
98  return l,cl
99 
100 
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)
104 
105  plt.figure()
106  plt.plot(l,cl2)
107  plt.loglog()
108  plt.xlabel('$\\ell$',fontsize=16)
109  plt.ylabel('$C^{\\kappa\\kappa}_\\ell$',fontsize=16)
110  plt.show()
111 
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)
Definition: cl_cmbl_bm.py:19
static T max(const std::vector< T > &data)
Definition: core_app.cpp:61
def cl_z(self, z=[], l=np.arange(3000)+1, pk_params=None, cosmo_h=None, cosmo=None, pk_func=None)
Definition: cl_cmbl_bm.py:52
def ccl_pk(self, z, cosmo_params=None, pk_params=None)
Definition: cl_cmbl_bm.py:29
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))
Definition: cl_cmbl_bm.py:72