はじめに
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 系
|