MMS:Spalart-Allmaras湍流模型
理论:先定答案再构造源项
概述
湍流模型实现是否正确,和实验比较不就知道了吗?
与实验不符时,分不清是模型局限还是程序错误;碰巧吻合也可能只是错误与其他误差相互抵消。程序是否正确求解方程,需要与实验分开确认。这就是验证(verification),制造解方法是其中有力的手段。自己确定解代入方程,把多余部分作为源项加入,确定的解就成为精确解。之后只需看网格加密时误差是否按理论速度下降。SA模型这类含多个非线性项的方程,经常出现漏项或系数错误,用这种方法就能发现。
简化的一维SA方程
从SA模型ν̃输运方程中去掉对流,耗散项修正函数取fw = 1,涡量大小取S = 1。常数σ = 2/3,cb1 = 0.1355,cb2 = 0.622,cw1 = cb1/κ² + (1 + cb2)/σ = 3.239(κ = 0.41)。区间0.1 ≤ y ≤ 1,壁面距离d = y,分子运动粘度ν = 0.1(无量纲)。
制造解与观测阶
L为左边算子。源项f用符号计算(sympy)求得。e_h为网格宽h时的L2误差。
SA模型与验证文化
Spalart-Allmaras模型是1992年为飞机外部流动发表的一方程湍流模型,因易于使用而广泛应用。但各实现在细节处理上略有不同,同一问题结果对不上成了问题。NASA的Turbulence Modeling Resource汇总了标准公式形式和验证算例,使多个程序能确认网格加密后是否收敛到同一答案。制造解验证也用于这类实现确认。
算例
例:网格加密时的误差(二阶中心差分、牛顿法求解)
| 实现 | 20等分 | 40等分 | 80等分 | 160等分 | 观测阶 |
|---|---|---|---|---|---|
| 正确实现 | 3.40×10⁻³ | 8.38×10⁻⁴ | 2.08×10⁻⁴ | 5.19×10⁻⁵ | 2.02 / 2.01 / 2.00 |
| 漏掉cb2项 | 1.37×10⁻¹ | 1.34×10⁻¹ | 1.33×10⁻¹ | 1.33×10⁻¹ | 0.03 / 0.01 / 0.01 |
| 界面扩散系数取单侧值 | 7.98×10⁻³ | 3.32×10⁻³ | 1.55×10⁻³ | 7.52×10⁻⁴ | 1.26 / 1.10 / 1.04 |
观测阶由相邻两套网格误差之比求得。正确实现按理论收敛到2。
漏掉cb2项误差完全不降,而单侧扩散系数时误差仍在下降。
两者性质不同。漏掉cb2项意味着程序求解的方程本身不同,网格再细也只是接近另一个方程的解,误差停在0.13左右。这很容易发现。而界面扩散系数取单侧值的错误,方程正确,只是离散精度从二阶降到一阶。网格加密仍会接近正确解,所以只看一套网格的结果或与实验比较都难以察觉。但看观测阶为1.04,与理论值2不符,一眼就能看出。阶数验证的意义在于不仅看误差大小,还看误差减小的方式。
验证流程
- 选择光滑且能激活所有项的制造解(各阶导数都不为0)。
- 源项用符号计算生成,避免手抄错误。
- 在3~4套网格上计算误差,求观测阶。
- 阶数与理论不符时,逐项去掉以缩小原因范围。
- 验证期间关闭壁面函数、限制器等会降低精度的机制。
“平板摩擦明明对上了”
某自研求解器加入SA模型后,平板边界层壁面摩擦与实验吻合在百分之几以内。但用制造解验证时观测阶达不到2,误差中途停止下降。调查发现cb2项的系数忘了除以σ。平板边界层中该项影响相对较小,被其他误差掩盖。在有分离的流动中结果变化很大,修正后与另一程序的结果吻合良好。
常见错误
错误与对策
| 错误 | 后果 | 对策 |
|---|---|---|
| 以与实验吻合当作已验证 | 实现错误残留 | 用MMS确认阶数 |
| 使部分项为0的制造解 | 漏掉这些项的错误 | 激活所有项的解 |
| 手工推导源项 | 源项本身出错 | 符号计算 |
| 网格过粗 | 未进入渐近区 | 用4套以上确认 |
| 保留限制器 | 阶数下降 | 验证期间关闭 |
我想了解相关内容。
相关页面参考MMS概述、收敛阶检查、制造解源项、MMS:纳维-斯托克斯方程和MMS:欧拉方程。