the BEST Program

Building Energy Simulation Tool

オープンソース利⽤例

多地点の熱負荷連続計算

BEST建築計算例

the BEST Program

Building Energy Simulation Tool

BESTオープンソースの利⽤法

計算エンジン部分のソース(⾔語︓Java)が公開されている。

(https://www.ibec.or.jp/best/application_opensource.html、建築計算部分は全て公開)

以下のソース利⽤法3つのうち、最も利⽤しやすいのは3番⽬といえる。

◑ ソースを改造

巨⼤プログラムのためかなり困難◑ ユーザーインターフェースを新規作成

エンジン⼊⼒データの構成や詳細に関する資料は、ソースとともに公開されている。それを利⽤可能◑ 連続実⾏による多ケースシミュレーション
・ソースは改造しない
・多ケース連続実⾏のプログラム作成

⼊⼒データの変更・エンジン実⾏・出⼒データの抽出の繰り返し処理

・BEST-Pなどの既存UIで、基準ケースのエンジン⼊⼒データを作成
これを変更しながら多ケースシミュレーションを⾏う

2BEST建築計算例

多地点の連続熱負荷計算 札幌

計算例

+41

中央値基準装置負荷[MJ/㎡年]+1000

⻘森 +25新潟 +4
仙台 -57-100
福岡 -10

東京 -33⼤阪 -2
⿅児島 +9那覇+88

年間顕熱負荷中央値︓
308MJ/㎡年

836地点の年間装置負荷(Low-E複層窓のオフィス基準階)33

the BEST Program

Building Energy Simulation Tool

BEST建築計算例

建築エンジンを利⽤する

多ケースシミュレーション

計算例

多地点の年間熱負荷計算*1を連続実⾏し、各都市の出⼒ファイルから年積算負荷を抽出し別のファイルに書き出す。p.3のカラーマップは、オフィスビル基準階5ゾーンについて実⾏し、得られた国内836地点の年間装置負荷から作成したものである*2 。
*1 年間熱負荷計算の前に最⼤熱負荷計算を実⾏して、装置容量を⾃動設定する。
*2 演算時間は30分程度。カラーマップ作製ツールは、ColorMap(MestDS、作者︓秋⽥県⽴⼤松本真⼀教授)

以降は、多地点の熱負荷連続計算プログラムを新規に作成するために役に⽴つ以
下の項⽬について説明する。

◑ エンジン⼊⼒データの変更箇所◑ 出⼒データの抽出箇所◑ 新規作成プログラムで利⽤するオープンソースクラス◑ サンプルプログラム
4

BEST建築計算例

the BEST Program

Building Energy Simulation Tool

建築エンジンの⼊⼒データ専⾨版(BEST-P)で作成したエンジン⼊⼒データを利⽤する

BEST-Pのエンジン⼊⼒データフォルダー

気象や計算内容に関する⼊⼒データファイル*各XMLファイルのフォーマット説明は、オープンソースの添付資料として公開されている。

5

BEST建築計算例

専⾨版(BEST-P)のデータ設定とCommonファイルの関係

Common.xmlファイルに出⼒される
最⼤負荷計算と年間負荷計算を連続して実⾏す
ると、最⼤負荷計算結果を装置容量とする年間負荷計算が可能

BEST-P 共通画⾯

6

BEST建築計算例

多地点連続計算のための⼊⼒データ変更
・地点番号(*2、*3)︓10、20、…、8420 (⽋番あり) 836ケース実⾏
地点番号と地点名は、建築操作マニュアルの付録参照

・ジョブ名(*1)︓1地点につき、「最⼤負荷計算」、「年間負荷計算」の2ケース実⾏*1 実⾏する計算内容名*2、*3 設計、年間気象の地点番号
*1

*2

*3

Common.xmlデータファイルの内容

BEST建築計算例

7

多地点連続計算のための出⼒データの抽出
ファイル「bestBuilM.csv」の年積算負荷出⼒⾏を抽出して別ファイルに出⼒*出⼒データファイルと内容の詳細は、建築操作マニュア
ル参照
BEST-Pの計算結果フォルダー

⽉別・年間熱負荷の出⼒ファイル

全ゾーン・各ゾーンの年積算負荷の出⼒⾏

8BEST建築計算例

the BEST Program

Building Energy Simulation Tool

利⽤するオープンソースのプログラム

新規作成プログラムで、メソッドを利⽤するBESTプログラム◑ 熱負荷計算⽤メインクラス

jp.or.ibec.best.domain.building.test.control.HVACsysBuilSimulator◑ Common.xmlファイルの⼊出⼒処理クラス

UnMarshalUtil、MarshalUtilクラスで、XMLファイルのデータの読込み、書出しを⾏い、読込んだCommonファイルのデータをCommonクラスで管理する。EngineSchedule、Weatherクラスは、Commonファイルのデータのうち、計算内容、気象に関するデータを管理するクラス。
jp.or.ibec.best.domain.building.xml.common.Common*、EngineSchedule*、
Weather*jp.or.ibec.best.domain.building.xml.util.UnMarshalUtil、 MarshalUtil*を付したクラスは、Javaの機能により⾃動⽣成されたクラス。
タグ名をもとに、読込んだ個々のデータを取り出したり、再設定したりできる。

9

the BEST Program

Building Energy Simulation Tool

BEST建築計算例

サンプルプログラム

プログラム⾔語︓Java◑ メインクラス MainSample

⽋測地点をはずしながら836地点の最⼤・年間熱負荷を実⾏し、年間熱負荷結果を抽出して別のファイルに保存する。

◑ Commonデータファイルの編集クラス EditorCommon

Common.xmlファイルを読込み、地点名やジョブ名を変更して上書き保存する。

◑ 年間負荷計算結果の編集クラス EditorResults

BestBuilM.csvファイルを読込み、別のファイル(bestAnnualLoad.csv)に、地点番号とともに書き出す。

10

BEST建築計算例

EditorCommon

MinSample

エンジン⼊⼒データ
ファイルの編集Start
ファイルパス等の設定・
EditorCommonインスタン
ス作成

Common.xmlファイルのパス設定

EditorResultsインスタンス
作成

EditorResults

結果ファイルの読込みと年積算負荷の出⼒

⼊出⼒ファイルのパス設定
等
地点番号ループ(気象データあり)

データ読込・地点番号の変更・上書き保存(気象データなし)

データ読込・最⼤負荷計算⽤にJob名変更・上書保存

HVACsysBuilSimulator
インスタンスの作成・最⼤負荷計算の実⾏

データ読込・年間負荷計算⽤にJob名変更・上書保存

HVACsysBuilSimulator
インスタンスの作成・年間負荷計算の実⾏

地点番号のみ出⼒

BestBuilM.csvファイルの読込・年積算負荷⾏の出⼒・ BestBuilM.csvファイ
ルの消去

出⼒ファイルのclose処理アクティビティ図BEST建築計算例

11

the BEST Program

実⾏準備

Building Energy Simulation Tool

環境変数

計算に利⽤するデータ類が保存されたフォルダーを環境変数で設定する。
熱負荷計算⽤に設定が必要な環境変数は下表参照

利⽤する外部プログラム

新規作成プログラムの実⾏に必要なjar(BESTプログラムを除く)は、オープンソース
資料に含まれるbest-sample.libフォルダー内にある。

熱負荷計算⽤の環境変数と設定例
環境変数
BEST_INSTRUCTED
BEST_SPEC

フォルダーパスフォルダーの内容

パス例

エンジン⼊⼒データ

D:\BEST-P\work\Files_ObjectInfo\Object001\Instructed〃

D:\BEST-P\work\Files_ObjectInfo\Object001\Instructed

BEST_RESULT

計算結果

D:\BEST-P\work\Files_ObjectInfo\Object001\Result

BEST_WEATHER

気象データ

D:\BEST-P\work\weather

BEST_XML

建築データベース

D:\BEST-P\work\XML

BEST_USER_DB

ユーザー定義データベースD:\BEST-P\work\userXML

BEST_XSD

建築XSD

D:\BEST-P\sys\XML\xsd* パス例は、BEST-Pフォルダーを利⽤するときの例

12BEST建築計算例

the BEST Program

Building Energy Simulation Tool

年積算負荷の多地点集計結果

地点番号

気象観測終了地点の⾏集計結果ファイル(Resultフォルダー内のbestAnnualLoad.csv)の内容例
BEST建築計算例

13
package bestSample;
import jp.or.ibec.best.domain.building.test.control.HVACsysBuilSimulator;

メインクラスMainSample

public class MainSample {public static void main(String[] args) {MainSample main=new MainSample();main.run();}public void run() {String pathXml=System.getenv("BEST_INSTRUCTED")+"¥¥Common.xml";//Commonファイルパス
String pathRead=System.getenv("BEST_RESULT")+"¥¥bestBuilM.csv";//BEST結果ファイルパス
String pathPrint=System.getenv("BEST_RESULT")+"¥¥bestAnnualLoad.csv";//多地点年間負荷出⼒ファイルパス
int[] cityIdMissing= {20, 960, 2560, 3160, 3640, 5640};//気象データのない地点番号
EditorCommon editorCommon=new EditorCommon();//Commonデータの編集インスタンス
editorCommon.initialize(pathXml);
EditorResults editorResults=new EditorResults();//結果編集インスタンス
editorResults.initialize(pathRead, pathPrint);}}

int iMissing=0;
for(int cityId=10; cityId<=8420; cityId=cityId+10) {//開始、最終の地点番号は修正可能
boolean target=true;
if(iMissing<cityIdMissing.length) {while(cityId>cityIdMissing[iMissing]) iMissing++;if(cityId==cityIdMissing[iMissing]) {//気象データのない地点
target=false;
iMissing++;}}
if(!target) {//気象データのない地点
editorResults.pickupResult(String.valueOf(cityId));//地点番号のみ出⼒}else {//気象データのある地点
editorCommon.editCity(cityId);//Commonデータの地点番号の変更
try{//最⼤負荷計算
editorCommon.editJobName("peak");
HVACsysBuilSimulator simulator=new HVACsysBuilSimulator();simulator.start();simulator.join();//年間負荷計算
editorCommon.editJobName("annual");simulator=new HVACsysBuilSimulator();simulator.start();simulator.join();} catch (InterruptedException e) {System.out.println(e);}editorResults.pickupResult(String.valueOf(cityId));//年間負荷の抽出と出⼒}}
editorResults.complete();14

地点番号ループ

BEST建築計算例

Commonデータ編集クラス
EditorCommon

package bestSample;
import java.util.List;
import jp.or.ibec.best.domain.building.xml.common.Common;
import jp.or.ibec.best.domain.building.xml.common.EngineSchedule;
import jp.or.ibec.best.domain.building.xml.common.Weather;
import jp.or.ibec.best.domain.building.xml.util.MarshalUtil;
import jp.or.ibec.best.domain.building.xml.util.UnMarshalUtil;
public class EditorCommon {private String pathXml;/*** 初期設定* @param pathXml︓Common.xmlファイルのパス*/
public void initialize(String pathXml){
this.pathXml=pathXml;}/*** 地点番号の変更* @param cityId︓地点番号*/public void editCity(int cityId){if(cityId<=0 || cityId>8420) return;
Common common=this.getCommon(pathXml);//Commonデータの取得List<Weather> weathers=common.getWeather();for(Weather weather : weathers){
if(weather.getSpecification().equals("design")|| weather.getSpecification().equals("reference")|| weather.getSpecification().equals("yearly")){//気象データタイプが設計⽤、標準年、実在年のとき、地点番号の変更
weather.setGeographicNumber(String.valueOf(cityId));}}
this.setCommon(common, pathXml);//Commonデータの保存}

地点番号の変更/*** Commonデータの読込み* @param pathXml︓Common.xmlのパス* @return︓Commonデータ*/
private Common getCommon(String pathXml){
Common common=null;try {common = UnMarshalUtil.getCommon(pathXml, null);} catch (Exception e) {e.printStackTrace();}return common;}

Commonデータ読込み/*** ジョブ名の変更* @param calType︓計算タイプ。 "peak"のとき最⼤負荷計算、"annual"のとき年間計算*/
public void editJobName(String calType){
Common common=this.getCommon(pathXml);
List<EngineSchedule> engineSchedules=common.getEngineSchedule();for(EngineSchedule engineSchedule : engineSchedules){String simType=engineSchedule.getSimulationType();if((calType.equals("peak") && simType.equals("peakLoad"))|| (calType.equals("annual") && simType.equals("normal"))){
common.setJobName(engineSchedule.getJobName());//ジョブ名の設定}}
this.setCommon(common, pathXml);}/*** Commonデータの出⼒* @param common︓Commonデータ* @param pathXml︓Common.xmlのパス*/
private void setCommon(Common common, String pathXml){
try {MarshalUtil.putCommon(common, pathXml, null);} catch (Exception e) {e.printStackTrace();}}

ジョブ名の変更

Commonデータ書出し}

BEST建築計算例

15
package bestSample;
import java.io.BufferedReader;import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.nio.file.Files;
import java.nio.file.Paths;

計算結果データ編集クラス
EditorResults
if(first==true){//ラベル⾏の読込みと出⼒
for(int i=0; i<3; i++) {String s=this.getNextLine();writer.println(","+s);}first=false;}else {
for(int i=0; i<3; i++) this.getNextLine();}public class EditorResults{
private String pathRead;
private BufferedReader reader;private PrintWriter writer;private boolean first=true;/*** 初期設定* @param pathRead︓bestBuilM.csvファイルのパス* @param pathPrint︓出⼒ファイルのパス*/
public void initialize(String pathRead, String pathPrint){
this.pathRead=pathRead;
File fileRead=new File(pathRead);if(fileRead.exists()) this.delete(pathRead);}for(int i=0; i<12; i++) this.getNextLine();String s=this.getNextLine();//年間負荷の出⼒⾏の読込み
writer.println(stringCityId+","+s);//地点番号と年間負荷⾏の出⼒
writer.flush();try {File file=new File(pathPrint);
writer=new PrintWriter(new FileWriter(file));} catch (IOException e) {e.printStackTrace();}}public void complete(){writer.close();}

年間負荷の抽出と別ファイルへの書出し/*** 年間負荷の抽出とファイル出⼒* @param stringCityId︓地点番号*/public void pickupResult(String stringCityId){
File fileRead=new File(pathRead);if(!fileRead.exists()){//結果ファイルがないとき
writer.println(stringCityId);//地点番号のみ出⼒
return;}reader=null;try{
reader=new BufferedReader(new FileReader(pathRead));}catch(FileNotFoundException e){e.printStackTrace();return;}try{reader.close();} catch( IOException e){e.printStackTrace();}this.delete(pathRead);

private void delete(String pathRead){try{
Files.delete(Paths.get(pathRead));}catch(IOException e){e.printStackTrace();
}
}

}

16

private String getNextLine(){String str=null;
try{
str=reader.readLine();}catch (IOException e) {e.printStackTrace();}return str;}

BEST建築計算例

参考⽂献
1) 郡︓外⽪の⾼性能化技術の変遷と性能予測、⽇本建築学会シンポジウム「多⾓的な視点から⾒た今後の外⽪性能のあり⽅」、pp.1-6、2019.3
2) BEST-P 建築操作マニュアル、https://www.ibec.or.jp/best/tec_info.html

17

BEST建築計算例