圧力-速度連成手法の設定

2020年12月6日

はじめに

圧力-速度連成手法の設定の設定について。

使用バージョン

OpenFOAM v2006、v8

圧力-速度連成手法の設定

圧力-速度連成手法である SIMPLE、PISO、PIMPLE などの設定は system/fvSolution で行う。

SIMPLE 法

SIMPLE 法は以下の手順で計算される。

SIMPLE 法の設定を以下に示す。

SIMPLE
{
    nNonOrthogonalCorrectors 0;
    consistent      yes;
    pRefPoint       (0 0 0);
    pRefValue       0;

    residualControl
    {
        p               1e-3;
        U               1e-3;
        "(k|epsilon|omega|R)" 1e-3;
    }
}

relaxationFactors
{
    fields
    {
        p               0.3;
    }
    equations
    {
        U               0.7;
        "(k|epsilon|omega|R)" 0.7;
    }
}

"SIMPLE" において SIMPLE 法の各種設定を行う。

nNonOrthogonalCorrectors
非直交補正のループ回数。メッシュの non-orthogonality (非直交性) が 5 以上で laplacianSchemes/snGradSchemes で非直交補正を有効にしているのであれば、この値を 1 くらいにしておく。non-orthogonality の数値については、checkMesh で調べることができる。
consistent
SIMPLE 法の代わりに SIMPLEC 法を用いるかどうかを切り替えられる。一般的に、SIMPLEC 法を用いると収束性が改善する。
pRefPoint, pRefValue
圧力指定境界がない場合に、領域内部のある点で圧力を固定するための参照位置とその圧力値の設定。
residualControl
収束判定値。すべての変数で初期残差が判定値よりも小さくなったら計算を停止する。

relaxationFactors において緩和係数の設定を行う。計算が発散する場合、あるいは収束が遅い場合、緩和係数を小さくしてみるとよい。どの緩和係数を小さくすべきかは変数の残差の値を見て判断する。ここで "fields" と "equations" とあるが、ソルバーの中で陽的に緩和されているもの (たとえばソルバーのソースで "p.relax()" などと書かれている) が fields、方程式に組み込まれる形で緩和されているもの (たとえば "UEqn().relax()" などと書かれている) が equations に記述されている。

PISO 法

PISO 法は以下の手順で計算される。

PISO 法の設定を以下に示す。

PISO
{
    momentumPredictor yes;
    nCorrectors     2;
    nNonOrthogonalCorrectors 0;
    pRefPoint       (0 0 0);
    pRefValue       0;
}
momentumPredictor
運動方程式を解くかどうかを切り替えられる。
nCorrectors
PISO 法の圧力補正ループ (OpenFOAM では PISO ループと呼ばれる) の回数で、通常は 2 である。圧力がうまく解けない場合は、これを大きくするとうまくいくかもしれない。

PISO 法は時間ステップ内の反復計算を行わないため、収束判定や緩和係数の設定はない。

PIMPLE 法

PIMPLE 法は以下の手順で計算される。

PIMPLE 法の設定を以下に示す。

PIMPLE
{
    momentumPredictor yes;
    turbOnFinalIterOnly yes;
    nOuterCorrectors 10;
    nCorrectors     2;
    nNonOrthogonalCorrectors 0;
    pRefPoint       (0 0 0);
    pRefValue       0;

    residualControl
    {
        p
        {
            relTol          0.05;
            tolerance       1e-3;
        }
        U
        {
            relTol          0.05;
            tolerance       1e-3;
        }
        "(k|epsilon|omega|R)"
        {
            relTol          0.05;
            tolerance       1e-3;
        }
    }
}

relaxationFactors
{
    fields
    {
        p               0.3;
    }
    equations
    {
        U               0.7;
        "(k|epsilon|omega|R)" 0.7;
        ".*Final"       1;
    }
}
turbOnFinalIterOnly
乱流の方程式を解くのを反復計算の最後だけにするかどうかを切り替えられる。
nOuterCorrectors
外部反復 (図のイテレーションループ、OpenFOAM では PIMPLE ループと呼ばれる) の回数を指定する。これを 1 にすると PISO と同じになる。
residualControl (Foundation 版 v6 以降は outerCorrectorResidualControl)
収束判定値として tolerance と relTol が設定でき、すべての変数で代数方程式の初期残差が tolerance 以下になるかイテレーションの初期残差との比が relTol 以下になれば、反復計算を止めて時間ステップを進める。relTol を 0 に設定すれば、tolerance だけで収束判定される。

緩和係数は、".*Final" について、つぎの時間ステップに進む前にきっちり解いておくために 1 を設定したりする。

OpenCFD 版では、以下の設定が使える場合がある。

finalOnLastPimpleIterOnly
p のソルバー pFinal が使われるタイミングを設定する。これを有効にすると、pFinal が使われるのが外部反復ループと圧力補正ループと非直交補正ループのすべてが最後の場合になる。デフォルトでは無効で、pFinal は圧力補正ループと非直交補正ループ双方が最後に使われる。要するに、PIMPLE ループの最後だけ pFinal を有効にするというスイッチ。
SIMPLErho
rhoPimpleFoam 系のソルバーでこれを有効にすると、密度の方程式を解かない。

一般的な注意

上では、辞書の各キーワードが何かの機能の設定であるかのように書いているが、厳密に言うと、これらは一般的な辞書の形式にすぎず、ユーザーは好きなキーワードを書けるし、ソルバー側が任意のキーワードを無視するのも自由である。OpenFOAM の共通性の高い部分についての設定はソルバーに使われる可能性が高いといえるが、それすらもソルバーは無視しようと思えば無視できることに注意する。厳密な設定方法はソルバーのソースコードを適宜参照すること。