OpenFOAM

【OpenFOAMカスタマイズ】空間依存する温度拡散係数に変更

こんにちは。
本記事ではOpenFOAMのカスタマイズのためのメモを残しておきます。

今回は熱拡散方程式(熱伝導方程式とも呼ぶ)の以下の式を扱います。

\begin{align*}
\frac{\partial T}{\partial t} = \nabla \cdot (D\nabla T)\tag{1}
\end{align*}

OpenFOAMのソースコードでも以下のようになっており上記のイメージと結びつきやすいでしょう。

本記事は以下の記事を参考にしています。
以下の記事の内容は、数年前に書かれているため年月が経つと今のOpenFOAMのバージョンでのコードと変わってきています。

今のバージョンOpenFOAM-v2112で解説をし直したのがこの記事です。

本記事がOpenFOAMのソースコードの理解の助けになれば幸いです_(._.)_

ラプラシアンソルバの編集

ラプラシアンソルバを自身のディレクトリにコピーします。

フォルダ名を変えておきます。

以下のコマンドでフォルダ移動をします。

ファイル構成は以下のようになっています。

「laplacianMultiRegionFoam/Make/files」が実行コマンドを作るファイルですので、以下のように変えておきます。

laplacianMultiRegionFoam/Make/files

今回新しく作るファイルは「laplacianMultiRegionFoam.C」とします。
環境変数は以下のように設定されています。

 

作成されたlaplacianMultiRegionFoamという実行コマンドは「$FOAM_USER_APPBIN」以下に保存されます。

環境変数は以下のようにすると確かめることができます。

では、メインとなるファイル名を変更します。
ここでは元のファイルをコピーして、念のため元のファイルはoldという名前のフォルダに保存しておきます。
※本記事ではlaplacianMultiRegionFoam.Cは変更しないのですが、ソルバの一部を変更した場合は混乱しないようにファイル名も変えておきましょう。

ここまででファイル構成は以下のようになりました。

ここまでで作業に問題がないかwmakeでコンパイルして確かめてみましょう。

コンパイルをlogファイルに書き出すようにします。
logファイルに出力結果を書き出しておく方が、もしエラーがあった場合にじっくり眺めることができるので便利です。

以下のコマンドで「$FOAM_USER_APPBIN」にlaplacianMultiRegionFoamがあることを確認します。

これで実行コマンドが作成できました。

温度拡散係数の設定

温度拡散係数の設定は「createFields.H」で行っています。

createFields.H

まず以下のようにvolScalarField型でDTという名前を付けてインスタンス化しています。

volScalarFieldのGeometricFieldを以下のように定義しなおした型なので、volScalarFieldを知りたい場合はGeometricFieldを確認すれば良いです。

何はともあれvolScalarFieldはコントロールボリュームにおけるスカラー値(物理量など)を持った場という認識で良いかと思います。

上のvolScalarFieldをDTという名前にすることで、温度拡散係数DTをコントロールボリューム内の値として保持することになります。

dimensionedクラスを見るとわかりますが、1つ目の引数に変数名、2つ目の引数に次元、3つ目の引数にdictのnameキーワードで保存された値で初期化しています。

つまり、transportPropertiesというdict型から”DT”を探して値で初期化しているということです。

ESI版でもバージョン違いやFoundation版などを使っている場合は以下のようにtransportPropertiesからlookup関数で値と次元を取得している方法も見られますが、いずれの記述も dimensionedScalar DTのようにDTは次元を持った変数だということです。

このように次元を持つ変数にすることで異なる次元同士の演算(足し算引き算など)を行うとでエラー表示してくれます。

「IOobject::MUST_READ_IF_MODIFIED」としているのでDTというファイルがあれば読み込みますが、ない場合は読み込まないという設定になっています。
はじめは初期値としてDTは全てのセルで0値ですが、

の記述の後はDTは全てのセルで値が0.1になっています。

volScalarField DTの「IOobject::AUTO_WRITE」となっているので毎回DTの値は時刻に応じて出力するようにしています。

しかし、このままだとDTは毎時間固定値を使うことになります。
後で(この記事では扱いませんが)、DTが時間変化に対応する変数にするために下のように変更します。DTが時間変化する場合というのは、例えばDTが温度依存する場合などがあります。温度が時間によって変化するため$DT(T(t))$という具合にDTが変化する場合などに対応します。

変更したのは「IOobject::MUST_READ」の部分です。
「runTime.timeName()」が毎時間という意味なので、時間が進むにつれて作成されるフォルダ(0, 10, 20など)の中のDTというファイルを読み込んで、「IOobject::AUTO_WRITE」データを出力していきます。
※ここでは、DTは時間変化する変数ではないので「「IOobject::NO_WRITE」でも良いです。

「IOobject::MUST_READ」としている場合は初期値「0」フォルダにDTという設定ファイルが必要なので用意する必要がありますので、後で用意します。

再度コンパイルします。

エラーがなければOKです。

チュートリアルの編集

ラプラシアンソルバを使った適当なチュートリアルをコピーしてきます。

このチュートリアルはblockMeshが無いので適当に持ってきます。

blockMeshDictは適当に設定します。

system/blockMeshDict

では、blockMeshを実行します。

ParaViewでモデルを読み込んで確認しましょう。

 

今回はわかりやすく1×1×1(m3)でx方向に5分割したモデルにしました。

初期条件として「0」フォルダにはTとDTを用意します。

0/T

0/DT

元々のチュートリアルにはありませんでしたので用意しました。

以下設定をします。

system/controlDict

system/fvSchemes

system/fvSolution

DTを場所に応じて値を変えたいのでsetFieldを使います。
その前にsetFieldをすると値が更新されてしまうので、DTをDT.orgというオリジナルファイルとして別で保存しておきます。

setFieldの設定ファイルは適当なところからコピーしてきます。

setFieldは以下のように設定します。

system/setFieldDict

x方向[0.25,0.75]を温度拡散係数DT=0.2としています。
節点での値を表示すると補完されているのか以下のようになっています。

セルでの値を表示すると以下のようになります。

先ほど作った実行コマンドを実行します。

温度拡散係数DTは初期状態で値が異なります。
それが時間が経過しても値を変えるような方程式になっていないので、初期状態のままずっと同じ値をとります。

一方温度に関しては以下の方程式を解くため、場所に依存した温度拡散係数に応じて温度分布が時刻変化します。

\begin{align*}
\frac{\partial T}{\partial t} = \nabla \cdot (D\nabla T)\tag{1}
\end{align*}

初期状態はセル内の温度の値は273Kでしたが、t>0以降で左側の境界条件は273Kのままで、右側は0Kとします。初期状態で右側境界条件をT=0としているため、補完して分布が表示されています。t=10となるとほぼ定常になっています。

まとめ

温度拡散係数を空間分布させて熱拡散方程式を解くようにカスタマイズしました。

特に意味のないカスタマイズかもしれませんが、OpenFOAMのカスタマイズの練習としては良い例題かなと思います。

参考書

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

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

3,520円(04/26 10:19時点)
Amazonの情報を掲載しています
OpenFOAMプログラミング

OpenFOAMプログラミング

Mari´c,Tomislav, H¨opken,Jens, Mooney,Kyle
8,250円(04/25 20:12時点)
Amazonの情報を掲載しています

Foundation版で書かれていますが、OpenFOAMの型定義や関数などを調べるのによくまとまった辞書です。

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

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

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

COMMENT

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