Fast Methods for Cosmological Simulations
FastSim serves as a tool for quick N-body simulations in modified gravity.
cl_cmblx_bm.py
Go to the documentation of this file.
1 import pyccl
2 import math
3 import numpy as np
4 from scipy.interpolate import interp1d
5 from astropy.cosmology import Planck15 as cosmo
6 from astropy.constants import c,G
7 from astropy import units as u
8 from scipy.integrate import quad as scipy_int1d
9 
10 c=c.to(u.km/u.second)
11 
12 cosmo_fid=dict({'h':0.7,'s8':0.8,'Omc':0.3,'Og':0.0,'Omb':0.0,'Om':0.3,'m_nu':[0,0,0],
13  'Neff':3.046,'Omk':0,'tau':0.06,'ns':0.96, 'Tcmb0':0})
14 
15 # Reset astropy cosmology parameters to cosmo_fid. This is assuming flat LCDM and hence Omega_k=0
16 cosmo=cosmo.clone(H0=cosmo_fid['h']*100,Ob0=cosmo_fid['Omb'],Om0=cosmo_fid['Om'],
17  m_nu=cosmo_fid['m_nu']*u.eV,Neff=cosmo_fid['Neff'],Tcmb0=cosmo_fid['Tcmb0'])
18 cosmo_h=cosmo.clone(H0=100)
19 
20 pk_params={'non_linear':0,'kmax':1E3,'kmin':5.e-5,'nk':5000}
21 
22 class Power_Spectra():
23  def __init__(self,cosmo_params=cosmo_fid,pk_params=pk_params,cosmo=cosmo,cosmo_h=None):
24  self.cosmo_params=cosmo_params
25  self.pk_params=pk_params
26  self.cosmo=cosmo
27 
28  if not cosmo_h:
29  self.cosmo_h=cosmo.clone(H0=100)
30  else:
31  self.cosmo_h=cosmo_h
32 
33  def Rho_crit(self,cosmo_h=None):
34  if not cosmo_h:
35  cosmo_h=self.cosmo_h
36  G2=G.to(u.Mpc/u.Msun*u.km**2/u.second**2)
37  rc=3*self.cosmo_h.H0**2/(8*np.pi*G2)
38  rc=rc.to(u.Msun/u.pc**2/u.Mpc)# unit of Msun/pc^2/mpc
39  return rc
40 
41  def DZ_int(self,z=[0],cosmo=None): #linear growth factor.. full integral.. eq 63 in Lahav and suto
42  if not cosmo:
43  cosmo=self.cosmo
44  def intf(z):
45  return (1+z)/(cosmo.H(z).value)**3
46  j=0
47  Dz=np.zeros_like(z,dtype='float32')
48 
49  for i in z:
50  Dz[j]=cosmo.H(i).value*scipy_int1d(intf,i,np.inf,epsrel=1.e-6,epsabs=1e-6)[0]
51  j=j+1
52  Dz*=(2.5*cosmo.Om0*cosmo.H0.value**2)
53  return Dz/Dz[0]
54 
55  def sigma_crit(self,zl=[],zs=[],cosmo_h=None):
56  if not cosmo_h:
57  cosmo_h=self.cosmo_h
58  ds=cosmo_h.comoving_transverse_distance(zs)
59  dl=cosmo_h.comoving_transverse_distance(zl)
60  ddls=1-np.multiply.outer(1./ds,dl)#(ds-dl)/ds
61  w=(3./2.)*((cosmo_h.H0/c)**2)*(1+zl)*dl/self.Rho_crit(cosmo_h)
62  sigma_c=1./(ddls*w)
63  x=ddls<=0 #zs<zl
64  sigma_c[x]=np.inf
65  return sigma_c
66 
67  def ccl_pk_bbks(self,z,cosmo_params=None,pk_params=None):
68  if not cosmo_params:
69  cosmo_params=self.cosmo_params
70  if not pk_params:
71  pk_params=self.pk_params
72 
73  cosmo_ccl=pyccl.Cosmology(h=cosmo_params['h'],Omega_c=cosmo_params['Omc'],Omega_b=cosmo_params['Omb'],
74  sigma8=cosmo_params['s8'],n_s=cosmo_params['ns'],
75  transfer_function='bbks', matter_power_spectrum='linear',
76  Omega_g=cosmo_params['Og'])
77  #m_nu=cosmo_params['m_nu'],Neff=cosmo_params['Neff'])
78  kh=np.logspace(np.log10(pk_params['kmin']),np.log10(pk_params['kmax']),pk_params['nk'])
79  nz=len(z)
80  ps=np.zeros((nz,pk_params['nk']))
81  ps0=[]
82  z0=9.#PS(z0) will be rescaled using growth function when CCL fails.
83 
84  pyccl_pkf=pyccl.linear_matter_power
85  if pk_params['non_linear']==1:
86  pyccl_pkf=pyccl.nonlin_matter_power
87  for i in np.arange(nz):
88  try:
89  ps[i]= pyccl_pkf(cosmo_ccl,kh,1./(1+z[i]))
90  except Exception as err:
91  print ('CCL err',err,z[i])
92  if not np.any(ps0):
93  ps0=pyccl.linear_matter_power(cosmo_ccl,kh,1./(1.+z0))
94  Dz=self.DZ_int(z=[z0,z[i]])
95  ps[i]=ps0*(Dz[1]/Dz[0])**2
96  return ps*cosmo_params['h']**3,kh/cosmo_params['h'] #factors of h to get in same units as camb output
97 
98  def cl_z(self,z=[],l=np.arange(3000)+1,pk_params=None,cosmo_h=None,
99  cosmo=None,pk_func=None):
100  if not cosmo_h:
101  cosmo_h=self.cosmo_h
102  if not pk_func:
103  pk_func=self.camb_pk_too_many_z
104 
105  nz=len(z)
106  nl=len(l)
107 
108  pk,kh=pk_func(z=z,pk_params=pk_params)
109 
110  cls=np.zeros((nz,nl),dtype='float32')*u.Mpc
111  for i in np.arange(nz):
112  DC_i=cosmo_h.comoving_transverse_distance(z[i]).value#because camb k in h/mpc
113  lz=kh*DC_i-0.5
114  DC_i=cosmo_h.comoving_transverse_distance(z[i]).value
115  pk_int=interp1d(lz,pk[i]/DC_i**2,bounds_error=False,fill_value=0)
116  cls[i][:]+=pk_int(l)*u.Mpc
117  return cls
118 
119  def kappa_cl(self,zl_min=1.e-4,zl_max=1100,n_zl=10,log_zl=False,pk_func=None,
120  zs1=[1100],p_zs1=[1],zs2=[1100],p_zs2=[1],
121  pk_params=None,cosmo_h=None,l=np.arange(0,3001)):
122  if not cosmo_h:
123  cosmo_h=self.cosmo_h
124 
125  if log_zl:#bins for z_lens.
126  zl=np.logspace(np.log10(max(zl_min,1.e-4)),np.log10(zl_max),n_zl)
127  else:
128  zl=np.linspace(zl_min,zl_max,n_zl)
129 
130  clz=self.cl_z(z=zl,l=l,cosmo_h=cosmo_h,pk_params=pk_params,pk_func=pk_func)
131  # P(z,k=(l+05)/chi(z))/chi(z)^2 [nz,nl]
132  clz=(clz.T*(c/(cosmo_h.efunc(zl)*cosmo_h.H0))).T
133  # P(z,k=(l+0.5)/chi(z))/(chi(z)^2 H(z)) [nz,nl]
134  #clz*=(c/(cosmo_h.efunc(zl)*cosmo_h.H0))
135 
136  rho=self.Rho_crit(cosmo_h=cosmo_h)*cosmo_h.Om0
137  sigma_c1=rho/self.sigma_crit(zl=zl,zs=zs1,cosmo_h=cosmo_h) # 3/2 H0^2 (1+zl) chi(zl) * (1 - chi(zl)/chi(zs)) [n_zs,n_zl]
138  sigma_c2=rho/self.sigma_crit(zl=zl,zs=zs2,cosmo_h=cosmo_h)
139 
140  dzl=np.gradient(zl)
141  dzs1=np.gradient(zs1) if len(zs1)>1 else 1
142  dzs2=np.gradient(zs2) if len(zs2)>1 else 1
143 
144  cl_zs_12=np.einsum('ji,ki,il',sigma_c2,sigma_c1*dzl,clz)#integrate over zl..
145  cl=np.dot(p_zs2*dzs2,np.dot(p_zs1*dzs1,cl_zs_12))
146  #Integral[ P(z,k=(l+0.5)/chi(z))/(H(z) chi(z)^2) Integral[3/2 H0^2 (1+z) p(zs1) chi(z) (1-chi(z)/chi(zs1)), dzs1] Integral[3/2 H0^2 (1+zl) chi(zl) (1+chi(zl)/chi(zs2)), dzs2], dz]
147  cl/=np.sum(p_zs2*dzs2)*np.sum(p_zs1*dzs1)
148  f=l*(l+1.)/(l+0.5)**2 #correction from Kilbinger+ 2017
149  cl*=f**2
150  #cl*=2./np.pi #comparison with CAMB requires this.
151  return l,cl
152 
153 
154  def g_kappa_cl(self,pk_func=None,zs=[1100],p_zs=[1],zg=[1],p_zg=[1],bias_g=1,
155  pk_params=None,cosmo_h=None,l=np.arange(0,3001)):
156  if not cosmo_h:
157  cosmo_h=self.cosmo_h
158 
159  clz=self.cl_z(z=zg,l=l,cosmo_h=cosmo_h,pk_params=pk_params,pk_func=pk_func) # p(k)/chi**2
160  clz*=bias_g
161 
162  rho=self.Rho_crit(cosmo_h=cosmo_h)*cosmo_h.Om0
163  sigma_c=rho/self.sigma_crit(zl=zg,zs=zs,cosmo_h=cosmo_h)
164  dzg=np.gradient(zg) if len(zg)>1 else 1
165  dzs=np.gradient(zs) if len(zs)>1 else 1
166 
167  cl_zs_12=np.dot(sigma_c*dzg*p_zg,clz)#integrate over zl..
168  cl=np.dot(p_zs*dzs,cl_zs_12)
169  cl/=np.sum(p_zs*dzs)*np.sum(p_zg*dzg)
170  return l,cl
171 
172 
173 if __name__ == "__main__":
174 
176  #CMB lensing x galaxy clustering
177  #Binned 1
178  zg=np.genfromtxt('../codecomp_step2_outputs/bin1_histo.txt',
179  names=('z','pz'))
180  l,cl_g_cmb=PS.g_kappa_cl(pk_func=PS.ccl_pk_bbks,zs=[1100],p_zs=[1],zg=zg['z'],p_zg=zg['pz'],bias_g=1,)
181  np.savetxt("../codecomp_step2_outputs/run_b1b1histo_log_cl_dc.txt",np.column_stack((l,cl_g_cmb)),fmt=['%i','%.18e'])
182 
183  #Binned 2
184  zg=np.genfromtxt('../codecomp_step2_outputs/bin2_histo.txt',
185  names=('z','pz'))
186  l,cl_g_cmb=PS.g_kappa_cl(pk_func=PS.ccl_pk_bbks,zs=[1100],p_zs=[1],zg=zg['z'],p_zg=zg['pz'],bias_g=1,)
187  np.savetxt("../codecomp_step2_outputs/run_b2b2histo_log_cl_dc.txt",np.column_stack((l,cl_g_cmb)),fmt=['%i','%.18e'])
188 
189  #Analytic
190  sigz1=0.15
191  zav=np.linspace(0,10.,10000)
192  pza=1./(np.sqrt(2*math.pi)*sigz1)*np.exp(-0.5*((zav-1)/sigz1)**2)
193  za={'z':zav,'pz':pza}
194  l,cl_g_cmb=PS.g_kappa_cl(pk_func=PS.ccl_pk_bbks,zs=[1100],p_zs=[1],zg=za['z'],p_zg=za['pz'],bias_g=1,)
195  np.savetxt("../codecomp_step2_outputs/run_b1b1analytic_log_cl_dc.txt",np.column_stack((l,cl_g_cmb)),fmt=['%i','%.18e'])
196 
197  #Analytic 2
198  pza=1./(np.sqrt(2*math.pi)*sigz1)*np.exp(-0.5*((zav-1.5)/sigz1)**2)
199  za={'z':zav,'pz':pza}
200  l,cl_g_cmb=PS.g_kappa_cl(pk_func=PS.ccl_pk_bbks,zs=[1100],p_zs=[1],zg=za['z'],p_zg=za['pz'],bias_g=1,)
201  np.savetxt("../codecomp_step2_outputs/run_b2b2analytic_log_cl_dc.txt",np.column_stack((l,cl_g_cmb)),fmt=['%i','%.18e'])
202 
203  #CMB lensing x galaxy lensing (kappa)
204  #Binned 1
205  zg=np.genfromtxt('../codecomp_step2_outputs/bin1_histo.txt',
206  names=('z','pz'))
207  l,cl_g_cmb=PS.kappa_cl(pk_func=PS.ccl_pk_bbks,n_zl=1000,zs2=zg['z'],p_zs2=zg['pz'],zl_max=10)
208  np.savetxt("../codecomp_step2_outputs/run_b1b1histo_log_cl_lc.txt",np.column_stack((l,cl_g_cmb)),fmt=['%i','%.18e'])
209 
210  #Binned 2
211  zg=np.genfromtxt('../codecomp_step2_outputs/bin2_histo.txt',
212  names=('z','pz'))
213  l,cl_g_cmb=PS.kappa_cl(pk_func=PS.ccl_pk_bbks,n_zl=1000,zs2=zg['z'],p_zs2=zg['pz'],zl_max=10)
214  np.savetxt("../codecomp_step2_outputs/run_b2b2histo_log_cl_lc.txt",np.column_stack((l,cl_g_cmb)),fmt=['%i','%.18e'])
215 
216  #Analytic
217  sigz1=0.15
218  zav=np.linspace(0,10.,10000)
219  pza=1./(np.sqrt(2*math.pi)*sigz1)*np.exp(-0.5*((zav-1)/sigz1)**2)
220  za={'z':zav,'pz':pza}
221  l,cl_g_cmb=PS.kappa_cl(pk_func=PS.ccl_pk_bbks,n_zl=1000,zs2=za['z'],p_zs2=za['pz'],zl_max=10)
222  np.savetxt("../codecomp_step2_outputs/run_b1b1analytic_log_cl_lc.txt",np.column_stack((l,cl_g_cmb)),fmt=['%i','%.18e'])
223 
224  #Analytic 2
225  pza=1./(np.sqrt(2*math.pi)*sigz1)*np.exp(-0.5*((zav-1.5)/sigz1)**2)
226  za={'z':zav,'pz':pza}
227  l,cl_g_cmb=PS.kappa_cl(pk_func=PS.ccl_pk_bbks,n_zl=1000,zs2=za['z'],p_zs2=za['pz'],zl_max=10)
228  np.savetxt("../codecomp_step2_outputs/run_b2b2analytic_log_cl_lc.txt",np.column_stack((l,cl_g_cmb)),fmt=['%i','%.18e'])
def ccl_pk_bbks(self, z, cosmo_params=None, pk_params=None)
Definition: cl_cmblx_bm.py:67
def cl_z(self, z=[], l=np.arange(3000)+1, pk_params=None, cosmo_h=None, cosmo=None, pk_func=None)
Definition: cl_cmblx_bm.py:99
def Rho_crit(self, cosmo_h=None)
Definition: cl_cmblx_bm.py:33
def __init__(self, cosmo_params=cosmo_fid, pk_params=pk_params, cosmo=cosmo, cosmo_h=None)
Definition: cl_cmblx_bm.py:23
static T max(const std::vector< T > &data)
Definition: core_app.cpp:61
def kappa_cl(self, zl_min=1.e-4, 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(0, 3001))
Definition: cl_cmblx_bm.py:121
def sigma_crit(self, zl=[], zs=[], cosmo_h=None)
Definition: cl_cmblx_bm.py:55
def DZ_int(self, z=[0], cosmo=None)
Definition: cl_cmblx_bm.py:41
def g_kappa_cl(self, pk_func=None, zs=[1100], p_zs=[1], zg=[1], p_zg=[1], bias_g=1, pk_params=None, cosmo_h=None, l=np.arange(0, 3001))
Definition: cl_cmblx_bm.py:155