openstudio-standards 0.1.3 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. checksums.yaml +4 -4
  2. data/data/standards/OpenStudio_Standards.xlsx +0 -0
  3. data/data/standards/OpenStudio_Standards_chillers.json +5 -5
  4. data/data/standards/OpenStudio_Standards_construction_sets.json +2 -2
  5. data/data/standards/OpenStudio_Standards_curve_cubics.json +12 -0
  6. data/data/standards/OpenStudio_Standards_heat_pumps.json +2126 -72
  7. data/data/standards/OpenStudio_Standards_heat_pumps_heating.json +766 -14
  8. data/data/standards/OpenStudio_Standards_heat_rejection.json +172 -0
  9. data/data/standards/OpenStudio_Standards_prototype_inputs.json +355 -267
  10. data/data/standards/OpenStudio_Standards_schedules.json +262 -10
  11. data/data/standards/OpenStudio_Standards_space_types.json +1466 -794
  12. data/data/standards/manage_OpenStudio_Standards.rb +19 -21
  13. data/data/weather/weather_info.csv +96 -0
  14. data/lib/openstudio-standards/btap/btap.rb +1 -1
  15. data/lib/openstudio-standards/btap/compliance.rb +135 -40
  16. data/lib/openstudio-standards/btap/envelope.rb +26 -5
  17. data/lib/openstudio-standards/btap/geometry.rb +11 -1
  18. data/lib/openstudio-standards/btap/hvac.rb +489 -56
  19. data/lib/openstudio-standards/btap/simmanager.rb +1 -1
  20. data/lib/openstudio-standards/hvac_sizing/HVACSizing.CoilHeatingDXMultiSpeed.rb +120 -0
  21. data/lib/openstudio-standards/hvac_sizing/Siz.CoilCoolingDXMultiSpeed.rb +151 -7
  22. data/lib/openstudio-standards/hvac_sizing/Siz.CoilHeatingGasMultiStage.rb +48 -7
  23. data/lib/openstudio-standards/hvac_sizing/Siz.Model.rb +14 -12
  24. data/lib/openstudio-standards/prototypes/Prototype.AirTerminalSingleDuctVAVReheat.rb +33 -7
  25. data/lib/openstudio-standards/prototypes/Prototype.Model.hvac.rb +123 -91
  26. data/lib/openstudio-standards/prototypes/Prototype.Model.rb +130 -45
  27. data/lib/openstudio-standards/prototypes/Prototype.Model.swh.rb +13 -7
  28. data/lib/openstudio-standards/prototypes/Prototype.full_service_restaurant.rb +332 -324
  29. data/lib/openstudio-standards/prototypes/Prototype.hospital.rb +401 -99
  30. data/lib/openstudio-standards/prototypes/Prototype.hvac_systems.rb +309 -222
  31. data/lib/openstudio-standards/prototypes/Prototype.large_hotel.rb +100 -80
  32. data/lib/openstudio-standards/prototypes/Prototype.large_office.rb +37 -22
  33. data/lib/openstudio-standards/prototypes/Prototype.medium_office.rb +68 -53
  34. data/lib/openstudio-standards/prototypes/Prototype.mid_rise_apartment.rb +109 -88
  35. data/lib/openstudio-standards/prototypes/Prototype.outpatient.rb +52 -4
  36. data/lib/openstudio-standards/prototypes/Prototype.primary_school.rb +230 -213
  37. data/lib/openstudio-standards/prototypes/Prototype.quick_service_restaurant.rb +225 -218
  38. data/lib/openstudio-standards/prototypes/Prototype.retail_standalone.rb +29 -17
  39. data/lib/openstudio-standards/prototypes/Prototype.retail_stripmall.rb +42 -32
  40. data/lib/openstudio-standards/prototypes/Prototype.secondary_school.rb +331 -314
  41. data/lib/openstudio-standards/prototypes/Prototype.small_hotel.rb +233 -219
  42. data/lib/openstudio-standards/prototypes/Prototype.small_office.rb +40 -32
  43. data/lib/openstudio-standards/prototypes/Prototype.warehouse.rb +19 -6
  44. data/lib/openstudio-standards/standards/Standards.AirLoopHVAC.rb +576 -555
  45. data/lib/openstudio-standards/standards/Standards.AirTerminalSingleDuctVAVReheat.rb +3 -1
  46. data/lib/openstudio-standards/standards/Standards.BoilerHotWater.rb +35 -17
  47. data/lib/openstudio-standards/standards/Standards.ChillerElectricEIR.rb +51 -23
  48. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXMultiSpeed.rb +255 -0
  49. data/lib/openstudio-standards/standards/Standards.CoilHeatingDXMultiSpeed.rb +192 -0
  50. data/lib/openstudio-standards/standards/Standards.CoilHeatingGasMultiStage.rb +65 -0
  51. data/lib/openstudio-standards/standards/Standards.Fan.rb +37 -6
  52. data/lib/openstudio-standards/standards/Standards.Model.rb +28 -3
  53. data/lib/openstudio-standards/standards/Standards.SpaceType.rb +3 -1
  54. data/lib/openstudio-standards/standards/Standards.WaterHeaterMixed.rb +41 -15
  55. data/lib/openstudio-standards/version.rb +1 -1
  56. data/lib/openstudio-standards/weather/Weather.Model.rb +509 -5
  57. data/lib/openstudio-standards/weather/Weather.stat_file.rb +145 -5
  58. metadata +8 -3
  59. data/lib/openstudio-standards/btap/environment.rb +0 -718
@@ -27,11 +27,25 @@ module EnergyPlus
27
27
  attr_accessor :lon
28
28
  attr_accessor :elevation
29
29
  attr_accessor :gmt
30
- attr_accessor :monthlyDB
30
+ attr_accessor :monthly_dry_bulb
31
+ attr_accessor :delta_dry_bulb
31
32
  attr_accessor :hdd18
32
33
  attr_accessor :cdd18
33
34
  attr_accessor :hdd10
34
35
  attr_accessor :cdd10
36
+ attr_accessor :heating_design_info
37
+ attr_accessor :cooling_design_info
38
+ attr_accessor :extremes_design_info
39
+ attr_accessor :climate_zone
40
+ attr_accessor :standard
41
+ attr_accessor :summer_wet_months
42
+ attr_accessor :winter_dry_months
43
+ attr_accessor :autumn_months
44
+ attr_accessor :spring_months
45
+ attr_accessor :typical_summer_wet_week
46
+ attr_accessor :typical_winter_dry_week
47
+ attr_accessor :typical_autumn_week
48
+ attr_accessor :typical_spring_week
35
49
 
36
50
  def initialize(path)
37
51
  @path = Pathname.new(path)
@@ -46,8 +60,45 @@ module EnergyPlus
46
60
  @cdd10 = []
47
61
  @monthly_dry_bulb = []
48
62
  @delta_dry_bulb = []
63
+ @heating_design_info = []
64
+ @cooling_design_info = []
65
+ @extremes_design_info = []
66
+ @climate_zone = []
67
+ @standard = []
68
+ @summer_wet_months = []
69
+ @winter_dry_months = []
70
+ @autumn_months = []
71
+ @spring_months = []
72
+ @typical_summer_wet_week = []
73
+ @typical_winter_dry_week = []
74
+ @typical_autumn_week = []
75
+ @typical_spring_week = []
76
+ @data = []
49
77
  init
50
78
  end
79
+
80
+ #Output for debugging stat routines.
81
+ def output()
82
+ line = String.new
83
+ line << "#{@path} , "
84
+ line << "#{@lat} ,"
85
+ line << "#{@lon} ,"
86
+ line << "#{@gmt} ,"
87
+ line << "#{@elevation} ,"
88
+ line << "#{@hdd18} ,"
89
+ line << "#{@cdd18} ,"
90
+ line << "#{@hdd10} ,"
91
+ line << "#{@cdd10} ,"
92
+ line << "#{mean_dry_bulb} ,"
93
+ line << "#{delta_dry_bulb} ,"
94
+ line << "#{@heating_design_info} ,"
95
+ line << "#{@cooling_design_info} ,"
96
+ line << "#{@extremes_design_info} ,"
97
+ line << "#{@climate_zone} ,"
98
+ line << "#{@standard} ,"
99
+ line << "#{@valid} ,"
100
+ end
101
+
51
102
 
52
103
  def valid?
53
104
  return @valid
@@ -85,6 +136,7 @@ module EnergyPlus
85
136
  File.open(@path) do |f|
86
137
  text = f.read.force_encoding('iso-8859-1')
87
138
  parse(text)
139
+
88
140
  end
89
141
  end
90
142
  end
@@ -125,18 +177,21 @@ module EnergyPlus
125
177
  end
126
178
  end
127
179
 
180
+
128
181
  # get heating and cooling degree days
129
- cdd10Regex = /-\s*(.*) annual \(standard\) cooling degree-days \(10.C baseline\)/
182
+ cdd10Regex = /-\s*(.*) annual \((standard|wthr file)\) cooling degree-days \(10.C baseline\)/
130
183
  match_data = text.match(cdd10Regex)
131
184
  if match_data.nil?
132
185
  OpenStudio::logFree(OpenStudio::Warn, "openstudio.Weather.stat_file", "Can't find CDD 10")
133
186
  return
187
+
134
188
  else
135
189
  @cdd10 = match_data[1].to_f
136
190
  end
137
191
 
138
- hdd10Regex = /-\s*(.*) annual \(standard\) heating degree-days \(10.C baseline\)/
192
+ hdd10Regex = /-\s*(.*) annual \((standard|wthr file)\) heating degree-days \(10.C baseline\)/
139
193
  match_data = text.match(hdd10Regex)
194
+
140
195
  if match_data.nil?
141
196
  OpenStudio::logFree(OpenStudio::Warn, "openstudio.Weather.stat_file", "Can't find HDD 10")
142
197
  return
@@ -144,7 +199,7 @@ module EnergyPlus
144
199
  @hdd10 = match_data[1].to_f
145
200
  end
146
201
 
147
- cdd18Regex = /-\s*(.*) annual \(standard\) cooling degree-days \(18.3.C baseline\)/
202
+ cdd18Regex = /-\s*(.*) annual \((standard|wthr file)\) cooling degree-days \(18.*C baseline\)/
148
203
  match_data = text.match(cdd18Regex)
149
204
  if match_data.nil?
150
205
  OpenStudio::logFree(OpenStudio::Warn, "openstudio.Weather.stat_file", "Can't find CDD 18")
@@ -153,8 +208,9 @@ module EnergyPlus
153
208
  @cdd18 = match_data[1].to_f
154
209
  end
155
210
 
156
- hdd18Regex = /-\s*(.*) annual \(standard\) heating degree-days \(18.3.C baseline\)/
211
+ hdd18Regex = /-\s*(.*) annual \((standard|wthr file)\) heating degree-days \(18.*C baseline\)/
157
212
  match_data = text.match(hdd18Regex)
213
+
158
214
  if match_data.nil?
159
215
  OpenStudio::logFree(OpenStudio::Warn, "openstudio.Weather.stat_file", "Can't find HDD 18")
160
216
  return
@@ -182,6 +238,90 @@ module EnergyPlus
182
238
  # insert as numbers
