SU2 CFD求解器
理论:用一次伴随计算求形状优化梯度
概述
开源CFD中OpenFOAM很有名,为什么要选SU2?
当你想自动改进形状的时候。SU2诞生于斯坦福大学的航空航天设计实验室,它不仅求解流动,还能用伴随法高效计算“为了进一步降低阻力,形状该往哪个方向变”的梯度。用几十到几百个变量描述机翼形状进行优化时,这个梯度的计算成本决定了总时间。OpenFOAM在物理模型的种类和自由度上更胜一筹,但SU2一开始就提供了形状优化的整套流程(形状变形、流动计算、伴随计算、梯度计算、形状更新)。应按用途选择。
伴随方程
J为目标函数(如阻力),α为设计变量,U为流动解,R为离散方程的残差,ψ为伴随变量。只要求解一次右边的伴随方程,无论设计变量有多少,都能用左式得到全部梯度。SU2用自动微分实现了直接对离散方程求导的离散伴随。
源于翼型设计的工具
把伴随法正式引入流体形状设计,一般认为始于1980年代末詹姆森的研究,他用流动方程的伴随求解翼型压力分布的反设计问题。SU2是继承这一脉络的斯坦福大学实验室于2012年公开的代码,此后全世界的大学和企业参与开发,功能扩展到湍流、多物理场和多级优化。
算例
例1:梯度计算时间(单次流动计算2小时,20次迭代)
| 设计变量 | 差分(每次) | 伴随(每次) | 比 | 20次迭代:差分 | 20次迭代:伴随 |
|---|---|---|---|---|---|
| 10 | 22小时 | 4.6小时 | 5 | 440小时(18天) | 92小时 |
| 50 | 102小时 | 4.6小时 | 22 | 2,040小时(85天) | 92小时 |
| 200 | 402小时 | 4.6小时 | 87 | 8,040小时(335天) | 92小时 |
假设伴随计算成本为流动计算的1.3倍(随问题和设置而变)。伴随法的时间与设计变量数无关。
例2:湍流平板验证的第一层厚度(空气,50 m/s)
| 位置 x | Re_x | C_f | u_τ | y⁺=1厚度 | y⁺=30厚度 |
|---|---|---|---|---|---|
| 0.1 m | 3.33×10⁵ | 0.00465 | 2.41 m/s | 6.2 μm | 187 μm |
| 0.5 m | 1.67×10⁶ | 0.00337 | 2.05 m/s | 7.3 μm | 219 μm |
| 1.0 m | 3.33×10⁶ | 0.00294 | 1.92 m/s | 7.8 μm | 235 μm |
壁面解析型湍流模型(如标准SA模型)以y⁺≈1为目标,平板前缘附近摩擦更大,第一层需更薄。把计算得到的摩擦系数与上面的经验公式比较,看是否在几个百分点内一致。
配置文件怎么写?
SU2把所有条件写在一个文本配置文件(.cfg)里。湍流平板计算用 SOLVER= RANS、KIND_TURB_MODEL= SA 选择方程和模型,用 MACH_NUMBER、REYNOLDS_NUMBER 设定流动条件,用 MARKER_HEATFLUX= ( wall, 0.0 ) 指定绝热壁,用 MARKER_FAR 指定远场边界。数值方法一般用 CONV_NUM_METHOD_FLOW= ROE 和 MUSCL_FLOW= YES 设为二阶迎风格式。进入形状优化时指定 MATH_PROBLEM= DISCRETE_ADJOINT 和 OBJECTIVE_FUNCTION= DRAG,用自由变形(FFD)控制点表示形状,用附带的Python脚本(shape_optimization.py)反复进行流动计算、伴随计算和形状更新。从官方教程的配置文件出发,只替换网格和条件,最不容易出错。
使用流程
- 原样运行并复现官方教程中的同类问题。
- 换成自己的网格,确认y⁺和收敛(残差和阻力历史)。
- 在平板等验证问题上,把摩擦和压力分布与参考解比较。
- 用少量变量把伴随梯度与差分梯度比较确认。
- 用FFD表示形状,加入约束(厚度、升力)运行优化。
“梯度对不上的优化”
某管道压损的优化中,无论迭代多少次目标函数都不下降。把伴随梯度与两个设计变量的差分梯度比较,连符号都对不上。原因是流动计算未充分收敛就进入了伴随计算。把收敛判据加严到残差下降4个数量级,并让湍流模型方程也收敛后,梯度与差分在1%以内一致,优化几次后压损开始下降。
常见错误
错误与对策
| 错误 | 后果 | 对策 |
|---|---|---|
| 流动计算收敛不足 | 梯度出错 | 使残差充分下降 |
| 不确认梯度 | 优化不前进 | 与差分比较 |
| 不确认y⁺ | 摩擦阻力出错 | 由目标y⁺定第一层 |
| 不加约束 | 形状过薄 | 厚度和升力约束 |
| FFD框未覆盖形状 | 不变形或损坏 | 确认框的位置 |
我想了解相关内容。