WSL2でJModelicaのDockerを動かす
はじめに
JModelicaのDockerイメージを使ってBuildingsライブラリを使う際のメモ。JModelicaは開発は終了しているものの、Modelonが公開はしているのでJModelicaを使う際に必ずしもこのDockerイメージを使う必要はない。
Buildingsライブラリ自体はOpenModelicaのnightlyビルド版を使えばだいぶ使えるようになっている。しかし、SOEPでFMIを使う場合はDymolaかJModelicaかOPTIMICAを使う必要があるようなので、現在この中で唯一無償で使えるJModelicaの需要はまだある。なお、SOEP用にOPTIMICAを無償で使えるように頑張っているらしいので、いずれはOPTIMICAを使うことになるかもしれない。
Windows用のDockerとしてDocker Desktop for Windowsがあり個人使用の範囲ではライセンスも問題ないのだが、今回使用するDockerの起動用スクリプトがシェルスクリプトなので、wsl2から実行することにする。
環境構築
WSL2のインストールはここを見ればできると思うけれど、基本的に管理者権限のPowerShellで以下を実行するだけである。もしかすると、古い環境だともう少し手間をかける必要があるかもしれない。
wsl --install
DockerのWSL2へのインストールはここに書いている通りにやる。先ほどインストールしたUbuntuを開いて以下を実行する。
sudo apt-get update sudo apt-get install \ ca-certificates \ curl \ gnupg \ lsb-release curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io
これでDockerがインストールできた。ただし、そのまま公式の説明通りにHello Worldをやると失敗すると思う。Docker Daemonの起動と停止を行う必要がある。
sudo service docker start sudo docker run hello-world sudo service docker stop
JModelicaのDockerを動かす
ここからUbuntuでJModelicaのイメージを動かすには公式の説明に従えばよい。このリポジトリに加え、Buildingsライブラリもダウンロードする必要がある。
cd ~ mkdir modelica cd modelica git clone https://github.com/lbl-srg/docker-ubuntu-jmodelica.git wget https://github.com/lbl-srg/modelica-buildings/releases/download/v8.1.0/Buildings-v8.1.0.zip unzip Buildings-v8.1.0.zip mv './Buildings 8.1.0' ./docker-ubuntu-jmodelica/Buildings
本来はBuildings
はライブラリ用のフォルダに移動すべきな気がするが、ライブラリ内のチュートリアルを実行する都合上このような場所にしている。自分のモデルを作って実行するなら切り分けるとよいと思う。その際はexport MODELICAPATH="~/modelica/lib/Buildings"
といった記述を~/.bashrc
ファイルに書いておくと良い。
計算を実行用のシェルスクリプトjm_ipython.sh
はMODELICAPATH
やPYTHONPATH
をDockerの環境に渡す処理をしているだけらしい(PYTHONPATHは何に使ってるのだろう)。以下のようにして計算を実行する。
cd ./docker-ubuntu-jmodelica sudo service docker start sudo ./jm_ipython.sh jmodelica.py Buildings.Utilities.Psychrometrics.Examples.DewPointTemperature sudo service docker stop
計算結果はBuildings_Utilities_Psychrometrics_Examples_DewPointTemperature_result.mat
である。OpenModelicaやJModelicaやBuildings.pyなどの好きな環境で閲覧するとよい。wsl上のファイルは\\wsl$\Ubuntu\home\username\modelica\docker-ubuntu-jmodelica
みたいなパスでWindowsのエクスプローラーからも確認でき、ドラッグ&ドロップでWindows側に持ってくることもできる。パスのusernameはwslでの自分の名前で、Ubuntuのところにバージョン名がはいってたりするかもしれない。
ちなみに今計算したファイルは絶対湿度を変化させたときの露点温度を計算するものであった。以下が入力条件をOpenModelicaで開いて確認したもの。 以下が露点温度。絶対温度なので273.15を引いてやると摂氏温度になる。
また、ログファイルとしてBuildings_Utilities_Psychrometrics_Examples_DewPointTemperature_log.txt
の他にBuildings_Utilities_Psychrometrics_Examples_DewPointTemperature_html_diagnostics
フォルダにいろいろhtmlが出力されている。デバッグする際にはいろいろ役に立つと思う。デバッグの際にはsudo ./jm_ipython.sh -i jmodelica.py Buildings.Utilities.Psychrometrics.Examples.DewPointTemperature
とiオプションをつけるとインタラクティブモードになってjmodelica.pyを実行した後の状態でipythonを起動したままになる。これで値を確認するなどができ、exit()
で終了する。
ソルバーの設定はjmodelica.pyの中で行っている。ncpが500だったりするので必要に応じて値を編集する必要があると思う。普段VSCodeを使っているならcode jmodelica.py
とすればWindowsのVSCodeでWSL上のファイルを簡単に編集できる。オプションの設定についてはJModelicaのマニュアルを見る必要があるので結局JModelicaをダウンロードしたほうが良いかもしれない。一応JModelicaの中のFMI実行部分にあたるPyFMIのHPのドキュメントを見ることもできる。スクリプト上のmod
がpyfmi.fmi.FMUModelME2
クラス、opts
がpyfmi.fmi_algorithm_drivers.AssimuloFMIAlgOptions
クラスのインスタンスである。おそらく多くのケースではncp
以外にres = mod.simulate(options=opts, start_time=0, final_time=604800)
とするなど計算時間関係を指定するぐらいで、他のソルバーのパラメータなどは基本的にいじらなくてもよい気はする。
引数のモデル名は以下のようにファイル名で与えてもよいようになっている。
if len(sys.argv) > 1: # If the argument is a file, then parse it to a model name if os.path.isfile(sys.argv[1]): model = sys.argv[1].replace(os.path.sep, '.')[:-3] else: model=sys.argv[1]
Buildings/Utilities/Psychrometrics/Examples/DewPointTemperature.mo
がBuildings.Utilities.Psychrometrics.Examples.DewPointTemperature
になるようになっている。そのため、カレントディレクトリ直下からのパスじゃないとうまく動かないと思われる。
おわりに
WSL2でJModelicaのDockerを使った計算方法を確認した。今後SOEPの計算について調べていきたい。