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
@@ -0,0 +1,192 @@
1
+
2
+ # open the class to add methods to return sizing values
3
+ class OpenStudio::Model::CoilHeatingDXMultiSpeed
4
+
5
+ def setStandardEfficiencyAndCurves(template, standards, sql_db_vars_map)
6
+
7
+ successfully_set_all_properties = true
8
+
9
+ heat_pumps = standards['heat_pumps_heating']
10
+
11
+ # Define the criteria to find the unitary properties
12
+ # in the hvac standards data set.
13
+ search_criteria = {}
14
+ search_criteria['template'] = template
15
+
16
+ # Determine supplemental heating type if unitary
17
+ heat_pump = false
18
+ suppl_heating_type = nil
19
+ if self.airLoopHVAC.empty?
20
+ if self.containingHVACComponent.is_initialized
21
+ containing_comp = containingHVACComponent.get
22
+ if containing_comp.to_AirLoopHVACUnitaryHeatPumpAirToAirMultiSpeed.is_initialized
23
+ heat_pump = true
24
+ htg_coil = containing_comp.to_AirLoopHVACUnitaryHeatPumpAirToAirMultiSpeed.get.supplementalHeatingCoil
25
+ if htg_coil.to_CoilHeatingElectric.is_initialized
26
+ suppl_heating_type = 'Electric Resistance or None'
27
+ else
28
+ suppl_heating_type = 'All Other'
29
+ end
30
+ end # TODO Add other unitary systems
31
+ end
32
+ end
33
+
34
+ # TODO Standards - add split system vs single package to model
35
+ # For now, assume single package
36
+ subcategory = 'Single Package'
37
+ search_criteria['subcategory'] = subcategory
38
+
39
+ # Get the coil capacity
40
+ clg_capacity = nil
41
+ if(heat_pump == true)
42
+ containing_comp = self.containingHVACComponent.get
43
+ heat_pump_comp = containing_comp.to_AirLoopHVACUnitaryHeatPumpAirToAirMultiSpeed.get
44
+ ccoil = heat_pump_comp.coolingCoil
45
+ dxcoil = ccoil.to_CoilCoolingDXMultiSpeed.get
46
+ dxcoil_name = dxcoil.name.to_s
47
+ if sql_db_vars_map
48
+ if sql_db_vars_map[dxcoil_name]
49
+ dxcoil.setName(sql_db_vars_map[dxcoil_name])
50
+ end
51
+ end
52
+ clg_stages = dxcoil.stages
53
+ if clg_stages.last.grossRatedTotalCoolingCapacity.is_initialized
54
+ clg_capacity = clg_stages.last.grossRatedTotalCoolingCapacity.get
55
+ elsif dxcoil.autosizedSpeed4GrossRatedTotalCoolingCapacity.is_initialized
56
+ clg_capacity = dxcoil.autosizedSpeed4GrossRatedTotalCoolingCapacity.get
57
+ else
58
+ OpenStudio::logFree(OpenStudio::Warn, 'openstudio.standards.CoilHeatingDXMultiSpeed', "For #{self.name} capacity is not available, cannot apply efficiency standard.")
59
+ successfully_set_all_properties = false
60
+ return successfully_set_all_properties
61
+ end
62
+ dxcoil.setName(dxcoil_name)
63
+ end
64
+
65
+ # Convert capacity to Btu/hr
66
+ capacity_btu_per_hr = OpenStudio.convert(clg_capacity, "W", "Btu/hr").get
67
+ capacity_kbtu_per_hr = OpenStudio.convert(clg_capacity, "W", "kBtu/hr").get
68
+
69
+ # Lookup efficiencies depending on whether it is a unitary AC or a heat pump
70
+ hp_props = self.model.find_object(heat_pumps, search_criteria, capacity_btu_per_hr)
71
+
72
+ # Check to make sure properties were found
73
+ if hp_props.nil?
74
+ OpenStudio::logFree(OpenStudio::Warn, 'openstudio.standards.CoilHeatingDXMultipeed', "For #{self.name}, cannot find efficiency info, cannot apply efficiency standard.")
75
+ successfully_set_all_properties = false
76
+ return successfully_set_all_properties
77
+ end
78
+
79
+ # Make the HEAT-CAP-FT curve
80
+ htg_stages = self.stages
81
+ heat_cap_ft = self.model.add_curve(hp_props["heat_cap_ft"], standards)
82
+ if heat_cap_ft
83
+ htg_stages.each do |istage|
84
+ istage.setHeatingCapacityFunctionofTemperatureCurve(heat_cap_ft)
85
+ end
86
+ else
87
+ OpenStudio::logFree(OpenStudio::Warn, 'openstudio.standards.CoilHeatingDXMultiSpeed', "For #{self.name}, cannot find heat_cap_ft curve, will not be set.")
88
+ successfully_set_all_properties = false
89
+ end
90
+
91
+ # Make the HEAT-CAP-FFLOW curve
92
+ heat_cap_fflow = self.model.add_curve(hp_props["heat_cap_fflow"], standards)
93
+ if heat_cap_fflow
94
+ htg_stages.each do |istage|
95
+ istage.setHeatingCapacityFunctionofFlowFractionCurve(heat_cap_fflow)
96
+ end
97
+ else
98
+ OpenStudio::logFree(OpenStudio::Warn, 'openstudio.standards.CoilHeatingDXMultiSpeed', "For #{self.name}, cannot find heat_cap_fflow curve, will not be set.")
99
+ successfully_set_all_properties = false
100
+ end
101
+
102
+ # Make the HEAT-EIR-FT curve
103
+ heat_eir_ft = self.model.add_curve(hp_props["heat_eir_ft"], standards)
104
+ if heat_eir_ft
105
+ htg_stages.each do |istage|
106
+ istage.setEnergyInputRatioFunctionofTemperatureCurve(heat_eir_ft)
107
+ end
108
+ else
109
+ OpenStudio::logFree(OpenStudio::Warn, 'openstudio.standards.CoilHeatingDXMultiSpeed', "For #{self.name}, cannot find heat_eir_ft curve, will not be set.")
110
+ successfully_set_all_properties = false
111
+ end
112
+
113
+ # Make the HEAT-EIR-FFLOW curve
114
+ heat_eir_fflow = self.model.add_curve(hp_props["heat_eir_fflow"], standards)
115
+ if heat_eir_fflow
116
+ htg_stages.each do |istage|
117
+ istage.setEnergyInputRatioFunctionofFlowFractionCurve(heat_eir_fflow)
118
+ end
119
+ else
120
+ OpenStudio::logFree(OpenStudio::Warn, 'openstudio.standards.CoilHeatingDXMultiSpeed', "For #{self.name}, cannot find heat_eir_fflow curve, will not be set.")
121
+ successfully_set_all_properties = false
122
+ end
123
+
124
+ # Make the HEAT-PLF-FPLR curve
125
+ heat_plf_fplr = self.model.add_curve(hp_props["heat_plf_fplr"], standards)
126
+ if heat_plf_fplr
127
+ htg_stages.each do |istage|
128
+ istage.setPartLoadFractionCorrelationCurve(heat_plf_fplr)
129
+ end
130
+ else
131
+ OpenStudio::logFree(OpenStudio::Warn, 'openstudio.standards.CoilHeatingDXMultiSpeed', "For #{self.name}, cannot find heat_plf_fplr curve, will not be set.")
132
+ successfully_set_all_properties = false
133
+ end
134
+
135
+ # For NECB the heat pump needs only one stage
136
+ htg_capacity = nil
137
+ flow_rate4 = nil
138
+ if(template == 'NECB 2011')
139
+ htg_stages = self.stages
140
+ if htg_stages.last.grossRatedHeatingCapacity.is_initialized
141
+ htg_capacity = htg_stages.last.grossRatedHeatingCapacity.get
142
+ elsif self.autosizedSpeed4GrossRatedHeatingCapacity.is_initialized
143
+ htg_capacity = self.autosizedSpeed4GrossRatedHeatingCapacity.get
144
+ else
145
+ OpenStudio::logFree(OpenStudio::Warn, 'openstudio.standards.CoilHeatingDXMultiSpeed', "For #{self.name} capacity is not available, cannot apply efficiency standard.")
146
+ successfully_set_all_properties = false
147
+ return successfully_set_all_properties
148
+ end
149
+ if htg_stages.last.ratedAirFlowRate.is_initialized
150
+ flow_rate4 = htg_stages.last.ratedAirFlowRate.get
151
+ elsif self.autosizedSpeed4RatedAirFlowRate.is_initialized
152
+ flow_rate4 = self.autosizedSpeed4RatedAirFlowRate.get
153
+ else
154
+ OpenStudio::logFree(OpenStudio::Warn, 'openstudio.standards.CoilHeatingDXMultiSpeed', "For #{self.name} capacity is not available, cannot apply efficiency standard.")
155
+ successfully_set_all_properties = false
156
+ return successfully_set_all_properties
157
+ end
158
+ end
159
+
160
+ # Convert capacity to Btu/hr
161
+ capacity_btu_per_hr = OpenStudio.convert(htg_capacity, "W", "Btu/hr").get
162
+ capacity_kbtu_per_hr = OpenStudio.convert(htg_capacity, "W", "kBtu/hr").get
163
+
164
+ # Get the minimum efficiency standards
165
+ cop = nil
166
+
167
+ # If specified as SEER
168
+ unless hp_props['minimum_seasonal_energy_efficiency_ratio'].nil?
169
+ min_seer = hp_props['minimum_seasonal_energy_efficiency_ratio']
170
+ cop = seer_to_cop(min_seer)
171
+ self.setName("#{self.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_seer}SEER")
172
+ OpenStudio::logFree(OpenStudio::Info, 'openstudio.standards.CoilHeatingDXMultiSpeed', "For #{template}: #{self.name}: #{suppl_heating_type} #{subcategory} Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; SEER = #{min_seer}")
173
+ end
174
+
175
+ # If specified as EER
176
+ unless hp_props['minimum_energy_efficiency_ratio'].nil?
177
+ min_eer = hp_props['minimum_energy_efficiency_ratio']
178
+ cop = eer_to_cop(min_eer)
179
+ self.setName("#{self.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_eer}EER")
180
+ OpenStudio::logFree(OpenStudio::Info, 'openstudio.standards.CoilHeatingDXMultiSpeed', "For #{template}: #{self.name}: #{suppl_heating_type} #{subcategory} Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; EER = #{min_eer}")
181
+ end
182
+
183
+ # Set the efficiency values
184
+ unless cop.nil?
185
+ htg_stages.each do |istage|
186
+ istage.setGrossRatedHeatingCOP(cop)
187
+ end
188
+ end
189
+
190
+ end
191
+
192
+ end
@@ -0,0 +1,65 @@
1
+
2
+ # open the class to add methods to return sizing values
3
+ class OpenStudio::Model::CoilHeatingGasMultiStage
4
+
5
+ def setStandardEfficiencyAndCurves(template, standards)
6
+
7
+ successfully_set_all_properties = true
8
+
9
+ # Get the coil capacity
10
+ capacity_w = nil
11
+ htg_stages = self.stages
12
+ if htg_stages.last.nominalCapacity.is_initialized
13
+ capacity_w = htg_stages.last.nominalCapacity.get
14
+ elsif self.autosizedStage4NominalCapacity.is_initialized
15
+ capacity_w = self.autosizedStage4NominalCapacity.get
16
+ else
17
+ OpenStudio::logFree(OpenStudio::Warn, 'openstudio.standards.CoilCoolingDXMultiSpeed', "For #{self.name} capacity is not available, cannot apply efficiency standard.")
18
+ successfully_set_all_properties = false
19
+ return successfully_set_all_properties
20
+ end
21
+
22
+ # Set number of stages for NECB 2011
23
+ if(template == 'NECB 2011')
24
+ num_stages = (capacity_w/(66.0*1000.0)+0.5).round
25
+ num_stages = [num_stages,4].min
26
+ stage_cap = []
27
+ if(num_stages == 1)
28
+ stage_cap[0] = capacity_w/2.0
29
+ stage_cap[1] = 2.0*stage_cap[0]
30
+ stage_cap[2] = stage_cap[1]+0.1
31
+ stage_cap[3] = stage_cap[2]+0.1
32
+ else
33
+ stage_cap[0] = 66.0*1000.0
34
+ stage_cap[1] = 2.0*stage_cap[0]
35
+ if(num_stages == 2)
36
+ stage_cap[2] = stage_cap[1]+0.1
37
+ stage_cap[3] = stage_cap[2]+0.1
38
+ elsif(num_stages == 3)
39
+ stage_cap[2] = 3.0*stage_cap[0]
40
+ stage_cap[3] = stage_cap[2]+0.1
41
+ elsif(num_stages == 4)
42
+ stage_cap[2] = 3.0*stage_cap[0]
43
+ stage_cap[3] = 4.0*stage_cap[0]
44
+ end
45
+ end
46
+ # set capacities, flow rates, and sensible heat ratio for stages
47
+ for istage in 0..3
48
+ htg_stages[istage].setNominalCapacity(stage_cap[istage])
49
+ end
50
+ # PLF vs PLR curve
51
+ furnace_plffplr_curve_name = 'FURNACE-EFFPLR-NECB2011'
52
+ end
53
+
54
+ # plf vs plr curve for furnace
55
+ furnace_plffplr_curve = self.model.add_curve(furnace_plffplr_curve_name, standards)
56
+ if furnace_plffplr_curve
57
+ self.setPartLoadFractionCorrelationCurve(furnace_plffplr_curve)
58
+ else
59
+ OpenStudio::logFree(OpenStudio::Warn, 'openstudio.standards.CoilHeatingGasMultiStage', "For #{self.name}, cannot find plffplr curve, will not be set.")
60
+ successfully_set_all_properties = false
61
+ end
62
+
63
+ end
64
+
65
+ end
@@ -19,17 +19,17 @@ module Fan
19
19
  OpenStudio::logFree(OpenStudio::Warn, 'openstudio.standards.Fan', "For #{self.name} max flow rate is not hard sized, cannot apply efficiency standard.")
