Ejemplo n.º 1
0
class tsz_gal_cl:
    def __init__(self):
        # print 'Class for tSZ Cl'
        # self.ptilde = np.loadtxt(LIBDIR+'/aux_files/ptilde.txt')
        self.fort_lib_cl = cdll.LoadLibrary(LIBDIR + "/source/calc_cl")

        self.fort_lib_cl.calc_cl_.argtypes = [
            POINTER(c_double),  #h0
            POINTER(c_double),  #obh2
            POINTER(c_double),  #och2
            POINTER(c_double),  #mnu
            POINTER(c_double),  #bias
            POINTER(c_double),  #Mcut
            POINTER(c_double),  #M1
            POINTER(c_double),  #kappa
            POINTER(c_double),  #sigma_Ncen
            POINTER(c_double),  #alp_Nsat
            POINTER(c_double),  #rmax
            POINTER(c_double),  #rgs
            POINTER(c_int64),  #pk_nk
            POINTER(c_int64),  #pk_nz
            np.ctypeslib.ndpointer(dtype=np.double),  #karr
            np.ctypeslib.ndpointer(dtype=np.double),  #pkarr
            np.ctypeslib.ndpointer(dtype=np.double),  #dndz
            POINTER(c_int64),  #nz_dndz
            POINTER(c_double),  #z1
            POINTER(c_double),  #z2
            POINTER(c_double),  #z1_ng
            POINTER(c_double),  #z2_ng
            POINTER(c_int64),  #nl
            np.ctypeslib.ndpointer(dtype=np.double),  #ell
            np.ctypeslib.ndpointer(dtype=np.double),  #gg
            np.ctypeslib.ndpointer(dtype=np.double),  #gy
            np.ctypeslib.ndpointer(dtype=np.double),  #tll
            POINTER(c_double),  #ng(z1<z<z2)
            POINTER(c_int64),  #flag_nu
            POINTER(c_int64),  #flag_tll
            POINTER(c_int64),  #nm
            POINTER(c_int64)  #nz
        ]
        self.fort_lib_cl.calc_cl_.restype = c_void_p

        # Calcualtion setup
        self.kmin = 1e-3
        self.kmax = 5.
        self.zmax = 4.  # should be consistent with fortran code
        self.nk_pk = 200
        self.nz_pk = 51

        # Class
        self.cosmo = Class()

    def get_tsz_cl(self, ell_arr, params, dndz, z1, z2, z1_ng, z2_ng, nm, nz):
        self.zmin = z1
        self.zmax = z2
        obh2 = params['obh2']
        och2 = params['och2']
        As = params['As']
        ns = params['ns']
        mnu = params['mnu']
        mass_bias = params['mass_bias']
        Mcut = params['Mcut']
        M1 = params['M1']
        kappa = params['kappa']
        sigma_Ncen = params['sigma_Ncen']
        alp_Nsat = params['alp_Nsat']
        rmax = params['rmax']
        rgs = params['rgs']
        flag_nu_logic = params['flag_nu']
        flag_tll_logic = params['flag_tll']
        if type(flag_nu_logic) != bool:
            print 'flag_nu must be boolean.'
            sys.exit()
        if flag_nu_logic:
            flag_nu = 1
        else:
            flag_nu = 0
        if type(flag_tll_logic) != bool:
            print 'flag_tll must be boolean.'
            sys.exit()
        if flag_tll_logic:
            flag_tll = 1
        else:
            flag_tll = 0

        if 'theta' in params.keys():
            theta = params['theta']
            pars = {'output':'mPk','100*theta_s':theta,
                    'omega_b':obh2,'omega_cdm':och2,
                    'A_s':As,'n_s':ns,\
                    'N_ur':0.00641,'N_ncdm':1,'m_ncdm':mnu/3.,\
                    'T_ncdm':0.71611,\
                    'P_k_max_h/Mpc': self.kmax,'z_max_pk':self.zmax,\
                    'deg_ncdm':3.}
            self.cosmo.set(pars)
            self.cosmo.compute()
            h0 = self.cosmo.h()
        elif 'h0' in params.keys():
            h0 = params['h0']
            pars = {'output':'mPk','h':h0,
                    'omega_b':obh2,'omega_cdm':och2,
                    'A_s':As,'n_s':ns,\
                    'N_ur':0.00641,'N_ncdm':1,'m_ncdm':mnu/3.,\
                    'T_ncdm':0.71611,\
                    'P_k_max_h/Mpc': self.kmax,'z_max_pk':self.zmax,\
                    'deg_ncdm':3.}
            self.cosmo.set(pars)
            self.cosmo.compute()

        # get matter power spectra
        kh_arr = np.logspace(np.log10(self.kmin), np.log10(self.kmax),
                             self.nk_pk)
        kh = np.zeros((self.nz_pk, self.nk_pk))
        pk = np.zeros((self.nz_pk, self.nk_pk))
        pk_zarr = np.linspace(self.zmin, self.zmax, self.nz_pk)
        for i in range(self.nz_pk):
            kh[i, :] = kh_arr
            if flag_nu == 0:
                pk[i, :] = np.array([
                    self.cosmo.pk(k * h0, pk_zarr[i]) * h0**3 for k in kh_arr
                ])
            elif flag_nu == 1:
                pk[i, :] = np.array([
                    self.cosmo.pk_cb(k * h0, pk_zarr[i]) * h0**3
                    for k in kh_arr
                ])

        # params
        h0_in = byref(c_double(h0))
        obh2_in = byref(c_double(obh2))
        och2_in = byref(c_double(och2))
        mnu_in = byref(c_double(mnu))
        mass_bias_in = byref(c_double(mass_bias))
        Mcut_in = byref(c_double(Mcut))
        M1_in = byref(c_double(M1))
        kappa_in = byref(c_double(kappa))
        sigma_Ncen_in = byref(c_double(sigma_Ncen))
        alp_Nsat_in = byref(c_double(alp_Nsat))
        rmax_in = byref(c_double(rmax))
        rgs_in = byref(c_double(rgs))
        flag_nu_in = byref(c_int64(flag_nu))
        flag_tll_in = byref(c_int64(flag_tll))

        # dNdz
        nz_dndz = byref(c_int64(len(dndz)))

        # integration setting
        z1_in = byref(c_double(self.zmin))
        z2_in = byref(c_double(self.zmax))

        # outputs
        nl = len(ell_arr)
        cl_gg = np.zeros((2, nl))
        cl_gy = np.zeros((2, nl))
        tll = np.zeros((nl * 2, nl * 2))
        ng = c_double(0.0)
        nl = c_int64(nl)

        self.fort_lib_cl.calc_cl_(
                h0_in, obh2_in, och2_in, mnu_in,\
                mass_bias_in, \
                Mcut_in, M1_in, kappa_in, sigma_Ncen_in, alp_Nsat_in,\
                rmax_in, rgs_in,\
                byref(c_int64(self.nk_pk)), byref(c_int64(self.nz_pk)),\
                np.array(kh),np.array(pk),\
                np.array(dndz),nz_dndz,\
                z1_in, z2_in,\
                byref(c_double(z1_ng)),byref(c_double(z2_ng)),\
                nl,np.array(ell_arr),\
                cl_gg,cl_gy,tll,ng,\
                flag_nu_in,flag_tll_in,\
                c_int64(nm), c_int64(nz)
                )

        self.cosmo.struct_cleanup()
        return cl_gg, cl_gy, tll, ng.value