183
239
  monthly_temps.each { |temp| @monthly_dry_bulb << temp.to_f }
184
240
  end
241
+
242
+ #Get 2004 Climate zone.
243
+ # - Climate type "3B" (ASHRAE Standard 196-2006 Climate Zone)**
244
+ # - Climate type "6A" (ASHRAE Standards 90.1-2004 and 90.2-2004 Climate Zone)**
245
+ #use regex to get the temperatures
246
+ regex = /Climate type \"(.*?)\" \(ASHRAE Standards?(.*)\)\*\*/
247
+ match_data = text.match(regex)
248
+ if match_data.nil?
249
+ OpenStudio::logFree(OpenStudio::Warn, "openstudio.Weather.stat_file", "Can't find Climate zone 2004")
250
+ @climate_zone = "NA"
251
+ else
252
+ @climate_zone = match_data[1].to_s.strip
253
+ @standard = match_data[2].to_s.strip
254
+ end
255
+
256
+
257
+
258
+ # Seasons as define by file (Summer, Autumn, Spring Winter...or Wet and Dry )
259
+ match_data = text.match(/(Summer is |Wet Period=)(.*)/)
260
+ if match_data.nil?
261
+ OpenStudio::logFree(OpenStudio::Warn, "openstudio.Weather.stat_file", "Can't Summer / Wet months")
262
+ else
263
+ @summer_wet_months = match_data[2].to_s.strip
264
+ end
265
+
266
+ match_data = text.match(/(Winter is |Dry Period=)(.*)/)
267
+ if match_data.nil?
268
+ OpenStudio::logFree(OpenStudio::Warn, "openstudio.Weather.stat_file", "Can't Winter / Dry months")
269
+ else
270
+ @winter_dry_months = match_data[2].to_s.strip
271
+ end
272
+
273
+ match_data = text.match(/Autumn is (.*)/)
274
+ if match_data.nil?
275
+ OpenStudio::logFree(OpenStudio::Warn, "openstudio.Weather.stat_file", "Can't Summer months")
276
+ @autumn_months = "NA"
277
+ else
278
+ @autumn_months = match_data[1].to_s.strip
279
+ end
280
+
281
+ match_data = text.match(/Spring is (.*)/)
282
+ if match_data.nil?
283
+ OpenStudio::logFree(OpenStudio::Warn, "openstudio.Weather.stat_file", "Can't Summer months")
284
+ @spring_months = "NA"
285
+ else
286
+ @spring_months = match_data[1].to_s.strip
287
+ end
288
+
289
+
290
+
291
+
292
+ regex = /Typical Week Period selected:(.*?)C/
293
+ match_data = text.scan(regex)
294
+ if match_data.nil?
295
+ OpenStudio::logFree(OpenStudio::Warn, "openstudio.Weather.stat_file", "Can't find Typical weather weeks")
296
+ else
297
+ @typical_summer_wet_week = Date.parse("#{match_data[0][0].split(":")[0]} 2000")
298
+ @typical_winter_dry_week = Date.parse("#{match_data[1][0].split(":")[0]} 2000")
299
+ if match_data[2].nil?
300
+ @typical_autumn_week = "NA"
301
+ @typical_spring_week = "NA"
302
+ else
303
+ @typical_autumn_week = Date.parse("#{match_data[2][0].split(":")[0]} 2000")
304
+ @typical_spring_week = Date.parse("#{match_data[3][0].split(":")[0]} 2000")
305
+ end
306
+ end
307
+
308
+ regex = /Extreme Hot Week Period selected:(.*?)C/
309
+ match_data = text.match(regex)
310
+ if match_data.nil?
311
+ OpenStudio::logFree(OpenStudio::Warn, "openstudio.Weather.stat_file", "Can't find Extreme hot weather week")
312
+ else
313
+ @extreme_hot_week = Date.parse("#{match_data[1].split(":")[0]}")
314
+ end
315
+
316
+ regex = /Extreme Cold Week Period selected:(.*?)C/
317
+ match_data = text.match(regex)
318
+ if match_data.nil?
319
+ OpenStudio::logFree(OpenStudio::Warn, "openstudio.Weather.stat_file", "Can't find Extreme hot weather week")
320
+ else
321
+ @extreme_cold_week = Date.parse("#{match_data[1].split(":")[0]}")
322
+ end
323
+
324
+
185
325
 
186
326
  # now we are valid
187
327
  @valid = true
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: openstudio-standards
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Parker
@@ -20,7 +20,7 @@ authors:
20
20
  autorequire:
21
21
  bindir: bin
22
22
  cert_chain: []
23
- date: 2016-04-27 00:00:00.000000000 Z
23
+ date: 2016-06-28 00:00:00.000000000 Z
24
24
  dependencies:
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: bundler
@@ -148,7 +148,6 @@ files:
148
148
  - lib/openstudio-standards/btap/compliance.rb
149
149
  - lib/openstudio-standards/btap/economics.rb
150
150
  - lib/openstudio-standards/btap/envelope.rb
151
- - lib/openstudio-standards/btap/environment.rb
152
151
  - lib/openstudio-standards/btap/equest.rb
153
152
  - lib/openstudio-standards/btap/fileio.rb
154
153
  - lib/openstudio-standards/btap/geometry.rb
@@ -164,6 +163,7 @@ files:
164
163
  - lib/openstudio-standards/btap/utilities.rb
165
164
  - lib/openstudio-standards/btap/vintagizer.rb
166
165
  - lib/openstudio-standards/btap/visualization.rb
166
+ - lib/openstudio-standards/hvac_sizing/HVACSizing.CoilHeatingDXMultiSpeed.rb
167
167
  - lib/openstudio-standards/hvac_sizing/Siz.AirConditionerVariableRefrigerantFlow.rb
168
168
  - lib/openstudio-standards/hvac_sizing/Siz.AirLoopHVAC.rb
169
169
  - lib/openstudio-standards/hvac_sizing/Siz.AirLoopHVACUnitaryHeatCoolVAVChngByp.rb
@@ -267,9 +267,12 @@ files:
267
267
  - lib/openstudio-standards/standards/Standards.BoilerHotWater.rb
268
268
  - lib/openstudio-standards/standards/Standards.BuildingStory.rb
269
269
  - lib/openstudio-standards/standards/Standards.ChillerElectricEIR.rb
270
+ - lib/openstudio-standards/standards/Standards.CoilCoolingDXMultiSpeed.rb
270
271
  - lib/openstudio-standards/standards/Standards.CoilCoolingDXSingleSpeed.rb
271
272
  - lib/openstudio-standards/standards/Standards.CoilCoolingDXTwoSpeed.rb
273
+ - lib/openstudio-standards/standards/Standards.CoilHeatingDXMultiSpeed.rb
272
274
  - lib/openstudio-standards/standards/Standards.CoilHeatingDXSingleSpeed.rb
275
+ - lib/openstudio-standards/standards/Standards.CoilHeatingGasMultiStage.rb
273
276
  - lib/openstudio-standards/standards/Standards.Construction.rb
274
277
  - lib/openstudio-standards/standards/Standards.Fan.rb
275
278
  - lib/openstudio-standards/standards/Standards.FanConstantVolume.rb
@@ -350,6 +353,7 @@ files:
350
353
  - data/standards/OpenStudio_Standards_ground_temperatures.json
351
354
  - data/standards/OpenStudio_Standards_heat_pumps.json
352
355
  - data/standards/OpenStudio_Standards_heat_pumps_heating.json
356
+ - data/standards/OpenStudio_Standards_heat_rejection.json
353
357
  - data/standards/OpenStudio_Standards_materials.json
354
358
  - data/standards/OpenStudio_Standards_motors.json
355
359
  - data/standards/OpenStudio_Standards_prototype_inputs.json
@@ -645,6 +649,7 @@ files:
645
649
  - data/weather/USA_VT_Burlington.Intl.AP.726170_TMY3.ddy
646
650
  - data/weather/USA_VT_Burlington.Intl.AP.726170_TMY3.epw
647
651
  - data/weather/USA_VT_Burlington.Intl.AP.726170_TMY3.stat
652
+ - data/weather/weather_info.csv
648
653
  homepage: http://openstudio.net
649
654
  licenses:
650
655
  - LGPL