20
20
  return false
21
21
  end
22
-
22
+
23
23
  # Convert max flow rate to cfm
24
24
  maximum_flow_rate_cfm = OpenStudio.convert(maximum_flow_rate_m3_per_s, 'm^3/s', 'cfm').get
25
25
 
26
26
  # Get the pressure rise from the fan
27
27
  pressure_rise_pa = self.pressureRise
28
28
  pressure_rise_in_h2o = OpenStudio.convert(pressure_rise_pa, 'Pa','inH_{2}O').get
29
-
29
+
30
30
  # Get the default impeller efficiency
31
31
  fan_impeller_eff = self.baselineImpellerEfficiency(template)
32
-
32
+
33
33
  # Calculate the Brake Horsepower
34
34
  brake_hp = (pressure_rise_in_h2o * maximum_flow_rate_cfm)/(fan_impeller_eff * 6356)
35
35
  allowed_hp = brake_hp * 1.1 # Per PNNL document #TODO add reference
@@ -38,7 +38,7 @@ module Fan
38
38
  elsif allowed_hp < 0.01
39
39
  allowed_hp = 0.01
40
40
  end
41
-
41
+
42
42
  # Minimum motor size for efficiency lookup
43
43
  # is 1 HP unless the motor serves an exhaust fan,
44
44
  # a powered VAV terminal, or a fan coil unit.
