先找到原始文件和许可
下载科学ZIP,解压后进入molecular-cloud-jeans-science。official目录里保留athinput.jeans_3d、Jeans初值源码、两个回归脚本和完整BSD许可;manifest.json列出每个成员的字节与SHA。它们来自同一固定提交,不把今天分支上的文件混进来。
包里的Python是另一套独立计算。replay.py先检查文件完整性,再实际运行科学步骤,把新结果写进你指定的目录。首次安装NumPy、SciPy和Matplotlib后,就可以离线重算;工具二进制和受限许可论文都没有放进包。
先执行完整重放,保留终端输出与replay-receipt.json。后续命令同样使用这个虚拟环境的Python。新增的空间门会从头计算十一例,耗时主要在这一阶段。参考JSON便于比较;实际重算结果写在你新建的目录里。
python3 -m venv .venv
.venv/bin/python -m pip install -r requirements.txt
PYTHONDONTWRITEBYTECODE=1 .venv/bin/python replay.py --out-dir rerun对应阅读:Athena++ native Jeans input and regression at commit 053bc738d5c85dac717326b4338b34c7db4e715d · Molecular-cloud Jeans standalone scientific reproduction
盒子不是立方体,先恢复波向量
打开原生输入,三个方向的长度是、。初值源码让相位沿每个盒边各转一圈。每个分量因此是,不是只沿最长边放一段波。
波向量为,大小,波长便是。原始计算是斜着穿过三维盒子的波。等价线性计算把坐标转到这个波向,用它的真实波数演化六变量状态。
查看输出wavevector与wavelength字段,再回到输入核对。只把最长边当波长,会连重力标度与振荡频率一起算错。
对应阅读:Athena++ native Jeans input and regression at commit 053bc738d5c85dac717326b4338b34c7db4e715d
声速要读初值源码,增长条件要读覆盖项
输入里一条旧注释提到压力0.1,实际初值源码却设和,是绝热指数。绝热导数给。不能用那条旧注释替代真正初始化的状态。
原生输入的Jeans比是。不稳定回归脚本把它覆盖为,并把结束时间改成。这里Jeans比针对刚算出的波长,等于,所以重力参数也随之改变。
我们的等价线性模采用等温导数,但数值上与该初值的线性声速相同。它适合比较一阶Jeans频率;完整非线性绝热演化,还需要原软件的能量方程。
对应阅读:Athena++ native Jeans input and regression at commit 053bc738d5c85dac717326b4338b34c7db4e715d
重算两条原生条件的等价时间曲线
单独运行audit_official_input.py,输出official-input-audit.json以及两份NPZ时间曲线。records数组分别列出原生稳定输入与不稳定回归覆盖项,包含声速、重力系数、频率平方、结束时刻和误差。
稳定病例的、,结束时刻为;不稳定病例分别为、和。这些时刻使用原生单位,不能和另一份的气体结果直接对齐。
源码还放入了主幅度平方量级的额外密度种子。主幅度时,这一项为。官方一阶解析参照与这里的等价线性计算都略去它;输出明确保留该说明。
这一步实际运行了自己的线性积分和解析比较。它没有编译Athena,没有执行其三维MPI、FFT或多重网格回归。原始文件定义了被比较的条件,执行程序的身份仍需分清。
.venv/bin/python audit_official_input.py --input official/athinput.jeans_3d --out-dir native-check对应阅读:Athena++ native Jeans input and regression at commit 053bc738d5c85dac717326b4338b34c7db4e715d · Molecular-cloud Jeans standalone scientific reproduction
再看自己的非线性二维气体
verify_prototype.py求解的是第三方向不变、周期的等温气体。它的密度和动量来自有限体积通量,Poisson方程去掉平均密度。固定、幅度的病例,还会在32、64、128格上重算。
在verification.json中找linearHydro、nonlinearHydro与spatialAdjacentRestrictedRms。前者与解析线性波比较,后两者比较有限幅度与网格细化。它们回答不同问题,不应把一个小幅解析测试通过,当成晚期强压缩也已通过。
再打开NPZ完整状态。细网格必须先平均到粗单元,才能逐格比较;直接挑同样编号的格点,会把采样位置与平均范围也改掉。
.venv/bin/python verify_prototype.py --out-dir gas-check
.venv/bin/python verify_domain.py --out-dir domain-check对应阅读:Molecular-cloud Jeans standalone scientific reproduction
给独立参照也做空间细化
spectral-space-verification.json把通量求积、保留空间模和时间步比较分成三个字段。固定64点,把求积从两倍增到四倍;再比较64与128点;最后在固定空间设置下减半时间步。全部原十个支持病例和固定长时病例都在清单里。
运行时默认重新算全部十一例,不采用开发时复用已完成数组的选项。检查每例reusedCompletedLocalNumericalRun为false,再读实际数值差。一个PASS字符串之外,还要有你能找到的输入、状态与比较方式。
制造的近零密度有理通量负例也会重算。它的作用,是让“输出截断总能去混叠”这个错误假设暴露出来;它不属于气体控制的支持范围。
.venv/bin/python verify_spectral_space.py --out-dir reference-check对应阅读:Molecular-cloud Jeans standalone scientific reproduction
保留失败,读清每一条的用途
failures目录保存最初32格误差抵消、点值与单元平均混比,以及修正前的伪谱源码和结果。文件名会告诉你它属于哪一轮;当前方法在README和新的输出中单独说明。
长时分辨率停止测试最后留下的场,拒绝下一份低于八格的候选。它讲的是怎样停止,晚期空间精度未通过同一时刻的比较。把这个峰值当成一个恒星碎片质量,会越过记录实际回答的问题。
editorial/worked_examples.py从已算出的verification.json读取这两份状态诊断,再独立重算Jeans格数;它同时计算章节里的增长幅度、磁方向例题与给定质量列表。例题的输出因此也能沿着文件找到来处。
.venv/bin/python editorial/worked_examples.py --science-results rerun --out worked-examples.json对应阅读:Molecular-cloud Jeans standalone scientific reproduction
为下一位复算者留下足够信息
整理结果时,写下原始提交、成员SHA、Python和依赖版本、物理初值、维度与边界、实际结束时刻,以及每项比较改变了什么。保留未过的病例和停止原因,别人才能继续检验。
从交互画面导出时,同样保留模型分支与完整场。密度中心拖动表示重新准备初态,保存前后的记录应当有不同初值;它不表示演化中有人把气体瞬间挪走。
默认重放实际运行九个科学程序。最后的implementation/export_reference_fields.py会重新算出全部十一份气体完整场,以及独立磁矩阵指数比较。它们用来核验浏览器计算,没有拿来充当画面的播放帧。
最初的磁积分步长,在八十份独立状态中的一份未过原定分量误差门。把步长细化到后,最大误差降至,最初失败日志仍在failures里。一起读reference/magnetic-step-refinement.json与新完整场输出:准确求解线性系统,并不等于验证了非线性磁云。
带着这套顺序再读另一份官方算例:先认文件和单位,再恢复波向与初态,再运行程序,最后对照参照与失败。每一步都有一个可独立检查的对象。
.venv/bin/python implementation/export_reference_fields.py --science-results rerun --out complete-fields.json.gz对应阅读:Molecular-cloud Jeans standalone scientific reproduction · Athena++ native Jeans input and regression at commit 053bc738d5c85dac717326b4338b34c7db4e715d