こんにちは(@t_kun_kamakiri)
前回の記事ではOpenModelicaとbuoyabtPimpleFoamソルバとの連携をFMU4FOAMを使わずに行う方法について紹介しましました。
FMU4FOAMを使わずに行えるととても便利で自由度が高まります。
もともと本記事で紹介するようなマルチリージョンソルバ(熱流体と固体の連成ソルバ)でOpenModelicaとの連携をしたかったのですが、FMU4FOAMでは対応しておらず、仕方なく今回紹介するやり方を試した次第です。
OpenFOAM(マルチリージョンソルバであるchtMultiRegionFoam)とOpenModelicaとの連成を行う方法について紹介
ここでFMU4FOAMを簡単に紹介しておきます。
OpenFOAMとOpenModelicaの連携にはFMUI規格に沿った、FMU4FOAMというツールがあります。
以下の記事を1つずつ読み進めていけば、FMU4FOAMを使うことができます。
この記事はOpenFOAMのv2412でも動かせるようにしたものです。
※並列計算できるかなどは確認していません。
ただし、このFMU4FOAMは現時点(2025年11月)で調べた限りはOpenFOAMのマルチリージョンソルバには対応していないようでした。
これが少し不満でどうしてもマルチリージョンソルバに対応したOpenFOAMとOpenModelicaの連携がしたく、上記の勉強会でも報告しアドバイスを頂いましたが、解決にはいたらず。
マルチリージョンソルバは以下の図のように領域ごとに「0, constant, system」ファイルを構成するため、FMU4FOAMの境界条件がこのファイル構造を認識するようにプログラムされていないことが原因のようです。
今回はマルチリージョンソルバへの対応のために、OpenFOAMと外部ソルバ(今回はOpenModelica)との連携ができるプログラムを実装する手順を考えたので紹介します。
計算の流れは以下のようになります。
この仕組みを使ってFMU4FOAMの例題(heatedRoom)と同じことを行いました。
右下のグラフに結果を載せています。
buoyantPimpleFoamとOpenModelicaとの連成
一番左のグラフが大事で、OpenFOAMのprobesで指定した温度センサの値がオレンジ色のターゲット温度に追従するよう、OpenModelicaのPID制御で入口温度境界に反映させる設定にしています。
OpenFOAMと外部ソルバ(OpenMoelica)を連携
以下がFMU4FOAMによる結果です。
FMU4FOAM

じゃっかん結果が違いますが、やりたいことは達成していますよね。
OpenFOAMの流出温度の評価方法とPID制御のパラメータが少し違うことが原因なのかな?
というわけで前段が長くなりましたが、本記事ではFMU4FOAMを使わずOpenFOAMのマルチリージョンソルバとOpenModelicaを連携させる方法についてまとめておきます。
- OpenFOAM v2412
- OpenModelica 1.25.0(Linux版)
- WSL2(Ubuntu-22.04)
計算の実行方法
Allrun.runファイルがありそれが以下のようになっています。
|
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 |
#!/bin/bash # Allrun.run set -e cd "$(dirname "$0")" echo "[INFO] Remove old output.dat if exists..." if [ -f output.dat ]; then rm -f output.dat echo "[INFO] output.dat removed." else echo "[INFO] No existing output.dat." fi # ========================================================== # ① preload.mos の再コンパイル確認 # ========================================================== echo -n "preload.mos を再コンパイルしますか? [y/N]: " read answer if [[ "$answer" == "y" || "$answer" == "Y" ]]; then echo "[INFO] Running preload.mos (initial Modelica compile)..." ./runMos.sh preload.mos echo "[INFO] Preload complete." else echo "[INFO] preload.mos の再コンパイルをスキップします。" fi # ========================================================== echo "boundarySyncFile をコピーします..." cp -v constant/fluid/boundarySyncFile_base constant/fluid/boundarySyncFile echo "chtMultiRegionFoam をバックグラウンドで実行します..." chtMultiRegionFoam > log.chtMultiRegionFoam 2>&1 & SOLVER_PID=$! echo "chtMultiRegionFoam started (PID: ${SOLVER_PID})" echo "ログ: log.chtMultiRegionFoam" |
./Allrunを実行すると以下のようにOpenModelicaのコンパイルをするかどうかを聞いてきます。
|
1 2 3 4 |
./Allrun.run [INFO] Remove old output.dat if exists... [INFO] output.dat removed. preload.mos を再コンパイルしますか? [y/N]: y |
yとするとコンパイルをします。
ただし、毎回コンパイルする必要がありません。
例えばOpenModelicaの設定を変更した場合はコンパイルする必要がありますが、既にコンパイル済であればNでコンパイルを飛ばすこともできます。
このAllrun.runスクリプトはOpenFOAMの実行まで行っており、log.chtMultiRegionFoamにログを記載していきます。
ログを確認したい場合は、
|
1 |
tail -f log.chtMultiRegionFoam |
でログを確認することができます。
以下では設定内容を詳しく見ていきます。
OpenModelicaの計算実行
以下の記事ではOpenModelicaをコマンド実行により計算する内容を紹介しました。
それぞれのファイルの関係性を図にしておきます。
これができるとものすごく便利ですよね。
なぜならOpenModelicaのGUIを起動することなく計算を実行できるため、数値を変更したパラスタやOpenFOAMの計算中に値をOpenModelicaに渡して計算を実行するなども可能になります。
計算の対象
計算対象は、室内空間の天井部に空調設備を配置し、そこから空気が流入・流出する構成を想定したものです。
室内のある位置(Tsensor)の温度を検知しOpenModelicaに渡します。

以下の一番左の図のようにTsensorがTarget温度になるように、OpenModelicaでPID制御します。
またOpenFOAMの流出温度をもとにOpenFOAMの質量流を決めるようにしています。
現状途中で計算値が発散してしまいましたが、上手く動作しているのが確認できました。発散の原因は制御している流入側の温度や流速が上下しすぎて計算が安定しなかったことが考えられます。