@@ -62,6 +62,11 @@ module Fan
62
62
  self.setMotorEfficiency(motor_eff)
63
63
  end
64
64
 
65
+
66
+ if(template == 'NECB 2011')
67
+ fan_power_kw = maximum_flow_rate_m3_per_s*pressure_rise_pa/(fan_impeller_eff*1000.0)
68
+ end
69
+
65
70
  OpenStudio::logFree(OpenStudio::Info, 'openstudio.standards.Fan', "For #{self.name}: allowed_hp = #{allowed_hp.round(2)}HP; motor eff = #{(motor_eff*100).round(2)}%; total fan eff = #{(total_fan_eff*100).round}% based on #{maximum_flow_rate_cfm.round} cfm.")
66
71
 
67
72
  return true
@@ -273,6 +278,7 @@ module Fan
273
278
  # any desired safety factor already included. This method
274
279
  #
275
280
  # @param motor_bhp [Double] motor brake horsepower (hp)
281
+
276
282
  # @return [Double] minimum motor efficiency (0.0 to 1.0), nominal HP
277
283
  def standard_minimum_motor_efficiency_and_size(template, motor_bhp)
278
284
 
@@ -283,12 +289,37 @@ module Fan
283
289
  motors = $os_standards["motors"]
284
290
 
285
291
  # Assuming all fan motors are 4-pole ODP
