MMS: 圧縮性オイラー方程式
圧縮性オイラー方程式MMSの理論基礎
保存形と検証対象
圧縮性オイラー方程式は、密度・運動量・全エネルギーの保存則系です(2次元・ソース項付き)。
$$ \frac{\partial \mathbf{Q}}{\partial t} + \nabla\cdot\mathbf{F}(\mathbf{Q}) = \mathbf{S}, \qquad \mathbf{Q} = \begin{pmatrix} \rho \\ \rho\mathbf{u} \\ E \end{pmatrix}, \quad E = \frac{p}{\gamma - 1} + \frac{1}{2}\rho|\mathbf{u}|^2 $$
MMSでは原始変数 \( (\rho_m, \mathbf{u}_m, p_m) \) の製造解を選び、保存形の左辺に代入して各方程式のソース項 \( \mathbf{S} = (s_\rho, \mathbf{s}_{\rho u}, s_E) \) を導出します。粘性項がないため導出自体はNavier-Stokesより短いものの、双曲型系ならではの難所——特性理論に基づく境界条件、正値性、衝撃捕捉スキームとの相互作用——が検証の主戦場になります。
製造解の設計——正値性と滑らかさ
熱伝導のMMSと同じノリでsin関数の製造解を入れたら、計算が「負の圧力」で即死しました…。
圧縮性MMSの洗礼だね。オイラー系では密度と圧力は物理的に正でなければならず、ソルバー側も正値性を前提に作られている。だから製造解は「一定値+小振幅の変動」の形で設計するのが定石だよ。例えば \( \rho_m = \rho_0\,[1 + 0.1\sin(\pi x)\cos(\pi y)] \) のように、変動振幅を基準値の10〜20%に抑えて全域で \( \rho_m > 0,\ p_m > 0 \) を保証する。ついでにマッハ数分布も設計対象で、亜音速で統一するか超音速で統一するかを最初に決める——境界条件の扱いが全く変わるからね。
特性理論と境界条件の本数
双曲型系では、境界で指定できる条件の数が流入特性の本数で決まります。2次元オイラーでは特性速度は \( u_n - c,\ u_n,\ u_n,\ u_n + c \) の4本(\( c \)は音速)で、境界の流れ状態により指定数が変わります。
| 境界の状態 | 流入特性数(2D) | 指定すべき量の例 |
|---|---|---|
| 超音速流入 | 4(全部) | 全変数を製造解で指定 |
| 亜音速流入 | 3 | 例: 全温・全圧・流れ角(1変数は内部から外挿) |
| 亜音速流出 | 1 | 例: 静圧のみ指定、他は外挿 |
| 超音速流出 | 0 | 全て外挿(何も指定しない) |
MMSでも同じ規則に従い、指定してよい本数だけを製造解の値で与えるのが正しい検証です。全境界で全変数をDirichlet固定すると、亜音速では過剰指定となり境界近傍に非物理的な誤差層が生じ、観測次数を汚します。これが圧縮性MMS最頻出の失敗です。
ソース項導出と次数検証の手法
導出は保存形で行う
ソース項はソルバーが離散化している形で導出します。有限体積ソルバーは保存形を解いているため、原始変数で書いた非保存形にソース項を導出して注入すると、連続レベルでは等価でも離散レベルの検証としては筋が悪くなります。SymPy等での手順は、①原始変数の製造解を定義、②保存変数とフラックスを記号的に構成、③ \( \partial_t \mathbf{Q} + \nabla\cdot\mathbf{F} \) を微分して各式のソース項を取得、④CSE(共通部分式除去)してコード生成、の流れです。エネルギー式のソース項は圧力仕事と運動エネルギーの微分が絡んで最長になるため、数値微分との乱数点照合を必ず通します。
リミッター・人工粘性を無効化して測る
圧縮性ソルバーは衝撃捕捉のためのリミッターや人工粘性を標準装備しています。これらは滑らかな解でも作動して局所的に次数を1次へ落とすことがあり、スキーム本来の次数検証を妨げます。検証の作法は2段階です。
- 第1段: リミッター無効(または滑らか領域で不活性なリミッター)で公称次数を確認 — 離散化そのものの検証
- 第2段: 実運用設定(リミッター有効)で次数がどこまで保たれるか記録 — 実運用の誤差挙動の把握。ここで次数が落ちること自体は仕様であり、落ち幅を知ることが目的
誤差評価は保存変数ごとに
誤差ノルムは \( \rho, \rho u, \rho v, E \)(または原始変数 \( \rho, u, v, p \))それぞれで計算し、全変数が公称次数で収束することを合否基準にします。1変数だけ次数が低い場合、その変数に関わる境界処理・フラックス評価に欠陥が絞り込めます(例: エネルギーだけ低い→境界での温度・圧力外挿の次数不足が典型)。時間積分を含む場合は、NS-MMSと同様に空間と時間の検証を分離します。
実務での適用手順
標準的な検証キャンペーンの構成
- 2D亜音速MMS — マッハ0.3〜0.5程度の滑らかな場。特性境界(流入3・流出1指定)の実装込みで次数確認
- 2D超音速MMS — マッハ1.5〜3程度。全指定流入・全外挿流出で境界の別経路を検証
- 3D化 — 方向ごとに波数を変えた製造解で次元固有のバグ(インデックス取り違え)を検出
- 実運用設定での再測定 — リミッター・人工粘性有効時の実効次数を記録
この4点セットで、フラックス評価・境界処理・多次元化の主要経路が一通りカバーできます。壁面(スリップ境界)を検証したい場合は、製造解の速度場を境界で壁に平行になるよう設計するか、壁面透過を許すソース項付き境界として扱うかを最初に決めます。
MASA収録解と既知厳密解の活用
MASAライブラリにはオイラー方程式用の検証済み製造解(2D/3D、亜音速設計)が収録されており、自前導出との照合先として有用です。また圧縮性には等エントロピー渦(isentropic vortex)の移流という厳密解があり、ソース項注入なしで時間発展スキームの次数を測れる定番ベンチマークです。「等エントロピー渦で基本を確認→MMSで境界・全項をカバー」の二段構えが、コード検証キャンペーンの実務的な定番構成です。
報告フォーマット
報告書には、①製造解の式と振幅・マッハ数設計、②境界タイプごとの指定量、③メッシュ系列と細分比、④変数別の誤差ノルム表と観測次数、⑤リミッター有効/無効それぞれの結果、を記載します。特に②は再現性の要で、「亜音速流入で何を指定したか」が書かれていない検証報告は第三者が追試できません。
ソルバー別の実施方法
ソルバー別対応表
| ソルバー | ソース項の注入 | 実務メモ |
|---|---|---|
| SU2 | ソースコード改造(オープンソース)、Python wrapperからのカスタムソース | 検証スイートにMMS事例あり。研究用途で実績多数 |
| OpenFOAM(rhoCentralFoam等) | fvOptions / ソルバー改造 | 中心風上系スキームのリミッター設定に注意 |
| Ansys Fluent(密度ベース) | UDF(DEFINE_SOURCE、各方程式) | エネルギー式ソースの単位(W/m³)とEの定義を照合 |
| 自製コード | 生成コード直接組込み | 検証自由度最大。CIへの次数テスト組込みが容易 |
実装前に確認すべき「定義の相違」チェックリスト
- 全エネルギーの定義 — \( E \)(体積あたり全エネルギー)か \( e \)(内部エネルギー)か \( h_0 \)(全エンタルピー)か。エネルギー式ソース項の形が変わる
- 比熱比・気体定数 — 導出時の \( \gamma, R \) とソルバー設定値の一致。空気既定値(1.4 / 287)の暗黙の仮定に注意
- 無次元化 — ソルバー内部が無次元の場合、ソース項も同じ基準量で無次元化して渡す
- ソース項の符号規約 — 右辺加算か左辺移項か。マニュアルの方程式の書き方に合わせる
先端研究の動向
高次スキーム(DG・FR)の検証競争
不連続ガレルキン(DG)やFlux Reconstruction系の高次スキームは、公称次数が4次・6次と高いぶん、MMSによる次数実証が開発文化として徹底しています。国際ワークショップ(高次CFD手法の比較企画)では、共通のMMS・等エントロピー渦問題で「誤差 vs 自由度」「誤差 vs 計算時間」を横並び比較するのが標準プロトコルになっており、MMSは単なる社内検証を超えてスキーム間比較の共通言語になっています。
エントロピー安定スキームと構造保存
離散レベルでエントロピー不等式を満たすエントロピー安定スキームの発展に伴い、検証項目も「次数」だけでなく構造の保存(エントロピー収支・運動エネルギー保存性・自由流保持)へ拡大しています。MMSで次数を確認した上で、自由流保持テスト(一様流が乱れないか)・エントロピー収支の測定を重ねる多層検証が、現代の圧縮性ソルバー開発の標準です。
衝撃波を含む検証の研究
滑らかなMMSは衝撃捕捉能力を検証できません。不連続を含む検証には、衝撃関係式を厳密に満たす区分的製造解、移動衝撃波の厳密解、衝撃適合メッシュとの比較などが研究されています。実務的な整理は「滑らか領域の次数はMMSで、衝撃の位置・強さはRiemann問題系ベンチマークで」という役割分担です。衝撃を跨ぐ大域ノルムの次数は理論的に1次へ落ちるため、そこで高次を要求するのは検証設計の誤りになります。
トラブル対応
症状別の原因と対策
| 症状 | 考えられる原因 | 対策 |
|---|---|---|
| 負の密度・圧力で即発散 | 製造解の変動振幅が大きすぎる | 振幅を基準値の10〜20%へ。全域の最小 \( \rho_m, p_m \) を導出時に確認 |
| 境界近傍だけ誤差が大きく次数低下 | 亜音速境界の過剰指定、ghost cell外挿の次数不足 | 特性理論通りの指定本数へ修正。境界外挿を内部スキームと同次数に |
| 次数が全域で1次に張り付く | リミッター・人工粘性が滑らか解で作動 | 第1段検証では無効化。TVB定数等の閾値を確認 |
| エネルギーだけ次数が低い | Eの定義違い、境界での温度/圧力外挿の欠陥 | 定義チェックリストを照合。変数別誤差で境界を分離評価 |
| ソース項を入れると定常に収束しない | ソース項の時間依存分の入れ忘れ/定常MMSに時間項混入 | 定常検証なら製造解から \( t \) を除く。残差の停滞レベルを確認 |
| 2Dは合格・3Dで次数が出ない | 方向インデックスの取り違え、z方向フラックスのバグ | 方向ごとに波数を変えた製造解で誤差の方向依存を確認 |
切り分けの最短経路
境界が悪いのか、フラックスが悪いのか、ソース項が悪いのか…切り分けの順番はありますか?
3手で絞れるよ。手1: ソース項の乱数点照合——これで導出とコード生成を無罪化する。手2: 周期境界の製造解(全方向周期の場を使う)——境界処理を検証から外して、内部スキームだけの次数を測る。ここで次数が出なければフラックス・再構成が犯人。手3: 境界タイプを1種類ずつ戻す——周期→超音速流入出→亜音速流入出の順に難度を上げ、どの境界で壊れるか特定する。誤差の空間分布を併せて見れば、犯人の居場所は境界近傍か全域かで一目瞭然だ。この手順は圧縮性に限らず双曲型系のMMS全般で使える定石だよ。
関連トピック
なった
詳しく
報告