OpenFOAM

【OpenFOAMのTips】覚えておくと便利だけど忘れがちなもの

こんにちは(@t_kun_kamakiri)

メモに残しておきます。
たまに追加していくので困ったときに知っておくと役に立つかもしれません。

気になる部分は目次からジャンプしてください_(._.)_

OpenFOAMv2212

流体解析で計算がうまくいかないとき

OpenFOAMをメインに流体解析でうまくいかないときの原因や対策などのメモを残しています。

ご参考ください_(._.)_

bashのプロンプトを変更する

ターミナルのパスが長すぎたりすると改行したり見づらかったりしますよね。
今回は以下のように時刻と改行を入れた設定に変えるようにします。

以下をターミナルで打って、

一番最後の行に下記を追加します。

「:wq」と打てば保存してvimから抜けることができます。

↓こちらにするとパスの文字が黄色になります。

好きなカラーで設定してください。

OpenFOAMグループ

こちらに質問と回答が蓄積されているので同じ悩みの方に出会えるかもしれません。

ただ良い回答を得るためには良い質問の仕方があります。

snappyHexMeshでメッシュが思った通りに生成されていないとき

  • 「locationInMesh (2.1 0.09 -1.1);」の座標がおかしい
  • メッシュサイズが大きくて形状変化の解像度をとらえられていない
  • stlファイルをよく見ると欠けている

だいたいどれか。

並列計算しているなら結合しないとParaViewでは見れない。
並列分割してフォルダ内にprocessorがあるなら、ParaviewのCase TypeをDecomposed Caseに変えると並列分割した状態でも読み込めます。

流量を知りたい

①に残差の例もあります。

残差と連続式の誤差を出力

system/controlDictには残差や連続式の誤差を出力する設定を記述します。

system/controlDict

残差と連続の式による誤差は最低確認するようにしましょう。

連続の式の誤差

  • sum local : 誤差絶対値の格子体積重み付け平均
  • global : 誤差(符号あり)の格子体積重み付け平均
  • cumulative : globalの累積

グラフを出力するPythonスクリプトはこちらです。

連続の式の誤差

残差

残差の分布を出力す量にカスタマイズした有益な議論があります。

実験データと比較したい

だいたいここを見ます。

境界条件を楽にする

共通の設定の場合

デフォルト(全て壁条件)

設定の使いまわし

 

並列計算

並列計算

特定のフォルダの容量調べる

duコマンド

境界条件の候補を調べる

以下が出力される。

ソースコードを探す

全ての$FOAM_APPを出力しておいて、laplacianFoam.Cの検索に引っかかったものだけを抽出

$FOAM_APPの中で拡張子.Cだけを出力しておいて、laplacianFoam検索に引っかかったものだけを抽出

検索したい文字列のファイルを探す

  • l:ファイル名のみ出力
  • n:行番号を出力

メッシュ品質の基準を検索

checkMeshコマンドでメッシュ情報を確認すると、メッシュ数の他にメッシュ品質に関わる内容も出力されます。
しかし、「メッシュ品質って何なの?」となることもあるので、以下に基準値が記載してあるファイルのありかを調べる方法を記します。

以下にあることがわかる。

viコマンドで中身を確認。

品質基準は以下を参照。

メッシュ品質は過去にオープンCAEのサマースクールで発表した際の資料にも書いてあります。

メッシュ品質の悪い部分を確認

メッシュ品質が悪い箇所のメッシュを修正したい場合、ParaViewでその場所を特定することができます。

まず、以下でメッシュ品質項目のvtkファイルを作成します。

ls constant/polyMesh/setsで品質の悪い項目のファイルを確認。
constant/polyMesh/sets/ファイル名
ファイル名 = skewFaces

