スタガード格子 — CAE用語解説

カテゴリ: 用語集 | 2026-01-15
CAE visualization for staggered grid - technical simulation diagram

スタガード格子

🧑‍🎓

CFDの教科書で「スタガード格子」と「コロケーション格子」が出てきたんですけど、何が違うんですか?

# スタガード格子 — CAE用語解説

理論と物理

スタガード格子の基本概念

🧑‍🎓

スタガード格子って、教科書で見かける「速度と圧力が格子点上でずれている」という説明がよくわからないんです。なぜわざわずずらす必要があるんですか?

🎓

良い質問だ。核心は「圧力振動(チェッカーボード不安定性)」の抑制にある。全ての変数を同じ格子点(コロケート格子)で定義すると、圧力勾配項の離散化で、隣接する圧力が計算に全く寄与しない奇妙な離散化が生じる。例えば、x方向の運動方程式で、

$$ -\frac{1}{\rho} \frac{\partial p}{\partial x} $$
を中心差分で近似する時、p(i,j)とp(i+1,j)の差を使うが、これではp(i+1, j)とp(i-1, j)の情報が失われる。これが非物理的な高周波の圧力振動を生み、計算を発散させる。

🧑‍🎓

「情報が失われる」というのは具体的にどういう状態なんですか?発散する例はありますか?

🎓

例えば、二次元のキャビティ流れで、初期条件を全ての格子点で圧力p=0、速度u=0とし、コロケート格子を使うとしよう。ソルバーが連続の式を満たそうとして圧力を修正する時、隣接しない格子点(チェッカーボード模様のように)で交互に正負の圧力が発生する解も数式的に許容されてしまう。このモードは減衰せず、速度場にノイズとして乗り、Re=1000でも数ステップで発散する。スタガード格子は、速度成分の定義点を半格子分ずらすことで、自然に圧力勾配を評価するための隣接圧力情報を取り込む構造を作る。これが1965年にHarlowとWelchが提案した本質的な理由だ。

🧑‍🎓

支配方程式との関係は?ナビエ-ストークス方程式のどの項の離散化が特に問題になるんですか?

🎓

特に非圧縮性流れの運動方程式における圧力勾配項と、連続の式(速度の発散=0)だ。非定常項と移流項、粘性項はコロケートでも問題ない。スタガード配置では、u速度点で評価するx方向運動方程式の圧力勾配は、

$$ -\frac{1}{\rho} \frac{p_{i+1,j} - p_{i,j}}{\Delta x} $$
となる。ここで使う圧力p(i,j)とp(i+1,j)は、元々u速度点から見て左右に位置する「セル中心」の圧力点であり、これらは互いに隣接している。これが、コロケート格子で生じる「飛び飛びの点を使う」問題を根本から解決している。

数値解法と実装

離散化とソルバー設定

🧑‍🎓

スタガード格子を実際にコーディングする時、データの持ち方はどうするんですか?速度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, :]を考え、

$$ \frac{p_{0,j} - p_{-1,j}}{\Delta x} = 0 $$
から p[-1,j] = p[0,j] として、内部の差分式に代入する。v速度は境界上に定義点がないので、線形外挿などでゴーストセルの値を決める。

🧑‍🎓

ソルバーにはSIMPLE法を使うと習いましたが、圧力修正方程式の係数行列はどう作るんですか?コロケートと違いますか?

🎓

根本的に違う。スタガード格子では、圧力修正p'の方程式は、連続の式を満たすように導出されるが、離散化された連続の式はセル中心で評価される。例えばセル(i,j)では、

$$ \frac{u_{i,j} - u_{i-1,j}}{\Delta x} + \frac{v_{i,j} - v_{i,j-1}}{\Delta y} = 0 $$
となる。ここに速度修正と圧力修正の関係(
$$ u' = - ( \Delta t / \rho ) ( \partial p' / \partial x ) $$
的な)を代入すると、p'に対する5点差分(2次元)の方程式が得られる。この係数行列は対角優位で、コロケート格子に比べてはるかに条件が良く、反復ソルバーが収束しやすい。これがスタガード格子の隠れた利点だ。

実践ガイド

ワークフローとチェックリスト

🧑‍🎓

商用ソフトでスタガード格子を使う計算を設定する時、ユーザーが意識すべき設定項目は何ですか?「スタガード格子を使います」というチェックボックスがあるわけではないですよね?

🎓

その通り、明示的な選択肢は少ない。まず「スキームの選択」で決まる。例えば、Ansys Fluentで「Pressure-Based」ソルバーを選んだ時、デフォルトの空間離散化スキームは、圧力が「PRESTO!」または「Second Order」、速度が「Second Order Upwind」などだ。この時、内部ではスタガード的な配置(FluentではコリocatedだがRhie-Chow補間で振動抑制)が使われる。純粋なスタガードを実装しているのは、古いコードや研究用コードだ。ユーザーが確認すべきは「圧力-速度連成アルゴリズム」(SIMPLE, SIMPLEC, PISO)と「勾配の再構成方法」だ。これらがチェッカーボードを抑制するロジックを担っている。

🧑‍🎓

計算結果の検証で、スタガード格子特有の注意点はありますか?例えば、後処理で速度と圧力を同じ位置に補間する時の精度低下など。

🎓

重要な指摘だ。結果を可視化する際、全ての変数を同じ位置(通常はセル中心)に補間する必要がある。単純な線形補間で済むが、特に壁面近くのせん断応力や圧力係数を評価する時は注意が必要だ。壁面せん断応力τ_wは、壁面での速度勾配

