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.
- checksums.yaml +4 -4
- data/data/standards/OpenStudio_Standards.xlsx +0 -0
- data/data/standards/OpenStudio_Standards_chillers.json +5 -5
- data/data/standards/OpenStudio_Standards_construction_sets.json +2 -2
- data/data/standards/OpenStudio_Standards_curve_cubics.json +12 -0
- data/data/standards/OpenStudio_Standards_heat_pumps.json +2126 -72
- data/data/standards/OpenStudio_Standards_heat_pumps_heating.json +766 -14
- data/data/standards/OpenStudio_Standards_heat_rejection.json +172 -0
- data/data/standards/OpenStudio_Standards_prototype_inputs.json +355 -267
- data/data/standards/OpenStudio_Standards_schedules.json +262 -10
- data/data/standards/OpenStudio_Standards_space_types.json +1466 -794
- data/data/standards/manage_OpenStudio_Standards.rb +19 -21
- data/data/weather/weather_info.csv +96 -0
- data/lib/openstudio-standards/btap/btap.rb +1 -1
- data/lib/openstudio-standards/btap/compliance.rb +135 -40
- data/lib/openstudio-standards/btap/envelope.rb +26 -5
- data/lib/openstudio-standards/btap/geometry.rb +11 -1
- data/lib/openstudio-standards/btap/hvac.rb +489 -56
- data/lib/openstudio-standards/btap/simmanager.rb +1 -1
- data/lib/openstudio-standards/hvac_sizing/HVACSizing.CoilHeatingDXMultiSpeed.rb +120 -0
- data/lib/openstudio-standards/hvac_sizing/Siz.CoilCoolingDXMultiSpeed.rb +151 -7
- data/lib/openstudio-standards/hvac_sizing/Siz.CoilHeatingGasMultiStage.rb +48 -7
- data/lib/openstudio-standards/hvac_sizing/Siz.Model.rb +14 -12
- data/lib/openstudio-standards/prototypes/Prototype.AirTerminalSingleDuctVAVReheat.rb +33 -7
- data/lib/openstudio-standards/prototypes/Prototype.Model.hvac.rb +123 -91
- data/lib/openstudio-standards/prototypes/Prototype.Model.rb +130 -45
- data/lib/openstudio-standards/prototypes/Prototype.Model.swh.rb +13 -7
- data/lib/openstudio-standards/prototypes/Prototype.full_service_restaurant.rb +332 -324
- data/lib/openstudio-standards/prototypes/Prototype.hospital.rb +401 -99
- data/lib/openstudio-standards/prototypes/Prototype.hvac_systems.rb +309 -222
- data/lib/openstudio-standards/prototypes/Prototype.large_hotel.rb +100 -80
- data/lib/openstudio-standards/prototypes/Prototype.large_office.rb +37 -22
- data/lib/openstudio-standards/prototypes/Prototype.medium_office.rb +68 -53
- data/lib/openstudio-standards/prototypes/Prototype.mid_rise_apartment.rb +109 -88
- data/lib/openstudio-standards/prototypes/Prototype.outpatient.rb +52 -4
- data/lib/openstudio-standards/prototypes/Prototype.primary_school.rb +230 -213
- data/lib/openstudio-standards/prototypes/Prototype.quick_service_restaurant.rb +225 -218
- data/lib/openstudio-standards/prototypes/Prototype.retail_standalone.rb +29 -17
- data/lib/openstudio-standards/prototypes/Prototype.retail_stripmall.rb +42 -32
- data/lib/openstudio-standards/prototypes/Prototype.secondary_school.rb +331 -314
- data/lib/openstudio-standards/prototypes/Prototype.small_hotel.rb +233 -219
- data/lib/openstudio-standards/prototypes/Prototype.small_office.rb +40 -32
- data/lib/openstudio-standards/prototypes/Prototype.warehouse.rb +19 -6
- data/lib/openstudio-standards/standards/Standards.AirLoopHVAC.rb +576 -555
- data/lib/openstudio-standards/standards/Standards.AirTerminalSingleDuctVAVReheat.rb +3 -1
- data/lib/openstudio-standards/standards/Standards.BoilerHotWater.rb +35 -17
- data/lib/openstudio-standards/standards/Standards.ChillerElectricEIR.rb +51 -23
- data/lib/openstudio-standards/standards/Standards.CoilCoolingDXMultiSpeed.rb +255 -0
- data/lib/openstudio-standards/standards/Standards.CoilHeatingDXMultiSpeed.rb +192 -0
- data/lib/openstudio-standards/standards/Standards.CoilHeatingGasMultiStage.rb +65 -0
- data/lib/openstudio-standards/standards/Standards.Fan.rb +37 -6
- data/lib/openstudio-standards/standards/Standards.Model.rb +28 -3
- data/lib/openstudio-standards/standards/Standards.SpaceType.rb +3 -1
- data/lib/openstudio-standards/standards/Standards.WaterHeaterMixed.rb +41 -15
- data/lib/openstudio-standards/version.rb +1 -1
- data/lib/openstudio-standards/weather/Weather.Model.rb +509 -5
- data/lib/openstudio-standards/weather/Weather.stat_file.rb +145 -5
- metadata +8 -3
- data/lib/openstudio-standards/btap/environment.rb +0 -718
@@ -28,7 +28,9 @@ class OpenStudio::Model::AirTerminalSingleDuctVAVReheat
|
|
28
28
|
min_damper_position = 0.3
|
29
29
|
end
|
30
30
|
end
|
31
|
-
|
31
|
+
|
32
|
+
|
33
|
+
|
32
34
|
# TODO remove the template conditional; doesn't make sense
|
33
35
|
# Determine whether or not to use the high minimum guess.
|
34
36
|
# Cutoff was determined by correlating apparent minimum guesses
|
@@ -110,7 +110,7 @@ class OpenStudio::Model::BoilerHotWater
|
|
110
110
|
|
111
111
|
# Applies the standard efficiency ratings and typical performance curves to this object.
|
112
112
|
#
|
113
|
-
# @param template [String] valid choices: 'DOE Ref Pre-1980', 'DOE Ref 1980-2004', '90.1-2004', '90.1-2007', '90.1-2010', '90.1-2013'
|
113
|
+
# @param template [String] valid choices: 'DOE Ref Pre-1980', 'DOE Ref 1980-2004', '90.1-2004', '90.1-2007', '90.1-2010', '90.1-2013', 'NECB2011'
|
114
114
|
# @param standards [Hash] the OpenStudio_Standards spreadsheet in hash format
|
115
115
|
# @return [Bool] true if successful, false if not
|
116
116
|
def setStandardEfficiencyAndCurves(template)
|
@@ -157,10 +157,38 @@ class OpenStudio::Model::BoilerHotWater
|
|
157
157
|
successfully_set_all_properties = false
|
158
158
|
return successfully_set_all_properties
|
159
159
|
end
|
160
|
-
|
160
|
+
|
161
|
+
# for NECB, check if secondary and/or modulating boiler required
|
162
|
+
if (template == 'NECB 2011')
|
163
|
+
if (capacity_w/1000.0 >= 352.0)
|
164
|
+
if (self.name.to_s.include?("Primary Boiler"))
|
165
|
+
boiler_capacity = capacity_w
|
166
|
+
self.setBoilerFlowMode('LeavingSetpointModulated')
|
167
|
+
self.setMinimumPartLoadRatio(0.25)
|
168
|
+
elsif (self.name.to_s.include?("Secondary Boiler"))
|
169
|
+
boiler_capacity = 0.001
|
170
|
+
end
|
171
|
+
elsif ((capacity_w/1000.0) >= 176.0) && ((capacity_w/1000.0) < 352.0)
|
172
|
+
boiler_capacity = capacity_w/2
|
173
|
+
elsif ((capacity_w/1000.0) <= 176.0)
|
174
|
+
if (self.name.to_s.include?("Primary Boiler"))
|
175
|
+
boiler_capacity = capacity_w
|
176
|
+
elsif (self.name.to_s.include?("Secondary Boiler"))
|
177
|
+
boiler_capacity = 0.001
|
178
|
+
end
|
179
|
+
end
|
180
|
+
self.setNominalCapacity(boiler_capacity)
|
181
|
+
end # NECB 2011
|
182
|
+
|
161
183
|
# Convert capacity to Btu/hr
|
162
|
-
|
163
|
-
|
184
|
+
if template == 'NECB 2011'
|
185
|
+
capacity_btu_per_hr = OpenStudio.convert(boiler_capacity, "W", "Btu/hr").get
|
186
|
+
capacity_kbtu_per_hr = OpenStudio.convert(boiler_capacity, "W", "kBtu/hr").get
|
187
|
+
else
|
188
|
+
capacity_btu_per_hr = OpenStudio.convert(capacity_w, "W", "Btu/hr").get
|
189
|
+
capacity_kbtu_per_hr = OpenStudio.convert(capacity_w, "W", "kBtu/hr").get
|
190
|
+
end
|
191
|
+
|
164
192
|
|
165
193
|
# Get the boiler properties
|
166
194
|
blr_props = self.model.find_object(boilers, search_criteria, capacity_btu_per_hr)
|
@@ -169,7 +197,7 @@ class OpenStudio::Model::BoilerHotWater
|
|
169
197
|
successfully_set_all_properties = false
|
170
198
|
return successfully_set_all_properties
|
171
199
|
end
|
172
|
-
|
200
|
+
|
173
201
|
# Make the EFFFPLR curve
|
174
202
|
eff_fplr = self.model.add_curve(blr_props['efffplr'])
|
175
203
|
if eff_fplr
|
@@ -181,7 +209,7 @@ class OpenStudio::Model::BoilerHotWater
|
|
181
209
|
|
182
210
|
# Get the minimum efficiency standards
|
183
211
|
thermal_eff = nil
|
184
|
-
|
212
|
+
|
185
213
|
# If specified as AFUE
|
186
214
|
unless blr_props['minimum_annual_fuel_utilization_efficiency'].nil?
|
187
215
|
min_afue = blr_props['minimum_annual_fuel_utilization_efficiency']
|
@@ -210,17 +238,7 @@ class OpenStudio::Model::BoilerHotWater
|
|
210
238
|
self.setNominalThermalEfficiency(thermal_eff)
|
211
239
|
end
|
212
240
|
|
213
|
-
|
214
|
-
|
215
|
-
# for NECB, check if modulating boiler required
|
216
|
-
# TO DO: logic for 2 stage boilers when heating cap > 176 kW and < 352 kW
|
217
|
-
if template == 'NECB 2011'
|
218
|
-
if capacity_w >= 352000
|
219
|
-
self.setBoilerFlowMode('LeavingSetpointModulated')
|
220
|
-
self.setMinimumPartLoadRatio(0.25)
|
221
|
-
end
|
222
|
-
end # NECB 2011
|
223
|
-
return successfully_set_all_properties
|
241
|
+
return successfully_set_all_properties
|
224
242
|
end
|
225
243
|
|
226
244
|
end
|
@@ -66,9 +66,9 @@ class OpenStudio::Model::ChillerElectricEIR
|
|
66
66
|
return successfully_set_all_properties
|
67
67
|
end
|
68
68
|
|
69
|
-
# Convert capacity to tons
|
70
69
|
capacity_tons = OpenStudio.convert(capacity_w, "W", "ton").get
|
71
70
|
|
71
|
+
|
72
72
|
return capacity_tons
|
73
73
|
|
74
74
|
end
|
@@ -100,24 +100,25 @@ class OpenStudio::Model::ChillerElectricEIR
|
|
100
100
|
end
|
101
101
|
|
102
102
|
# Applies the standard efficiency ratings and typical performance curves to this object.
|
103
|
-
#
|
103
|
+
#
|
104
104
|
# @param template [String] valid choices: 'DOE Ref Pre-1980', 'DOE Ref 1980-2004', '90.1-2004', '90.1-2007', '90.1-2010', '90.1-2013'
|
105
105
|
# @param standards [Hash] the OpenStudio_Standards spreadsheet in hash format
|
106
106
|
# @return [Bool] true if successful, false if not
|
107
|
-
def setStandardEfficiencyAndCurves(template)
|
108
|
-
|
107
|
+
def setStandardEfficiencyAndCurves(template, clg_tower_objs)
|
108
|
+
|
109
109
|
chillers = $os_standards['chillers']
|
110
110
|
curve_biquadratics = $os_standards['curve_biquadratics']
|
111
111
|
curve_quadratics = $os_standards['curve_quadratics']
|
112
112
|
curve_bicubics = $os_standards['curve_bicubics']
|
113
|
-
|
113
|
+
|
114
|
+
|
114
115
|
# Define the criteria to find the chiller properties
|
115
116
|
# in the hvac standards data set.
|
116
117
|
search_criteria = {}
|
117
118
|
search_criteria['template'] = template
|
118
119
|
cooling_type = self.condenserType
|
119
120
|
search_criteria['cooling_type'] = cooling_type
|
120
|
-
|
121
|
+
|
121
122
|
# TODO Standards replace this with a mechanism to store this
|
122
123
|
# data in the chiller object itself.
|
123
124
|
# For now, retrieve the condenser type from the name
|
@@ -147,7 +148,7 @@ class OpenStudio::Model::ChillerElectricEIR
|
|
147
148
|
unless compressor_type.nil?
|
148
149
|
search_criteria['compressor_type'] = compressor_type
|
149
150
|
end
|
150
|
-
|
151
|
+
|
151
152
|
# Get the chiller capacity
|
152
153
|
capacity_w = nil
|
153
154
|
if self.referenceCapacity.is_initialized
|
@@ -160,8 +161,29 @@ class OpenStudio::Model::ChillerElectricEIR
|
|
160
161
|
return successfully_set_all_properties
|
161
162
|
end
|
162
163
|
|
164
|
+
#NECB 2011 requires that all chillers be modulating down to 25% of their capacity
|
165
|
+
if template == 'NECB 2011'
|
166
|
+
self.setChillerFlowMode('LeavingSetpointModulated')
|
167
|
+
self.setMinimumPartLoadRatio(0.25)
|
168
|
+
self.setMinimumUnloadingRatio(0.25)
|
169
|
+
if((capacity_w/1000.0) < 2100.0)
|
170
|
+
if(self.name.to_s.include? 'Primary Chiller')
|
171
|
+
chiller_capacity = capacity_w
|
172
|
+
elsif(self.name.to_s.include? 'Secondary Chiller')
|
173
|
+
chiller_capacity = 0.001
|
174
|
+
end
|
175
|
+
else
|
176
|
+
chiller_capacity = capacity_w/2.0
|
177
|
+
end
|
178
|
+
self.setReferenceCapacity(chiller_capacity)
|
179
|
+
end # NECB 2011
|
180
|
+
|
163
181
|
# Convert capacity to tons
|
164
|
-
|
182
|
+
if template == 'NECB 2011'
|
183
|
+
capacity_tons = OpenStudio.convert(chiller_capacity, "W", "ton").get
|
184
|
+
else
|
185
|
+
capacity_tons = OpenStudio.convert(capacity_w, "W", "ton").get
|
186
|
+
end
|
165
187
|
|
166
188
|
# Get the chiller properties
|
167
189
|
chlr_props = self.model.find_object(chillers, search_criteria, capacity_tons)
|
@@ -178,17 +200,17 @@ class OpenStudio::Model::ChillerElectricEIR
|
|
178
200
|
else
|
179
201
|
OpenStudio::logFree(OpenStudio::Warn, "openstudio.standards.ChillerElectricEIR", "For #{self.name}, cannot find cool_cap_ft curve, will not be set.")
|
180
202
|
successfully_set_all_properties = false
|
181
|
-
end
|
182
|
-
|
203
|
+
end
|
204
|
+
|
183
205
|
# Make the EIRFT curve
|
184
206
|
cool_eir_ft = self.model.add_curve(chlr_props['eirft'])
|
185
207
|
if cool_eir_ft
|
186
|
-
self.setElectricInputToCoolingOutputRatioFunctionOfTemperature(cool_eir_ft)
|
208
|
+
self.setElectricInputToCoolingOutputRatioFunctionOfTemperature(cool_eir_ft)
|
187
209
|
else
|
188
210
|
OpenStudio::logFree(OpenStudio::Warn, "openstudio.standards.ChillerElectricEIR", "For #{self.name}, cannot find cool_eir_ft curve, will not be set.")
|
189
211
|
successfully_set_all_properties = false
|
190
|
-
end
|
191
|
-
|
212
|
+
end
|
213
|
+
|
192
214
|
# Make the EIRFPLR curve
|
193
215
|
# which may be either a CurveBicubic or a CurveQuadratic based on chiller type
|
194
216
|
cool_plf_fplr = self.model.add_curve(chlr_props['eirfplr'])
|
@@ -197,7 +219,7 @@ class OpenStudio::Model::ChillerElectricEIR
|
|
197
219
|
else
|
198
220
|
OpenStudio::logFree(OpenStudio::Warn, "openstudio.standards.ChillerElectricEIR", "For #{self.name}, cannot find cool_plf_fplr curve, will not be set.")
|
199
221
|
successfully_set_all_properties = false
|
200
|
-
end
|
222
|
+
end
|
201
223
|
|
202
224
|
# Set the efficiency value
|
203
225
|
kw_per_ton = nil
|
@@ -211,20 +233,26 @@ class OpenStudio::Model::ChillerElectricEIR
|
|
211
233
|
successfully_set_all_properties = false
|
212
234
|
end
|
213
235
|
|
236
|
+
# Set cooling tower properties for NECB 2011 now that the new COP of the chiller is set
|
237
|
+
if template == 'NECB 2011'
|
238
|
+
if(self.name.to_s.include? 'Primary Chiller')
|
239
|
+
# Single speed tower model assumes 25% extra for compressor power
|
240
|
+
tower_cap = capacity_w*(1.0+1.0/self.referenceCOP)
|
241
|
+
if((tower_cap/1000.0) < 1750)
|
242
|
+
clg_tower_objs[0].setNumberofCells(1)
|
243
|
+
else
|
244
|
+
clg_tower_objs[0].setNumberofCells((tower_cap/(1000*1750)+0.5).round)
|
245
|
+
end
|
246
|
+
clg_tower_objs[0].setFanPoweratDesignAirFlowRate(0.015*tower_cap)
|
247
|
+
end
|
248
|
+
end
|
249
|
+
|
214
250
|
# Append the name with size and kw/ton
|
215
251
|
self.setName("#{name} #{capacity_tons.round}tons #{kw_per_ton.round(1)}kW/ton")
|
216
252
|
OpenStudio::logFree(OpenStudio::Info, 'openstudio.model.ChillerElectricEIR', "For #{template}: #{self.name}: #{cooling_type} #{condenser_type} #{compressor_type} Capacity = #{capacity_tons.round}tons; COP = #{cop.round(1)} (#{kw_per_ton.round(1)}kW/ton)")
|
217
253
|
|
218
|
-
#NECB 2011 requires that all chillers be modulating down to 25% of their capacity
|
219
|
-
|
220
|
-
if template == 'NECB 2011'
|
221
|
-
self.setChillerFlowMode('LeavingSetpointModulated')
|
222
|
-
self.setMinimumPartLoadRatio(0.25)
|
223
|
-
self.setMinimumUnloadingRatio(0.25)
|
224
|
-
end # NECB 2011
|
225
|
-
|
226
254
|
return successfully_set_all_properties
|
227
255
|
|
228
256
|
end
|
229
|
-
|
257
|
+
|
230
258
|
end
|
@@ -0,0 +1,255 @@
|
|
1
|
+
|
2
|
+
# Reopen the OpenStudio class to add methods to apply standards to this object
|
3
|
+
class OpenStudio::Model::CoilCoolingDXMultiSpeed
|
4
|
+
|
5
|
+
# Applies the standard efficiency ratings and typical performance curves to this object.
|
6
|
+
#
|
7
|
+
# @param template [String] valid choices: 'DOE Ref Pre-1980', 'DOE Ref 1980-2004', '90.1-2004', '90.1-2007', '90.1-2010', '90.1-2013'
|
8
|
+
# @param standards [Hash] the OpenStudio_Standards spreadsheet in hash format
|
9
|
+
# @return [Bool] true if successful, false if not
|
10
|
+
def setStandardEfficiencyAndCurves(template, standards, sql_db_vars_map)
|
11
|
+
|
12
|
+
successfully_set_all_properties = true
|
13
|
+
|
14
|
+
unitary_acs = standards['unitary_acs']
|
15
|
+
heat_pumps = standards['heat_pumps']
|
16
|
+
|
17
|
+
# Define the criteria to find the chiller properties
|
18
|
+
# in the hvac standards data set.
|
19
|
+
search_criteria = {}
|
20
|
+
search_criteria['template'] = template
|
21
|
+
cooling_type = self.condenserType
|
22
|
+
search_criteria['cooling_type'] = cooling_type
|
23
|
+
|
24
|
+
# TODO Standards - add split system vs single package to model
|
25
|
+
# For now, assume single package as default
|
26
|
+
subcategory = 'Single Package'
|
27
|
+
|
28
|
+
# Determine the heating type if unitary or zone hvac
|
29
|
+
heat_pump = false
|
30
|
+
heating_type = nil
|
31
|
+
containing_comp = nil
|
32
|
+
if self.airLoopHVAC.empty?
|
33
|
+
if self.containingHVACComponent.is_initialized
|
34
|
+
containing_comp = containingHVACComponent.get
|
35
|
+
if containing_comp.to_AirLoopHVACUnitaryHeatPumpAirToAirMultiSpeed.is_initialized
|
36
|
+
htg_coil = containing_comp.to_AirLoopHVACUnitaryHeatPumpAirToAirMultiSpeed.get.heatingCoil
|
37
|
+
if(htg_coil.to_CoilHeatingDXMultiSpeed.is_initialized)
|
38
|
+
heat_pump = true
|
39
|
+
heating_type = 'Electric Resistance or None'
|
40
|
+
elsif(htg_coil.to_CoilHeatingGasMultiStage.is_initialized)
|
41
|
+
heating_type = 'All Other'
|
42
|
+
end
|
43
|
+
end # TODO Add other unitary systems
|
44
|
+
elsif self.containingZoneHVACComponent.is_initialized
|
45
|
+
containing_comp = containingZoneHVACComponent.get
|
46
|
+
if containing_comp.to_ZoneHVACPackagedTerminalAirConditioner.is_initialized
|
47
|
+
subcategory = 'PTAC'
|
48
|
+
htg_coil = containing_comp.to_ZoneHVACPackagedTerminalAirConditioner.get.heatingCoil
|
49
|
+
if htg_coil.to_CoilHeatingElectric.is_initialized
|
50
|
+
heating_type = 'Electric Resistance or None'
|
51
|
+
elsif htg_coil.to_CoilHeatingWater.is_initialized || htg_coil.to_CoilHeatingGas.is_initialized || htg_col.to_CoilHeatingGasMultiStage
|
52
|
+
heating_type = 'All Other'
|
53
|
+
end
|
54
|
+
end # TODO Add other zone hvac systems
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
# Add the heating type to the search criteria
|
59
|
+
unless heating_type.nil?
|
60
|
+
search_criteria['heating_type'] = heating_type
|
61
|
+
end
|
62
|
+
|
63
|
+
search_criteria['subcategory'] = subcategory
|
64
|
+
|
65
|
+
# Get the coil capacity
|
66
|
+
capacity_w = nil
|
67
|
+
clg_stages = self.stages
|
68
|
+
if clg_stages.last.grossRatedTotalCoolingCapacity.is_initialized
|
69
|
+
capacity_w = clg_stages.last.grossRatedTotalCoolingCapacity.get
|
70
|
+
elsif self.autosizedSpeed4GrossRatedTotalCoolingCapacity.is_initialized
|
71
|
+
capacity_w = self.autosizedSpeed4GrossRatedTotalCoolingCapacity.get
|
72
|
+
else
|
73
|
+
OpenStudio::logFree(OpenStudio::Warn, 'openstudio.standards.CoilCoolingDXMultiSpeed', "For #{self.name} capacity is not available, cannot apply efficiency standard.")
|
74
|
+
successfully_set_all_properties = false
|
75
|
+
return successfully_set_all_properties
|
76
|
+
end
|
77
|
+
|
78
|
+
# Volume flow rate
|
79
|
+
flow_rate4 = nil
|
80
|
+
if clg_stages.last.ratedAirFlowRate.is_initialized
|
81
|
+
flow_rate4 = clg_stages.last.ratedAirFlowRate.get
|
82
|
+
elsif self.autosizedSpeed4RatedAirFlowRate.is_initialized
|
83
|
+
flow_rate4 = self.autosizedSpeed4RatedAirFlowRate.get
|
84
|
+
end
|
85
|
+
|
86
|
+
# Set number of stages for NECB 2011
|
87
|
+
if(template == 'NECB 2011')
|
88
|
+
stage_cap = []
|
89
|
+
num_stages = (capacity_w/(66.0*1000.0)+0.5).round
|
90
|
+
num_stages = [num_stages,4].min
|
91
|
+
if(num_stages == 1)
|
92
|
+
stage_cap[0] = capacity_w/2.0
|
93
|
+
stage_cap[1] = 2.0*stage_cap[0]
|
94
|
+
stage_cap[2] = stage_cap[1]+0.1
|
95
|
+
stage_cap[3] = stage_cap[2]+0.1
|
96
|
+
else
|
97
|
+
stage_cap[0] = 66.0*1000.0
|
98
|
+
stage_cap[1] = 2.0*stage_cap[0]
|
99
|
+
if(num_stages == 2)
|
100
|
+
stage_cap[2] = stage_cap[1]+0.1
|
101
|
+
stage_cap[3] = stage_cap[2]+0.1
|
102
|
+
elsif(num_stages == 3)
|
103
|
+
stage_cap[2] = 3.0*stage_cap[0]
|
104
|
+
stage_cap[3] = stage_cap[2]+0.1
|
105
|
+
elsif(num_stages == 4)
|
106
|
+
stage_cap[2] = 3.0*stage_cap[0]
|
107
|
+
stage_cap[3] = 4.0*stage_cap[0]
|
108
|
+
end
|
109
|
+
end
|
110
|
+
# set capacities, flow rates, and sensible heat ratio for stages
|
111
|
+
for istage in 0..3
|
112
|
+
clg_stages[istage].setGrossRatedTotalCoolingCapacity(stage_cap[istage])
|
113
|
+
clg_stages[istage].setRatedAirFlowRate(flow_rate4*stage_cap[istage]/capacity_w)
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
# Convert capacity to Btu/hr
|
118
|
+
capacity_btu_per_hr = OpenStudio.convert(capacity_w, "W", "Btu/hr").get
|
119
|
+
capacity_kbtu_per_hr = OpenStudio.convert(capacity_w, "W", "kBtu/hr").get
|
120
|
+
|
121
|
+
# Lookup efficiencies depending on whether it is a unitary AC or a heat pump
|
122
|
+
ac_props = nil
|
123
|
+
if heat_pump == true
|
124
|
+
ac_props = self.model.find_object(heat_pumps, search_criteria, capacity_btu_per_hr)
|
125
|
+
else
|
126
|
+
ac_props = self.model.find_object(unitary_acs, search_criteria, capacity_btu_per_hr)
|
127
|
+
end
|
128
|
+
|
129
|
+
# Check to make sure properties were found
|
130
|
+
if ac_props.nil?
|
131
|
+
OpenStudio::logFree(OpenStudio::Warn, 'openstudio.standards.CoilCoolingDXMultiSpeed', "For #{self.name}, cannot find efficiency info, cannot apply efficiency standard.")
|
132
|
+
successfully_set_all_properties = false
|
133
|
+
return successfully_set_all_properties
|
134
|
+
end
|
135
|
+
|
136
|
+
# Make the COOL-CAP-FT curve
|
137
|
+
cool_cap_ft = self.model.add_curve(ac_props["cool_cap_ft"], standards)
|
138
|
+
if cool_cap_ft
|
139
|
+
clg_stages.each do |istage|
|
140
|
+
istage.setTotalCoolingCapacityFunctionofTemperatureCurve(cool_cap_ft)
|
141
|
+
end
|
142
|
+
else
|
143
|
+
OpenStudio::logFree(OpenStudio::Warn, 'openstudio.standards.CoilCoolingDXMultiSpeed', "For #{self.name}, cannot find cool_cap_ft curve, will not be set.")
|
144
|
+
successfully_set_all_properties = false
|
145
|
+
end
|
146
|
+
|
147
|
+
# Make the COOL-CAP-FFLOW curve
|
148
|
+
cool_cap_fflow = self.model.add_curve(ac_props["cool_cap_fflow"], standards)
|
149
|
+
if cool_cap_fflow
|
150
|
+
clg_stages.each do |istage|
|
151
|
+
istage.setTotalCoolingCapacityFunctionofFlowFractionCurve(cool_cap_fflow)
|
152
|
+
end
|
153
|
+
else
|
154
|
+
OpenStudio::logFree(OpenStudio::Warn, 'openstudio.standards.CoilCoolingDXMultiSpeed', "For #{self.name}, cannot find cool_cap_fflow curve, will not be set.")
|
155
|
+
successfully_set_all_properties = false
|
156
|
+
end
|
157
|
+
|
158
|
+
# Make the COOL-EIR-FT curve
|
159
|
+
cool_eir_ft = self.model.add_curve(ac_props["cool_eir_ft"], standards)
|
160
|
+
if cool_eir_ft
|
161
|
+
clg_stages.each do |istage|
|
162
|
+
istage.setEnergyInputRatioFunctionofTemperatureCurve(cool_eir_ft)
|
163
|
+
end
|
164
|
+
else
|
165
|
+
OpenStudio::logFree(OpenStudio::Warn, 'openstudio.standards.CoilCoolingDXMultiSpeed', "For #{self.name}, cannot find cool_eir_ft curve, will not be set.")
|
166
|
+
successfully_set_all_properties = false
|
167
|
+
end
|
168
|
+
|
169
|
+
# Make the COOL-EIR-FFLOW curve
|
170
|
+
cool_eir_fflow = self.model.add_curve(ac_props["cool_eir_fflow"], standards)
|
171
|
+
if cool_eir_fflow
|
172
|
+
clg_stages.each do |istage|
|
173
|
+
istage.setEnergyInputRatioFunctionofFlowFractionCurve(cool_eir_fflow)
|
174
|
+
end
|
175
|
+
else
|
176
|
+
OpenStudio::logFree(OpenStudio::Warn, 'openstudio.standards.CoilCoolingDXMultiSpeed', "For #{self.name}, cannot find cool_eir_fflow curve, will not be set.")
|
177
|
+
successfully_set_all_properties = false
|
178
|
+
end
|
179
|
+
|
180
|
+
# Make the COOL-PLF-FPLR curve
|
181
|
+
cool_plf_fplr = self.model.add_curve(ac_props["cool_plf_fplr"], standards)
|
182
|
+
if cool_plf_fplr
|
183
|
+
clg_stages.each do |istage|
|
184
|
+
istage.setPartLoadFractionCorrelationCurve(cool_plf_fplr)
|
185
|
+
end
|
186
|
+
else
|
187
|
+
OpenStudio::logFree(OpenStudio::Warn, 'openstudio.standards.CoilCoolingDXMultiSpeed', "For #{self.name}, cannot find cool_plf_fplr curve, will not be set.")
|
188
|
+
successfully_set_all_properties = false
|
189
|
+
end
|
190
|
+
|
191
|
+
# Get the minimum efficiency standards
|
192
|
+
cop = nil
|
193
|
+
|
194
|
+
if subcategory == 'PTAC'
|
195
|
+
ptac_eer_coeff_1 = ac_props['ptac_eer_coefficient_1']
|
196
|
+
ptac_eer_coeff_2 = ac_props['ptac_eer_coefficient_2']
|
197
|
+
capacity_btu_per_hr = 7000 if capacity_btu_per_hr < 7000
|
198
|
+
capacity_btu_per_hr = 15000 if capacity_btu_per_hr > 15000
|
199
|
+
ptac_eer = ptac_eer_coeff_1 + (ptac_eer_coeff_2 * capacity_btu_per_hr)
|
200
|
+
cop = eer_to_cop(ptac_eer)
|
201
|
+
#self.setName("#{self.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{ptac_eer}EER")
|
202
|
+
new_comp_name = "#{self.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{ptac_eer}EER"
|
203
|
+
OpenStudio::logFree(OpenStudio::Info, 'openstudio.standards.CoilCoolingDXMultiSpeed', "For #{template}: #{self.name}: #{cooling_type} #{heating_type} #{subcategory} Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; EER = #{ptac_eer}")
|
204
|
+
end
|
205
|
+
|
206
|
+
# If specified as SEER
|
207
|
+
unless ac_props['minimum_seasonal_energy_efficiency_ratio'].nil?
|
208
|
+
min_seer = ac_props['minimum_seasonal_energy_efficiency_ratio']
|
209
|
+
cop = seer_to_cop(min_seer)
|
210
|
+
new_comp_name = "#{self.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_seer}SEER"
|
211
|
+
# self.setName("#{self.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_seer}SEER")
|
212
|
+
OpenStudio::logFree(OpenStudio::Info, 'openstudio.standards.CoilCoolingDXMultiSpeed', "For #{template}: #{self.name}: #{cooling_type} #{heating_type} #{subcategory} Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; SEER = #{min_seer}")
|
213
|
+
end
|
214
|
+
|
215
|
+
# If specified as EER
|
216
|
+
unless ac_props['minimum_energy_efficiency_ratio'].nil?
|
217
|
+
min_eer = ac_props['minimum_energy_efficiency_ratio']
|
218
|
+
cop = eer_to_cop(min_eer)
|
219
|
+
new_comp_name = "#{self.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_eer}EER"
|
220
|
+
OpenStudio::logFree(OpenStudio::Info, 'openstudio.standards.CoilCoolingDXMultiSpeed', "For #{template}: #{self.name}: #{cooling_type} #{heating_type} #{subcategory} Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; EER = #{min_eer}")
|
221
|
+
end
|
222
|
+
|
223
|
+
# if specified as SEER (heat pump)
|
224
|
+
unless ac_props['minimum_seasonal_efficiency'].nil?
|
225
|
+
min_seer = ac_props['minimum_seasonal_efficiency']
|
226
|
+
cop = seer_to_cop(min_seer)
|
227
|
+
new_comp_name = "#{self.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_seer}SEER"
|
228
|
+
# self.setName("#{self.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_seer}SEER")
|
229
|
+
OpenStudio::logFree(OpenStudio::Info, 'openstudio.standards.CoilCoolingDXMultiSpeed', "For #{template}: #{self.name}: #{cooling_type} #{heating_type} #{subcategory} Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; SEER = #{min_seer}")
|
230
|
+
end
|
231
|
+
|
232
|
+
# If specified as EER (heat pump)
|
233
|
+
unless ac_props['minimum_full_load_efficiency'].nil?
|
234
|
+
min_eer = ac_props['minimum_full_load_efficiency']
|
235
|
+
cop = eer_to_cop(min_eer)
|
236
|
+
new_comp_name = "#{self.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_eer}EER"
|
237
|
+
OpenStudio::logFree(OpenStudio::Info, 'openstudio.standards.CoilCoolingDXMultiSpeed', "For #{template}: #{self.name}: #{cooling_type} #{heating_type} #{subcategory} Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; EER = #{min_eer}")
|
238
|
+
end
|
239
|
+
|
240
|
+
sql_db_vars_map[new_comp_name] = self.name.to_s
|
241
|
+
self.setName(new_comp_name)
|
242
|
+
|
243
|
+
# Set the efficiency values
|
244
|
+
|
245
|
+
unless cop.nil?
|
246
|
+
clg_stages.each do |istage|
|
247
|
+
istage.setGrossRatedCoolingCOP(cop)
|
248
|
+
end
|
249
|
+
end
|
250
|
+
|
251
|
+
return sql_db_vars_map
|
252
|
+
|
253
|
+
end
|
254
|
+
|
255
|
+
end
|