OpenModelicaのBuildingsライブラリを学ぶ_その1

概要

前回はとりあえずOpenModelicaをインストールして動かしてみただけだったので今回からはチュートリアルSpaceCoolingの中身を少しずつみていく。このブログは出来るヤツが知識を教えるのではなく初心者がもがく様子を公開するブログなのでご理解を。
各バージョンは以下の通り
-OpenModelica1.12.0 →Modelica標準ライブラリ3.2.2を使っているが詳細な対応状況は不明
-Buildings 5.0.1

Modelicaについて

Modelicaというのはシミュレーション用の言語で以下のような使い方をする、と思う。
1. 計算モデルのコンポーネントをあらかじめ作成しておく。 (ポンプとか制御モデルとか)
2. 各コンポーネントの設定値や初期値などの変数を設定する。
3. 各コンポーネント同士のアウトプットとインプットをつないでシステムをつくる。
4. 計算して時々刻々と変化する各コンポーネントの変数が出力される。

単体の挙動を把握しているものがシステムにつながれた時にどう振る舞うかを計算するのだ。
ちなみにOpenModelicaはModelica言語のOSSでの実装の1つであり、 OpenModelica Connection Editor(OMEdit)は手軽にシステムを組む事ができるGUIである。どこがつながっているのか確認するのはテキストより画像のほうが楽なのでGUIはありがたい。

Buildingsライブラリについて

有名なところ(アメリカのローレンス・バークレー国立研究所LBNL)が作っているので使いはじめただけで他のものと比較してどうなのかは不明。その名のとおり建物関係のライブラリではあるのだが基本的に温熱環境や空調設備のみを取り扱っている。開発側はOpenModelicaでの挙動確認はしておらずDymolaとJModelicaでのみ挙動確認をしている。
Exampleファイルはたくさんあるので要領をつかんだらサンプル見て書き替えてというのはできるはず。

ライブラリの設定

OpenModelicaにはじめからついてるバージョンは3.0.0だが最新のBuildings 5.0.1を使うことにする。LBNLのサイトからダウンロードしてきて「ファイル→モデル/ライブラリを開く」からBuildings 5.0.1のpackage.moを開くと拾ってきたライブラリを使える。
毎回これやるのは面倒なので、Windowsの場合はたぶんCドライブ直下にOpenModelicaのフォルダがありlib/omlibraryの中に拾ってきたBuildings 5.0.1を投げ込む。バージョン違いがいっぱい入ってるがどうやらこれで最新バージョンを読み込んでくれるらしい。(やり方違っていたらごめんなさい)
さらに「ツール→オプション」のライブラリのところ追加を押してBuildingsを選ぶ。この画面のバージョンのところの設定はよく分からなかった。
f:id:kinonotofu:20180516202700p:plain
OMEditを再起動するとはじめからBuildingsライブラリを読み込んでくれる。

チュートリアル SpaceCooling

このライブラリのチュートリアルはBoilerもあるのだけれど7ステップあってめんどくさそうなのでSpaceCoolingをみることにした。
まずはSystem1から。
Buildings→Examples→Tutorial→SpaceCooling→System1をダブルクリック。
これでチュートリアルのファイルをみることが出来る。 f:id:kinonotofu:20180508225624p:plain
このダイアグラムの上にあるアイコンをクリックするとダイアグラムビューとテキストビューの切り替えやドキュメントの表示ができる。

テキストビューで確認できるコードは以下のとおり。
.moファイルを直接編集できるようである。

within Buildings.Examples.Tutorial.SpaceCooling;
model System1
  extends Modelica.Icons.Example;
  replaceable package MediumA = Buildings.Media.Air;

  Buildings.Fluid.MixingVolumes.MixingVolume vol(
    redeclare package Medium = MediumA,
    m_flow_nominal=mA_flow_nominal,
    V=V,
    energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial,
    mSenFac=3)
    annotation (Placement(transformation(extent={{60,20},{80,40}})));
  Modelica.Thermal.HeatTransfer.Components.ThermalConductor theCon(G=10000/30)
    annotation (Placement(transformation(extent={{20,40},{40,60}})));
  parameter Modelica.SIunits.Volume V=6*10*3; 
  parameter Modelica.SIunits.MassFlowRate mA_flow_nominal = V*6/3600;
  parameter Modelica.SIunits.HeatFlowRate QRooInt_flow = 1000;
  Modelica.Thermal.HeatTransfer.Sources.FixedTemperature TOut(T=263.15)
    annotation (Placement(transformation(extent={{-20,40},{0,60}})));
  Modelica.Thermal.HeatTransfer.Sources.FixedHeatFlow preHea(Q_flow=
        QRooInt_flow) "Prescribed heat flow"
    annotation (Placement(transformation(extent={{20,70},{40,90}})));
