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
@@ -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" =>
|
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
|
-
|
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
|
-
|
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"
|