スタガード格子 — CAE用語解説
スタガード格子
CFDの教科書で「スタガード格子」と「コロケーション格子」が出てきたんですけど、何が違うんですか?
理論と物理
スタガード格子の基本概念
スタガード格子って、教科書で見かける「速度と圧力が格子点上でずれている」という説明がよくわからないんです。なぜわざわずずらす必要があるんですか?
良い質問だ。核心は「圧力振動(チェッカーボード不安定性)」の抑制にある。全ての変数を同じ格子点(コロケート格子)で定義すると、圧力勾配項の離散化で、隣接する圧力が計算に全く寄与しない奇妙な離散化が生じる。例えば、x方向の運動方程式で、
「情報が失われる」というのは具体的にどういう状態なんですか?発散する例はありますか?
例えば、二次元のキャビティ流れで、初期条件を全ての格子点で圧力p=0、速度u=0とし、コロケート格子を使うとしよう。ソルバーが連続の式を満たそうとして圧力を修正する時、隣接しない格子点(チェッカーボード模様のように)で交互に正負の圧力が発生する解も数式的に許容されてしまう。このモードは減衰せず、速度場にノイズとして乗り、Re=1000でも数ステップで発散する。スタガード格子は、速度成分の定義点を半格子分ずらすことで、自然に圧力勾配を評価するための隣接圧力情報を取り込む構造を作る。これが1965年にHarlowとWelchが提案した本質的な理由だ。
支配方程式との関係は?ナビエ-ストークス方程式のどの項の離散化が特に問題になるんですか?
特に非圧縮性流れの運動方程式における圧力勾配項と、連続の式(速度の発散=0)だ。非定常項と移流項、粘性項はコロケートでも問題ない。スタガード配置では、u速度点で評価するx方向運動方程式の圧力勾配は、
数値解法と実装
離散化とソルバー設定
スタガード格子を実際にコーディングする時、データの持ち方はどうするんですか?速度u, vと圧力pで別々の配列を用意するんですか?
その通り。2次元の場合、圧力pはセル中心に定義するので、配列サイズを[Nx, Ny]とする。x方向速度uはセルの左右面(x方向にスタガード)に定義するので、配列サイズは[Nx+1, Ny]になる。y方向速度vは上下面に定義で[Nx, Ny+1]だ。例えば、計算領域が1m x 1mで、格子数が100x100なら、pは100x100、uは101x100、vは100x101の配列を確保する。これが「スタガード」の実体だ。
境界条件の設定が難しそうですが、特に流入境界ではどう処理するんですか?
ここが実装の肝だ。左側を流入境界(x=0)としよう。この境界はu速度点と一致している。だから流入速度U_inは直接、u[0, :] = U_inと設定できる。しかし、圧力点p[0, :]は境界から半格子内側にある。ここには通常、Neumann条件(∂p/∂x=0)を差分化して与える。具体的には、仮想的な境界外の圧力点p[-1, :]を考え、
ソルバーにはSIMPLE法を使うと習いましたが、圧力修正方程式の係数行列はどう作るんですか?コロケートと違いますか?
根本的に違う。スタガード格子では、圧力修正p'の方程式は、連続の式を満たすように導出されるが、離散化された連続の式はセル中心で評価される。例えばセル(i,j)では、
実践ガイド
ワークフローとチェックリスト
商用ソフトでスタガード格子を使う計算を設定する時、ユーザーが意識すべき設定項目は何ですか?「スタガード格子を使います」というチェックボックスがあるわけではないですよね?
その通り、明示的な選択肢は少ない。まず「スキームの選択」で決まる。例えば、Ansys Fluentで「Pressure-Based」ソルバーを選んだ時、デフォルトの空間離散化スキームは、圧力が「PRESTO!」または「Second Order」、速度が「Second Order Upwind」などだ。この時、内部ではスタガード的な配置(FluentではコリocatedだがRhie-Chow補間で振動抑制)が使われる。純粋なスタガードを実装しているのは、古いコードや研究用コードだ。ユーザーが確認すべきは「圧力-速度連成アルゴリズム」(SIMPLE, SIMPLEC, PISO)と「勾配の再構成方法」だ。これらがチェッカーボードを抑制するロジックを担っている。
計算結果の検証で、スタガード格子特有の注意点はありますか?例えば、後処理で速度と圧力を同じ位置に補間する時の精度低下など。
重要な指摘だ。結果を可視化する際、全ての変数を同じ位置(通常はセル中心)に補間する必要がある。単純な線形補間で済むが、特に壁面近くのせん断応力や圧力係数を評価する時は注意が必要だ。壁面せん断応力τ_wは、壁面での速度勾配
非構造格子ではスタガード格子は使えないんですか?
非構造格子でも概念は適用可能だが、実装は複雑だ。いわゆる「コリケーテッド格子」が主流となった理由だ。非構造格子では、全ての変数をセル中心(または節点)に定義し、Rhie-Chowの補間法などの手法で圧力振動を抑制する。OpenFOAMの非構造FVMソルバーの多くはこのアプローチだ。ただし、一部の専門コードでは、非構造「スタガード」格子として、速度を面心に定義する実装もある(MAC法の拡張)。しかし、データ構造と境界条件処理が非常に煩雑になるため、汎用CFDソフトウェアではほぼ採用されていない。
ソフトウェア比較
各ソフトウェアでの扱い
Ansys FluentとSiemens Star-CCM+では、スタガード格子の考え方は内部的にどう扱われているんですか?
両者とも、現代的な実装では「コリケーテッド格子」を基盤としつつ、スタガード格子の利点を取り入れたハイブリッド手法を使っている。
2. **Siemens Star-CCM+**: こちらも同様にコリケーテッドアプローチを採用している。その上で、離散化スキームとして「Second Order」を選ぶと、対流項と拡散項に加え、圧力勾配項にも中心差分を適用し、Rhie-Chow型の補間が働く。Star-CCM+のマニュアルでは、この問題を「odd-even decoupling」として言及し、自動的に抑制していると説明されている。
では、純粋なスタガード格子を今でも使っている商用ソフトはないんですか?
汎用コードではほぼないが、特定分野に特化したコードでは残っている。例えば、建築風工学でよく使われる**PHOENICS**の初期バージョンは、古典的なスタガード格子(MAC法)を採用していた。また、オープンソースでは、**NASAのCART3D**(航空機用パネル法/CFDハイブリッドコード)の内部ソルバーなどに名残が見られる。しかし、データ処理の煩雑さと、非構造格子への拡張性の低さから、主流はRhie-Chow補間付きコリケーテッド格子に移行した。この移行は1990年代後半にほぼ完了したと言っていい。
OpenFOAMではどうでしょうか?`icoFoam`などのソルバーはスタガード格子を使っていますか?
`icoFoam`を含むOpenFOAMのほとんどのソルバーは、**非構造有限体積法に基づくコリケーテッド格子**を使用している。変数はすべてセル中心に定義される。圧力-速度連成には、**PISO**または**SIMPLE**アルゴリズムが用いられ、その内部で面心での速度補間(`interpolate(U)`)が実行される。この補間過程で、暗黙的にRhie-Chowと同様の効果が得られるように設計されている。つまり、OpenFOAMユーザーが「スタガード格子を設定する」必要はない。ただし、離散化スキームの設定ファイル(`fvSchemes`)で、`div`(発散項)や`grad`(勾配項)のスキームを選択することが、結果的にこの振動抑制の強さに影響する。
トラブルシューティング
よくあるエラーと対策
自作コードでスタガード格子を実装したら、低速流れでないと発散してしまいます。考えられる原因は何ですか?
まず疑うべきは「ソルバーの発散」ではなく「離散化自体の不安定性」だ。具体的には以下の点をチェックせよ。
2. **Under-Relaxation Factor (緩和係数)**: スタガード格子+SIMPLE法では、圧力と速度に緩和係数が必要だ。典型的な値は、圧力α_p=0.3、速度α_u=α_v=0.7。これを1.0(無緩和)にすると高レイノルズ数で発散しやすい。
3. **境界条件の一貫性**: 流出境界でNeumann条件(∂p/∂n=0)を正しく課しているか?圧力の参照点を1点固定しているか?固定していないと、圧力場が定数だけ浮遊して収束判定を誤る。
計算は収束するのですが、壁近くの速度プロファイルが理論解(ブラジウス解など)からずれます。格子の粗さ以外の原因は?
スタガード格子特有の原因として、「壁面での速度勾配評価の精度」が挙げられる。壁面上のせん断応力τ_wを、壁面と最初のu速度点の差で
壁面での無滑り条件(u_wall=0)と、u_0とu_1を使った高次補間(例えば二次精度)でu_0を決めることだ。具体的には、u_1とu_2を使って壁面での勾配を二次精度で外挿し、
圧力のコンター図を見ると、セル境界でギザギザした模様(弱いチェッカーボード)が残っていることがあります。これはスタガード格子が機能していない証拠ですか?
必ずしもそうとは限らない。考えられる原因は二つ。
2. **高いレイノルズ数と中心差分**: 移流項に中心差分スキームを使い、かつレイノルズ数が高い場合、数値振動が発生し、それが圧力場に伝播することがある。これはスタガード格子の欠点ではなく、移流項の離散化の問題だ。対策としては、移流項に一次風上差分や、高次精度の風上型スキーム(QUICK, MUSCL)を試す。あるいは、**ハイブリッド差分**や**べき乗則**スキームを適用する。Ansys Fluentで同様の現象が起きたら、「Solution Methods」で「Spatial Discretization」の「Momentum」を「Second Order Upwind」に変更することを推奨する。
3次元への拡張で、特に注意すべき点は何ですか?
データ管理とインデックス付けの複雑さが飛躍的に増す。圧力pは[Nx, Ny, Nz]、速度uは[Nx+1, Ny, Nz]、vは[Nx, Ny+1, Nz]、wは[Nx, Ny, Nz+1]となる。セル(i,j,k)に対する連続の式は、
関連トピック
なった
詳しく
報告