計算実行
いつも通り計算実行します。
|
1 |
buoyantPimpleFoam |
途中で以下のような記述が出ます。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
ExecutionTime = 0.36 s ClockTime = 3 s ===== codeTempFieldValue (coded) start ===== === probe Temperature === 1789 Tprobe = 328.723 === probe Temperature end === ===== Execute Python updateMOS_and_Run.py ===== Lock file created: "constant/updateMOS.lock" [INFO] Read from outletWeightAreaTempFile: Tout=311.973, Tprobe=328.723, Time=250.25 [INFO] Wrote updated HVACSystem002.mos [INFO] Running: ./runMos.sh HVACSystem002.mos in /mnt/d/work/openfoam/20251017_OpenCAE2025/heatedRoom {"", ""} LOG_SUCCESS | info | The initialization finished successfully without homotopy method. LOG_SUCCESS | info | The simulation finished successfully. 0 250.25 293.26641552174266 1.1490000000000002e-5 0.0024516407236118407 328.72299999999996 328.0 true true true true true true true |
毎回OpenModelicaの計算を挟んでいるので、少し計算の遅さを感じます。
グラフ化
output.datがOpenModelicaの結果なのでそれをグラフ化して、思っている挙動を示しているかを確認します。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
import pandas as pd import matplotlib.pyplot as plt from pathlib import Path import numpy as np # ====== ファイルパス設定 ====== file_path = Path("output.dat") # ====== データ読み込み ====== df = pd.read_csv(file_path, sep=r"[\t,]+", engine="python") # ====== 図と軸の設定 ====== fig, axes = plt.subplots(1, 4, figsize=(20, 4)) # 横4つのグラフ # X軸の範囲と刻み幅 x_min, x_max = df["Time"].min(), df["Time"].max() x_ticks = np.arange(x_min, x_max + 10, 10) # 10秒刻み # --- ① Target and Measured T --- axes[0].plot(df["Time"], df["TSensor"], label="TSensor") axes[0].plot(df["Time"], df["ramp.y"], label="Target") axes[0].set_xlabel("time [s]") axes[0].set_ylabel("T [K]") axes[0].set_title("Target and Measured T") axes[0].set_xticks(x_ticks) axes[0].grid(True) axes[0].legend() # --- ② Mass Flux --- axes[1].plot(df["Time"], df["mout"], label="mout") axes[1].set_xlabel("time [s]") axes[1].set_ylabel("mdot [kg/s]") axes[1].set_title("Mass Flux") axes[1].set_xticks(x_ticks) axes[1].grid(True) axes[1].legend() # --- ③ Inlet Temperature --- axes[2].plot(df["Time"], df["Tout"], label="Tinlet") axes[2].set_xlabel("time [s]") axes[2].set_ylabel("T [K]") axes[2].set_title("Tout (OpenFOAM Inlet Temperature)") axes[2].set_xticks(x_ticks) axes[2].grid(True) axes[2].legend() # --- ④ Heat Flow --- axes[3].plot(df["Time"], df["heatFlowSensor.Q_flow"], label="Q_flow") axes[3].set_xlabel("time [s]") axes[3].set_ylabel("Q [W]") axes[3].set_title("Heat Flow") axes[3].set_xticks(x_ticks) axes[3].grid(True) axes[3].legend() plt.tight_layout() plt.show() |
以下のようになっていたらOK。
まとめ
OpenFOAMとOpenModelicaを、FMU4FOAMを使わずに連携させる仕組みを作りました。
OpenFOAMで取得した温度や流量をPython経由でOpenModelicaへ渡し、PID制御結果を再びOpenFOAMに反映する流れです。
毎ステップでMOSファイルを自動生成して計算を回すことで、モデル間のやりとりを完全に自動化できました。
次回は、FMU4FOAMが対応していないマルチリージョン環境でも動作の確認をしたいと思います。
参考書
OpenModelicaのプログラムの文法を勉強したい方にはこちらがお勧めです。
こちらはOpenModelicaの参考書の中でも数少ない純粋な日本語書籍です。
本記事で紹介したコマンド実行の方法も解説があり、全体的にわかりやすい参考書になっており、重宝しています。