次に、paraviewでvtkを読み込むとメッシュ品質の悪い箇所を確認できます。

  • 高アスペクト比(Aspect Ratio)
    非常に微細な境界層で現れる。
    ソルバーの安定性にとって致命的なものではありませんが、収束速度を著しく低下させる可能性があり
  • 非直交性(Orthogonality)
    3つの値の範囲を定義する
    ・n0 < 70 – 安全な値
    70 < n0 < 90 – fvSolutionのnonOrthoCorrectorやfvSchemesの数値スキームに対して特別な処理を行う必要あり
    ・n0 > 90 – シミュレーションに使用できない悪いメッシュ
  • 歪度(skewness)
    値が大きいと結果の品質(正確さ)が損なわれる可能性がありますが、適度な大きさの歪度であれば、シミュレーションに使用することができる
  • Smoothness
  • メッシュ間隔の最大変化は20%未満が理想

viコマンド

例えばメッシュ品質基準を調べたい場合。

#行数を表示
:set number

/primitiveMesh
n:下へ検索
N(Shift + n):上へ検索

  • :q (上書きせずに閉じる)
  • :q! (編集した場合でも上書きせずに閉じる)
  • :wq (上書き保存)
  • iでその場所から編集
  • Aで最終列に移動して編集
  • uで戻す

圧縮ファイルの解凍

tar.gz

zip

treeコマンドが使えないとき

OpenFOAMの環境変数の確認

こちら

ケースファイルの初期化

初期化したい内容に応じてコマンドを使い分ける。

postProcess

controlDictで設定。

コマンド実行

とすると時刻のフォルダにQが出力

sampling

samplingによりフィールドデータをサンプリングするためのサンプリング関数オブジェクトが用意されています。グラフにプロットするための1Dライン、画像として表示するための2D平面や3Dサーフェスのいずれかを使用できます。各サンプリングツールは、controlDictファイルのメイン関数辞書、またはcaseシステムディレクトリの別ファイルのいずれかで辞書に指定されています。データは、Grace/xmgr、gnuplot、jPlotのような有名なグラフ作成パッケージを含む様々なフォーマットで書き出すことができます。

以下はsystem/sampleDict内に記述する例を示しています。

以下のコマンドで結果をpostProcessingに出力。

壁面摩擦応力(wallShearStress)の出力

  • simpleFoam
    計算実行
  • simpleFoam -postProcess -func wallShearStress -noZero -noFunctionObjects
    計算実行後に実行する。各時刻にwallShearStressを出力される。
    -noZero:0ディレクトリは使わないし出力もしない
    -noFunctionObjects:controlDictのfunctionObjectは使わない。このオプションを付けないとfunctionObjectの記述に従って出力されてしまう。
    各時刻のディレクトリ内にwallShearStressがあればParaViewでも表示できる。
  • postProcess -func sampleDict -noZero -latestTime
    postProcessingにsampleDictができて上記のsampleDictのfieldsを出力してくれる。wallShearStressを書いておくと出力される。

※ただしwallShearStressはinterpolationSchemeをcellPointにしないと出力してくれませんでした。

interpolationScheme

  • cell:Cell-centre value assumed constant over cell
  • cellPoint:Linear weighted interpolation using cell values

yPlusの出力

上記同様のことをyPlusで行えばよい。

  • 各時間でyPlusを出力
    system/controlDict

もしくは

-latestTime:最後の結果のみ出力するオプション

これでyPlusをParaViewで確認できます。

  • system/sampleDict

「fields (U p wallShearStress yPlus);」にyPlusを追加。

これでpostProcessing/postProcessing/最終時刻/z_0.0m_yPlus.xyに結果が出力されます。

特定の場所のy+の具体的な値をを知りたい場合は便利です。

特定値の流速のみを表示(ParaView)

ParaViewで設定を変えます。
「Edit」>[Settings]から以下の項目にちゅえっくを入れます。

流速のコンターも描くことができます。特定の流速の範囲に絞って表示することができます。

WSLでメモリ不足になったとき

WSLは何も設定しない場合、ホスト(Windows)メモリの 50%または8GBのどちらか少ない方になるように調整します。
Windows側が16GBのメモリの場合は以下のように、

で確認するとトータル7.7BGB使えるようになっており、あふれた分はスワップで2GBまで保持できるようになっています。

シミュレーションをしているとためにメモリが足らなくなるのでもう少し使えるように設定を変えます。
使えるメモリを80%までに引き上げて、残り足らなくなった分は少々遅くなっても良いのでスワップで保持するようにします。

