openstudio-standards 0.1.3 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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"