OpenModelica(とJModelica)でBuildingsライブラリを学ぶ_その9

概要

OpenModelicaでLBNLのBuildingsライブラリを使う。初心者なのでいろいろ教えて頂けるとありがたい。
前回SpaceCoolingのSystem2をやったので今回はSystem3をやる。
使用バージョン
-OpenModelica1.12.0 →Modelica標準ライブラリ3.2.2
-JModelica2.2 →Modelica標準ライブラリ3.2
-Buildings 5.0.1

System3の概要とSystem2からの変更点

f:id:kinonotofu:20180804205959p:plain
System2では気象データファイル読み取り用のモデルweaDatを使用していたものの、使用時は定数を設定して一定の外気温を出力しているだけだった。今回はその部分をちゃんと気象データファイルを読み込んで外気温を出力するように変更する。また、一定の外気温度の場合は定常状態となりオープンループ制御でも一定の室温に収束していたが、外気温が変動するとそうもいかなくなるので閉ループ制御を追加する。
それからvolのenergyDynamicsがFixedInitialからSteadyStateInitialにかわっていた。このタイミングで変更した理由はよくわからない。 閉ループ制御のために新しく追加したモデルはオンオフコントローラーcon、設定温度TRooSetPoi、室温センサーsenTemRooであり、ポンプ流量mWat_flowはSystem2とは別のモデルを使用している。これらはModelica標準ライブラリを使って実装している。Modelica標準ライブラリでuがインプット、yがアウトプットになっているのは何かの略なのだろうけど何なんだろう。追加したモデルのコネクタの設定を以下に示す。

  connect(TRooSetPoi.y, con.reference);
  connect(vol.heatPort, senTemRoo.port);
  connect(senTemRoo.T, con.u);
  connect(con.y, mWat_flow.u);
  connect(mWat_flow.y, souWat.m_flow_in);

senTemRooはvolから温度をもらってconに渡している。conは別のポートにもTRooSetPoiから温度をもらっている。conからオンオフの制御信号をmWat_flowに送り、mWat_flowが信号を流量にしてsouWatに渡している。

気象データ読取モデルweaDat

前回はこのモデルをつかいながらも外気温は定数を出力していたが今回は.mosファイルからデータを読み取って出力する。そのため、TDryBulSouをBuildings.BoundaryConditions.Types.DataSource.ParameterからBuildings.BoundaryConditions.Types.DataSource.Fileへ変更している。TDryBul=TOut_nominalが残っているのは初期値として使うからだろうか。設定しなくてもよいかもしれない。

  BoundaryConditions.WeatherData.ReaderTMY3 weaDat(
    pAtmSou=Buildings.BoundaryConditions.Types.DataSource.Parameter,
    TDryBul=TOut_nominal,
    filNam=Modelica.Utilities.Files.loadResource("modelica://Buildings/Resources/weatherdata/USA_IL_Chicago-OHare.Intl.AP.725300_TMY3.mos"),
    TDryBulSou=Buildings.BoundaryConditions.Types.DataSource.File)

オンオフコントローラーcon

ややこしいが熱コンダクタンス用のモデルのインスタンスはtheConという名前でこれとは別物である。 TRooSetPoiから設定温度をreferenceに、senTemRooから計測温度をuに受け取り、mWat_flowへyを受け渡している。帯域幅は1[K]に設定している。

  Modelica.Blocks.Logical.OnOffController con(bandwidth=1)
    "Controller for coil water flow rate";

Modelica.Blocks.Logical.OnOffControllerの実装は以下の通り。

  block OnOffController
    Blocks.Interfaces.RealInput reference
    Blocks.Interfaces.RealInput u
    Blocks.Interfaces.BooleanOutput y
    parameter Real bandwidth(start=0.1)
    parameter Boolean pre_y_start=false
  initial equation
    pre(y) = pre_y_start;
  equation
    y = pre(y) and (u < reference + bandwidth/2) or (u < reference - bandwidth/2);
  end OnOffController;

pre(y)で1時刻前のyの値を参照している。yが論理演算になっているが設定温度-0.5×帯域幅より低い場合はtrue、設定温度+0.5×帯域幅より高い場合がfalseであることに注意。bandwidthの範囲の温度のときはpre(y)と同じになる。
f:id:kinonotofu:20180805195753p:plain

設定温度TRooSetPoi

TRooSetPoiは定数を出力するだけのモデルである。conが設定値をコネクタからもらってくる仕様になっているため追加されている。

  Modelica.Blocks.Sources.Constant TRooSetPoi(k=TRooSet)

f:id:kinonotofu:20180805195858p:plain

室温センサーsenTemRoo

volから温度をもらってconへ出力している。特に設定はない。

  Modelica.Thermal.HeatTransfer.Sensors.TemperatureSensor senTemRoo

conの入力がReal型の数値であり、volからのコネクタがHeatPortかFluidportなので、HeatPortから温度をもらってReal型の数値として出力している。 Modelica.Thermal.HeatTransfer.Sensors.TemperatureSensorの実装は以下の通り。

  model TemperatureSensor
    Modelica.Blocks.Interfaces.RealOutput T(unit="K");
    Interfaces.HeatPort_a port;
  equation
    T = port.T;
    port.Q_flow = 0;
  end TemperatureSensor;

f:id:kinonotofu:20180805195828p:plain

ポンプ流量mWat_flow

mWat_flowのモデルをModelica.Blocks.Sources.ConstantからModelica.Blocks.Math.BooleanToRealに置き換える。ポンプsouWatの入力はBoolean型のオンオフ信号を使えないのでオンオフ信号を流量に変換するために使っている。OnOffControllerは暖房向けのオンオフになっており、冷却時の設定としてtrueで0、falseでmW_flow_nominalを出力している。

  Modelica.Blocks.Math.BooleanToReal mWat_flow(realTrue=0, realFalse=
        mW_flow_nominal) 

Modelica.Blocks.Math.BooleanToRealの実装は以下の通り。

  block BooleanToReal "Convert Boolean to Real signal"
    parameter Real realTrue=1.0;
    parameter Real realFalse=0.0";
    Blocks.Interfaces.RealOutput y;
  equation
    y = if u then realTrue else realFalse;
  end BooleanToReal;

f:id:kinonotofu:20180805195714p:plain

計算実行

やっぱりOpenModelicaでは実行できないので前回と同じくJModelicaで実行してみる。
計算は15552000[s]から15638400[s]まで9732個のデータが出力されており一日分の計算になっているものの時間間隔が均等ではなかった。そういうものなのだろうか。
* 室温と外気温
f:id:kinonotofu:20180805202706p:plain

外気温が変動しているが、室温はオンオフ制御でだいたい設定温度±0.5[K]くらいになっている。グラフの形もまぁチュートリアルのドキュメントにあるものと同じ形状にはなっている。ちなみにweaDatのTDryBulSouは常に1を、TDryBulは常に305.5を出力しており、実際に外気温を確認できるのはTDryBul_in_internalである。TDryBulはあくまで一定値の出力用、TDryBulSouは設定値Buildings.BoundaryConditions.Types.DataSource.Fileを示す数値が出力されているだけのようだった。

  • ポンプの水の発停
    f:id:kinonotofu:20180805203056p:plain
    ポンプの流量も一応確認。

  • コイル水側の出入口温度
    f:id:kinonotofu:20180805203915p:plain
    水の出入口温度はポンプが停止して流量がなくなってもコイルを通過する空気温度になっているようである。流量が0だから計算できないとかにはなっていないらしい。

おわりに

コネクタの型をあわせるためにモデルを追加するのはもう少しシンプルにできないものかなぁと思ったけどモデルを入れ子にしてもう少しまとまりをつくるとすっきりするのだろうか。今回追加した4つのモデルをまとめて一つのモデルとして扱ってもいいような気がする。とりあえずBuildingsライブラリのExamples/Tutorial/SpaceCoolingはひとまずこれで終わり。このチュートリアルの中でもいろいろ疑問を放置したままになっていることが多いのでそのあたりは少しずつ整理してつぶしていきたいと思った。ライブラリの.moファイルのannotationにそれぞれ書いてあるドキュメントの日本語訳作業ものんびりはじめた。

github.com

さすがに全部を訳し切るのはできない気がするけれど使用するモデルの整理のついでくらいに思って部分的にでもやろうと思う。なによりもう一個の方がまだ終わってないので図とかそろえてさっさと形を整えてあげないといけないのだけれど。。。
とりあえずブログでは次回からはAirflowのExampleでも見ながら建物の換気回路網計算をしたいと思う。

OpenModelica(とJModelica)でBuildingsライブラリを学ぶ_その8

概要

OpenModelicaでLBNLのBuildingsライブラリを使う。初心者なのでいろいろ教えて頂けるとありがたい。 SpaceCoolingのSystem2をやる。前回でモデルの設定は全部見たので今回は計算をまわしたい。
使用バージョン
-OpenModelica1.12.0
-JModelica2.2 → Modelica標準ライブラリ3.2?
-Buildings 5.0.1

JModelicaを使う

System2の計算を実行しようとOpenModelicaで実行したところコンパイルエラーが発生した。
f:id:kinonotofu:20180725222614p:plain
もともとBuildingsライブラリの動作検証はDymolaという商用ソフトとJModelicaというOSSソフトでしか行っていないのだった。そういうわけでJModelicaを使うことにした。Windows環境でのインストールは公式サイトからバイナリインストーラをダウンロードしてきて実行すればたぶん悩むことは無いと思う。
JModelicaはOMEditのようなGUIでモデルを設定するツールがないようだ。OMEditでモデルを作成して実行はJModelicaというのもありかもしれないし、ちょっとしたものならVSCode(Modelica用の拡張機能がある)などテキストエディタで書くのもよいかもしれない。
次に書くJModelicaの使い方はfinbackさんに教えて頂きました。ありがとうございます。

  • Buildingsライブライリを適当な作業場所へ置いてBuildingsライブライリのフォルダの名前をバージョン名抜きのBuildingsという名称にする。
  • JModelicaのIPythonを実行し、cdでBuildingsフォルダを置いた場所へ移動する。
  • 以下のコードを入力してSystem2のモデルをfmuファイルにコンパイルする。
from pymodelica import compile_fmu
fmufile = compile_fmu('Buildings.Examples.Tutorial.SpaceCooling.System2','Buildings')

f:id:kinonotofu:20180725230258p:plain
* これダメじゃないかと思うようなすごい勢いで「ファイルが見つかりません」を訴えかけてきてエラーを出しながらもBuildings_Examples_Tutorial_SpaceCooling_System2.fmuファイルが生成される。気にせず以下のコードを入力して生成されたfmuファイルを実行する。

from pyfmi import load_fmu
model = load_fmu('Buildings_Examples_Tutorial_SpaceCooling_System2.fmu')
model.simulate()
  • Buildings_Examples_Tutorial_SpaceCooling_System2_result.mat が出力されるのでJModelicaのplot-GUIで読み込む。

このmatファイルをOMEditで読み込むと温度は絶対温度でのみ見ることができる。System1ではOpenModelicaで実行して結果を読み込むと温度を摂氏と絶対温度と切り替え表示ができていたのでJModelicaで実行したときの仕様だと考えられる。

System2のおさらい

f:id:kinonotofu:20180606201749p:plain
System2の簡単なおさらいは以下の通り。
* 熱容量を持った室に発熱1000Wと熱貫流を熱流としてコネクタから与えている。
* さらに流体を与えるコネクタから冷気を給気して冷やしている。
* 室の熱貫流はテキストデータから読み取った外気温度から計算。
* 室にコイルで冷却した外気を給気。この外気温度もおなじテキストデータから読み取っている。
* 外気はファンの位置で質量流量固定。
* 室の排気は冷却コイルに入る前の外気と顕熱交換。
* コイルの冷水側は温度固定、流量固定

パラメータと各モデルの設定を以下の表に示す。

変数名 説明
V 室容積[m3] 6*10*3
eps 熱交換器の熱交換効率[-] 0.8
TASup_nominal 室の給気温度の公称値[K] 273.15+18
TRooSet 室の設定室温[K] 273.15+24
TOut_nominal 外気の設計温度[K] 273.15+30
THeaRecLvg 給気側の熱交換器出口温度[K]
=給気側のコイル入口温度[K]
TOut_nominal
-eps*(TOut_nominal-TRooSet)
QRooInt_flow 室の発熱[W] 1000
QRooC_flow_nominal 室の冷却負荷の公称値[W] -QRooInt_flow
-10E3/30*(TOut_nominal-TRooSet)
mA_flow_nominal 空気の質量流量の公称値[kg/s]
温度変化後を考慮して1.3倍?
1.3*QRooC_flow_nominal/1006
/(TASup_nominal-TRooSet)
dTFan ファンによる想定温度上昇[K] 2
QCoiC_flow_nominal 熱交換器と潜熱負荷を考慮にいれたコイルの冷却負荷[W] 4*(QRooC_flow_nominal
+mA_flow_nominal*(TASup_nominal
-THeaRecLvg-dTFan)*1006)
TWSup_nominal 水の往き温度?[K] 273.15+16
TWRet_nominal 水の還り温度?[K] 273.15+12
mW_flow_nominal 水の質量流量の公称値[kg/s] QCoiC_flow_nominal/(TWRet_nominal-TWSup_nominal)/4200
インスタンス 用途 設定
vol redeclare package Medium = MediumA
m_flow_nominal=mA_flow_nominal
V=V
nPorts=2
energyDynamics=
Modelica.Fluid.Types.Dynamics.FixedInitial
mSenFac=3
theCon 室の壁体の熱コンダクタンス G=10000/30
TOut 外気温 なし
preHea 室の発熱ソース Q_flow=QRooInt_flow
fan 給気ファン redeclare package Medium=MediumA
m_flow_nominal=mA_flow_nominal
energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState)
hex 熱交換器 redeclare package Medium1=MediumA
redeclare package Medium2=MediumA
m1_flow_nominal=mA_flow_nominal
m2_flow_nominal=mA_flow_nominal
dp1_nominal=200
dp2_nominal=200
eps=eps
cooCoi 冷却コイル redeclare package Medium1=
MediumW
redeclare package Medium2=MediumA
m1_flow_nominal=mW_flow_nominal
m2_flow_nominal=mA_flow_nominal
dp1_nominal=6000
dp2_nominal=200
UA_nominal=-QCoiC_flow_nominal
/Buildings.Fluid.HeatExchangers.BaseClasses.lmtd(
T_a1=THeaRecLvg,T_b1=TASup_nominal
,T_a2=TWSup_nominal,T_b2=TWRet_nominal)
show_T=true
energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial
out 外気 nPorts=2
redeclare package Medium=MediumA
souWat 冷水ポンプ
(流量ソース)
nPorts=1
redeclare package Medium=MediumW
use_m_flow_in=true
T=TWSup_nominal
sinWat 冷水の排出先 nPorts=1
redeclare package Medium=MediumW
weaDat 気象データ pAtmSou=Buildings.BoundaryConditions.Types.DataSource.Parameter
TDryBulSou=Buildings.BoundaryConditions.Types.DataSource.Parameter
TDryBul=TOut_nominal
filNam=
Modelica.Utilities.Files.loadResource(
"modelica://Buildings/Resources/weatherdata/USA_IL_Chicago-OHare.Intl.AP.725300_TMY3.mos")
weaBus 気象データ用バス なし
mAir_flow 給気風量 k=mA_flow_nominal
mWat_flow 冷水流量 k=mW_flow_nominal
senTemHXOut 給気側熱交換器出口温度 redeclare package Medium=MediumA
m_flow_nominal=mA_flow_nominal
senTemSupAir 給気側コイル出口温度 redeclare package Medium=MediumA
m_flow_nominal=mA_flow_nominal

TWSup_nominalとTWRet_nominalはおそらく名前が逆である。
パラメータは直接数値を指定したものと数式で入力したデータがある。だいたい次のような流れでパラメータを数式で指定している。考え方を残しておくという意味で良いと思うし、パラメータは計算の途中で変更できない仕様なのでたぶんモデルを呼び出すたびに計算して遅くなるとかもないはず。
* 設定室温から室の負荷を求める。
* 室の負荷と給気温度から空気の風量を求める。
* 空気の風量とコイルの空気側の入口出口温度差からコイルの処理負荷を求める。
* コイルの処理負荷と水の入口出口温度差から水の流量を求める。

ここで空気の風量を1.3倍している理由がちょっとわかっていない。

System2の実行

ここで注目すべきは開ループ制御により室温vol.Tが設計温度273.15+24=297.15[K]になっているかである。ついでに熱交換器からの排気の影響が気になっていたので給気側外気条件の温度out.Tが273.15+30=303.15[K]になっているかを見る。 f:id:kinonotofu:20180725225019p:plain
外気のほうは排気の影響はなさそうだが、室温が少し低くなっている。風量1.3倍がよくないのではないかと思ったが公式のドキュメントでも室温が低くなっていて計算結果自体はだいたいあっていそうではある。念のために風量を1.3倍→1.0倍として計算してみた。CoocoiでShou_TをTrueにしていたのでそこの温度も表示してみる。Fluidportからは標準では温度がでないためこの設定により温度出力用のportができていた。
f:id:kinonotofu:20180725233030p:plain
JModelicaの結果表示からテキストデータでの書き出しがよく分からないのでOMEditのほうでCSVデータを書き出して計算終了時点の温度を見てみる。

名称 変数名 設計温度 計算温度
室温 vol.T 24℃ 23.758℃
空気側コイル出口温度 a1.T 16℃ 18℃
空気側コイル入口温度 a2.T 25.2℃ 25.038℃
水側コイル出口温度 b1.T 16℃ 17.818℃
水側コイル入口温度 b2.T 12℃ 16.648℃

風量を直すと室温はそれらしい値になった。ただ給気温度となるコイル出口温度が低いしコイルの水側にいたっては固定値のはずのコイル入口温度が全然違う。System2で想定される計算結果といえるのが風量1.3倍にしていたもののグラフしかなくて、それはまぁだいたいそれっぽくなってはいたけれど、どうにも不安になる結果である。まぁ細かい検証とかはまた別の機会にやりたいと思う。

おわりに

今回は結果を見るときにそんな変数あったっけっていうものまで並んでいたので表示したい変数を探すのが少し手間でした。なにかよい方法はないかなぁと。それから、慣れもあると思うけれどプレとかポストの処理はOpenModelicaがやっぱりやりやすくて、Buildingsライブラリを使うにしてもJModelicaと併用か、OpenModelicaで計算できるようにしたいなぁと思いました。JModelicaの計算もこれで大丈夫なのか不安なところもあるし、新たな課題が見つかったような感じです。
OpenModelicaで計算できなかったときはとても困ったけれどfinbackさんの助けによりなんとか計算ができました。本当に感謝しています。まだまだ知らない事だらけだけれどSystem2を通してまた少し理解が進みました。次はSystem3をやります。

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

概要

OpenModelicaでLBNLのBuildingsライブラリを使う。初心者なのでいろいろ教えて頂けるとありがたい。 SpaceCoolingのSystem2をやる。前回はhexとoutとsenTemHXOut廻りを見たので今回はcooCoiとsouWat廻りを見る。計算までやりたかったけれどそれは次回いろいろいじりながらやってみたい。のんびりやりすぎな気がしなくもないが続けることが大事なのだと思う。
使用バージョン
-OpenModelica1.12.0 →Modelica標準ライブラリ3.2.2
-Buildings 5.0.1

チュートリアル SpaceCoolingのSystem2

f:id:kinonotofu:20180606201749p:plain
今回は水配管廻りを見ていく。mWatで指定された流量の冷水を冷水ポンプsouWatで冷却コイルcooCoiに送り、還りの冷水はsinWatにつながっているというものである。

cooCoi以外の3つのモデルの使い分けは以下のようになっている。FixedBoundaryとMassFlowSource_Tの違いがやや分かりにくいような気がするので後で確認したい。
* Modelica.Blocks.Sources.Constant→定数を出力
* Buildings.Fluid.Sources.FixedBoundary→流体(Medium)の状態を出力
* Buildings.Fluid.Sources.MassFlowSource_T→流量と温度の設定をして流体(Medium)の状態を出力

cooCoiとsouWat廻りのコネクタは以下のとおり。

  connect(souWat.ports[1], cooCoi.port_a1);
  connect(cooCoi.port_b1, sinWat.ports[1]);
  connect(mWat_flow.y, souWat.m_flow_in);
  connect(senTemHXOut.port_b, cooCoi.port_a2);
  connect(cooCoi.port_b2, senTemSupAir.port_a);

コイルはport_a1とport_b1が水、port_a2とport_b2が空気のコネクタになっている。

mWat廻り

mWatの設定は以下のとおり。

Modelica.Blocks.Sources.Constant mWat_flow(k=mW_flow_nominal)

mAir_flowとおなじでBuildingsライブラリではなくModelica標準ライブラリを使って流量を定数で出力している。

sinWat廻り

sinWatの設定は以下のとおり。

Buildings.Fluid.Sources.FixedBoundary sinWat(nPorts=1, redeclare package Medium = MediumW)

出力用のコネクタの数の設定と流体の指定をしている。冷水の設定なので変数としてMediumW(=Buildings.Media.Water)を指定している。特に数値を設定しているわけでもないので、冷却コイルの出口がどこかへ値を渡す必要がありとりあえずつくっているものなのかもしれない。たぶんFixedBoundaryというよりGradientZeroみたいな条件になっているような気がする。
OMEdit上の設定は以下のとおり。
f:id:kinonotofu:20180712222203p:plain
設定できるのは、圧力と密度、温度と比エンタルピ、湿度?、その他汚染物質等、が設定できるようである。どうやら境界条件用のモデルなので相手からこのモデルに流れてくる流れ方向のときは圧力を除いて影響がないらしい。流出境界になるときは圧力境界条件としては使えるけれど、出口温度固定などをしたいならこのモデルではダメなんだと思われる。

souWat廻り

souWatの設定は以下のとおり。

Buildings.Fluid.Sources.MassFlowSource_T souWat(
    nPorts=1,
    redeclare package Medium = MediumW,
    use_m_flow_in=true,
    T=TWSup_nominal)

出力用のコネクタの数、流体、流量コネクタ使用の有無、出力する温度を指定している。use_m_flow_in=trueとすることでmWatから流量を受け取ることができる。nominalとついてある値を入力するときはだいたい計算を行うときのオーダーがどの程度なのかを数値計算上の理由により指定しているもののような気がしていたのだが、ここでは出力する温度を指定している。まぁモデル側ではただのTなので深く考えるところではないかもしれない。
OMEdit上の設定は以下のとおり。
f:id:kinonotofu:20180712224228p:plain FixedBoundaryとの違いはいくつかあるのだけれど、まず圧力と密度ではなく流量を扱っている点とこちらは比エンタルピが使えない点がある。それから、FixedBoundaryはその名前のとおり定数を指定しなければならなかったけれど、MassFlowSource_Tはinputのコネクタから値を受け取って出力することができ、コネクタのオンオフの設定がある。流出境界の扱いについてはこちらは流量のみ有効になるようだ。
本来ポンプとしてもモデルはファンで使ったものと同じものを使うのだけれど、これでも流量を指定できるのでポンプのように使うこともできるということだろう。

cooCoi廻り

cooCoiの設定は以下のとおり。

 Buildings.Fluid.HeatExchangers.WetCoilCounterFlow cooCoi(redeclare package Medium1 =
        MediumW, redeclare package Medium2 = MediumA,
    m1_flow_nominal=mW_flow_nominal,
    m2_flow_nominal=mA_flow_nominal,
    dp1_nominal=6000,
    dp2_nominal=200,
    UA_nominal=-QCoiC_flow_nominal/
        Buildings.Fluid.HeatExchangers.BaseClasses.lmtd(
        T_a1=THeaRecLvg,
        T_b1=TASup_nominal,
        T_a2=TWSup_nominal,
        T_b2=TWRet_nominal),
    show_T=true,
    energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial)

コイルはモデル名から向流型熱交換器で潜熱負荷も処理するモデルだろうと思われる。2つの流体、流量、差圧、熱コンダクタンスと温度表示、計算モデルの種類の設定を行っている。熱コンダクタンスはコイルの処理熱量を対数平均温度差で割って逆算してもとめているので熱コンダクタンス×対数平均温度差で処理熱量を求めるモデルであることが想定される。
OMEdit上の設定は以下のとおり。コイルも熱交換器の一種なので空気の熱交換器で見たものと同じパラメータが多い。
f:id:kinonotofu:20180712225453p:plain
↑2つの流体、流量、差圧、熱コンダクタンスの指定に加えて、空気と水の対流熱伝達率の比、空気と水とコイルそれぞれの時定数を指定できる。あとnEleはコイルの離散化時の分割数らしく、コイルをいくつかの部分に区切って計算しているらしい。コイルは解析的に長さで積分して出口温度出すやつじゃないのだろうか。コイルのパラメータを指定してコイルの熱コンダクタンスを求めたりはできないらしい。
f:id:kinonotofu:20180712230027p:plain
↑流れの逆流に関する指定。熱交換器で見たのと同じ。
f:id:kinonotofu:20180712230011p:plain
↑流量0近傍の扱い。熱交換器で見たのと同じだがホモトピー法は使っていないようだ。 f:id:kinonotofu:20180712225956p:plain
↑流れの抵抗に関する指定。熱交換器で見たのと同じ。
f:id:kinonotofu:20180712225941p:plain
↑エネルギーバランスの式の設定。ファンとか室で見たのと同じもの。 f:id:kinonotofu:20180712225926p:plain
↑水と空気それぞれの対流熱伝達率が流量や温度に依存するかどうかの設定。デフォルトでは流量のみに依存となっている。ラジエーターみたいなものだと空気側は温度に依存とかするのかもしれない。
f:id:kinonotofu:20180712225915p:plain
↑拡散に近似する熱コンダクタンス?の設定。とりあえず流量0近傍の扱いなので計算安定化に寄与するのかもしれないがExperimentalの項目なので気にしなくてもいいだろう。

おわりに

ようやくSystem2のモデルの設定を全部確認できた。次回は計算して気になってたところとかの確認をしたい。このライブラリのドキュメントはあまり読み込まず適当にやっていたけれど、もうちょっとちゃんとしないとなぁと思ってきたので翻訳をはじめてみた。HPのほうのユーザーガイド。どうでもいいところから訳し始めている感が強いが短いところからやっていきたい性分なのだと思う。
github.com
英語は得意でもないし、意味はなんとなくわかっても日本語にするのが難しかったりして翻訳なんて無駄な作業なんじゃないかと思うのだけれど、git使ってみたかったというのもあるしよいのだ。まだ途中だけれど終わったらライブラリ内のドキュメントを訳していこうかと思う。ただドキュメントに知りたいこと全部書いてるわけでもないんだよなぁ。。。

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

概要

OpenModelicaでLBNLのBuildingsライブラリを使う。初心者なのでいろいろ教えて頂けるとありがたい。 SpaceCoolingのSystem2をやる。前回はvolとfan廻りをみたのでhexとoutとsenTemHXOutを見る。
使用バージョン
-OpenModelica1.12.0 →Modelica標準ライブラリ3.2.2
-Buildings 5.0.1

チュートリアル SpaceCoolingのSystem2

f:id:kinonotofu:20180606201749p:plain

熱交換器hexは外気outからの給気とvolからの排気の熱交換をしている。センサーsenTemHXOutはhexからでた給気温度をとってcooCoiにつないでいる。
hex、out、senTemHXOut廻りのコネクタは以下のとおり。

connect(vol.ports[2], hex.port_a2);
connect(out.ports[1], hex.port_a1);
connect(out.ports[2], hex.port_b2);
connect(weaDat.weaBus, out.weaBus);
connect(hex.port_b1, senTemHXOut.port_a);
connect(senTemHXOut.port_b, cooCoi.port_a2);

outのコネクタはweaDatから気象データ一式を受け取ってhexへ給気のデータを渡している。逆にhexからおそらく排気のデータを受け取っている。hexはさらにvolからの排気とsenTemHXOutへの給気がつながっている。そしてsenTemHXOutはhexから得たデータをコイルへ出力している。hexからセンサーとコイルの両方へデータを渡すという形にしてしまいそうだがこのように使うらしい。

out廻り

outの設定は以下のとおり。

Buildings.Fluid.Sources.Outside out(nPorts=2, redeclare package Medium = MediumA);

アイコンをぱっと見た感じでvolに近いだろうと思ったのだが中身を見てみると気象データを取り出すだけのモデルだと感じた。nPorts=2で指定された数だけ、Modelica.Fluid.Interfaces.FluidPorts_bが用意されている。気象データやバスからはこのコネクタは出てなかったように思うので、気象データをMediumの状態としてFluidPortsを通じて渡すときのための境界条件用モデルだろう。out.ports[1]は流出条件、out.ports[2]は流入条件のような接続がされているが、FluidPorts_bって流入にも使えるけれど一応流出用のコネクタだよなぁと思った。計算したときに確認してみたい。
outのOMEDit上の設定画面は以下のとおり。
f:id:kinonotofu:20180704222036p:plain
設定画面からコネクタの数を指定できる。物質の濃度を入力したり、固定値で与えたりもできるようだがつかいどころがイメージできない。

hex廻り

hexの設定は以下のとおり。

Buildings.Fluid.HeatExchangers.ConstantEffectiveness hex(redeclare package Medium1 =
      MediumA, redeclare package Medium2 = MediumA,
  m1_flow_nominal=mA_flow_nominal,
  m2_flow_nominal=mA_flow_nominal,
  dp1_nominal=200,
  dp2_nominal=200,
  eps=eps);

熱交換するそれぞれの流体と流量と差圧と、熱交換効率を指定している。このチュートリアルではダクト系の圧力降下を気にしていないが一応設定しているようだ。流量が正の値のとき熱交換器に対してhex.port_a1から流入してhex.portb1から流出、hex.port_a2から流入してhex.port_b2から流出しており、FluidPorts_aとFluidPorts_bがそれぞれ割り当てられている。これは顕熱のみ交換するモデルで全熱交換器はBuildings.Fluid.MassExchangers.ConstantEffectiveness を使うらしい。他にも詳細な熱交換器のモデルがライブラリにはあるけれど、これは入力した交換効率でそのまま顕熱だけ計算するシンプルなものである。 hexのOMEDit上の設定画面は以下のとおり。 f:id:kinonotofu:20180704222541p:plain
↑テキストで指定したのはGeneralの部分。
f:id:kinonotofu:20180704222610p:plain
↑Assumptionでは流れの逆流の有無を指定できる。デフォルトでtrueである。逆流しないと分かっているときはたぶんfalseの方が計算が安定したり速くなったりするのだと思う。
f:id:kinonotofu:20180704222627p:plain
↑Advancedでは流量0付近での計算安定性のパラメータと思われる流量と、ホモトピー法の使用のオンオフ設定がある。ホモトピー法というのをはじめて聞いたのだがたぶんHomotopy analysis method - Wikipediaのことだろう。よく理解できなかったのだがThe HAM is an analytic approximation method designed for the computer era with the goal of "computing with functions instead of numbers."とあるので数値的な解法というよりもなんらかの関数を使ってより解析的な近似で計算するらしい。わからん。
それからコネクタでの実際の温度を計算するかの設定があるがあまり計算に影響するものではなさそうである。
f:id:kinonotofu:20180704222731p:plain
↑Flow Resistanceでは圧力降下の計算に関する設定がある。

senTemHXOut廻り

コイルとファンの間にあるセンサーsenTemSupAirも同じモデルを使っている。実はパラメータの設定も同じである。両方の設定は以下のとおり。

Buildings.Fluid.Sensors.TemperatureTwoPort senTemHXOut(redeclare package Medium =
      MediumA, m_flow_nominal=mA_flow_nominal);
Buildings.Fluid.Sensors.TemperatureTwoPort senTemSupAir(redeclare package Medium =
      MediumA, m_flow_nominal=mA_flow_nominal);

流体と流量の指定をしているだけである。流体の状態をそのまま受け渡すだけで何をやっているのやらという感じではあるが、System3で制御が組み込まれるのだろう。Buildings.Fluid.Sensors.UsersGuideにセンサー類の説明がある。センサーにはコネクタが1つのものと2つのものがあるがMixingVolumesの値を計測する以外は2つのものを使用したほうがよいらしい。また、tau=0とすると定常モデル、tau>0とすると非定常モデルになるらしく、流量に依存しない量を計測する場合は流量0付近で数値的に不安定になるのでtau>0として非定常モデルにしたほうがよいようだ。他にもセンサーの動的挙動に関する説明があったが力不足であまりよく理解できなかった。 senTemHXOutのOMEDit上の設定画面は以下のとおり。 f:id:kinonotofu:20180704230013p:plain
↑非定常モデルとしたときの設定がいろいろできる。 f:id:kinonotofu:20180704230054p:plain
f:id:kinonotofu:20180704230103p:plain
↑この上ふたつはよくある流れの逆流の設定と流量0付近の扱いの設定である。

おわりに

なんとなくライブラリの特徴というかどういう設定があるのかが分かってきたような気はする。小難しい設定があるけれど数値計算上の設定でデフォルト値のままにしておけば大丈夫そうなことが多い。その理解でよいかは別だけれど。
前回更新時点でBuildingsライブラリは5.1.0がリリースされていた。Spacecoolingのチュートリアルが終わるまでは今のライブラリでやろうと思っているが、5.1.0ではBuildings.Fluid.Sourcesでの絶対湿度をXではなくXiを入力として使用できるようになった。Xiは絶対湿度でXは水蒸気密度(water vapor concentration)だと思われる。水蒸気濃度というのは湿り空気の質量で水蒸気の質量を割っているのだろうか。(絶対湿度は乾燥空気の質量で割っている。)とりあえず今は湿度を扱っていないのでとくに影響はなかったがあまり気にしていなければXのことを絶対湿度だと思いこむだろうと思った。やっぱちゃんと分かってないのはよくないな。

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

概要

OpenModelicaでLBNLのBuildingsライブラリを使う。初心者なのでいろいろ教えて頂けるとありがたい。 前回からチュートリアル SpaceCoolingのSystem2をやっている。全体像と気象データ廻りを見たので次はvolとfan廻りをみる。
使用バージョン
-OpenModelica1.12.0 →たぶんModelica標準ライブラリ3.2.2
-Buildings 5.0.1

チュートリアル SpaceCoolingのSystem2

f:id:kinonotofu:20180606201749p:plain
System2ではSystem1のvolにnPorts=2と設定してできたポートをつないでファンで機械換気している。volとfan廻りのコネクタは以下。

connect(fan.port_b, vol.ports[1]);
connect(vol.ports[2], hex.port_a2);
connect(fan.m_flow_in, mAir_flow.y);
connect(senTemSupAir.port_b, fan.port_a);

volのコネクタはfanと熱交換器につながっているので給気と熱回収用の排気をつないでいるのだろう。 fanはvol以外にもつながっていて流量や温度を受け取っていそうである。mAir_flow(Modelica.Blocks.Sources.Constant)はkにReal型の値をParameterとして設定してyというコネクタから出力するブロックのようである。ブロックというクラスはそのクラス内で宣言された変数はinputかoutputとせねばならないというものである。senTemSupAirはセンサーのモデルなのだがけっこうしっかりしているのでまた別の回に取り扱いたいと思う。

vol廻り

volの設定は以下。

Buildings.Fluid.MixingVolumes.MixingVolume vol(
    redeclare package Medium = MediumA,
    m_flow_nominal=mA_flow_nominal,
    V=V,
    nPorts=2,
    energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial,
    mSenFac=3);

volの設定でnPorts=2とすればvolにports[1]とports[2]ができるようである。System1との違いは本当にこれだけである。
これらのコネクタはModelica.Fluid.Vessels.Baseclasses.VesselFluidPorts_bクラスのコネクタなのだが、これは実質Modelica.Fluid.Interfaces.FluidPortである。内容は以下の通り。

connector FluidPort
  "Interface for quasi one-dimensional fluid flow in a piping network (incompressible or compressible, one or more phases, one or more substances)"

  replaceable package Medium = Modelica.Media.Interfaces.PartialMedium
    "Medium model" annotation (choicesAllMatching=true);

  flow Medium.MassFlowRate m_flow
    "Mass flow rate from the connection point into the component";
  Medium.AbsolutePressure p "Thermodynamic pressure in the connection point";
  stream Medium.SpecificEnthalpy h_outflow
    "Specific thermodynamic enthalpy close to the connection point if m_flow < 0";
  stream Medium.MassFraction Xi_outflow[Medium.nXi]
    "Independent mixture mass fractions m_i/m close to the connection point if m_flow < 0";
  stream Medium.ExtraProperty C_outflow[Medium.nC]
    "Properties c_i/m close to the connection point if m_flow < 0";
end FluidPort;

とりあえずMediumを値にもつコネクタをつなげばよさそう。Medium自体が流量と圧力と熱量(エンタルピ)を持ってくれているようだ。Medium自体ではなくMassFlowRate、AbsolutePressure、SpecificEnthalpy、MassFraction、ExtraPropertyの値ももつコネクタをつないでも大丈夫な気はする。いくつかの値だけもらいたいときにはそれでもいいのかもしれない。

fan廻り

fanの設定は以下

Buildings.Fluid.Movers.FlowControlled_m_flow fan(
    redeclare package Medium = MediumA,
    m_flow_nominal=mA_flow_nominal,
    energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState) ;

fanの設定はシンプルでMediumとデフォルトの風量と計算モデルの種類を指定している。これはvolとfanでMediumAを共有してしまわないのだろうか。仕様はわかっていないが別のインスタンスとして扱ってくれるのだろう。
SteadyStateとFixedInitialのどちらも一定値を出し続けそうな気がするが、値を受け取る場合はSteadyStateとするという違いがあるのかもしれない。コネクタを見る限り、風量と温度を受け取って、volヘ媒体の状態(風量含む)を渡しているように思うのだがファン自体は何か計算をしているのだろうか。

fan.port_aはfan.port_b、aが入力、bが出力であることだけで実質どちらもModelica.Fluid.Interfaces.FluidPortクラスだった。要するにvolのコネクタと同じである。fan.m_flow_inはModelica.Blocks.Interfaces.RealInputクラスのコネクタだが一行で記述できるシンプルなものである。

connector RealInput = input Real "'input Real' as connector"

m_flow_inの定義部分は以下

Modelica.Blocks.Interfaces.RealInput m_flow_in(
    final unit="kg/s",
    nominal=m_flow_nominal) if
       inputType == Buildings.Fluid.Types.InputType.Continuous
    "Prescribed mass flow rate"

RealInputは何の値か分からないので使うときに単位を指定してある。if文がありモデル作成の際の入力データの種類の設定ができる。Continuous(コネクタから入力)の他にConstant(定数指定)とStages(段階の指定)がある。Stagesを使うと例えば風量の強弱の切り替えをしようとしたときに信号を受け取って1段回目が風量なし、2段回目が最大の0.6倍、3段階目が最大風量といったように切り替えることができるらしい。

さらにBuildings.Fluid.Movers.FlowControlled_m_flowのソースを読んでいこうとしたのだが例の如く大変なので詳細を追うのは断念した。Buildings.Fluid.Movers.UsersGuideというannotationだけのクラスがありこれを読めば分かるだろうと思ったのだが、細かいところを詳しく書いていて、分かったような分からないような感じになった。今回は風量指定としているが、P-Q曲線を使ったり、消費電力の計算ができたりと一通り気になる部分は計算できそうな様子だった。

OMEditの設定画面を示す。
f:id:kinonotofu:20180614035618p:plain
↑下のControlでインプットの種類を選択する。Parameterの設定でConstantやStageにしたときの流量を設定できる。 addPowerToMedeiumをtrueにすると機器の発熱を流体に加えることができるのだと思う。nominalValuesDefineDefaultPressureCurveをtrueにするとP-Q曲線のために流量と差圧を設定したときの警告がでなくなるらしい。規定値の外の値になると警告がでて計算がとまるのだろうか。
Initializationでは流量や差圧と体積流量の初期値を設定できる。保存則の関係からなのか流量は基本的に質量流量を設定しているが、 ここでは機器データとして得られる体積流量をいれられる。Nominalconditionでは差圧と流量の公称条件?の値を設定する。たぶんこの値でP-Q曲線の設定をするのではないかと思う。

f:id:kinonotofu:20180614035646p:plain
↑Equationsのところはエネルギーと物質の計算式の種類を選ぶところなのだがまだよくわかっていない。ここではSteadyStateになっている。NominalconditionやFilteredspeedのところはよくわからない。

f:id:kinonotofu:20180614035659p:plain
↑初期値と物質の濃度のデフォルト値。

f:id:kinonotofu:20180614035711p:plain
↑計算上逆流するとなった時の設定。逆流しないように強制力を働かせるわけではなさそうだがfalseで計算上逆流するとどうなるのだろう。

f:id:kinonotofu:20180614035724p:plain
↑show_Tをtrueにするとポートの実際の温度を計算するとのことだがおそらく流量の正負(流れ方向)が変わるとコネクタの温度の計算が安定しなくなるので、流量の絶対値がm_flow_small以下の流量ゼロ近傍のときに計算式を変えているのだと思う。

ファンの効率はデフォルト値で0.7になっているらしいのだがどこで設定するのだろうか。いろいろ設定できるよくできたモデルなんだろうけれど全部を把握するのは難しい。色々入出力をみながらいじるのがよさそうなのでもう少し学習が進んだらたくさん試したい。

おわりに

もうすこし浅い理解でどんどん触っていくほうがよいと思いながらも全然進まない。次は熱交換器、センサーをみていきたい。次の次にコイルとかポンプ廻りをみてその後さくっとSystem3へ進みたい。はやく熱源システム組んでみたいが、換気回路網計算のモデルもあるのでそっちも気になるところ。
ちょっとよさそうなサイトを見つけた。コードを読んでいてこれなんだっけと思ったときにマニュアルの該当箇所へ飛びやすくなると思う。http://modref.xogeny.com/
OpenModelicaの理解も深めないといけないしやることはたくさんあるけど楽しめるペースでやっていきます。

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

概要

OpenModelicaでLBNLのBuildingsライブラリを使う。初心者なのでいろいろ教えて頂けるとありがたい。 前回でチュートリアル SpaceCoolingのSystem1はとりあえず終わったのでSystem2を見ていく。 今回はSystem2の全体像と気象データの読み込み部分だけ。
使用バージョン
-OpenModelica1.12.0 →たぶんModelica標準ライブラリ3.2.2
-Buildings 5.0.1

チュートリアル SpaceCoolingのSystem2

f:id:kinonotofu:20180606201749p:plain
気象データを読み込む部分と室を冷房する部分が増えてコネクタのつながりが少しややこしくなった。System1との違いは以下の通り
* TOutの温度Tを気象データのテキストを読み込むモデルweaDatとつなげて与えるようになった
* volでnPorts=2の設定がでてきた。たぶん給排気用。空調空気を給気し、排気は熱交換器で熱回収を行う。
* 熱交換器hexと冷却コイルcooCoiとファンfanなどのモデルを使って室を空調(外調?)している。
* 冷却コイル用の冷水廻りのモデルも色々ある。
* Mediaとして室内を満たす空気Buildings.Media.Air に加えて冷却コイル用の水Buildings.Media.Waterがでてきた。
* 制御用のモデルも色々ある。

全部一気に見るのが大変そうなので少しずつ見ていく。 System2に登場するモデルは以下の通り。

Buildings.Fluid.Movers.FlowControlled_m_flow fan;
Buildings.Fluid.HeatExchangers.ConstantEffectiveness hex;
Buildings.Fluid.HeatExchangers.WetCoilCounterFlow cooCoi;
Buildings.Fluid.Sources.Outside out;
Buildings.Fluid.Sources.MassFlowSource_T souWat;
Buildings.Fluid.Sources.FixedBoundary sinWat;
BoundaryConditions.WeatherData.ReaderTMY3 weaDat;
BoundaryConditions.WeatherData.Bus weaBus;
Modelica.Blocks.Sources.Constant mAir_flow;
Modelica.Blocks.Sources.Constant mWat_flow;
Buildings.Fluid.Sensors.TemperatureTwoPort senTemHXOut;
Buildings.Fluid.Sensors.TemperatureTwoPort senTemSupAir;

気象データ関係のところでBuildingsを省略しているのは長いからだろうか。本来Buildings.BoundaryConditions.~となるはずである。他のモデルも短く宣言してもいいのかもしれない。

まずはBoundaryConditionsとなるweaDat(ReaderTMY3)とweaBus(Bus)をみてみる。各モデルのコネクタでのつながりは以下のとおり。weaDatはweaBusというコネクタがあり、weaBusはTDryBulというコネクタがある上にweaBus自身もコネクタとなっている。不思議である。

connect(weaDat.weaBus, out.weaBus);
connect(weaDat.weaBus, weaBus);
connect(weaBus.TDryBul, TOut.T);

weaBusのコードは以下のとおり。

within Buildings.BoundaryConditions.WeatherData;
expandable connector Bus "Data bus that stores weather data"
  extends Modelica.Icons.SignalBus;
  annotation (省略);
end Bus;

expandable connectorクラスであるがアイコン以外特に何も書いていない。普通のコネクタは何かしらの変数を持ってその変数を通して値を受け渡しするはずだがexpandableがつくとコネクタ側で変数を持たずとも受け取ったデータを他のモデルに受け渡すことが出来るのかもしれない。

とりあえず気象データの使い方としてはweaDatからweaBusやout.weaBusで一式丸ごとうけとって、そこからほしい物を取り出すという使い方をするものなのだろう。ところで今までチュートリアルのモデルを眺めているだけで気づかなかったのだが、自分でモデルを作ってweaDatからBusにコネクタをつないでみると繋げる変数の一覧が出てきた。これでモデルがどんなコネクタをもっているのかがわかるのだがweaDatのコネクタの数がちょっと多すぎる。サイドバーを見れば変数の多さがわかると思う。繋げる変数は黒色、無効なものは灰色の文字になっている。
f:id:kinonotofu:20180606203933p:plain
ちなみにBusとThermalConductorをつなぐときにはweaBusの下のNew Variableを選択してweaBusの中の変数を手打ちでTDryBulと打って指定する必要がある。もっと良い方法はないものか。
f:id:kinonotofu:20180606204850p:plain

weaDatの設定は以下のようになっている。

BoundaryConditions.WeatherData.ReaderTMY3 weaDat(
    pAtmSou=Buildings.BoundaryConditions.Types.DataSource.Parameter,
    TDryBulSou=Buildings.BoundaryConditions.Types.DataSource.Parameter,
    TDryBul=TOut_nominal,
    filNam="modelica://Buildings/Resources/weatherdata/USA_IL_Chicago-OHare.Intl.AP.725300_TMY3.mos")
    "Weather data reader");

pAtmSouとTDryBulSouがBuildings.BoundaryConditions.Types.DataSource.Parameterとなっている。.Parameter以外に .Fileや.Inputがありそれぞれ、定数、ファイルからの入力、コネクタからの入力?となっているようである。特に指定しなければファイルからの入力がデフォルトになっている。
ファイルから読み込むときはfilNamで指定したmosファイル(気象データファイル)を読み込んでいる。 weaDatはややこしいのでOMEdit上の設定画面だけ確認してコードは割愛する。 f:id:kinonotofu:20180606205432p:plain
f:id:kinonotofu:20180606205445p:plain
湿球温度の計算はループが必要なので計算時間への影響が大きいのか計算のオンオフがある。あとは天空への放射の計算の際に天空温度を用いるか長波放射量とするかの切り替えもある。それ以外はそれぞれ.Parameterや.Fileや.Inputの選択とParameterのときの値の指定をするだけである。さらにParameterのときでもpAtmのように値を指定しなければデフォルト値が使われるようだ。

気象データファイルとして読み込んでいるmosファイルは自分でフォーマットを見て用意してもいいのだがEnergyPlusの気象データ(.epw)からライブラリ付属のjavaのプログラムにより変換して作成することが出来る。これで世界中の気象データを使うことが出来る。
まずはWeather Data | EnergyPlusから目的の地点の気象データを拾ってきて (OpenModelicaインストールフォルダ)\lib\omlibrary\Buildings 5.0.1\Resources\weatherdataにepwデータをおく。
たとえばJPN_Tokyo.Hyakuri.477150_IWEC.epwを.mosデータにする場合は以下のようにする。

cd (OpenModelicaインストールフォルダ)\lib\omlibrary\Buildings 5.0.1\Resources\weatherdata
java -jar ../bin/ConvertWeatherData.jar JPN_Tokyo.Hyakuri.477150_IWEC.epw

これでJPN_Tokyo.Hyakuri.477150_IWEC.mosができている。中身は以下の通り。 ヘッダーで記載した#C1から#C30までのデータがタブ区切りでならんでいる。項目が多く、すべてのデータがそろっているわけではない。

#1
double tab1(8760,30)
#LOCATION,TOKYO HYAKURI,-,JPN,IWEC Data,477150,36.18,140.42,9.0,35.0
#DESIGN CONDITIONS,1,Climate Design Data 2009 ASHRAE Handbook,,Heating,1,-6.9,-5.1,-12.8,1.2,1,-11.1,1.5,0.6,10.2,6.1,8.7,6.6,1.1,0,Cooling,8,7.7,32.1,26,30.9,25.8,29.2,24.8,26.8,30.6,26.1,29.6,25.5,28.7,4.8,210,26,21.4,29.3,25.1,20.3,28.3,24.2,19.2,27.1,84.8,30.6,81.4,29.6,78.4,28.6,1007,Extremes,9.7,8.3,7.3,32.8,-9.5,34.1,1.1,1.5,-10.3,35.2,-11,36,-11.6,36.9,-12.4,38
#TYPICAL/EXTREME PERIODS,6,Summer - Week Nearest Max Temperature For Period,Extreme,8/ 5,8/11,Summer - Week Nearest Average Temperature For Period,Typical,8/12,8/18,Winter - Week Nearest Min Temperature For Period,Extreme,1/22,1/28,Winter - Week Nearest Average Temperature For Period,Typical,2/12,2/18,Autumn - Week Nearest Average Temperature For Period,Typical,11/19,11/25,Spring - Week Nearest Average Temperature For Period,Typical,5/13,5/19
#GROUND TEMPERATURES,3,.5,,,,3.79,2.88,4.49,7.01,13.59,18.68,22.10,23.15,21.37,17.42,12.15,7.26,2,,,,7.13,5.51,5.84,7.18,11.58,15.57,18.75,20.46,20.10,17.86,14.23,10.38,4,,,,9.89,8.23,7.87,8.37,10.86,13.55,16.01,17.72,18.12,17.15,15.02,12.41
#HOLIDAYS/DAYLIGHT SAVINGS,No,0,0,0
#COMMENTS 1,"IWEC- WMO#477150 - Asia -- Original Source Data (c) 2001 American Society of Heating, Refrigerating and Air-Conditioning Engineers (ASHRAE), Inc., Atlanta, GA, USA.  www.ashrae.org  All rights reserved as noted in the License Agreement and Additional Conditions. DISCLAIMER OF WARRANTIES: The data is provided 'as is' without warranty of any kind, either expressed or implied. The entire risk as to the quality and performance of the data is with you. In no event will ASHRAE or its contractors be liable to you for any damages, including without limitation any lost profits, lost savings, or other incidental or consequential damages arising out of the use or inability to use this data."
#COMMENTS 2, -- Ground temps produced with a standard soil diffusivity of 2.3225760E-03 {m**2/day}
#DATA PERIODS,1,1,Data,Sunday, 1/ 1,12/31
#C1 Time in seconds. Beginning of a year is 0s.
#C2 Dry bulb temperature in Celsius at indicated time
#C3 Dew point temperature in Celsius at indicated time
#C4 Relative humidity in percent at indicated time
#C5 Atmospheric station pressure in Pa at indicated time
#C6 Extraterrestrial horizontal radiation in Wh/m2
#C7 Extraterrestrial direct normal radiation in Wh/m2
#C8 Horizontal infrared radiation intensity in Wh/m2
#C9 Global horizontal radiation in Wh/m2
#C10 Direct normal radiation in Wh/m2
#C11 Diffuse horizontal radiation in Wh/m2
#C12 Averaged global horizontal illuminance in lux during minutes preceding the indicated time
#C13 Direct normal illuminance in lux during minutes preceding the indicated time
#C14 Diffuse horizontal illuminance in lux  during minutes preceding the indicated time
#C15 Zenith luminance in Cd/m2 during minutes preceding the indicated time
#C16 Wind direction at indicated time. N=0, E=90, S=180, W=270
#C17 Wind speed in m/s at indicated time
#C18 Total sky cover at indicated time
#C19 Opaque sky cover at indicated time
#C20 Visibility in km at indicated time
#C21 Ceiling height in m
#C22 Present weather observation
#C23 Present weather codes
#C24 Precipitable water in mm
#C25 Aerosol optical depth
#C26 Snow depth in cm
#C27 Days since last snowfall
#C28 Albedo
#C29 Liquid precipitation depth in mm at indicated time
#C30 Liquid precipitation quantity
0.0 -1.1    -5.5    69  100905  0   1415    254 0   0   0   0   0   0   0   0   0.0 9   5   11.2    1500    9   999999999   0   0.1740  0   88  0.000   0.0 0.0 
7200.0  -1.1    -5.5    69  100905  0   1415    254 0   0   0   0   0   0   0   0   0.0 9   5   11.2    1500    9   999999999   0   0.1740  0   88  0.000   0.0 0.0 
10800.0 -1.9    -5.9    71  100905  0   1415    251 0   0   0   0   0   0   0   0   0.0 7   5   11.2    1500    9   999999999   0   0.1740  0   88  0.000   0.0 0.0 
(以下気象データが続く、省略)

なぜか1時間後のデータ(3600のデータ)がなかった。と思ったら7200から開始のようだ。たぶんアメリカはデータの開始が0時始まりで日本は1時始まりになっているせいだと思う。
System2で読み込むUSA_IL_Chicago-OHare.Intl.AP.725300_TMY3.mosも3600から開始でいずれにせよ0のときのデータは次のデータと同じ値になっているので0時点のデータは初期値として何かしらいれておくということだろうか。だとすると日本のデータは3600に0と同じようにデータをいれておいて計算を0ではなく3600から開始するようにせねばならないように思うのだが、値がないというのはいかがなものだろうか。 手動で調整する必要があるのかもしれない。

前回のMixingVolumeもそうだったが今回のReaderTMY3も全部理解するのは大変そうだった。ちゃんと読み込めばたいしたことないのかもしれないけれどまだ理解が追いついていない。とりあえずの気象データの使い方は分かった(気がする)ので次はvolのポートを増やしてファンで機械換気をしているところを見て行きたい。

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

概要

OpenModelicaでLBNLのBuildingsライブラリを使う。初心者なのでいろいろ教えていただけるとありがたい。 チュートリアル SpaceCoolingの続きをやる。
使用バージョン
-OpenModelica1.12.0 →たぶんModelica標準ライブラリ3.2.2
-Buildings 5.0.1

チュートリアル SpaceCoolingのSystem1の続き

f:id:kinonotofu:20180508225624p:plain

前回はチュートリアル SpaceCoolingのSystem1に配置されている4つのモデルのうち標準Modelicaライブラリを使っている3つ(theCon、TOut、preHea)のモデルについて見てみた。今回は残りのvolについて見てみる。BuildingsライブラリのMixingVolumeというモデルを使っている。
まずはSystem1.moの該当部分を抜粋で確認。

replaceable package MediumA = Buildings.Media.Air "Medium for 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)
(省略)
equation
  connect(theCon.port_b, vol.heatPort)
  connect(preHea.port, vol.heatPort) 

packageはクラスのまとまりみたいなものらしく、replaceableとかredeclareとかはよく分からないけれど、モデル内のpackageに別のpackageを入れるときの一連の手続きだと思う。volを使うときには中身が空気なのか水なのかなどを指定してやるということだろう。Buildings.Media.Air自体は900行くらいあるのでコードを見ることはしばらく後回しにする。
他のモデルとコネクトしているのはvol.heatPortだけであり、値を設定しているのはMediumとm_flow_nominalとVとenergyDynamicsmとSenFacで5つなのだが、実はMixingVolumeは設定できる部分が多く全ての項目を設定しているわけではない。 OMEdit上の設定画面はこんな感じである。 f:id:kinonotofu:20180524175456p:plain

タブが多い。
m_flow_nominalは流出はvol自体の計算には関係ないので空気の流入量のデフォルト値?だろう。流入空気の温度を設定しているわけでもなさそうなので、計算には使っていない気がするが、チュートリアルのドキュメントによると数値計算上の理由で適切なオーダーに設定する必要があるそうで、ここでは換気回数6回で設定している。
mSenFacは顕熱の熱容量のパラメータで3倍になっているらしい。体積Vの空気(MediumにBuildings.Media.Airを設定している)の3倍の熱容量ということだろうか。家具などを想定して空気よりも多い熱容量を見積もることは多い。 energyDynamicsは結局よくわからない。ここではFixedInitialだが他にDynamicFreeInitialとStedystateInitialとStedystateがある。熱収支式のタイプの選択かと思いきやチュートリアルのドキュメントによるとFixedInitialとした時はOMEdit上でInitializationタブで設定した初期値がvolの初期値になると書いてある。
Mediumはコードに直接書き込まないと設定できないようである。
ややこしいのでコードを読むよりLBNLのホームページへ行ってドキュメントを読んだほうが良い気がするが一応コードも見てみる。

↓Buildings.Fluid.MixingVolumes.MixingVolume

within Buildings.Fluid.MixingVolumes;
model MixingVolume
  "Mixing volume with inlet and outlet ports (flow reversal is allowed)"
  extends Buildings.Fluid.MixingVolumes.BaseClasses.PartialMixingVolume(
    final initialize_p = not Medium.singleState,
    steBal(final use_C_flow = use_C_flow),
    dynBal(final use_C_flow = use_C_flow));

  parameter Boolean use_C_flow = false
    "Set to true to enable input connector for trace substance"
    annotation(Evaluate=true, Dialog(tab="Advanced"));

  Modelica.Thermal.HeatTransfer.Interfaces.HeatPort_a heatPort(
    T(start=T_start)) "Heat port for heat exchange with the control volume"
    annotation (Placement(transformation(extent={{-110,-10},{-90,10}})));

  Modelica.Blocks.Interfaces.RealInput[Medium.nC] C_flow if use_C_flow
    "Trace substance mass flow rate added to the medium"
    annotation (Placement(transformation(extent={{-140,-80},{-100,-40}})));

equation
  connect(heaFloSen.port_a, heatPort)
    annotation (Line(points={{-90,0},{-96,0},{-100,0}}, color={191,0,0}));
  connect(C_flow, steBal.C_flow) annotation (Line(points={{-120,-60},{-80,-60},
          {12,-60},{12,6},{18,6}}, color={0,0,127}));
  connect(C_flow, dynBal.C_flow) annotation (Line(points={{-120,-60},{-52,-60},
          {52,-60},{52,6},{58,6}}, color={0,0,127}));
  annotation (省略);
end MixingVolume;

↓Modelica.Blocks.Interfaces.RealInput

connector RealInput = input Real "'input Real' as connector" annotation ();

はじめに"Mixing volume with inlet and outlet ports (flow reversal is allowed)"とあり逆流できるというのは熱流の向きとかではなくコネクタでのデータの受け渡しが双方向という意味だろうか。とりあえず一方通行のコネクタもあるのだろう。
あと、論理型の変数を使ってif文で変数宣言部分の制御をしていると思われる部分がよくわからない。 というか全体的によく分からないなぁという部分が多い。
MixingVolumesはかなり複雑でモデルを追っていくのが大変なので継承元の Buildings.Fluid.MixingVolumes.BaseClasses.PartialMixingVolume も Buildings.Fluid.Interfaces.LumpedVolumeDeclarations も全部見ることはしばらく後回しにする。

計算結果の確認

f:id:kinonotofu:20180530074432p:plain

volの温度の初期値はデフォルトでは20℃らしい。温度-10℃と熱コンダクタンス10000/30W/Kでつながっており、発熱1000Wともつながっている。温度が徐々に下がってだいたい-7℃で定常状態になっている。温度差3℃、熱コンダクタンス10000/30の熱流が1000Wでつなぎこんだ発熱と釣り合っているのでm_flow_nominalを設定しているものの予想通り換気による温度変化はここでは計算されていないと考えられる。
とりあえずvolについて今のところ分かったことは、Mediaで満たされたボリュームで熱容量を設定できる、換気量も設定できる(今回は計算していない。粉塵などの計算もある。)、温度と熱流を持つ点をつなぐことで非定常の温度変化を確認することができるということだろうか。volを満たしたMediaの温度変化分の熱量とコネクタでつながれた点の熱流の収支がバランスされるようになっていると言う理解でいいと思う。 次からSystem2に取り組んでいくけれど、けっこう分からないことが多いのでOMNotebookも少しずつ読んで勉強したほうがいいと感じた。