diff --git a/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/FF_temperature_600FF_Jan4.pdf b/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/FF_temperature_600FF_Jan4.pdf new file mode 100644 index 00000000000..415b13d121a Binary files /dev/null and b/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/FF_temperature_600FF_Jan4.pdf differ diff --git a/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/FF_temperature_600FF_Jan4.png b/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/FF_temperature_600FF_Jan4.png new file mode 100644 index 00000000000..000165b3171 Binary files /dev/null and b/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/FF_temperature_600FF_Jan4.png differ diff --git a/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/FF_temperature_650FF_Jul27.pdf b/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/FF_temperature_650FF_Jul27.pdf new file mode 100644 index 00000000000..3b73126fe92 Binary files /dev/null and b/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/FF_temperature_650FF_Jul27.pdf differ diff --git a/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/FF_temperature_650FF_Jul27.png b/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/FF_temperature_650FF_Jul27.png new file mode 100644 index 00000000000..107f44bf5a2 Binary files /dev/null and b/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/FF_temperature_650FF_Jul27.png differ diff --git a/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/FF_temperature_900FF_Jan4.pdf b/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/FF_temperature_900FF_Jan4.pdf new file mode 100644 index 00000000000..5aa9e85ad7a Binary files /dev/null and b/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/FF_temperature_900FF_Jan4.pdf differ diff --git a/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/FF_temperature_900FF_Jan4.png b/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/FF_temperature_900FF_Jan4.png new file mode 100644 index 00000000000..4d936d10881 Binary files /dev/null and b/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/FF_temperature_900FF_Jan4.png differ diff --git a/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/FF_temperature_950FF_Jul27.pdf b/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/FF_temperature_950FF_Jul27.pdf new file mode 100644 index 00000000000..3e969fb8b32 Binary files /dev/null and b/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/FF_temperature_950FF_Jul27.pdf differ diff --git a/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/FF_temperature_950FF_Jul27.png b/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/FF_temperature_950FF_Jul27.png new file mode 100644 index 00000000000..c40c8f7ceec Binary files /dev/null and b/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/FF_temperature_950FF_Jul27.png differ diff --git a/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/annual_cooling.pdf b/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/annual_cooling.pdf new file mode 100644 index 00000000000..eef13147777 Binary files /dev/null and b/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/annual_cooling.pdf differ diff --git a/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/annual_cooling.png b/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/annual_cooling.png new file mode 100644 index 00000000000..16e07a9b677 Binary files /dev/null and b/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/annual_cooling.png differ diff --git a/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/annual_heating.pdf b/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/annual_heating.pdf new file mode 100644 index 00000000000..de10a26d089 Binary files /dev/null and b/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/annual_heating.pdf differ diff --git a/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/annual_heating.png b/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/annual_heating.png new file mode 100644 index 00000000000..79cf6d2889a Binary files /dev/null and b/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/annual_heating.png differ diff --git a/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/ave_temperature.pdf b/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/ave_temperature.pdf new file mode 100644 index 00000000000..3cde7b505ab Binary files /dev/null and b/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/ave_temperature.pdf differ diff --git a/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/ave_temperature.png b/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/ave_temperature.png new file mode 100644 index 00000000000..8e317316a17 Binary files /dev/null and b/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/ave_temperature.png differ diff --git a/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/bin_temperature_900FF.pdf b/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/bin_temperature_900FF.pdf new file mode 100644 index 00000000000..21be20936f3 Binary files /dev/null and b/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/bin_temperature_900FF.pdf differ diff --git a/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/bin_temperature_900FF.png b/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/bin_temperature_900FF.png new file mode 100644 index 00000000000..75d03c8fd06 Binary files /dev/null and b/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/bin_temperature_900FF.png differ diff --git a/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/hourly_load_600_Jan4.pdf b/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/hourly_load_600_Jan4.pdf new file mode 100644 index 00000000000..ed93bdba93b Binary files /dev/null and b/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/hourly_load_600_Jan4.pdf differ diff --git a/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/hourly_load_600_Jan4.png b/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/hourly_load_600_Jan4.png new file mode 100644 index 00000000000..9ee45c2a0db Binary files /dev/null and b/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/hourly_load_600_Jan4.png differ diff --git a/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/hourly_load_900_Jan4.pdf b/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/hourly_load_900_Jan4.pdf new file mode 100644 index 00000000000..a8015003fc2 Binary files /dev/null and b/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/hourly_load_900_Jan4.pdf differ diff --git a/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/hourly_load_900_Jan4.png b/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/hourly_load_900_Jan4.png new file mode 100644 index 00000000000..9c55e57938d Binary files /dev/null and b/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/hourly_load_900_Jan4.png differ diff --git a/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/max_temperature.pdf b/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/max_temperature.pdf new file mode 100644 index 00000000000..43a0ff04090 Binary files /dev/null and b/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/max_temperature.pdf differ diff --git a/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/max_temperature.png b/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/max_temperature.png new file mode 100644 index 00000000000..135442a4fac Binary files /dev/null and b/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/max_temperature.png differ diff --git a/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/min_temperature.pdf b/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/min_temperature.pdf new file mode 100644 index 00000000000..b6445ce8763 Binary files /dev/null and b/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/min_temperature.pdf differ diff --git a/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/min_temperature.png b/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/min_temperature.png new file mode 100644 index 00000000000..fb9c50ec655 Binary files /dev/null and b/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/min_temperature.png differ diff --git a/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/peak_cooling.pdf b/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/peak_cooling.pdf new file mode 100644 index 00000000000..39663fd5b73 Binary files /dev/null and b/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/peak_cooling.pdf differ diff --git a/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/peak_cooling.png b/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/peak_cooling.png new file mode 100644 index 00000000000..71c585b5470 Binary files /dev/null and b/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/peak_cooling.png differ diff --git a/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/peak_heating.pdf b/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/peak_heating.pdf new file mode 100644 index 00000000000..53cafbfee2e Binary files /dev/null and b/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/peak_heating.pdf differ diff --git a/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/peak_heating.png b/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/peak_heating.png new file mode 100644 index 00000000000..b9a72f3c188 Binary files /dev/null and b/Buildings/Resources/Images/ThermalZones/Detailed/Validation/BESTEST/peak_heating.png differ diff --git a/Buildings/Resources/src/ThermalZones/Detailed/Validation/BESTEST/ASHRAE140_data.dat b/Buildings/Resources/src/ThermalZones/Detailed/Validation/BESTEST/ASHRAE140_data.dat new file mode 100644 index 00000000000..06c681cf960 --- /dev/null +++ b/Buildings/Resources/src/ThermalZones/Detailed/Validation/BESTEST/ASHRAE140_data.dat @@ -0,0 +1,404 @@ +# Following data are from "RESULTS5-2A.xlsx" in folder /Sec5-2AFiles/Informative Materials +# of "Supplemental Files for ANSI/ASHRAE Standard 140-2017, Standard Method of Test +# for the Evaluation of Building Energy Analysis Computer Programs": https://xp20.ashrae.org/140-2017/ +======================================================== +# Table B8-1. Annual Heating Loads (MWh) +Case, ESP/DMU, BLAST/US-IT, DOE21D/NREL, SRES-SUN/NREL, SRES/BRE, S3PAS/SPAIN, TSYS/BEL-BRE, TASE/FINLAND +600, 4.296, 4.773, 5.709, 5.226, 5.596, 4.882, 4.872, 5.362 +610, 4.355, 4.806, 5.786, 5.280, 5.620, 4.971, 4.970, 5.383 +620, 4.613, 5.049, 5.944, 5.554, 5.734, 5.564, 5.073, 5.728 +630, 5.050, 5.359, 6.469, 5.883, 6.001, 6.095, 5.624, N/A +640, 2.751, 2.888, 3.543, 3.255, 3.803, 3.065, 3.043, 3.309 +650, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000 +900, 1.170, 1.610, 1.872, 1.897, 1.988, 1.730, 1.655, 2.041 +910, 1.575, 1.862, 2.254, 2.174, 2.282, 2.063, 2.097, 2.220 +920, 3.313, 3.752, 4.255, 4.093, 4.058, 4.235, 3.776, 4.300 +930, 4.143, 4.347, 5.335, 4.755, 4.728, 5.168, 4.740, N/A +940, 0.793, 1.021, 1.239, 1.231, 1.411, 1.179, 1.080, 1.323 +950, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000 +960, 2.311, 2.664, 2.928, 2.884, 2.851, 2.943, 3.373, 2.816 +-------------------------------------------------------- +# Table B8-2. Annual Sensible Cooling Loads (MWh) +Case, ESP/DMU, BLAST/US-IT, DOE21D/NREL, SRES-SUN/NREL, SRES/BRE, S3PAS/SPAIN, TSYS/BEL-BRE, TASE/FINLAND +600, 6.137, 6.433, 7.079, 7.278, 7.964, 6.492, 6.492, 6.778 +610, 3.915, 4.851, 4.852, 5.448, 5.778, 4.764, 4.601, 5.506 +620, 3.417, 4.092, 4.334, 4.633, 5.004, 4.011, 3.901, 4.351 +630, 2.129, 3.108, 2.489, 3.493, 3.701, 2.489, 2.416, N/A +640, 5.952, 6.183, 6.759, 7.026, 7.811, 6.247, 6.246, 6.508 +650, 4.816, 5.140, 5.795, 5.894, 6.545, 5.088, 5.119, 5.456 +900, 2.132, 2.600, 2.455, 3.165, 3.415, 2.572, 2.485, 2.599 +910, 0.821, 1.533, 0.976, 1.872, 1.854, 1.428, 1.326, 1.767 +920, 1.840, 2.616, 2.440, 2.943, 3.092, 2.457, 2.418, 2.613 +930, 1.039, 1.934, 1.266, 2.173, 2.238, 1.439, 1.416, N/A +940, 2.079, 2.536, 2.340, 3.036, 3.241, 2.489, 2.383, 2.516 +950, 0.387, 0.526, 0.538, 0.921, 0.589, 0.551, 0.561, 0.771 +960, 0.488, 0.666, 0.428, 0.803, 0.718, 0.643, 0.411, 0.786 +-------------------------------------------------------- +# Table B8-3. Annual Hourly Integrated Peak Heating Loads (kW) +Case, ESP/DMU, BLAST/US-IT, DOE21D/NREL, SRES-SUN/NREL, SRES/BRE, S3PAS/SPAIN, TSYS/BEL-BRE, TASE/FINLAND +600, 3.437(04-Jan:5), 3.940(04-Jan:5), 4.045(04-Jan:5), 4.258(04-Jan:2), N/A, 4.037(04-Jan:2), 3.931(04-Jan:6), 4.354(04-Jan:2) +610, 3.437(04-Jan:5), 3.941(04-Jan:5), 4.034(04-Jan:5), 4.258(04-Jan:2), N/A, 4.037(04-Jan:2), 3.922(04-Jan:6), 4.354(04-Jan:2) +620, 3.591(04-Jan:6), 3.941(04-Jan:5), 4.046(04-Jan:5), 4.277(04-Jan:2), N/A, 4.277(04-Jan:2), 3.922(04-Jan:6), 4.379(04-Jan:2) +630, 3.592(04-Jan:7), 3.941(04-Jan:5), 4.025(04-Jan:5), 4.280(04-Jan:2), N/A, 4.278(04-Jan:2), 3.922(04-Jan:6), N/A +640, 5.232(04-Jan:7), 5.486(04-Jan:8), 5.943(04-Jan:8), 6.530(04-Jan:8), N/A, 6.347(04-Jan:8), 5.722(04-Jan:8), 6.954(04-Jan:8) +650, 0.000, 0.000(04-Jan:N/A), 0.000, 0.000, N/A, 0.000, 0.000, 0.000 +900, 2.850(04-Jan:7), 3.453(04-Jan:7), 3.557(04-Jan:7), 3.760(04-Jan:7), N/A, 3.608(04-Jan:8), 3.517(04-Jan:7), 3.797(04-Jan:7) +910, 2.858(04-Jan:7), 3.456(04-Jan:7), 3.564(04-Jan:7), 3.764(04-Jan:7), N/A, 3.618(04-Jan:8), 3.536(04-Jan:7), 3.801(04-Jan:7) +920, 3.308(04-Jan:7), 3.703(04-Jan:7), 3.805(04-Jan:7), 4.013(04-Jan:7), N/A, 4.029(04-Jan:7), 3.708(04-Jan:7), 4.061(04-Jan:7) +930, 3.355(04-Jan:7), 3.732(04-Jan:7), 3.832(04-Jan:7), 4.042(04-Jan:7), N/A, 4.064(04-Jan:7), 3.744(04-Jan:7), N/A, +940, 3.980(04-Jan:7), 5.028(04-Jan:8), 5.665(04-Jan:8), 6.116(04-Jan:8), N/A, 6.117(04-Jan:8), 5.122(03-Jan:9), 6.428(04-Jan:8) +950, 0.000, 0.000, 0.000, 0.000, N/A, 0.000, 0.000, 0.000 +960, 2.410(04-Jan:7), 2.751(04-Jan:8), 2.727(04-Jan:8), 2.863(04-Jan:8), N/A, 2.852(04-Jan:8), 2.522(04-Jan:8), 2.779(04-Jan:8) +-------------------------------------------------------- +# Table B8-4. Annual Hourly Integrated Peak Sensible Cooling Loads (kW) +Case, ESP/DMU, BLAST/US-IT, DOE21D/NREL, SRES-SUN/NREL, SRES/BRE, S3PAS/SPAIN, TSYS/BEL-BRE, TASE/FINLAND +600, 6.194(17-Oct:13), 5.965(16-Oct:14), 6.656(16-Oct:13), 6.827(16-Oct:14), N/A, 6.286(25-Nov:14), 6.486(16-Oct:14), 6.812(17-Oct:14) +610, 5.669(25-Nov:13), 5.824(25-Nov:14), 6.064(13-Jan:14), 6.371(25-Nov:14), N/A, 6.170(25-Nov:14), 5.675(25-Nov:14), 6.146(17-Oct:14) +620, 3.634(26-Jul:16), 4.075(26-Jul:17), 4.430(26-Jul:17), 4.593(26-Jul:17), N/A, 4.297(26-Jul:17), 4.275(26-Jul:17), 5.096(26-Jul:16) +630, 3.072(26-Jul:16), 3.704(26-Jul:17), 3.588(26-Jul:17), 4.116(26-Jul:17), N/A, 3.665(26-Jul:17), 3.608(26-Jul:17), N/A +640, 6.161(17-Oct:13), 5.892(16-Oct:14), 6.576(16-Oct:14), 6.776(16-Oct:14), N/A, 6.250(25-Nov:14), 6.442(16-Oct:14), 6.771(17-Oct:14) +650, 6.031(17-Oct:13), 5.831(16-Oct:14), 6.516(16-Oct:14), 6.671(16-Oct:14), N/A, 6.143(25-Nov:14), 6.378(17-Oct:14), 6.679(17-Oct:14) +900, 2.888(17-Oct:14), 3.155(06-Oct:15), 3.458(17-Oct:14), 3.871(17-Oct:14), N/A, 3.334(17-Oct:15), 3.567(17-Oct:15), 3.457(17-Oct:15) +910, 1.896(17-Oct:15), 2.500(21-Oct:15), 2.336(17-Oct:15), 3.277(17-Oct:15), N/A, 2.786(17-Oct:15), 2.792(17-Oct:15), 3.147(17-Oct:15) +920, 2.385(26-Jul:16), 2.933(26-Jul:17), 3.109(26-Jul:17), 3.487(26-Jul:17), N/A, 3.071(26-Jul:17), 3.050(26-Jul:17), 3.505(26-Jul:17) +930, 1.873(26-Jul:17), 2.546(26-Jul:17), 2.388(26-Jul:18), 3.080(26-Jul:17), N/A, 2.486(26-Jul:17), 2.498(26-Jul:17), N/A +940, 2.888(17-Oct:14), 3.155(06-Oct:15), 3.458(17-Oct:14), 3.871(17-Oct:14), N/A, 3.334(17-Oct:15), 3.567(17-Oct:15), 3.457(17-Oct:15) +950, 2.033(02-Sep:14), 2.621(02-Sep:15), 2.664(02-Sep:15), 3.170(02-Sep:14), N/A, 2.677(02-Sep:15), 2.686(02-Sep:15), 2.867(02-Sep:14) +960, 0.953(16-Aug:16), 1.144(26-Jul:16), 1.057(26-Jul:16), 1.370(26-Jul:16), N/A, 1.179(26-Jul:16), 1.378(26-Jul:16), 1.403(26-Jul:16) +-------------------------------------------------------- +# Table B8-5. Free-Float Temperature Output (degC) +# MAXIMUM ANNUAL HOURLY INTEGRATED ZONE TEMPERATURE +Case, ESP/DMU, BLAST/US-IT, DOE21D/NREL, SRES-SUN/NREL, SRES/BRE, S3PAS/SPAIN, TSYS/BEL-BRE, TASE/FINLAND +600FF, 64.9(17-Oct:15), 65.1(16-Oct:15), 69.5(17-Oct:15), 68.6(16-Oct:15), N/A, 64.9(16-Oct:16), 65.3(17-Oct:16), 65.3(15-Oct:16) +900FF, 41.8(17-Oct:15), 43.4(02-Sep:16), 42.7(02-Sep:15), 44.8(02-Sep:15), N/A, 43.0(02-Sep:15), 42.5(17-Oct:15), 43.2(15-Sep:15) +650FF, 63.2(17-Oct:15), 63.5(16-Oct:15), 68.2(17-Oct:15), 67.0(16-Oct:15), N/A, 63.3(16-Oct:16), 63.7(17-Oct:16), 63.8(16-Oct:16) +950FF, 35.5(02-Sep:16), 36.2(02-Sep:16), 35.9(02-Sep:16), 38.5(02-Sep:15), N/A, 36.1(02-Sep:16), 35.7(02-Sep:15), 37.6(15-Sep:16) +-------------------------------------------------------- +# MINIMUM ANNUAL HOURLY INTEGRATED ZONE TEMPERATURE +Case, ESP/DMU, BLAST/US-IT, DOE21D/NREL, SRES-SUN/NREL, SRES/BRE, S3PAS/SPAIN, TSYS/BEL-BRE, TASE/FINLAND +600FF, -15.6(04-Jan:7), -17.1(04-Jan:8), -18.8(04-Jan:8), -18.0(04-Jan:7), N/A, -17.8(04-Jan:8), -17.8(04-Jan:7), -18.5(08-Jan:9) +900FF, -1.6(04-Jan:8), -3.2(04-Jan:8), -4.3(04-Jan:8), -4.5(04-Jan:8), N/A, -4.0(04-Jan:8), -6.4(04-Jan:8), -5.6(08-Jan:9) +650FF, -22.6(04-Jan:6), -23.0(04-Jan:7), -21.6(04-Jan:2), -23.0(04-Jan:2), N/A, -22.9(04-Jan:2), -22.8(04-Jan:7), -22.9(02-Jan:23) +950FF, -19.5(04-Jan:6), -20.0(04-Jan:7), -18.6(04-Jan:7), -19.7(04-Jan:7), N/A, -20.2(04-Jan:7), -19.3(04-Jan:7), -20.0(07-Jan:22) +-------------------------------------------------------- +# AVERAGE ANNUAL HOURLY INTEGRATED ZONE TEMPERATURE +Case, ESP/DMU, BLAST/US-IT, DOE21D/NREL, SRES-SUN/NREL, SRES/BRE, S3PAS/SPAIN, TSYS/BEL-BRE, TASE/FINLAND +600FF, 25.1, 25.4, 24.6, 25.5, 25.9, 25.2, 24.5, 24.2 +900FF, 25.5, 25.9, 24.7, 25.5, 25.7, 25.2, 24.5, 24.5 +650FF, 18.2, 18.7, 19.1, 19.0, 19.6, 18.4, 18.0, 18.4 +950FF, 14.1, 14.3, 14.3, 15.0, 14.3, 14.0, 14.5, 14.6 +-------------------------------------------------------- +# HOURLY FREE FLOAT TEMPERATURE DATA (degC): CASE 600FF, JAN 4 +Hour, ESP/DMU, BLAST/US-IT, DOE21D/NREL, SRES-SUN/NREL, SRES/BRE, S3PAS/SPAIN, TSYS/BEL-BRE, TASE/FINLAND +1, -8.88, -12.04, -12.30, -12.21, N/A, -12.10, -12.02, -13.04 +2, -10.48, -13.52, -14.10, -13.80, N/A, -13.70, -13.50, -14.59 +3, -11.76, -14.40, -15.40, -14.90, N/A, -14.70, -14.70, -15.65 +4, -12.75, -15.26, -16.30, -15.79, N/A, -15.60, -15.65, -16.46 +5, -13.69, -16.00, -17.10, -16.55, N/A, -16.40, -16.47, -17.16 +6, -14.49, -16.40, -17.90, -17.20, N/A, -17.00, -17.14, -17.79 +7, -15.15, -17.01, -18.50, -17.74, N/A, -17.60, -17.70, -18.32 +8, -15.63, -17.05, -18.80, -17.85, N/A, -17.80, -17.59, -18.47 +9, -14.63, -13.74, -14.70, -14.88, N/A, -14.60, -13.46, -15.47 +10, -10.03, -7.99, -7.80, -9.07, N/A, -8.90, -7.10, -9.56 +11, -2.20, 2.60, 3.20, 1.01, N/A, 1.00, 3.66, 0.49 +12, 8.84, 12.22, 13.40, 11.21, N/A, 10.70, 13.49, 10.39 +13, 18.96, 20.86, 22.30, 20.03, N/A, 19.20, 21.77, 18.75 +14, 27.19, 27.53, 29.50, 27.27, N/A, 26.10, 28.26, 25.48 +15, 33.22, 31.33, 33.80, 31.34, N/A, 29.80, 32.09, 29.21 +16, 35.51, 31.06, 33.50, 31.47, N/A, 29.70, 32.16, 28.97 +17, 31.46, 24.28, 27.00, 25.96, N/A, 23.90, 25.71, 22.58 +18, 23.99, 17.46, 19.70, 18.96, N/A, 17.60, 18.84, 15.59 +19, 18.08, 12.05, 13.70, 13.04, N/A, 12.20, 13.10, 10.20 +20, 13.02, 7.57, 8.70, 8.31, N/A, 7.80, 8.41, 6.02 +21, 8.87, 3.60, 4.40, 4.27, N/A, 4.00, 4.39, 2.39 +22, 5.12, 0.52, 1.00, 0.99, N/A, 0.90, 0.97, -0.59 +23, 2.03, -1.94, -1.90, -1.66, N/A, -1.70, -1.78, -3.04 +24, -1.03, -4.07, -4.40, -3.92, N/A, -3.90, -4.03, -5.14 +-------------------------------------------------------- +# HOURLY FREE FLOAT TEMPERATURE DATA (degC): CASE 900FF, JAN 4 +Hour, ESP/DMU, BLAST/US-IT, DOE21D/NREL, SRES-SUN/NREL, SRES/BRE, S3PAS/SPAIN, TSYS/BEL-BRE, TASE/FINLAND +1, 1.61, -0.17, -0.90, -1.31, N/A, -0.70, -3.46, -2.68 +2, 0.93, -0.79, -1.60, -1.97, N/A, -1.40, -3.99, -3.33 +3, 0.49, -1.09, -2.00, -2.37, N/A, -1.80, -4.40, -3.72 +4, 0.07, -1.67, -2.50, -2.81, N/A, -2.30, -4.80, -4.10 +5, -0.41, -2.04, -2.90, -3.25, N/A, -2.70, -5.22, -4.51 +6, -0.87, -2.43, -3.40, -3.68, N/A, -3.20, -5.60, -4.93 +7, -1.27, -2.97, -3.90, -4.10, N/A, -3.60, -5.98, -5.34 +8, -1.64, -3.15, -4.30, -4.40, N/A, -4.00, -6.08, -5.64 +9, -1.54, -2.39, -3.30, -3.45, N/A, -3.20, -4.72, -4.59 +10, -0.40, -1.09, -1.60, -1.60, N/A, -1.70, -2.98, -2.64 +11, 1.59, 1.60, 1.20, 1.66, N/A, 0.90, 0.25, 0.75 +12, 4.40, 3.62, 3.50, 4.40, N/A, 3.10, 2.54, 3.26 +13, 6.72, 5.62, 5.50, 6.56, N/A, 5.10, 4.38, 4.99 +14, 8.66, 7.32, 7.20, 8.39, N/A, 6.80, 5.85, 6.51 +15, 10.02, 8.27, 8.00, 9.04, N/A, 7.60, 6.61, 7.11 +16, 10.40, 8.15, 7.90, 8.58, N/A, 7.40, 6.33, 6.68 +17, 9.41, 6.53, 6.20, 6.44, N/A, 5.80, 4.20, 4.24 +18, 7.66, 5.25, 4.70, 4.43, N/A, 4.40, 2.87, 2.45 +19, 6.74, 4.52, 3.80, 3.37, N/A, 3.60, 2.11, 1.71 +20, 6.00, 3.88, 3.20, 2.73, N/A, 3.00, 1.58, 1.32 +21, 5.41, 3.22, 2.70, 2.11, N/A, 2.40, 1.05, 0.82 +22, 4.74, 2.85, 2.20, 1.66, N/A, 1.90, 0.55, 0.42 +23, 4.20, 2.47, 1.70, 1.26, N/A, 1.50, 0.15, 0.05 +24, 3.66, 1.90, 1.20, 0.83, N/A, 1.00, -0.24, -0.34 +-------------------------------------------------------- +# HOURLY FREE FLOAT TEMPERATURE DATA (degC): CASE 650FFV, JULY 27 +Hour, ESP/DMU, BLAST/US-IT, DOE21D/NREL, SRES-SUN/NREL, SRES/BRE, S3PAS/SPAIN, TSYS/BEL-BRE, TASE/FINLAND +1, 22.58, 22.223, 21.8, 22.37, N/A, 22.4, 22.69, 22.26 +2, 21.15, 21.15459, 20.8, 21.19, N/A, 21.2, 21.33, 21.11 +3, 20.23, 20.30677, 19.9, 20.33, N/A, 20.4, 20.41, 20.28 +4, 19.45, 19.52177, 19.1, 19.54, N/A, 19.5, 19.61, 19.49 +5, 18.95, 19.29496, 18.8, 19.21, N/A, 19.2, 19.16, 19.14 +6, 19.24, 19.91442, 19.5, 19.86, N/A, 19.9, 19.6, 19.81 +7, 21.16, 22.52839, 22.2, 22.51, N/A, 22.5, 21.68, 22.49 +8, 23.56, 25.02746, 24, 24.89, N/A, 24.7, 23.47, 24.81 +9, 25.67, 28.33267, 27.3, 28.29, N/A, 27.9, 26.38, 28.04 +10, 28.91, 31.83112, 31.5, 32.42, N/A, 31.7, 30.35, 32.11 +11, 32.8, 35.82504, 36.2, 37.12, N/A, 36.2, 34.82, 36.54 +12, 37.49, 40.19727, 41.1, 42.08, N/A, 40.8, 39.38, 41.15 +13, 41.94, 43.90261, 45.4, 46.46, N/A, 45, 43.48, 45.03 +14, 45.43, 46.34636, 48.4, 49.69, N/A, 48.1, 46.14, 47.65 +15, 47.41, 47.63623, 50.1, 51.3, N/A, 49.6, 47.4, 49.04 +16, 47.84, 47.60286, 50.1, 51.28, N/A, 49.7, 47.33, 49.28 +17, 47.01, 47.34062, 49.1, 50.46, N/A, 49.1, 46.71, 48.73 +18, 45.53, 45.39641, 46.8, 48.37, N/A, 47.2, 45.28, 46.58 +19, 37.37, 33.70343, 34, 35.39, N/A, 35.1, 33.1, 34.91 +20, 31.57, 30.86638, 30.9, 31.63, N/A, 31.6, 30.49, 30.69 +21, 29.05, 28.69496, 28.5, 29.12, N/A, 29.2, 28.55, 28.81 +22, 26.92, 26.49679, 26.3, 26.83, N/A, 26.9, 26.66, 26.66 +23, 25.52, 25.68444, 25.4, 25.87, N/A, 25.9, 25.55, 25.69 +24, 23.84, 24.05427, 23.7, 24.19, N/A, 24.2, 24.26, 24.1 +-------------------------------------------------------- +# HOURLY FREE FLOAT TEMPERATURE DATA (degC): CASE 950FFV, JULY 27 +Hour, ESP/DMU, BLAST/US-IT, DOE21D/NREL, SRES-SUN/NREL, SRES/BRE, S3PAS/SPAIN, TSYS/BEL-BRE, TASE/FINLAND +1, 24.36, 24.56013, 24.2, 24.52, N/A, 24.6, 25.28, 24.53 +2, 23.46, 23.89633, 23.5, 23.81, N/A, 23.9, 24.47, 23.8 +3, 22.86, 23.31263, 22.9, 23.22, N/A, 23.3, 23.87, 23.23 +4, 22.27, 22.68233, 22.3, 22.6, N/A, 22.7, 23.26, 22.6 +5, 21.86, 22.4527, 22, 22.32, N/A, 22.4, 22.87, 22.27 +6, 22.01, 22.81275, 22.5, 22.77, N/A, 22.8, 23.06, 22.67 +7, 23.32, 24.66775, 24.3, 24.73, N/A, 24.6, 24.38, 24.55 +8, 25.62, 27.35861, 26.5, 27.59, N/A, 27.1, 27.21, 27.57 +9, 27.59, 28.32289, 27.5, 29.09, N/A, 28.2, 27.98, 29.42 +10, 28.82, 29.20738, 28.6, 30.5, N/A, 29.3, 29.11, 30.68 +11, 29.84, 30.19013, 29.8, 31.98, N/A, 30.5, 30.31, 31.91 +12, 30.98, 31.33518, 31.1, 33.56, N/A, 31.7, 31.53, 33.27 +13, 32.08, 32.18791, 32.2, 34.79, N/A, 32.8, 32.55, 34.27 +14, 32.85, 32.84504, 33, 35.65, N/A, 33.6, 33.15, 34.9 +15, 33.33, 33.11979, 33.4, 35.96, N/A, 34, 33.37, 35.19 +16, 33.55, 33.24781, 33.5, 35.82, N/A, 34.1, 33.38, 35.28 +17, 33.44, 33.35231, 33.5, 35.61, N/A, 34.1, 33.37, 35.3 +18, 33.23, 32.99604, 33.1, 34.93, N/A, 33.7, 33.16, 34.71 +19, 30.92, 30.20304, 30, 30.96, N/A, 30.6, 30.43, 30.74 +20, 29.17, 29.35345, 29.1, 29.79, N/A, 29.6, 29.61, 29.38 +21, 28.31, 28.54159, 28.2, 28.83, N/A, 28.7, 28.89, 27.64 +22, 27.27, 27.3759, 27.1, 27.59, N/A, 27.5, 27.93, 27.46 +23, 26.62, 27.17404, 26.8, 27.28, N/A, 27.3, 27.42, 27.1 +24, 25.54, 25.98047, 25.7, 26.1, N/A, 26.1, 26.59, 26.02 +-------------------------------------------------------- +# HOURLY HEATING & COOLING LOAD DATA (kWh): CASE 600 JAN 4 +Hour, ESP/DMU, BLAST/US-IT, DOE21D/NREL, SRES-SUN/NREL, SRES/BRE, S3PAS/SPAIN, TSYS/BEL-BRE, TASE/FINLAND +1, 3.25, 3.80, 3.93, 4.13, N/A, 3.93, 3.77, 4.23 +2, 3.41, 3.91, 4.04, 4.26, N/A, 4.04, 3.87, 4.35 +3, 3.39, 3.87, 4.01, 4.23, N/A, 4.00, 3.90, 4.32 +4, 3.38, 3.92, 4.04, 4.22, N/A, 4.00, 3.89, 4.31 +5, 3.42, 3.94, 4.05, 4.22, N/A, 4.00, 3.92, 4.30 +6, 3.43, 3.93, 4.04, 4.22, N/A, 4.00, 3.93, 4.31 +7, 3.42, 3.94, 4.05, 4.22, N/A, 4.00, 3.93, 4.31 +8, 3.34, 3.70, 3.86, 4.09, N/A, 3.90, 3.75, 4.17 +9, 2.77, 2.68, 2.56, 2.90, N/A, 2.71, 2.42, 2.91 +10, 1.50, 1.38, 0.84, 1.28, N/A, 1.15, 0.80, 1.47 +11, 0.15, 0.00, 0.00, 0.00, N/A, 0.00, -0.03, 0.00 +12, -0.77, -1.23, -1.55, -1.07, N/A, -1.04, -1.44, -0.42 +13, -2.66, -2.49, -2.85, -2.59, N/A, -2.50, -2.72, -2.36 +14, -3.58, -2.96, -3.40, -3.23, N/A, -3.09, -3.16, -2.76 +15, -3.53, -2.63, -3.12, -2.83, N/A, -2.64, -2.84, -2.43 +16, -2.44, -1.35, -1.82, -1.55, N/A, -1.35, -1.72, -1.14 +17, -0.36, 0.00, 0.00, 0.00, N/A, 0.00, 0.00, 0.00 +18, 0.24, 0.95, 0.78, 0.80, N/A, 0.88, 0.77, 1.29 +19, 1.53, 2.38, 2.23, 2.34, N/A, 2.33, 2.30, 2.45 +20, 2.32, 2.87, 2.93, 2.99, N/A, 2.95, 2.97, 2.94 +21, 2.64, 3.21, 3.32, 3.37, N/A, 3.31, 3.28, 3.41 +22, 2.90, 3.28, 3.49, 3.53, N/A, 3.35, 3.46, 3.59 +23, 3.02, 3.33, 3.51, 3.61, N/A, 3.49, 3.50, 3.70 +24, 3.01, 3.39, 3.56, 3.66, N/A, 3.53, 3.47, 3.77 +-------------------------------------------------------- +# HOURLY HEATING & COOLING LOAD DATA (kWh): CASE 900 JAN 4 +Hour, ESP/DMU, BLAST/US-IT, DOE21D/NREL, SRES-SUN/NREL, SRES/BRE, S3PAS/SPAIN, TSYS/BEL-BRE, TASE/FINLAND +1, 2.44, 3.10, 3.10, 3.39, N/A, 3.21, 3.08, 3.40 +2, 2.61, 3.20, 3.24, 3.54, N/A, 3.35, 3.20, 3.55 +3, 2.62, 3.20, 3.28, 3.56, N/A, 3.38, 3.28, 3.57 +4, 2.67, 3.31, 3.38, 3.61, N/A, 3.45, 3.33, 3.63 +5, 2.74, 3.37, 3.45, 3.67, N/A, 3.51, 3.42, 3.69 +6, 2.80, 3.40, 3.50, 3.72, N/A, 3.56, 3.47, 3.75 +7, 2.83, 3.45, 3.56, 3.76, N/A, 3.61, 3.52, 3.80 +8, 2.84, 3.38, 3.52, 3.75, N/A, 3.61, 3.46, 3.79 +9, 2.64, 2.90, 2.97, 3.17, N/A, 3.08, 2.83, 3.17 +10, 2.12, 2.35, 2.20, 2.32, N/A, 2.35, 2.06, 2.45 +11, 1.50, 1.40, 1.03, 0.95, N/A, 1.12, 0.79, 1.29 +12, 0.68, 0.38, 0.23, 0.10, N/A, 0.30, 0.04, 0.62 +13, 0.07, 0.00, 0.00, 0.00, N/A, 0.00, 0.00, 0.14 +14, 0.00, 0.00, 0.00, 0.00, N/A, 0.00, 0.00, 0.00 +15, 0.00, 0.00, 0.00, 0.00, N/A, 0.00, 0.00, 0.00 +16, 0.00, 0.00, 0.00, 0.00, N/A, 0.00, 0.00, 0.09 +17, 0.03, 0.12, 0.00, 0.28, N/A, 0.14, 0.13, 1.20 +18, 0.41, 0.77, 0.74, 1.22, N/A, 0.91, 0.76, 1.60 +19, 0.80, 1.31, 1.14, 1.61, N/A, 1.28, 1.20, 1.81 +20, 1.07, 1.61, 1.43, 1.82, N/A, 1.54, 1.46, 1.94 +21, 1.27, 1.93, 1.70, 2.04, N/A, 1.81, 1.70, 2.12 +22, 1.50, 2.14, 1.89, 2.17, N/A, 2.00, 1.93, 2.23 +23, 1.66, 2.22, 2.03, 2.29, N/A, 2.15, 2.09, 2.34 +24, 1.75, 2.31, 2.19, 2.42, N/A, 2.31, 2.23, 2.46 +-------------------------------------------------------- +# HOURLY ANNUAL ZONE TEMPERATURE BIN DATA (hours): CASE 900FF +Temp, ESP/DMU, BLAST/US-IT, DOE21D/NREL, SRES-SUN/NREL, SRES/BRE, S3PAS/SPAIN, TSYS/BEL-BRE, TASE/FINLAND +-50, 0, 0, 0, 0, 0, 0, 0, 0 +-49, 0, 0, 0, 0, 0, 0, 0, 0 +-48, 0, 0, 0, 0, 0, 0, 0, 0 +-47, 0, 0, 0, 0, 0, 0, 0, 0 +-46, 0, 0, 0, 0, 0, 0, 0, 0 +-45, 0, 0, 0, 0, 0, 0, 0, 0 +-44, 0, 0, 0, 0, 0, 0, 0, 0 +-43, 0, 0, 0, 0, 0, 0, 0, 0 +-42, 0, 0, 0, 0, 0, 0, 0, 0 +-41, 0, 0, 0, 0, 0, 0, 0, 0 +-40, 0, 0, 0, 0, 0, 0, 0, 0 +-39, 0, 0, 0, 0, 0, 0, 0, 0 +-38, 0, 0, 0, 0, 0, 0, 0, 0 +-37, 0, 0, 0, 0, 0, 0, 0, 0 +-36, 0, 0, 0, 0, 0, 0, 0, 0 +-35, 0, 0, 0, 0, 0, 0, 0, 0 +-34, 0, 0, 0, 0, 0, 0, 0, 0 +-33, 0, 0, 0, 0, 0, 0, 0, 0 +-32, 0, 0, 0, 0, 0, 0, 0, 0 +-31, 0, 0, 0, 0, 0, 0, 0, 0 +-30, 0, 0, 0, 0, 0, 0, 0, 0 +-29, 0, 0, 0, 0, 0, 0, 0, 0 +-28, 0, 0, 0, 0, 0, 0, 0, 0 +-27, 0, 0, 0, 0, 0, 0, 0, 0 +-26, 0, 0, 0, 0, 0, 0, 0, 0 +-25, 0, 0, 0, 0, 0, 0, 0, 0 +-24, 0, 0, 0, 0, 0, 0, 0, 0 +-23, 0, 0, 0, 0, 0, 0, 0, 0 +-22, 0, 0, 0, 0, 0, 0, 0, 0 +-21, 0, 0, 0, 0, 0, 0, 0, 0 +-20, 0, 0, 0, 0, 0, 0, 0, 0 +-19, 0, 0, 0, 0, 0, 0, 0, 0 +-18, 0, 0, 0, 0, 0, 0, 0, 0 +-17, 0, 0, 0, 0, 0, 0, 0, 0 +-16, 0, 0, 0, 0, 0, 0, 0, 0 +-15, 0, 0, 0, 0, 0, 0, 0, 0 +-14, 0, 0, 0, 0, 0, 0, 0, 0 +-13, 0, 0, 0, 0, 0, 0, 0, 0 +-12, 0, 0, 0, 0, 0, 0, 0, 0 +-11, 0, 0, 0, 0, 0, 0, 0, 0 +-10, 0, 0, 0, 0, 0, 0, 0, 0 +-9, 0, 0, 0, 0, 0, 0, 0, 0 +-8, 0, 0, 0, 0, 0, 0, 0, 0 +-7, 0, 0, 0, 0, 0, 0, 1, 0 +-6, 0, 0, 0, 0, 0, 0, 3, 2 +-5, 0, 0, 1, 2, 0, 0, 3, 4 +-4, 0, 1, 3, 3, 4, 4, 6, 5 +-3, 0, 3, 7, 5, 2, 3, 6, 7 +-2, 3, 5, 5, 7, 7, 8, 12, 10 +-1, 3, 6, 10, 7, 5, 5, 13, 18 +0, 8, 10, 18, 19, 18, 18, 12, 20 +1, 6, 17, 17, 19, 10, 20, 12, 12 +2, 18, 14, 18, 13, 20, 14, 20, 16 +3, 18, 19, 19, 15, 15, 19, 18, 25 +4, 17, 14, 20, 23, 20, 21, 20, 24 +5, 18, 25, 30, 28, 24, 27, 26, 27 +6, 22, 19, 25, 29, 27, 30, 34, 35 +7, 31, 33, 37, 28, 28, 33, 29, 45 +8, 30, 34, 51, 46, 33, 46, 44, 59 +9, 42, 42, 59, 62, 57, 61, 55, 73 +10, 51, 54, 84, 69, 53, 71, 57, 118 +11, 67, 72, 107, 111, 89, 116, 95, 134 +12, 90, 115, 139, 137, 112, 127, 127, 138 +13, 115, 137, 153, 141, 142, 157, 143, 173 +14, 156, 159, 158, 154, 151, 160, 162, 183 +15, 172, 165, 206, 188, 178, 207, 183, 234 +16, 215, 198, 239, 232, 195, 224, 234, 274 +17, 244, 245, 274, 253, 248, 255, 273, 298 +18, 293, 277, 350, 301, 266, 315, 296, 342 +19, 338, 317, 322, 336, 332, 347, 356, 352 +20, 387, 365, 375, 342, 344, 352, 346, 331 +21, 398, 358, 392, 362, 361, 366, 388, 334 +22, 385, 372, 364, 329, 376, 349, 380, 343 +23, 396, 341, 370, 348, 366, 357, 366, 349 +24, 380, 368, 381, 352, 341, 341, 401, 338 +25, 417, 357, 432, 361, 397, 392, 404, 404 +26, 455, 389, 431, 373, 426, 399, 436, 393 +27, 459, 420, 415, 415, 418, 403, 465, 396 +28, 445, 463, 452, 390, 446, 440, 412, 411 +29, 459, 419, 410, 405, 432, 396, 408, 391 +30, 415, 396, 404, 418, 422, 395, 398, 362 +31, 406, 393, 342, 401, 389, 360, 335, 342 +32, 369, 348, 349, 341, 334, 337, 348, 322 +33, 339, 315, 309, 330, 338, 306, 310, 291 +34, 277, 321, 242, 285, 311, 306, 297, 266 +35, 230, 303, 197, 246, 262, 256, 202, 210 +36, 191, 254, 185, 213, 203, 217, 197, 169 +37, 164, 195, 136, 156, 189, 166, 161, 151 +38, 108, 175, 92, 146, 137, 138, 97, 132 +39, 71, 99, 74, 112, 103, 97, 86, 85 +40, 37, 66, 35, 90, 71, 57, 48, 59 +41, 15, 32, 16, 58, 35, 31, 22, 32 +42, 0, 25, 5, 36, 18, 10, 11, 20 +43, 0, 5, 0, 18, 5, 1, 2, 1 +44, 0, 0, 0, 5, 0, 0, 0, 0 +45, 0, 0, 0, 0, 0, 0, 0, 0 +46, 0, 0, 0, 0, 0, 0, 0, 0 +47, 0, 0, 0, 0, 0, 0, 0, 0 +48, 0, 0, 0, 0, 0, 0, 0, 0 +49, 0, 0, 0, 0, 0, 0, 0, 0 +50, 0, 0, 0, 0, 0, 0, 0, 0 +51, 0, 0, 0, 0, 0, 0, 0, 0 +52, 0, 0, 0, 0, 0, 0, 0, 0 +53, 0, 0, 0, 0, 0, 0, 0, 0 +54, 0, 0, 0, 0, 0, 0, 0, 0 +55, 0, 0, 0, 0, 0, 0, 0, 0 +56, 0, 0, 0, 0, 0, 0, 0, 0 +57, 0, 0, 0, 0, 0, 0, 0, 0 +58, 0, 0, 0, 0, 0, 0, 0, 0 +59, 0, 0, 0, 0, 0, 0, 0, 0 +60, 0, 0, 0, 0, 0, 0, 0, 0 +61, 0, 0, 0, 0, 0, 0, 0, 0 +62, 0, 0, 0, 0, 0, 0, 0, 0 +63, 0, 0, 0, 0, 0, 0, 0, 0 +64, 0, 0, 0, 0, 0, 0, 0, 0 +65, 0, 0, 0, 0, 0, 0, 0, 0 +66, 0, 0, 0, 0, 0, 0, 0, 0 +67, 0, 0, 0, 0, 0, 0, 0, 0 +68, 0, 0, 0, 0, 0, 0, 0, 0 +69, 0, 0, 0, 0, 0, 0, 0, 0 +70, 0, 0, 0, 0, 0, 0, 0, 0 +71, 0, 0, 0, 0, 0, 0, 0, 0 +72, 0, 0, 0, 0, 0, 0, 0, 0 +73, 0, 0, 0, 0, 0, 0, 0, 0 +74, 0, 0, 0, 0, 0, 0, 0, 0 +75, 0, 0, 0, 0, 0, 0, 0, 0 +76, 0, 0, 0, 0, 0, 0, 0, 0 +77, 0, 0, 0, 0, 0, 0, 0, 0 +78, 0, 0, 0, 0, 0, 0, 0, 0 +79, 0, 0, 0, 0, 0, 0, 0, 0 +80, 0, 0, 0, 0, 0, 0, 0, 0 +81, 0, 0, 0, 0, 0, 0, 0, 0 +82, 0, 0, 0, 0, 0, 0, 0, 0 +83, 0, 0, 0, 0, 0, 0, 0, 0 +84, 0, 0, 0, 0, 0, 0, 0, 0 +85, 0, 0, 0, 0, 0, 0, 0, 0 +86, 0, 0, 0, 0, 0, 0, 0, 0 +87, 0, 0, 0, 0, 0, 0, 0, 0 +88, 0, 0, 0, 0, 0, 0, 0, 0 +89, 0, 0, 0, 0, 0, 0, 0, 0 +90, 0, 0, 0, 0, 0, 0, 0, 0 +91, 0, 0, 0, 0, 0, 0, 0, 0 +92, 0, 0, 0, 0, 0, 0, 0, 0 +93, 0, 0, 0, 0, 0, 0, 0, 0 +94, 0, 0, 0, 0, 0, 0, 0, 0 +95, 0, 0, 0, 0, 0, 0, 0, 0 +96, 0, 0, 0, 0, 0, 0, 0, 0 +97, 0, 0, 0, 0, 0, 0, 0, 0 +98, 0, 0, 0, 0, 0, 0, 0, 0 +-------------------------------------------------------- \ No newline at end of file diff --git a/Buildings/Resources/src/ThermalZones/Detailed/Validation/BESTEST/simulateAndPlot.py b/Buildings/Resources/src/ThermalZones/Detailed/Validation/BESTEST/simulateAndPlot.py new file mode 100644 index 00000000000..c56530847f2 --- /dev/null +++ b/Buildings/Resources/src/ThermalZones/Detailed/Validation/BESTEST/simulateAndPlot.py @@ -0,0 +1,1112 @@ +#!/usr/bin/env python3 + +import matplotlib +matplotlib.use('Agg') + +import matplotlib.pyplot as plt + +import io +import json +import os +import sys +import shutil + +# If true, run simulations and not only the post processing. +DO_SIMULATIONS = True +# If true, delete the simulation result files. +CLEAN_MAT = True +# If true, temporary directories will be deleted. +DelTemDir = True + +CWD = os.getcwd() + +# BuildingsPy working branch. +# The working branch makes the communication points ('ncp') of jmodelica or optimica to be 8761, +# so that the regression test will generate high resolution results. +BP_BRANCH = 'issue335_high_ncp' +# simulator, JModelica and optimica are supported +TOOL = 'optimica' + +# standard data file +ASHRAE_DATA = './ASHRAE140_data.dat' +PACKAGE = 'Buildings.ThermalZones.Detailed.Validation.BESTEST' +CASES = ['Case600', 'Case600FF', 'Case610', 'Case620', 'Case630', 'Case640', 'Case650', 'Case650FF', \ + 'Case900', 'Case900FF', 'Case920', 'Case940', 'Case950', 'Case950FF', 'Case960'] + +plt.rc('axes', labelsize=9) +plt.rc('xtick', labelsize=9) +plt.rc('ytick', labelsize=9) +plt.rc('legend', fontsize=9) +plt.rcParams['axes.facecolor']='whitesmoke' + +def save_plot(figure, file_name): + """ Save the figure to a pdf and png file in the directory `img` + """ + + out_dir = "../../../../../Images/ThermalZones/Detailed/Validation/BESTEST" + if not os.path.exists(out_dir): + os.makedirs(out_dir) + figure.savefig(os.path.join(out_dir, '{}.pdf'.format(file_name))) + figure.savefig(os.path.join(out_dir, '{}.png'.format(file_name))) + plt.clf() + +def configure_axes(axes): + """ Configure the axis style + """ + axes.spines['right'].set_linewidth(0.25) + axes.spines['right'].set_color('lightgrey') + axes.spines['top'].set_visible(False) + axes.spines['left'].set_linewidth(0.25) + axes.spines['left'].set_color('lightgrey') + axes.spines['bottom'].set_visible(False) + axes.grid(color='lightgrey', linewidth=0.25) + return + +def create_library_directory(repoNam): + ''' Create directory to be as temporary directory to save library. + ''' + import tempfile + import getpass + if repoNam == 'MBL': + prefixName = 'tmp-MBL-' + else: + prefixName = 'tmp-BP-' + worDir = tempfile.mkdtemp( prefix=prefixName + getpass.getuser() ) + print("Created directory {}".format(worDir)) + return worDir + +def checkout_buildingspy_repository(working_directory): + ''' Clone buildingspy repository to working directory and checkout to target branch. + ''' + from git import Repo + import git + print("*** Checking out BuildingsPy repository branch {} ***".format(BP_BRANCH)) + git_url = "https://github.com/lbl-srg/BuildingsPy.git" + repo = Repo.clone_from(git_url, working_directory) + for sub_module in repo.submodules: + sub_module.update() + g = git.Git(working_directory) + g.checkout(BP_BRANCH) + +def copy_mbl(working_directory): + ''' Copy buildings library to working directory + ''' + # This is a hack to get the local copy of the buildings library repository + des = working_directory + shutil.rmtree(des) + print("*** Copying Buildings library to {}".format(des)) + mblPath = (os.path.sep).join((os.getcwd().split(os.path.sep))[:-7]) + shutil.copytree(mblPath, des) + +def _runTests(tool, package, lib_dir, bp_dir): + ''' Run regression test, return the temporary directory path for the test. + ''' + sys.path.insert(0, bp_dir) + import buildingspy.development.regressiontest as u + + ut = u.Tester(tool=tool, skip_verification=True) + ut.batchMode(True) + ut.pedanticModelica(True) + ut.showGUI(False) + ut.deleteTemporaryDirectories(False) + + path = os.path.join(lib_dir, 'Buildings') + + ut.setLibraryRoot(path) + if package is not None: + ut.setSinglePackage(package) + + # Run the regression tests + retVal = ut.run() + # List of temporary directories that were used to run the simulations + tempDir = ut._temDir + + return tempDir + +def _get_results_directory(lib_dir, bp_dir): + ''' Trigger the regression test, return the list of temporary directories of the regression tests. + ''' + resultDirs = list() + tempDirs = _runTests(TOOL, PACKAGE, lib_dir, bp_dir) + for tempDir in tempDirs: + resultDirs.append(tempDir) + return resultDirs + +def _move_results(resultDirs): + ''' Move the mat file from the temporary directory of regression test, to current directory. + ''' + mat_dir = os.path.join(CWD, 'mat') + if not os.path.exists(mat_dir): + os.makedirs(mat_dir) + + for resultDir in resultDirs: + haveMat = False + for file in os.listdir(resultDir): + if file.endswith('.mat'): + haveMat = True + source = os.path.join(resultDir, file) + destination = os.path.join(mat_dir, file) + shutil.copyfile(source, destination) + if not haveMat: + raise ValueError("*** There is no result file in tmp folder: {}. Check the simulation. ***".format(resultDir)) + + if DelTemDir: + shutil.rmtree(resultDir) + print("*** After moving the result file, deleted the temporary directory {} . ***".format(resultDir)) + else: + print("*** After moving the result file, kept the temporary directory {} . ***".format(resultDir)) + _clean_record_files() + +def _clean_record_files(): + files = os.listdir(CWD) + for item in files: + if item.endswith('.txt') or item.endswith('.c') \ + or item.endswith('.log') or item.endswith('sim'): + os.remove(os.path.join(CWD, item)) + if 'funnel_comp' in item: + shutil.rmtree(item) + +def _organize_cases(mat_dir): + ''' Create a list of dictionaries. Each dictionary include the case name and the mat file path. + ''' + matFiles = list() + for file in os.listdir(mat_dir): + if file.endswith('.mat'): + matFiles.append(file) + caseList = list() + if len(CASES) == len(matFiles): + for case in CASES: + temp = {'case': case} + for matFile in matFiles: + tester = '_{}_'.format(case) + if tester in matFile: + temp['matFile'] = os.path.join(mat_dir, matFile) + caseList.append(temp) + else: + raise ValueError("*** There is failed simulation and has no result file. Check the simulations. ***") + return caseList + +# -------------------------------------------------------------------------------------------------- +# Extract needed time series data from modelica simulation results +# -------------------------------------------------------------------------------------------------- +def _extract_data(matFile, relVal): + """ + Extract time series data from mat file. + + :param matFile: modelica simulation result path + :param relVal: list of variables that the data should be extracted + """ + from buildingspy.io.outputfile import Reader + from buildingspy.io.postprocess import Plotter + import re + + nPoi = 8761 + + try: + r = Reader(matFile, TOOL) + except IOError: + raise ValueError("Failed to read {}.".format(matFile)) + + result = list() + for var in relVal: + time = [] + val = [] + try: + var_mat = var + # Matrix variables in JModelica are stored in mat file with no space e.g. [1,1]. + var_mat = re.sub(' ', '', var_mat) + (time, val) = r.values(var_mat) + tMin = float(min(time)) + tMax = float(max(time)) + ti = _getTimeGrid(tMin, tMax, nPoi) + except KeyError: + raise ValueError("Result {} does not have variable {}.".format(matFile, var)) + else: + intVal = Plotter.interpolate(ti, time, val) + temp = {'variable': var, + 'time': ti, + 'value': intVal} + result.append(temp) + return result + +def _getTimeGrid(tMin, tMax, nPoi): + """ + Return the time grid for the output result interpolation + + :param tMin: Minimum time of the results. + :param tMax: Maximum time of the results. + :param nPoi: Number of result points. + """ + return [tMin + float(i) / (nPoi - 1) * (tMax - tMin) for i in range(nPoi)] + +def get_time_series_result(): + """ + Extract time series data and organize the data structure. + """ + mat_dir = os.path.join(CWD, 'mat') + # case name and the corresponded mat file path + cases = _organize_cases(mat_dir) + + results = list() + for case in cases: + temp = {'case': case['case']} + if 'FF' in case['case']: + # free floating cases + resVal = ['TRooHou.y', 'TRooAnn.y'] + else: + # cases with heating and cooling + resVal = ['PCoo.y', 'PHea.y', 'ECoo.y', 'EHea.y'] + # extract time and value of the variables + time_series_data = _extract_data(case['matFile'], resVal) + temp['result'] = time_series_data + results.append(temp) + if CLEAN_MAT: + shutil.rmtree('mat') + return results +# -------------------------------------------------------------------------------------------------- + +# -------------------------------------------------------------------------------------------------- +# Extract necessary data set from time series data set of modelica simulation results +# -------------------------------------------------------------------------------------------------- +def _find_date(day): + """ + Return the exactly date + + :param day: which day it is in the 365 days of one year + """ + if day > 0 and day<=31: + mon = 'Jan' + date = day + elif day>31 and day <= 59: + mon = 'Feb' + date = day - 31 + elif day > 59 and day <= 90: + mon = 'Mar' + date = day - 59 + elif day > 90 and day <= 120: + mon = 'Apr' + date = day - 90 + elif day > 120 and day <= 151: + mon = 'May' + date = day - 120 + elif day > 151 and day <= 181: + mon = 'Jun' + date = day - 151 + elif day > 181 and day <= 212: + mon = 'Jul' + date = day - 181 + elif day > 212 and day <= 243: + mon = 'Aug' + date = day - 212 + elif day > 243 and day <= 273: + mon = 'Sep' + date = day - 243 + elif day > 273 and day <= 304: + mon = 'Oct' + date = day - 273 + elif day > 304 and day <= 334: + mon = 'Nov' + date = day - 304 + else: + mon = 'Dec' + date = day - 334 + return '{}-{}'.format(int(date), mon) + +def _convert_to_dateHour(hour): + """ + Return the exactly date and hour in one year + + :param hour: which hour it is in the 8760 hours of one year + """ + import numpy as np + dayOfYear = np.floor(hour/24) + 1 + whichDate = _find_date(dayOfYear) + whichHour = hour - (dayOfYear-1)*24 + if hour > 8759: + whichDate = '31-Dec' + whichHour = 24.0 + return '{}:{}'.format(whichDate, int(whichHour)) + +def _find_peak(data, isTemp, flag): + """ + Find the peak value and when it is happens + + :param data: data set + :param flag: check it is maximum or minimum + """ + import numpy as np + valueSet = data['value'] + secondSet = data['time'] + if flag == 'max': + maxValue = max(valueSet) + value = '{:.1f}'.format(maxValue -273.15) if isTemp else '{:.3f}'.format(abs(maxValue / 1000)) + pos = _find_pos(valueSet, maxValue) + second_in_year = secondSet[pos] + hour_in_year = np.floor(second_in_year/3600) + else: + minValue = _min_temperature(valueSet) if isTemp else min(valueSet) + value = '{:.1f}'.format(minValue -273.15) if isTemp else '{:.3f}'.format(abs(minValue / 1000)) + pos = _find_pos(valueSet, minValue) + second_in_year = secondSet[pos] + hour_in_year = np.floor(second_in_year/3600) + dateHour = _convert_to_dateHour(hour_in_year) + return {'value': value, 'hour': dateHour} + +def _min_temperature(data): + minTemp = 273.15 + 100 + for i in range(len(data)): + ithTemp = data[i] + if ithTemp > 150 and ithTemp < minTemp: + minTemp = ithTemp + return minTemp + +def _find_pos(data, value): + pos = 1e+10 + for i in range(len(data)): + if data[i] == value: + pos = i + return pos + +def _find_load(dataSet): + """ + Return the load profile by adding the heating load an cooling load + + :param dataSet: data set in which heating and cooling load should be summed to a load + """ + for varVal in dataSet: + if varVal['variable'] == 'PCoo.y': + cooLoa = varVal['value'] + if varVal['variable'] == 'PHea.y': + heaLoa = varVal['value'] + load = list() + for i in range(len(cooLoa)): + load.append(cooLoa[i] + heaLoa[i]) + return load + +def _find_data_bin(dataSet): + import numpy as np + totalBin = 98+50+1 + results = list() + results = ['0' for i in range(totalBin)] + results = np.zeros(totalBin) + for i in range(totalBin-1): + lowTem = i - 50 + counter = 0 + for j in range(len(dataSet)): + degC = dataSet[j] - 273.15 + if degC >= lowTem and degC < lowTem + 1: + counter += 1 + results[i] = '{}'.format(int(counter)) + return results + +def get_mo_data(data_set): + MWh = 3600*1e6 + results = list() + for data in data_set: + temp = {'case': data['case']} + # free-floating cases + if 'FF' in data['case']: + for varVal in data['result']: + if varVal['variable'] == 'TRooAnn.y': + annAveTemp = varVal['value'][-1] + else: + peaMax = _find_peak(varVal, True, 'max') + peaMin = _find_peak(varVal, True, 'min') + Jan4 = varVal['value'][73:97] + Jul27 = varVal['value'][4969:4993] + binData = _find_data_bin(varVal['value']) + temp1 = {'annAveTem': '{:.1f}'.format(annAveTemp-273.15), + 'peaMax': peaMax, + 'peaMin': peaMin, + 'Jan4': ['{:.2f}'.format(ele - 273.15) for ele in Jan4], + 'Jul27': ['{:.2f}'.format(ele - 273.15) for ele in Jul27], + 'binData': binData} + else: + for varVal in data['result']: + if varVal['variable'] == 'PCoo.y': + pCoo = _find_peak(varVal, False, 'min') + elif varVal['variable'] == 'PHea.y': + pHea = _find_peak(varVal, False, 'max') + elif varVal['variable'] == 'ECoo.y': + eCoo = varVal['value'][-1] + else: + eHea = varVal['value'][-1] + load = _find_load(data['result']) + temp1 = {'peaCoo': pCoo, + 'peaHea': pHea, + 'Jan4': ['{:.2f}'.format(ele / 1000) for ele in load[73:97]], + 'eCoo': '{:.3f}'.format(abs(eCoo / MWh)), + 'eHea': '{:.3f}'.format(abs(eHea / MWh))} + temp['extData'] = list() + temp['extData'].append(temp1) + results.append(temp) + return results + +def _filter_cases(caseType): + """ + Return free-floating or not free-floating cases list + + :param caseType: case type, 'free-float' or 'non-free-float' + """ + caseList = list() + for case in CASES: + if caseType == 'free-float': + if 'FF' in case: + caseList.append(case) + else: + if 'FF' not in case: + caseList.append(case) + return caseList +# -------------------------------------------------------------------------------------------------- + +# -------------------------------------------------------------------------------------------------- +# Read ASHRAE140 data from external file and write it to a dictionary +# -------------------------------------------------------------------------------------------------- +def parse_standard_data(): + dataList = get_data_list() + _add_data(dataList) + _filter_data_set(dataList) + _refactor_data_structure(dataList) + return dataList + +def _value_and_hour(peakList): + """ + Return dictionary of the peak value and the hour + + :param peakList: list of peak value and the hour, the element has the form like '64.9(17-Oct:15)' + """ + peakValue = list() + peakHour = list() + for i in range(len(peakList)): + peak = peakList[i] + if '(' in peak: + leftBra = peak.index('(') + value = peak[0:leftBra] + hour = peak[leftBra+1:-1] + else: + value = peak + hour = 'N/A' + peakValue.append(value) + peakHour.append(hour) + return {'value': peakValue, 'hour': peakHour} + +def get_data_list(): + """ + Return structure of the standard data list + """ + allTool = ['ESP/DMU', 'BLAST/US-IT', 'DOE21D/NREL', 'SRES-SUN/NREL', \ + 'SRES/BRE', 'S3PAS/SPAIN', 'TSYS/BEL-BRE', 'TASE/FINLAND'] + lessTool = ['ESP/DMU', 'BLAST/US-IT', 'DOE21D/NREL', 'SRES-SUN/NREL', \ + 'S3PAS/SPAIN', 'TSYS/BEL-BRE', 'TASE/FINLAND'] + dataList = list() + dataList.append({'data_set': 'annual_heating', \ + 'data_head': '# Table B8-1. Annual Heating Loads (MWh)', \ + 'tools': allTool}) + dataList.append({'data_set': 'annual_cooling', \ + 'data_head': '# Table B8-2. Annual Sensible Cooling Loads (MWh)', \ + 'tools': allTool}) + dataList.append({'data_set': 'peak_heating', \ + 'data_head': '# Table B8-3. Annual Hourly Integrated Peak Heating Loads (kW)', \ + 'tools': lessTool}) + dataList.append({'data_set': 'peak_cooling', \ + 'data_head': '# Table B8-4. Annual Hourly Integrated Peak Sensible Cooling Loads (kW)', \ + 'tools': lessTool}) + dataList.append({'data_set': 'max_temperature', \ + 'data_head': '# MAXIMUM ANNUAL HOURLY INTEGRATED ZONE TEMPERATURE', \ + 'tools': lessTool}) + dataList.append({'data_set': 'min_temperature', \ + 'data_head': '# MINIMUM ANNUAL HOURLY INTEGRATED ZONE TEMPERATURE', \ + 'tools': lessTool}) + dataList.append({'data_set': 'ave_temperature', \ + 'data_head': '# AVERAGE ANNUAL HOURLY INTEGRATED ZONE TEMPERATURE', \ + 'tools': allTool}) + dataList.append({'data_set': 'FF_temperature_600FF_Jan4', \ + 'data_head': '# HOURLY FREE FLOAT TEMPERATURE DATA (degC): CASE 600FF, JAN 4', \ + 'tools': lessTool}) + dataList.append({'data_set': 'FF_temperature_900FF_Jan4', \ + 'data_head': '# HOURLY FREE FLOAT TEMPERATURE DATA (degC): CASE 900FF, JAN 4', \ + 'tools': lessTool}) + dataList.append({'data_set': 'FF_temperature_650FF_Jul27', \ + 'data_head': '# HOURLY FREE FLOAT TEMPERATURE DATA (degC): CASE 650FFV, JULY 27', \ + 'tools': lessTool}) + dataList.append({'data_set': 'FF_temperature_950FF_Jul27', \ + 'data_head': '# HOURLY FREE FLOAT TEMPERATURE DATA (degC): CASE 950FFV, JULY 27', \ + 'tools': lessTool}) + dataList.append({'data_set': 'hourly_load_600_Jan4', \ + 'data_head': '# HOURLY HEATING & COOLING LOAD DATA (kWh): CASE 600 JAN 4', \ + 'tools': lessTool}) + dataList.append({'data_set': 'hourly_load_900_Jan4', \ + 'data_head': '# HOURLY HEATING & COOLING LOAD DATA (kWh): CASE 900 JAN 4', \ + 'tools': lessTool}) + dataList.append({'data_set': 'bin_temperature_900FF', \ + 'data_head': '# HOURLY ANNUAL ZONE TEMPERATURE BIN DATA (hours): CASE 900FF', \ + 'tools': allTool}) + return dataList + +def _add_data(dataList): + """ + Add the standard data to the data structure + + :param dataList: the structure to be added data into it + """ + data_file = open(ASHRAE_DATA) + count = 0 + startLine = 0 + table_end = True + data_head = '' + for line in data_file: + count += 1 + for i in range(len(dataList)): + if dataList[i]['data_head'] in line: + singleTable = dataList[i] + data_head = singleTable['data_head'] + startLine = count + 2 + table_end = False + temp = list() + if '-----' in line: + table_end = True + startLine = 0 + data_head = '' + singleTable['data'] = temp + if count >= startLine and startLine > 0 and not table_end: + data = get_line_data(line, singleTable) + temp.append(data) + data_file.close() + +def get_line_data(line, table): + """ + Return the data from one line, as dictionary like {'name': 'Case600', 'value': []} + + :param line: the line text to be parsed + :param table: table type + """ + data_set = table['data_set'] + # split the line + lineList = [ele.strip() for ele in line.split(',')] + for i in range(len(lineList)): + if lineList[i] == 'N/A': + lineList[i] = '0.000' + # annual heating/cooling energy, or, average temperature for free-floating cases + if 'annual_' in data_set or 'ave_' in data_set: + temp = {'firstCol': 'Case{}'.format(lineList[0])} + temp['value'] = lineList[1:] + # peak heating/cooling load, or maximum or minimum temperature of free-floating cases + # it should also have entries of 'hour' or when it happens + elif 'peak_' in data_set or 'max_' in data_set or 'min_' in data_set: + temp = {'firstCol': 'Case{}'.format(lineList[0])} + # remove the 5th item + lineList.pop(5) + resultsList = lineList[1:] + valueHour = _value_and_hour(resultsList) + temp['value'] = valueHour['value'] + temp['hour'] = valueHour['hour'] + # 24-hour profile of free-floating temperature, or load + elif 'FF_temperature' in data_set or 'hourly_load' in data_set: + temp = {'firstCol': lineList[0]} + lineList.pop(5) + temp['value'] = lineList[1:] + # hourly temperature bin data + else: + temp = {'firstCol': lineList[0]} + temp['value'] = lineList[1:] + return temp + +def _refactor_data_structure(dataList): + """ + Transpose of the standard data set + + :param dataList: standard data set + """ + for ele in dataList: + data = ele['data'] + col_1 = list() + col_2 = list() + col_3 = list() + col_4 = list() + col_5 = list() + col_6 = list() + col_7 = list() + col_8 = list() + col_9 = list() + + col_1_hr = list() + col_2_hr = list() + col_3_hr = list() + col_4_hr = list() + col_5_hr = list() + col_6_hr = list() + col_7_hr = list() + col_8_hr = list() + haveHour = False + allTool = False + for row in data: + col_1.append(row['firstCol']) + col_2.append(row['value'][0]) + col_3.append(row['value'][1]) + col_4.append(row['value'][2]) + col_5.append(row['value'][3]) + col_6.append(row['value'][4]) + col_7.append(row['value'][5]) + col_8.append(row['value'][6]) + if len(row['value']) > 7: + allTool = True + col_9.append(row['value'][7]) + if 'hour' in row: + haveHour = True + col_1_hr.append(row['hour'][0]) + col_2_hr.append(row['hour'][1]) + col_3_hr.append(row['hour'][2]) + col_4_hr.append(row['hour'][3]) + col_5_hr.append(row['hour'][4]) + col_6_hr.append(row['hour'][5]) + col_7_hr.append(row['hour'][6]) + if allTool: + col_8_hr.append(row['hour'][7]) + ele['data'] = list() + temp = {'firstCol': col_1} + temp['ESP/DMU'] = col_2 + temp['BLAST/US-IT'] = col_3 + temp['DOE21D/NREL'] = col_4 + temp['SRES-SUN/NREL'] = col_5 + if allTool: + temp['SRES/BRE'] = col_6 + temp['S3PAS/SPAIN'] = col_7 + temp['TSYS/BEL-BRE'] = col_8 + temp['TASE/FINLAND'] = col_9 + else: + temp['S3PAS/SPAIN'] = col_6 + temp['TSYS/BEL-BRE'] = col_7 + temp['TASE/FINLAND'] = col_8 + if haveHour: + temp['ESP/DMU_hour'] = col_1_hr + temp['BLAST/US-IT_hour'] = col_2_hr + temp['DOE21D/NREL_hour'] = col_3_hr + temp['SRES-SUN/NREL_hour'] = col_4_hr + if allTool: + temp['SRES/BRE_hour'] = col_5_hr + temp['S3PAS/SPAIN_hour'] = col_6_hr + temp['TSYS/BEL-BRE_hour'] = col_7_hr + temp['TASE/FINLAND_hour'] = col_8_hr + else: + temp['S3PAS/SPAIN_hour'] = col_5_hr + temp['TSYS/BEL-BRE_hour'] = col_6_hr + temp['TASE/FINLAND_hour'] = col_7_hr + ele['data'].append(temp) + +def _filter_data_set(dataList): + """ + Filter the standard data set so to keep only the cases that are simulated in modelica buildings library + + :param dataList: the set of entire standard data + """ + for ele in dataList: + table_name = ele['data_set'] + if 'annual_' in table_name or 'ave_' in table_name or \ + 'peak_' in table_name or 'max_' in table_name or 'min_' in table_name: + temp = list() + for case in CASES: + for data in ele['data']: + if case == data['firstCol']: + temp.append(data) + ele['data'] = list() + ele['data'] = temp +# -------------------------------------------------------------------------------------------------- + +# -------------------------------------------------------------------------------------------------- +# Add modelica simulation results to ASHRAE-140 data set +# -------------------------------------------------------------------------------------------------- +def combine_data(standard_data, moData): + """ + Add modelica buildings library simulation results to standard results set + + :param standard_data: data set from ASHRAE-140 + :param moData: data set extract from Modelica simulation + """ + tool = 'MBL/LBNL' + temp = list() + for i in range(len(standard_data)): + ithData = standard_data[i] + data_set = ithData['data_set'] + if 'annual_heating' in data_set: + temp.append(_add_to_standard('eHea', moData, ithData, tool, False)) + if 'annual_cooling' in data_set: + temp.append(_add_to_standard('eCoo', moData, ithData, tool, False)) + if 'peak_heating' in data_set: + temp.append(_add_to_standard('peaHea', moData, ithData, tool, True)) + if 'peak_cooling' in data_set: + temp.append(_add_to_standard('peaCoo', moData, ithData, tool, True)) + if 'max_temperature' in data_set: + temp.append(_add_to_standard('peaMax', moData, ithData, tool, True)) + if 'min_temperature' in data_set: + temp.append(_add_to_standard('peaMin', moData, ithData, tool, True)) + if 'ave_temperature' in data_set: + temp.append(_add_to_standard('annAveTem', moData, ithData, tool, False)) + if 'FF_temperature_600FF_Jan4' in data_set or \ + 'FF_temperature_900FF_Jan4' in data_set or \ + 'hourly_load_600_Jan4' in data_set or \ + 'hourly_load_900_Jan4' in data_set: + temp.append(_addSingleCase_to_standard('Jan4', data_set, moData, ithData, tool)) + if 'FF_temperature_650FF_Jul27' in data_set or \ + 'FF_temperature_950FF_Jul27' in data_set: + temp.append(_addSingleCase_to_standard('Jul27', data_set, moData, ithData, tool)) + if 'bin_temperature_900FF' in data_set: + temp.append(_addSingleCase_to_standard('binData', data_set, moData, ithData, tool)) + return temp + +def _add_to_standard(keyWord, moData, oneSet, tool, haveHour): + newSet = oneSet + temp = list() + tools = list() + for ele in newSet['tools']: + tools.append(ele) + tools.append(tool) + if haveHour: + temp_hour = list() + tool_hour = '{}_hour'.format(tool) + for case in newSet['data'][0]['firstCol']: + for caseData in moData: + if caseData['case'] == case: + extVal = caseData['extData'][0][keyWord] + if haveHour: + temp.append(extVal['value']) + temp_hour.append(extVal['hour']) + else: + temp.append(extVal) + newSet['tools'] = tools + newSet['data'][0][tool] = temp + if haveHour: + newSet['data'][0][tool_hour] = temp_hour + return newSet + +def _addSingleCase_to_standard(keyWord, table_name, moData, oneSet, tool): + newSet = oneSet + tools = list() + for ele in newSet['tools']: + tools.append(ele) + tools.append(tool) + textList = ['Case{}'.format(ele) for ele in table_name.split('_')] + curCase = '' + for case in CASES: + for singleText in textList: + if case == singleText: + curCase = case + for caseData in moData: + if caseData['case'] == curCase: + newSet['data'][0][tool] = caseData['extData'][0][keyWord] + newSet['tools'] = tools + return newSet +# -------------------------------------------------------------------------------------------------- + +# -------------------------------------------------------------------------------------------------- +# Generate plots +# -------------------------------------------------------------------------------------------------- +def bar_compare(data, yLabel, minimum, maximum): + import numpy as np + + tools = ['ESP/DMU', 'BLAST/US-IT', 'DOE21D/NREL', 'SRES-SUN/NREL', \ + 'SRES/BRE', 'S3PAS/SPAIN', 'TSYS/BEL-BRE', 'TASE/FINLAND', 'MBL/LBNL'] + fillColor = plt.get_cmap('tab20c') + yLim = [minimum, maximum] + pltName = data['data_set'] + plt.clf() + fig, ax = plt.subplots(figsize=(10,5)) + dataSet = data['data'][0] + cases = dataSet['firstCol'] + toolData = dict() + for i in range(len(tools)): + if tools[i] in dataSet: + toolData[tools[i]] = [float(ele) for ele in dataSet[tools[i]]] + # total number of tools + totalTool = len(toolData) + keySet = list() + for key in toolData: + keySet.append(key) + # total number of bar sets + index = np.arange(len(cases)) + + bar_width = 0.08 + opacity = 0.8 + staPos = 0 + for i in range(totalTool): + fColor = 'k' if i == totalTool-1 else fillColor(i) + ax.bar(index + staPos, toolData[keySet[i]], bar_width, alpha=opacity, color=fColor, label=keySet[i]) + staPos = staPos + bar_width + ax.set_ylim(yLim) + ax.set_ylabel(yLabel) + ax.set_xticks(index + (totalTool-1)*bar_width/2) + ax.set_xticklabels(cases, rotation=90) + fig.legend(loc='lower left', frameon=True, bbox_to_anchor=(0, 1.01, 1, 0.2), ncol = 5, mode = 'expand', bbox_transform=ax.transAxes) + # fig.legend(loc='lower center', frameon=True, bbox_to_anchor=(0.2, -0.02, 1.0, 0.2), ncol = 5, mode = 'expand', bbox_transform=fig.transFigure) + ax.grid(color='lightgrey', axis='y', linewidth=0.25) + + for spine in ax.spines.values(): + spine.set_visible(False) + plt.tick_params(axis=u'x', which=u'both', length=0) + plt.subplots_adjust(bottom=0.2) + for spine in plt.gca().spines.values(): + spine.set_visible(False) + save_plot(plt, pltName) + +def plot_lines(data, xLabel, yLabel, xMin, xMax, dx, yMin, yMax): + import numpy as np + tools = ['ESP/DMU', 'BLAST/US-IT', 'DOE21D/NREL', 'SRES-SUN/NREL', \ + 'SRES/BRE', 'S3PAS/SPAIN', 'TSYS/BEL-BRE', 'TASE/FINLAND', 'MBL/LBNL'] + lineColor = plt.get_cmap('tab20c') + lineMarker = ['.', ',', 'o', 's', 'p', '*', 'x', '+', 'd'] + pltName = data['data_set'] + plt.clf() + _,ax = plt.subplots(figsize=(10,5)) + configure_axes(ax) + dataSet = data['data'][0] + xSet = [float(ele) for ele in dataSet['firstCol']] + xticks = np.arange(xMin, xMax, dx) + toolData = dict() + for i in range(len(tools)): + if tools[i] in dataSet: + toolData[tools[i]] = [float(ele) for ele in dataSet[tools[i]]] + # total number of tools + totalTool = len(toolData) + keySet = list() + for key in toolData: + keySet.append(key) + for i in range(totalTool): + lineCo = 'k' if i==totalTool-1 else lineColor(i) + lineWt = 1.0 if i==totalTool-1 else 0.5 + markerShape = 'd' if i==totalTool-1 else lineMarker[i] + ax.plot(xSet, toolData[keySet[i]], color=lineCo, label=keySet[i], linewidth=lineWt, marker=markerShape, markersize=4) + ax.set_xticks(xticks) + ax.set_xlim([xMin, xMax]) + ax.set_ylim([yMin, yMax]) + ax.set_xlabel(xLabel) + ax.set_ylabel(yLabel) + ax.legend(loc='lower left', frameon=True, bbox_to_anchor=(0, 1.01, 1, 0.2), ncol = 5, mode = 'expand', bbox_transform=ax.transAxes) + save_plot(plt, pltName) + +def plot_figures(comDat): + barPlot_variable = ['annual_heating', 'annual_cooling', 'peak_heating', 'peak_cooling', \ + 'max_temperature', 'min_temperature', 'ave_temperature'] + barPlot_yLabel = ['Annual Heating Load [MWh]', 'Annual Cooling Load [MWh]', 'Peak Heating Load [kW]', 'Peak Cooling Load [kW]', \ + 'Maximum Temperature [degC]', 'Minimum Temperature [degC]', 'Average Temperature [degC]'] + barPlot_yMin = [0, 0, 0, 0, 0, -25, 0] + barPlot_yMax = [8, 9, 8, 8, 80, 10, 35] + line_variable = ['FF_temperature_600FF_Jan4', 'FF_temperature_900FF_Jan4', 'FF_temperature_650FF_Jul27', \ + 'FF_temperature_950FF_Jul27', 'hourly_load_600_Jan4', 'hourly_load_900_Jan4', 'bin_temperature_900FF'] + line_xLable = ['Hour of Day (Case600FF, Jan4)', 'Hour of Day (Case900FF, Jan4)', 'Hour of Day (Case650FF, Jul27)', \ + 'Hour of Day (Case950FF, Jul27)', 'Hour of Day (Case600, Jan4)', 'Hour of Day (Case900, Jan4)', 'Temperature Bins [degC] (Case900FF)'] + line_yLable = ['Temperature [degC]', 'Temperature [degC]', 'Temperature [degC]', 'Temperature [degC]', \ + 'Heating or Cooling Load [kW]', 'Heating or Cooling Load [kW]', 'Number of Occurrences'] + line_xMin = [1, 1, 1, 1, 1, 1, -10] + line_xMax = [24, 24, 24, 24, 24, 24, 50] + line_dx = [1, 1, 1, 1, 1, 1, 5] + line_yMin = [-30, -30, 0, 0, -4, 0, 0] + line_yMax = [40, 40, 60, 60, 5, 4, 500] + + for i in range(len(comDat)): + data = comDat[i] + if i < 7: + for j in range(len(barPlot_variable)): + if data['data_set'] == barPlot_variable[j]: + bar_compare(data, barPlot_yLabel[j], barPlot_yMin[j], barPlot_yMax[j]) + else: + for k in range(len(line_variable)): + if data['data_set'] == line_variable[k]: + plot_lines(data, line_xLable[k], line_yLable[k], line_xMin[k], line_xMax[k], line_dx[k], line_yMin[k], line_yMax[k]) +# -------------------------------------------------------------------------------------------------- + +# -------------------------------------------------------------------------------------------------- +# Generate html tables +# -------------------------------------------------------------------------------------------------- +def update_html_tables(comDat): + allTools = ''' + +Case +ESP/DMU +BLAST/US-IT +DOE21D/NREL +SRES-SUN/NREL +SRES/BRE +S3PAS/SPAIN +TSYS/BEL-BRE +TASE/FINLAND +MBL/LBNL +''' + lessTools = ''' + +Case +ESP/DMU +BLAST/US-IT +DOE21D/NREL +SRES-SUN/NREL +S3PAS/SPAIN +TSYS/BEL-BRE +TASE/FINLAND +MBL/LBNL +''' + loadContent = _generate_load_tables(comDat, allTools, lessTools) + ffContent = _generate_ff_tables(comDat, lessTools) + userGuideFile = "../../../../../../ThermalZones/Detailed/Validation/BESTEST/UsersGuide.mo" + moFile = open(userGuideFile) + beforeTables = '' + betweenTables = '' + afterTables = '' + startSec = True + midSec = False + endSec = False + for line in moFile: + if startSec: + beforeTables = beforeTables + line + if ('' in line): + startSec = False + if ('' in line): + midSec = True + if midSec: + betweenTables = betweenTables + line + if ('' in line): + midSec = False + if ('' in line): + endSec = True + if endSec: + afterTables = afterTables + line + moFile.close() + newMoContent = beforeTables + loadContent \ + + betweenTables + ffContent \ + + afterTables + with open(userGuideFile, 'wt') as f: + f.write(newMoContent) + +def _generate_load_tables(comDat, allTools, lessTools): + for ele in comDat: + setName = ele['data_set'] + if setName == 'annual_cooling': + annCoo = ele + if setName == 'annual_heating': + annHea = ele + if setName == 'peak_cooling': + peaCoo = ele + if setName == 'peak_heating': + peaHea = ele + tableText = ''' +''' + allTools + # add annual heating load data + annHeaLoa = _write_table_content(annHea) + tableText = tableText + annHeaLoa + # add annual cooling load data + tableText = tableText + '''''' + tableText = tableText + allTools + annCooLoa = _write_table_content(annCoo) + tableText = tableText + annCooLoa + '''
Annual heating load (MWh)
Annual cooling load (MWh)
+
''' + + peakUnits = ''' + +kWhour +kWhour +kWhour +kWhour +kWhour +kWhour +kWhour +kWhour +''' + # add peak heating load data + tableText = tableText + ''' + +''' + tableText = tableText + lessTools + peakUnits + peaHeaLoa = _write_table_content(peaHea) + tableText = tableText + peaHeaLoa + # add peak cooling load data + tableText = tableText + '''''' + tableText = tableText + lessTools + peakUnits + peaCooLoa = _write_table_content(peaCoo) + tableText = tableText + peaCooLoa + '''
Peak heating load (kW)
Peak cooling load (kW)
+
+''' + return tableText + +def _generate_ff_tables(comDat, lessTools): + for ele in comDat: + setName = ele['data_set'] + if setName == 'max_temperature': + maxTem = ele + if setName == 'min_temperature': + minTem = ele + peakUnits = ''' + +°Chour +°Chour +°Chour +°Chour +°Chour +°Chour +°Chour +°Chour +''' + tableText = ''' +''' + lessTools + peakUnits + # add maximum temperature data + maxTemData = _write_table_content(maxTem) + tableText = tableText + maxTemData + # add minimum temperature data + tableText = tableText + '''''' + tableText = tableText + lessTools + peakUnits + minTemData = _write_table_content(minTem) + tableText = tableText + minTemData + '''
Maximum temperature (°C)
Minimum temperature (°C)
+
+''' + return tableText + +def _write_table_content(dataSet): + setName = dataSet['data_set'] + data = dataSet['data'][0] + tools = dataSet['tools'] + outText = '' + for i in range(len(data['firstCol'])): + temp = "" + os.linesep + temp = temp + "{}".format(data['firstCol'][i]) + os.linesep + for j in range(len(tools)): + tool = tools[j] + temp = temp + "{}".format(data[tool][i]) + os.linesep + if 'peak_' in setName or 'max_' in setName or 'min_' in setName: + toolHour = '{}_hour'.format(tool) + temp = temp + "{}".format(data[toolHour][i]) + os.linesep + temp = temp + "" + os.linesep + outText = outText + temp + return outText +# -------------------------------------------------------------------------------------------------- + +if __name__=="__main__": + + if DO_SIMULATIONS: + # create directory to be as temporary buildings library directory + mbl_dir = create_library_directory('MBL') + copy_mbl(mbl_dir) + + # create directory to be as temporary buildingspy directory + bp_dir = create_library_directory('BP') + checkout_buildingspy_repository(bp_dir) + + # find temporary directories that were used for run simulations + resultDirs = _get_results_directory(mbl_dir, bp_dir) + shutil.rmtree(mbl_dir) + shutil.rmtree(bp_dir) + + # move the mat files to current working directory + _move_results(resultDirs) + + # get time series data from the mat file + time_series_data = get_time_series_result() + + # from the time series data, get the datas used for comparison + moData = get_mo_data(time_series_data) + + # parse standard data + standard_data = parse_standard_data() + + # add data simulated with modelica buildings library, to the standard data + comDat = combine_data(standard_data, moData) + + plot_figures(comDat) + + # write html tables to mo file + update_html_tables(comDat) diff --git a/Buildings/ThermalZones/Detailed/Validation/BESTEST/BaseClasses/DaySchedule.mo b/Buildings/ThermalZones/Detailed/Validation/BESTEST/BaseClasses/DaySchedule.mo index 7cfc2851d95..edf69df6c33 100644 --- a/Buildings/ThermalZones/Detailed/Validation/BESTEST/BaseClasses/DaySchedule.mo +++ b/Buildings/ThermalZones/Detailed/Validation/BESTEST/BaseClasses/DaySchedule.mo @@ -1,18 +1,9 @@ within Buildings.ThermalZones.Detailed.Validation.BESTEST.BaseClasses; model DaySchedule "Schedule that repeats every day" - extends Modelica.Blocks.Sources.CombiTimeTable( - final tableOnFile=false, - final tableName="NoName", - final fileName="NoName", - final columns=2:size(table, 2), - final smoothness=Modelica.Blocks.Types.Smoothness.LinearSegments, - final extrapolation=if size(table, 1) == 1 - then - Modelica.Blocks.Types.Extrapolation.HoldLastPoint - else - Modelica.Blocks.Types.Extrapolation.Periodic, - final offset=fill(0, size(table, 2)-1), - final startTime=0); + extends Buildings.Controls.OBC.CDL.Continuous.Sources.TimeTable( + final smoothness=Buildings.Controls.OBC.CDL.Types.Smoothness.LinearSegments, + final extrapolation=Buildings.Controls.OBC.CDL.Types.Extrapolation.Periodic, + final offset=fill(0, size(table, 2)-1)); annotation (Documentation(info="

Time schedule that is used for set points. diff --git a/Buildings/ThermalZones/Detailed/Validation/BESTEST/Cases6xx/Case600.mo b/Buildings/ThermalZones/Detailed/Validation/BESTEST/Cases6xx/Case600.mo index 9253a19ffb5..6a337f13377 100644 --- a/Buildings/ThermalZones/Detailed/Validation/BESTEST/Cases6xx/Case600.mo +++ b/Buildings/ThermalZones/Detailed/Validation/BESTEST/Cases6xx/Case600.mo @@ -6,26 +6,31 @@ model Case600 "Case 600FF, but with dual-setpoint for heating and cooling" annualCoo(Min=-6.137*3.6e9, Max=-7.964*3.6e9, Mean=-6.832*3.6e9), peakHea(Min=3.437*1000, Max=4.354*1000, Mean=4.000*1000), peakCoo(Min=-5.965*1000, Max=-6.827*1000, Mean=-6.461*1000))); - Controls.Continuous.LimPID conHea( + Buildings.Controls.OBC.CDL.Continuous.LimPID conHea( Td=60, - initType=Modelica.Blocks.Types.InitPID.InitialState, + yMax=1, + yMin=0, + initType=Buildings.Controls.OBC.CDL.Types.Init.InitialState, Ti=300, - controllerType=Modelica.Blocks.Types.SimpleController.PI, + controllerType=Buildings.Controls.OBC.CDL.Types.SimpleController.PI, k=0.1) "Controller for heating" annotation (Placement(transformation(extent={{-72,30},{-64,38}}))); - Controls.Continuous.LimPID conCoo( + Buildings.Controls.OBC.CDL.Continuous.LimPID conCoo( Td=60, + yMax=1, + yMin=0, reverseAction=true, - initType=Modelica.Blocks.Types.InitPID.InitialState, + initType=Buildings.Controls.OBC.CDL.Types.Init.InitialState, Ti=300, - controllerType=Modelica.Blocks.Types.SimpleController.PI, + controllerType=Buildings.Controls.OBC.CDL.Types.SimpleController.PI, k=0.1) "Controller for cooling" annotation (Placement(transformation(extent={{-72,8},{-64,16}}))); - Modelica.Blocks.Math.Gain gaiHea(k=1E6) "Gain for heating" + Buildings.Controls.OBC.CDL.Continuous.Gain gaiHea(k=1E6) "Gain for heating" annotation (Placement(transformation(extent={{-58,30},{-50,38}}))); - Modelica.Blocks.Math.Gain gaiCoo(k=-1E6) "Gain for cooling" + Buildings.Controls.OBC.CDL.Continuous.Gain gaiCoo(k=-1E6) "Gain for cooling" annotation (Placement(transformation(extent={{-58,8},{-50,16}}))); - Modelica.Blocks.Math.Sum sum1(nin=2) + Modelica.Blocks.Math.Sum sumHeaCoo(nin=2) + "Sum of heating and cooling heat flow rate" annotation (Placement(transformation(extent={{-20,20},{-12,28}}))); Modelica.Blocks.Routing.Multiplex2 multiplex2 annotation (Placement(transformation(extent={{-36,20},{-28,28}}))); @@ -66,51 +71,51 @@ equation color={0,0,127}, smooth=Smooth.None)); connect(conHea.y,gaiHea. u) annotation (Line( - points={{-63.6,34},{-58.8,34}}, + points={{-63.2,34},{-58.8,34}}, color={0,0,127}, smooth=Smooth.None)); connect(conCoo.y,gaiCoo. u) annotation (Line( - points={{-63.6,12},{-58.8,12}}, + points={{-63.2,12},{-58.8,12}}, color={0,0,127}, smooth=Smooth.None)); connect(gaiHea.y,multiplex2. u1[1]) annotation (Line( - points={{-49.6,34},{-42,34},{-42,26.4},{-36.8,26.4}}, + points={{-49.2,34},{-42,34},{-42,26.4},{-36.8,26.4}}, color={0,0,127}, smooth=Smooth.None)); connect(gaiCoo.y,multiplex2. u2[1]) annotation (Line( - points={{-49.6,12},{-42,12},{-42,21.6},{-36.8,21.6}}, + points={{-49.2,12},{-42,12},{-42,21.6},{-36.8,21.6}}, color={0,0,127}, smooth=Smooth.None)); - connect(multiplex2.y,sum1.u) annotation (Line( + connect(multiplex2.y, sumHeaCoo.u) annotation (Line( points={{-27.6,24},{-20.8,24}}, color={0,0,127}, smooth=Smooth.None)); - connect(sum1.y,preHea. Q_flow) annotation (Line( + connect(sumHeaCoo.y, preHea.Q_flow) annotation (Line( points={{-11.6,24},{-6,24}}, color={0,0,127}, smooth=Smooth.None)); connect(EHea.u,gaiHea. y) annotation (Line( - points={{-20.8,40},{-32,40},{-32,34},{-49.6,34}}, + points={{-20.8,40},{-32,40},{-32,34},{-49.2,34}}, color={0,0,127}, smooth=Smooth.None)); connect(ECoo.u,gaiCoo. y) annotation (Line( - points={{-20.8,10},{-34,10},{-34,12},{-49.6,12}}, + points={{-20.8,10},{-34,10},{-34,12},{-49.2,12}}, color={0,0,127}, smooth=Smooth.None)); connect(TSetHea.y[1],conHea. u_s) annotation (Line( - points={{-83.6,34},{-72.8,34}}, + points={{-83.2,34},{-72.8,34}}, color={0,0,127}, smooth=Smooth.None)); connect(TSetCoo.y[1],conCoo. u_s) annotation (Line( - points={{-83.6,12},{-72.8,12}}, + points={{-83.2,12},{-72.8,12}}, color={0,0,127}, smooth=Smooth.None)); connect(PCoo.u,gaiCoo. y) annotation (Line( - points={{-20.8,-4},{-42,-4},{-42,12},{-49.6,12}}, + points={{-20.8,-4},{-42,-4},{-42,12},{-49.2,12}}, color={0,0,127}, smooth=Smooth.None)); connect(PHea.u,gaiHea. y) annotation (Line( - points={{-20.8,52},{-42,52},{-42,34},{-49.6,34}}, + points={{-20.8,52},{-42,52},{-42,34},{-49.2,34}}, color={0,0,127}, smooth=Smooth.None)); connect(preHea.port, roo.heaPorAir) annotation (Line( diff --git a/Buildings/ThermalZones/Detailed/Validation/BESTEST/UsersGuide.mo b/Buildings/ThermalZones/Detailed/Validation/BESTEST/UsersGuide.mo new file mode 100644 index 00000000000..d74f54c36cb --- /dev/null +++ b/Buildings/ThermalZones/Detailed/Validation/BESTEST/UsersGuide.mo @@ -0,0 +1,1091 @@ +within Buildings.ThermalZones.Detailed.Validation.BESTEST; +package UsersGuide "User's Guide" + extends Modelica.Icons.Information; + + annotation(preferredView="info", + Documentation(info=" +

+The package +Buildings.ThermalZones.Detailed.Validation.BESTEST contains the models +that were used for the BESTEST validation (ANSI/ASHRAE 2007). The basic model from which all other +models extend from is +Buildings.ThermalZones.Detailed.Validation.BESTEST.Cases6xx.Case600FF. +

+

+All examples have a script that runs an annual simulation and +plots the results with the minimum, mean and maximum value +listed in the ANSI/ASHRAE Standard 140-2007. +

+

+The script compares the following quantities: +

+ +

+Note that in addition to the BESTESTs, the window model has been validated separately +in Nouidui et al. (2012). +

+

Implementation

+

+Heating and cooling is controlled using the PI controller + +Buildings.Controls.Continuous.LimPID +with anti-windup. +

+

+Hourly averaged values and annual mean values are computed using an instance of + +Buildings.Controls.OBC.CDL.Continuous.MovingMean. +

+

Validation results

+

+The data used for validation are from \"RESULTS5-2A.xlsx\" in folder \"/Sec5-2AFiles/Informative Materials\" +of Supplemental Files for ANSI/ASHRAE Standard 140-2017, +Standard Method of Test for the Evaluation of Building Energy Analysis Computer Programs. +

+ +
Heating and cooling cases
+

+The simulations of cases with heating and cooling are validated by comparing the +annual heating and cooling energy, the peak heating and cooling demand with the validation +data. In addition, one day load profiles are also validated. +The detailed comparison, which also shows the peak load hours, are shown +in the table after the plots below. +

+ +

+\"annual_cooling.png\" +\"annual_heating.png\" +

+

+\"peak_cooling.png\" +\"peak_heating.png\" +

+

+\"hourly_load_600_Jan4.png\" +\"hourly_load_900_Jan4.png\" +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Annual heating load (MWh)
CaseESP/DMUBLAST/US-ITDOE21D/NRELSRES-SUN/NRELSRES/BRES3PAS/SPAINTSYS/BEL-BRETASE/FINLANDMBL/LBNL
Case6004.2964.7735.7095.2265.5964.8824.8725.3625.290
Case6104.3554.8065.7865.2805.6204.9714.9705.3835.318
Case6204.6135.0495.9445.5545.7345.5645.0735.7285.452
Case6305.0505.3596.4695.8836.0016.0955.6240.0005.711
Case6402.7512.8883.5433.2553.8033.0653.0433.3093.428
Case6500.0000.0000.0000.0000.0000.0000.0000.0000.000
Case9001.1701.6101.8721.8971.9881.7301.6552.0411.787
Case9203.3133.7524.2554.0934.0584.2353.7764.3003.900
Case9400.7931.0211.2391.2311.4111.1791.0801.3231.186
Case9500.0000.0000.0000.0000.0000.0000.0000.0000.000
Case9602.3112.6642.9282.8842.8512.9433.3732.8163.099
Annual cooling load (MWh)
CaseESP/DMUBLAST/US-ITDOE21D/NRELSRES-SUN/NRELSRES/BRES3PAS/SPAINTSYS/BEL-BRETASE/FINLANDMBL/LBNL
Case6006.1376.4337.0797.2787.9646.4926.4926.7786.689
Case6103.9154.8514.8525.4485.7784.7644.6015.5065.170
Case6203.4174.0924.3344.6335.0044.0113.9014.3514.115
Case6302.1293.1082.4893.4933.7012.4892.4160.0003.181
Case6405.9526.1836.7597.0267.8116.2476.2466.5086.473
Case6504.8165.1405.7955.8946.5455.0885.1195.4565.364
Case9002.1322.6002.4553.1653.4152.5722.4852.5992.194
Case9201.8402.6162.4402.9433.0922.4572.4182.6132.310
Case9402.0792.5362.3403.0363.2412.4892.3832.5162.116
Case9500.3870.5260.5380.9210.5890.5510.5610.7710.474
Case9600.4880.6660.4280.8030.7180.6430.4110.7860.616
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Peak heating load (kW)
CaseESP/DMUBLAST/US-ITDOE21D/NRELSRES-SUN/NRELS3PAS/SPAINTSYS/BEL-BRETASE/FINLANDMBL/LBNL
kWhourkWhourkWhourkWhourkWhourkWhourkWhourkWhour
Case6003.43704-Jan:53.94004-Jan:54.04504-Jan:54.25804-Jan:24.03704-Jan:23.93104-Jan:64.35404-Jan:24.1714-Jan:6
Case6103.43704-Jan:53.94104-Jan:54.03404-Jan:54.25804-Jan:24.03704-Jan:23.92204-Jan:64.35404-Jan:24.1714-Jan:6
Case6203.59104-Jan:63.94104-Jan:54.04604-Jan:54.27704-Jan:24.27704-Jan:23.92204-Jan:64.37904-Jan:24.1714-Jan:6
Case6303.59204-Jan:73.94104-Jan:54.02504-Jan:54.28004-Jan:24.27804-Jan:23.92204-Jan:60.000N/A4.1714-Jan:6
Case6405.23204-Jan:75.48604-Jan:85.94304-Jan:86.53004-Jan:86.34704-Jan:85.72204-Jan:86.95404-Jan:86.9564-Jan:8
Case6500.000N/A0.00004-Jan:N/A0.000N/A0.000N/A0.000N/A0.000N/A0.000N/A0.00031-Dec:24
Case9002.85004-Jan:73.45304-Jan:73.55704-Jan:73.76004-Jan:73.60804-Jan:83.51704-Jan:73.79704-Jan:73.5794-Jan:7
Case9203.30804-Jan:73.70304-Jan:73.80504-Jan:74.01304-Jan:74.02904-Jan:73.70804-Jan:74.06104-Jan:73.8844-Jan:7
Case9403.98004-Jan:75.02804-Jan:85.66504-Jan:86.11604-Jan:86.11704-Jan:85.12203-Jan:96.42804-Jan:86.0164-Jan:8
Case9500.000N/A0.000N/A0.000N/A0.000N/A0.000N/A0.000N/A0.000N/A0.00031-Dec:24
Case9602.41004-Jan:72.75104-Jan:82.72704-Jan:82.86304-Jan:82.85204-Jan:82.52204-Jan:82.77904-Jan:82.8804-Jan:8
Peak cooling load (kW)
CaseESP/DMUBLAST/US-ITDOE21D/NRELSRES-SUN/NRELS3PAS/SPAINTSYS/BEL-BRETASE/FINLANDMBL/LBNL
kWhourkWhourkWhourkWhourkWhourkWhourkWhourkWhour
Case6006.19417-Oct:135.96516-Oct:146.65616-Oct:136.82716-Oct:146.28625-Nov:146.48616-Oct:146.81217-Oct:146.60017-Oct:13
Case6105.66925-Nov:135.82425-Nov:146.06413-Jan:146.37125-Nov:146.17025-Nov:145.67525-Nov:146.14617-Oct:146.25425-Nov:13
Case6203.63426-Jul:164.07526-Jul:174.43026-Jul:174.59326-Jul:174.29726-Jul:174.27526-Jul:175.09626-Jul:164.03426-Jul:17
Case6303.07226-Jul:163.70426-Jul:173.58826-Jul:174.11626-Jul:173.66526-Jul:173.60826-Jul:170.000N/A3.54926-Jul:17
Case6406.16117-Oct:135.89216-Oct:146.57616-Oct:146.77616-Oct:146.25025-Nov:146.44216-Oct:146.77117-Oct:146.54117-Oct:13
Case6506.03117-Oct:135.83116-Oct:146.51616-Oct:146.67116-Oct:146.14325-Nov:146.37817-Oct:146.67917-Oct:146.47717-Oct:14
Case9002.88817-Oct:143.15506-Oct:153.45817-Oct:143.87117-Oct:143.33417-Oct:153.56717-Oct:153.45717-Oct:153.12717-Oct:15
Case9202.38526-Jul:162.93326-Jul:173.10926-Jul:173.48726-Jul:173.07126-Jul:173.05026-Jul:173.50526-Jul:172.85026-Jul:17
Case9402.88817-Oct:143.15506-Oct:153.45817-Oct:143.87117-Oct:143.33417-Oct:153.56717-Oct:153.45717-Oct:153.12717-Oct:15
Case9502.03302-Sep:142.62102-Sep:152.66402-Sep:153.17002-Sep:142.67702-Sep:152.68602-Sep:152.86702-Sep:142.4252-Sep:15
Case9600.95316-Aug:161.14426-Jul:161.05726-Jul:161.37026-Jul:161.17926-Jul:161.37826-Jul:161.40326-Jul:161.25327-Jul:16
+
+ + +
Free floating cases
+

+The following plots compare the maximum, minimum and average zone temperature simulated with +the Modelica Buildings Library with the values simulated by other tools. The simulation +is also validated by comparing one-day simulation results in different days, and by +comparing the distribution of the annual temperature. The detailed comparisons, which also +show the peak temperature hour, are shown in the table after the plots. +

+

+\"max_temperature.png\" +\"min_temperature.png\" +

+

+\"FF_temperature_600FF_Jan4.png\" +\"FF_temperature_900FF_Jan4.png\" +

+

+\"FF_temperature_650FF_Jul27.png\" +\"FF_temperature_950FF_Jul27.png\" +

+

+\"ave_temperature.png\" +\"bin_temperature_900FF.png\" +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Maximum temperature (°C)
CaseESP/DMUBLAST/US-ITDOE21D/NRELSRES-SUN/NRELS3PAS/SPAINTSYS/BEL-BRETASE/FINLANDMBL/LBNL
°Chour°Chour°Chour°Chour°Chour°Chour°Chour°Chour
Case600FF64.917-Oct:1565.116-Oct:1569.517-Oct:1568.616-Oct:1564.916-Oct:1665.317-Oct:1665.315-Oct:1665.317-Oct:16
Case650FF63.217-Oct:1563.516-Oct:1568.217-Oct:1567.016-Oct:1563.316-Oct:1663.717-Oct:1663.816-Oct:1664.117-Oct:16
Case900FF41.817-Oct:1543.402-Sep:1642.702-Sep:1544.802-Sep:1543.002-Sep:1542.517-Oct:1543.215-Sep:1542.22-Sep:16
Case950FF35.502-Sep:1636.202-Sep:1635.902-Sep:1638.502-Sep:1536.102-Sep:1635.702-Sep:1537.615-Sep:1636.22-Sep:16
Minimum temperature (°C)
CaseESP/DMUBLAST/US-ITDOE21D/NRELSRES-SUN/NRELS3PAS/SPAINTSYS/BEL-BRETASE/FINLANDMBL/LBNL
°Chour°Chour°Chour°Chour°Chour°Chour°Chour°Chour
Case600FF-15.604-Jan:7-17.104-Jan:8-18.804-Jan:8-18.004-Jan:7-17.804-Jan:8-17.804-Jan:7-18.508-Jan:9-19.04-Jan:8
Case650FF-22.604-Jan:6-23.004-Jan:7-21.604-Jan:2-23.004-Jan:2-22.904-Jan:2-22.804-Jan:7-22.902-Jan:23-23.34-Jan:3
Case900FF-1.604-Jan:8-3.204-Jan:8-4.304-Jan:8-4.504-Jan:8-4.004-Jan:8-6.404-Jan:8-5.608-Jan:9-5.34-Jan:8
Case950FF-19.504-Jan:6-20.004-Jan:7-18.604-Jan:7-19.704-Jan:7-20.204-Jan:7-19.304-Jan:7-20.007-Jan:22-20.64-Jan:7
+
+ +

Implementation

+

+To generate the data shown in this user guide, run +

+
+  cd Buildings/Resources/src/ThermalZones/Detailed/Validation/BESTEST
+  python3 simulateAndPlot.py
+
+

References

+

+ANSI/ASHRAE. 2007. ANSI/ASHRAE Standard 140-2007, +Standard Method of Test for the Evaluation of Building Energy Analysis Computer Programs. +

+

+Thierry Stephane Nouidui, Michael Wetter, and Wangda Zuo. + +Validation of the window model of the Modelica Buildings library. +Proc. of the 5th SimBuild Conference, Madison, WI, USA, August 2012. +

+")); +end UsersGuide; diff --git a/Buildings/ThermalZones/Detailed/Validation/BESTEST/package.mo b/Buildings/ThermalZones/Detailed/Validation/BESTEST/package.mo index 1d2ca8d4352..4f987dd61e1 100644 --- a/Buildings/ThermalZones/Detailed/Validation/BESTEST/package.mo +++ b/Buildings/ThermalZones/Detailed/Validation/BESTEST/package.mo @@ -8,54 +8,10 @@ annotation (preferredView="info", Documentation(info="

This package contains the models that were used for the BESTEST validation (ANSI/ASHRAE 2007). -The basic model from which all other models extend from is - -Buildings.ThermalZones.Detailed.Validation.BESTEST.Cases6xx.Case600FF. -

-

-All examples have a script that runs an annual simulation and -plots the results with the minimum, mean and maximum value -listed in the ANSI/ASHRAE Standard 140-2007. -

-The script compares the following quantities -
- -
-

-Note that in addition to the BESTESTs, the window model has been validated separately -in Nouidui et al. (2012). -

-

Implementation

-

-Heating and cooling is controlled using the PI controller - -Buildings.Controls.Continuous.LimPID -with anti-windup. -

-

-Hourly averaged values and annual mean values -are computed using an instance of - -Buildings.Controls.OBC.CDL.Continuous.MovingMean. -

-

References

-

-ANSI/ASHRAE. 2007. ANSI/ASHRAE Standard 140-2007, Standard Method of Test for the Evaluation of Building Energy Analysis Computer Programs. -

-

-Thierry Stephane Nouidui, Michael Wetter, and Wangda Zuo. - -Validation of the window model of the Modelica Buildings library. -Proc. of the 5th SimBuild Conference, Madison, WI, USA, August 2012. +See + +Buildings.ThermalZones.Detailed.Validation.BESTEST.UsersGuide +for details and results.

")); end BESTEST; diff --git a/Buildings/ThermalZones/Detailed/Validation/BESTEST/package.order b/Buildings/ThermalZones/Detailed/Validation/BESTEST/package.order index 259a509e1e6..08ba41a34f1 100644 --- a/Buildings/ThermalZones/Detailed/Validation/BESTEST/package.order +++ b/Buildings/ThermalZones/Detailed/Validation/BESTEST/package.order @@ -1,3 +1,4 @@ +UsersGuide Cases6xx Cases9xx nStaRef