.wslconfig は以下のパスに作成することで、WSL2 起動時に設定が読み込まれる仕組みになっています。

.wslconfigを以下とします。

.wslconfig

PowerShellを管理者権限でシャットダウンします。

環境変数が展開されない

例えば以下のように$FOAM_TUTORIALSの後にTABを押して、補完機能を使いながらパスをたどっていきたい場合があるとします。

このようにすると、バックスラッシュが先頭に入って面倒だったりします。

shopt」で、シェルオプションの設定状況(on/off)を一覧表示します。「shopt シェルオプション名」で表示対象を指定できます。

これで環境変数が自動で展開されます。

境界条件の参考

非圧縮流れの場合(simpleFoma、pimpleFoamなど)

patch type U p k epsilon nut omega
流速指定 patch     Region0
{
type fixedValue;
value uniform (1 0 0);
}
    Region0
{
type zeroGradient;
}
    Region0
{
type fixedValue;
value uniform 0.001;
}
    Region0
{
type fixedValue;
value uniform 0.01;
}
    Region0
{
type calculated;
value uniform 0.001;
}
  Region1
{
type fixedValue;
value           $internalField;
}
質量流 patch     Region
{
type flowRateInletVelocity;
massFlowRate constant 1; //[kg/s]
rhoInlet 1000.0; //[kg/m3]
}
    Region
{
type zeroGradient;
}
    Region0
{
type fixedValue;
value uniform 0.001;
}
    Region
{
type fixedValue;
value uniform 0.01;
}
    Region
{
type calculated;
value uniform 0.001;
}
  Region1
{
type fixedValue;
value           $internalField;
}
体積流量指定 patch     Region0
{
type flowRateInletVelocity;
volumetricFlowRate constant 1; //[m3/s]
}
    Region0
{
type zeroGradient;
}
    Region0
{
type fixedValue;
value uniform 0.001;
}
    Region0
{
type fixedValue;
value uniform 0.01;
}
    Region0
{
type calculated;
value uniform 0.001;
}
  Region1
{
type fixedValue;
value           $internalField;
}
法線方向流速 patch     Region
{
type surfaceNormalFixedValue;
refValue uniform -1.0;
}
    Region
{
type zeroGradient;
}
    Region
{
type fixedValue;
value uniform 0.001;
}
    Region
{
type fixedValue;
value uniform 0.01;
}
    Region
{
type zeroGradient;
}
  Region1
{
type zeroGradient;
}
静止圧指定 patch     Region1
{
type zeroGradient;
}
    Region1
{
type fixedValue;
value uniform 0.0;
}
    Region1
{
type zeroGradient;
}
    Region1
{
type zeroGradient;
}
    Region1
{
type calculated;
value uniform 0.001;
}
  Region1
{
type fixedValue;
value           $internalField;
}
全圧指定 patch     Region1
{
type zeroGradient;
}
    Region1
{
type totalPressure;
p0 uniform 0.0;
value uniform 0.0;
}
    Region1
{
type zeroGradient;
}
    Region1
{
type zeroGradient;
}
    Region1
{
type calculated;
value uniform 0.001;
}
  Region1
{
type fixedValue;
value           $internalField;
}
自然流出流入 patch     Region2
{
type pressureInletOutletVelocity;
value uniform (0 0 0);
}
    Region2
{
type totalPressure;
p0 uniform 0;
value uniform 0;
}
    Region2
{
type inletOutlet;
inletValue uniform 0.001;
value uniform 0.001;
}
    Region2
{
type inletOutlet;
inletValue uniform 0.001;
value uniform 0.001;
}
    Region2
{
type calculated;
value uniform 0.001;
}
  Region1
{
type zeroGradient;
}
静止壁 wall     Region2
{
type fixedValue;
value uniform (0 0 0);
}
    Region2
{
type zeroGradient;
}
    Region2
{
type kqRWallFunction;
value uniform 0.0;
}
    Region2
{
type epsilonWallFunction;
value uniform 0.0;
}
    Region2
{
type nutkWallFunction;
value uniform 0.0;
}
  Region1
{
type omegaWallFunction;
}
回転壁 type    wall;
inGroups   1(wall);
    Region
{
type rotatingWallVelocity;
origin (0 0 0);
axis (0 0 1);
omega 0.0;//[rad/s]
}
    Region
{
type zeroGradient;
}
    Region
{
type kqRWallFunction;
value uniform 0.0;
}
    Region
{
type epsilonWallFunction;
value uniform 0.0;
}
     Region
{
type nutkWallFunction;
value uniform 0.0;
}
対称面 type  symmetry;
inGroups  1(symmetry);
    Region1
{
type symmetry;
}
    Region1
{
type symmetry;
}
    Region1
{
type symmetry;
}
    Region1
{
type symmetry;
}
    Region1
{
type symmetry;
}
滑り条件 patch

