Fast Methods for Cosmological Simulations
FastSim serves as a tool for quick N-body simulations in modified gravity.
halomod_bm.py
Go to the documentation of this file.
1 import numpy as np
2 import pyccl as ccl
3 import matplotlib.pyplot as plt
4 from scipy.integrate import quad
5 from scipy.interpolate import interp1d
6 import os
7 from scipy.special import sici
8 
9 cpar1={'Om_m':0.3,'Om_b':0.05,'Om_nu':0.,
10  'h':0.70,'sig8':0.8,'n':0.96}
11 cpar2={'Om_m':0.272,'Om_b':0.0455,'Om_nu':0.,
12  'h':0.704,'sig8':0.81,'n':0.967}
13 cpar3={'Om_m':0.3175,'Om_b':0.0490,'Om_nu':0.,
14  'h':0.6711,'sig8':0.834,'n':0.9624}
15 
16 USE_INT=False
17 
18 LKHMIN=-4.
19 LKHMAX=1.
20 NKH=256
21 
22 NM=2048
23 LM0=5.5
24 LMMIN=6.
25 LMMAX=16.
26 
27 params={'DELTA_C':1.686470199841,
28  'ST_A': 0.322,
29  'ST_a': 0.707,
30  'ST_p': 0.3,
31  'DUF_A':7.85,
32  'DUF_B':-0.081,
33  'DUF_C':-0.71}
34 
35 def st_gs(sigma,dc) :
36  nu=dc/sigma
37  anu2=params['ST_a']*nu*nu
38  expnu=np.exp(-anu2*0.5)
39 
40  return params['ST_A']*np.sqrt(2*params['ST_a']/np.pi)*(1+(1./anu2)**params['ST_p'])*nu*expnu
41 
42 def st_b1(sigma,dc) :
43  nu=dc/sigma
44  anu2=params['ST_a']*nu*nu
45 
46  return 1+(anu2-1+2*params['ST_p']/(1+anu2**params['ST_p']))/params['DELTA_C']
47 
48 def duffy_c(m,z) :
49  return params['DUF_A']*(m/2E12)**params['DUF_B']*(1+z)**params['DUF_C']
50 
51 def get_halomod_pk(cp,karr,z,integrate=True,fname_out=None) :
52  cosmo=ccl.Cosmology(Omega_c=cp['Om_m']-cp['Om_b'],Omega_b=cp['Om_b'],h=cp['h'],
53  sigma8=cp['sig8'],n_s=cp['n'],
54  transfer_function='eisenstein_hu',matter_power_spectrum='linear')
55 
56  lmarr=LMMIN+(LMMAX-LMMIN)*(np.arange(NM)+0.5)/NM #log(M*h/M_sum)
57  dlm=(LMMAX-LMMIN)/NM
58  lmarrb=np.zeros(NM+2); lmarrb[0]=lmarr[0]-dlm; lmarrb[1:-1]=lmarr; lmarrb[-1]=lmarr[-1]+dlm
59  marr=10.**lmarr #M (in Msun/h) M_h Ms/h = M Ms
60  marrb=10.**lmarrb #M (in Msun/h) M_h Ms/h = M Ms
61  sigmarrb=ccl.sigmaM(cosmo,marrb/cp['h'],1./(1+z))
62  sigmarr=sigmarrb[1:-1]
63  dlsMdl10M=np.fabs((sigmarrb[2:]-sigmarrb[:-2])/(2*dlm))/sigmarr
64  omega_z=cp['Om_m']*(1+z)**3/(cp['Om_m']*(1+z)**3+1-cp['Om_m'])
65  delta_c=params['DELTA_C']*(1+0.012299*np.log10(omega_z))
66  Delta_v=(18*np.pi**2+82*(omega_z-1)-39*(omega_z-1)**2)/omega_z
67  fM=st_gs(sigmarr,delta_c)*dlsMdl10M
68  bM=st_b1(sigmarr,delta_c)
69  cM=duffy_c(marr,z)
70  cMf=interp1d(lmarr,cM,kind='linear',bounds_error=False,fill_value=cM[0])
71  rhoM=ccl.rho_x(cosmo,1.,'matter')/cp['h']**2
72 
73  #Compute mass function normalization
74  fM0=1-np.sum(fM)*dlm
75  fbM0=1-np.sum(fM*bM)*dlm
76 
77  rvM=(3*marr/(4*np.pi*rhoM*Delta_v))**0.333333333333
78  rsM=rvM/cM
79  rsM0=(3*10.**LM0/(4*np.pi*rhoM*Delta_v))**0.333333333/duffy_c(10.**LM0,z)
80  rsMf=interp1d(lmarr,rsM,kind='linear',bounds_error=False,fill_value=rsM0)
81 
82  f1hf=interp1d(lmarr,marr*fM/rhoM,kind='linear',bounds_error=False,fill_value=0)
83  f1h0=fM0*10.**LM0/rhoM
84  f2hf=interp1d(lmarr,fM*bM,kind='linear',bounds_error=False,fill_value=0)
85  f2h0=fbM0
86 
87  #NFW profile
88  def u_nfw(lm,k) :
89  x=k*rsMf(lm) #k*r_s
90  c=cMf(lm)
91  sic,cic=sici(x*(1+c))
92  six,cix=sici(x)
93  fsin=np.sin(x)*(sic-six)
94  fcos=np.cos(x)*(cic-cix)
95  fsic=np.sin(c*x)/(x*(1+c))
96  fcon=np.log(1.+c)-c/(1+c)
97 
98  return (fsin+fcos-fsic)/fcon
99 
100  def p1h(k) :
101  def integ(lm) :
102  u=u_nfw(lm,k)
103  f1h=f1hf(lm)
104  return u*u*f1h
105  if integrate :
106  return quad(integ,lmarr[0],lmarr[-1])[0]+f1h0*(u_nfw(LM0,k))**2
107  else :
108  return np.sum(integ(lmarr))*dlm+f1h0*(u_nfw(LM0,k))**2
109 
110  def b2h(k) :
111  def integ(lm) :
112  u=u_nfw(lm,k)
113  f2h=f2hf(lm)
114  return u*f2h
115  if integrate :
116  return quad(integ,lmarr[0],lmarr[-1])[0]+f2h0*u_nfw(LM0,k)
117  else :
118  return np.sum(integ(lmarr))*dlm+f2h0*u_nfw(LM0,k)
119 
120 
121  p1harr=np.array([p1h(kk) for kk in karr])
122  b2harr=np.array([b2h(kk) for kk in karr])
123  pklin=ccl.linear_matter_power(cosmo,karr*cp['h'],1./(1+z))*cp['h']**3
124 
125  p2harr=pklin*b2harr**2
126  ptarr=p1harr+p2harr
127  np.savetxt(fname_out,np.transpose([karr,pklin,p2harr,p1harr,ptarr]))
128  return pklin,pklin*b2harr**2,p1harr,pklin*b2harr**2+p1harr
129 
130 k_arr=10.**(LKHMIN+(LKHMAX-LKHMIN)*(np.arange(NKH)+0.5)/NKH)
131 for ip,cp in enumerate([cpar1,cpar2,cpar3]) :
132  for z in [0,1] :
133  get_halomod_pk(cp,k_arr,z+0.,integrate=USE_INT,fname_out='pk_hm_c%d_z%d.txt'%(ip+1,z))
def get_halomod_pk(cp, karr, z, integrate=True, fname_out=None)
Definition: halomod_bm.py:51
def st_b1(sigma, dc)
Definition: halomod_bm.py:42
def st_gs(sigma, dc)
Definition: halomod_bm.py:35
def duffy_c(m, z)
Definition: halomod_bm.py:48