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.shMODELICAPATHPYTHONPATHを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とすればWindowsVSCodeでWSL上のファイルを簡単に編集できる。オプションの設定についてはJModelicaのマニュアルを見る必要があるので結局JModelicaをダウンロードしたほうが良いかもしれない。一応JModelicaの中のFMI実行部分にあたるPyFMIのHPのドキュメントを見ることもできる。スクリプト上のmodpyfmi.fmi.FMUModelME2クラス、optspyfmi.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.moBuildings.Utilities.Psychrometrics.Examples.DewPointTemperatureになるようになっている。そのため、カレントディレクトリ直下からのパスじゃないとうまく動かないと思われる。

おわりに

 WSL2でJModelicaのDockerを使った計算方法を確認した。今後SOEPの計算について調べていきたい。