---
title: "从保存的场数据检查 MRI 计算"
description: "从保存的MRI场数据重算应力与剪切功，分开检查空间误差与时间误差。"
canonical_url: "https://sandboxphysics.com/zh/stories/magnetorotational-instability/check-saved-mri-fields/"
language: "zh-CN"
page_type: "story"
alternate_languages:
  en: "https://sandboxphysics.com/stories/magnetorotational-instability/check-saved-mri-fields/"
last_modified: "2026-11-12"
---

L3 · 方法指南

# 从保存的场数据检查 MRI 计算

Sandbox Physics · 2026-11-12

检查一次小型 MRI 计算，可以从四组保存的场数据开始：先在每个高度算出动量通量，再把剪切做的功与扰动能量的增加相比较。下载包里有十一组已经算完的线性通道实验。下面先用两个只读命令检查旧结果，不推进时间。

要回答的问题很具体：场值、应力与分辨率误差，能否对应同一次计算？

公开版调整了文件路径和参考标签。原始852,417字节的离线包SHA-256为8e5918ecefd472a171ce7a7a17c2ae44659a71db9e3ac36bf2c4d1aac9e2972c。这里的277个压缩场帧与原包逐字节相同。元数据版本也实际检查运行了一次，计时4.24秒、驻留内存峰值25,296,896字节；下载包内包含所用源码和明确标注为摘录的计时说明。

## 打开指定版本的离线包