equation
  connect(TOut.port, theCon.port_a) annotation (Line(
      points={{5.55112e-16,50},{20,50}},
      color={191,0,0},
      smooth=Smooth.None));
  connect(theCon.port_b, vol.heatPort) annotation (Line(
      points={{40,50},{50,50},{50,30},{60,30}},
      color={191,0,0},
      smooth=Smooth.None));
  connect(preHea.port, vol.heatPort) annotation (Line(
      points={{40,80},{50,80},{50,30},{60,30}},
      color={191,0,0},
      smooth=Smooth.None));
  annotation (Documentation(info="<html>
(略)
</html>"),
    __Dymola_Commands(file=
     "modelica://Buildings/Resources/Scripts/Dymola/Examples/Tutorial/SpaceCooling/System1.mos"
        "Simulate and plot"),
    experiment(Tolerance=1e-6, StopTime=10800));
end System1;

ダブルクォーテーションで囲ってあるコメントと最後のドキュメントのHTMLは省いてある。
要約するとこんな感じの構成である。

within Buildings.Examples.Tutorial.SpaceCooling;ライブラリのツリー内の位置  
model System1 このファイル(クラス)の名前  
  extends Modelica.Icons.Example; GUI上のアイコンの指定  
  replaceable package MediumA = Buildings.Media.Air; わからない    
 (コンポーネントや変数の定義)  
equation  
 (コンポーネント同士をつなぐ部分)
 annotation (Documentation(info="<html> 
 (ドキュメントビューの内容)
    </html>"),
    (Dymolaのコマンドだからいらないはず),
    experiment(Tolerance=1e-6, StopTime=10800)); 計算条件の設定
end System1;    ファイル終わり  

このシステムで使っているコンポーネントは4つ
* 室(Buildings.Fluid.MixingVolumes.MixingVolume)右下
* 熱コンダクタンス(Modelica.Thermal.HeatTransfer.Components.ThermalConductor)中下
* 外気(Modelica.Thermal.HeatTransfer.Sources.FixedTemperature)左
* 熱流(Modelica.Thermal.HeatTransfer.Sources.FixedHeatFlow)中上
コンポーネントの括弧の中の値の設定はダイアグラムのそれぞれのアイコンをダブルクリックして行えるものが反映されている。数字を直接入力しても変数名を入力してもいいらしい。
annotation (Placement(transformation(extent={{60,20},{80,40}})))はGUI上のアイコンの位置。

変数は以下の3つ。型でエラーチェックしてるのだろうか。
テキストビューで直打ちじゃないと設定できないかもしれない。
* parameter Modelica.SIunits.Volume V=6103;
* parameter Modelica.SIunits.MassFlowRate mA_flow_nominal = V*6/3600;
* parameter Modelica.SIunits.HeatFlowRate QRooInt_flow = 1000;

コンポーネント同士を繋ぐ部分は以下の3つ。
一つのポートに複数のコンポーネントが繋げる。
* connect(TOut.port, theCon.port_a);
* connect(theCon.port_b, vol.heatPort);
* connect(preHea.port, vol.heatPort);
計算条件は「シミュレーション→シミュレーションのセットアップ」で設定できる。下のシミュレートにチェックをつけてOKすると計算を実行する。
Save experiment annotation inside modelにチェックをいれないと計算条件は保存されなさそうである。
f:id:kinonotofu:20180516213746p:plain

少しは分かってきたがまだまだわからないことが多い。 まぁぼちぼちと。次もまだこのチュートリアルのSystem1と戦っていると思う。