扰动的高频分量有没有在初始化时做平滑处理?
……
这些细节,在论文里统统没有。
或者说,当年受限于篇幅,作者不可能把几万行代码的细节逐一写进文章里。
但对于复现者来说,每一个缺失的细节,都是一个致命的变量。
江临没有把这些不确定性糊弄过去了事。
他在项目的README文档的第一行写——
第一次正式运行,工作站硬盘灯连续亮了十七天。
第十七天下午,终端上的时间步循环终于停下。
江临颤斗着手,用Python的Matplotlib库调出了最后一个时间步的磁场流函数等值线图。
屏幕上出现了一条缓慢演化的电流片。
他调出时间串行动画。
在仿真的早期,也就是刚添加初始扰动的时候,系统确实在一瞬间出现过Petschek那种华丽的X型几何。
那是一个令人心跳加速的瞬间。
但随着时间的推移,中心扩散区无法将堆积的物质及时排出。
那个X的夹角越来越小,重联点被慢慢拉长,变薄。
最后,在动画的结尾,那个X完全坍缩,最后退回那条熟悉得令人不舒服的长电流片。
和Biska论文里的截图几乎一模一样。
很漂亮。
江临却看得脊背发凉。
太顺了。
他决定做压力测试。
回到配置文档,把Lundquist数提高一个量级。
但这一次,他做了一个违背常规的操作,故意没有同步加密网格。
他想知道,当前这套网格的承受边界到底在哪里。
系统是真的因为物理规律演化成这样,还是因为数值格式把它限制成了这样?
代码重新编译,运行。
这一次,程序跑到第八天深夜,工作站发出一声尖锐的报错蜂鸣。
ERROR: Floating point exception (core dued).
跑崩了。
江临立刻调出崩溃前几个时间步的快照。
不是因为更高的Lundquist数更容易算。
而是因为电阻减小后,物理上的电流片扩散区厚度变得极其薄,被压到了接近甚至小于单个网格尺度的地步。
当物理尺度小于网格尺度时,代码里的数值结构就强行接管了物理演化。
江临在屏幕上看到了可怕的一幕。
X型几何刚刚尝试形成,电流片的中央就开始出现非物理的高频振荡。
红蓝相间的色块像病毒一样在网格间蔓延,几个时间步之后,整幅精密的磁场图散成了一片毫无意义的马赛克。 品笔阁 https://pinbige.co
第七十二章 模型的尸骨
也就是所谓的数值爆炸。
江临感觉这片马赛克在嘲笑他。
开始排查
第一天,他怀疑是数值黏性不够,压不住高频振荡,于是引入了人工耗散项。
结果振荡没了,但重联速率被人工耗散接管,变成了假数据。
第二天,他怀疑是网格尺度太大,局部做了AMR。
结果交界面上出现了虚假的反射波。
第三天,他怀疑是边界反射,把流出边界改成了完全匹配层。
第四天到第二十天……
他象个在黑暗中乱撞的困兽,在这三件事之间反复来回。
每修掉一个问题,另一个更诡异的数值伪影就跳出来。
有时候是质量不守恒了,有时候是磁场的散度不再为零,导致产生了单极磁荷。
第二十一天的凌晨,江临满眼血丝地看着满屏幕被注释掉的测试代码,突然感到一阵无力。
打开工作日志,敲下了几行字。
【Biska的图不是错的。】
【但它不能脱离那组参数、边界和数值实现,被当作无条件成立的图象。它是在那特定的参数,特定的网格分辨率,特定的边界条件和特定的隐式数值耗散共同妥协下,勉强维持出来的一个结果。】
【论文里展示的,是被提纯后打扮得漂漂亮亮的图象。】
【而我现在踩到的,才是这张图象诞生前,那片充满未显