继续阅读
当前页面用冻结反应网格复算小网络,并传播主要反应率误差
宇宙最初几分钟与轻元素 · 阅读路径
读完这篇方法指南,你会在自己的电脑上重跑配套 Lab 背后的十二反应网络,用三份已发表的资料核对它,并重建它的核反应率误差预算。只需要 Python 3.9 或更新版本,不需要任何第三方包。请把三份资料放在手边:Serpico 等人,arXiv:astro-ph/0408076v3 附录 E 中的反应率拟合,Pitrou 等人的 PRIMAT 论文,arXiv:1801.08023v3 的表 V,以及 Fields 等人,arXiv:1912.01132v1 的表 II。
一个核合成网络的大部分计算量,花在只依赖温度的量上:热核反应率、中子质子之间的弱反应率,以及光子电子等离子体的能量密度。只要把弱反应率写成以 为单位,这些量就都与重子密度、额外辐射和中子寿命无关。程序包在 173 个温度点 上把它们算一次,存进 frozen-rate-grid.json。网络读入网格,在 上插值,任意改变 、 或 重算一次都不到一秒。Lab 用的是逐字节相同的同一份网格。
程序包是原创代码,采用 MIT 许可,不含第三方代码;Serpico 的系数和 AME2020 的质量是转录的数字,在使用它们的文件里注明了出处。
| 文件 | 作用 |
|---|---|
| physical_constants.py、nuclear_data.py | 常数、AME2020 质量过剩和自旋、十二个反应 |
| serpico_rate_fits.py、rate_fit_windows.py | 十一个 Serpico 拟合及其一倍标准差拟合,以及每个拟合可信的温度窗口 |
| weak_rates.py、plasma_thermodynamics.py、numerical_quadrature.py | 玻恩近似弱反应率;光子、电子和中微子热力学 |
| build_frozen_rate_grid.py | 由上面的模块生成网格 |
| network_solver.py | 只由网格驱动的网络 |
| propagate_rate_uncertainties.py | 敏感度、一倍标准差预算、蒙特卡罗 |
| replay.py、input.json、expected.json | 完整复算脚本、输入和保存的结果 |
| teaching_values.py、teaching-values.json | 课程各章引用的全部数值 |
| README.md、provenance.json、LICENSE.txt、write_manifest.py、MANIFEST.json | 命令和单位、来源、许可,以及每个文件的大小和 SHA-256 摘要 |
下载链接:MANIFEST.json、input.json、expected.json、frozen-rate-grid.json、teaching-values.json 和 provenance.json。Python 文件的地址规律相同,每个文件名一个地址。
读任何数字之前,先把这些弄清楚。
把文件放进一个新建的空文件夹。如果用镜像站,替换主机名即可。
mkdir bbn-frozen-rate-network && cd bbn-frozen-rate-network
base=https://sandboxphysics.com/stories/primordial-nucleosynthesis/materials
curl -fsSO "$base/MANIFEST.json"
for name in $(python3 -c "import json; print(' '.join(f['name'] for f in json.load(open('MANIFEST.json'))['files']))"); do
curl -fsSO "$base/$name"
done
python3 -c "import hashlib, json; bad=[f['name'] for f in json.load(open('MANIFEST.json'))['files'] if hashlib.sha256(open(f['name'],'rb').read()).hexdigest()!=f['sha256']]; print('digests OK' if not bad else bad)"最后一行应当打印 digests OK。只要有一个对外提供的文件与 MANIFEST.json 中的大小和摘要不符,本站的构建就会停止;出现不符,就说明文件离开本站之后被改动过。
python3 -B replay.py actual-result.json运行约两分钟,输出
wrote actual-result.json
PASSreplay.py 会由 Python 模块重建网格并与保存的网格比较,重跑 input.json 中的每个情形,重新计算基准比较、敏感度、误差预算和蒙特卡罗,然后以 的相对容差逐个与 expected.json 比较。保存的 gridRebuildMaxDifference 恰好是 :保存的网格正是这些模块生成的。
程序包只在 macOS 上的 CPython 3.9.6 运行过。换一个平台,math.exp 的最后几位可能不同,刚性求解器可能把差别放大到超过 。如果看到 FAIL,而差别出现在第七、八位有效数字,就改用下面基准比较里的物理容差判断;如果差在第三位,那就是真出了问题。
input.json 有五个情形:标准宇宙()、重子稀少()、重子丰富()、额外辐射()和辐射不足()。每个情形都用 2000 步和 Lab 的 1000 步各算一次。标准情形在 expected.json 中是:
{
"heliumMassFraction": 0.2423956078641409,
"deuteriumToHydrogen": 2.5482022079050184e-05,
"helium3ToHydrogen": 1.018552513743762e-05,
"lithium7ToHydrogen": 4.5131264294261034e-10,
"baryonNumberSum": 0.999999999999992
}用 Lab 的 1000 步,D/H 是 ;用 4000 步是 。所以 Lab 的时间步误差在 D/H 上约 0.4%,其他输出更小。
expected.json 的 benchmarks 部分把网络和三份已发表的计算作比较。每项比较检验的东西不同,按下面的顺序读。
这些结果用的是与网络相同的反应率拟合,所以检验的是转录和网络本身,而不是物理。Serpico 以 给出结果,取 ,并有 ;input.json 记下了这两点。在 、 和 处,网络复现的 D/H 相差不到 0.4%,氦三不到 0.8%,锂七偏低 1.1% 到 2.5%。常见的误读是把这种一致当作网络准确的证明。它只说明拟合抄对了、积分也对了;里面的物理仍是 2004 年的物理。
PRIMAT 列出了弱反应率的每项修正怎样移动丰度,起点是玻恩近似,也就是教程实现的那一级。在 PRIMAT 的输入 、 下,网络给出 ,PRIMAT 是 ,相差 。这检验的是弱反应率、等离子体热力学和时钟。这里只比较氦。PRIMAT 用的是自己的核反应率,所以它的 D/H 和锂 不是基于 2004 年拟合的网络应当对上的目标;网络给出的是 和 。同一张表还显示,教程略去的修正会把 提高到 。
Fields 在 、 处列出对数敏感度。对于与该表共有的输入,网络复现了全部 60 个数,差别都不超过 ;最大的一项是锂对 的敏感度, 对 。敏感度检验的是网络响应的形状,而不是绝对值,误差预算用的正是它们。
另有两项检查比较每多一种中微子时氦的斜率。网络给出 ;随 CLASS 程序发布的、基于 PRIMAT 的表 sBBN_2025_primat.dat 给出 ,评述给出 。
propagate_rate_uncertainties.py 把每个反应率误差当作对数正态分布:同一反应在不同温度下完全相关,不同反应之间相互独立。对一个标准正态数 ,反应率变为
一倍标准差预算每次只对一个反应取 和 ,记录 变化的一半;中子寿命移动 。在 处,平方和总误差是 D/H 0.69%、氦三 0.75%、锂七 1.76%。氦四只变 0.04%,几乎全部来自中子寿命。
蒙特卡罗用固定种子 20261112 抽取 200 组 ,所以能精确复现。它给出的相对标准差,D/H 0.72%、锂七 1.78%,与平方和结果一致。这种一致检验的是线性近似;只有 200 个样本,标准差本身带有约 5% 的统计误差。
要在别的重子密度下计算误差预算,可以直接调用模块:
from network_solver import FrozenGrid, load_grid
from propagate_rate_uncertainties import one_sigma_budget
grid = FrozenGrid(load_grid('frozen-rate-grid.json'))
budget = one_sigma_budget(grid, {'eta10': 5.0, 'neutron_lifetime': 878.4, 'steps': 2000})
print(budget['quadratureTotal'])python3 -B teaching_values.py my-teaching-values.json运行约十五秒,应当复现 teaching-values.json: 处的冻结点, 到 的时钟,247 秒时氦形成一半,平衡估算的氘温度,各组比较计算,以及由观测氘推出的重子密度 。
failureCases 部分保留了这个程序包必须避开的错误。每一条都可以拿去检验别的程序。
它的弱反应率只算到玻恩近似,中微子瞬间脱耦,所以与完整计算相比 低约 。它全程使用 2004 年的核反应率,所以给定 下的 D/H 不是当前最好的预言。它没有等离子体的量子电动力学修正,并把额外辐射当作从一开始就存在的常数 。与观测比较时这些限制很重要。上面每一项检查都是同类相比,结论仍然成立。
改任何设置前,先核对Lab默认结果和保存的复算结果一致。 打开轻元素反应网络Lab
当前页面用冻结反应网格复算小网络,并传播主要反应率误差
宇宙最初几分钟与轻元素 · 阅读路径