继续阅读
当前页面对照萨哈、三能级原子与冻结的CLASS参考输出
宇宙怎样变透明 · 阅读路径
这篇教程用四个简短的Python脚本重跑实验室里的复合与频谱畸变模型,并与CLASS v3.3.4里冻结的参考文件对照。萨哈平衡在红移1100处比参考值低了30倍。在红移1500到100之间的采样点上,三能级原子与参考值相差不到4%;它在红移1092.0处达到光学深度1,参考值是1089.8;到红移50,偏差增长到8.8%。畸变形状通过了几项不重复使用其公式的检验。至于把畸变简单拆成化学势和康普顿两部分,在红移一万到十万之间与CLASS的表格差别很大,因为两者用的是不同的定义。
参考对象是CLASS仓库的v3.3.4标签,提交号e85808324f51fc694d12e3ed7439552a3c3f9540。GitHub上的CLASS v3.3.4 我们从中读取四个文件。为这一页,我们没有编译或运行CLASS、HyRec或CosmoTherm。下文所有“参考值”,都是这个发行版自带文件里印好的数值。
所有脚本只用Python 3标准库,运行环境是Python 3.9.6。材料放在本合集的材料文件夹里:
红移是无量纲的,脚本对 积分。密度以 计,速率以 计,能量在程序内部用焦耳、正文里用电子伏。频谱以 计,。背景参数取 、、、、氦质量分数 、。这些与CLASS里external/HyRec2020/input.dat一致,只是把那一种有质量的中微子当作无质量辐射处理。
mkdir ac75-check && cd ac75-check
base=https://sandboxphysics.com/stories/cosmic-transparency/materials
for name in ac75_model.py inputs.json run_recombination.py check_distortion_kernels.py compare_class_files.py hyrec-reference-extract.json; do curl -fsSLO "$base/$name"; done
python3 -I run_recombination.py inputs.json hyrec-reference-extract.json my-recombination-output.json
python3 -I check_distortion_kernels.py my-kernel-checks.json
git clone --depth 1 --branch v3.3.4 https://github.com/lesgourg/class_public.git
python3 -I compare_class_files.py class_public my-class-comparison.json四个CLASS文件中只要有一个的SHA256与脚本里写的不同,对照脚本就拒绝运行。把你新生成的三个JSON文件和保存的版本比一比;换一台机器,最后几位数字可能不同。
脚本从红移1800处的萨哈平衡出发,向下求解三能级方程直到红移50,在 上用 的后向欧拉步长。后向欧拉用每一步终点处的速率,并用牛顿迭代解出它,这样能让早期的刚性阶段保持稳定。
| 红移 | 萨哈平衡 | 三能级,因子1.14 | 三能级,因子1.00 | HyRec-2文件 | 三能级与HyRec-2的相对差 |
|---|---|---|---|---|---|
看哪里:最后一列。红移1500及以下的采样点里,最大偏差是 ,出现在红移100。常见误读:因子1.14在红移1100几乎不起作用,却让红移200处的自由电子比例变了13%,因为它进入的是复合系数,而复合系数决定了自由电子最后冻结在什么水平。
接着看可见度概况。三能级历史的峰值在1081.0,在1092.0处达到光学深度1。对红移1600以下的HyRec-2文件积分,得到1080和1089.8,那里的氦已经无关紧要。普朗克2018列出 。Planck合作组,2018,表2 这里没有核对那篇论文里 的定义。
步长减半后,光学深度达到1的红移移动 ,红移1100处的 相对改变 。两者都远小于与HyRec-2之间的差距,所以这个差距来自物理,而不是步长。
有两个失败案例是特意保存的。用 的显式欧拉步长,一开始就越过了萨哈平衡,到红移1500时得到nan。把三能级解的起点从红移1800改到1300,红移1100处得到 ,而正确值是 。到红移1300时真实历史已经离开了萨哈平衡,起点本身就错了,这个误差一直带到红移1100。
对照脚本读取external/HyRec2020/output_xe.dat的全部8000行。在红移50到1600之间,最大相对差是 ,出现在红移50。模型让气体温度一直等于光子温度,直到红移50;真实气体在黑暗时代后期冷得更快,会改变复合速率,所以这个假设是最可能的原因,但我们没有单独验证。在红移8000,文件给出 ,而氦完全电离时 。这说明文件计入了氦的电子,所以在红移1600以上比较时要考虑它们。
check_distortion_kernels.py拿闭合式 、、 与它们不包含的量做比较:
零点分别落在: 在 , 在 。
CLASS里的Greens_data.dat存放了120个红移上单位能量释放的频谱响应。CLASS的说明文件写明它改编自Jens Chluba公开的CosmoTherm 1.0.3;方法见Chluba,2013,第2节。把每个表列响应在文件的频率网格上积分,再除以黑体能量,就得到这一列承载了多少比例的释放能量。
| 释放红移 | 承载能量与释放能量之比 |
|---|---|
红移 以下,能量守恒到0.1%;再往上,偏差可达16%。按说明文件,这个文件另有几行,单独存放最终的黑体温度移动和它带走的能量。这里的积分没有把这几行算进去。早期的能量大多落进这个温度移动,所以它很可能是原因,但我们没有把它加回去验证。只用这一列做能量检验时,请限于 以下。
FIRAS_branching_ratios.dat对每个释放红移,列出单位 对应的 、 和温度移动。对照脚本在FIRAS从68到639吉赫的43个频率上,重复external/distortions/generate_PCA_files.py的步骤:按 、、 的顺序做格拉姆–施密特正交化,再把每个格林函数投影上去。这一流程就是Lucca等人写下的式3.10到3.15。Lucca等,2020,第3.2.2节 重复的结果与表格一致:在 ,表格给出单位能量的 为 ,我们在最近的表列红移 处投影得到 。
实验室用的是平滑的分配拟合式,它们在过渡时期与表格差别很大: 时是 ,表格是 ; 时是 ,表格是 。在 以上,两者的 相差不到3%;在 相差不到9%;在 以下,两者的 相差不到0.3%。
常见误读:把其中一个当成“正确的” 。投影结果取决于所用的频率和基矢的先后顺序。Lucca等人在脚注13里指出,换一种顺序,、 和温度三部分的相对大小就会变,而且 与 的区分本身是人为的。两种方法必须一致的,是总的频谱和它的能量。正因如此,实验室把 和 显示为一个明确说明的近似下的振幅,把FIRAS上限画成参考形状。
它们说明:实验室使用的氢复合历史和可见度,与一份详细的已发表计算相差在百分之几以内;步长已经收敛;畸变形状及其能量系数是对的。它们没有检验氦、红移200以后的气体温度、莱曼 辐射转移,也没有检验注入能量怎样逐级变成热。CLASS没有运行,所以这里没有任何内容检验CLASS自己怎样处理一次给定的能量释放。
下次做代码对照时可以复用的清单:
HyRec-2抽样和三个CLASS文件都注明了作者来源后使用。CLASS v3.3.4的目录树里没有找到许可证文件,所以Sandbox Physics只再分发那份60行的抽样,原始文件请读者从发行版下载。
当前页面对照萨哈、三能级原子与冻结的CLASS参考输出
宇宙怎样变透明 · 阅读路径