Translate

2018/03/29

TRNSYSの計算結果をPlotlyでグラフにしたら見やすかった件

前回Python,Pandasで読み込んだ計算結果をグラフにしてみました。

グラフを描くのに使ったパッケージはPlotly。簡単なコーディングで図のような動くチャートが簡単に描けます。

TRNSYS-Plotly

表示範囲を変えたり、チャートの表示、非表示の切り換えなど、値の描画だけじゃなく動かせるグラフが出来上がります。グラフはブラウザ上に表示されますが、1年分の室温、冷房負荷、暖房負荷のデータを使っているのに驚くほど動作が軽い!

グラフの描画処理

コーディング例は以下の通り。

#utf-8
import pandas as pd
import plotly 

# read the csv file and remove an unnecessary row
csv_filename = 'type25a.txt'
csv = pd.read_csv(csv_filename, delim_whitespace=True)
df = csv.drop(0)        # remove the first row
timestep = 1.0          # timestep
step=str(timestep)+'H'
dt = pd.date_range('1995-01-01 0:00',periods=8761,freq=step) # series for datetime column. 
df['DateTime']=dt

#plotly
# plotly.offline.init_notebook_mode(connected=False)
data = [
    # plotly.graph_objs.Bar(x=raw['TIME'], y=raw['TAIR_first_floor'])
    plotly.graph_objs.Scatter(x=df['DateTime'], y=df['TAIR_first_floor'], name='室温'),
    plotly.graph_objs.Scatter(x=df['DateTime'], y=df['QHEAT_first_floor'], name='暖房負荷', yaxis="y2"),
    plotly.graph_objs.Scatter(x=df['DateTime'], y=df['QCOOL_first_floor'], name='冷房負荷', yaxis="y2")
    
]

layout = plotly.graph_objs.Layout(
    title="年間暖冷房負荷",
    legend={"x":0.9, "y":0.9},
    xaxis={"title":"日付時刻"},
    yaxis={"title":"室温[C]"},
    yaxis2={"title":"暖冷房負荷[kJ/h]", 
        "overlaying":"y", 
        "side":"right",
        "exponentformat":"none",    # prevent 'k' notation
        "separatethousands":True},  # add a comma as a thousand separator
)
fig = plotly.graph_objs.Figure(data=data, layout=layout)
#plotly.offline.iplot(fig)
plotly.offline.plot(fig)

ソースコードの前半は単にCSVの読み込み展開処理です。(前回のソースコードとほぼ同じ)

グラフの描画は後半の15行ほど。これだけで見た目も整った動くグラフが出来上がります。シミュレーションでは何度も何度も解析を繰り返してグラフを描く事があります。これが割と面倒な作業なのですが、ちょっとしたスクリプトで描けるとストレス減りそうです。

動作環境

以下の環境で動作を確認しています。
Windows10 Pro(64bit)
Python:Anaconda 5.1(Python 3.6/64bit)
TRNSYS18.00.0017(64bit)

TRNSYSの出力をPythonで取り扱う

TRNSYSの計算結果の出力の仕方はいくつかあります。Type65やType25がよく使われますが、ファイル形式としてはタブ、ペース区切りのテキストで書き出されます。

以下はType25の出力例ですが、あまり読みやすいとは言えないですよね。

TIME                        TAIR_first_floor            TOP_first_floor             QHEAT_first_floor           QCOOL_first_floor           QELEQUIP_first_floor        QELLIGHT_first_floor        RELHUM_first_floor          
 HOURS                  NAV                     NAV                     NAV                     NAV                     NAV                     NAV                     NAV                     
  +0.0000000000000000E+00     +2.0000000000000000E+01     +2.0000000000000000E+01     +0.0000000000000000E+00     +0.0000000000000000E+00     +0.0000000000000000E+00     +0.0000000000000000E+00     +5.0000000000000000E+01   
  +1.0000000000000000E+00     +1.9830580301500703E+01     +1.9808233467796263E+01     +0.0000000000000000E+00     +0.0000000000000000E+00     +9.6768000000000015E+01     +0.0000000000000000E+00     +5.0010156123633521E+01   
  +2.0000000000000000E+00     +1.9734312966979235E+01     +1.9765312092721750E+01     +0.0000000000000000E+00     +0.0000000000000000E+00     +9.6768000000000015E+01     +0.0000000000000000E+00     +4.9484453863858377E+01   
  +3.0000000000000000E+00     +1.9771681072855184E+01     +1.9775732049503631E+01     +0.0000000000000000E+00     +0.0000000000000000E+00     +9.6768000000000015E+01     +0.0000000000000000E+00     +4.8758186593351304E+01   
  +4.0000000000000000E+00     +1.9727156805112390E+01     +1.9738355860938952E+01     +0.0000000000000000E+00     +0.0000000000000000E+00     +9.6768000000000015E+01     +0.0000000000000000E+00     +4.8300004863545269E+01   
  +5.0000000000000000E+00     +1.9696067740399105E+01     +1.9704197754226797E+01     +0.0000000000000000E+00     +0.0000000000000000E+00     +9.6768000000000015E+01     +0.0000000000000000E+00     +4.7823173447143830E+01   
  +6.0000000000000000E+00     +1.9649950794393828E+01     +1.9658051948204182E+01     +0.0000000000000000E+00     +0.0000000000000000E+00     +9.6768000000000015E+01     +0.0000000000000000E+00     +4.7411311457958369E+01   
  +7.0000000000000000E+00     +1.9598627168756757E+01     +1.9606091282868359E+01     +0.0000000000000000E+00     +0.0000000000000000E+00     +9.6768000000000015E+01     +0.0000000000000000E+00     +4.7033436866017283E+01   

