はじめに
OpenFOAMの境界条件のexprFixedValue
を使用して、流出境界の平均温度から流入温度を決定します。
流出境界の平均温度は、OpenFOAMのexpressions syntaxの機能を使って計算しています。
サンプルモデル
出口温度が20℃になるように調整しながら、流入温度を変更しています。
出口温度(outlet)と流入温度(inlet)の履歴のグラフです。複雑な制御1はしていないので、一度出口温度がオーバーシュートしていますが、最終的には20℃に近づいています。
こちらのsample_averagedOutletにOpenFOAM v2212で動作確認をしたサンプルモデルが置いてあります2。
inletパッチの温度の境界条件
流入境界であるinlet
パッチでの温度の境界条件は、以下のように、exprFixedValue
3 を使用しています。
inlet
{
type exprFixedValue;
variables
(
"relax = 0.005"
"currentT = weightAverage(T)"
"outletT{outlet} = weightAverage(T)"
"nextT = currentT + relax*(293.15 - outletT)"
);
valueExpr "nextT";
value uniform 293.15;
}
これ以降では、このexprFixedValue
の各設定項目について説明します。
各変数の定義と計算(variables)
variables
の部分で各変数(パラメータ)の定義と計算を行っています。
"relax = 0.005"
後で使用するrelax
という変数に値を代入しています。これは、流入温度変化の緩和係数に相当していて、P制御のゲインと考えることもできます。
"currentT = weightAverage(T)"
この境界条件を設定している境界パッチinlet
での平均温度を計算して、currentT
という変数に代入しています。
weightAverage(...)
は、expressions syntaxの関数です。カッコの中の引数には、定義されているフィールドの名前を記述します。
このような関数には、その他にも面積で重み付けをした合計(面積積分)を表すweightSum
などもあります。
"outletT{outlet} = weightAverage(T)"
先ほどと同じように、今度は流出境界のパッチoutlet
の平均温度を計算して、outletT
という変数に代入しています。
左辺側の変数に{パッチ名}
を加えることで、指定したパッチでの値を計算することができます。
個体熱連成計算の場合で、個体など他の領域の温度を参照する場合には、{パッチ名/領域名}
という書式を使います。
"nextT = currentT + relax*(293.15 - outletT)"
設定する温度の値を計算してnextT
という変数に代入しています。
流出境界の目標の温度20℃(293.15K)と計算した流出境界の現在の平均温度outletT
との偏差を計算して、それに緩和係数(ゲイン)を乗じることで現在の温度からの変化量を求めています。
境界条件値の設定(valueExpr)
valueExpr
で境界条件値を設定します。ここでは、variables
で計算したnextT
の値を設定しています。
valueExpr "nextT";
おわりに
このようにOpenFOAMでもexpressions syntaxの機能を使用すれば、OpenFOAMのソースコードを書かなくても境界条件の設定だけで、他の境界条件の値を取得して、それに応じた値を設定できます。
expressions syntaxについは、公式にもここで説明されていますが、ここに書かれている以外にも説明されていない機能が実装されています。ただし、まだバグや思いもよらない制限などがありそうなので、使う場合にはよく検証を行ってから使ったほうがよいです。