openstudio-standards 0.8.2 → 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.
Files changed (152) hide show
  1. checksums.yaml +4 -4
  2. data/data/standards/OpenStudio_Standards-ashrae_90_1-ALL-comstock(space_types).xlsx +0 -0
  3. data/data/standards/openstudio_standards_duplicates_log.csv +7962 -0
  4. data/lib/openstudio-standards/btap/costing/README.md +502 -0
  5. data/lib/openstudio-standards/btap/costing/btap_costing.rb +473 -0
  6. data/lib/openstudio-standards/btap/costing/btap_measure_helper.rb +359 -0
  7. data/lib/openstudio-standards/btap/costing/btap_workflow.rb +117 -0
  8. data/lib/openstudio-standards/btap/costing/common_paths.rb +78 -0
  9. data/lib/openstudio-standards/btap/costing/common_resources/ConstructionProperties.csv +52 -0
  10. data/lib/openstudio-standards/btap/costing/common_resources/Constructions.csv +37 -0
  11. data/lib/openstudio-standards/btap/costing/common_resources/construction_sets.csv +1270 -0
  12. data/lib/openstudio-standards/btap/costing/common_resources/constructions_glazing.csv +61 -0
  13. data/lib/openstudio-standards/btap/costing/common_resources/constructions_opaque.csv +2256 -0
  14. data/lib/openstudio-standards/btap/costing/common_resources/costs.csv +1904 -0
  15. data/lib/openstudio-standards/btap/costing/common_resources/costs_local_factors.csv +2315 -0
  16. data/lib/openstudio-standards/btap/costing/common_resources/hvac_vent_ahu.csv +925 -0
  17. data/lib/openstudio-standards/btap/costing/common_resources/lighting.csv +364 -0
  18. data/lib/openstudio-standards/btap/costing/common_resources/lighting_sets.csv +2667 -0
  19. data/lib/openstudio-standards/btap/costing/common_resources/locations.csv +75 -0
  20. data/lib/openstudio-standards/btap/costing/common_resources/materials_glazing.csv +35 -0
  21. data/lib/openstudio-standards/btap/costing/common_resources/materials_hvac.csv +1699 -0
  22. data/lib/openstudio-standards/btap/costing/common_resources/materials_lighting.csv +267 -0
  23. data/lib/openstudio-standards/btap/costing/common_resources/materials_opaque.csv +164 -0
  24. data/lib/openstudio-standards/btap/costing/copy_test_results_files_to_expected_results.rb +11 -0
  25. data/lib/openstudio-standards/btap/costing/cost_building_from_file.rb +136 -0
  26. data/lib/openstudio-standards/btap/costing/costing_database_wrapper.rb +177 -0
  27. data/lib/openstudio-standards/btap/costing/daylighting_sensor_control_costing.rb +353 -0
  28. data/lib/openstudio-standards/btap/costing/dcv_costing.rb +314 -0
  29. data/lib/openstudio-standards/btap/costing/dummy.epw +8768 -0
  30. data/lib/openstudio-standards/btap/costing/dummy.osm +5320 -0
  31. data/lib/openstudio-standards/btap/costing/envelope_costing.rb +284 -0
  32. data/lib/openstudio-standards/btap/costing/heating_cooling_costing.rb +2584 -0
  33. data/lib/openstudio-standards/btap/costing/led_lighting_costing.rb +155 -0
  34. data/lib/openstudio-standards/btap/costing/lighting_costing.rb +209 -0
  35. data/lib/openstudio-standards/btap/costing/mech_sizing.json +502 -0
  36. data/lib/openstudio-standards/btap/costing/neb_end_use_prices.csv +42 -0
  37. data/lib/openstudio-standards/btap/costing/necb_2011_spacetype_info.csv +225 -0
  38. data/lib/openstudio-standards/btap/costing/necb_reference_runs.csv +28705 -0
  39. data/lib/openstudio-standards/btap/costing/nv_costing.rb +547 -0
  40. data/lib/openstudio-standards/btap/costing/parallel_tests.rb +92 -0
  41. data/lib/openstudio-standards/btap/costing/pv_ground_costing.rb +687 -0
  42. data/lib/openstudio-standards/btap/costing/shw_costing.rb +705 -0
  43. data/lib/openstudio-standards/btap/costing/test_list.txt +17 -0
  44. data/lib/openstudio-standards/btap/costing/test_run_all_test_locally.rb +26 -0
  45. data/lib/openstudio-standards/btap/costing/test_run_costing_tests.rb +80 -0
  46. data/lib/openstudio-standards/btap/costing/ventilation_costing.rb +2616 -0
  47. data/lib/openstudio-standards/constructions/modify.rb +2 -1
  48. data/lib/openstudio-standards/refrigeration/create_case.rb +58 -21
  49. data/lib/openstudio-standards/refrigeration/create_typical_refrigeration.rb +4 -2
  50. data/lib/openstudio-standards/refrigeration/create_walkin.rb +57 -22
  51. data/lib/openstudio-standards/refrigeration/data/refrigerated_cases.csv +31 -31
  52. data/lib/openstudio-standards/refrigeration/data/refrigerated_walkins.csv +76 -76
  53. data/lib/openstudio-standards/service_water_heating/create_typical.rb +10 -10
  54. data/lib/openstudio-standards/service_water_heating/create_water_heater.rb +10 -0
  55. data/lib/openstudio-standards/service_water_heating/create_water_heating_loop.rb +16 -3
  56. data/lib/openstudio-standards/service_water_heating/data/convert_data.rb +9 -9
  57. data/lib/openstudio-standards/service_water_heating/data/typical_water_use_equipment.csv +49 -49
  58. data/lib/openstudio-standards/service_water_heating/data/typical_water_use_equipment.json +159 -159
  59. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXMultiSpeed.rb +7 -18
  60. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXSingleSpeed.rb +10 -20
  61. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXTwoSpeed.rb +6 -15
  62. data/lib/openstudio-standards/standards/Standards.CoilCoolingWaterToAirHeatPumpEquationFit.rb +5 -6
  63. data/lib/openstudio-standards/standards/Standards.CoilDX.rb +93 -43
  64. data/lib/openstudio-standards/standards/Standards.CoilHeatingDXMultiSpeed.rb +5 -5
  65. data/lib/openstudio-standards/standards/Standards.CoilHeatingDXSingleSpeed.rb +135 -37
  66. data/lib/openstudio-standards/standards/Standards.CoilHeatingWaterToAirHeatPumpEquationFit.rb +2 -2
  67. data/lib/openstudio-standards/standards/Standards.Model.rb +48 -13
  68. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.computer_room_acs.json +302 -140
  69. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.heat_pumps.json +648 -326
  70. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.heat_pumps_heating.json +371 -90
  71. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.water_heaters.json +66 -22
  72. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.computer_room_acs.json +302 -140
  73. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.heat_pumps.json +1012 -296
  74. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.heat_pumps_heating.json +443 -79
  75. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.water_heaters.json +66 -22
  76. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.computer_room_acs.json +302 -140
  77. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.heat_pumps.json +672 -306
  78. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.heat_pumps_heating.json +354 -74
  79. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.water_heaters.json +72 -24
  80. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.computer_room_acs.json +302 -140
  81. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.energy_recovery.json +8 -8
  82. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.heat_pumps.json +930 -604
  83. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.heat_pumps_heating.json +415 -111
  84. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.water_heaters.json +72 -24
  85. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.computer_room_acs.json +602 -140
  86. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.heat_pumps.json +1005 -333
  87. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.heat_pumps_heating.json +642 -88
  88. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.water_heaters.json +78 -26
  89. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.computer_room_acs.json +722 -140
  90. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.heat_pumps.json +1741 -426
  91. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.heat_pumps_heating.json +1108 -111
  92. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.water_heaters.json +186 -62
  93. data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.schedules.json +62 -232
  94. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilCoolingDXSingleSpeed.rb +2 -3
  95. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilCoolingDXTwoSpeed.rb +1 -1
  96. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilDX.rb +7 -18
  97. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilHeatingDXSingleSpeed.rb +9 -7
  98. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilHeatingGas.rb +1 -1
  99. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.Model.rb +2 -2
  100. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.heat_pumps.json +154 -69
  101. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.heat_pumps_heating.json +72 -72
  102. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.water_heaters.json +382 -295
  103. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/ashrae_90_1_prm.UserData.rb +6 -1
  104. data/lib/openstudio-standards/standards/deer/data/deer.schedules.json +62 -232
  105. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/btap_pre1980.rb +2 -27
  106. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/data/heat_pumps.json +16 -0
  107. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/data/heat_pumps_heating.json +6 -0
  108. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_3_and_8_single_speed.rb +68 -27
  109. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_4.rb +64 -25
  110. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_6.rb +9 -14
  111. data/lib/openstudio-standards/standards/necb/ECMS/hvac_systems.rb +46 -20
  112. data/lib/openstudio-standards/standards/necb/NECB2011/autozone.rb +635 -248
  113. data/lib/openstudio-standards/standards/necb/NECB2011/data/constants.json +43 -7
  114. data/lib/openstudio-standards/standards/necb/NECB2011/data/fuel_type_sets.json +7 -1
  115. data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/HighriseApartmentMult.osm +14272 -0
  116. data/lib/openstudio-standards/standards/necb/NECB2011/data/heat_pumps.json +16 -0
  117. data/lib/openstudio-standards/standards/necb/NECB2011/data/heat_pumps_heating.json +6 -0
  118. data/lib/openstudio-standards/standards/necb/NECB2011/data/necb_2015_table_c1.json +1 -1
  119. data/lib/openstudio-standards/standards/necb/NECB2011/data/space_types.json +437 -437
  120. data/lib/openstudio-standards/standards/necb/NECB2011/data/systems.json +516 -0
  121. data/lib/openstudio-standards/standards/necb/NECB2011/data/systems_including_sys5.json +588 -0
  122. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_namer.rb +489 -0
  123. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_1_single_speed.rb +16 -6
  124. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_2_and_5.rb +48 -5
  125. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_3_and_8_multi_speed.rb +2 -2
  126. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_3_and_8_single_speed.rb +35 -27
  127. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_4.rb +34 -23
  128. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_6.rb +8 -6
  129. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_systems.rb +43 -14
  130. data/lib/openstudio-standards/standards/necb/NECB2011/necb_2011.rb +214 -25
  131. data/lib/openstudio-standards/standards/necb/NECB2011/system_fuels.rb +61 -1
  132. data/lib/openstudio-standards/standards/necb/NECB2015/data/heat_pumps.json +16 -0
  133. data/lib/openstudio-standards/standards/necb/NECB2015/data/heat_pumps_heating.json +8 -0
  134. data/lib/openstudio-standards/standards/necb/NECB2015/data/space_types.json +636 -636
  135. data/lib/openstudio-standards/standards/necb/NECB2015/data/unitary_acs.json +38 -38
  136. data/lib/openstudio-standards/standards/necb/NECB2015/hvac_systems.rb +15 -6
  137. data/lib/openstudio-standards/standards/necb/NECB2017/data/space_types.json +636 -636
  138. data/lib/openstudio-standards/standards/necb/NECB2020/data/chillers.json +71 -71
  139. data/lib/openstudio-standards/standards/necb/NECB2020/data/heat_pumps.json +20 -0
  140. data/lib/openstudio-standards/standards/necb/NECB2020/data/heat_pumps_heating.json +10 -0
  141. data/lib/openstudio-standards/standards/necb/README.md +343 -0
  142. data/lib/openstudio-standards/standards/necb/common/btap_data.rb +190 -28
  143. data/lib/openstudio-standards/standards/necb/common/btap_datapoint.rb +14 -5
  144. data/lib/openstudio-standards/standards/necb/common/eccc_electric_grid_intensity_20250311.csv +14 -0
  145. data/lib/openstudio-standards/standards/necb/common/nir_gas_grid_intensity_20250311.csv +14 -0
  146. data/lib/openstudio-standards/standards/necb/common/system_types.yaml +0 -0
  147. data/lib/openstudio-standards/utilities/logging.rb +18 -14
  148. data/lib/openstudio-standards/utilities/simulation.rb +3 -2
  149. data/lib/openstudio-standards/version.rb +1 -1
  150. data/lib/openstudio-standards/weather/modify.rb +2 -2
  151. data/lib/openstudio-standards.rb +12 -0
  152. metadata +56 -3