熱流体の場合

U T P_rgh P K epsilon nut alphat
流速 type fixedValue;

value uniform (1 0 0);

 type fixedValue;

value uniform 273.15;

 type fixedFluxPressure;

value uniform 101325;

 type calculated;

value uniform 101325.0;

type fixedValue;

value uniform 0.001;

type fixedValue;

value uniform 0.01;

type calculated;

value uniform 0.001;

type calculated;

value uniform 0.0;

質量流量 type flowRateInletVelocity;

massFlowRate constant 1; //[kg/s]

rhoInlet -1.0; //[kg/m3]

 type fixedValue;

value uniform 273.15;

 type fixedFluxPressure;

value uniform 101325;

 type calculated;

value uniform 101325.0;

type fixedValue;

value uniform 0.001;

type fixedValue;

value uniform 0.01;

type calculated;

value uniform 0.001;

type calculated;

value uniform 0.0;

体積流量 type flowRateInletVelocity;

volumetricFlowRate constant 1; //[m3/s]

 type fixedValue;

value uniform 273.15;

 type fixedFluxPressure;

value uniform 101325;

 type calculated;

value uniform 101325.0;

type fixedValue;

value uniform 0.001;

type fixedValue;

value uniform 0.01;

type calculated;

value uniform 0.001;

 type calculated;

value uniform 0.0;

法線方向流速  type surfaceNormalFixedValue;

refValue uniform -1.0;

 type fixedValue;

value uniform 273.15;

 type fixedFluxPressure;

value uniform 101325;

 type calculated;

value uniform 101325.0;

type fixedValue;

value uniform 0.001;

type fixedValue;

value uniform 0.01;

type calculated;

value uniform 0.001;

 type calculated;

value uniform 0.0;

静圧 type zeroGradient; type zeroGradient;  type fixedValue;

value uniform 101325.0;

 type calculated;

value uniform 101325.0;

type zeroGradient; type zeroGradient; type calculated;

value uniform 0.001;

 type compressible::alphatWallFunction;

value uniform 0.0;

自然流入出  type pressureInletOutletVelocity;

value uniform (0 0 0);

 type fixedValue;

value uniform 273.15;

 type totalPressure;

p0 uniform 101325;

value uniform 101325;

 type calculated;

value uniform 101325.0;

type inletOutlet;

inletValue uniform 0.001;

value uniform 0.001;

type inletOutlet;

inletValue uniform 0.001;

value uniform 0.001;

type calculated;

value uniform 0.001;

type calculated;

value uniform 0.0;

すべり壁(温度)  type slip;  type fixedValue;

value uniform 273.15;

 type fixedFluxPressure;

value uniform 101325;

 type calculated;

value uniform 101325.0;

type zeroGradient; type zeroGradient; type zeroGradient; type compressible::alphatWallFunction;

value uniform 0.0;

すべり壁(断熱)  type slip; type zeroGradient;  type fixedFluxPressure;

value uniform 101325;

 type calculated;

value uniform 101325.0;

type zeroGradient; type zeroGradient; type zeroGradient; type compressible::alphatWallFunction;

value uniform 0.0;

回転壁(温度) type rotatingWallVelocity;

origin (0 0 0);

