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

概要

OpenModelicaでLBNLのBuildingsライブラリを使う。初心者なのでいろいろ教えて頂けるとありがたい。
前回はThermalZones.Detailed.MixedAirの自然室温計算を見ていった。そのままMixedAirを使っていろいろやってもよかったのだけれど、MixedAirに組み込まれている伝熱現象を理解するためにも先にBuildings.HeatTransferのパッケージについて読んだほうがいい気がしたので少し脱線してこちらに取り組む。全体をざっと見た後に単層壁の非定常熱伝導の計算をする。

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

Buildings.HeatTransferの構成

基本的な伝熱はModelica標準ライブラリだとModelica.Thermal.HeatTransferを使うことになるが、建築で使う形としてモデルを整えているのがこのパッケージである。以下の様な構成になっており、伝導、対流、放射の伝熱の3要素やそれらが複合的に作用する窓のモデル、素材のデータのモデルなどがある。今回はこれらの全体像を見ていくことにする。ちなみに熱伝導のいくつかの部分や窓のモデルにOpenModelicaだと動かない物があるようだ。

名称 説明
UsersGuide ユーザーガイド
Conduction 熱伝導モデルのパッケージ
Convection 対流熱伝達のパッケージ
Radiosity 放射熱伝達のパッケージ
Sources 熱ソース
Windows 窓のモデルのためのパッケージ
Data 熱伝達モデルのためのデータ
Types 型定義のパッケージ
Examples モデルの使用方法とテストモデルを示すモデル群
Interfaces 熱伝達モデルのインターフェースのパッケージ

Buildings.HeatTransfer.Conductionの構成

nSupPCMという定数がConductionフォルダのpackage.moに書きこんである。この定数はPCM(phase change material)という使用温度帯で相変化をすることで見かけ上の熱容量を大きくした素材の熱伝導を計算するのに使用する。
SingleLayerは壁などの面の厚さ方向の一次元熱伝導計算を単一素材で計算するもので、MultiLayerはSingleLayerを複数並べたのもになっている。境界条件は表面のHeatPortで与えている。SingleLayerCylinderは配管の熱損失などに使うと思うのだが単一素材のモデルしかないので複数素材のときは自分で複数のモデルをつないでやる必要がある。
熱伝導のサンプルファイルはHeatTransfer全体のExampleのところにある。

名称 説明
MultiLayer 多層壁の熱伝導のためのモデル
SingleLayer 単層壁の熱伝導のためのモデル
SingleLayerCylinder 円筒の熱伝導
nSupPCM=6 u(T)の近似関係を設定する点数 PCMにのみ使用する
BaseClasses Buildings.HeatTransfer.Conductionのための部分クラス

Buildings.HeatTransfer.Convectionの構成

対流熱伝達は屋外側と室内側に分かれており、流体は空気のみなので液体の対流熱伝達率に使うとすれば固定値で入力することしかできない。室内側は面の向き毎(壁、床、天井)の温度差による関数で計算しており斜面の計算式はなく床でも天井でもなければすべて壁として同一の値になる。屋外側は室内側で使用した温度差の計算式による熱伝達に、風速と風向の関数による強制対流の熱伝達を加えたものになっている。境界条件は固体側と流体側それぞれ表面のHeatPortで与えている。

名称 説明
Exterior 屋外側の対流熱伝達モデル
Interior 室内側の対流熱伝達モデル
Functions 対流熱伝達のための関数
Examples モデルの使用方法とテストモデルを示すモデル群
BaseClasses Buildings.HeatTransfer.Convectionのための部分クラス

サンプルファイルは以下の二つである。

名称 説明
Exterior 屋外側対流熱伝達のテストモデル
Interior 室内側対流熱伝達のテストモデル

Buildings.HeatTransfer.Radiosityの構成