@@ -1,718 +0,0 @@
1
- # *********************************************************************
2
- # * Copyright (c) 2008-2015, Natural Resources Canada
3
- # * All rights reserved.
4
- # *
5
- # * This library is free software; you can redistribute it and/or
6
- # * modify it under the terms of the GNU Lesser General Public
7
- # * License as published by the Free Software Foundation; either
8
- # * version 2.1 of the License, or (at your option) any later version.
9
- # *
10
- # * This library is distributed in the hope that it will be useful,
11
- # * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
- # * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13
- # * Lesser General Public License for more details.
14
- # *
15
- # * You should have received a copy of the GNU Lesser General Public
16
- # * License along with this library; if not, write to the Free Software
17
- # * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18
- # **********************************************************************/
19
-
20
-
21
-
22
- require 'open-uri'
23
- module BTAP
24
- module Environment
25
- WeatherData =
26
- {
27
- "CAN_AB_Calgary.718770_CWEC.epw" => { "country" => "CAN", "state_province" => "AB", "city" => "Calgary Int'l","hdd18" => 5146.0,"cdd18" => 40.0,"latitude" => 51.12, "longitude" => -114.02, "elevation" => 1084.0, "monthly_dry_bulb" => "[-8.2, -6.4, -3.8, 4.3, 9.4, 14.6, 16.8, 16.0, 10.2, 5.9, -3.6, -7.9]", "delta_dry_bulb" => 25.0 },
28
- "CAN_AB_Edmonton.711230_CWEC.epw" => { "country" => "CAN", "state_province" => "AB", "city" => "Edmonton Stony Plain","hdd18" => 5583.0,"cdd18" => 22.0,"latitude" => 53.53, "longitude" => -114.1, "elevation" => 723.0, "monthly_dry_bulb" => "[-11.8, -9.4, -2.7, 3.9, 10.9, 14.4, 15.7, 14.7, 8.7, 3.5, -6.5, -9.1]", "delta_dry_bulb" => 27.5 },
29
- "CAN_AB_Fort.McMurray.719320_CWEC.epw" => { "country" => "CAN", "state_province" => "AB", "city" => "Fort McMurray","hdd18" => 6191.0,"cdd18" => 65.0,"latitude" => 56.65, "longitude" => -111.22, "elevation" => 369.0, "monthly_dry_bulb" => "[-16.1, -12.7, -8.2, 1.7, 11.6, 15.1, 17.4, 14.8, 8.7, 3.8, -8.8, -13.8]", "delta_dry_bulb" => 33.5 },
30
- "CAN_AB_Grande.Prairie.719400_CWEC.epw" => { "country" => "CAN", "state_province" => "AB", "city" => "Grand Prairie","hdd18" => 5897.0,"cdd18" => 26.0,"latitude" => 55.18, "longitude" => -118.88, "elevation" => 669.0, "monthly_dry_bulb" => "[-13.3, -10.7, -6.3, 2.6, 9.7, 14.0, 15.6, 15.3, 9.7, 4.2, -6.4, -12.2]", "delta_dry_bulb" => 28.9 },
31
- "CAN_AB_Lethbridge.712430_CWEC.epw" => { "country" => "CAN", "state_province" => "AB", "city" => "Lethbridge","hdd18" => 4432.0,"cdd18" => 126.0,"latitude" => 49.63, "longitude" => -112.8, "elevation" => 921.0, "monthly_dry_bulb" => "[-6.8, -7.6, 0.2, 6.8, 11.1, 16.6, 18.9, 17.6, 12.3, 7.5, 0.8, -3.9]", "delta_dry_bulb" => 26.5 },
32
- "CAN_AB_Medicine.Hat.718720_CWEC.epw" => { "country" => "CAN", "state_province" => "AB", "city" => "Medicine Hat","hdd18" => 4678.0,"cdd18" => 199.0,"latitude" => 50.02, "longitude" => -110.72, "elevation" => 716.0, "monthly_dry_bulb" => "[-11.8, -7.1, 0.4, 6.0, 12.1, 17.1, 19.6, 19.8, 12.8, 8.1, -2.4, -6.8]", "delta_dry_bulb" => 31.6 },
33
- "CAN_BC_Abbotsford.711080_CWEC.epw" => { "country" => "CAN", "state_province" => "BC", "city" => "Abbotsford","hdd18" => 3134.0,"cdd18" => 33.0,"latitude" => 49.03, "longitude" => -122.37, "elevation" => 58.0, "monthly_dry_bulb" => "[2.8, 3.9, 5.4, 8.4, 12.3, 14.4, 16.8, 17.1, 13.5, 10.2, 5.3, 3.5]", "delta_dry_bulb" => 14.3 },
34
- "CAN_BC_Comox.718930_CWEC.epw" => { "country" => "CAN", "state_province" => "BC", "city" => "Comox","hdd18" => 3177.0,"cdd18" => 30.0,"latitude" => 49.72, "longitude" => -124.9, "elevation" => 24.0, "monthly_dry_bulb" => "[2.1, 4.6, 5.6, 8.6, 11.3, 14.4, 17.1, 17.3, 13.5, 9.2, 5.5, 3.3]", "delta_dry_bulb" => 15.200000000000001 },
35
- "CAN_BC_Cranbrook.718800_CWEC.epw" => { "country" => "CAN", "state_province" => "BC", "city" => "Cranbrook","hdd18" => 4645.0,"cdd18" => 118.0,"latitude" => 49.6, "longitude" => -115.78, "elevation" => 940.0, "monthly_dry_bulb" => "[-7.9, -3.2, 2.4, 6.0, 10.5, 14.4, 18.7, 17.3, 11.7, 5.4, -2.0, -6.6]", "delta_dry_bulb" => 26.6 },
36
- "CAN_BC_Fort.St.John.719430_CWEC.epw" => { "country" => "CAN", "state_province" => "BC", "city" => "Fort St John","hdd18" => 5863.0,"cdd18" => 25.0,"latitude" => 56.23, "longitude" => -120.73, "elevation" => 695.0, "monthly_dry_bulb" => "[-13.8, -10.8, -5.0, 4.1, 9.8, 14.0, 15.3, 14.6, 8.9, 4.2, -6.7, -11.3]", "delta_dry_bulb" => 29.1 },
37
- "CAN_BC_Kamloops.718870_CWEC.epw" => { "country" => "CAN", "state_province" => "BC", "city" => "Kamloops","hdd18" => 3629.0,"cdd18" => 287.0,"latitude" => 50.7, "longitude" => -120.45, "elevation" => 346.0, "monthly_dry_bulb" => "[-4.3, -1.2, 3.9, 9.2, 14.7, 18.4, 21.3, 20.3, 15.5, 8.0, 2.9, -3.4]", "delta_dry_bulb" => 25.6 },
38
- "CAN_BC_Port.Hardy.711090_CWEC.epw" => { "country" => "CAN", "state_province" => "BC", "city" => "Port Hardy","hdd18" => 3712.0,"cdd18" => 0.0,"latitude" => 50.68, "longitude" => -127.37, "elevation" => 22.0, "monthly_dry_bulb" => "[2.5, 3.8, 4.7, 6.6, 9.5, 11.5, 13.3, 13.3, 11.2, 8.3, 5.4, 3.6]", "delta_dry_bulb" => 10.8 },
39
- "CAN_BC_Prince.George.718960_CWEC.epw" => { "country" => "CAN", "state_province" => "BC", "city" => "Prince George","hdd18" => 5070.0,"cdd18" => 15.0,"latitude" => 53.88, "longitude" => -122.68, "elevation" => 691.0, "monthly_dry_bulb" => "[-10.8, -5.3, 0.1, 5.0, 10.2, 13.2, 14.5, 15.2, 10.8, 4.8, -2.4, -6.1]", "delta_dry_bulb" => 26.0 },
40
- "CAN_BC_Prince.Rupert.718980_CWEC.epw" => { "country" => "CAN", "state_province" => "BC", "city" => "Prince Rupert","hdd18" => 4151.0,"cdd18" => 0.0,"latitude" => 54.3, "longitude" => -130.43, "elevation" => 34.0, "monthly_dry_bulb" => "[-0.2, 1.4, 3.1, 5.7, 8.6, 10.7, 12.9, 13.3, 11.0, 7.9, 3.3, 1.3]", "delta_dry_bulb" => 13.5 },
41
- "CAN_BC_Sandspit.711010_CWEC.epw" => { "country" => "CAN", "state_province" => "BC", "city" => "Sandspit","hdd18" => 3644.0,"cdd18" => 0.0,"latitude" => 53.25, "longitude" => -131.82, "elevation" => 6.0, "monthly_dry_bulb" => "[1.4, 3.2, 5.0, 5.8, 9.0, 11.5, 13.6, 14.5, 12.7, 9.1, 6.4, 3.6]", "delta_dry_bulb" => 13.1 },
42
- "CAN_BC_Smithers.719500_CWEC.epw" => { "country" => "CAN", "state_province" => "BC", "city" => "Smithers","hdd18" => 5265.0,"cdd18" => 22.0,"latitude" => 54.82, "longitude" => -127.18, "elevation" => 523.0, "monthly_dry_bulb" => "[-8.4, -3.9, -1.5, 4.6, 8.5, 12.2, 15.8, 14.1, 9.0, 4.6, -3.8, -8.0]", "delta_dry_bulb" => 24.200000000000003 },
43
- "CAN_BC_Summerland.717680_CWEC.epw" => { "country" => "CAN", "state_province" => "BC", "city" => "Summerland","hdd18" => 3388.0,"cdd18" => 199.0,"latitude" => 49.57, "longitude" => -119.65, "elevation" => 479.0, "monthly_dry_bulb" => "[-1.7, 1.5, 4.2, 8.7, 13.8, 17.9, 20.1, 19.2, 14.7, 8.9, 3.9, -0.5]", "delta_dry_bulb" => 21.8 },
44
- "CAN_BC_Vancouver.718920_CWEC.epw" => { "country" => "CAN", "state_province" => "BC", "city" => "Vancouver Int'l","hdd18" => 3019.0,"cdd18" => 4.0,"latitude" => 49.18, "longitude" => -123.17, "elevation" => 2.0, "monthly_dry_bulb" => "[3.2, 5.1, 6.1, 8.7, 11.8, 15.1, 17.0, 17.1, 13.8, 9.8, 5.3, 3.6]", "delta_dry_bulb" => 13.900000000000002 },
45
- "CAN_BC_Victoria.717990_CWEC.epw" => { "country" => "CAN", "state_province" => "BC", "city" => "Victoria Int'l","hdd18" => 3075.0,"cdd18" => 8.0,"latitude" => 48.65, "longitude" => -123.43, "elevation" => 19.0, "monthly_dry_bulb" => "[3.8, 4.9, 6.2, 8.5, 11.7, 14.3, 15.8, 16.1, 13.1, 9.8, 6.5, 4.3]", "delta_dry_bulb" => 12.3 },
46
- "CAN_MB_Brandon.711400_CWEC.epw" => { "country" => "CAN", "state_province" => "MB", "city" => "Brandon","hdd18" => 5912.0,"cdd18" => 95.0,"latitude" => 49.92, "longitude" => -99.95, "elevation" => 409.0, "monthly_dry_bulb" => "[-18.0, -14.7, -7.0, 3.7, 11.4, 16.1, 18.7, 17.8, 11.3, 4.9, -5.2, -15.2]", "delta_dry_bulb" => 36.7 },
47
- "CAN_MB_Churchill.719130_CWEC.epw" => { "country" => "CAN", "state_province" => "MB", "city" => "Churchill","hdd18" => 9114.0,"cdd18" => 3.0,"latitude" => 58.75, "longitude" => -94.07, "elevation" => 29.0, "monthly_dry_bulb" => "[-23.4, -25.8, -19.8, -11.1, -1.2, 5.4, 11.9, 11.1, 5.5, -2.0, -12.1, -23.4]", "delta_dry_bulb" => 37.7 },
48
- "CAN_MB_The.Pas.718670_CWEC.epw" => { "country" => "CAN", "state_province" => "MB", "city" => "The Pas","hdd18" => 6442.0,"cdd18" => 106.0,"latitude" => 53.97, "longitude" => -101.1, "elevation" => 271.0, "monthly_dry_bulb" => "[-19.4, -15.8, -8.6, -0.2, 10.7, 14.7, 18.5, 17.6, 9.8, 2.8, -6.2, -17.4]", "delta_dry_bulb" => 37.9 },
49
- "CAN_MB_Winnipeg.718520_CWEC.epw" => { "country" => "CAN", "state_province" => "MB", "city" => "Winnipeg Int'l","hdd18" => 5754.0,"cdd18" => 197.0,"latitude" => 49.9, "longitude" => -97.23, "elevation" => 239.0, "monthly_dry_bulb" => "[-17.3, -14.3, -6.9, 4.2, 11.3, 16.9, 20.5, 18.6, 12.3, 5.7, -4.6, -14.1]", "delta_dry_bulb" => 37.8 },
50
- "CAN_NB_Fredericton.717000_CWEC.epw" => { "country" => "CAN", "state_province" => "NB", "city" => "Fredericton","hdd18" => 4734.0,"cdd18" => 132.0,"latitude" => 45.87, "longitude" => -66.53, "elevation" => 20.0, "monthly_dry_bulb" => "[-10.0, -8.0, -2.3, 3.5, 11.3, 16.0, 19.5, 18.2, 13.5, 7.7, 0.9, -6.6]", "delta_dry_bulb" => 29.5 },
51
- "CAN_NB_Miramichi.717440_CWEC.epw" => { "country" => "CAN", "state_province" => "NB", "city" => "Miramichi","hdd18" => 4921.0,"cdd18" => 141.0,"latitude" => 47.02, "longitude" => -65.45, "elevation" => 33.0, "monthly_dry_bulb" => "[-10.4, -8.9, -3.3, 2.9, 10.5, 16.1, 19.2, 18.1, 12.5, 7.0, 1.4, -7.0]", "delta_dry_bulb" => 29.6 },
52
- "CAN_NB_Saint.John.716090_CWEC.epw" => { "country" => "CAN", "state_province" => "NB", "city" => "Saint John","hdd18" => 4695.0,"cdd18" => 12.0,"latitude" => 45.32, "longitude" => -65.88, "elevation" => 109.0, "monthly_dry_bulb" => "[-7.4, -6.4, -2.4, 3.5, 9.1, 13.4, 16.4, 16.2, 13.2, 8.0, 2.4, -4.7]", "delta_dry_bulb" => 23.799999999999997 },
53
- "CAN_NF_Battle.Harbour.718170_CWEC.epw" => { "country" => "CAN", "state_province" => "NF", "city" => "Battle Harbour","hdd18" => 6462.0,"cdd18" => 0.0,"latitude" => 52.3, "longitude" => -55.83, "elevation" => 8.0, "monthly_dry_bulb" => "[-11.2, -10.2, -5.3, -1.6, 1.9, 5.0, 9.6, 10.4, 7.7, 3.3, -0.3, -6.6]", "delta_dry_bulb" => 21.6 },
54
- "CAN_NF_Gander.718030_CWEC.epw" => { "country" => "CAN", "state_province" => "NF", "city" => "Gander Int'l","hdd18" => 5101.0,"cdd18" => 25.0,"latitude" => 48.95, "longitude" => -54.57, "elevation" => 151.0, "monthly_dry_bulb" => "[-6.1, -6.7, -3.7, 1.5, 6.9, 11.5, 15.9, 15.1, 11.0, 5.5, 1.1, -3.7]", "delta_dry_bulb" => 22.6 },
55
- "CAN_NF_Goose.718160_CWEC.epw" => { "country" => "CAN", "state_province" => "NF", "city" => "Goose","hdd18" => 6558.0,"cdd18" => 38.0,"latitude" => 53.32, "longitude" => -60.37, "elevation" => 49.0, "monthly_dry_bulb" => "[-17.0, -15.2, -8.9, -0.9, 4.6, 11.9, 16.0, 14.3, 9.1, 2.7, -3.2, -12.9]", "delta_dry_bulb" => 33.0 },
56
- "CAN_NF_St.Johns.718010_CWEC.epw" => { "country" => "CAN", "state_province" => "NF", "city" => "St John's","hdd18" => 4886.0,"cdd18" => 24.0,"latitude" => 47.62, "longitude" => -52.73, "elevation" => 140.0, "monthly_dry_bulb" => "[-3.3, -5.5, -2.1, 1.1, 5.7, 11.3, 15.0, 14.7, 11.4, 6.6, 2.4, -2.0]", "delta_dry_bulb" => 20.5 },
57
- "CAN_NF_Stephenville.718150_CWEC.epw" => { "country" => "CAN", "state_province" => "NF", "city" => "Stephenville","hdd18" => 4724.0,"cdd18" => 10.0,"latitude" => 48.53, "longitude" => -58.55, "elevation" => 26.0, "monthly_dry_bulb" => "[-5.2, -6.7, -2.2, 3.4, 7.1, 11.3, 16.3, 16.4, 12.5, 7.3, 2.2, -2.4]", "delta_dry_bulb" => 23.099999999999998 },
58
- "CAN_NS_Greenwood.713970_CWEC.epw" => { "country" => "CAN", "state_province" => "NS", "city" => "Greenwood","hdd18" => 4131.0,"cdd18" => 128.0,"latitude" => 44.98, "longitude" => -64.92, "elevation" => 28.0, "monthly_dry_bulb" => "[-4.7, -3.9, -0.7, 4.6, 10.9, 16.1, 19.1, 18.8, 13.5, 7.9, 4.2, -2.0]", "delta_dry_bulb" => 23.8 },
59
- "CAN_NS_Sable.Island.716000_CWEC.epw" => { "country" => "CAN", "state_province" => "NS", "city" => "Sable Island","hdd18" => 3860.0,"cdd18" => 14.0,"latitude" => 43.93, "longitude" => -60.02, "elevation" => 4.0, "monthly_dry_bulb" => "[-0.7, -0.9, 0.6, 3.6, 6.4, 11.2, 15.1, 17.4, 15.5, 11.3, 7.0, 2.3]", "delta_dry_bulb" => 18.299999999999997 },
60
- "CAN_NS_Shearwater.716010_CWEC.epw" => { "country" => "CAN", "state_province" => "NS", "city" => "Shearwater","hdd18" => 4197.0,"cdd18" => 58.0,"latitude" => 44.63, "longitude" => -63.5, "elevation" => 51.0, "monthly_dry_bulb" => "[-4.1, -4.2, -0.8, 3.9, 8.8, 13.7, 17.6, 17.8, 14.3, 9.3, 4.8, -1.9]", "delta_dry_bulb" => 22.0 },
61
- "CAN_NS_Sydney.717070_CWEC.epw" => { "country" => "CAN", "state_province" => "NS", "city" => "Sydney","hdd18" => 4634.0,"cdd18" => 51.0,"latitude" => 46.17, "longitude" => -60.05, "elevation" => 62.0, "monthly_dry_bulb" => "[-5.3, -6.5, -3.1, 2.0, 7.3, 12.4, 17.5, 17.3, 13.0, 8.8, 3.0, -2.0]", "delta_dry_bulb" => 24.0 },
62
- "CAN_NS_Truro.713980_CWEC.epw" => { "country" => "CAN", "state_province" => "NS", "city" => "Truro","hdd18" => 4537.0,"cdd18" => 35.0,"latitude" => 45.37, "longitude" => -63.27, "elevation" => 40.0, "monthly_dry_bulb" => "[-6.0, -7.5, -2.5, 2.4, 8.3, 14.6, 17.7, 17.0, 13.7, 8.4, 3.7, -2.7]", "delta_dry_bulb" => 25.2 },
63
- "CAN_NT_Inuvik.719570_CWEC.epw" => { "country" => "CAN", "state_province" => "NT", "city" => "Inuvik Ua","hdd18" => 9952.0,"cdd18" => 17.0,"latitude" => 68.3, "longitude" => -133.48, "elevation" => 68.0, "monthly_dry_bulb" => "[-28.2, -27.5, -23.9, -12.9, -0.1, 10.4, 12.4, 10.4, 3.3, -8.9, -21.0, -25.9]", "delta_dry_bulb" => 40.6 },
64
- "CAN_NU_Resolute.719240_CWEC.epw" => { "country" => "CAN", "state_province" => "NU", "city" => "Resolute","hdd18" => 12570.0,"cdd18" => 0.0,"latitude" => 74.72, "longitude" => -94.98, "elevation" => 67.0, "monthly_dry_bulb" => "[-30.6, -30.7, -32.2, -25.0, -10.8, -1.2, 3.7, 2.0, -4.2, -14.6, -24.7, -30.1]", "delta_dry_bulb" => 35.900000000000006 },
65
- "CAN_ON_Kingston.716200_CWEC.epw" => { "country" => "CAN", "state_province" => "ON", "city" => "Kingston","hdd18" => 4287.0,"cdd18" => 187.0,"latitude" => 44.22, "longitude" => -76.6, "elevation" => 93.0, "monthly_dry_bulb" => "[-6.3, -7.1, -2.0, 3.5, 11.2, 16.0, 20.3, 20.6, 15.3, 10.5, 3.3, -5.2]", "delta_dry_bulb" => 27.700000000000003 },
66
- "CAN_ON_London.716230_CWEC.epw" => { "country" => "CAN", "state_province" => "ON", "city" => "London","hdd18" => 4111.0,"cdd18" => 211.0,"latitude" => 43.03, "longitude" => -81.15, "elevation" => 278.0, "monthly_dry_bulb" => "[-7.1, -6.2, -0.7, 6.4, 11.7, 17.8, 20.8, 19.0, 15.3, 9.8, 3.2, -3.2]", "delta_dry_bulb" => 27.9 },
67
- "CAN_ON_Mount.Forest.716310_CWEC.epw" => { "country" => "CAN", "state_province" => "ON", "city" => "Mount Forest","hdd18" => 4578.0,"cdd18" => 121.0,"latitude" => 43.98, "longitude" => -80.75, "elevation" => 415.0, "monthly_dry_bulb" => "[-9.2, -8.4, -2.6, 5.2, 10.4, 16.3, 18.5, 17.8, 14.3, 9.1, 1.6, -4.3]", "delta_dry_bulb" => 27.7 },
68
- "CAN_ON_Muskoka.716300_CWEC.epw" => { "country" => "CAN", "state_province" => "ON", "city" => "Muskoka","hdd18" => 4774.0,"cdd18" => 97.0,"latitude" => 44.97, "longitude" => -79.3, "elevation" => 282.0, "monthly_dry_bulb" => "[-10.8, -9.6, -3.0, 4.7, 12.4, 16.4, 18.5, 17.3, 12.3, 6.9, 1.9, -5.8]", "delta_dry_bulb" => 29.3 },
69
- "CAN_ON_North.Bay.717310_CWEC.epw" => { "country" => "CAN", "state_province" => "ON", "city" => "North Bay","hdd18" => 5341.0,"cdd18" => 103.0,"latitude" => 46.35, "longitude" => -79.43, "elevation" => 371.0, "monthly_dry_bulb" => "[-13.8, -11.1, -6.0, 3.5, 11.2, 16.0, 18.4, 17.0, 12.2, 6.9, -1.5, -10.1]", "delta_dry_bulb" => 32.2 },
70
- "CAN_ON_Ottawa.716280_CWEC.epw" => { "country" => "CAN", "state_province" => "ON", "city" => "Ottawa Int'l","hdd18" => 4664.0,"cdd18" => 189.0,"latitude" => 45.32, "longitude" => -75.67, "elevation" => 114.0, "monthly_dry_bulb" => "[-11.5, -9.3, -2.1, 5.6, 12.2, 18.1, 20.3, 19.3, 14.2, 7.4, 1.2, -7.4]", "delta_dry_bulb" => 31.8 },
71
- "CAN_ON_Sault.Ste.Marie.712600_CWEC.epw" => { "country" => "CAN", "state_province" => "ON", "city" => "Sault Ste Marie","hdd18" => 4993.0,"cdd18" => 75.0,"latitude" => 46.48, "longitude" => -84.52, "elevation" => 192.0, "monthly_dry_bulb" => "[-10.4, -10.0, -5.1, 3.9, 10.0, 14.3, 17.9, 17.0, 13.4, 7.8, 0.8, -6.4]", "delta_dry_bulb" => 28.299999999999997 },
72
- "CAN_ON_Simcoe.715270_CWEC.epw" => { "country" => "CAN", "state_province" => "ON", "city" => "Simcoe","hdd18" => 4066.0,"cdd18" => 190.0,"latitude" => 42.85, "longitude" => -80.27, "elevation" => 241.0, "monthly_dry_bulb" => "[-6.3, -6.1, -0.3, 5.1, 11.6, 18.3, 20.1, 19.6, 14.3, 9.6, 3.8, -2.1]", "delta_dry_bulb" => 26.400000000000002 },
73
- "CAN_ON_Thunder.Bay.717490_CWEC.epw" => { "country" => "CAN", "state_province" => "ON", "city" => "Thunder Bay","hdd18" => 5624.0,"cdd18" => 60.0,"latitude" => 48.37, "longitude" => -89.32, "elevation" => 199.0, "monthly_dry_bulb" => "[-15.8, -10.7, -5.9, 1.9, 9.9, 14.1, 18.0, 16.2, 11.0, 5.8, -1.7, -10.8]", "delta_dry_bulb" => 33.8 },
74
- "CAN_ON_Timmins.717390_CWEC.epw" => { "country" => "CAN", "state_province" => "ON", "city" => "Timmins","hdd18" => 5952.0,"cdd18" => 63.0,"latitude" => 48.57, "longitude" => -81.37, "elevation" => 295.0, "monthly_dry_bulb" => "[-16.4, -13.0, -7.8, 1.3, 9.9, 14.5, 17.4, 15.9, 10.8, 5.2, -3.6, -12.8]", "delta_dry_bulb" => 33.8 },
75
- "CAN_ON_Toronto.716240_CWEC.epw" => { "country" => "CAN", "state_province" => "ON", "city" => "Toronto Int'l","hdd18" => 4088.0,"cdd18" => 231.0,"latitude" => 43.67, "longitude" => -79.63, "elevation" => 173.0, "monthly_dry_bulb" => "[-5.8, -5.7, -0.7, 5.7, 12.0, 17.7, 20.8, 19.8, 15.0, 8.5, 3.5, -2.5]", "delta_dry_bulb" => 26.6 },
76
- "CAN_ON_Trenton.716210_CWEC.epw" => { "country" => "CAN", "state_province" => "ON", "city" => "Trenton","hdd18" => 4176.0,"cdd18" => 207.0,"latitude" => 44.12, "longitude" => -77.53, "elevation" => 86.0, "monthly_dry_bulb" => "[-6.9, -6.4, -0.8, 5.8, 12.4, 17.4, 20.8, 19.3, 15.0, 9.0, 2.8, -3.8]", "delta_dry_bulb" => 27.700000000000003 },
77
- "CAN_ON_Windsor.715380_CWEC.epw" => { "country" => "CAN", "state_province" => "ON", "city" => "Windsor","hdd18" => 3570.0,"cdd18" => 367.0,"latitude" => 42.27, "longitude" => -82.97, "elevation" => 190.0, "monthly_dry_bulb" => "[-4.5, -4.0, 1.0, 8.4, 13.1, 19.9, 22.6, 21.1, 17.4, 11.6, 4.7, -1.5]", "delta_dry_bulb" => 27.1 },
78
- "CAN_PE_Charlottetown.717060_CWEC.epw" => { "country" => "CAN", "state_province" => "PE", "city" => "Charlottetown CDA","hdd18" => 4647.0,"cdd18" => 72.0,"latitude" => 46.28, "longitude" => -63.13, "elevation" => 54.0, "monthly_dry_bulb" => "[-7.5, -6.8, -3.5, 2.8, 9.0, 14.1, 18.1, 18.1, 14.2, 7.7, 3.2, -4.7]", "delta_dry_bulb" => 25.6 },
79
- "CAN_PQ_Bagotville.717270_CWEC.epw" => { "country" => "CAN", "state_province" => "PQ", "city" => "Bagotville","hdd18" => 5781.0,"cdd18" => 49.0,"latitude" => 48.33, "longitude" => -71.0, "elevation" => 159.0, "monthly_dry_bulb" => "[-14.8, -12.9, -5.7, 2.1, 8.7, 15.7, 17.6, 15.4, 10.3, 5.4, -2.2, -13.1]", "delta_dry_bulb" => 32.400000000000006 },
80
- "CAN_PQ_Baie.Comeau.711870_CWEC.epw" => { "country" => "CAN", "state_province" => "PQ", "city" => "Baie Comeau","hdd18" => 5889.0,"cdd18" => 3.0,"latitude" => 49.13, "longitude" => -68.2, "elevation" => 22.0, "monthly_dry_bulb" => "[-13.8, -11.6, -6.2, 0.7, 7.0, 12.3, 16.0, 14.3, 9.9, 4.4, -1.7, -9.8]", "delta_dry_bulb" => 29.8 },
81
- "CAN_PQ_Grindstone.Island_CWEC.epw" => { "country" => "CAN", "state_province" => "PQ", "city" => "Grindstone Island","hdd18" => 4941.0,"cdd18" => 18.0,"latitude" => 47.38, "longitude" => -61.87, "elevation" => 59.0, "monthly_dry_bulb" => "[-7.0, -7.0, -2.2, 0.0, 5.1, 11.7, 15.9, 16.8, 12.3, 6.6, 3.2, -2.1]", "delta_dry_bulb" => 23.8 },
82
- "CAN_PQ_Kuujjuarapik.719050_CWEC.epw" => { "country" => "CAN", "state_province" => "PQ", "city" => "Kuujjuarapik","hdd18" => 7986.0,"cdd18" => 12.0,"latitude" => 55.28, "longitude" => -77.77, "elevation" => 12.0, "monthly_dry_bulb" => "[-21.0, -20.4, -16.8, -6.9, 1.3, 6.5, 10.3, 11.0, 7.4, 2.0, -4.2, -16.2]", "delta_dry_bulb" => 32.0 },
83
- "CAN_PQ_Kuujuaq.719060_CWEC.epw" => { "country" => "CAN", "state_province" => "PQ", "city" => "Kuujuaq","hdd18" => 8491.0,"cdd18" => 0.0,"latitude" => 58.1, "longitude" => -68.42, "elevation" => 37.0, "monthly_dry_bulb" => "[-20.7, -20.8, -19.0, -8.9, -0.3, 6.8, 11.0, 10.8, 4.7, -0.8, -8.2, -18.8]", "delta_dry_bulb" => 31.8 },
84
- "CAN_PQ_La.Grande.Riviere.718270_CWEC.epw" => { "country" => "CAN", "state_province" => "PQ", "city" => "La Grande Riviere","hdd18" => 7616.0,"cdd18" => 11.0,"latitude" => 53.63, "longitude" => -77.7, "elevation" => 195.0, "monthly_dry_bulb" => "[-21.8, -21.6, -14.3, -5.3, 6.1, 10.1, 13.4, 12.0, 7.6, 1.9, -5.9, -17.4]", "delta_dry_bulb" => 35.2 },
85
- "CAN_PQ_Lake.Eon.714210_CWEC.epw" => { "country" => "CAN", "state_province" => "PQ", "city" => "Lake Eon","hdd18" => 7383.0,"cdd18" => 8.0,"latitude" => 51.87, "longitude" => -63.28, "elevation" => 561.0, "monthly_dry_bulb" => "[-20.3, -14.7, -9.8, -5.1, 2.0, 9.2, 13.6, 11.6, 6.7, 0.1, -6.3, -14.2]", "delta_dry_bulb" => 33.9 },
86
- "CAN_PQ_Mont.Joli.717180_CWEC.epw" => { "country" => "CAN", "state_province" => "PQ", "city" => "Mont Joli","hdd18" => 5522.0,"cdd18" => 65.0,"latitude" => 48.6, "longitude" => -68.22, "elevation" => 52.0, "monthly_dry_bulb" => "[-12.8, -10.4, -5.2, 1.8, 7.8, 14.1, 18.0, 16.2, 10.8, 5.2, -0.5, -9.1]", "delta_dry_bulb" => 30.8 },
87
- "CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw" => { "country" => "CAN", "state_province" => "PQ", "city" => "Montreal Int'l","hdd18" => 4493.0,"cdd18" => 234.0,"latitude" => 45.47, "longitude" => -73.75, "elevation" => 36.0, "monthly_dry_bulb" => "[-9.8, -9.4, -2.7, 6.5, 13.0, 18.4, 20.4, 20.0, 14.6, 8.2, 2.6, -6.8]", "delta_dry_bulb" => 30.2 },
88
- "CAN_PQ_Montreal.Jean.Brebeuf.716278_CWEC.epw" => { "country" => "CAN", "state_province" => "PQ", "city" => "Montreal Jean Brebeuf","hdd18" => 4616.0,"cdd18" => 209.0,"latitude" => 45.5, "longitude" => -73.62, "elevation" => 133.0, "monthly_dry_bulb" => "[-10.5, -9.4, -3.4, 5.2, 12.9, 18.6, 20.7, 19.6, 14.6, 7.8, 1.2, -6.8]", "delta_dry_bulb" => 31.2 },
89
- "CAN_PQ_Montreal.Mirabel.716278_CWEC.epw" => { "country" => "CAN", "state_province" => "PQ", "city" => "Montreal Mirabel","hdd18" => 4861.0,"cdd18" => 102.0,"latitude" => 45.68, "longitude" => -74.03, "elevation" => 82.0, "monthly_dry_bulb" => "[-13.9, -7.2, -3.2, 5.7, 12.4, 17.0, 19.5, 17.7, 13.1, 6.7, 0.7, -9.5]", "delta_dry_bulb" => 33.4 },
90
- "CAN_PQ_Nitchequon.CAN270_CWEC.epw" => { "country" => "CAN", "state_province" => "PQ", "city" => "Nitchequon","hdd18" => 7922.0,"cdd18" => 6.0,"latitude" => 53.2, "longitude" => -70.9, "elevation" => 536.0, "monthly_dry_bulb" => "[-22.5, -21.4, -14.2, -4.2, 2.7, 9.6, 13.3, 11.8, 6.4, -0.1, -7.8, -19.0]", "delta_dry_bulb" => 35.8 },
91
- "CAN_PQ_Quebec.717140_CWEC.epw" => { "country" => "CAN", "state_province" => "PQ", "city" => "Quebec City","hdd18" => 4964.0,"cdd18" => 111.0,"latitude" => 46.8, "longitude" => -71.38, "elevation" => 73.0, "monthly_dry_bulb" => "[-11.6, -10.4, -3.9, 3.6, 11.4, 16.2, 19.4, 18.0, 12.9, 7.1, -0.2, -7.2]", "delta_dry_bulb" => 31.0 },
92
- "CAN_PQ_Riviere.du.Loup.717150_CWEC.epw" => { "country" => "CAN", "state_province" => "PQ", "city" => "Riviere Du Loup","hdd18" => 5424.0,"cdd18" => 82.0,"latitude" => 47.8, "longitude" => -69.55, "elevation" => 148.0, "monthly_dry_bulb" => "[-12.3, -10.9, -5.2, 1.0, 8.7, 14.4, 17.8, 16.9, 10.0, 6.0, 0.8, -7.7]", "delta_dry_bulb" => 30.1 },
93
- "CAN_PQ_Roberval.717280_CWEC.epw" => { "country" => "CAN", "state_province" => "PQ", "city" => "Roberval","hdd18" => 5757.0,"cdd18" => 97.0,"latitude" => 48.52, "longitude" => -72.27, "elevation" => 179.0, "monthly_dry_bulb" => "[-17.1, -12.7, -6.3, 2.1, 10.5, 15.7, 18.5, 16.2, 10.6, 5.6, -1.0, -13.1]", "delta_dry_bulb" => 35.6 },
94
- "CAN_PQ_Schefferville.718280_CWEC.epw" => { "country" => "CAN", "state_province" => "PQ", "city" => "Schefferville","hdd18" => 8057.0,"cdd18" => 7.0,"latitude" => 54.8, "longitude" => -66.82, "elevation" => 521.0, "monthly_dry_bulb" => "[-21.6, -20.1, -14.1, -5.0, 1.3, 8.5, 13.0, 11.1, 5.3, -1.1, -9.3, -17.7]", "delta_dry_bulb" => 34.6 },
95
- "CAN_PQ_Sept-Iles.718110_CWEC.epw" => { "country" => "CAN", "state_province" => "PQ", "city" => "Sept-Iles","hdd18" => 6134.0,"cdd18" => 4.0,"latitude" => 50.22, "longitude" => -66.27, "elevation" => 55.0, "monthly_dry_bulb" => "[-15.2, -14.5, -5.9, 1.0, 6.3, 11.6, 15.7, 14.1, 9.3, 3.8, -1.8, -11.1]", "delta_dry_bulb" => 30.9 },
96
- "CAN_PQ_Sherbrooke.716100_CWEC.epw" => { "country" => "CAN", "state_province" => "PQ", "city" => "Sherbrooke","hdd18" => 5068.0,"cdd18" => 93.0,"latitude" => 45.43, "longitude" => -71.68, "elevation" => 241.0, "monthly_dry_bulb" => "[-10.0, -9.7, -3.6, 4.0, 11.3, 16.2, 18.2, 16.7, 11.6, 6.2, -0.9, -8.6]", "delta_dry_bulb" => 28.2 },
97
- "CAN_PQ_St.Hubert.713710_CWEC.epw" => { "country" => "CAN", "state_province" => "PQ", "city" => "St Hubert","hdd18" => 4566.0,"cdd18" => 251.0,"latitude" => 45.52, "longitude" => -73.42, "elevation" => 27.0, "monthly_dry_bulb" => "[-10.0, -8.7, -2.8, 5.3, 13.4, 18.3, 21.2, 19.5, 14.9, 7.8, 1.4, -7.2]", "delta_dry_bulb" => 31.2 },
98
- "CAN_PQ_Ste.Agathe.des.Monts.717200_CWEC.epw" => { "country" => "CAN", "state_province" => "PQ", "city" => "Ste Agathe Des Monts","hdd18" => 5350.0,"cdd18" => 45.0,"latitude" => 46.05, "longitude" => -74.28, "elevation" => 395.0, "monthly_dry_bulb" => "[-11.9, -11.0, -5.4, 2.9, 10.9, 15.3, 17.7, 16.4, 11.2, 5.1, -1.0, -9.6]", "delta_dry_bulb" => 29.6 },
99
- "CAN_PQ_Val.d.Or.717250_CWEC.epw" => { "country" => "CAN", "state_province" => "PQ", "city" => "Val d'Or","hdd18" => 6129.0,"cdd18" => 79.0,"latitude" => 48.07, "longitude" => -77.78, "elevation" => 337.0, "monthly_dry_bulb" => "[-17.7, -15.2, -7.4, 0.8, 9.8, 14.6, 17.3, 15.5, 10.6, 3.8, -2.3, -13.9]", "delta_dry_bulb" => 35.0 },
100
- "CAN_SK_Estevan.718620_CWEC.epw" => { "country" => "CAN", "state_province" => "SK", "city" => "Estevan","hdd18" => 5370.0,"cdd18" => 189.0,"latitude" => 49.22, "longitude" => -102.97, "elevation" => 581.0, "monthly_dry_bulb" => "[-14.9, -11.4, -5.6, 4.9, 11.9, 17.1, 20.2, 18.8, 12.2, 6.0, -3.4, -11.0]", "delta_dry_bulb" => 35.1 },
101
- "CAN_SK_North.Battleford.718760_CWEC.epw" => { "country" => "CAN", "state_province" => "SK", "city" => "North Battleford","hdd18" => 5962.0,"cdd18" => 75.0,"latitude" => 52.77, "longitude" => -108.25, "elevation" => 548.0, "monthly_dry_bulb" => "[-17.3, -13.1, -8.6, 3.3, 11.1, 15.9, 18.1, 16.7, 11.0, 4.7, -6.2, -14.0]", "delta_dry_bulb" => 35.400000000000006 },
102
- "CAN_SK_Regina.718630_CWEC.epw" => { "country" => "CAN", "state_province" => "SK", "city" => "Regina","hdd18" => 5646.0,"cdd18" => 129.0,"latitude" => 50.43, "longitude" => -104.67, "elevation" => 577.0, "monthly_dry_bulb" => "[-16.0, -11.4, -6.6, 3.2, 12.1, 16.5, 19.4, 17.6, 10.9, 4.1, -4.9, -11.1]", "delta_dry_bulb" => 35.4 },
103
- "CAN_SK_Saskatoon.718660_CWEC.epw" => { "country" => "CAN", "state_province" => "SK", "city" => "Saskatoon","hdd18" => 5812.0,"cdd18" => 84.0,"latitude" => 52.17, "longitude" => -106.68, "elevation" => 504.0, "monthly_dry_bulb" => "[-15.6, -12.8, -7.8, 3.8, 11.8, 16.2, 18.8, 16.5, 10.5, 4.9, -5.9, -13.7]", "delta_dry_bulb" => 34.4 },
104
- "CAN_SK_Swift.Current.718700_CWEC.epw" => { "country" => "CAN", "state_province" => "SK", "city" => "Swift Current","hdd18" => 5227.0,"cdd18" => 96.0,"latitude" => 50.28, "longitude" => -107.68, "elevation" => 818.0, "monthly_dry_bulb" => "[-12.6, -9.1, -5.1, 4.9, 11.2, 15.9, 18.2, 17.4, 11.2, 6.5, -3.3, -8.8]", "delta_dry_bulb" => 30.799999999999997 },
105
- "CAN_YT_Whitehorse.719640_CWEC.epw" => { "country" => "CAN", "state_province" => "YT", "city" => "Whitehorse","hdd18" => 6946.0,"cdd18" => 2.0,"latitude" => 60.72, "longitude" => -135.07, "elevation" => 703.0, "monthly_dry_bulb" => "[-20.5, -11.3, -6.3, 0.1, 6.7, 11.5, 14.0, 11.6, 7.1, 0.2, -10.3, -15.8]", "delta_dry_bulb" => 34.5 },
106
- "USA_CO_Denver.Intl.AP.725650_TMY3.epw" => { "country" => "USA", "state_province" => "CO", "city" => "Denver Intl Ap","hdd18" => 3131.0,"cdd18" => 528.0,"latitude" => 39.83, "longitude" => -104.65, "elevation" => 1650.0, "monthly_dry_bulb" => "[0.8, -0.1, 6.1, 5.8, 15.5, 23.1, 22.3, 22.6, 19.2, 10.0, 2.9, 1.4]", "delta_dry_bulb" => 23.200000000000003 },
107
- "USA_MA_Boston-Logan.Intl.AP.725090_TMY3.epw" => { "country" => "USA", "state_province" => "MA", "city" => "Boston Logan IntL Arpt","hdd18" => 3121.0,"cdd18" => 420.0,"latitude" => 42.37, "longitude" => -71.02, "elevation" => 6.0, "monthly_dry_bulb" => "[-3.0, -0.5, 3.8, 8.6, 14.9, 18.9, 23.4, 21.7, 18.1, 12.2, 6.3, 2.2]", "delta_dry_bulb" => 26.4 },
108
- }
109
-
110
- #This method will look up the weather data.
111
- #@author phylroy.lopez@nrcan.gc.ca
112
- #@param file [String]
113
- def self.weather_data_lookup(file)
114
-
115
- end
116
-
117
- #This method will create a climate index file.
118
- #@author phylroy.lopez@nrcan.gc.ca
119
- #@param folder [String]
120
- #@param output_file [String]
121
- def self.create_climate_index_file(folder = '../weather/', output_file = "C:/test/phylroy.csv" )
122
- counter = 0
123
- File.open(output_file, 'w') { |file|
124
- file.write( "file,country,state_province_region,city,hdd18,cdd18,latitude,longitude,elevation, monthlyDB, deltaDB\n" )
125
- BTAP::FileIO::get_find_files_from_folder_by_extension(folder, 'epw').each do |wfile|
126
- wf = BTAP::Environment::WeatherFile.new(wfile)
127
- file.write( "\"#{File.basename(wfile)}\" => { \"country\" => \"#{wf.country}\", \"state_province\" => \"#{wf.state_province_region}\", \"city\" => \"#{wf.city}\",\"hdd18\" => #{wf.hdd18},\"cdd18\" => #{wf.cdd18},\"latitude\" => #{wf.latitude}, \"longitude\" => #{wf.longitude}, \"elevation\" => #{wf.elevation}, \"monthly_dry_bulb\" => \"#{wf.monthly_dry_bulb}\", \"delta_dry_bulb\" => #{wf.delta_dry_bulb} },\n" )
128
- counter += 1
129
- end
130
-
131
- }
132
- puts "parsed #{counter} weather files."
133
- end
134
-
135
-
136
- class StatFile
137
- attr_accessor :path
138
- attr_accessor :valid
139
- attr_accessor :lat
140
- attr_accessor :lon
141
- attr_accessor :elevation
142
- attr_accessor :gmt
143
- attr_accessor :monthly_dry_bulb
144
- attr_accessor :hdd18
145
- attr_accessor :cdd18
146
- attr_accessor :hdd10
147
- attr_accessor :cdd10
148
- attr_accessor :heating_design_info
149
- attr_accessor :cooling_design_info
150
- attr_accessor :extremes_design_info
151
-
152
- #This method initializes.
153
- #@author phylroy.lopez@nrcan.gc.ca
154
- #@param path [String]
155
- def initialize(path)
156
- @path = Pathname.new(path)
157
- @valid = false
158
- @lat = []
159
- @lon = []
160
- @gmt = []
161
- @elevation = []
162
- @hdd18 = []
163
- @cdd18 = []
164
- @hdd10 = []
165
- @cdd10 = []
166
- @monthly_dry_bulb = []
167
- @delta_dry_bulb = []
168
- @heating_design_info = []
169
- @cooling_design_info = []
170
- @extremes_design_info = []
171
- init
172
- end
173
-
174
- def valid?
175
- return @valid
176
- end
177
-
178
- # the mean of the mean monthly dry bulbs
179
- def mean_dry_bulb
180
- if not @monthly_dry_bulb.empty? then
181
- sum = 0
182
- @monthly_dry_bulb.each { |db| sum += db }
183
- mean = sum/@monthly_dry_bulb.size
184
- else
185
- mean = ""
186
- end
187
- mean
188
- end
189
-
190
- # max - min of the mean monthly dry bulbs
191
- def delta_dry_bulb
192
- if not @monthly_dry_bulb.empty? then
193
- delta_t = @monthly_dry_bulb.max-@monthly_dry_bulb.min
194
- else
195
- delta_t = ""
196
- end
197
-
198
- delta_t
199
- end
200
-
201
- private
202
-
203
- # initialize
204
- def init
205
- if @path.exist?
206
- text = File.read(@path).force_encoding("iso-8859-1")
207
- parse(text)
208
- #get HDD and CDD 18 in a better manner.
209
- unless File.exist?(@path)
210
- raise 'File does not exist: ' + @path.to_s
211
- end
212
- File.open(@path).each do |l|
213
- line = String.new(l)
214
- if line.include?("HDD base 18C")
215
- @hdd18 = line.split(' ')[3..14].map { |x| x.to_i }.inject{|sum,x| sum + x }.to_f
216
- end
217
- if line.include?("CDD base 18C")
218
- @cdd18 = line.split(' ')[3..14].map { |x| x.to_i }.inject{|sum,x| sum + x }.to_f
219
- break
220
- end
221
- end
222
- raise ("Invalid Weather file: Could not determine HDD or CDD from weatherstatfile. @path") if @cdd18.nil? or @hdd18.nil?
223
- end
224
- end
225
-
226
- #This method parses text.
227
- #@author phylroy.lopez@nrcan.gc.ca
228
- #@param text [String]
229
- #@return [Void]
230
- def parse(text)
231
-
232
- # get lat, lon, gmt
233
- regex = /\{(N|S)\s*([0-9]*).\s*([0-9]*)'\}\s*\{(E|W)\s*([0-9]*).\s*([0-9]*)'\}\s*\{GMT\s*(.*)\s*Hours\}/
234
- match_data = text.match(regex)
235
- if match_data.nil?
236
- puts "Can't find lat/lon/gmt"
237
- return
238
- else
239
-
240
- @lat = match_data[2].to_f + (match_data[3].to_f)/60.0
241
- if match_data[1] == 'S'
242
- @lat = -@lat
243
- end
244
-
245
- @lon = match_data[5].to_f + (match_data[6].to_f)/60.0
246
- if match_data[4] == 'W'
247
- @lon = -@lon
248
- end
249
-
250
- @gmt = match_data[7]
251
- end
252
-
253
- # get elevation
254
- regex = /Elevation --\s*(.*)m (above|below) sea level/
255
- match_data = text.match(regex)
256
- if match_data.nil?
257
- puts "Can't find elevation"
258
- return
259
- else
260
- @elevation = match_data[1].to_f
261
- if match_data[2] == 'below'
262
- @elevation = -@elevation
263
- end
264
- end
265
-
266
-
267
-
268
-
269
-
270
-
271
-
272
- # get heating and cooling degree days
273
- cdd10Regex = /-\s*(.*) annual \(standard\) cooling degree-days \(10.*C baseline\)/
274
- match_data = text.match(cdd10Regex)
275
- if match_data.nil?
276
- puts "Can't find CDD 10"
277
- else
278
- @cdd10 = match_data[1].to_f
279
- end
280
-
281
- hdd10Regex = /-\s*(.*) annual \(standard\) heating degree-days \(10.*C baseline\)/
282
- match_data = text.match(hdd10Regex)
283
- if match_data.nil?
284
- puts "Can't find HDD 10"
285
- else
286
- @hdd10 = match_data[1].to_f
287
- end
288
-
289
- cdd18Regex = /-\s*(.*) annual \(standard\) cooling degree-days \(18.3.*C baseline\)/
290
- match_data = text.match(cdd18Regex)
291
- if match_data.nil?
292
- puts "Can't find CDD 18"
293
- else
294
- @cdd18 = match_data[1].to_f
295
- end
296
-
297
- hdd18Regex = /-\s*(.*) annual \(standard\) heating degree-days \(18.3.*C baseline\)/
298
- match_data = text.match(hdd18Regex)
299
- if match_data.nil?
300
- puts "Can't find HDD 18"
301
- else
302
- @hdd18 = match_data[1].to_f
303
- end
304
-
305
-
306
- # Design Stat ColdestMonth DB996 DB990 DP996 HR_DP996 DB_DP996 DP990 HR_DP990 DB_DP990 WS004c DB_WS004c WS010c DB_WS010c WS_DB996 WD_DB996
307
- # Units {} {�C} {�C} {�C} {} {�C} {�C} {} {�C} {m/s} {�C} {m/s} {�C} {m/s} {deg}
308
- # Heating 12 -7 -4 -13.9 1.1 -5 -9.6 1.7 -2.9 14.2 5.9 11.9 6.8 2.9 100
309
- #use regex to get the temperatures
310
- regex = /\s*Heating(\s*\d+.*)\n/
311
- match_data = text.match(regex)
312
- if match_data.nil?
313
- puts "Can't find heating design information"
314
- else
315
- # first match is outdoor air temps
316
-
317
- heating_design_info_raw = match_data[1].strip.split(/\s+/)
318
-
319
- # have to be 14 data points
320
- if heating_design_info_raw.size != 15
321
- puts "Can't find cooling design info, found #{heating_design_info_raw.size}"
322
- end
323
-
324
- # insert as numbers
325
- heating_design_info_raw.each do |value|
326
- @heating_design_info << value.to_f
327
- end
328
- #puts @heating_design_info
329
- end
330
-
331
- regex = /\s*Cooling(\s*\d+.*)\n/
332
- match_data = text.match(regex)
333
- if match_data.nil?
334
- puts "Can't find cooling design information"
335
- else
336
- # first match is outdoor air temps
337
-
338
- design_info_raw = match_data[1].strip.split(/\s+/)
339
-
340
- # have to be 14 data points
341
- if design_info_raw.size != 32
342
- puts "Can't find cooling design info, found #{design_info_raw.size} "
343
- end
344
-
345
- # insert as numbers
346
- design_info_raw.each do |value|
347
- @cooling_design_info << value
348
- end
349
- #puts @cooling_design_info
350
- end
351
-
352
- regex = /\s*Extremes\s*(.*)\n/
353
- match_data = text.match(regex)
354
- if match_data.nil?
355
- puts "Can't find extremes design information"
356
- else
357
- # first match is outdoor air temps
358
-
359
- design_info_raw = match_data[1].strip.split(/\s+/)
360
-
361
- # have to be 14 data points
362
- if design_info_raw.size != 16
363
- #puts "Can't find extremes design info"
364
- end
365
-
366
- # insert as numbers
367
- design_info_raw.each do |value|
368
- @extremes_design_info << value
369
- end
370
- #puts @extremes_design_info
371
- end
372
-
373
-
374
-
375
-
376
- #use regex to get the temperatures
377
- regex = /Daily Avg(.*)\n/
378
- match_data = text.match(regex)
379
- if match_data.nil?
380
- puts "Can't find outdoor air temps"
381
- else
382
- # first match is outdoor air temps
383
- monthly_temps = match_data[1].strip.split(/\s+/)
384
-
385
- # have to be 12 months
386
- if monthly_temps.size != 12
387
- puts "Can't find outdoor air temps"
388
- end
389
-
390
- # insert as numbers
391
- monthly_temps.each { |temp| @monthly_dry_bulb << temp.to_f }
392
- #puts "#{@monthly_dry_bulb}"
393
- end
394
-
395
- # now we are valid
396
- @valid = true
397
- end
398
-
399
- end
400
- class WeatherFile
401
-
402
- attr_accessor :location_name,
403
- :energy_plus_location_name,
404
- :latitude,
405
- :longitude,
406
- :elevation,
407
- :city,
408
- :state_province_region,
409
- :country,
410
- :hdd18,
411
- :cdd18,
412
- :hdd10,
413
- :cdd10,
414
- :monthly_dry_bulb,
415
- :delta_dry_bulb
416
-
417
- attr_accessor :heating_design_info
418
- attr_accessor :cooling_design_info
419
- attr_accessor :extremes_design_info
420
-
421
- Year = 0
422
- Month = 1
423
- Day = 2
424
- Hour= 3
425
- Minute = 4
426
- Data_Source = 5
427
- Dry_Bulb_Temperature = 6
428
- Dew_Point_Temperature = 7
429
- Relative_Humidity = 8
430
- Atmospheric_Station_Pressure = 9
431
- Extraterrestrial_Horizontal_Radiation = 10 #not used
432
- Extraterrestrial_Direct_Normal_Radiation = 11 #not used
433
- Horizontal_Infrared_Radiation_Intensity = 12
434
- Global_Horizontal_Radiation = 13 #not used
435
- Direct_Normal_Radiation = 14
436
- Diffuse_Horizontal_Radiation = 15
437
- Global_Horizontal_Illuminance = 16 #not used
438
- Direct_Normal_Illuminance = 17#not used
439
- Diffuse_Horizontal_Illuminance = 18#not used
440
- Zenith_Luminance = 19#not used
441
- Wind_Direction = 20
442
- Wind_Speed = 21
443
- Total_Sky_Cover = 22#not used
444
- Opaque_Sky_Cover = 23#not used
445
- Visibility = 24#not used
446
- Ceiling_Height = 25#not used
447
- Present_Weather_Observation = 26
448
- Present_Weather_Codes = 27
449
- Precipitable_Water = 28 #not used
450
- Aerosol_Optical_Depth = 29 #not used
451
- Snow_Depth = 30
452
- Days_Since_Last_Snowfall = 31#not used
453
- Albedo = 32 #not used
454
- Liquid_Precipitation_Depth = 33
455
- Liquid_Precipitation_Quantity = 34
456
-
457
- #This method initializes and returns self.
458
- #@author phylroy.lopez@nrcan.gc.ca
459
- #@param weather_file [String]
460
- #@return [String] self
461
- def initialize(weather_file)
462
- # Define the openstudio-standards weather location
463
- top_dir = File.expand_path( '../../..',File.dirname(__FILE__))
464
- weather_dir = "#{top_dir}/data/weather"
465
-
466
- # First check if the epw file exists at a full path. If not found there,
467
- # check for the file in the openstudio-standards/data/weather directory.
468
- weather_file = weather_file.to_s
469
- @epw_filepath = nil
470
- @ddy_filepath = nil
471
- @stat_filepath = nil
472
- if File.exists?(weather_file)
473
- @epw_filepath = "#{weather_file}"
474
- @ddy_filepath = "#{weather_file.sub('epw','ddy')}"
475
- @stat_filepath = "#{weather_file.sub('epw','stat')}"
476
- elsif File.exists?("#{weather_dir}/#{weather_file}")
477
- @epw_filepath = "#{weather_dir}/#{weather_file}"
478
- @ddy_filepath = "#{weather_dir}/#{weather_file.sub('epw','ddy')}"
479
- @stat_filepath = "#{weather_dir}/#{weather_file.sub('epw','stat')}"
480
- else
481
- raise("Could not find weather file #{weather_file}. Make sure file path is correct.")
482
- end
483
-
484
- # Ensure that epw, ddy, and stat file all exist
485
- raise("Weather file #{@epw_filepath} not found.") unless File.exists?(@epw_filepath) && @epw_filepath.downcase.include?('.epw')
486
- raise("Weather file ddy #{@ddy_filepath} not found.") unless File.exists?(@ddy_filepath) && @ddy_filepath.downcase.include?('.ddy')
487
- raise("Weather file stat #{@stat_filepath} not found.") unless File.exists?(@stat_filepath) && @stat_filepath.downcase.include?('.stat')
488
-
489
- #load file objects.
490
- @epw_file = OpenStudio::EpwFile.new(OpenStudio::Path.new(@epw_filepath))
491
- if OpenStudio::EnergyPlus.loadAndTranslateIdf(@ddy_filepath).empty?
492
- raise ("Unable to load ddy idf file#{@ddy_filepath}.")
493
- else
494
- @ddy_file = OpenStudio::EnergyPlus.loadAndTranslateIdf(@ddy_filepath).get
495
- end
496
- @stat_file = StatFile.new( @stat_filepath )
497
-
498
- #assign variables.
499
-
500
- @latitude = @epw_file.latitude
501
- @longitude = @epw_file.longitude
502
- @elevation = @epw_file.elevation
503
- @city = @epw_file.city
504
- @state_province_region = @epw_file.stateProvinceRegion
505
- @country = @epw_file.country
506
- @hdd18 = @stat_file.hdd18
507
- @cdd18 = @stat_file.cdd18
508
- @hdd10 = @stat_file.hdd10
509
- @cdd10 = @stat_file.cdd10
510
- @monthly_dry_bulb = @stat_file.monthly_dry_bulb
511
- @mean_dry_bulb = @stat_file.mean_dry_bulb
512
- @delta_dry_bulb = @stat_file.delta_dry_bulb
513
- @location_name = "#{@country}-#{@state_province_region}-#{@city}"
514
- @energy_plus_location_name = "#{@city}_#{@state_province_region}_#{@country}"
515
- @heating_design_info = @stat_file.heating_design_info
516
- @cooling_design_info = @stat_file.cooling_design_info
517
- @extremes_design_info = @stat_file.extremes_design_info
518
-
519
-
520
- return self
521
- end
522
-
523
- #This method will set the weather file and returns a log string.
524
- #@author phylroy.lopez@nrcan.gc.ca
525
- #@param model [OpenStudio::model::Model] A model object
526
- #@return [String] log
527
- def set_weather_file(model, runner = nil)
528
- BTAP::runner_register("Info", "BTAP::Environment::WeatherFile::set_weather",runner)
529
- OpenStudio::Model::WeatherFile::setWeatherFile(model, @epw_file)
530
- BTAP::runner_register("Info", "Set model \"#{model.building.get.name}\" to weather file #{model.weatherFile.get.path.get}.\n",runner)
531
-
532
- # Add or update site data
533
- site = model.getSite
534
- site.setName("#{@epw_file.city}_#{@epw_file.stateProvinceRegion}_#{@epw_file.country}")
535
- site.setLatitude(@epw_file.latitude)
536
- site.setLongitude(@epw_file.longitude)
537
- site.setTimeZone(@epw_file.timeZone)
538
- site.setElevation(@epw_file.elevation)
539
-
540
- BTAP::runner_register("Info","Setting water main temperatures via parsing of STAT file.", runner )
541
- water_temp = model.getSiteWaterMainsTemperature
542
- water_temp.setAnnualAverageOutdoorAirTemperature(@stat_file.mean_dry_bulb)
543
- water_temp.setMaximumDifferenceInMonthlyAverageOutdoorAirTemperatures(@stat_file.delta_dry_bulb)
544
- BTAP::runner_register("Info","SiteWaterMainsTemperature.AnnualAverageOutdoorAirTemperature = #{@stat_file.mean_dry_bulb}.", runner )
545
- BTAP::runner_register("Info","SiteWaterMainsTemperature.MaximumDifferenceInMonthlyAverageOutdoorAirTemperatures = #{@stat_file.delta_dry_bulb}.", runner )
546
-
547
- # Remove all the Design Day objects that are in the file
548
- model.getObjectsByType("OS:SizingPeriod:DesignDay".to_IddObjectType).each { |d| d.remove }
549
-
550
- # Load in the ddy file based on convention that it is in the same directory and has the same basename as the weather
551
- @ddy_file.getObjectsByType("OS:SizingPeriod:DesignDay".to_IddObjectType).each do |d|
552
- # grab only the ones that matter
553
- ddy_list = /(Htg 99.6. Condns DB)|(Clg .4. Condns WB=>MDB)|(Clg .4% Condns DB=>MWB)/
554
- if d.name.get =~ ddy_list
555
- BTAP::runner_register("Info","Adding design day '#{d.name}'.",runner)
556
- # add the object to the existing model
557
- model.addObject(d.clone)
558
- end
559
- end
560
- return true
561
- end
562
-
563
- #This method scans.
564
- #@author phylroy.lopez@nrcan.gc.ca
565
- def scan()
566
- @filearray = Array.new()
567
- file = File.new(@epw_filepath, "r")
568
- while (line = file.gets)
569
- @filearray.push(line.split(","))
570
- end
571
- file.close
572
- end
573
-
574
- #This method will sets column to a value.
575
- #@author phylroy.lopez@nrcan.gc.ca
576
- #@param column [String]
577
- #@param value [Fixnum]
578
- def setcolumntovalue(column,value)
579
- @filearray.each do |line|
580
- unless line.first =~ /\D(.*)/
581
- line[column] = value
582
- end
583
- end
584
- end
585
-
586
- #This method will eliminate all radiation and returns self.
587
- #@author phylroy.lopez@nrcan.gc.ca
588
- #@return [String] self
589
- def eliminate_all_radiation()
590
- self.scan() if @filearray == nil
591
- setcolumntovalue(Extraterrestrial_Horizontal_Radiation,"0")#not used
592
- setcolumntovalue(Extraterrestrial_Direct_Normal_Radiation,"0")#not used
593
- setcolumntovalue(Horizontal_Infrared_Radiation_Intensity,"315")
594
- setcolumntovalue(Global_Horizontal_Radiation,"0")#not used
595
- setcolumntovalue(Direct_Normal_Radiation,"0")
596
- setcolumntovalue(Diffuse_Horizontal_Radiation,"0")
597
- setcolumntovalue(Total_Sky_Cover,"10")#not used
598
- setcolumntovalue(Opaque_Sky_Cover,"10")#not used
599
- setcolumntovalue(Visibility,"0")#not used
600
- setcolumntovalue(Ceiling_Height,"0")#not used
601
- #lux values
602
- setcolumntovalue(Global_Horizontal_Illuminance,"0")#not used
603
- setcolumntovalue(Direct_Normal_Illuminance,"0")#not used
604
- setcolumntovalue(Diffuse_Horizontal_Illuminance,"0")#not used
605
- setcolumntovalue(Zenith_Luminance,"0")#not used
606
- return self
607
- end
608
-
609
- #This method will eliminate solar radiation and returns self.
610
- #@author phylroy.lopez@nrcan.gc.ca
611
- #@return [String] self
612
- def eliminate_only_solar_radiation()
613
- self.scan() if @filearray == nil
614
- setcolumntovalue(Global_Horizontal_Radiation,"0")#not used
615
- setcolumntovalue(Direct_Normal_Radiation,"0")
616
- setcolumntovalue(Diffuse_Horizontal_Radiation,"0")
617
- return self
618
- end
619
-
620
- #This method will eliminate all radiation except solar and returns self.
621
- #@author phylroy.lopez@nrcan.gc.ca
622
- #@return [String] self
623
- def eliminate_all_radiation_except_solar()
624
- self.scan() if @filearray == nil
625
- setcolumntovalue(Extraterrestrial_Horizontal_Radiation,"0")#not used
626
- setcolumntovalue(Extraterrestrial_Direct_Normal_Radiation,"0")#not used
627
- setcolumntovalue(Horizontal_Infrared_Radiation_Intensity,"315")
628
- setcolumntovalue(Total_Sky_Cover,"10")#not used
629
- setcolumntovalue(Opaque_Sky_Cover,"10")#not used
630
- setcolumntovalue(Visibility,"0")#not used
631
- setcolumntovalue(Ceiling_Height,"0")#not used
632
- #lux values
633
- setcolumntovalue(Global_Horizontal_Illuminance,"0")#not used
634
- setcolumntovalue(Direct_Normal_Illuminance,"0")#not used
635
- setcolumntovalue(Diffuse_Horizontal_Illuminance,"0")#not used
636
- setcolumntovalue(Zenith_Luminance,"0")#not used
637
- return self
638
- end
639
-
640
- #This method will eliminate percipitation and returns self.
641
- #@author phylroy.lopez@nrcan.gc.ca
642
- #@return [String] self
643
- def eliminate_percipitation
644
- self.scan() if @filearray == nil
645
- setcolumntovalue(Present_Weather_Observation, "0")
646
- setcolumntovalue(Present_Weather_Codes,"999999999") #no weather. Clear day.
647
- setcolumntovalue(Snow_Depth,"0")
648
- setcolumntovalue(Liquid_Precipitation_Depth,"0")
649
- setcolumntovalue(Liquid_Precipitation_Quantity,"0")
650
- return self
651
- end
652
-
653
- #This method eliminates wind and returns self.
654
- #@author phylroy.lopez@nrcan.gc.ca
655
- #@return [String] self
656
- def eliminate_wind
657
- self.scan() if @filearray == nil
658
- setcolumntovalue(Wind_Direction,"0")
659
- setcolumntovalue(Wind_Speed,"0")
660
- return self
661
- end
662
-
663
- #This method sets Constant Dry and Dew Point Temperature Humidity And Pressure and returns self.
664
- #@author phylroy.lopez@nrcan.gc.ca
665
- #@param dbt [Float] dry bulb temperature
666
- #@param dpt [Float] dew point temperature
667
- #@param hum [Fixnum] humidity
668
- #@param press [Fixnum] pressure
669
- #@return [String] self
670
- def setConstantDryandDewPointTemperatureHumidityAndPressure(dbt = "0.0",dpt="-1.1",hum="92",press="98500")
671
- self.scan() if @filearray == nil
672
- setcolumntovalue(Dry_Bulb_Temperature,dbt)
673
- setcolumntovalue(Dew_Point_Temperature,dpt)
674
- setcolumntovalue(Relative_Humidity,hum)
675
- setcolumntovalue(Atmospheric_Station_Pressure,press)
676
- return self
677
- end
678
-
679
- #This method writes to a file.
680
- #@author phylroy.lopez@nrcan.gc.ca
681
- #@param filename [String]
682
- def writetofile(filename)
683
- self.scan() if @filearray == nil
684
-
685
- begin
686
- FileUtils.mkdir_p(File.dirname(filename))
687
- file = File.open(filename, "w")
688
- @filearray.each do |line|
689
- firstvalue = true
690
- newline = ""
691
- line.each do |value|
692
- if firstvalue == true
693
- firstvalue = false
694
- else
695
- newline = newline +","
696
- end
697
- newline = newline + value
698
- end
699
- file.puts(newline)
700
- end
701
- rescue IOError => e
702
- #some error occur, dir not writable etc.
703
- ensure
704
- file.close unless file == nil
705
- end
706
- #copies original file
707
- FileUtils.cp(@ddy_filepath, "#{File.dirname(filename)}/#{File.basename(filename,'.epw')}.ddy")
708
- FileUtils.cp(@stat_filepath, "#{File.dirname(filename)}/#{File.basename(filename,'.epw')}.stat")
709
- end
710
-
711
- end #Environment
712
-
713
-
714
-
715
-
716
- end
717
- end
718
-