PISO法
PISO法の理論基礎
PISO法の概要
先生、PISO法ってSIMPLE法と何が違うんですか?
PISO(Pressure-Implicit with Splitting of Operators)は1986年にIssaが提案した圧力-速度連成アルゴリズムだ。SIMPLE法が外部反復(outer iteration)を何度も回して収束させるのに対し、PISO法は1タイムステップ内で2回の圧力補正を行い、外部反復なしで時間精度を確保するんだ。
外部反復が不要ということは、非定常計算で有利なんですか?
PISOアルゴリズムの手順
具体的な手順を教えてください。
PISO法は以下の手順で進む。
Step 1: 運動量予測子(Predictor)
前タイムステップの圧力 $p^n$ を使って運動量方程式を解き、仮速度 $\mathbf{u}^*$ を得る:
Step 2: 第1圧力補正子(First Corrector)
速度を補正: $\mathbf{u}^{**} = \frac{H(\mathbf{u}^*)}{a_P} - \frac{1}{a_P}\nabla p'$
Step 3: 第2圧力補正子(Second Corrector)
最終速度: $\mathbf{u}^{n+1} = \frac{H(\mathbf{u}^{**})}{a_P} - \frac{1}{a_P}\nabla(p' + p'')$
SIMPLEでは圧力補正が1回だけで外部反復を回すのに対し、PISOは2回の補正で完了するんですね。
正確にはPISOの2回目の補正で隣接セル係数 $H$ の更新を反映するため、SIMPLEの省略近似が改善されるんだ。結果として緩和係数が不要になり、時間精度が保たれる。
SIMPLE法との理論的比較
両者の本質的な違いを整理しよう。
| 特性 | SIMPLE | PISO |
|---|---|---|
| 圧力補正回数 | 1回/外部反復 | 2回(以上)/タイムステップ |
| 外部反復 | 必要(10〜数100回) | 不要 |
| 緩和係数 | 必要(0.2〜0.8) | 不要 |
| 主な用途 | 定常計算 | 非定常計算 |
| 時間精度 | 擬似時間進行 | 真の時間精度 |
| CFL制限 | なし(陰的) | 推奨CFL < 1〜5 |
PISOでもCFL数の制限があるんですか? 陰的じゃないんですか?
時間離散化自体は陰的だが、PISOの2回の補正で分裂誤差を十分低減するにはCFL数をある程度抑える必要がある。実用上はCFL < 1が安全、最大でもCFL < 5程度を推奨する。CFL数が大きすぎると精度が劣化するんだ。
PISOがSIMPLEより非定常に強い「数学的な理由」
PISO法(Pressure Implicit with Splitting of Operators)がSIMPLEと決定的に違うのは「1タイムステップ内で圧力補正を2回以上繰り返す」こと。非定常流れでは1ステップで流れが大きく変わるため、1回の圧力補正では連続の方程式(質量保存)を満たしきれない。PISOはその2回目の補正で速度場の質量保存誤差をほぼゼロにできる——これが理論的な強さ。心臓弁の開閉シミュレーションや、エンジンシリンダー内の燃焼流れなど「流れが瞬時に変わる」問題でPISOが選ばれる理由はここにある。定常解析でSIMPLE、非定常でPISOという使い分けは今も有効な基本戦略です。
PISO法の数値計算手法
PISO法の実装詳細
PISO法を実装するとき、H演算子って何ですか?
OpenFOAMの文脈でよく出る表現だ。運動量方程式を離散化すると:
ここで $H(\mathbf{u}) = -\sum_N a_N \mathbf{u}_N + \mathbf{b}$ と定義する。すると:
この形にすると、速度を圧力勾配の関数として表せる。これを連続の式に代入することで圧力のポアソン方程式が得られるんだ。
nCorrectors と nNonOrthogonalCorrectors
OpenFOAMの設定で nCorrectors っていうパラメータがありますが、これは何ですか?
nCorrectors はPISOの圧力補正ステップの回数だ。デフォルトは2だが、CFL数が大きい場合や精度を上げたい場合は3〜4にすることもある。
nNonOrthogonalCorrectors はメッシュの非直交性を補正するための追加反復だ。非直交メッシュでは圧力ラプラシアンに直交でない寄与が生じるため、これを反復的に修正する必要がある。
```
PISO
{
nCorrectors 2;
nNonOrthogonalCorrectors 1;
}
```
PIMPLE法(PISO-SIMPLEハイブリッド)
PIMPLE法って聞いたことがあるんですけど、PISOとどう違うんですか?
PIMPLE法はOpenFOAMで実装されたPISOとSIMPLEのハイブリッドだ。タイムステップ内で外部反復(SIMPLE的なループ)を行いつつ、最終的にPISO補正で仕上げる。
```
PIMPLE
{
nOuterCorrectors 2; // SIMPLE的な外部反復
nCorrectors 1; // PISO補正
nNonOrthogonalCorrectors 1;
}
```
| パラメータ | 値の意味 |
|---|---|
| nOuterCorrectors = 1 | 純粋なPISO |
| nOuterCorrectors > 1 | PIMPLE(PISO+SIMPLE) |
| nOuterCorrectors大、nCorrectors=0 | 純粋なSIMPLE |
PIMPLE法の利点はCFL数制限を大幅に緩和できることだ。nOuterCorrectorsを十分とれば、CFL >> 1 でも安定に計算できる。
つまりPIMPLE法は「大きなタイムステップでも安定」で「時間精度も確保」できる、いいとこ取りなんですね。
ただしnOuterCorrectorsを増やすとタイムステップあたりのコストが増える。CFL < 1 なら純粋PISOs(nOuterCorrectors=1)のほうが効率的だよ。
時間離散化スキームとの組み合わせ
時間の離散化はどうすればいいですか?
PISO法と組み合わせる一般的な時間離散化を比較しよう。
| スキーム | 精度 | 安定性 | OpenFOAM名 |
|---|---|---|---|
| Euler陰解法 | 1次 | 無条件安定 | Euler |
| 2次後退差分 | 2次 | 無条件安定 | backward |
| Crank-Nicolson | 2次 | 無条件安定 | CrankNicolson |
LES計算では2次精度の backward か CrankNicolson を使うべきだ。RANS定常計算の擬似非定常(pseudo-transient)では Euler で十分。
PIMPLE法——PISOとSIMPLEを掛け合わせた「いいとこ取り」実装
OpenFOAMを使っている人ならPIMPLEという名前を見たことがあるはず。これはPISOとSIMPLEを組み合わせたハイブリッドアルゴリズム。1タイムステップ内でSIMPLEの外部反復(PIMPLE loopと呼ばれる)を回しながら、その中でPISOの内部圧力補正を行う構造になっている。CFL数が1を超えても安定して計算を進められるのが最大の強み——つまりSIMPLEの「大きなタイムステップで進む」利点と、PISOの「非定常精度」を両立させた設計だ。LESや乱流の非定常解析でCFL=0.5〜1に縛られるのが辛い……というケースで重宝される実用的な実装です。
PISO法の実務適用
非定常CFD解析でのPISO実践
実際にPISO法で非定常解析をする際の設定手順を教えてください。
代表的なケース(円柱まわりの渦放出、Re=200のLaminar流れ)を例にしよう。
Step 1: 時間刻みの決定
CFL条件から時間刻みを決める:
CFL = 0.5、最小セルサイズ 0.001m、最大流速 2 m/s なら:
$\Delta t = 0.5 \times 0.001 / 2 = 0.00025$ s
Step 2: ソルバー設定
OpenFOAMの場合:
```
PISO
{
nCorrectors 2;
nNonOrthogonalCorrectors 0;
}
```
Fluentの場合:
- Transient Formulation: Second Order Implicit
- Pressure-Velocity Coupling: PISO
- PISO Parameters: Skewness Correction = 1, Neighbor Correction = 1
Step 3: データ出力設定
結果の保存頻度はどう決めればいいですか?
渦放出の周期を $T$ とすると、1周期あたり20〜50個のスナップショットがあれば十分だ。Strouhal数 $St \approx 0.2$ なら $T = D / (St \times U) $ で見積もれる。
LES計算でのPISO設定
LES(Large Eddy Simulation)ではPISOの設定をどう変えますか?
LESでは空間スキームと時間スキームの精度が重要になる。
| 設定項目 | 推奨値 | 理由 |
|---|---|---|
| 時間離散化 | 2次(backward) | 時間精度確保 |
| 対流項 | 2次中央差分 or ブレンド | 数値散逸の低減 |
| CFL数 | < 1(理想は0.5以下) | 分裂誤差の制御 |
| nCorrectors | 2〜3 | 質量保存精度 |
| 線形ソルバー残差 | $10^{-6}$ | 高精度解 |
LESでは1次風上はダメなんですか?
1次風上の数値粘性は乱流のSGS(Sub-Grid Scale)粘性と同等以上になり得る。せっかくLESで渦を解像しても、数値散逸で潰してしまう。最低でも2次精度、理想的には中央差分系が必要だ。ただし中央差分は非有界なので、TVDリミッタ付きスキームやブレンドスキーム(例: linearUpwind)を使うことが多い。
計算コストの見積もり
非定常計算って計算コストはどのくらい見ておけばいいですか?
目安を示そう。
| 解析タイプ | メッシュ規模 | タイムステップ数 | 典型的なCPU時間 |
|---|---|---|---|
| 2D渦放出(Laminar) | 5万セル | 20,000 | 数時間 |
| 3D RANS非定常 | 500万セル | 10,000 | 数日 |
| 3D LES | 2000万セル | 100,000 | 数週間 |
| 3D DNS | 数億セル | 1,000,000+ | 数ヶ月(HPC必須) |
LESとDNSの計算コストの差がすごいですね。
DNSはKolmogorovスケールまで解像する必要があるから、$Re^{9/4}$ に比例してメッシュ数が増える。産業用途ではLESかDES(Detached Eddy Simulation)が現実的だね。
タイムステップを小さくすれば精度が上がる?——PISOの現実
「非定常CFDはタイムステップを小さくすれば正確」という思い込みは危険。PISOでΔtを10倍小さくしても、計算コストが10倍になるだけで精度が10倍になるわけじゃない。逆に小さすぎるタイムステップは丸め誤差の蓄積を招く。実務でのベストプラクティスは「CFL数を0.5〜1の間に保つΔt」を選ぶこと。水道管の圧力過渡解析で、担当者がΔt = 1e-6秒で1秒間を計算しようとしたが100万ステップになって計算機が1ヶ月かかると判明——CFL条件を計算したらΔt = 1e-4で十分だった、という実話がある。PISOの実践では「どのCFLで回すか」の判断が最も重要です。
PISO法のソフトウェア比較
非定常ソルバーの実装比較
各CFDソルバーでPISO法やその類似手法はどう実装されてますか?
| ソルバー | 非定常アルゴリズム | 時間精度 | 適応時間刻み |
|---|---|---|---|
| Ansys Fluent | PISO, SIMPLE系, Coupled | 1次/2次 | あり(Global CFL) |
| Ansys CFX | 連成型 + 係数反復 | 2次後退差分 | あり |
| STAR-CCM+ | SIMPLE系(内部反復付き) | 1次/2次 | あり |
| OpenFOAM | PISO, PIMPLE | 1次/2次/C-N | あり(adjustTimeStep) |
Ansys Fluent のPISO
FluentのPISOは「Skewness Correction」と「Neighbor Correction」の2つのパラメータを持つ。Skewness Correctionはメッシュの歪みを補正し、Neighbor Correctionは隣接セル値の更新回数を制御する。通常はどちらもデフォルト値(1)で十分だ。
Fluent 2020R2以降では Pressure-Based Coupled Algorithm のTransient版が推奨されることが多く、PISO以上の収束安定性を示す場合がある。
OpenFOAM のPISO/PIMPLE
OpenFOAMでは用途に応じてソルバーを選ぶ:
| ソルバー名 | 用途 | アルゴリズム |
|---|---|---|
| pisoFoam | 非圧縮非定常 | 純粋PISO |
| pimpleFoam | 非圧縮非定常(大CFL) | PIMPLE |
| interFoam | VOF二相流 | PIMPLE + VOF |
| buoyantPimpleFoam | 浮力駆動流 | PIMPLE + エネルギー方程式 |
pimpleFoam が最も汎用的で、CFL制限も緩いため実務では最初の選択肢になることが多いんだ。
STAR-CCM+ の非定常設定
STAR-CCM+ではImplicit Unsteadyモデルを選択すると、内部反復(Inner Iterations)の数で品質を制御する。Temporal Discretization は1st Order か 2nd Order を選択できる。内部反復は5〜20回程度が一般的だが、LESでは各タイムステップの残差を十分下げることが重要だ。
移動メッシュとの連携
回転体や変形を伴う問題ではどうなりますか?
移動メッシュ問題ではGCL(Geometric Conservation Law)の満足が追加要件になる。PISO法はタイムステップ内の整合性が高いため、動的メッシュとの相性が良い。
- Sliding Mesh: 回転機械(ファン、ポンプ)の非定常解析
- Dynamic Mesh / Morphing: FSI(流体-構造連成)
- Overset Mesh: 大変位を伴う物体運動
OpenFOAMのdynamicMeshDictとpimpleFoamの組み合わせが柔軟性が高いよ。
FluentのTransient SIMPLECとOpenFOAMのpisoFoam——「非定常」の実装哲学の違い
非定常解析に使うソルバーはツールによって名前も哲学も違う。FluentはSIMPLE系アルゴリズムの非定常拡張(Transient SIMPLEC)を使いながら、内部的にPISO的な補正を組み込んでいる。一方OpenFOAMはpisoFoamとpimpleFoamを明示的に使い分けさせる設計——透明性が高い代わりに、ユーザーが自分でアルゴリズムを理解して選択する責任がある。Star-CCM+は独自の「Segregated Solver」が非定常にも対応し、CFL適応タイムステップ機能が充実している。どのツールを使うにせよ「このソルバーはPISO系か、それとも?」という知識があると、ドキュメントを読むときに格段にます。
PISO法の先端研究
PISO法のDNS/LESにおける役割
DNSやLESでPISO法はどのように使われていますか?
有限体積法ベースのDNS/LESでは、PISO法が圧力-速度連成の標準手法だ。特にOpenFOAMのdnsFoamやpisoFoamは学術研究で広く使われている。
DNSでは数値誤差が物理的なスケールに直接影響するため、PISO法の各ステップで非常に厳しい収束基準(残差 $10^{-8}$ 以下)が要求される。
分数ステップ法との関係
分数ステップ法(Fractional Step Method)とPISO法は関係があるんですか?
密接に関係している。分数ステップ法(Chorin, 1968; Temam, 1969)は:
1. 圧力項を除いた運動量方程式で仮速度を求める
2. 圧力ポアソン方程式を解く
3. 速度を補正して発散フリーにする
PISO法はこの分数ステップ法をFVM上で実装したものと見なせるんだ。FEM系のコード(例えばNek5000)では分数ステップ法と呼ばれ、FVM系(OpenFOAM, Fluent)ではPISO法と呼ばれることが多い。本質的には同じ考え方だよ。
高次精度FVMとの組み合わせ
空間精度をさらに上げる手法はありますか?
通常のFVMは2次精度が標準だが、以下の手法で高次精度化が可能だ:
- MUSCL再構築: 3次精度の勾配再構築。OpenFOAMのlinearUpwindが近い
- WENO(Weighted Essentially Non-Oscillatory): 3〜5次精度。衝撃波を含む問題にも適用可能
- Compact Scheme: 高精度だが並列化が困難
LESでは空間フィルタ幅がメッシュサイズで決まるため、高次精度スキームを使うとフィルタのカットオフが急峻になり、解像可能な渦の範囲が広がるんだ。
スペクトル要素法との比較
FVMのPISO以外に、非定常CFDで使われる手法はありますか?
スペクトル要素法(SEM)が高精度DNS/LESで有力だ。代表的なコードにNek5000やNekRSがある。多項式次数Nを上げることで指数関数的に精度が向上する(p-refinement)。
ただしSEMは複雑形状のメッシュ生成が困難で、産業用途ではFVMのPISO/PIMPLE系が依然主流だ。最近はGPU対応のNekRS(Argonne国立研究所)が10億格子点規模のDNSを実現している。
PISO法のトラブル対応
PISO法の典型的なトラブル
PISO法で非定常計算を走らせたら発散したんですが、何が原因でしょう?
PISO法の発散原因トップ5を見ていこう。
1. CFL数が大きすぎる
症状: 計算開始直後または流れが発達した後に発散
対策:
maxCoを0.5以下に設定(OpenFOAM の adjustTimeStep 使用時)- Fluent では Global Courant Number を1以下に
- PIMPLEに切り替えてnOuterCorrectorsを増やす
2. 初期条件が不適切
症状: 最初の数タイムステップで発散
対策:
- まずSIMPLE法で定常解を求め、それを初期条件にする
- 速度場をゼロではなく、近似的な流れ場で初期化
- 乱流量(k, omega)を適切に初期化(タービュレンス強度と長さスケールから)
3. 境界条件での逆流
出口で逆流が起こると発散するんですか?
特に渦放出のような問題では出口で局所的な逆流が生じやすい。
対策:
- 出口を十分下流に配置(物体から20D以上)
- OpenFOAM:
inletOutlet境界条件を使用 - Fluent: Backflow Direction Specification を有効に
4. メッシュ品質の問題
特にPISOで注意すべき品質指標:
| 指標 | 許容値 | PISO特有の注意 |
|---|---|---|
| 非直交性 | < 70度 | nNonOrthogonalCorrectorsで補正 |
| スキューネス | < 0.85 | Skewness Correctionを有効に |
| セル体積比 | < 10:1 | 急激な変化は圧力振動の原因 |
5. 時間離散化と空間離散化の不整合
症状: 計算は安定だが結果が非物理的
原因: 2次時間離散化(backward)を使いながら、空間は1次風上 → 時間精度と空間精度の不釣り合い
対策: 時間と空間の精度を揃える。2次時間なら空間も2次以上にすべきだ。
PISO vs PIMPLE の選択判断
PISOとPIMPLEのどちらを使うべきか、判断基準を教えてください。
迷ったらPIMPLEが安全、精度を追求するならPISO、という理解で合ってますか?
そのとおり。PIMPLEのnOuterCorrectors=1にすれば実質PISOだから、まずPIMPLEで始めて、安定したらnOuterCorrectors=1に減らすという戦略もあるよ。
「PISOで計算したのに圧力振動が止まらない」——よくある罠
PISOを使って非定常計算をしているのに圧力場がギザギザに振動する——という相談は意外と多い。原因の多くは「nCorrectors(補正ループ回数)が1になっている」こと。デフォルトが1のソルバーでは、1ステップに1回しか圧力補正をしないのでPISOの真の強みが出ない。2〜3回にするだけでスムーズになることがある。もう一つの原因が境界条件のタイムステップ非整合——入口条件が時間に対して階段状に変化していると、その不連続がPISO反復の中で増幅される。PISOのトラブルは「アルゴリズムの設定パラメータ」と「境界条件の時間整合性」の2点から疑うのが診断の定石です。
関連トピック
なった
詳しく
報告