熱放射は放射する物質の温度によって波長が異なってくるが、建築の分野では主に短波(日射)と長波(赤外線、身の回りの物質の放射や夜間放射)に分けて計算する。単純に放射熱伝達と言うと長波のことを指すことが多いが、ここでのモデルも長波のためのモデルを取り扱っている。計算式は基本的に窓の計算のためのモデルTARCOG 2006によるが、OutdoorRadiosityは不透明壁体にも使えるように変更があるらしい。
放射は正の値のみをとるコネクタとして放出Buildings.HeatTransfer.Interfaces.RadiosityOutflowと吸収Buildings.HeatTransfer.Interfaces.RadiosityInflowがそれぞれあり、その差が放射熱伝達量となりHeatPortの熱流として得ることができる。線形近似による計算もできるようなのだが、Heatportが一つしかなく相手側の温度はParameterで与えているため使いどころがちょっとわからない計算になっている。
IndoorRadiosityは放射率1で反射なし、OpaqueSurfaceは反射あり。OutdoorRadiosityは天空温度と外気温度(地表面温度)と天空形態係数から室外側の放射計算をしている。RadiositySplitterは一つの放射のコネクタを割合を指定して2つに分割している。形態係数を使って放射を割り振るにはもう少し機能が欲しいところではないかと思う。

名称 説明
Constant 定常放射熱流束
IndoorRadiosity 室内側熱放射のモデル
OpaqueSurface 不透明表面のモデル
OutdoorRadiosity 窓に到達する屋外側熱放射のモデル
RadiositySplitter 入力信号により入射した放射を二つに分割するモデル
Examples モデルの使用方法とテストモデルを示すモデル群
BaseClasses Buildings.HeatTransfer.Radiosityのための部分クラス

Constantは定数ではなくConstantという名前のBlockであり放射熱流束のコネクタに固定値を与えている。計算上はModelica.Blocks.Sources.Constantとほぼ変わらないのだが、用途が明確になる。

block Constant
  parameter Real k(min=0, start=0)
  extends Modelica.Blocks.Icons.Block;
  Interfaces.RadiosityOutflow JOut;
equation 
  JOut = k;
end Constant;

例は以下の二つである。

名称 説明
OpaqueSurface 不透明表面の室内側のソースのテストモデル
OutdoorRadiosity 屋外側の放射のテストモデル

Buildings.HeatTransfer.Interfacesの構成

Interfacesは放射のものしかなくシンプルなのでここで説明しておく。最低値が0の熱流量のみのコネクタでISO 1の標準基準温度(293.15K、20℃)のときの放射量がデフォルト値となっている。
定義は以下の通り。

名称 説明
RadiosityInflow 放射熱流束の放出側のコネクタ
RadiosityOutflow 放射熱流束の吸収側のコネクタ
connector RadiosityInflow = input Real(min=0, final unit="W", nominal=419)
connector RadiosityOutflow = output Real(min=0, final unit="W", nominal=419)

Buildings.HeatTransfer.Sourcesの構成

Modelica.Thermal.HeatTransfer.Sources.FixedHeatFlowなどをシンプルにしたもの。Prescribedがつくと他のモデルから値をもらってくるのも同じである。FixedHeatFlow0による除算の可能性をなくすためにパラメータのalphaとT_refをなくしているらしいがFixedTemperatureは同じものである。

名称 説明
FixedHeatFlow 固定熱流束境界条件
FixedTemperature 絶対温度[K]での固定温度境界条件
PrescribedHeatFlow 熱流束を入力する境界条件
PrescribedTemperature 絶対温度[K]を入力する境界条件

Buildings.HeatTransfer.Windowsの構成

窓の計算はけっこう複雑である。今回は何があるかを見るだけにして後でもう少し細かく見ていきたい。
BeamDepthInRoomは任意の高さの平面上で日射が窓からどこまで差し込むかを計算する。窓には庇もつけられ、太陽位置は気象データを読み込むようである。ExteriorHeatTransferは外ブラインド等の日射遮蔽物付きの窓の対流と放射の熱伝達のモデルである。屋外側用のモデルなので天空放射や風による対流熱伝達の上昇も見込んでいる。InteriorHeatTransferConvectiveは内ブラインド等の日射遮蔽物付きの窓の対流と放射の熱伝達のモデルで室内側のモデルなので屋外側よりは少しシンプルになっているが少し複雑な印象をうける。FixedShadeは庇と袖壁があったときの窓面日射量と日射面積の割合を出力するモデルで窓のデータのレコードを入力する必要がある。OverhangとSideFinsはそれぞれ庇と袖壁の独立したモデルである。Windowがいわゆる窓の計算のモデルでWindowというソフトのバージョン5時点で同じ計算法(TARCOG 2006 )で実装したらしい。その他BaseClassesにPartialでない普通のmodelやらblockやらがたっぷりある。