下载 [linear-channel-replay-public.zip](https://sandboxphysics.com/zh/stories/magnetorotational-instability/materials/linear-channel-replay-public.zip)，文件大小为 849,925 字节；再下载独立的[保存场测量脚本](https://sandboxphysics.com/zh/stories/magnetorotational-instability/materials/measure_saved_fields.py)。把两个文件放进一个新的工作目录。ZIP 的 SHA-256 应为：

680ce195877487db5520cde1b4233fea89e91e46589daca562045feff24c4ef9

原计算使用 Python 3.14.3。准备好这个版本后，运行：

shasum -a 256 linear-channel-replay-public.zip

unzip linear-channel-replay-public.zip -d mri-replay

cd mri-replay

python3 -I -B source/inspect\_saved.py --bundle .

python3 -I -B ../measure\_saved\_fields.py --bundle . --out ../field-measurements.json

两个脚本都只用 Python 标准库。解压前先比较校验值。包内检查器会检查清单中的 299 个文件和 277 帧场数据，输出 PASS\_SAVED\_FIELD\_INSPECTION\_ONLY，并注明 newTimeSteps: 0。独立测量脚本也先验证全部文件的校验值，随后从四组数组重新算能量、应力和傅里叶系数，输出 PASS\_READ\_ONLY\_FIELD\_MEASUREMENTS。输出文件名必须尚未存在。

ZIP 一共有 300 个成员；manifest.json 没有把自身列进校验清单。source/ 中的四个文件包含演化和检查代码，records/receipt.json.gz 保存原来的十一组实验及 45 项通过的比较。今天重新检查保存数据，并没有重新运行当时的演化。原来受外部程序监督的计算耗时 4.67 秒，内存峰值为 26,001,408 字节。这是那台机器上的实测值，其他电脑的运行时间可以不同。

## 先读一帧，再读增长曲线

用支持 gzip 的 JSON 阅读工具打开 records/keplerian-fastest/00600.json.gz。它保存代码时间 1.5 的场。field 从前到后依次是径向速度扰动、方位速度扰动、径向磁扰动和方位磁扰动，每组都有 256 个采样点。下标 0 位于周期竖直区间的起点，下标 64 位于四分之一波长处。

坐标 $x$ 指向径向外侧，$y$ 沿轨道转动方向，$z$ 沿竖直方向。磁扰动换成了速度单位：

$$
b_x=\frac{\delta B_x}{\sqrt{\mu_0\rho}},\qquad
b_y=\frac{\delta B_y}{\sqrt{\mu_0\rho}}.
$$

其中 $\rho$ 是均匀密度，$\mu_0$ 是磁导率。速度随高度按正弦变化，磁扰动按余弦变化。流体没有竖直速度，背景竖直磁场保持恒定。空间求解器推进的是周期网格上的四组数组，竖直导数由相邻网格点求出。

要换回物理单位，先选定箱体高度 $L$、参考频率 $\Omega_{\rm ref}$ 和密度 $\rho$。保存的高度区间长度为一，时间单位为 $\Omega_{\rm ref}^{-1}$，速度单位为 $L\Omega_{\rm ref}$。保存的能量密度或应力乘以 $\rho L^2\Omega_{\rm ref}^2$，才得到物理单位下的数值；代码中的密度为一。

记录的 tension 是频率 $K=kv_A$ 在这套固定单位下的数值，$k$ 为竖直波数，$v_A$ 为背景阿尔芬速度。旋转参考实验取 $\Omega=\Omega_{\rm ref}=1$，因此数值也等于 $K/\Omega$。不旋转的阿尔芬实验取 $\Omega=0$，tension 仍为 0.8，时钟仍以 $\Omega_{\rm ref}$ 为准。把它除以局部的零转速，会丢掉这个极限实验本来的含义。

![时间1.5保存的四个场，以及同一高度上组成雷诺和麦克斯韦应力的乘积](https://sandboxphysics.com/_astro/06-fields.zh.desktop.BxcFW38i.svg)

实际保存的四个场分量，以及同一高度上的两种应力乘积；窄屏使用另绘版式。

下标 64 处，两个速度约为 $3.08033\times10^{-4}$ 和 $3.07998\times10^{-4}$。两个磁扰动接近零，因为这里的余弦为零；它们的峰值在相隔四分之一波长的位置。只看速度箭头，无法判断磁应力在哪里最大。图中的曲线直接取自这一帧，没有补算新的演化。

## 把同一高度的分量相乘

在有 $N$ 个等距采样点的网格上，计算

$$
\begin{aligned}
E&=\frac{\rho}{2N}\sum_{j=0}^{N-1}
\Bigl[u_{x,j}^2+u_{y,j}^2\\
&\qquad\qquad{}+b_{x,j}^2+b_{y,j}^2\Bigr],\\
T_{\rm R}&=\frac{\rho}{N}\sum_j u_{x,j}u_{y,j},\\
T_{\rm M}&=-\frac{\rho}{N}\sum_j b_{x,j}b_{y,j}.
\end{aligned}
$$

第一行给出体积平均的扰动能量密度，后两行分别是雷诺应力和麦克斯韦应力，描述相关运动与磁张力怎样输运轨道动量。在这里的坐标约定下，总应力 $T_{\rm R}+T_{\rm M}$ 为正，表示径向向外的角动量输运。必须先逐点相乘，再平均。若先把每个分量平均，正弦和余弦都会得到零，随后相乘就会错过真实的通量。

最快增长的实验在代码时间 3 结束，此时

$$
\begin{aligned}
E(0)&=1.3333333333\times10^{-8},\\
E(3)&=1.2002283886\times10^{-6},\\
T_{\rm R}(3)&=4.5007224026\times10^{-7},\\
T_{\rm M}(3)&=7.5015613910\times10^{-7}.
\end{aligned}
$$

这些数都使用代码的能量密度单位。磁应力与速度应力的比值约为 1.666746，接近连续模型中最快本征模的 $5/3$，小差别来自有限网格。这个比值由指定的线性本征模决定。湍流盘的应力比需要另行计算。

## 用合适的时间采样比较功与能量

背景剪切向扰动供能的速率是

$$
\frac{dE}{dt}=q\Omega\left(T_{\rm R}+T_{\rm M}\right),
$$

其中 $q=-d\ln\Omega/d\ln R$ 描述差动转动。保存的 integratedShearWork 用每个时间步的四个 Runge–Kutta 阶段的应力累加而成，与末态能量差分别计算。最快实验给出 $1.1868950553\times10^{-6}$。从 $E(3)-E(0)$ 中减去它，再取绝对值并除以 $E(0)$，约得 $2.29\times10^{-11}$。

测量脚本还用保存的 25 帧应力做了梯形积分，得到 $1.1903702511\times10^{-6}$，比能量增量高约 0.293%。这是另一种时间采样造成的差别。增长的指数曲线向上弯曲，跨过较宽区间的梯形会多算面积；原演化用了密得多的时间步，每一步还有四个阶段。原来的严格功率比较针对阶段积分；稀疏快照的积分还带有采样误差。

## 分开看空间误差与时间误差

三组空间实验使用同一个连续模型本征向量作为初态，演化到相同终点。四分量向量的相对误差为：

| 竖直采样点数 | 场的相对误差 |
| --- | --- |
| 64 | 0.001287717890 |
| 128 | 0.000321942474 |
| 256 | 0.000080486418 |

测量脚本把末态场投影到规定的正弦或余弦基底，再与保存的解析目标比较。网格点数每加倍一次，误差分别缩小 3.99984 和 3.99996 倍，符合中心差分导数的二阶空间精度。

![三种空间网格与三种时间步长的保存场相对误差，以及误差缩小倍数](https://sandboxphysics.com/_astro/06-convergence.zh.desktop.C1PZZUsL.svg)

从保存场重新测得的空间与时间误差。

三组时间实验则固定 32 个网格点，时间步长依次为 0.02、0.01 和 0.005。它们的初态与目标使用中心差分对应的有效波数，把连续空间与离散空间之间的差别移出了这项比较。误差约为 $5.009\times10^{-10}$、$3.148\times10^{-11}$ 和 $1.973\times10^{-12}$，每减半一次步长，误差缩小 15.9122 和 15.9574 倍，接近四阶方法的 16 倍。若在这里改用连续模型的目标，空间误差会先成为下限，遮住时间精度。

公开数据把参考目标命名为expectedReferenceProjection；时间实验的referenceKind为semidiscrete-eigenmode，其他组为continuum。原控制程序从解析参考中取得初始向量和比较目标。空间步进器只接收四个场、转速、剪切、阿尔芬速度和时间步长，不接收预期末态数组。从原场重新算乘积，检查的是保存的诊断量；连续极限、空间收敛和时间收敛又各自检查不同的物理或数值性质。文件校验值说明拿到的是哪份文件，物理准确性则要靠单独的科学比较。

## 可选的重新演化与第一次失败

若要从头推进同样的十一组实验，在解压根目录中指定一个全新的输出目录：

python3 -S -B source/qualify.py --out rerun-01

这个命令会演化场，只用 Python 标准库，原来的 records/ 保持原样。作者资格检查曾使用外部 120 秒监督程序；脚本自身每次检查已运行时间是否超过 110 秒，并要求启动时至少有两 GB 可用磁盘空间，最后还记录并比较 128 MB 内存峰值和 15 MB 新输出上限。内存报告的字节解释按 macOS 编写。若有比较失败，保留终端输出和整个新目录；先查清舍入差异或平台资源统计，再考虑阈值。

每组完整返回的结果会先保存，再接受比较。失败项会留下名称、实测值和上限，压缩收据的 failure 则给出异常信息。先读第一次失败。某组若在中途异常退出，即使没有完整结果行，目录里也可能已经有保存帧。程序拒绝覆盖已有输出目录。只读检查若遇到校验值不符，会在解码数值记录前停止。

这批实验是理想、不可压缩、水平匀质、竖直周期的线性通道，只考察短时间小振幅下的增长、振荡极限、剪切功和分辨率依赖。模型没有热压强归一化，保存的应力不是吸积参数 $\alpha$。

浏览器 Lab 计算连续模型的线性通道，并导出自己的采样场。它的初始振幅、进入页面时展示的代表时刻和振幅停止条件，与这份离线包不同；离线包固定种子尺度为 $10^{-4}$，各组都算到时间 3。比较时应对齐参数与经过的时间，查看增长率、应力比或 $E(t)/E(0)$，绝对能量不必相等。Lab 没有导入这些离线帧的入口。页面导出与这份下载包是分别标明身份的两组数据。

## 自己试两次

先预测“各分量先平均，再相乘”会得到什么。在四分之一波长处读出两个速度并相乘，再与体积平均应力比较，解释两种操作为什么不同。

接着比较 field-measurements.json 中的两种积分功。找出哪一种使用了每个积分阶段，哪一种只使用保存帧。说明为什么加密保存快照，可以改善后者，却不用改变原来的演化轨迹。

换一个离线数据集时，也按这个次序做：确认文件版本，读清坐标和单位，从场算一个诊断量，选一个物理上独立的比较，分开检查网格与时间误差，保留第一次失败。这样每个数都有明确的问题可以回答。

## 来源

离线包的模型说明列明了所用原典：Balbus与Hawley（1991）的式2.2及2.5—2.9，以及Stone与Gardiner（2010）的第II—III节。[Balbus与Hawley原始扫描](https://articles.adsabs.harvard.edu/pdf/1991ApJ...376..214B)。[Stone与Gardiner固定版本](https://arxiv.org/html/1006.0139v1#S2)。

## 动手检验预测

### [比较页面导出与离线数据](https://sandboxphysics.com/zh/labs/magnetorotational-instability/)

1. 先预测种子振幅改变后，哪些比较量仍保持相同。
2. 固定开普勒剪切，比较参考张力与最快增长张力，分别导出页面中的线性状态。
3. 比较增长率、磁应力与速度应力之比，以及相对于各自初态的能量。
4. 解释页面导出的绝对能量为何不必等于另一组种子产生的离线记录，再用下载包检查空间收敛。

## 继续阅读

磁张力怎样放大吸积盘中的扰动 · 阅读路径

### 磁张力怎样放大吸积盘中的扰动

1. [文章 **吸积盘的角动量由谁向外送？**](https://sandboxphysics.com/zh/stories/magnetorotational-instability/who-carries-angular-momentum/)
2. [文章 **旋转小区域里的四个实场**](https://sandboxphysics.com/zh/stories/magnetorotational-instability/four-fields-in-a-rotating-patch/)
3. [文章 **先算增长，再跟着能量检查**](https://sandboxphysics.com/zh/stories/magnetorotational-instability/growth-stress-and-energy/)
4. [文章 **竖直网格为什么会改变线性通道**](https://sandboxphysics.com/zh/stories/magnetorotational-instability/why-a-vertical-mesh-changes-a-channel/)
5. [文章 **怎样检验增长、传输与剪切功**](https://sandboxphysics.com/zh/stories/magnetorotational-instability/checking-growth-and-shear-work/)
6. [当前页面 **从保存的场数据检查 MRI 计算**](https://sandboxphysics.com/zh/stories/magnetorotational-instability/check-saved-mri-fields/)
7. [文章 **从线性增长读到 MRI 湍流的去留**](https://sandboxphysics.com/zh/stories/magnetorotational-instability/read-beyond-linear-mri/)
