今天再补一个关于camb计算线性/非线性功率谱的坑。
camb在初始化时会有一个 pars.NonLinear 设置,设为 model.NonLinear_both 表示同时计算线性/非线性功率谱, model.NonLinear_none 表示计算线性功率谱,起初我以为设为 model.NonLinear_none 就可以得到的 results.get_matter_power_interpolator(k_hunit=True, hubble_units=True) 这样得到的功率谱是线性功率谱,结果画图一对比发现和非线性功率谱结果相差不大($k>0.2$)。经过一番研究发现:计算功率谱结果的函数 results.get_matter_power_interpolator 里面还有一个参数 nonlinear = True/False ,不论上述 pars.NonLinear 怎么设置,只有当 nonlinear 取False输出才是线性功率谱。代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 import cambimport numpy as npimport matplotlib.pyplot as pltfrom astropy.cosmology import Planck18from camb import model, initialpowerfrom matplotlib.gridspec import GridSpecfrom matplotlib.ticker import FuncFormatterk = np.linspace(1.e-2 ,1 , 10 ) rz_center = 0.3 pars = camb.read_ini('./planck18.ini' ) pars.Transfer.kmin = 0 pars.Transfer.kmax = 1 pars.set_matter_power(redshifts=[rz_center]) pars.NonLinear = model.NonLinear_none results = camb.get_results(pars) PK = results.get_matter_power_interpolator(k_hunit=True , hubble_units=True , nonlinear=False ) ps_matter = PK.P(rz_center, k) np.save(h5_path+'matter_ps_linear.npy' , ps_matter) print (ps_matter)pars = camb.read_ini('./planck18.ini' ) pars.Transfer.kmin = 0 pars.Transfer.kmax = 1 pars.set_matter_power(redshifts=[rz_center]) pars.NonLinear = model.NonLinear_both results = camb.get_results(pars) PK = results.get_matter_power_interpolator(k_hunit=True , hubble_units=True , nonlinear=True ) ps_matter = PK.P(rz_center, k) np.save(h5_path+'matter_ps_nonlinear.npy' , ps_matter) print (ps_matter)