axis (0 0 1);

omega 0.0;//[rad/s]

type fixedValue;

value uniform 273.15;

 type fixedFluxPressure;

value uniform 101325;

 type calculated;

value uniform 101325.0;

type kqRWallFunction;

value uniform 0.0;

type epsilonWallFunction;

value uniform 0.0;

type calculated;

value uniform 0.001;

type compressible::alphatWallFunction;

value uniform 0.0;

全圧 type zeroGradient; type zeroGradient;  type totalPressure;

p0 uniform 101325.0;

value uniform 101325.0;

 type calculated;

value uniform 101325.0;

type zeroGradient; type zeroGradient; type calculated;

value uniform 0.001;

type compressible::alphatWallFunction;

value uniform 0.0;

モデルの形状線を表示

例えばFreeCADなどでmm単位でモデル作成したとします。
それをmodelというフォルダにmodel.stlとして保存した場合を考えます。

FreeCADは数値しか拾っていないので、SI単位系で流体解析を行う場合には0.001倍にしてm単位として計算する必要があります。

  • model/model.stl:mm単位
  • model/model_m.stl:m単位

このようにしたいとします。

surfaceConvertでスケール変換し、それを特徴線として出力(eMesh)、さらにParaViewで表示するためにobjファイルにするコマンドは以下です。

特徴線は以下のように設定しておきます。

system/surfaceFeatureExtractDict

model_m.objはParaViewで読み込めば特徴線も読み込めます。

モデルのスケール変換

OpenFOAMのメッシュを作成した後に節点座標を「移動・回転・スケール」させることができます。
以下の例は、スケールを1/1000倍にした例です。

また、stlを変換することもできます。

クーラン数の確認

クーラン数は$Co = \frac{u\Delta t}{\Delta x}$で定義されます。

陰解法の場合は、安定性の観点からクーラン数を必ずしも1以下にする必要はなく、$\Delta t$があまりにも小さくなりすぎて計算が終わらない場合は、精度を多少犠牲にしてクーラン数を大きくとり$Delta t$が小さくなりすぎないようにします。
しかし、クーラン数の最大値を指定できますが、最小値は指定できません(たぶん)
なので、1度過去に計算したもののクーラン数を確認したい場合があります。

以下のコマンドで各時刻(ステップ)ごとのクーラン数を出力します。

これでParaViewでのクーラン数の分布を見ることもできます。

クーラン数の最大、最小を見たい場合は以下のようにsystem/controlDictのfunctionsに記述して、fieldの最大最小を出力しておきます。

system/controlDictのfunctionsを書きます。

記述後にpostProcess のオプション付きで計算を実行します(出力計算のみ)。

postProcessingに出力されるので、グラフにするなりすればOK。

例えば、以下のPythonプログラムなど。

参考書

PENGUINさんサイトを体系的に学べる書籍となっています。ネット記事でも十分勉強できるのですが、OpenFOAMの初学者でOpenFOAMをインストール済みであれば一冊持って置き、体系的に学ぶのが良いでしょう。

OpenFOAMによる熱移動と流れの数値解析(第2版)

OpenFOAMによる熱移動と流れの数値解析(第2版)

3,520円(11/21 07:56時点)
Amazonの情報を掲載しています

あとは初心者向けに丁寧に解説がされているこちらの書籍もお勧めです。最後の章にはオーバーセットメッシュ(重合メッシュ)の機能を使った解析を最後まで丁寧に解説しているので挫折することはないでしょう。

OpenFOAMの歩き方 (技術の泉シリーズ(NextPublishing))

OpenFOAMの歩き方 (技術の泉シリーズ(NextPublishing))

川畑 真一
1,980円(11/20 19:20時点)
発売日: 2021/02/26
Amazonの情報を掲載しています

辞書的な参考書としては、こちらが良いです。
Foundation版ですが、大変参考になります。

OpenFOAMライブラリリファレンス

OpenFOAMライブラリリファレンス

株式会社テラバイト, 人見 大輔
16,500円(11/20 20:24時点)
Amazonの情報を掲載しています
関連記事もどうぞ

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です