SU2 CFDソルバー
理論:形状最適化の勾配を1回の随伴計算で求める
概要
オープンソースのCFDならOpenFOAMが有名ですが、SU2を選ぶ理由は何ですか?
形状を自動で改良したいときだ。SU2はスタンフォード大学の航空宇宙設計の研究室で生まれたCFDコードで、流れを解くだけでなく、「抗力をもっと下げるには形をどちらに動かせばよいか」という勾配を、随伴法で効率よく計算できる。翼の形を数十から数百の変数で表して最適化するとき、この勾配の計算コストが全体の時間を決める。OpenFOAMは物理モデルの種類と自由度で勝るが、形状最適化の一連の流れ(形状の変形、流れ計算、随伴計算、勾配の計算、形状の更新)をまとめて回す仕組みは、SU2が最初から用意している。用途で選び分けるのがよい。
随伴法の式
J は目的関数(抗力など)、α は設計変数、U は流れの解、R は離散化した方程式の残差、ψ は随伴変数。右の随伴方程式を1回解けば、設計変数がいくつあっても左の式で全ての勾配が得られる。SU2は離散化した方程式をそのまま微分する離散随伴を自動微分で実装している。
翼型設計から生まれた道具
随伴法を流体の形状設計に本格的に持ち込んだのは、1980年代末からのジェイムソンの研究とされる。翼型の圧力分布を目標に近づける問題を、流れの方程式の随伴を使って解いた。SU2は、その流れをくむスタンフォード大学の研究室が2012年に公開したコードで、以後、世界中の大学や企業が開発に参加して、乱流・多物理・多段の最適化へと機能を広げてきた。
計算例
例1:勾配の計算時間(流れ計算1回2時間、20回反復)
| 設計変数 | 差分(1回) | 随伴(1回) | 比 | 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:乱流平板の検証に向けた第1層の厚さ(空気、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が目安で、平板の上流端ほど摩擦が大きく第1層を薄くする必要がある。計算した摩擦係数を上の経験式と比べ、数%以内で一致するかを見る。
設定ファイルはどう書くのですか?
SU2は1つのテキストの設定ファイル(.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 で2次精度の風上法にするのが一般的だ。形状最適化に進むときは MATH_PROBLEM= DISCRETE_ADJOINT と OBJECTIVE_FUNCTION= DRAG を指定し、形状を自由形状変形(FFD)の制御点で表して、付属のPythonスクリプト(shape_optimization.py)で流れ計算・随伴計算・形状更新を繰り返す。最初は公式のチュートリアルの設定ファイルを元にして、メッシュと条件だけを入れ替えるのが失敗しにくい。
使い方の流れ
- 公式チュートリアルの同種の問題を、そのまま実行して再現する。
- 自分のメッシュに差し替え、y⁺と収束(残差・抗力の履歴)を確認する。
- 平板などの検証問題で、摩擦や圧力分布を参照解と比べる。
- 随伴計算の勾配を、少数の変数で差分の勾配と比べて確かめる。
- FFDで形状を表し、制約(厚さ・揚力)を入れて最適化を回す。
「勾配が合わなかった最適化」
あるダクトの圧力損失の最適化で、何回反復しても目的関数が下がらなかった。随伴法の勾配を、2つの設計変数について差分の勾配と比べると、符号さえ合っていなかった。原因は、流れ計算が十分に収束しないまま随伴計算に進んでいたことだった。収束判定を残差で4桁下げる条件に厳しくし、乱流モデルの方程式も含めて収束させると、勾配は差分と1%以内で一致し、最適化は数回で損失を下げ始めた。
よくある間違い
間違いと対策
| 間違い | 起きること | 対策 |
|---|---|---|
| 流れ計算の収束不足 | 勾配が誤る | 残差を十分下げる |
| 勾配を確かめない | 最適化が進まない | 差分と比較 |
| y⁺を確認しない | 摩擦抵抗を誤る | 目標y⁺から第1層 |
| 制約を入れない | 薄すぎる形状 | 厚さ・揚力の制約 |
| FFDの箱が形状を覆わない | 変形しない・壊れる | 箱の位置を確認 |
関連する内容も知りたいです。
関連するページはOpenFOAM入門、Elmerマルチフィジックス、Spalart-Allmarasモデル、感度解析、インフレーション層が参考になる。
関連トピック
なった
詳しく
報告