$$ \tau_w = \mu \frac{\partial u}{\partial y} |_{wall} $$
から求めるが、最も内側のu速度点は壁からΔy/2の位置にある。一次精度の差分を使うと誤差が大きい。商用ソフト(Star-CCM+など)は、後処理で高次補間を適用しているが、ユーザーが自作コードで計算する場合は、少なくとも二次精度の片側差分を使うべきだ。また、体積流量の計算では、断面を横切る速度成分が既に断面の位置で定義されているので、補間なしで直接和を取れる利点もある。

🧑‍🎓

非構造格子ではスタガード格子は使えないんですか?

🎓

非構造格子でも概念は適用可能だが、実装は複雑だ。いわゆる「コリケーテッド格子」が主流となった理由だ。非構造格子では、全ての変数をセル中心(または節点)に定義し、Rhie-Chowの補間法などの手法で圧力振動を抑制する。OpenFOAMの非構造FVMソルバーの多くはこのアプローチだ。ただし、一部の専門コードでは、非構造「スタガード」格子として、速度を面心に定義する実装もある(MAC法の拡張)。しかし、データ構造と境界条件処理が非常に煩雑になるため、汎用CFDソフトウェアではほぼ採用されていない。

ソフトウェア比較

各ソフトウェアでの扱い

🧑‍🎓

Ansys FluentとSiemens Star-CCM+では、スタガード格子の考え方は内部的にどう扱われているんですか?

🎓

両者とも、現代的な実装では「コリケーテッド格子」を基盤としつつ、スタガード格子の利点を取り入れたハイブリッド手法を使っている。

1. **Ansys Fluent**: デフォルトの「Pressure-Based」ソルバーでは、全ての変数(圧力、速度)をセル中心に保存する(コリケーテッド)。しかし、運動方程式の圧力勾配項の評価と、連続の式からの圧力修正方程式の構築に、「Rhie-Chow速度補間」を適用する。これは本質的に、スタガード格子で得られるのと同じ圧力-速度連成の効果を、コリケーテッド格子のデータ構造上で再現する技法だ。Fluent 14.0以降、この補間はデフォルトで適用され、ユーザーが無効にすることはほぼない。
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`(勾配項)のスキームを選択することが、結果的にこの振動抑制の強さに影響する。

トラブルシューティング

よくあるエラーと対策

🧑‍🎓

自作コードでスタガード格子を実装したら、低速流れでないと発散してしまいます。考えられる原因は何ですか?

🎓

まず疑うべきは「ソルバーの発散」ではなく「離散化自体の不安定性」だ。具体的には以下の点をチェックせよ。

1. **圧力修正方程式のソース項**: 連続の式の残差(質量不均衡)を正しく計算しているか?セル(i,j)での離散連続式は、先述の通り
$$ [ (u_{i,j} - u_{i-1,j})/Δx + (v_{i,j} - v_{i,j-1})/Δy ] $$
だ。インデックスを間違えていないか。
2. **Under-Relaxation Factor (緩和係数)**: スタガード格子+SIMPLE法では、圧力と速度に緩和係数が必要だ。典型的な値は、圧力α_p=0.3、速度α_u=α_v=0.7。これを1.0(無緩和)にすると高レイノルズ数で発散しやすい。
3. **境界条件の一貫性**: 流出境界でNeumann条件(∂p/∂n=0)を正しく課しているか?圧力の参照点を1点固定しているか?固定していないと、圧力場が定数だけ浮遊して収束判定を誤る。

🧑‍🎓

計算は収束するのですが、壁近くの速度プロファイルが理論解(ブラジウス解など)からずれます。格子の粗さ以外の原因は?

🎓

スタガード格子特有の原因として、「壁面での速度勾配評価の精度」が挙げられる。壁面上のせん断応力τ_wを、壁面と最初のu速度点の差で

$$ \tau_w = \mu \frac{u_{1} - u_{wall}}{\Delta y / 2} $$
と一次精度で計算していないか?これでは誤差が大きい。対策は、仮想的な壁面より半格子外のゴーストセル速度u_0を定義し、

壁面での無滑り条件(u_wall=0)と、u_0とu_1を使った高次補間(例えば二次精度)でu_0を決めることだ。具体的には、u_1とu_2を使って壁面での勾配を二次精度で外挿し、

$$ u_0 = -u_1 + \frac{1}{3}u_2 $$
といった関係を課す。これで壁面近傍の速度プロファイル精度が大幅に向上する。

🧑‍🎓

圧力のコンター図を見ると、セル境界でギザギザした模様(弱いチェッカーボード)が残っていることがあります。これはスタガード格子が機能していない証拠ですか?

🎓

必ずしもそうとは限らない。考えられる原因は二つ。

1. **収束不十分**: 連続の式の残差が十分小さくない段階で可視化している。SIMPLE法では、質量収束基準を少なくとも10^-6以下、できれば10^-8まで下げて確認せよ。
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)に対する連続の式は、

$$ \frac{u_{i,j,k}-u_{i-1,j,k}}{\Delta x} + \frac{v_{i,j,k}-v_{i,j-1,k}}{\Delta y} + \frac{w_{i,j,k}-w_{i,j,k-1}}{\Delta z} = 0 $$
となる。ここで、各速度成分が正しいインデックスで呼び出されているか、常に確認が必要だ。バグの温床となる。また、3次元では圧力修正方程式の係数行列が
この記事の評価
ご回答ありがとうございます!
参考に
なった
もっと
詳しく
誤りを
報告
参考になった
0
もっと詳しく
0
誤りを報告
0
Written by NovaSolver Contributors
Anonymous Engineers & AI — サイトマップ
プロフィールを見る