---
title: "从官方Jeans算例重走一遍"
description: "读固定版本Athena原生输入，恢复三维波向量，复算稳定与增长模，再检查自己的二维气体与分辨率。"
canonical_url: "https://sandboxphysics.com/zh/stories/molecular-clouds/replay-the-official-jeans-input/"
language: "zh-CN"
page_type: "story"
alternate_languages:
  en: "https://sandboxphysics.com/stories/molecular-clouds/replay-the-official-jeans-input/"
last_modified: "2026-11-04"
---

[分子云的引力与磁支撑](https://sandboxphysics.com/zh/stories/molecular-clouds/)

分子云 · L3

# 从官方Jeans算例重走一遍

Sandbox Physics · 2026-11-04

打开固定提交053bc738d5c85dac717326b4338b34c7db4e715d的Athena++ Jeans输入，可以从盒子尺寸算出波向量，再重算稳定和增长两种线性模。独立科学包带着完整的小输入和源码；下面先读文件，再运行等价线性计算，最后比较另一套二维气体算法。

## 开始前需要什么

读过L1的色散关系与L3的网格比较。需要解压文件、运行Python和阅读JSON。原始官方文件是数值算例输入，不是分子云观测；等价模计算不需要安装Athena。

## 先找到原始文件和许可

下载科学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

## 盒子不是立方体，先恢复波向量

打开原生输入，三个方向的长度是$L_x=1$、$L_y=L_z=0.5$。初值源码让相位沿每个盒边各转一圈。每个分量因此是$2\pi/L_i$，不是只沿最长边放一段波。

波向量为$(2\pi,4\pi,4\pi)$，大小$6\pi$，波长便是$1/3$。原始计算是斜着穿过三维盒子的波。等价线性计算把坐标转到这个波向，用它的真实波数演化六变量状态。

查看输出wavevector与wavelength字段，再回到输入核对。只把最长边当波长，会连重力标度与振荡频率一起算错。

$$
\mathbf k=\left(\frac{2\pi}{L_x},\frac{2\pi}{L_y},\frac{2\pi}{L_z}\right),\qquad \lambda=\frac{2\pi}{|\mathbf k|}=\frac13
$$

三个方向分别转一圈；波长由向量的大小决定。

对应阅读：Athena++ native Jeans input and regression at commit 053bc738d5c85dac717326b4338b34c7db4e715d

## 声速要读初值源码，增长条件要读覆盖项

输入里一条旧注释提到压力0.1，实际初值源码却设$\rho_0=1$和$p_0=1/\Gamma$，$\Gamma$是绝热指数。绝热导数给$c_s^2=\Gamma p_0/\rho_0=1$。不能用那条旧注释替代真正初始化的状态。

原生输入的Jeans比是$0.5$。不稳定回归脚本把它覆盖为$1.5$，并把结束时间改成$0.046$。这里Jeans比针对刚算出的波长，等于$\lambda/\lambda_J$，所以重力参数也随之改变。

我们的等价线性模采用等温导数，但数值上与该初值的线性声速相同。它适合比较一阶Jeans频率；完整非线性绝热演化，还需要原软件的能量方程。

$$
4\pi G\rho_0=(J|\mathbf k|c_s)^2,\qquad \omega^2=c_s^2|\mathbf k|^2-4\pi G\rho_0
$$

本式保留原始文件的单位；另一份气体片段计算则把重力系数归一为一。

对应阅读：Athena++ native Jeans input and regression at commit 053bc738d5c85dac717326b4338b34c7db4e715d

## 重算两条原生条件的等价时间曲线

单独运行audit\_official\_input.py，输出official-input-audit.json以及两份NPZ时间曲线。records数组分别列出原生稳定输入与不稳定回归覆盖项，包含声速、重力系数、频率平方、结束时刻和误差。

稳定病例的$4\pi G=88.8264$、$\omega^2=266.479$，结束时刻为$2$；不稳定病例分别为$799.438$、$-444.132$和$0.046$。这些时刻使用原生单位，不能和另一份$4\pi G=1$的气体结果直接对齐。

源码还放入了主幅度平方量级的额外密度种子。主幅度$10^{-6}$时，这一项为$10^{-12}$。官方一阶解析参照与这里的等价线性计算都略去它；输出明确保留该说明。

这一步实际运行了自己的线性积分和解析比较。它没有编译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方程去掉平均密度。固定$J=1.5$、幅度$0.2$的病例，还会在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和新的输出中单独说明。

长时分辨率停止测试最后留下$N_J=8.01589$的场，拒绝下一份低于八格的候选。它讲的是怎样停止，晚期空间精度未通过同一时刻的比较。把这个峰值当成一个恒星碎片质量，会越过记录实际回答的问题。

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会重新算出全部十一份气体完整场，以及独立磁矩阵指数比较。它们用来核验浏览器计算，没有拿来充当画面的播放帧。

最初的磁积分步长$0.01$，在八十份独立状态中的一份未过原定$10^{-9}$分量误差门。把步长细化到$0.0025$后，最大误差降至$6.16\times10^{-12}$，最初失败日志仍在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

## 练习与解释性答案

1. 为什么这个原生输入的波长是三分之一，而不是最长盒边的一？

   展开解释

   三个方向各有一圈相位，波向量是$(2\pi,4\pi,4\pi)$，大小为$6\pi$。由$\lambda=2\pi/|\mathbf k|$得到三分之一。只读最长边遗漏了另外两个分量。

2. 输出显示等价线性曲线与解析式吻合，能否说已运行Athena三维回归？

   展开解释

   实际执行的是包里的独立Python线性积分。官方文件定义了输入，原软件的三维求解器、并行和能量方程并未执行。应报告程序名称和比较层次，而不是把原始输入的来源当成执行身份。

3. 为什么把两个不同输入的横轴直接都标成“时间二”仍可能比较错？

   展开解释

   不同原生重力系数对应不同引力时间单位。还要看物理单位或换成各自的无量纲引力时间。同名横轴只有单位与定义相同，才能直接对齐。

## 动手检验预测

### [看压力与引力怎样改变同一团气体](https://sandboxphysics.com/zh/labs/molecular-cloud-jeans/)

1. 在气体分支保存一份完整场，写下Jeans比、初始幅度、密度中心和实际时间，再对照包里的相同条件。
2. 只拖密度中心后重新演化并保存。检查初值位置已变，质量与周期边界约定仍相同。
3. 把官方等价模、自己的非线性气体和线性磁分支分别列出，给每份记录标出维度、状态变量和能回答的比较问题。

## 独立科学复算材料

[下载科学复算ZIP](https://sandboxphysics.com/stories/molecular-clouds/materials/molecular-cloud-jeans-science.zip) · [阅读安装与计算说明](https://sandboxphysics.com/stories/molecular-clouds/materials/README.md)

包内重算周期气体、独立线性磁模、原生输入对照与分辨率检验，保留完整且许可清楚的官方小成员和自有科学程序。

[上一篇：网格何时已经分不清塌缩](https://sandboxphysics.com/zh/stories/molecular-clouds/when-a-cloud-grid-stops-being-evidence/) [下一篇：一种质量收敛了，整条IMF就可靠吗](https://sandboxphysics.com/zh/stories/molecular-clouds/why-a-converged-mass-is-not-the-imf/)

## 来源与计算范围

1. [Athena++ native Jeans input and regression at commit 053bc738d5c85dac717326b4338b34c7db4e715d](https://github.com/PrincetonUniversity/athena/tree/053bc738d5c85dac717326b4338b34c7db4e715d)

   完整BSD-3-Clause小成员包括原生输入、Jeans初值源码和稳定/不稳定引力回归脚本。教程计算等价的一阶傅里叶模，没有编译或运行Athena。

2. [Molecular-cloud Jeans standalone scientific reproduction](https://sandboxphysics.com/stories/molecular-clouds/materials/molecular-cloud-jeans-science.zip)

   独立有限体积与过采样伪谱计算、Jeans解析参照和完整线性磁流体参照，含十个支持病例、固定长时病例、官方小输入及原始失败。安装普通Python依赖后，默认重放会离线实际重算科学步骤。