名称 説明
BeamDepthInRoom 室内での直達日射の深さ
ExteriorHeatTransfer (日射遮蔽物のある)窓の屋外側表面の対流熱伝達と放射熱伝達のモデル
FixedShade 庇や袖壁による日影のモデル
InteriorHeatTransferConvective (日射遮蔽物のある)窓の室内側表面の対流熱伝達のモデル
Overhang 庇のある窓のモデル
SideFins 袖壁のある窓のモデル
Window 窓のモデル。
Functions 窓の放射モデルに使用する関数
Examples モデルの使用方法とテストモデルを示すモデル群
BaseClasses Buildings.HeatTransfer.Windowsのための部分クラス

窓のサンプルモデルは以下のとおり。BeamDepthInRoomやBoundaryHeatTransferは計算はできており、OverhangやSideFinsはエラーをだしながらも一応計算している。ただしその他の窓の物性値を使ったモデルの計算がうまくいかなさそうである。

名称 説明
BeamDepthInRoom 室内での直達日射の深さのテストモデル
BoundaryHeatTransfer 窓の境界条件の熱伝達のテストモデル
ElectrochromicWindow 電気で透明度が変わる窓
FixedShade 固定日影のテストモデル
Overhang 窓の庇のテストモデル
SideFins 窓の袖壁の使用法
Window 窓のテストモデル

Windowのエラー
f:id:kinonotofu:20181111203906p:plain

Buildings.HeatTransfer.Dataの構成

壁体などに使う素材の物性値をまとめたrecord(変数のセット)用のパッケージである。
ある程度の素材や素材の組み合わせはデフォルトで作られているが、それぞれGenericというrecordに値を入れて好きな素材の物性値を使うことができる。GasesのAirはMediaのAirとは違いGlazingSystemsの窓の中空層で使われている。中空層のAirがよくエラーを吐いているような気がするのだがたぶん直すのはWindowの方だろう。

名称 説明
BaseClasses 部分クラス
BoreholeFillings 掘削穴の充填材
Gases 窓の充填ガスの熱物性
Glasses 窓のガラスの熱物性
GlazingSystems 窓の熱物性
OpaqueConstructions 床や壁などの不透明材の構成
OpaqueSurfaces 不透明材の表面の熱物性
Resistances 熱抵抗
Shades 日射遮蔽物(ブラインドなど)の熱物性
Soil 熱コンダクタンス、密度、比熱容量により記述された土壌
Solids 熱コンダクタンス、密度、比熱容量により記述された固体
SolidsPCM 熱コンダクタンス、密度、比熱容量により記述された固体(PCM)

Buildings.HeatTransfer.Typesの構成

3つの列挙型が定義されている。

名称 説明
ExteriorConvection 屋外側表面の対流熱伝達モデルを定義する列挙型
InteriorConvection 室内側表面の対流熱伝達モデルを定義する列挙型
SurfaceRoughness 表面の粗度を定義する列挙型
  type ExteriorConvection = enumeration(
    Fixed   "Fixed coefficient (a user-specified parameter is used)",
    TemperatureWind   "Wind speed and temperature dependent")

  type InteriorConvection = enumeration(
    Fixed   "Fixed coefficient (a user-specified parameter is used)",
    Temperature   "Temperature dependent")

  type SurfaceRoughness = enumeration(
    VeryRough   "Very rough",
    Rough   "Rough",
    Medium   "Medium rough",
    MediumSmooth   "Medium smooth",
    Smooth   "Smooth",
    VerySmooth   "Very smooth") ;