これを通常はExcelなどへ読み込んで普通の10進表記やチャートに加工して結果を検討します。(ちょっと手間が掛かります)

Pythonで加工する

計算結果をもう少し手軽に加工できないか考えてみました。PythonにはCSVを扱う便利なパッケージが用意されていますので、今回はその中からPandasを使ってDataFrameへ展開してみます。

#utf-8
import pandas as pd

# read the csv file and remove an unnecessary row.
csv_filename = 'type25a.txt'
csv = pd.read_csv(csv_filename, delim_whitespace=True)
df = csv.drop(0)   # remove the first row.
timestep = 1.0
step=str(timestep)+'H'
dt = pd.date_range('1995-01-01 0:00',periods=8761,freq=step) # series for datetime column. 
df['datetime']=dt
print(df)

ほんの数行でCSVのデータからDataFrameへ変換できます。ここでポイントは2箇所有ります。


空白、タブ区切りの指定

まず、最初は区切り文字の指定。Type25の出力は空白、タブで区切られています。何も指定せずに読み込むと、タブなどがデータとして誤って解釈されます(NaNとして扱われる)
以下のようにdelim_whitespaceを使って空白、タブ区切りを指定します。

csv = pd.read_csv(csv_filename, delim_whitespace=True)


不要な行の削除

2つめは2行目の削除です。テキストの1行目はカラムの名前、2行目には単位が書き出されています。この2行目の部分は値としては不要なので、読み込み後に削除しておきます。

下の図の赤枠部分。ここはカラム名でもデータでもないので削除しておきます。

image

やり方としては、下のコードのようにDataFrameの最初の行を削除すればOKです。

df = csv.drop(0)


以上でDataFrameへ展開、不要なデータの削除ができました。あとは、DataFrameの機能を使って必要に応じて加工することができます。

上記のサンプルでは日付時刻のカラムを追加しています。やはり通し時間(Hour)よりも日付時刻の方が分かり易いですよね。

Jupyterの実行例

image


動作環境

以下の環境で動作を確認しています。
Windows10 Pro(64bit)
Python:Anaconda 5.1(Python 3.6/64bit)
TRNSYS18.00.0017(64bit)

2018/03/16

昼光照明基準の講習会へ

昼光照明基準の講習会へ参加してきました。

日本建築学会環境基準 昼光照明規準 (AIJES-L0003-2018)

TRNSYS18から照明の計算では定番のRadianceの機能が取り入れられています。室内の照度に応じた室内発生熱のOn/Offの制御ができるようになりました。例えば、昼光で十分な照度が確保できていれば照明から負荷をOffに、曇天で照度が確保できなければ照明負荷をOnにして計算することができます。(とはいえ、本格的な照度の計算の検討は別途行った方が良いです。あくまで熱の計算の一環で照度を扱います)

とはいえ照明関係は分からないことだらけなので、情報収集のための参加です。

image

で、講習はというと。。。

3セッションの構成でしたが、講師陣の要点を押さえた説明はすごく分かり易かったです。(こちらの知識が追いつかないので内容についていけていないのは内緒。てへ)

細かい話ですが、テキストの英訳付きの用語集は非常にありがたいです。TRNSYSの資料ってすべて英語&専門用語なので、読み下すときに参考になりそうです。

image

2018/03/13

TRNSYSで内断熱と外断熱は計算できる?