292
+ template_mod = template.dup
293
+ if(template == 'NECB 2011')
294
+ if(self.class.name == 'OpenStudio::Model::FanConstantVolume')
295
+ template_mod = template_mod+'-CONSTANT'
296
+ elsif(self.class.name == 'OpenStudio::Model::FanVariableVolume')
297
+ template_mod = template_mod+'-VARIABLE'
298
+ fan_power_kw = 0.909*0.7457*motor_bhp
299
+ if(fan_power_kw >= 25.0)
300
+ power_vs_flow_curve_name = 'VarVolFan-FCInletVanes-NECB2011-FPLR'
301
+ elsif(fan_power_kw >= 7.5 && fan_power_kw < 25)
302
+ power_vs_flow_curve_name = 'VarVolFan-AFBIInletVanes-NECB2011-FPLR'
303
+ else
304
+ power_vs_flow_curve_name = 'VarVolFan-AFBIFanCurve-NECB2011-FPLR'
305
+ end
306
+ power_vs_flow_curve = self.model.add_curve(power_vs_flow_curve_name, standards)
307
+ self.setFanPowerMinimumFlowRateInputMethod("Fraction")
308
+ self.setFanPowerCoefficient5(0.0)
309
+ self.setFanPowerMinimumFlowFraction(power_vs_flow_curve.minimumValueofx)
310
+ self.setFanPowerCoefficient1(power_vs_flow_curve.coefficient1Constant)
311
+ self.setFanPowerCoefficient2(power_vs_flow_curve.coefficient2x)
312
+ self.setFanPowerCoefficient3(power_vs_flow_curve.coefficient3xPOW2)
313
+ self.setFanPowerCoefficient4(power_vs_flow_curve.coefficient4xPOW3)
314
+ end
315
+ end
316
+
286
317
  search_criteria = {
287
- "template" => template,
318
+ "template" => template_mod,
288
319
  "number_of_poles" => 4.0,
289
320
  "type" => "Enclosed",
290
321
  }
