なんでソルバー改造?
現在openFOAMを趣味で使っており、interFoamのチュートリアルの改造で遊んでます。
しかし、チュートリアルだけをいじってるとこんな感情が浮かんできます。
「呪文多すぎてなにが起きてんのか分かんねぇ・・・」と。
「・・・チュートリアルの中身、もっといえばソルバーの中身はどうなって動いてるんだろう??」と。
ということで、もうソルバー改造に手を出せば色々分かるのでは!!?? と血迷った結果がこの記事の執筆背景になります。
この記事の目指すところ
とはいえ、いきなりinterFoamとかいうVOF法(気液・液液界面を表現できる計算手法)の塊に手を突っ込むのはヤバそう。そこで、最も単純(そう)なソルバーを使用することにしました。そのソルバーが scalarTransportFoam です。
※これ以降、scalarTransportFoamの改造を解説しているオープンCAE学会Shibata Takahiro氏の動画を参考にしています。
scalarTransportFoamソルバーに対して、以下二点の変更を行ってみます。
- 移流拡散方程式を改良して、スカラー量の湧き出し点を作る
- 新しいソルバー用のチュートリアルケースを作成する。
このソルバーはスカラー量の移流拡散方程式を解くだけっぽいのですが、改造を行っていくなかで把握出来たこのソルバーの変数設定方法や、主要なソルバー部分以外の変更必要箇所なども記載していきます。
開発環境
ソルバー改造時の開発環境は以下の通りです。
- OS : Ubuntu 20.04LTS
- openFOAM : openFOAM-v2112(ESI版)
大まかなソルバー改造手順
-
ソルバーがあるディレクトリに移動
$ cd $FOAM_SOLVERS
-
basicディレクトリに移動
$ cd basic/
-
scalarTransprtFoamフォルダを新しいソルバー名(例:scalarTransprtFoam2)にしてコピー・保存
$ sudo cp -r scalarTransportFoam scalarTransportFoam2 ~~~
-
scalarTransportFoam2ディレクトリ内のファイル名や、ファイルの内容を新しいソルバー名に合わせる
ディレクトリ構造は以下の通りで、fileの内容とscalarTransportFoam.Cのファイル名を書き換える。
scalarTransportFoam
├── Make
│ ├── files ←内容を以下のように書き換える
│ └── options
├── createFields.H
└── scalarTransportFoam.C ←ファイル名をscalarTransportFoam2.Cに書き換える
//scalarTransportFoam.C
EXE =$(FOAM_APPBIN)/scalarTransportFoam
⇓
scalarTransportFoam2.C
EXE = $(FOAM_APPBIN)/scalarTransportFoam2
5.createField.HとscalarTransportFoam2.Cを所望の形に修正
後に詳細を記載する。
6.コンパイルを行う
$ wmake
※ファイル編集の権限がなかった場合、以下を実行する。
sudo chown -R ユーザー名 ~openFoamまでのPATH
scalarTransportFoam2.Cの変更点
このファイルでは以下のような移流拡散方程式を定義しています。
\frac{dT}{dt} + \nabla\cdot(\phi T) - \nabla^2(D_T T) = S
\\
T:スカラー量\\
\phi: 速度ベクトル\\
S: スカラー量のソース
もともとのscalarTransportFoam.CファイルではSの項が単純に表記されていないため、以下の部分をこのように書き換える。
while (simple.correctNonOrthogonal())
{
fvScalarMatrix TEqn
(
fvm::ddt(T)
+ fvm::div(phi, T)
- fvm::laplacian(DT, T)
== S
);
TEqn.relax();
TEqn.solve();
}
これによって、スカラー量の湧き出しが計算できるようになりました。
createField.Hの変更点
scalarTransportFoam2.CでSという新たな変数を作ってしまったので、このファイルで定義する必要があります。
ファイル中にはTやUを設定している箇所がありますので、Tに関するコードをコピーして以下のように変換・貼り付けます。
Info<< "Reading field S\n" << endl;
volScalarField S
(
IOobject
(
"S",
runTime.timeName(),
mesh,
IOobject::MUST_READ,
IOobject::AUTO_WRITE
),
mesh
);
変更は以上です。
チュートリアルケースの修正
明日修正