受託でTRNSYSの計算を行うことがあります。割と多いのが断熱性能の検討の案件です。断熱性の種類や、厚みなど。また、これに加えて蓄熱性能の考慮が含まれることが多々あります。どこに蓄熱部位を設けたら効果があるか、もしくは無いかといった検討を行います。典型的なのが内断熱外断熱の比較です。

ところで、外断熱ってなんでしょうか?

外断熱(そとだんねつ、英: External wall insulation)は、建物の断熱層の位置もしくはその工法を指す。主にコンクリート構造物など熱容量の大きい建物の外側に、断熱層を設け、建物を外気から断熱して、建物の蓄熱(または冷却した状態)を逃がさないようにする方式。逆に、外周の鉄筋コンクリート躯体の内側で断熱する工法は、内断熱という。 
Wikipedia:外断熱より引用

単純な話、断熱材が躯体の外側なのか内側に位置するかの違いです。初めて外断熱って聞いた時は何が良いのかぴんと来なかったんですが、ポイントは蓄熱です。Wikipediaの説明にあるように、RC造のような熱容量の大きな躯体では蓄熱、蓄冷効果が得やすくなります。

TRNSYSで内断熱と外断熱を扱う

計算用の建物モデルの躯体はConstruction Typeで定義しますが、内断熱と外断熱の違いはLayerの並び順として扱う事ができます。

下の図はTRNBuildのConstruction Typeの設定画面です。この画面をよく見るとLayerの項目にfront/inside, backの表示があります。

image

このfront/inside, backの順で、Layerの並びが建物モデルの壁に適用されます。

image

基本的には室内から室外へ向かう並び順として扱われます。平面、立面にすると、図の矢印の向きで扱われます。


image


この並び順を内断熱、外断熱の材料構成に合わせた Construction Typeを定義することで計算を行うことができます。

計算してみると

下の図はまったく同じ材料の構成でFront/Backの並び順を逆順にして計算した室温の結果です。

image

東京、5/1から5日間の自然室温

同じ材料の構成でも断熱材と駆体の位置が入れ替わると室温の振る舞いが全く違ってくる事が分かります。くどいようですが材料の並び順変えただけですよ、これ。

断熱性能

この例では材料を並び替えただけなので、断熱性能で見るとまったく同じになります。下の図はConstruction Typeの設定画面ですが、並び順が変わってもU値は全く同じになっています。

image image
外断熱(右)と内断熱(左)のConstruction Type

断熱性能が同じでも蓄熱の取り方で建物の振る舞いとしては大きく変わります。面白いですよね。

一般的に木造では蓄熱部位が少なくなりますが、壁や床に熱容量の大きな材料を使う事で蓄熱効果を得る事ができます。蓄熱がうまく働くか、逆にわるく働くか、シミュレーションを繰り返す事で検討する事ができます。

動作環境

以下の環境で動作を確認しています。
Windows10 Pro(64bit)
TRNSYS18.00.0017(64bit)

2018/03/07

タマネギとピンポン(TRNSYS-USERSより)

[TRNSYS-users] Excel iteration vs TRNSYS iteration

http://lists.onebuilding.org/pipermail/trnsys-users-onebuilding.org/2018-March/029931.html

TRNSYS-USERSには、いろんな質問が流れています。今回はコンポーネントの呼び出しタイミングに関する話題を拾ってみました。


ざっくり言うと

TRNSYSからExcelを呼び出す場合、呼び出されるタイミングはイテレーションごとなのか収束後なのかという質問。

イテレーションごとに繰り返し呼びされる状態をタマネギ(Onion)、収束のタイミングで規則的に相互にやり取りされる状態をピンポンに例えています。


タマネギの断面のイラスト

剥いて剥いて無くなる(収束?)するまで繰り返す様でしょうか?

バスピンのイラスト

お互いに収束したタイミングで処理を打ち返す?


ざっくりまとめると

相手がExcelでも、TRNSYSからは単にコンポーネントを呼び出す仕組みになっています。その先で呼び出されいるアプリケーションがなんであれ、普通のコンポーネントと区別できない(見えない)のでイテレーションで呼び出されます。

Excel側でタイムステップごと呼び出される前提で処理してしまうと、予想しない結果になります。良い例が思いつきませんが、例えば結果をワークシートに書き込むような処理を考えると、イテレーションごとの値が山ほど書き出される事になります。

しかし、タマネギ(Onion)って収束の表現は初めて聞きました。ピンポンは処理の流れがイメージし易くて良いですね。いままでステップ・バイ・ステップで連成しているという言い方をしてましたが、今度から使おうと思います。