@@ -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
- fan = OpenStudio::Model::FanOnOff.new(model, always_on)
166
- else
167
- fan = OpenStudio::Model::FanConstantVolume.new(model, always_on)
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' or necb_reference_hp_supp_fuel == 'FuelOilNo2'
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
- else #hot water coils is an option in the future
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
- else
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
- # control_zone = determine_control_zone(zones)
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
- fan = OpenStudio::Model::FanOnOff.new(model, always_on)
89
- else
90
- fan = OpenStudio::Model::FanConstantVolume.new(model, always_on)
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
- else #hot water coils is an option in the future
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' or necb_reference_hp_supp_fuel == 'FuelOilNo2'
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
- else #hot water coils is an option in the future
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
- clg_tower_objs[0].setNumberofCells(1)
761
+ clg_towers[0].setNumberofCells(1)
753
762
  else
754
- clg_tower_objs[0].setNumberofCells((tower_cap / (1000 * 1750) + 0.5).round)
763
+ clg_towers[0].setNumberofCells((tower_cap / (1000 * 1750) + 0.5).round)
755
764
  end
756
- clg_tower_objs[0].setFanPoweratDesignAirFlowRate(0.015 * tower_cap)
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
@@ -877,7 +887,7 @@ class NECB2011
877
887
 
878
888
  # Check to make sure properties were found
879
889
  if coil_props.nil?
880
- OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilHeatingGas', "For #{coil_heating_gas.name}, cannot find efficiency info using #{search_criteria}, cannot apply efficiency standard.")
890
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilHeatingGas', "For #{coil_heating_gas.name}, cannot find efficiency info using #{search_criteria} and capacity #{capacity_btu_per_hr} btu/hr, cannot apply efficiency standard.")
881
891
  successfully_set_all_properties = false
882
892
  end
883
893
 
@@ -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(airloop, sys_abbr:, sys_oa:, sys_name_pars:)
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 'ashp'
2225
- sys_name += 'sh>ashp'
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
- airloop.setName(sys_name)
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)