LBNL の Modelica Buildings Library の例題 System3 を実行します。
に解説があります。
ライブラリを使用する方法は、環境変数 MODELICAPATH にライブラリのパスを設定する方法と、compile_fmu の引数のファイル名としてライブラリのファイル名やディレクトリ名をフルパスで指定する方法があります。前者の方法を実施します。
Mac で
JModelica.org の Docker イメージを作って Jupyter Notebook で利用する
のようにDocker コンテナにインストールした JModelica.org を使用する場合、Docker コンテナから見えるようにマウントしたディレクトリの中に Building ライブラリを格納します。ここではライブラリ用のディレクトリ
/Users/ユーザー名/jmodelica/lib
を作成して、そこにダウンロードした Buildings-v6.0.0.zip を解凍しました。ディレクトリは /Users/ユーザー名/jmodelica/lib/Buildings 6.0.0 となります。Docker コンテナから見たライブラリのパスは
/home/jmodelica/jmodelica/lib
です。MSL のパスは
/usr/local/jmodelica/ThirdParty/MSL に です。これらを環境変数 MODELICAPATH に設定します。
import os
os.environ['MODELICAPATH'] = '/usr/local/jmodelica/ThirdParty/MSL:/home/jmodelica/jmodelica/lib'
Windows にインストールした JModelica.org を使用する場合は Buildings ライブラリを任意のパスに置きます。例えば、
C:\Users\ユーザー名\jmodelica\lib
を作成して、そこに Buildings ライブラリを解凍します。ディレクトリは C:\Users\ユーザー名\jmodelica\lib\Buildings 6.0.0 です。 MSL のパスはデフォルトでインストールした場合、
C:\JModelica.org-2.14\install\ThirdParty\MSL
です。これらを環境変数 MODELICAPATH に設定します。
import os
os.environ['MODELICAPATH'] = 'C:\\JModelica.org-2.14\\install\\ThirdParty\\MSL;C:\\Users\\ユーザー名\\jmodelica\\lib'
この環境変数 MODELICAPATH は Dymola でもライブラリのサーチパスとして使用されています。
import os
os.environ['MODELICAPATH'] = '/usr/local/jmodelica/ThirdParty/MSL:/home/jmodelica/jmodelica/lib'
os.environ['MODELICAPATH']
'/usr/local/jmodelica/ThirdParty/MSL:/home/jmodelica/jmodelica/lib'
例題のモデル System3 をコンパイルして FMU を作成します。
from pymodelica import compile_fmu
fmu = compile_fmu('Buildings.Examples.Tutorial.SpaceCooling.System3')
FMUをロードします。
from pyfmi import load_fmu
model = load_fmu(fmu)
計算開始時刻 startTime、計算終了時刻 stopTime、から ncp (number of communication points, ソルバーとモデルが通信する回数)を計算します。
startTime = 15552000.
stopTime = 15638400.
ncp = int((stopTime - startTime)/60)
print(ncp)
1440
オプションを設定して、シミュレーションを実行します。 ソルバーを Radau5ODE にして relative tolerance を 1.0e-6 としています。
opts = model.simulate_options()
opts['ncp']=ncp
opts['solver']='Radau5ODE'
opts['Radau5ODE_options']['rtol']=1.0e-6
res = model.simulate(start_time=startTime, final_time=stopTime, options=opts)
Final Run Statistics: --- Number of steps : 2311 Number of function evaluations : 13742 Number of Jacobian evaluations : 301 Number of function eval. due to Jacobian eval. : 7224 Number of error test failures : 39 Number of LU decompositions : 1905 Number of state function evaluations : 3061 Number of state events : 78 Solver options: Solver : Radau5 (explicit) Tolerances (absolute) : [ 1.00000000e-09 1.00000000e-08 1.00000000e-08 1.00000000e-08 3.00000000e-06 1.00000000e-03 1.00000000e-08 1.00000000e-03 1.00000000e-08 3.00000000e-06 1.00000000e-03 1.00000000e-03 1.00000000e-08 3.00000000e-06 1.00000000e-03 1.00000000e-03 1.00000000e-08 3.00000000e-06 1.00000000e-03 1.00000000e-03 1.00000000e-08 1.00000000e-08 1.00000000e-08 1.00000000e-08] Tolerances (relative) : 1e-06 Simulation interval : 15552000.0 - 15638400.0 seconds. Elapsed simulation time: 1.71796178818 seconds.
シミュレーション結果の空気の温度をプロットします。
コイルクーラーの入口(Cooler Inlet)、出口(Cooler Outlet)、室温(Room)、外気温(Weather)です。
%matplotlib notebook
import matplotlib.pyplot as plt
t = res['time']
volT = res['vol.T']
outT = res['weaDat.TDryBul_in_internal']
coolIn1 = res['cooCoi.sta_a2.T']
coolOut1 = res['cooCoi.sta_b2.T']
plt.figure(1)
plt.plot(t, coolIn1, linestyle='dotted')
plt.plot(t, coolOut1, linestyle='dotted')
plt.plot(t, volT, t, outT)
plt.legend(['Cooler Inlet','Cooler Outlet','Room','Weather'])
plt.ylabel('Temperature [K]')
plt.xlabel('Time [s]')
plt.xlim(startTime,stopTime)
plt.grid(b=True)
plt.show()
制御系によってオンオフされるコイルクーラーの冷却水の流量(Water Mass Flow Rate)、コイルクーラー入口の水温(Water Inlet Temperature)、コイルクーラー出口の水温(Water Outlet Temperature)をプロットします。
mflow = res['souWat.m_flow_in']
cooInT2 = res['cooCoi.sta_a1.T']
cooOutT2 = res['cooCoi.sta_b1.T']
plt.figure(2)
plt.subplot(3,1,1)
plt.plot(t, mflow)
plt.legend(["Water Mass Flow Rate"],loc='upper right')
plt.ylim(-0.1,3.2)
plt.ylabel('[kg/s]')
plt.xlim(startTime, stopTime)
plt.xticks(color='None')
plt.subplot(3,1,2)
plt.plot(t, cooInT2)
plt.legend(["Water Inlet Temperature"], loc='lower right')
plt.ylim(284,298)
plt.grid(b=True)
plt.xticks(color='None')
plt.xlim(startTime, stopTime)
plt.ylabel('[K]')
plt.subplot(3,1,3)
plt.plot(t, cooOutT2)
plt.ylim(284,298)
plt.legend(["Water Outlet Temperature"], loc='lower right')
plt.grid(b=True)
plt.xlim(startTime, stopTime)
plt.ylabel('[K]')
plt.show()