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