Buildings.HeatTransfer.Examplesの構成

熱伝導の例ばかりで対流や放射や窓はそれぞれ独立に例を持っているので、Conductionに入れてしまえばいいような気がする。ConductorSingleLayerPCMは変換ができず、ConductorSteadyStateTransientとConductorStepResponseは計算開始直後にエラーを吐いて終了してしまう。

名称 説明
ConductorInitialization 熱伝導の初期化のテストモデル
ConductorMultiLayer 多層壁の熱伝導のテストモデル
ConductorMultiLayer2 表面の層aに条件を与えた多層壁熱伝導のテストモデル
ConductorMultiLayer3 表面の層aとbに条件を与えた多層壁熱伝導のテストモデル
ConductorSingleLayer 単層壁の熱伝導のテストモデル
ConductorSingleLayer2 表面の層に条件を与えない単層壁熱伝導のテストモデル
ConductorSingleLayerCylinder 円筒の熱伝導のテストモデル
ConductorSingleLayerPCM PCMの熱伝導のテストモデル
ConductorSteadyStateTransient 定常条件での過渡応答の熱伝導のテストモデル
ConductorStepResponse ステップ応答の熱伝導のテストモデル

ConductorSingleLayerPCMのエラー
f:id:kinonotofu:20181111201335p:plain

ConductorSteadyStateTransientやConductorStepResponseのエラー
f:id:kinonotofu:20181111201211p:plain

ここでDebug moreを押すと以下のような画面が表示される。使い方がよくわからないがうまく使えばもう少しデバッグがやりやすくなるかもしれない。ただし変換ができないものには使えなさそうである。
f:id:kinonotofu:20181111202914p:plain

PCMの単層壁の計算

なにがあるかをなんとなく見ていっただけになるのも何なので単層壁の熱伝導の計算を確認してみる。PCMの熱伝導の計算はサンプルファイルではエラーがでていたが、PCM自体は普通に計算できるようなので使ってみる。
PCM20というデフォルトで用意されている素材を厚さ0.1m、初期温度30℃として片側を30℃、もう片側を対流熱伝達(壁の温度差で計算)をはさんで0℃として計算した。モデルは以下のようになる。上のほうにあるのがPCMのrecordである。
f:id:kinonotofu:20181111195204p:plain

PCMの設定は以下のとおり。厚さ以外は特にいじっていない。
f:id:kinonotofu:20181111195111p:plain
f:id:kinonotofu:20181111195132p:plain

計算結果は以下の通り。壁体はSinglelayerで素材が一つでも計算は3層に分かれて計算されており、0℃に近い側の層が層変化の温度体(23℃~27℃)で緩やかな温度変化になっている。真ん中の層も27℃になると温度変化がゆるやかになっている。
f:id:kinonotofu:20181111195704p:plain

おわりに

今回はHeatTransferの全体像を見ていき、単層壁の伝熱計算を確認した。
このあたりのモデルは別に建築に限らず使ってもよい気もするけれど建築独特の計算法とか結構あるのだろうか。建築の中でも計算のモデル細かさが違ってきたりするのでなんともいえない部分はあるとは思うがどうだろう。デバッグに関してはMixedAirがOpenModelicaで動かないのは今回の熱伝導のいくつかのサンプルや窓のモデルが動いていないのが原因だと思うのでもう少し細かく見ながらあれこれいじれたらと思う。

今度のModelica勉強会でブログでやったことを少しまとめて発表しようと思います。ブログを書き始めて半年経つそうなのでそろそろ振り返って手を加えたりもしたいしよい機会になればよいかなぁと。ブログでとりあえずライブラリを探検していって勉強会でしっかりまとめるとかでもいいかもしれない。

次回は熱伝導のモデルをもう少し詳しく確認しようと思う。一つの素材の中に状態定義点が複数あるときに表面で定義するかどうかでどういう扱いになっているかとか。あとサンプルでなぜエラーを吐いているかも確認したい。エラーを吐いているのはモデルが多めなので一度減らして少しずつ動作の確認をすればなんとかなるはずだと思いたい。