291
-
322
+
292
323
  motor_properties = self.model.find_object(motors, search_criteria, motor_bhp)
293
324
  if motor_properties.nil?
294
325
  OpenStudio::logFree(OpenStudio::Error, "openstudio.standards.Fan", "For #{self.name}, could not find motor properties using search criteria: #{search_criteria}, motor_bhp = #{motor_bhp} hp.")
@@ -1539,6 +1539,7 @@ class OpenStudio::Model::Model
1539
1539
 
1540
1540
 
1541
1541
  end
1542
+
1542
1543
 
1543
1544
  # Applies the multi-zone VAV outdoor air sizing requirements
1544
1545
  # to all applicable air loops in the model.
@@ -1580,6 +1581,7 @@ class OpenStudio::Model::Model
1580
1581
  #self.getPumpVariableSpeeds.sort.each {|obj| obj.set_standard_minimum_motor_efficiency(building_vintage)}
1581
1582
 
1582
1583
  # Unitary ACs
1584
+
1583
1585
  self.getCoilCoolingDXTwoSpeeds.sort.each {|obj| obj.setStandardEfficiencyAndCurves(building_vintage)}
1584
1586
  self.getCoilCoolingDXSingleSpeeds.sort.each {|obj| sql_db_vars_map = obj.setStandardEfficiencyAndCurves(building_vintage, sql_db_vars_map)}
