openstudio-standards 0.8.3 → 0.8.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/lib/openstudio-standards/btap/costing/README.md +502 -0
- data/lib/openstudio-standards/btap/costing/btap_costing.rb +473 -0
- data/lib/openstudio-standards/btap/costing/btap_measure_helper.rb +359 -0
- data/lib/openstudio-standards/btap/costing/btap_workflow.rb +117 -0
- data/lib/openstudio-standards/btap/costing/common_paths.rb +78 -0
- data/lib/openstudio-standards/btap/costing/common_resources/ConstructionProperties.csv +52 -0
- data/lib/openstudio-standards/btap/costing/common_resources/Constructions.csv +37 -0
- data/lib/openstudio-standards/btap/costing/common_resources/construction_sets.csv +1270 -0
- data/lib/openstudio-standards/btap/costing/common_resources/constructions_glazing.csv +61 -0
- data/lib/openstudio-standards/btap/costing/common_resources/constructions_opaque.csv +2256 -0
- data/lib/openstudio-standards/btap/costing/common_resources/costs.csv +1904 -0
- data/lib/openstudio-standards/btap/costing/common_resources/costs_local_factors.csv +2315 -0
- data/lib/openstudio-standards/btap/costing/common_resources/hvac_vent_ahu.csv +925 -0
- data/lib/openstudio-standards/btap/costing/common_resources/lighting.csv +364 -0
- data/lib/openstudio-standards/btap/costing/common_resources/lighting_sets.csv +2667 -0
- data/lib/openstudio-standards/btap/costing/common_resources/locations.csv +75 -0
- data/lib/openstudio-standards/btap/costing/common_resources/materials_glazing.csv +35 -0
- data/lib/openstudio-standards/btap/costing/common_resources/materials_hvac.csv +1699 -0
- data/lib/openstudio-standards/btap/costing/common_resources/materials_lighting.csv +267 -0
- data/lib/openstudio-standards/btap/costing/common_resources/materials_opaque.csv +164 -0
- data/lib/openstudio-standards/btap/costing/copy_test_results_files_to_expected_results.rb +11 -0
- data/lib/openstudio-standards/btap/costing/cost_building_from_file.rb +136 -0
- data/lib/openstudio-standards/btap/costing/costing_database_wrapper.rb +177 -0
- data/lib/openstudio-standards/btap/costing/daylighting_sensor_control_costing.rb +353 -0
- data/lib/openstudio-standards/btap/costing/dcv_costing.rb +314 -0
- data/lib/openstudio-standards/btap/costing/dummy.epw +8768 -0
- data/lib/openstudio-standards/btap/costing/dummy.osm +5320 -0
- data/lib/openstudio-standards/btap/costing/envelope_costing.rb +284 -0
- data/lib/openstudio-standards/btap/costing/heating_cooling_costing.rb +2584 -0
- data/lib/openstudio-standards/btap/costing/led_lighting_costing.rb +155 -0
- data/lib/openstudio-standards/btap/costing/lighting_costing.rb +209 -0
- data/lib/openstudio-standards/btap/costing/mech_sizing.json +502 -0
- data/lib/openstudio-standards/btap/costing/neb_end_use_prices.csv +42 -0
- data/lib/openstudio-standards/btap/costing/necb_2011_spacetype_info.csv +225 -0
- data/lib/openstudio-standards/btap/costing/necb_reference_runs.csv +28705 -0
- data/lib/openstudio-standards/btap/costing/nv_costing.rb +547 -0
- data/lib/openstudio-standards/btap/costing/parallel_tests.rb +92 -0
- data/lib/openstudio-standards/btap/costing/pv_ground_costing.rb +687 -0
- data/lib/openstudio-standards/btap/costing/shw_costing.rb +705 -0
- data/lib/openstudio-standards/btap/costing/test_list.txt +17 -0
- data/lib/openstudio-standards/btap/costing/test_run_all_test_locally.rb +26 -0
- data/lib/openstudio-standards/btap/costing/test_run_costing_tests.rb +80 -0
- data/lib/openstudio-standards/btap/costing/ventilation_costing.rb +2616 -0
- data/lib/openstudio-standards/constructions/modify.rb +2 -1
- data/lib/openstudio-standards/standards/Standards.Model.rb +39 -9
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.Model.rb +2 -2
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/ashrae_90_1_prm.UserData.rb +6 -1
- data/lib/openstudio-standards/standards/necb/BTAPPRE1980/btap_pre1980.rb +2 -27
- data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_3_and_8_single_speed.rb +68 -27
- data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_4.rb +64 -25
- data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_6.rb +9 -14
- data/lib/openstudio-standards/standards/necb/ECMS/hvac_systems.rb +46 -20
- data/lib/openstudio-standards/standards/necb/NECB2011/autozone.rb +635 -248
- data/lib/openstudio-standards/standards/necb/NECB2011/data/constants.json +43 -7
- data/lib/openstudio-standards/standards/necb/NECB2011/data/fuel_type_sets.json +7 -1
- data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/HighriseApartmentMult.osm +14272 -0
- data/lib/openstudio-standards/standards/necb/NECB2011/data/necb_2015_table_c1.json +1 -1
- data/lib/openstudio-standards/standards/necb/NECB2011/data/space_types.json +437 -437
- data/lib/openstudio-standards/standards/necb/NECB2011/data/systems.json +516 -0
- data/lib/openstudio-standards/standards/necb/NECB2011/data/systems_including_sys5.json +588 -0
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_namer.rb +489 -0
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_1_single_speed.rb +16 -6
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_2_and_5.rb +48 -5
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_3_and_8_multi_speed.rb +2 -2
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_3_and_8_single_speed.rb +35 -27
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_4.rb +34 -23
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_6.rb +8 -6
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_systems.rb +42 -13
- data/lib/openstudio-standards/standards/necb/NECB2011/necb_2011.rb +214 -25
- data/lib/openstudio-standards/standards/necb/NECB2011/system_fuels.rb +61 -1
- data/lib/openstudio-standards/standards/necb/NECB2015/data/space_types.json +636 -636
- data/lib/openstudio-standards/standards/necb/NECB2015/data/unitary_acs.json +38 -38
- data/lib/openstudio-standards/standards/necb/NECB2015/hvac_systems.rb +15 -6
- data/lib/openstudio-standards/standards/necb/NECB2017/data/space_types.json +636 -636
- data/lib/openstudio-standards/standards/necb/NECB2020/data/chillers.json +71 -71
- data/lib/openstudio-standards/standards/necb/README.md +343 -0
- data/lib/openstudio-standards/standards/necb/common/btap_data.rb +190 -28
- data/lib/openstudio-standards/standards/necb/common/btap_datapoint.rb +14 -5
- data/lib/openstudio-standards/standards/necb/common/eccc_electric_grid_intensity_20250311.csv +14 -0
- data/lib/openstudio-standards/standards/necb/common/nir_gas_grid_intensity_20250311.csv +14 -0
- data/lib/openstudio-standards/standards/necb/common/system_types.yaml +0 -0
- data/lib/openstudio-standards/utilities/logging.rb +18 -14
- data/lib/openstudio-standards/version.rb +1 -1
- data/lib/openstudio-standards/weather/modify.rb +2 -2
- data/lib/openstudio-standards.rb +12 -0
- metadata +53 -2
@@ -81,7 +81,8 @@ class NECB2011
|
|
81
81
|
system_data,
|
82
82
|
determine_control_zone(zones),
|
83
83
|
necb_reference_hp: necb_reference_hp,
|
84
|
-
necb_reference_hp_supp_fuel: necb_reference_hp_supp_fuel
|
84
|
+
necb_reference_hp_supp_fuel: necb_reference_hp_supp_fuel,
|
85
|
+
hw_loop: hw_loop)
|
85
86
|
# Add Zone equipment
|
86
87
|
zones.each do |zone| # Zone sizing temperature difference
|
87
88
|
sizing_zone = zone.sizingZone
|
@@ -101,11 +102,10 @@ class NECB2011
|
|
101
102
|
hw_loop,
|
102
103
|
model,
|
103
104
|
zone)
|
104
|
-
|
105
105
|
end
|
106
106
|
else
|
107
107
|
zones.each do |zone|
|
108
|
-
air_loop = add_system_3_and_8_airloop(heating_coil_type, model, system_data, zone, necb_reference_hp: necb_reference_hp, necb_reference_hp_supp_fuel: necb_reference_hp_supp_fuel)
|
108
|
+
air_loop = add_system_3_and_8_airloop(heating_coil_type, model, system_data, zone, necb_reference_hp: necb_reference_hp, necb_reference_hp_supp_fuel: necb_reference_hp_supp_fuel, hw_loop: hw_loop)
|
109
109
|
add_sys3_and_8_zone_equip(air_loop,
|
110
110
|
baseboard_type,
|
111
111
|
hw_loop,
|
@@ -118,19 +118,20 @@ class NECB2011
|
|
118
118
|
sys_name_pars['sys_clg'] = 'dx'
|
119
119
|
sys_name_pars['sys_clg'] = 'ashp' if necb_reference_hp
|
120
120
|
sys_name_pars['sys_htg'] = heating_coil_type
|
121
|
-
sys_name_pars['sys_htg'] = 'ashp' if necb_reference_hp
|
121
|
+
sys_name_pars['sys_htg'] = 'ashp>c-g' if necb_reference_hp && (necb_reference_hp_supp_fuel == "NaturalGas" || necb_reference_hp_supp_fuel == "Gas")
|
122
|
+
sys_name_pars['sys_htg'] = 'ashp>c-e' if necb_reference_hp && (necb_reference_hp_supp_fuel == "Electricity" || necb_reference_hp_supp_fuel == "Electric" || necb_reference_hp_supp_fuel == "FuelOilNo2")
|
123
|
+
sys_name_pars['sys_htg'] = 'ashp>c-hw' if necb_reference_hp && (necb_reference_hp_supp_fuel == "Hot Water" || necb_reference_hp_supp_fuel == "HotWater")
|
122
124
|
sys_name_pars['sys_sf'] = 'cv'
|
123
125
|
sys_name_pars['zone_htg'] = baseboard_type
|
124
126
|
sys_name_pars['zone_clg'] = 'none'
|
125
127
|
sys_name_pars['sys_rf'] = 'none'
|
126
|
-
assign_base_sys_name(air_loop,
|
128
|
+
return assign_base_sys_name( air_loop: air_loop,
|
127
129
|
sys_abbr: 'sys_3',
|
128
130
|
sys_oa: 'mixed',
|
129
131
|
sys_name_pars: sys_name_pars)
|
130
|
-
return true
|
131
132
|
end
|
132
133
|
|
133
|
-
def add_system_3_and_8_airloop(heating_coil_type, model, system_data, control_zone, necb_reference_hp:false, necb_reference_hp_supp_fuel:'DefaultFuel')
|
134
|
+
def add_system_3_and_8_airloop(heating_coil_type, model, system_data, control_zone, necb_reference_hp:false, necb_reference_hp_supp_fuel:'DefaultFuel', necb_reference_hp_fancoil: false, hw_loop: nil)
|
134
135
|
# System Type 3: PSZ-AC
|
135
136
|
# This measure creates:
|
136
137
|
# -a constant volume packaged single-zone A/C unit
|
@@ -160,12 +161,14 @@ class NECB2011
|
|
160
161
|
sizing_zone.setZoneHeatingSizingFactor(system_data[:ZoneHeatingSizingFactor])
|
161
162
|
end
|
162
163
|
|
163
|
-
if necb_reference_hp
|
164
|
+
#if necb_reference_hp
|
164
165
|
#AirLoopHVACUnitaryHeatPumpAirToAir needs FanOnOff in order for the fan to turn off during off hours
|
165
|
-
|
166
|
-
else
|
167
|
-
|
168
|
-
end
|
166
|
+
# fan = OpenStudio::Model::FanOnOff.new(model, always_on)
|
167
|
+
#else
|
168
|
+
# fan = OpenStudio::Model::FanConstantVolume.new(model, always_on)
|
169
|
+
#end
|
170
|
+
# Not using unitary heat pump model until it works with backup hot water coils. Fan stays as contant volume.# Not using unitary heat pump model until it works with backup hot water coils. Fan stays as contant volume.
|
171
|
+
fan = OpenStudio::Model::FanConstantVolume.new(model, always_on)
|
169
172
|
|
170
173
|
# Set up DX coil
|
171
174
|
if necb_reference_hp #NECB curve characteristics
|
@@ -178,10 +181,13 @@ class NECB2011
|
|
178
181
|
|
179
182
|
raise("Flag 'necb_reference_hp' is set to true while parameter 'heating_coil_type' is not set to DX") if (necb_reference_hp && (heating_coil_type != 'DX'))
|
180
183
|
case heating_coil_type
|
181
|
-
when 'Electric' # electric coil
|
184
|
+
when 'Electric', 'Electricity', "FuelOilNo2" # electric coil
|
182
185
|
htg_coil = OpenStudio::Model::CoilHeatingElectric.new(model, always_on)
|
183
|
-
when 'Gas'
|
186
|
+
when 'Gas', 'NaturalGas'
|
184
187
|
htg_coil = OpenStudio::Model::CoilHeatingGas.new(model, always_on)
|
188
|
+
when 'Hot Water', 'HotWater'
|
189
|
+
htg_coil = OpenStudio::Model::CoilHeatingWater.new(model, always_on)
|
190
|
+
hw_loop.addDemandBranchForComponent(htg_coil)
|
185
191
|
when 'DX'
|
186
192
|
#create main DX heating coil
|
187
193
|
htg_coil = add_onespeed_htg_DX_coil(model, always_on)
|
@@ -210,31 +216,33 @@ class NECB2011
|
|
210
216
|
# Add the components to the air loop
|
211
217
|
# in order from closest to zone to furthest from zone
|
212
218
|
supply_inlet_node = air_loop.supplyInletNode
|
219
|
+
fan.addToNode(supply_inlet_node)
|
213
220
|
if necb_reference_hp
|
214
|
-
|
215
221
|
#create supplemental heating coil based on default regional fuel type
|
216
222
|
if necb_reference_hp_supp_fuel == 'DefaultFuel'
|
217
223
|
epw = OpenStudio::EpwFile.new(model.weatherFile.get.path.get)
|
218
224
|
necb_reference_hp_supp_fuel = @standards_data['regional_fuel_use'].detect { |fuel_sources| fuel_sources['state_province_regions'].include?(epw.stateProvinceRegion) }['fueltype_set']
|
219
225
|
end
|
220
|
-
if necb_reference_hp_supp_fuel == 'NaturalGas'
|
226
|
+
if necb_reference_hp_supp_fuel == 'NaturalGas' || necb_reference_hp_supp_fuel == 'Gas'
|
221
227
|
supplemental_htg_coil = OpenStudio::Model::CoilHeatingGas.new(model, always_on)
|
222
|
-
elsif necb_reference_hp_supp_fuel == 'Electricity'
|
228
|
+
elsif necb_reference_hp_supp_fuel == 'Electricity' || necb_reference_hp_supp_fuel == 'Electric' || necb_reference_hp_supp_fuel == 'FuelOilNo2'
|
223
229
|
supplemental_htg_coil = OpenStudio::Model::CoilHeatingElectric.new(model, always_on)
|
224
|
-
|
230
|
+
elsif necb_reference_hp_supp_fuel == 'Hot Water' || necb_reference_hp_supp_fuel == "HotWater"
|
231
|
+
supplemental_htg_coil = OpenStudio::Model::CoilHeatingWater.new(model, always_on)
|
232
|
+
hw_loop.addDemandBranchForComponent(supplemental_htg_coil)
|
233
|
+
else
|
225
234
|
raise('Invalid fuel type selected for heat pump supplemental coil')
|
226
235
|
end
|
227
236
|
# This method will seem like an error in number of args..but this is due to swig voodoo.
|
228
|
-
air_to_air_heatpump = OpenStudio::Model::AirLoopHVACUnitaryHeatPumpAirToAir.new(model, always_on, fan, htg_coil, clg_coil, supplemental_htg_coil)
|
229
|
-
air_to_air_heatpump.setName("#{control_zone.name} ASHP")
|
230
|
-
air_to_air_heatpump.setControllingZone(control_zone)
|
231
|
-
air_to_air_heatpump.setSupplyAirFanOperatingModeSchedule(always_on)
|
232
|
-
air_to_air_heatpump.addToNode(supply_inlet_node)
|
233
|
-
|
234
|
-
fan.addToNode(supply_inlet_node)
|
235
|
-
htg_coil.addToNode(supply_inlet_node)
|
236
|
-
clg_coil.addToNode(supply_inlet_node)
|
237
|
+
#air_to_air_heatpump = OpenStudio::Model::AirLoopHVACUnitaryHeatPumpAirToAir.new(model, always_on, fan, htg_coil, clg_coil, supplemental_htg_coil)
|
238
|
+
#air_to_air_heatpump.setName("#{control_zone.name} ASHP")
|
239
|
+
#air_to_air_heatpump.setControllingZone(control_zone)
|
240
|
+
#air_to_air_heatpump.setSupplyAirFanOperatingModeSchedule(always_on)
|
241
|
+
#air_to_air_heatpump.addToNode(supply_inlet_node)
|
242
|
+
supplemental_htg_coil.addToNode(supply_inlet_node)
|
237
243
|
end
|
244
|
+
htg_coil.addToNode(supply_inlet_node)
|
245
|
+
clg_coil.addToNode(supply_inlet_node)
|
238
246
|
oa_system.addToNode(supply_inlet_node)
|
239
247
|
|
240
248
|
# Add a setpoint manager single zone reheat to control the
|
@@ -54,9 +54,7 @@ class NECB2011
|
|
54
54
|
# NOTE: This is the same as system type 3 (single zone make-up air unit and single zone rooftop unit are both PSZ systems)
|
55
55
|
# SHOULD WE COMBINE sys3 and sys4 into one script?
|
56
56
|
#
|
57
|
-
|
58
|
-
# Todo change this when control zone method is working.
|
59
|
-
control_zone = zones.first
|
57
|
+
control_zone = determine_control_zone(zones)
|
60
58
|
|
61
59
|
always_on = model.alwaysOnDiscreteSchedule
|
62
60
|
|
@@ -83,12 +81,14 @@ class NECB2011
|
|
83
81
|
sizing_zone.setZoneHeatingSizingFactor(system_data[:ZoneHeatingSizingFactor])
|
84
82
|
end
|
85
83
|
|
86
|
-
if necb_reference_hp
|
84
|
+
#if necb_reference_hp
|
87
85
|
# AirLoopHVACUnitaryHeatPumpAirToAir needs FanOnOff in order for the fan to turn off during off hours
|
88
|
-
|
89
|
-
else
|
90
|
-
|
91
|
-
end
|
86
|
+
# fan = OpenStudio::Model::FanOnOff.new(model, always_on)
|
87
|
+
#else
|
88
|
+
# fan = OpenStudio::Model::FanConstantVolume.new(model, always_on)
|
89
|
+
#end
|
90
|
+
# Not using unitary heat pump model until it works with backup hot water coils. Fan stays as contant volume.
|
91
|
+
fan = OpenStudio::Model::FanConstantVolume.new(model, always_on)
|
92
92
|
|
93
93
|
# Set up DX coil with NECB performance curve characteristics;
|
94
94
|
clg_coil = add_onespeed_DX_coil(model, always_on)
|
@@ -96,13 +96,16 @@ class NECB2011
|
|
96
96
|
clg_coil.setName('CoilCoolingDXSingleSpeed_ashp') if necb_reference_hp
|
97
97
|
|
98
98
|
raise("Flag 'necb_reference_hp' is set to true while parameter 'heating_coil_type' is not set to DX") if (necb_reference_hp && (heating_coil_type != 'DX'))
|
99
|
-
if heating_coil_type == 'Electric' # electric coil
|
99
|
+
if heating_coil_type == 'Electric' || heating_coil_type == 'FuelOilNo2' # electric coil
|
100
100
|
htg_coil = OpenStudio::Model::CoilHeatingElectric.new(model, always_on)
|
101
101
|
elsif heating_coil_type == 'Gas'
|
102
102
|
htg_coil = OpenStudio::Model::CoilHeatingGas.new(model, always_on)
|
103
103
|
elsif heating_coil_type == 'DX'
|
104
104
|
htg_coil = add_onespeed_htg_DX_coil(model, always_on)
|
105
105
|
htg_coil.setName('CoilHeatingDXSingleSpeed_ashp')
|
106
|
+
elsif heating_coil_type == 'Hot Water'
|
107
|
+
htg_coil = OpenStudio::Model::CoilHeatingWater.new(model, always_on)
|
108
|
+
hw_loop.addDemandBranchForComponent(htg_coil)
|
106
109
|
end
|
107
110
|
|
108
111
|
# TO DO: other fuel-fired heating coil types? (not available in OpenStudio/E+ - may need to play with efficiency to mimic other fuel types)
|
@@ -121,6 +124,7 @@ class NECB2011
|
|
121
124
|
# Add the components to the air loop
|
122
125
|
# in order from closest to zone to furthest from zone
|
123
126
|
supply_inlet_node = air_loop.supplyInletNode
|
127
|
+
fan.addToNode(supply_inlet_node)
|
124
128
|
if necb_reference_hp
|
125
129
|
#create supplemental heating coil based on default regional fuel type
|
126
130
|
if necb_reference_hp_supp_fuel == 'DefaultFuel'
|
@@ -131,21 +135,27 @@ class NECB2011
|
|
131
135
|
supplemental_htg_coil = OpenStudio::Model::CoilHeatingGas.new(model, always_on)
|
132
136
|
elsif necb_reference_hp_supp_fuel == 'Electricity' or necb_reference_hp_supp_fuel == 'FuelOilNo2'
|
133
137
|
supplemental_htg_coil = OpenStudio::Model::CoilHeatingElectric.new(model, always_on)
|
134
|
-
|
138
|
+
elsif necb_reference_hp_supp_fuel == 'Hot Water'
|
139
|
+
supplemental_htg_coil = OpenStudio::Model::CoilHeatingWater.new(model, always_on)
|
140
|
+
hw_loop.addDemandBranchForComponent(supplemental_htg_coil)
|
141
|
+
else
|
135
142
|
raise('Invalid fuel type selected for heat pump supplemental coil')
|
136
143
|
end
|
144
|
+
supplemental_htg_coil.addToNode(supply_inlet_node)
|
137
145
|
# This method will seem like an error in number of args..but this is due to swig voodoo.
|
138
|
-
air_to_air_heatpump = OpenStudio::Model::AirLoopHVACUnitaryHeatPumpAirToAir.new(model, always_on, fan, htg_coil, clg_coil, supplemental_htg_coil)
|
139
|
-
air_to_air_heatpump.setName("#{control_zone.name} ASHP")
|
140
|
-
air_to_air_heatpump.setControllingZone(control_zone)
|
141
|
-
air_to_air_heatpump.setSupplyAirFanOperatingModeSchedule(always_on)
|
142
|
-
air_to_air_heatpump.addToNode(supply_inlet_node)
|
143
|
-
else
|
144
|
-
fan.addToNode(supply_inlet_node)
|
145
|
-
htg_coil.addToNode(supply_inlet_node)
|
146
|
-
clg_coil.addToNode(supply_inlet_node)
|
147
|
-
|
146
|
+
#air_to_air_heatpump = OpenStudio::Model::AirLoopHVACUnitaryHeatPumpAirToAir.new(model, always_on, fan, htg_coil, clg_coil, supplemental_htg_coil)
|
147
|
+
#air_to_air_heatpump.setName("#{control_zone.name} ASHP")
|
148
|
+
#air_to_air_heatpump.setControllingZone(control_zone)
|
149
|
+
#air_to_air_heatpump.setSupplyAirFanOperatingModeSchedule(always_on)
|
150
|
+
#air_to_air_heatpump.addToNode(supply_inlet_node)
|
148
151
|
end
|
152
|
+
htg_coil.addToNode(supply_inlet_node)
|
153
|
+
clg_coil.addToNode(supply_inlet_node)
|
154
|
+
#fan.addToNode(supply_inlet_node)
|
155
|
+
#htg_coil.addToNode(supply_inlet_node)
|
156
|
+
#clg_coil.addToNode(supply_inlet_node)
|
157
|
+
#supplemental_htg_coil.addToNode(supply_inlet_node) if necb_reference_hp
|
158
|
+
|
149
159
|
oa_system.addToNode(supply_inlet_node)
|
150
160
|
# Add a setpoint manager single zone reheat to control the
|
151
161
|
# supply air temperature based on the needs of this zone
|
@@ -198,17 +208,18 @@ class NECB2011
|
|
198
208
|
sys_name_pars['sys_clg'] = 'dx'
|
199
209
|
sys_name_pars['sys_clg'] = 'ashp' if necb_reference_hp
|
200
210
|
sys_name_pars['sys_htg'] = heating_coil_type
|
201
|
-
sys_name_pars['sys_htg'] = 'ashp' if necb_reference_hp
|
211
|
+
sys_name_pars['sys_htg'] = 'ashp>c-g' if necb_reference_hp and necb_reference_hp_supp_fuel == "NaturalGas"
|
212
|
+
sys_name_pars['sys_htg'] = 'ashp>c-e' if necb_reference_hp and necb_reference_hp_supp_fuel == "Electricity"
|
213
|
+
sys_name_pars['sys_htg'] = 'ashp>c-hw' if necb_reference_hp and necb_reference_hp_supp_fuel == "Hot Water"
|
202
214
|
sys_name_pars['sys_sf'] = 'cv'
|
203
215
|
sys_name_pars['zone_htg'] = baseboard_type
|
204
216
|
sys_name_pars['zone_clg'] = 'none'
|
205
217
|
sys_name_pars['sys_rf'] = 'none'
|
206
|
-
assign_base_sys_name(air_loop,
|
218
|
+
return assign_base_sys_name(air_loop: air_loop,
|
207
219
|
sys_abbr: 'sys_4',
|
208
220
|
sys_oa: 'mixed',
|
209
221
|
sys_name_pars: sys_name_pars)
|
210
222
|
|
211
|
-
return true
|
212
223
|
end
|
213
224
|
# end add_sys4_single_zone_make_up_air_unit_with_baseboard_heating
|
214
225
|
end
|
@@ -138,7 +138,6 @@ class NECB2011
|
|
138
138
|
vav_terminal.setFixedMinimumAirFlowRate(system_data[:ZoneVAVMinFlowFactorPerFloorArea] * zone.floorArea)
|
139
139
|
vav_terminal.setMaximumReheatAirTemperature(system_data[:ZoneVAVMaxReheatTemp])
|
140
140
|
vav_terminal.setDamperHeatingAction(system_data[:ZoneVAVDamperAction])
|
141
|
-
|
142
141
|
end
|
143
142
|
sys_name_pars = {}
|
144
143
|
sys_name_pars['sys_hr'] = 'none'
|
@@ -148,7 +147,7 @@ class NECB2011
|
|
148
147
|
sys_name_pars['zone_htg'] = baseboard_type
|
149
148
|
sys_name_pars['zone_clg'] = 'none'
|
150
149
|
sys_name_pars['sys_rf'] = 'vv'
|
151
|
-
assign_base_sys_name(air_loop,
|
150
|
+
assign_base_sys_name(air_loop: air_loop,
|
152
151
|
sys_abbr: 'sys_6',
|
153
152
|
sys_oa: 'mixed',
|
154
153
|
sys_name_pars: sys_name_pars)
|
@@ -411,11 +410,14 @@ class NECB2011
|
|
411
410
|
epw = OpenStudio::EpwFile.new(model.weatherFile.get.path.get)
|
412
411
|
necb_reference_hp_supp_fuel = @standards_data['regional_fuel_use'].detect { |fuel_sources| fuel_sources['state_province_regions'].include?(epw.stateProvinceRegion) }['fueltype_set']
|
413
412
|
end
|
414
|
-
if necb_reference_hp_supp_fuel == 'NaturalGas'
|
413
|
+
if necb_reference_hp_supp_fuel == 'NaturalGas' || necb_reference_hp_supp_fuel == 'Gas'
|
415
414
|
rh_coil = OpenStudio::Model::CoilHeatingGas.new(model, always_on)
|
416
|
-
elsif necb_reference_hp_supp_fuel == 'Electricity'
|
415
|
+
elsif necb_reference_hp_supp_fuel == 'Electricity' || necb_reference_hp_supp_fuel == 'Electric' || necb_reference_hp_supp_fuel == 'FuelOilNo2'
|
417
416
|
rh_coil = OpenStudio::Model::CoilHeatingElectric.new(model, always_on)
|
418
|
-
|
417
|
+
elsif necb_reference_hp_supp_fuel == 'Hot Water' || necb_reference_hp_supp_fuel == 'HotWater'
|
418
|
+
rh_coil = OpenStudio::Model::CoilHeatingWater.new(model, always_on)
|
419
|
+
hw_loop.addDemandBranchForComponent(rh_coil)
|
420
|
+
else
|
419
421
|
raise('Invalid fuel type selected for heat pump supplemental coil')
|
420
422
|
end
|
421
423
|
cav_rh_terminal = OpenStudio::Model::AirTerminalSingleDuctConstantVolumeReheat.new(model, always_on, rh_coil)
|
@@ -429,7 +431,7 @@ class NECB2011
|
|
429
431
|
sys_name_pars['zone_htg'] = baseboard_type
|
430
432
|
sys_name_pars['zone_clg'] = 'none'
|
431
433
|
sys_name_pars['sys_rf'] = 'cv'
|
432
|
-
assign_base_sys_name(air_loop,
|
434
|
+
assign_base_sys_name(air_loop: air_loop,
|
433
435
|
sys_abbr: 'sys_6',
|
434
436
|
sys_oa: 'mixed',
|
435
437
|
sys_name_pars: sys_name_pars)
|
@@ -746,14 +746,24 @@ class NECB2011
|
|
746
746
|
|
747
747
|
# Set cooling tower properties now that the new COP of the chiller is set
|
748
748
|
if chiller_electric_eir.name.to_s.include? 'Primary Chiller'
|
749
|
+
# Get the cooling tower based on the condenser water loop rather than assume that there is only one cooling tower loop.
|
750
|
+
clg_towers = []
|
751
|
+
tower_cap = capacity_w * (1.0 + 1.0 / chiller_electric_eir.referenceCOP)
|
752
|
+
condenser_loop = chiller_electric_eir.condenserWaterLoop.get
|
753
|
+
condenser_loop.supplyComponents.each do |supply_comp|
|
754
|
+
if supply_comp.to_CoolingTowerSingleSpeed.is_initialized
|
755
|
+
clg_towers << supply_comp.to_CoolingTowerSingleSpeed.get
|
756
|
+
end
|
757
|
+
end
|
749
758
|
# Single speed tower model assumes 25% extra for compressor power
|
750
759
|
tower_cap = capacity_w * (1.0 + 1.0 / chiller_electric_eir.referenceCOP)
|
751
760
|
if (tower_cap / 1000.0) < 1750
|
752
|
-
|
761
|
+
clg_towers[0].setNumberofCells(1)
|
753
762
|
else
|
754
|
-
|
763
|
+
clg_towers[0].setNumberofCells((tower_cap / (1000 * 1750) + 0.5).round)
|
755
764
|
end
|
756
|
-
|
765
|
+
# Only apply cooling tower fan power if power is greater than 13kW. This is to avoid EnergyPlus issues with some small cooling towers.
|
766
|
+
clg_towers[0].setFanPoweratDesignAirFlowRate(0.015 * tower_cap) if (tower_cap * 0.015 > 13000.0)
|
757
767
|
end
|
758
768
|
|
759
769
|
# Append the name with size and kw/ton
|
@@ -2197,7 +2207,7 @@ class NECB2011
|
|
2197
2207
|
# "sys_oa": "mixed" or "doas"
|
2198
2208
|
# "sys_name_pars" is a hash for the remaining system name parts for heat recovery,
|
2199
2209
|
# heating, cooling, supply fan, zone heating, zone cooling, and return fan
|
2200
|
-
def assign_base_sys_name(
|
2210
|
+
def assign_base_sys_name(air_loop:, sys_abbr:, sys_oa:, sys_name_pars:)
|
2201
2211
|
sys_name = "#{sys_abbr}|#{sys_oa}|"
|
2202
2212
|
sys_name_pars.each do |key, value|
|
2203
2213
|
case key.downcase
|
@@ -2215,24 +2225,36 @@ class NECB2011
|
|
2215
2225
|
sys_name += 'sh>c-e'
|
2216
2226
|
when 'hot water'
|
2217
2227
|
sys_name += 'sh>c-hw'
|
2218
|
-
when 'gas'
|
2228
|
+
when 'gas', 'g'
|
2219
2229
|
sys_name += 'sh>c-g'
|
2220
|
-
when 'dx'
|
2230
|
+
when 'dx' , 'ashp'
|
2221
2231
|
sys_name += 'sh>ashp'
|
2232
|
+
when 'ashp>c-g'
|
2233
|
+
sys_name += 'sh>ashp>c-g'
|
2234
|
+
when 'ashp>c-e'
|
2235
|
+
sys_name += 'sh>ashp>c-e'
|
2236
|
+
when 'ashp>c-hw'
|
2237
|
+
sys_name += 'sh>ashp>c-hw'
|
2222
2238
|
when 'ccashp'
|
2223
2239
|
sys_name += 'sh>ccashp'
|
2224
|
-
when '
|
2225
|
-
sys_name += 'sh>
|
2240
|
+
when 'ccashp>c-g'
|
2241
|
+
sys_name += 'sh>ccashp>c-g'
|
2242
|
+
when 'ccashp>c-e'
|
2243
|
+
sys_name += 'sh>ccashp>c-e'
|
2244
|
+
when 'ccashp>c-hw'
|
2245
|
+
sys_name += 'sh>ccashp>c-hw'
|
2246
|
+
else
|
2247
|
+
sys_name += 'sh>none'
|
2226
2248
|
end
|
2227
2249
|
|
2228
2250
|
when 'sys_clg'
|
2229
2251
|
case value.downcase
|
2230
2252
|
when 'none'
|
2231
2253
|
sys_name += 'sc>none'
|
2232
|
-
when 'chilled water'
|
2254
|
+
when 'chilled water','hydronic'
|
2233
2255
|
sys_name += 'sc>c-chw'
|
2234
2256
|
when 'dx'
|
2235
|
-
if sys_name_pars['sys_htg'] == 'dx'
|
2257
|
+
if sys_name_pars['sys_htg'] == 'dx' || sys_name_pars['sys_htg'] == 'ashp>c-g' || sys_name_pars['sys_htg'] == 'ashp>c-e' || sys_name_pars['sys_htg'] == 'ashp>c-hw'
|
2236
2258
|
sys_name += 'sc>ashp'
|
2237
2259
|
else
|
2238
2260
|
sys_name += 'sc>dx'
|
@@ -2262,9 +2284,9 @@ class NECB2011
|
|
2262
2284
|
when 'hot water'
|
2263
2285
|
sys_name += 'zh>b-hw'
|
2264
2286
|
when 'tpfc'
|
2265
|
-
sys_name += 'zh>fpfc'
|
2266
|
-
when 'fpfc'
|
2267
2287
|
sys_name += 'zh>tpfc'
|
2288
|
+
when 'fpfc'
|
2289
|
+
sys_name += 'zh>fpfc'
|
2268
2290
|
when 'pthp'
|
2269
2291
|
sys_name += 'zh>pthp'
|
2270
2292
|
end
|
@@ -2296,7 +2318,10 @@ class NECB2011
|
|
2296
2318
|
sys_name += '|'
|
2297
2319
|
end
|
2298
2320
|
|
2299
|
-
|
2321
|
+
air_loop.setName(sys_name)
|
2322
|
+
return detect_air_system_type(air_loop: air_loop,
|
2323
|
+
old_system_name: sys_name,
|
2324
|
+
sys_abbr: sys_abbr)
|
2300
2325
|
end
|
2301
2326
|
|
2302
2327
|
# Method to update the base system name based on the inputs provided.
|
@@ -2387,6 +2412,10 @@ class NECB2011
|
|
2387
2412
|
end
|
2388
2413
|
end
|
2389
2414
|
|
2415
|
+
# If cooling supplied by something other than a DX coil do not follow NECB reference HP rule; proceed as usual
|
2416
|
+
if clg_coil.nil?
|
2417
|
+
return super(coil_heating_dx_single_speed)
|
2418
|
+
end
|
2390
2419
|
# Paired cooling coil parameters
|
2391
2420
|
clg_coil = clg_coil.to_CoilCoolingDXSingleSpeed.get
|
2392
2421
|
capacity_w = coil_cooling_dx_single_speed_find_capacity(clg_coil)
|