CAE仿真回归测试——求解器更新与模型变更时的质量保证策略
理论与背景
什么是CAE回归测试
老师,回归测试是软件开发中的术语吧? CAE领域也会用到吗?
问得好。在软件开发中,回归测试是“修改代码后,确认其他功能是否被破坏”的过程,但在CAE中,完全相同的概念也是必要的。
CAE中的回归测试是指,当求解器版本升级、模型变更、网格重新生成、或者操作系统/编译器更新等,分析环境发生任何变更时,自动将新结果与过去被认定为“正确”的结果(基线)进行比较,并验证差异是否在允许范围内的过程。
哦,也就是说,系统性地确认“虽然做了更改,但能得到和以前一样的结果,对吧?”
正是如此。例如,假设在汽车制造商进行碰撞分析。将LS-DYNA的版本从R12升级到R13时,过去已认定的模型的加速度峰值或侵入量是否发生了变化——如果手动逐一确认这是不现实的。因为可能有100个、200个模型。
确实。如果手动全部做的话,感觉一周时间都不够用…
所以要自动化。自动执行基准问题集,自动比较结果,如果差异超过阈值则发出警报——这就是CAE回归测试的全貌。
为什么需要回归测试
但是,求解器是商用软件吧? 仅仅是版本升级,结果就会改变吗?
会变的,真的会。 求解器供应商在版本升级时,会进行错误修复、算法改进、默认设置更改。这些都可能对结果产生影响。
举一些实际发生过的例子:
- Nastran版本变更导致固有频率变动0.3〜0.5%(由于刚度矩阵组装算法变更)
- Abaqus小版本更新导致接触判定的默认设置改变,接触力变化了百分之几
- OpenFOAM版本变更导致湍流模型的壁面函数实现被修正,Cd值变化了2%以上
- 仅编译器优化标志变更,就改变了浮点运算的舍入顺序,导致非线性分析中收敛路径发生分岔
诶,仅仅编译器优化标志就能改变结果!? 那有点可怕啊…
正因为如此,回归测试才是必须的。在航空航天或核能等涉及安全认证的领域,每次变更求解器版本时,都要运行全部已认证的基准测试集是标准做法。在汽车碰撞安全领域,也需要始终确认与NCAP标准的一致性。
判定的数学框架
“结果是否改变”,具体是如何判定的呢? 数值不可能完全一致吧?
说得对。因为是浮点运算,所以不期望完全一致。取而代之的是,根据相对误差或绝对误差是否在允许范围内来判定。基本公式如下:
其中 $Y_{baseline}$ 是基线(基准)结果,$Y_{new}$ 是新环境下的结果。判定标准是:
当 $Y_{baseline}$ 接近零时,相对误差会发散,所以此时使用绝对误差:
基线在零附近时不能用相对误差呢。比如约束点的位移(理论上为零)之类的。
正是这类情况。在实际工作中,经常使用结合相对误差和绝对误差的复合判定:
此外,也管理整个测试套件的合格率:
整个测试套件的合格率也有标准吗?
许多组织将合格率100%作为发布条件。只要有一例FAIL,就必须调查原因,区分是“有意改进导致的变化”还是“错误”。如果是有意的变化,则更新基线。
求解器版本变更的影响
能再具体一点告诉我,各个求解器在版本变更时容易出现什么样的影响吗?
| 求解器 | 容易出现影响的变更 | 典型的差异大小 | 注意事项 |
|---|---|---|---|
| MSC Nastran | 刚度矩阵数值积分精度变更 | 固有频率 0.1〜0.5% | SOL 103/111 需特别注意 |
| Abaqus | 接触算法默认设置变更 | 接触力 1〜5% | 必须阅读 Release Notes 中的 "Changed defaults" |
| Ansys Mechanical | APDL内部命令行为变更 | 应力 0.5〜2% | 容易被 Workbench 掩盖 |
| OpenFOAM | 湍流模型/壁面函数实现修正 | Cd/Cl 1〜3% | v.com 版和 Foundation 版存在差异 |
| LS-DYNA | 沙漏控制默认设置变更 | 加速度峰值 2〜10% | 对碰撞分析影响大 |
LS-DYNA的加速度峰值最大会变化10%? 对于碰撞安全来说,这不是大问题吗…
是大问题。所以,在汽车制造商的CAE部门,在求解器主要版本升级时,对数百个碰撞模型进行回归测试是常识。在涉及人命的领域,不允许偷工减料。
回归测试的适用范围与局限
- 适用范围:求解器版本变更、操作系统/编译器变更、网格重新生成、材料模型修正、边界条件微调等,针对已知分析设置的变更验证。
- 局限:回归测试终究只是验证“与先前结果的一致性”,并不能保证结果的“正确性”。如果基线本身是错误的,即使回归测试通过,分析结果也是不准确的。需要另外进行V&V(验证与确认)。
- 覆盖范围的局限:对于测试套件未覆盖的物理现象或分析条件,回归测试无法检测。测试用例的设计决定了质量。
量纲分析与单位制
| 变量 | SI单位 | 注意事项 |
|---|---|---|
| 容差 $\varepsilon_{rel}$ | — (无量纲, %) | 根据物理量种类设定不同值 |
| 容差 $\varepsilon_{abs}$ | 各物理量的单位 | 用于零附近值的判定。根据量级设定 |
| 测试合格率 | — (无量纲, %) | 取决于组织的发布标准(通常为100%) |
回归测试判定的具体示例
从Nastran v2024迁移到v2025时的回归测试结果示例。容差根据案例分别设定。
| 评估项目 | v2024(基线) | v2025(新版本) | 相对误差 [%] | 判定 |
|---|---|---|---|---|
| 悬臂梁 最大位移 | 5.234 mm | 5.231 mm | 0.06 | PASS |
| 平板一阶固有频率 | 142.35 Hz | 141.89 Hz | 0.32 | PASS |
| 螺栓接触力 | 12,450 N | 12,870 N | 3.37 | FAIL |
| 整体能量守恒 | 99.97% | 99.96% | 0.01 | PASS |
| 最大von Mises应力 | 325.8 MPa | 326.1 MPa | 0.09 | PASS |
判定标准: 相对误差 < 1%: ■ 优良,1〜3%: ■ 需注意,> 3%: ■ FAIL(必须调查原因)
基线管理与容差设计
基线结果的管理
“基线”具体是指什么样的数据,又是如何管理的呢? 是保存在文件服务器上用Excel管理之类的吗?
绝对不能用Excel管理(笑)。基线管理的铁则是“将机器可读的格式,保存在版本管理的仓库中”。
具体来说,采用以下结构:
- 将基线JSON或CSV存储在Git仓库中
- 为每个基线关联元数据:求解器名称/版本、执行日期时间、网格尺寸、操作系统/编译器信息
- 结果值是标量值的提取结果(最大位移、最大应力、固有频率、反力合计等)
- 根据需要,也将场数据(节点位移分布、应力云图等)以二进制格式保存
原来如此。不是直接保存求解器的输出文件(.f06或.odb等),而是从中提取所需的数值进行保存啊。
是的。因为求解器输出文件有时会达到数GB。将提取的标量值以JSON格式保存,既可以利用Git的差异显示功能,也便于进行机械比较。例如,格式如下:
{
"model": "cantilever_beam_001",
"solver": "MSC Nastran",
"solver_version": "2024.1",
"date": "2026-01-15",
"os": "RHEL 8.9",
"results": {
"max_displacement_mm": 5.234,
"max_vonmises_mpa": 325.8,
"freq_mode1_hz": 142.35,
"reaction_force_n": 1000.02,
"energy_balance_pct": 99.97
}
}
容差标准的设计
容差是怎么设定的呢? 如果全部统一设为0.1%之类的,虽然简单…
统一设定会出问题。因为不同物理量的数值敏感度完全不同。需要根据物理量的种类及其数值对设计判断的影响方式来改变容差。
| 物理量 | 推荐容差 $\varepsilon_{rel}$ | 理由 |
|---|---|---|
| 位移(全局) | 0.1〜0.5% | 刚度主导,稳定。变动小 |
| 应力(最大值) | 1〜5% | 网格依赖性高。奇异点附近变动大 |
| 固有频率 | 0.5〜2% | 由质量/刚度平衡决定。相对稳定 |
| 反力合计 | 0.01〜0.1% | 由力的平衡决定,非常稳定 |
| 接触力 | 2〜10% | 强烈依赖于接触算法。求解器间差异大 |
| CFD 阻力系数 Cd | 1〜3% | 依赖于湍流模型和网格 |
| 温度(最大值) | 0.5〜2% | 热传导相对稳定但对流项有变动 |
应力和接触力的容差范围比较宽呢。确实,仅仅改变网格,应力值就会有很大变化。
这种感觉是正确的。另外重要的是,与安全系数直接相关的量,需要设定更严格的标准。例如,用于疲劳寿命评估的应力值,就需要比其他物理量更严格的标准。
多阶段判定的思路
如果是PASS或FAIL的二选一,只要稍微超过阈值,不就全部不合格了吗?
注意到关键点了。在实际工作中,3阶段判定是普遍做法:
- GREEN (PASS):$e_{rel} < \varepsilon_1$ — 没问题。自动批准
- AMBER (WARNING):$\varepsilon_1 \leq e_{rel} < \varepsilon_2$ — 需确认。工程师审查后判断
なった
詳しく
報告