OpenFOAM

【OpenFOAMとOpenMoelica連携(2)】OpenFOAMとOpenMoelicaの連携:buoyantPimpleFoamソルバ

updateMOS_and_Run.py

updateMOS_and_Run.pyの全文を載せときます。

updateMOS_and_Run.py

ここで行っているのは以下です。

  1. HVACSystem002.mosというOpenModelicaをスクリプト実行するためのファイルを作成
  2. 最後にrunMos.shによりHVACSystem002.mosを実行
  3. constant/updateMOS.lockが削除し、Python実行が終了したことをOpenFOAMに知らせる
  4. output.datにOpenModelicaで得られた結果を出力する

HVACSystem002.mos

mosファイルの全文を載せておきます。

やっていることをまとめると以下です。

  1. Modelica標準ライブラリを読み込む
     loadModel(Modelica);
  2. 指定されたモデルファイルを読み込む
     /mnt/d/work/openfoam/20251017_OpenCAE2025/heatedRoom/HVACSystem001.mo
  3. モデルをビルド(コンパイル)
     モデル名:HVACSystem001
     解析条件:
     - 開始時刻:0
     - 終了時刻:300
     - ステップ数:1000
     - 許容誤差:1e-6
     - 数値積分法:dassl
     - 出力形式:.mat
     - 出力プレフィックス:HVACSystem
  4. システムコマンドでシミュレーションを実行(ここで値を更新している)
     パラメータ上書き
     - Tinlet=293.0
     - TSensor=310.0
     結果出力:
     /mnt/d/work/openfoam/20251017_OpenCAE2025/heatedRoom/HVACSystemResult.mat
  5. 指定時刻 t=300.0 における変数値を読み取る
     - Tout(出口温度)
     - mout(質量流量)
     - heatFlowSensor.Q_flow(熱流量)
     - TSensor(センサー温度)
     - ramp.y(ターゲット温度)
  6. OpenFOAM形式のヘッダを constant/boundarySyncFile に書き出す
     FoamFile ブロックとして、
     - バージョン、フォーマット、クラス、場所、オブジェクト名を定義。
  7. 取得したデータ行を追記モードで出力
     各行に以下の項目を書き出す
     - Time(時刻)
     - mout(質量流量)
     - Tout(出口温度)
     - heatFlowSensor.Q_flow(熱流量)
     - TSensor(センサー温度)
     - ramp.y(ターゲット温度)

OpenModelicaではOpenFOAMで計算したTSensorがOpenModelicaでしているターゲット温度波形(ramp.y:下図一番左オレンジ線)になるようにPID制御を行っています。

この記述をupdateMOS_and_Run.py内で行っているというのが重要なところで、TinletTSensorはOpenFOAMでの結果で得られた値になります。

つまり、OpenFOAMにとってのoutletの温度$\overline{T} = \frac{\sum_i \rho v_iA_i C_p T_i}{\sum_i \rho v_iA_i C_p }= \frac{\sum_i \rho Q_i C_p T_i}{\sum_i \rho Q_i C_p }$はOpenModelicaではTinletとしてインプットされているということです。

constant/boundarySyncFileに結果を出力します。

constant/boundarySyncFile

今度はOpenFOAMがこのファイルを読み込み境界名inletに与えれることになります。

runMos.sh

そしてrunMos.shによりHVACSystem002.mosを実行されるとOpenModelicaの計算が進みます。

runMos.sh

1 2 3 4
関連記事もどうぞ

COMMENT