1. 课程导入与排障思维建立

计算物理模型出现异常,几乎不是“程序坏了”这么简单。一个负的温度、一条不收敛的残差曲线、一次能量守恒被破坏,背后可能是物理建模、离散格式、边界条件、参数单位、求解器设置甚至数据输入中的某一环出了问题。本课程用45个真实场景拆解这些异常,而本节要解决的是最基础也最关键的问题:先建立一套可复用的诊断思维,再谈具体修法。没有分类和流程,排障就会退化成“改参数碰运气”。

一、什么是“模型异常”

在计算物理语境下,异常不等于报错。程序正常退出、日志无红色错误,但结果在物理上不可接受,同样属于异常。可以给出一个操作性定义:当模型输出与已知物理约束、量纲关系、守恒律、收敛判据或参考解之间出现不可解释的偏离时,即判定为异常。这个定义把“异常”从主观感觉变成了可检验的判断。

例如一维热传导问题,取导热系数 k=0.5 W/(m·K)、密度 ρ=1000 kg/m³、比热 c=4180 J/(kg·K),初始温度场为左端100 ℃、右端0 ℃的阶跃。若显式格式时间步取 dt=10 s、空间步长 dx=0.01 m,热扩散率 α=k/(ρc)≈1.2×10⁻⁷ m²/s,稳定性要求 dt ≤ dx²/(2α)≈0.42 s。此时 dt=10 s 远超上限,计算虽能跑完,却会出现温度振荡甚至负值——这就是典型的“无报错异常”。判断依据不是程序是否崩溃,而是解是否满足物理约束。

二、异常的分类:先定位在哪一层

排障效率取决于分类是否清晰。按成因层次,可将计算物理异常分为五类,它们对应不同的检查入口:

  • 输入与参数类:单位不一致、量纲错误、初值/边界值越界、材料参数超出适用区间。特征是“一改输入就变”。
  • 离散与格式类:网格过粗、时间步超稳定域、迎风/中心差分选错、数值耗散或色散过强。特征是“加密网格后结果明显变化”。
  • 边界与初值类:边界条件类型错配(Dirichlet/Neumann混淆)、远场截断过近、初始场与边界不自洽。特征是“误差从边界向内传播”。
  • 求解器与代数类:残差停滞、预条件子失效、矩阵病态、非线性迭代发散。特征是“残差曲线形态异常”。
  • 模型与物理类:本构关系不适用、耦合项遗漏、守恒律被破坏。特征是“结果自洽但与参考解系统性偏离”。

分类的价值在于缩小搜索空间。看到残差在 1e-3 附近平台化,优先查求解器与预条件;看到负温度,优先查时间步与离散格式;看到边界附近误差堆积,优先查边界条件实现。下面这张图把五类异常、典型信号与首选检查动作组织成一张诊断关系图,可作为排障时的对照卡。

计算物理模型异常:分类 → 信号 → 首选检查 观测到异常输出 物理约束 / 守恒律 / 收敛判据偏离 先问:异常随哪个因素变化? 输入与参数 信号:改输入即变 量纲/单位不一致 参数越界 查:单位与量纲 参数适用区间 离散与格式 信号:加密网格后变 振荡/负值/耗散 时间步超稳定域 查:稳定性判据 网格收敛性 边界与初值 信号:误差从边界向内 边界类型错配 初值边界不自洽 查:边界实现 远场截断距离 求解器与代数 信号:残差平台/发散 预条件失效 矩阵病态 查:残差曲线 条件数与迭代史 模型与物理 信号:系统性偏离 守恒律被破坏 本构关系不适用 查:守恒量核算 与参考解对比 排障主线:复现 → 隔离 → 简化 → 验证 → 回归 ① 固定输入与随机种子,确认异常可重复 ② 用二分法隔离:改一个因素,看异常是否消失 ③ 降维到可解析/可手算的小算例,再逐步加回复杂度 ④ 用守恒量、量纲、极限情形做独立验证 ⑤ 修复后补一个回归用例,防止同类异常复发 ⑥ 记录“信号—原因—修法”,沉淀为排障知识库

三、排障流程:把“猜”变成“隔离”

排障的核心不是灵感,而是受控实验。推荐的主线是:复现、隔离、简化、验证、回归。第一步复现,要求固定输入文件、随机种子、编译选项和运行环境,确认异常在同一条件下稳定出现;若异常时有时无,先查并行归约顺序、未初始化内存或浮点非确定性,而不是急着改物理模型。

第二步隔离,用“单因素变更”缩小范围。例如残差在 1e-3 平台化,可依次尝试:换直接求解器、放宽/收紧收敛容差、改变预条件子、把非线性项冻结为线性。每次只改一项并记录残差曲线形态。若换直接求解器后残差降到 1e-10,问题基本锁定在迭代求解器或预条件配置,而非物理模型。

第三步简化,把问题降维到能手算的规模。二维问题先退成一维,瞬态问题先看稳态,复杂边界先换均匀边界。一个常见做法是构造“制造解”:预设 T(x)=sin(πx),反推源项,再检查数值解与制造解的误差阶是否达到格式理论阶。若理论二阶而实测只有一阶,说明边界处理或离散实现有缺陷。

第四步验证,用独立于求解器的判据交叉检查:全局质量/能量守恒残差、量纲一致性、极端参数下的解析极限、与商用软件或文献参考解的对比。第五步回归,把本次异常的最小复现用例固化为测试,避免后续修改再次引入。

四、一个可执行的排障记录模板

为了让诊断可追溯,建议每次排障都留下结构化记录。下面是一份可直接填写的示例,字段只保留排障真正需要的信息:

字段示例内容
异常现象一维瞬态导热,t=50 s 时出现 T=-3.2 ℃
可复现条件dt=10 s,dx=0.01 m,显式格式,固定初值
违反的约束温度非负性、稳定性判据 dt ≤ dx²/(2α)
隔离实验dt 降至 0.2 s 后负值消失,残差正常
根因判定时间步超出显式格式稳定域
修复与验证改用隐式格式或 dt=0.2 s,能量守恒残差 <1e-6
回归用例保留 dt=10 s 用例,断言应触发稳定性告警
排障时优先问三个问题:异常随哪个参数变化?在什么简化条件下消失?哪个守恒量或解析极限可以用来独立判断对错?这三问往往比盲目调参更快定位根因。

建立这套思维后,后续45个案例就不再是零散技巧的堆叠,而是可以归入“分类—信号—检查—验证”框架的具体实例。遇到新异常时,先判断它属于哪一层,再选择对应的隔离实验,排障就会从经验驱动转为证据驱动。