1585
1587
 
@@ -1587,7 +1589,9 @@ class OpenStudio::Model::Model
1587
1589
  self.getCoilHeatingDXSingleSpeeds.sort.each {|obj| sql_db_vars_map = obj.setStandardEfficiencyAndCurves(building_vintage, sql_db_vars_map)}
1588
1590
 
1589
1591
  # Chillers
1590
- self.getChillerElectricEIRs.sort.each {|obj| obj.setStandardEfficiencyAndCurves(building_vintage)}
1592
+ clg_tower_objs = self.getCoolingTowerSingleSpeeds
1593
+ self.getChillerElectricEIRs.sort.each {|obj| obj.setStandardEfficiencyAndCurves(building_vintage, clg_tower_objs)}
1594
+
1591
1595
 
1592
1596
  # Boilers
1593
1597
  self.getBoilerHotWaters.sort.each {|obj| obj.setStandardEfficiencyAndCurves(building_vintage)}
@@ -1595,6 +1599,10 @@ class OpenStudio::Model::Model
1595
1599
  # Water Heaters
1596
1600
  self.getWaterHeaterMixeds.sort.each {|obj| obj.setStandardEfficiency(building_vintage)}
1597
1601
 
1602
+ # was this added for necb archetypes?
1603
+ # Heating coils
1604
+ #self.getCoilHeatingGasMultiStages.sort.each {|obj| obj.setStandardEfficiencyAndCurves(self.template, self.standards)}
1605
+
1598
1606
  OpenStudio::logFree(OpenStudio::Info, 'openstudio.model.Model', 'Finished applying HVAC efficiency standards.')
1599
1607
 
1600
1608
  end
@@ -1628,6 +1636,7 @@ class OpenStudio::Model::Model
1628
1636
  space.set_infiltration_rate(building_vintage)
1629
1637
  end
1630
1638
 
1639
+
1631
1640
  case building_vintage
1632
1641
  when 'DOE Ref Pre-1980', 'DOE Ref 1980-2004'
1633
1642
  #"For 'DOE Ref Pre-1980' and 'DOE Ref 1980-2004', infiltration rates are not defined using this method, no changes have been made to the model.
@@ -1639,7 +1648,9 @@ class OpenStudio::Model::Model
1639
1648
  end
1640
1649
  end
1641
1650
  end
1642
- end
1651
+ end
1652
+
1653
+
1643
1654
 
1644
1655
  # Method to search through a hash for the objects that meets the
1645
1656
  # desired search criteria, as passed via a hash.
@@ -1884,6 +1895,7 @@ class OpenStudio::Model::Model
1884
1895
  day_types.include?('Thu') ||
1885
1896
  day_types.include?('Fri')
1886
1897
 
1898
+
1887
1899
  # Make the Rule
1888
1900
  sch_rule = OpenStudio::Model::ScheduleRule.new(sch_ruleset)
1889
1901
  day_sch = sch_rule.daySchedule
@@ -2123,12 +2135,14 @@ class OpenStudio::Model::Model
2123
2135
  # Get the construction properties,
2124
2136
  # which specifies properties by construction category by climate zone set.
2125
2137
  # AKA the info in Tables 5.5-1-5.5-8
