代数方程式ソルバーの設定

2016年11月1日

はじめに

代数方程式ソルバーの設定について。

使用バージョン

OpenFOAM 4.1

代数方程式ソルバーの設定

偏微分方程式を有限体積法で離散化すると、代数方程式 (連立一次方程式) が得られる。代数方程式を解くためのソルバーの設定は system/fvSolution で行う。

FoamFile
{
    version     2.0;
    format      ascii;
    class       dictionary;
    location    "system";
    object      fvSolution;
}

solvers
{
    p
    {
        solver          PCG;
        preconditioner  DIC;
        tolerance       1e-06;
        relTol          0.01;
    }

    U
    {
        solver          PBiCG;
        preconditioner  DILU;
        tolerance       1e-05;
        relTol          0.1;
    }

    "(k|epsilon|omega|R)"
    {
        solver          PBiCG;
        preconditioner  DILU;
        tolerance       1e-05;
        relTol          0.1;
    }
}

代数方程式ソルバーの設定は、各変数に対して solver でソルバーの種類を選択し、それ以外はソルバーに応じた設定をしていく。tolerance と relTol はすべてのソルバーで共通であり、計算の打ち切り条件を指定する。残差が tolerance よりも小さくなるか、初期残差に対する比が relTol よりも小さくなったときに計算が止まる。relTol に 0 を設定すると、tolerance だけで判定される。

方程式の係数行列が対称か非対称かにより使用できるソルバーの種類が異なる。圧力 p (ポアソン方程式) は対称、それ以外 (輸送方程式) は非対称と考えておけばよい。それぞれに選択できるソルバーの種類がいくつかある。ソルバーだけで考えると説明が一般的になってしまうが、方程式系として考えると有効な組み合わせは限られてくるため、全体で考える。以下で言及する各ソルバーの計算速度についても、個々のソルバーの速度ではなく、解析全体の速度である。

代数方程式ソルバーの組み合わせのパターンとして、つぎのものが考えられる。

パターンpU/Rそれ以外
1PCGPBiCGPBiCG
2GAMGsmoothSolversmoothSolver
3PCG/GAMGcoupledPBiCG/smoothSolver

PCG/PBiCG

これは最初に示した例である。p のソルバーとして PCG (前処理付き共役勾配法)、それ以外に PBiCG (前処理付き双共役勾配法) を使う。他のソルバーと比べると決して速いとはいえないが、比較的安定して解けるという特徴がある。

PCG

preconditioner で前処理の方法を選択できる。以下のものを指定できる。

  • DIC (対角ベース不完全 Cholesky 分解)
  • FDIC (DIC の高速版)
  • GAMG (マルチグリッド法)

基本的には DIC でよい。

PBiCG

preconditioner で前処理の方法を選択できる。以下のものを指定できる。

  • DILU (対角ベース不完全 LU 分解)
  • diagonal (対角スケーリング)

基本的には DILU でよい。

※Ver. 4.1 から PBiCGStab (前処理付き安定化双共役勾配法) も使えるようになった。

GAMG/smoothSolver

p のソルバーとして GAMG (geometric-algebraic multi-grid)、それ以外に smoothSolver を使う。GAMG はマルチグリッド法、smoothSolver は Gauss-Seidel 法などの解法である。PCG/PBiCG よりも高速に解ける。

    p
    {
        solver          GAMG;
        smoother        GaussSeidel;
        agglomerator    faceAreaPair;
        nCellsInCoarsestLevel 10;
        mergeLevels     1;
        cacheAgglomeration on;
        tolerance       1e-06;
        relTol          0.01;
    }
    
    U
    {
        solver          smoothSolver;
        smoother        GaussSeidel;
        tolerance       1e-05;
        relTol          0.1;
    }
    
    "(k|epsilon|omega|R)"
    {
        solver          smoothSolver;
        smoother        GaussSeidel;
        tolerance       1e-05;
        relTol          0.1;
    }

GAMG

smoother には以下のようなものが指定できる。

  • GaussSeidel (Gauss-Seidel 法)
  • DIC (対角ベース不完全 Cholesky 分解)
  • DICGaussSeidel (DIC と Gauss-Seidel の併用)
  • FDIC (DIC の高速版)

GaussSeidel や DIC で解けない問題が DICGaussSeidel で解けることがある。

smoothSolver

  • GaussSeidel (Gauss-Seidel 法)
  • DILU (対角ベース不完全 LU 分解)

基本的には GaussSeidel でよい。

coupled

coupled はベクトルやテンソル用のソルバーで、一般的に PBiCG や smoothSolver よりも計算が高速であり、計算が安定化することもある。

    U
    {
        type            coupled;
        solver          PBiCCCG;
        preconditioner  DILU;
        tolerance       (1e-05 1e-05 1e-05);
        relTol          (0.1 0.1 0.1);
    }
    
    R
    {
        type            coupled;
        solver          PBiCCCG;
        preconditioner  DILU;
        tolerance       (1e-05 1e-05 1e-05 1e-05 1e-05 1e-05);
        relTol          (0.1 0.1 0.1 0.1 0.1 0.1);
    }

solver には以下のものが選べる。

  • PBiCCCG
  • PBiCICG

とりあえず PBiCCCG を指定すればよいだろう。

それぞれ preconditioner としてつぎのものを指定できる。

  • DILU (対角ベース不完全 LU 分解)
  • diagonal (対角スケーリング)

DILU を指定すればよいだろう。

PIMPLE 法の場合の設定

PIMPLE 法では反復計算の途中の設定と最後の設定が分けてある。たとえば、p の反復計算最後の設定は "pFinal" となる。

    p
    {
        solver          PCG;
        preconditioner  DIC;
        tolerance       1e-06;
        relTol          0.01;
    }

    pFinal
    {
        $p;
        tolerance       1e-06;
        relTol          0;
    }

    U
    {
        solver          PBiCG;
        preconditioner  DILU;
        tolerance       1e-05;
        relTol          0.1;
    }
    
    UFinal
    {
        $U;
        tolerance       1e-05;
        relTol          0;
    }
    
    "(k|epsilon|omega|R)"
    {
        solver          PBiCG;
        preconditioner  DILU;
        tolerance       1e-05;
        relTol          0.1;
    }
    
    "(k|epsilon|omega|R)Final"
    {
        $k;
        tolerance       1e-05;
        relTol          0;
    }

つぎの時間ステップに進む前にきっちり解いておくために、反復計算最後の設定の relTol を 0 にしたりする。

代数方程式ソルバーの種類の選択

代数方程式ソルバーの種類の選択方法としては、まずは計算できるものを選択することになるだろう。計算時間を気にしないのであれば、PCG/PBiCG を使えばよい。多少計算時間を気にするのであれば、GAMG/smoothSolver から試してみて、計算できなかったら PCG/PBiCG に切り替える。どの設定が最適かは問題やメッシュの状態にもよるので、いろいろと試してみるとよい。

ソルバーの種類の切り替え

つぎのようにすると、ソルバーの種類のセットを状況に応じて切り替えることができる。

solversType1
{
    p
    {
        solver          GAMG;
        ...
    }
    
    ...
}

solversType2
{
    p
    {
        solver          PCG;
        ...
    }
    
    ...
}

solvers
{
    //$solversType1;
    $solversType2;
}

solversType1、solversType2 を使いたい場合は solvers でそれぞれ "$solversType1"、"$solversType2" を指定すればよい。