Ejemplo n.º 2
0
class tsz_cl:
    def __init__(self):
        self.fort_lib_cl = cdll.LoadLibrary(LIBDIR + "/source/calc_cl")
        self.fort_lib_cl.calc_cl_.argtypes = [
            POINTER(c_double),  #h0
            POINTER(c_double),  #obh2
            POINTER(c_double),  #och2
            POINTER(c_double),  #mnu
            POINTER(c_double),  #bias
            POINTER(c_int64),  #pk_nk
            POINTER(c_int64),  #pk_nz
            np.ctypeslib.ndpointer(dtype=np.double),  #karr
            np.ctypeslib.ndpointer(dtype=np.double),  #pkarr
            np.ctypeslib.ndpointer(dtype=np.double),  #pk_z_arr
            POINTER(c_int64),  #n_ell_ptilde
            np.ctypeslib.ndpointer(dtype=np.double),  #ell_ptilde
            np.ctypeslib.ndpointer(dtype=np.double),  #ptilde_arr
            POINTER(c_int64),  #nl
            np.ctypeslib.ndpointer(dtype=np.double),  #ell
            np.ctypeslib.ndpointer(dtype=np.double),  #yy
            np.ctypeslib.ndpointer(dtype=np.double),  #tll
            POINTER(c_int64),  #flag_nu
            POINTER(c_int64),  #flag_tll
            POINTER(c_double),  #zmin
            POINTER(c_double),  #zmax
            POINTER(c_double),  #Mmin 
            POINTER(c_double)  #Mmax
        ]
        self.fort_lib_cl.calc_cl_.restype = c_void_p

        self.fort_lib_by = cdll.LoadLibrary(LIBDIR + "/source/calc_by")
        self.fort_lib_by.calc_by_.argtypes = [
            POINTER(c_double),  #h0
            POINTER(c_double),  #obh2
            POINTER(c_double),  #och2
            POINTER(c_double),  #mnu
            POINTER(c_double),  #bias
            POINTER(c_int64),  #pk_nk
            np.ctypeslib.ndpointer(dtype=np.double),  #karr
            np.ctypeslib.ndpointer(dtype=np.double),  #pkarr
            POINTER(c_int64),  #n_ell_ptilde
            np.ctypeslib.ndpointer(dtype=np.double),  #ell_ptilde
            np.ctypeslib.ndpointer(dtype=np.double),  #ptilde_arr
            POINTER(c_int64),  #nz
            np.ctypeslib.ndpointer(dtype=np.double),  #z_arr
            np.ctypeslib.ndpointer(dtype=np.double),  #by_arr
            np.ctypeslib.ndpointer(dtype=np.double),  #dydz_arr
            POINTER(c_int64),  #flag_nu
            POINTER(c_double),  #Mmin 
            POINTER(c_double)  #Mmax
        ]
        self.fort_lib_by.calc_by_.restype = c_void_p

        self.fort_lib_dydzdMh = cdll.LoadLibrary(LIBDIR +
                                                 "/source/calc_dydzdMh")
        self.fort_lib_dydzdMh.calc_dydzdmh_.argtypes = [
            POINTER(c_double),  #h0
            POINTER(c_double),  #obh2
            POINTER(c_double),  #och2
            POINTER(c_double),  #mnu
            POINTER(c_double),  #bias
            POINTER(c_int64),  #pk_nk
            POINTER(c_int64),  #pk_nz
            np.ctypeslib.ndpointer(dtype=np.double),  #karr
            np.ctypeslib.ndpointer(dtype=np.double),  #pkarr
            POINTER(c_int64),  #n_ell_ptilde
            np.ctypeslib.ndpointer(dtype=np.double),  #ell_ptilde
            np.ctypeslib.ndpointer(dtype=np.double),  #ptilde_arr
            POINTER(c_double),  # z
            POINTER(c_double),  # Mh
            POINTER(c_double),  # dydzdMh
            POINTER(c_int64),  #flag_nu
        ]
        self.fort_lib_dydzdMh.calc_dydzdmh_.restype = c_void_p

        # Calcualtion setup
        self.kmin = 1e-3
        self.kmax = 5.
        self.zmin = 1e-5
        self.zmax = 4.
        self.dz = 0.04
        self.nk_pk = 200
        self.nz_pk = int((self.zmax - self.zmin) / self.dz) + 1
        self.Mmin = 1e11
        self.Mmax = 5e15
        self.ptilde_in = np.loadtxt(LIBDIR + '/data/ptilde.txt')
        self.ell_ptilde = np.array(self.ptilde_in[:, 0])
        self.ptilde_arr = np.array(self.ptilde_in[:, 1])
        self.n_ptilde = len(self.ell_ptilde)

        # Class
        self.cosmo = Class()

    def get_tsz_cl(self,
                   ell_arr,
                   params,
                   zmin=None,
                   zmax=None,
                   Mmin=None,
                   Mmax=None):
        # integration range, optional
        if zmin == None: zmin = self.zmin
        if zmax == None: zmax = self.zmax
        nz_pk = int((zmax - zmin) / self.dz) + 1
        if Mmin == None: Mmin = self.Mmin
        if Mmax == None: Mmax = self.Mmax

        obh2 = params['obh2']
        och2 = params['och2']
        As = params['As']
        ns = params['ns']
        mnu = params['mnu']
        mass_bias = params['mass_bias']
        flag_nu_logic = params['flag_nu']
        flag_tll_logic = params['flag_tll']
        if type(flag_nu_logic) != bool:
            print('flag_nu must be boolean.')
            sys.exit()
        if type(flag_tll_logic) != bool:
            print('flag_tll must be boolean.')
            sys.exit()

        if flag_nu_logic:
            flag_nu = 1
        else:
            flag_nu = 0
        if flag_tll_logic:
            flag_tll = 1
        else:
            flag_tll = 0

        if 'theta' in params.keys():
            theta = params['theta']
            pars = {'output':'mPk','100*theta_s':theta,
                    'omega_b':obh2,'omega_cdm':och2,
                    'A_s':As,'n_s':ns,\
                    'N_ur':0.00641,'N_ncdm':1,'m_ncdm':mnu/3.,\
                    'T_ncdm':0.71611,\
                    'P_k_max_h/Mpc': self.kmax,'z_max_pk':self.zmax,\
                    'deg_ncdm':3.}
            self.cosmo.set(pars)
            self.cosmo.compute()
            h0 = self.cosmo.h()
        elif 'h0' in params.keys():
            h0 = params['h0']
            pars = {'output':'mPk','h':h0,
                    'omega_b':obh2,'omega_cdm':och2,
                    'A_s':As,'n_s':ns,\
                    'N_ur':0.00641,'N_ncdm':1,'m_ncdm':mnu/3.,\
                    'T_ncdm':0.71611,\
                    'P_k_max_h/Mpc': self.kmax,'z_max_pk':self.zmax,\
                    'deg_ncdm':3.}
            self.cosmo.set(pars)
            self.cosmo.compute()

        kh_arr = np.logspace(np.log10(self.kmin), np.log10(self.kmax),
                             self.nk_pk)
        kh = np.zeros((nz_pk, self.nk_pk))
        pk = np.zeros((nz_pk, self.nk_pk))
        pk_zarr = np.linspace(zmin, zmax, nz_pk + 1)
        for i in range(self.nz_pk):
            kh[i, :] = kh_arr
            if flag_nu == 0:
                pk[i, :] = np.array([
                    self.cosmo.pk(k * h0, pk_zarr[i]) * h0**3 for k in kh_arr
                ])
            elif flag_nu == 1:
                pk[i, :] = np.array([
                    self.cosmo.pk_cb(k * h0, pk_zarr[i]) * h0**3
                    for k in kh_arr
                ])

        ####  set variables for fortran codes ###
        nk = byref(c_int64(self.nk_pk))  # indx_z, indx_k
        nz = byref(c_int64(self.nz_pk))

        # params
        h0_in = byref(c_double(h0))
        obh2_in = byref(c_double(obh2))
        och2_in = byref(c_double(och2))
        mnu_in = byref(c_double(mnu))
        mass_bias_in = byref(c_double(mass_bias))
        flag_nu_in = byref(c_int64(flag_nu))
        flag_tll_in = byref(c_int64(flag_tll))
        zmin_in = byref(c_double(zmin))
        zmax_in = byref(c_double(zmax))
        Mmin_in = byref(c_double(Mmin))
        Mmax_in = byref(c_double(Mmax))

        # outputs
        nl = len(ell_arr)
        cl_yy = np.zeros((2, nl))
        tll = np.zeros((nl, nl))
        nl = c_int64(nl)

        self.fort_lib_cl.calc_cl_(
                h0_in, obh2_in, och2_in, mnu_in,\
                mass_bias_in, nk, nz,\
                np.array(kh),np.array(pk),np.array(pk_zarr),\
                byref(c_int64(self.n_ptilde)), self.ell_ptilde, self.ptilde_arr,\
                nl,np.array(ell_arr),\
                cl_yy,tll,\
                flag_nu_in,flag_tll_in,\
                zmin_in,zmax_in,\
                Mmin_in,Mmax_in
                )

        self.cosmo.struct_cleanup()
        return cl_yy, tll

    def get_by_dydz(self, z_arr, params, Mmin=None, Mmax=None):
        if Mmin == None: Mmin = self.Mmin
        if Mmax == None: Mmax = self.Mmax
        nz = len(z_arr)
        zmax = np.max(z_arr)

        obh2 = params['obh2']
        och2 = params['och2']
        As = params['As']
        ns = params['ns']
        mnu = params['mnu']
        mass_bias = params['mass_bias']
        flag_nu_logic = params['flag_nu']
        if type(flag_nu_logic) != bool:
            print('flag_nu must be boolean.')
            sys.exit()

        if flag_nu_logic:
            flag_nu = 1
        else:
            flag_nu = 0

        if 'theta' in params.keys():
            theta = params['theta']
            pars = {'output':'mPk','100*theta_s':theta,
                    'omega_b':obh2,'omega_cdm':och2,
                    'A_s':As,'n_s':ns,\
                    'N_ur':0.00641,'N_ncdm':1,'m_ncdm':mnu/3.,\
                    'T_ncdm':0.71611,\
                    'P_k_max_h/Mpc': self.kmax,'z_max_pk':zmax,\
                    'deg_ncdm':3.}
            self.cosmo.set(pars)
            self.cosmo.compute()
            h0 = self.cosmo.h()
        elif 'h0' in params.keys():
            h0 = params['h0']
            pars = {'output':'mPk','h':h0,
                    'omega_b':obh2,'omega_cdm':och2,
                    'A_s':As,'n_s':ns,\
                    'N_ur':0.00641,'N_ncdm':1,'m_ncdm':mnu/3.,\
                    'T_ncdm':0.71611,\
                    'P_k_max_h/Mpc': self.kmax,'z_max_pk':zmax,\
                    'deg_ncdm':3.}
            self.cosmo.set(pars)
            self.cosmo.compute()

        kh_arr = np.logspace(np.log10(self.kmin), np.log10(self.kmax),
                             self.nk_pk)
        kh = np.zeros((nz, self.nk_pk))
        pk = np.zeros((nz, self.nk_pk))
        for i in range(nz):
            kh[i, :] = kh_arr
            if flag_nu == 0:
                pk[i, :] = np.array(
                    [self.cosmo.pk(k * h0, z_arr[i]) * h0**3 for k in kh_arr])
            elif flag_nu == 1:
                pk[i, :] = np.array([
                    self.cosmo.pk_cb(k * h0, z_arr[i]) * h0**3 for k in kh_arr
                ])

        ####  set variables for fortran codes ###
        nk = byref(c_int64(self.nk_pk))  # indx_z, indx_k

        # params
        h0_in = byref(c_double(h0))
        obh2_in = byref(c_double(obh2))
        och2_in = byref(c_double(och2))
        mnu_in = byref(c_double(mnu))
        mass_bias_in = byref(c_double(mass_bias))
        flag_nu_in = byref(c_int64(flag_nu))

        # outputs
        by_arr = np.zeros(nz)
        dydz_arr = np.zeros(nz)
        nz = c_int64(nz)
        Mmin_in = byref(c_double(Mmin))
        Mmax_in = byref(c_double(Mmax))

        self.fort_lib_by.calc_by_(
                h0_in, obh2_in, och2_in, mnu_in, \
                mass_bias_in, nk, \
                np.array(kh),np.array(pk), \
                byref(c_int64(self.n_ptilde)), self.ell_ptilde, self.ptilde_arr,\
                nz,np.array(z_arr), \
                by_arr,dydz_arr, \
                flag_nu_in, \
                Mmin_in, Mmax_in
                )

        self.cosmo.struct_cleanup()
        return by_arr, dydz_arr

    def get_dydzdlogMh(self, z, Mh, params):
        obh2 = params['obh2']
        och2 = params['och2']
        As = params['As']
        ns = params['ns']
        mnu = params['mnu']
        mass_bias = params['mass_bias']
        flag_nu_logic = params['flag_nu']
        if type(flag_nu_logic) != bool:
            print('flag_nu must be boolean.')
            sys.exit()

        if flag_nu_logic:
            flag_nu = 1
        else:
            flag_nu = 0

        if 'theta' in params.keys():
            theta = params['theta']
            pars = {'output':'mPk','100*theta_s':theta,
                    'omega_b':obh2,'omega_cdm':och2,
                    'A_s':As,'n_s':ns,\
                    'N_ur':0.00641,'N_ncdm':1,'m_ncdm':mnu/3.,\
                    'T_ncdm':0.71611,\
                    'P_k_max_h/Mpc': self.kmax,'z_max_pk':z,\
                    'deg_ncdm':3.}
            self.cosmo.set(pars)
            self.cosmo.compute()
            h0 = self.cosmo.h()
        elif 'h0' in params.keys():
            h0 = params['h0']
            pars = {'output':'mPk','h':h0,
                    'omega_b':obh2,'omega_cdm':och2,
                    'A_s':As,'n_s':ns,\
                    'N_ur':0.00641,'N_ncdm':1,'m_ncdm':mnu/3.,\
                    'T_ncdm':0.71611,\
                    'P_k_max_h/Mpc': self.kmax,'z_max_pk':z,\
                    'deg_ncdm':3.}
            self.cosmo.set(pars)
            self.cosmo.compute()

        kh_arr = np.logspace(np.log10(self.kmin), np.log10(self.kmax),
                             self.nk_pk)
        kh = np.zeros((1, self.nk_pk))
        pk = np.zeros((1, self.nk_pk))
        kh[0, :] = kh_arr
        if flag_nu == 0:
            pk[0, :] = np.array(
                [self.cosmo.pk(k * h0, z) * h0**3 for k in kh_arr])
        elif flag_nu == 1:
            pk[0, :] = np.array(
                [self.cosmo.pk_cb(k * h0, z) * h0**3 for k in kh_arr])

        ####  set variables for fortran codes ###
        nk = byref(c_int64(self.nk_pk))  # indx_z, indx_k
        nz = byref(c_int64(1))

        # params
        h0_in = byref(c_double(h0))
        obh2_in = byref(c_double(obh2))
        och2_in = byref(c_double(och2))
        mnu_in = byref(c_double(mnu))
        mass_bias_in = byref(c_double(mass_bias))
        flag_nu_in = byref(c_int64(flag_nu))

        # outputs
        z_in = byref(c_double(z))
        Mh_in = byref(c_double(Mh))
        dydzdMh = c_double(0.0)

        self.fort_lib_dydzdMh.calc_dydzdmh_(
                h0_in, obh2_in, och2_in, mnu_in, \
                mass_bias_in, nk, nz, \
                np.array(kh),np.array(pk), \
                byref(c_int64(self.n_ptilde)), self.ell_ptilde, self.ptilde_arr,\
                z_in,Mh_in, \
                dydzdMh, \
                flag_nu_in \
                )

        self.cosmo.struct_cleanup()
        return dydzdMh.value