抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

今天再补一个关于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 camb
import numpy as np
import matplotlib.pyplot as plt
from astropy.cosmology import Planck18
from camb import model, initialpower
from matplotlib.gridspec import GridSpec
from matplotlib.ticker import FuncFormatter

k = 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) # 单位(Mpc/h)^3
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) # 单位(Mpc/h)^3
ps_matter = PK.P(rz_center, k)

np.save(h5_path+'matter_ps_nonlinear.npy', ps_matter)
print(ps_matter)

评论



Powered by Hexo | Theme keep Volantis

本站总访问量 总访客数 🌎