#!/usr/bin/env python # coding: utf-8 # ### Buildings.Examples.Tutorial.SpaceCooling.System3 # # LBNL の [Modelica Buildings Library](https://simulationresearch.lbl.gov/modelica/index.html) の例題 # [System3](https://simulationresearch.lbl.gov/modelica/releases/latest/help/Buildings_Examples_Tutorial_SpaceCooling.html#Buildings.Examples.Tutorial.SpaceCooling.System3) # を実行します。 # # - [OpenModelica(とJModelica)でBuildingsライブラリを学ぶ_その9](https://kinonotofu.hatenablog.com/entry/2018/08/05/205951) # - [Google ColaboratoryでJModelica](https://kinonotofu.hatenablog.com/entry/2018/12/12/015319) # # に解説があります。 # # ライブラリを使用する方法は、環境変数 MODELICAPATH にライブラリのパスを設定する方法と、compile_fmu の引数のファイル名としてライブラリのファイル名やディレクトリ名をフルパスで指定する方法があります。前者の方法を実施します。 # # # #### Macの場合 # Mac で # # [JModelica.org の Docker イメージを作って Jupyter Notebook で利用する](https://www.amane.to/archives/710) # # のように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 の場合 # 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 でもライブラリのサーチパスとして使用されています。 # In[1]: import os os.environ['MODELICAPATH'] = '/usr/local/jmodelica/ThirdParty/MSL:/home/jmodelica/jmodelica/lib' os.environ['MODELICAPATH'] # 例題のモデル System3 をコンパイルして FMU を作成します。 # In[2]: from pymodelica import compile_fmu fmu = compile_fmu('Buildings.Examples.Tutorial.SpaceCooling.System3') # FMUをロードします。 # In[3]: from pyfmi import load_fmu model = load_fmu(fmu) # 計算開始時刻 startTime、計算終了時刻 stopTime、から ncp (number of communication points, ソルバーとモデルが通信する回数)を計算します。 # In[4]: startTime = 15552000. stopTime = 15638400. ncp = int((stopTime - startTime)/60) print(ncp) # オプションを設定して、シミュレーションを実行します。 # ソルバーを Radau5ODE にして relative tolerance を 1.0e-6 としています。 # In[5]: 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) # シミュレーション結果の空気の温度をプロットします。 # # コイルクーラーの入口(Cooler Inlet)、出口(Cooler Outlet)、室温(Room)、外気温(Weather)です。 # In[6]: get_ipython().run_line_magic('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)をプロットします。 # In[7]: 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() # In[ ]: