OpenModelicaでBuildingsライブラリで換気回路網計算を学ぶ_その1

概要

OpenModelicaでLBNLのBuildingsライブラリを使う。初心者なのでいろいろ教えて頂けるとありがたい。
今回はBuildings.Airflow.Multizoneパッケージを見ていく。Buildings.Airflowパッケージでは異なる部屋間や部屋と外部環境との間の空気の流れを計算するためのモデルがあるのだが、直下にはMultizoneパッケージのみがぶら下がっていてそこに各要素のモデルがある。ダクトのネットワークはBuildings.Fluidを見ろと書いてあるのだが多分FixedResistancesとかMoversあたりを使うのだと思う。
このパッケージでできる換気回路網計算はCFDとは異なり、空間をそれぞれ1つの点で表現し、空間同士を開口による流れの抵抗のネットワークとしてつないでいくものだ。年間の自然換気量の変化の影響を見たいときなどCFDで非定常計算をするのはあまり実用的ではないのでこちらを使ったりする。定常計算でもこちらの方がざっくり設定できるし1ケースの計算時間もたぶん早いので都合がよいことも多い。

使用バージョン
-OpenModelica1.12.0 →Modelica標準ライブラリ3.2.2
-Buildings 5.1.0

Buildings.Airflow.Multizoneの構成

名称 説明
UsersGuide ユーザーガイド
DoorDiscretizedOpen 高さに沿って離散化したドアモデル
DoorDiscretizedOperable 高さに沿って離散化したドアモデル
EffectiveAirLeakageArea 有効漏気面のモデル
MediumColumn 摩擦がなく熱と質量の蓄積がない垂直軸のモデル
MediumColumnDynamic 摩擦はないが熱と質量の蓄積がある垂直軸のモデル
Orifice オリフィス(単純開口)のモデル
ZonalFlow_ACS 1秒あたりの換気量の入力によるゾーン流のモデル
ZonalFlow_m_flow 1秒あたりの換気量の入力によるゾーン流のモデル
Types 型の定義のパッケージ
Examples モデルの使用法やテストモデルなどのパッケージ
Validation バリデーション用のモデルのパッケージ
BaseClasses Buildings.Airflow.Multizoneの基底クラスのパッケージ

ユーザーガイドと型定義やサンプルや検証や基底クラスなどのパッケージがあるが実際に使用するモデルは8個である。正直ユーザーガイドには大したことは書いていないのでExamplesを見ながらなんとなく組み上げていくのだと思う。
Typesパッケージで定義されているものは1つだけでdensitySelectionというMediumColumnモデルの密度の設定パラメータとなる列挙型の変数があるのみである。

type densitySelection = enumeration(
  fromTop   "Density from top port",
  fromBottom   "Density from bottom port",
  actual   "Actual density based on flow direction")
  "Enumeration to select density in medium column";

Examplesパッケージは結構たくさん例がある。

名称 説明
CO2TransportStep 浮力駆動によるCO2輸送モデル
ChimneyShaftNoVolume シャフトの定常状態モデルでの煙突効果を示すモデル
himneyShaftWithVolume シャフトの動的モデルによる煙突効果を示すモデル
ClosedDoors 3つの閉じたドアのモデル
NaturalVentilation 密度差による流れの逆転のテストモデル
OneEffectiveAirLeakageArea 有効漏気面を持つモデル
OneOpenDoor 1つの開いたドアと1つの閉じたドアのモデル
OneRoom マルチゾーン空気交換モデルの検証のための1つの室のモデル
Orifice オリフィスのモデル
ReverseBuoyancy 4つの室と逆流する浮力駆動型空気循環モデル
ReverseBuoyancy3Zones 3つの室と逆流する浮力駆動の空気循環モデル
ZonalFlow 2つの室で所定の空気交換を行うモデル

ValidationパッケージはThreeRoomsContamモデル一つだけである。Michael WetterのMultizone Airflow Model in Modelicaに詳細な内容が書いてあるようだ。

Buildings.Airflow.Multizone.Examples.OneRoom

とりあえずサンプルとして一室モデルを見ていく。
f:id:kinonotofu:20180807233745p:plain
室volEasと外気volOutを、上下の開口部oriOutTopとoriOutBotでつないで温度差換気を行っているモデルである。室と開口部の間はcolEasInTop、colEasInBot、colOutTop、colOutBotという高さ方向の距離を示すモデルでつないでいる。

  connect(colEasInTop.port_a, oriOutTop.port_a);
  connect(colEasInTop.port_b, volEas.ports[1]);
  connect(colEasInBot.port_a, volEas.ports[2]);
  connect(colEasInBot.port_b, oriOutBot.port_a);
  connect(oriOutBot.port_b, colOutBot.port_b);
  connect(colOutBot.port_a, volOut.ports[1]);
  connect(colOutTop.port_b, volOut.ports[2]);
  connect(colOutTop.port_a, oriOutTop.port_b);

空気の流れの計算なので媒体としてBuildings.Media.Airを使用している。

  package Medium = Buildings.Media.Air;

空間のモデルの設定

室volEasの設定はSpaceCoolingで見たときと比べて、熱容量の係数を使っていない(家具などの熱容量を考慮しない)、massDynamics=Modelica.Fluid.Types.Dynamics.SteadyStateInitialを指定する、m_flow_nominal=0.001が0に近い小さな値になっているなどの違いがある。
以下に設定を示す。

  Buildings.Fluid.MixingVolumes.MixingVolume volEas(
    redeclare package Medium = Medium,
    energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial,
    T_start=273.15+20,
    V=2.5*5*5,
    nPorts=2,
    m_flow_nominal=0.001,
    massDynamics=Modelica.Fluid.Types.Dynamics.SteadyStateInitial);

外気volOutはモデルとしては室と同じものを使用している。
体積を非常に大きくとっているのは室との換気で温度が変動しないようにするためだろうか。また、外気側では圧力を指定している。外気を圧力の基準とするような意味合いだと思うがMedium.p_defaultで大気圧を与えている。こちらのmassDynamicsはFixedInitialになっている。これで圧力固定になるのだろうか。

  Buildings.Fluid.MixingVolumes.MixingVolume volOut(
    redeclare package Medium = Medium,
    energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial,
    T_start=273.15 + 10,
    V=1E12,
    p_start=Medium.p_default,
    nPorts=2,
    m_flow_nominal=0.001,
    massDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial);

開口部のモデルの設定

上下の開口部oriOutTopとoriOutBotをまとめて示す。

  Buildings.Airflow.Multizone.Orifice oriOutTop(
    redeclare package Medium = Medium,
    A=0.01,
    m=0.5);
  Buildings.Airflow.Multizone.Orifice oriOutBot(
    redeclare package Medium = Medium,
    A=0.01,
    m=0.5);

OMEdit上の設定画面は以下のとおり。
f:id:kinonotofu:20180807234101p:plain
オリフィスの流量係数は0.65がデフォルトになっており今回はデフォルト値をつかっている。ForceErrorControlOnFlowAはよくわからないが流量を見たいときはtrueにしておくらしい。Aが開口面積、mは0.5が乱流時で1が層流時を示すらしい。useDefaultPropertiesはfalseにすると実際の密度と粘性係数を使用し、trueだとデフォルト値を使用するようになっている。dp_turbulentは層流と乱流が一致するときの差圧?だが0.1を推奨しているらしい。lWetはレイノルズ数の計算に使用するパラメーターなので水力直径だろう。密度の扱いは計算の安定性に関わるので設定があるのはわかるけれど、粘性係数は気にしたことがなかった。乱流層流の切替も気にしたことがなかったけど確かに流量が変わりそうな気はする。 
以下の残りの2つのタブは流れに関係する設定でよくあるやつだった。
f:id:kinonotofu:20180807234116p:plain
f:id:kinonotofu:20180807234126p:plain

高さ方向の距離を示すモデルの設定

Buildings.Airflow.Multizone.MediumColumnは開口部の高さ位置を指定するためのモデルなのだと思う。浮力換気のための高低差による圧力の変動を計算しているのだと思う。設定を以下に示す。

  Buildings.Airflow.Multizone.MediumColumn colOutTop(
    redeclare package Medium = Medium,
    h=1.5,
    densitySelection=Buildings.Airflow.Multizone.Types.densitySelection.fromBottom);
  Buildings.Airflow.Multizone.MediumColumn colOutBot(
    redeclare package Medium = Medium,
    h=1.5,
    densitySelection=Buildings.Airflow.Multizone.Types.densitySelection.fromTop);
  Buildings.Airflow.Multizone.MediumColumn colEasInTop(
    redeclare package Medium = Medium,
    h=1.5,
    densitySelection=Buildings.Airflow.Multizone.Types.densitySelection.fromBottom);
  Buildings.Airflow.Multizone.MediumColumn colEasInBot(
    redeclare package Medium = Medium,
    h=1.5,
    densitySelection=Buildings.Airflow.Multizone.Types.densitySelection.fromTop);

OMEdit上の設定画面は以下のとおり。
f:id:kinonotofu:20180808000457p:plain
f:id:kinonotofu:20180808000649p:plain
hが高さ方向の距離を示し、Topにつないだほうが上、Bottomにつないだほうが下という位置関係になるようだ。ここでの室の圧力の基準位置がどこだかわからないが、基準位置を床にして上に0.5と3.5などのように床面と開口面高さ方向中央位置で指定したほうがよさそうな気がする。このあたりは自分で整合性をとっておけばたぶん問題はないとは思う。
densitySelectionではモデルのどちら側の密度を使用するかを指定している。TopとBottomの間にはρghだけ圧力差があるのだが、このときのρをどちら側からとってくるかを選んでいるのだろう。actualという選択肢もあるのでそのときは風上側の密度を使用するのだと思う。

計算実行

温度差換気(浮力駆動の換気)で気にすることはだいたい以下のとおり。
* 外気はどの高さでも同じ温度、室内もどの高さでも同じ温度(完全混合の仮定)
* 温度(=室)によって密度ρが変わる。
* 高さにより「密度ρ × 重力加速度g × 高さh」だけ圧力が変わる。
* 温度(=密度)が異なる二つの空間の間の圧力差は高さによって変わる。
* 圧力差によって流れが発生。「開口面の高さでの圧力差により流れを計算」するので同じ室の間でも開口部ごとに流れの方向がかわることができる。

計算結果は以下の通り。とりあえず1秒だけ計算している。
f:id:kinonotofu:20180808002843p:plain
自分で計算をしてみると0.0065[m3/s]だったのでだいたいよさそうである。
1時間分計算してみると室温が下がっている様子がわかる。
f:id:kinonotofu:20180808003437p:plain
圧力は以下のとおり。外気の圧力が一定なのが確認できた。室の圧力が外気を上回ったり下回ったり変動しているように見えるがレンジの設定が細か過ぎるだけでほぼ外気と同じ圧力となっている。ちなみにcsvでデータ出力すると1.01325[bar]で一定値となってでてくる。桁落ちされるのは困るのでどうにかしたいが大気圧との差分をどこかで計算すれば場当たり的には対処できそうな気はする。しかしなんでグラフ上で見える値をそのまま書き出せないのだろう。ちなみに単位が[bar]なのは[Pa]に直すのを忘れていただけでグラフ上もcsvも[Pa]にできる。

f:id:kinonotofu:20180808011533p:plain

おわりに

なんとなく雰囲気は分かったような気がするけれど、まだあまり仕組みはよく分かっていない。Fluidportをつないであげれば開口部では圧力から流量と計算し、室のほうで流量の収支をとるように圧力を補正してくれているのだろうか。開口への風圧の与え方もわからないのだけれど、別のFluidポートをつなぎこんで圧力だけあたえるとかはできなさそうな気がするのでMediumColumnに手を加えて風圧力を組み込むしかないのかもしれない。あと一応ちゃんと論文を読んだほうがよさそうである。