計算の安定化のための指針

2017年5月26日

はじめに

OpenFOAM で計算を安定化させるための指針。つまり、計算が発散して止まってしまったときにどう対処すべきか?

使用バージョン

OpenFOAM 4.1

前提

  • メッシュのスケールを確認する。ミリとメートルを間違っていないか?
  • 境界条件を確認する。物理的に妥当でない条件になっていないか?

全般

残差の確認

まず、foamLog などを利用して初期残差をプロットし、どの変数に問題がありそうか確認する。

メッシュ

  • checkMesh でエラーが出ていないか確認する。エラーが出ていたらメッシュを作り直す。
  • checkMesh の non-orthogonality が 60 以上など大きく、ラプラシアンスキーム/界面法線方向勾配スキームの非直交補正を有効にしているなら、ラプラシアンスキームの limited の値を 0.5 や 0.333 などに設定してみる。メッシュのゆがみが大きすぎる場合は、補正が効きすぎて逆に問題となるため、それを抑えることができる。あるいは、非直交補正を無効にする。
  • non-orthogonality が 80 以上など大きすぎるのであれば、メッシュを作り直す。
  • テトラセルを polyDualMesh でポリヘドラに変換してみる。

条件

  • 適切な境界条件を与える。乱流統計量について適切に見積もった値を設定する。
  • inletOutlet 系の境界条件の代わりに、fixedValue 系の境界条件を用いる。
  • 適切な初期値を与える。potentialFoam で速度・圧力場を与えたり、乱流統計量について適切な値を設定したり、高度な乱流モデルを使う前に標準 k-εモデルで計算するなど。
  • 流速や重力、粘性などの条件を、はじめから必要な条件を与えるのではなく、少しずつ与えてみる。重力をはじめは小さくしてだんだん大きくするなど。

スキーム

  • 対流項スキームに upwind を使う。高次のスキームを使いたい場合でもまずは upwind で計算してみるなど。
  • 勾配スキームで勾配制限 (cellLimited など) を使う。たぶん圧力勾配以外に設定したほうがよい (圧力勾配に使うと結果が妙になる?)。

ソルバー

  • ソルバーの tolerance や relTol を小さくしてみる。
  • GAMG を使っているなら、smoother に DICGaussSeidel を使ってみる。
  • GAMG/smoothSolver を使っているなら、PCG/PBiCG に切り替えてみる。

定常

  • 対流項スキームに bounded を使う。
  • 緩和係数を小さくしてみる。最初で計算が止まってしまうなら、最初だけ極端に小さくしてみる。
  • 非定常計算に切り替えてみる。非定常項に CoEuler や SLTS を使う (bounded を使う)。".*Final" のソルバーの relTol に 0 でない適当な値を設定し、".*Final" の緩和係数に 1 より小さい値を設定する。

非定常

  • 時間刻み幅を小さくしてみる。時間刻み幅自動調整を使っているなら、クーラン数を小さくしてみる。使っていないなら、使ってみる。
  • momentumPredictor が無効なら、有効にする。
  • 圧力補正ループの回数を増やしてみる。
  • 緩和係数を設定し、外部反復ループの回数を増やしてみる。
  • 緩和係数を小さくしてみる。
  • turbOnFinalIterOnly を無効にしてみる。
  • エネルギー方程式を解いているなら、圧力の時間微分項 dpdt を無効にしてみる。
  • 時間ステップ内で収束しないことを覚悟で、".*Final" のソルバーの relTol に 0 でない適当な値を設定し、".*Final" の緩和係数に 1 より小さい値を設定する。

interFoam 系

  • nAlphaSubCycles を増やしてみる。