2138
+
2126
2139
  props = self.find_object($os_standards['construction_properties'], {'template'=>building_vintage,
2127
2140
  'climate_zone_set'=> climate_zone_set,
2128
2141
  'intended_surface_type'=> intended_surface_type,
2129
2142
  'standards_construction_type'=> standards_construction_type,
2130
2143
  'building_category' => building_category
2131
2144
  })
2145
+
2132
2146
  if !props
2133
2147
  OpenStudio::logFree(OpenStudio::Error, 'openstudio.standards.Model', "Could not find construction properties for: #{building_vintage}-#{climate_zone_set}-#{intended_surface_type}-#{standards_construction_type}-#{building_category}.")
2134
2148
  # Return an empty construction
@@ -2168,18 +2182,26 @@ class OpenStudio::Model::Model
2168
2182
  end
2169
2183
 
2170
2184
  # Get the object data
2185
+
2171
2186
  data = self.find_object($os_standards['construction_sets'], {'template'=>building_vintage, 'climate_zone_set'=> climate_zone_set, 'building_type'=>building_type, 'space_type'=>spc_type, 'is_residential'=>is_residential})
2172
2187
  if !data
2173
2188
  data = self.find_object($os_standards['construction_sets'], {'template'=>building_vintage, 'climate_zone_set'=> climate_zone_set, 'building_type'=>building_type, 'space_type'=>spc_type})
2189
+
2174
2190
  if !data
2191
+
2192
+ # for debugging (maria)
2193
+ #puts "data = #{data}"
2194
+
2175
2195
  return construction_set
2176
2196
  end
2197
+
2177
2198
  end
2178
2199
 
2179
2200
  OpenStudio::logFree(OpenStudio::Info, 'openstudio.standards.Model', "Adding construction set: #{building_vintage}-#{clim}-#{building_type}-#{spc_type}-is_residential#{is_residential}")
2180
2201
 
2181
2202
  name = make_name(building_vintage, clim, building_type, spc_type)
2182
2203
 
2204
+
2183
2205
  # Create a new construction set and name it
2184
2206
  construction_set = OpenStudio::Model::DefaultConstructionSet.new(self)
2185
2207
  construction_set.setName(name)
@@ -2188,6 +2210,7 @@ class OpenStudio::Model::Model
2188
2210
  exterior_surfaces = OpenStudio::Model::DefaultSurfaceConstructions.new(self)
2189
2211
  construction_set.setDefaultExteriorSurfaceConstructions(exterior_surfaces)
2190
2212
  if data['exterior_floor_standards_construction_type'] && data['exterior_floor_building_category']
2213
+
2191
2214
  exterior_surfaces.setFloorConstruction(find_and_add_construction(building_vintage,
2192
2215
  climate_zone_set,
2193
2216
  'ExteriorFloor',
@@ -2248,6 +2271,7 @@ class OpenStudio::Model::Model
2248
2271
  'GroundContactRoof',
2249
2272
  data['ground_contact_ceiling_standards_construction_type'],
2250
2273
  data['ground_contact_ceiling_building_category']))
2274
+
2251
2275
  end
2252
2276
 
2253
2277
  # Exterior sub surfaces constructions
@@ -3258,6 +3282,7 @@ class OpenStudio::Model::Model
3258
3282
  sky_area_m2 += ss.netArea * space.multiplier
3259
3283
  end
3260
3284
  end
3285
+
3261
3286
 
3262
3287
  # Determine the space category
3263
3288
  cat = 'NonRes'
@@ -3585,7 +3610,7 @@ class OpenStudio::Model::Model
3585
3610
  case building_vintage
3586
3611
  when 'DOE Ref Pre-1980', 'DOE Ref 1980-2004'
3587
3612
  result = possible_climate_zones.sort.last
3588
- when '90.1-2007', '90.1-2010', '90.1-2013'
3613
+ when '90.1-2007', '90.1-2010', '90.1-2013', 'NECB 2011'
3589
3614
  result = possible_climate_zones.sort.first
3590
3615
  when '90.1-2004'
3591
3616
  if possible_climate_zones.include? "ClimateZone 3"