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.
- 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"
|