openstudio-standards 0.8.4 → 0.8.5.rc1

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 (289) hide show
  1. checksums.yaml +4 -4
  2. data/data/geometry/ASHRAECollege.osm +30 -30
  3. data/data/geometry/ASHRAECourthouse.osm +22 -22
  4. data/data/geometry/ASHRAESmallOfficeDetailed.osm +2 -2
  5. data/data/geometry/DEER_Asm.osm +1 -1
  6. data/data/geometry/DEER_ECC.osm +1 -1
  7. data/data/geometry/DEER_EPr.osm +1 -1
  8. data/data/geometry/DEER_ERC.osm +1 -1
  9. data/data/geometry/DEER_ESe.osm +1 -1
  10. data/data/geometry/DEER_EUn.osm +1 -1
  11. data/data/geometry/DEER_Hsp.osm +1 -1
  12. data/data/geometry/DEER_Htl.osm +1 -1
  13. data/data/geometry/DEER_MBT.osm +1 -1
  14. data/data/geometry/DEER_MFm.osm +1 -1
  15. data/data/geometry/DEER_Nrs.osm +1 -1
  16. data/data/geometry/DEER_OfL.osm +1 -1
  17. data/data/geometry/DEER_OfS.osm +1 -1
  18. data/data/geometry/DEER_RFF.osm +1 -1
  19. data/data/geometry/DEER_RSD.osm +1 -1
  20. data/data/geometry/DEER_Rt3.osm +1 -1
  21. data/data/geometry/DEER_RtS.osm +1 -1
  22. data/data/standards/export_OpenStudio_libraries.rb +2 -3
  23. data/data/standards/test_performance_expected_dd_results.csv +42 -42
  24. data/lib/openstudio-standards/btap/NECB_building_types.csv +35 -0
  25. data/lib/openstudio-standards/btap/NECB_space_types.csv +109 -0
  26. data/lib/openstudio-standards/btap/activity.rb +480 -0
  27. data/lib/openstudio-standards/btap/attributes.rb +166 -0
  28. data/lib/openstudio-standards/btap/bridging.rb +561 -1402
  29. data/lib/openstudio-standards/btap/btap.rb +4 -2
  30. data/lib/openstudio-standards/btap/btap_test_helper.rb +86 -0
  31. data/lib/openstudio-standards/btap/carbon/btap_carbon.rb +177 -0
  32. data/lib/openstudio-standards/btap/{costing/common_paths.rb → common_paths.rb} +14 -11
  33. data/lib/openstudio-standards/btap/common_resources/carbon_frame.csv +35 -0
  34. data/lib/openstudio-standards/btap/common_resources/carbon_glazing.csv +35 -0
  35. data/lib/openstudio-standards/btap/common_resources/carbon_opaque.csv +164 -0
  36. data/lib/openstudio-standards/btap/common_resources/constructions_glazing.csv +121 -0
  37. data/lib/openstudio-standards/btap/common_resources/costs.csv +1897 -0
  38. data/lib/openstudio-standards/btap/{costing/common_resources → common_resources}/lighting.csv +59 -59
  39. data/lib/openstudio-standards/btap/{costing/common_resources → common_resources}/materials_hvac.csv +1019 -1032
  40. data/lib/openstudio-standards/btap/costing/btap_costing.rb +3 -7
  41. data/lib/openstudio-standards/btap/costing/costing_database_wrapper.rb +1 -5
  42. data/lib/openstudio-standards/btap/costing/daylighting_sensor_control_costing.rb +5 -4
  43. data/lib/openstudio-standards/btap/costing/dcv_costing.rb +1 -1
  44. data/lib/openstudio-standards/btap/costing/envelope_costing.rb +112 -181
  45. data/lib/openstudio-standards/btap/costing/heating_cooling_costing.rb +4 -4
  46. data/lib/openstudio-standards/btap/costing/led_lighting_costing.rb +2 -1
  47. data/lib/openstudio-standards/btap/costing/lighting_costing.rb +3 -3
  48. data/lib/openstudio-standards/btap/costing/test_list.txt +15 -17
  49. data/lib/openstudio-standards/btap/costing/test_run_all_test_locally.rb +10 -9
  50. data/lib/openstudio-standards/btap/geometry.rb +86 -6
  51. data/lib/openstudio-standards/btap/structure.rb +657 -0
  52. data/lib/openstudio-standards/create_typical/create_typical.rb +17 -33
  53. data/lib/openstudio-standards/create_typical/space_type_ratios.rb +36 -36
  54. data/lib/openstudio-standards/equipment/create_transformer.rb +104 -0
  55. data/lib/openstudio-standards/equipment/create_typical_equipment.rb +117 -0
  56. data/lib/openstudio-standards/equipment/data/electric_equipment_space_types.json +1514 -0
  57. data/lib/openstudio-standards/equipment/data/gas_equipment_space_types.json +227 -0
  58. data/lib/openstudio-standards/exterior_lighting/create.rb +22 -22
  59. data/lib/openstudio-standards/exterior_lighting/information.rb +3 -2
  60. data/lib/openstudio-standards/hvac/components/air_conditioner_vrf.rb +482 -0
  61. data/lib/openstudio-standards/hvac/components/air_terminal.rb +31 -0
  62. data/lib/openstudio-standards/hvac/components/boiler_hot_water.rb +163 -0
  63. data/lib/openstudio-standards/hvac/components/central_air_source_heat_pump.rb +220 -0
  64. data/lib/openstudio-standards/hvac/components/chiller.rb +25 -0
  65. data/lib/openstudio-standards/hvac/components/coil.rb +276 -0
  66. data/lib/openstudio-standards/hvac/components/coil_cooling_dx_multi_speed.rb +40 -0
  67. data/lib/openstudio-standards/hvac/components/coil_cooling_dx_single_speed.rb +300 -0
  68. data/lib/openstudio-standards/hvac/components/coil_cooling_dx_two_speed.rb +187 -0
  69. data/lib/openstudio-standards/hvac/components/coil_cooling_water.rb +80 -0
  70. data/lib/openstudio-standards/hvac/components/coil_cooling_water_to_air_heat_pump_equation_fit.rb +182 -0
  71. data/lib/openstudio-standards/hvac/components/coil_heating_dx_single_speed.rb +220 -0
  72. data/lib/openstudio-standards/hvac/components/coil_heating_electric.rb +56 -0
  73. data/lib/openstudio-standards/hvac/components/coil_heating_gas.rb +90 -0
  74. data/lib/openstudio-standards/hvac/components/coil_heating_gas_multi_stage.rb +33 -0
  75. data/lib/openstudio-standards/hvac/components/coil_heating_water.rb +98 -0
  76. data/lib/openstudio-standards/hvac/components/coil_heating_water_to_air_heat_pump_equation_fit.rb +147 -0
  77. data/lib/openstudio-standards/hvac/components/component.rb +39 -0
  78. data/lib/openstudio-standards/{standards/ashrae_90_1/data/ashrae_90_1.fans.json → hvac/components/data/fans.json} +6 -6
  79. data/lib/openstudio-standards/hvac/components/fan.rb +363 -0
  80. data/lib/openstudio-standards/hvac/components/heat_exchanger_air_to_air.rb +203 -0
  81. data/lib/openstudio-standards/hvac/components/pump.rb +181 -0
  82. data/lib/openstudio-standards/hvac/controls/radiant_system_controls.rb +594 -0
  83. data/lib/openstudio-standards/hvac/conversions.rb +222 -0
  84. data/lib/openstudio-standards/hvac/curves.rb +192 -0
  85. data/lib/openstudio-standards/hvac/helpers.rb +357 -0
  86. data/lib/openstudio-standards/hvac/setpoint_managers/information.rb +4 -4
  87. data/lib/openstudio-standards/interior_lighting/create_lights.rb +52 -0
  88. data/lib/openstudio-standards/interior_lighting/create_typical_interior_lighting.rb +254 -0
  89. data/lib/openstudio-standards/interior_lighting/data/convert_lighting_data.rb +249 -0
  90. data/lib/openstudio-standards/interior_lighting/data/lighting_space_types.csv +96 -0
  91. data/lib/openstudio-standards/interior_lighting/data/lighting_space_types.json +1429 -0
  92. data/lib/openstudio-standards/interior_lighting/data/lighting_technology.csv +46 -0
  93. data/lib/openstudio-standards/interior_lighting/data/lighting_technology.json +859 -0
  94. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.AirTerminalSingleDuctVAVReheat.rb +1 -1
  95. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirTerminalSingleDuctVAVReheat.rb +1 -1
  96. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.AirTerminalSingleDuctVAVReheat.rb +1 -1
  97. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.Model.rb +4 -4
  98. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirTerminalSingleDuctVAVReheat.rb +1 -1
  99. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Model.rb +4 -4
  100. data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.AirTerminalSingleDuctVAVReheat.rb +1 -1
  101. data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirTerminalSingleDuctVAVReheat.rb +1 -1
  102. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.HighRiseApartment.rb +6 -7
  103. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Hospital.rb +15 -15
  104. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeHotel.rb +4 -4
  105. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeOffice.rb +5 -5
  106. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.MediumOffice.rb +6 -6
  107. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Outpatient.rb +7 -7
  108. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.PrimarySchool.rb +4 -4
  109. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SecondarySchool.rb +6 -6
  110. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallOfficeDetailed.rb +5 -1
  111. data/lib/openstudio-standards/prototypes/common/data/prototype_space_type_map.json +2594 -0
  112. data/lib/openstudio-standards/prototypes/common/data/thermostat_schedule_lookup.json +2108 -0
  113. data/lib/openstudio-standards/prototypes/common/objects/Prototype.AirTerminalSingleDuctVAVReheat.rb +33 -0
  114. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Fan.rb +0 -140
  115. data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanConstantVolume.rb +1 -73
  116. data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanOnOff.rb +1 -69
  117. data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanVariableVolume.rb +0 -116
  118. data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanZoneExhaust.rb +0 -61
  119. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.hvac.rb +2 -2
  120. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.rb +128 -13
  121. data/lib/openstudio-standards/prototypes/common/objects/Prototype.hvac_systems.rb +606 -607
  122. data/lib/openstudio-standards/prototypes/common/prototype_space_type_map.rb +41 -0
  123. data/lib/openstudio-standards/prototypes/common/space_type_equipment_map.rb +184 -0
  124. data/lib/openstudio-standards/prototypes/common/space_type_thermostat_schedule_map.rb +116 -0
  125. data/lib/openstudio-standards/qaqc/hvac.rb +12 -12
  126. data/lib/openstudio-standards/refrigeration/create_compressor.rb +2 -5
  127. data/lib/openstudio-standards/refrigeration/data/refrigeration_compressors.csv +4 -4
  128. data/lib/openstudio-standards/service_water_heating/create_water_heater.rb +1 -2
  129. data/lib/openstudio-standards/service_water_heating/create_water_use.rb +5 -5
  130. data/lib/openstudio-standards/space_type/data/level_1_space_types.json +612 -0
  131. data/lib/openstudio-standards/space_type/standards_space_type.rb +53 -0
  132. data/lib/openstudio-standards/standards/Standards.AirConditionerVariableRefrigerantFlow.rb +8 -26
  133. data/lib/openstudio-standards/standards/Standards.AirLoopHVAC.rb +13 -13
  134. data/lib/openstudio-standards/standards/Standards.AirTerminalSingleDuctVAVReheat.rb +0 -24
  135. data/lib/openstudio-standards/standards/Standards.BoilerHotWater.rb +6 -43
  136. data/lib/openstudio-standards/standards/Standards.ChillerElectricEIR.rb +7 -24
  137. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXMultiSpeed.rb +19 -44
  138. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXSingleSpeed.rb +25 -50
  139. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXTwoSpeed.rb +25 -33
  140. data/lib/openstudio-standards/standards/Standards.CoilCoolingWaterToAirHeatPumpEquationFit.rb +9 -22
  141. data/lib/openstudio-standards/standards/Standards.CoilDX.rb +15 -157
  142. data/lib/openstudio-standards/standards/Standards.CoilHeatingDXMultiSpeed.rb +2 -2
  143. data/lib/openstudio-standards/standards/Standards.CoilHeatingDXSingleSpeed.rb +18 -105
  144. data/lib/openstudio-standards/standards/Standards.CoilHeatingGas.rb +3 -23
  145. data/lib/openstudio-standards/standards/Standards.CoilHeatingGasMultiStage.rb +0 -24
  146. data/lib/openstudio-standards/standards/Standards.CoilHeatingWaterToAirHeatPumpEquationFit.rb +2 -86
  147. data/lib/openstudio-standards/standards/Standards.FanVariableVolume.rb +0 -107
  148. data/lib/openstudio-standards/standards/Standards.Model.rb +6 -11
  149. data/lib/openstudio-standards/standards/Standards.People.rb +113 -0
  150. data/lib/openstudio-standards/standards/Standards.PlantLoop.rb +11 -11
  151. data/lib/openstudio-standards/standards/Standards.Pump.rb +2 -147
  152. data/lib/openstudio-standards/standards/Standards.PumpVariableSpeed.rb +57 -41
  153. data/lib/openstudio-standards/standards/Standards.SpaceType.rb +30 -153
  154. data/lib/openstudio-standards/standards/Standards.Ventilation.rb +74 -0
  155. data/lib/openstudio-standards/standards/Standards.ZoneHVACComponent.rb +1 -1
  156. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.PlantLoop.rb +4 -4
  157. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.heat_pumps_heating.json +3 -3
  158. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.spc_typ.json +37 -112
  159. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/comstock_ashrae_90_1_2007/data/comstock_ashrae_90_1_2007.spc_typ.json +37 -102
  160. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.heat_pumps_heating.json +3 -3
  161. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.spc_typ.json +37 -112
  162. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.AirTerminalSingleDuctVAVReheat.rb +1 -1
  163. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/comstock_ashrae_90_1_2010/data/comstock_ashrae_90_1_2010.spc_typ.json +37 -37
  164. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.heat_pumps_heating.json +6 -6
  165. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.spc_typ.json +37 -37
  166. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirTerminalSingleDuctVAVReheat.rb +1 -1
  167. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.BoilerHotWater.rb +1 -1
  168. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/comstock_ashrae_90_1_2013/data/comstock_ashrae_90_1_2013.spc_typ.json +37 -102
  169. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.heat_pumps_heating.json +6 -6
  170. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.spc_typ.json +37 -37
  171. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.AirTerminalSingleDuctVAVReheat.rb +1 -1
  172. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.BoilerHotWater.rb +1 -1
  173. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/comstock_ashrae_90_1_2016/data/comstock_ashrae_90_1_2016.spc_typ.json +45 -109
  174. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.heat_pumps_heating.json +6 -6
  175. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.spc_typ.json +37 -37
  176. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirLoopHVAC.rb +1 -1
  177. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirTerminalSingleDuctVAVReheat.rb +1 -1
  178. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.BoilerHotWater.rb +1 -1
  179. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.CoilHeatingGas.rb +1 -1
  180. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/comstock_ashrae_90_1_2019/data/comstock_ashrae_90_1_2019.spc_typ.json +45 -109
  181. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.heat_pumps_heating.json +6 -6
  182. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.spc_typ.json +37 -37
  183. data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.curves.json +0 -200
  184. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/comstock_doe_ref_1980_2004/data/comstock_doe_ref_1980_2004.spc_typ.json +37 -37
  185. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.spc_typ.json +37 -37
  186. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/comstock_doe_ref_pre_1980/data/comstock_doe_ref_pre_1980.spc_typ.json +37 -37
  187. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.spc_typ.json +37 -37
  188. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.AirTerminalSingleDuctVAVReheat.rb +1 -1
  189. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.PlantLoop.rb +5 -5
  190. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirTerminalSingleDuctVAVReheat.rb +1 -1
  191. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.PlantLoop.rb +5 -5
  192. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.AirLoopHVAC.rb +1 -1
  193. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.ChillerElectricEIR.rb +2 -2
  194. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilCoolingDXSingleSpeed.rb +2 -68
  195. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilCoolingDXTwoSpeed.rb +2 -35
  196. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilDX.rb +42 -0
  197. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilHeatingDXSingleSpeed.rb +5 -2
  198. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilHeatingGas.rb +2 -2
  199. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.PlantLoop.rb +3 -3
  200. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.SpaceType.rb +1 -1
  201. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/ashrae_90_1_prm_2019.Model.rb +1 -0
  202. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/ashrae_90_1_prm_2019_WaterHeaterMixed.rb +2 -4
  203. data/lib/openstudio-standards/standards/ashrae_90_1_prm/data/ashrae_90_1_prm.curves.json +0 -200
  204. data/lib/openstudio-standards/standards/ashrae_90_1_prm/data/ashrae_90_1_prm.fans.json +5 -5
  205. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/ashrae_90_1_prm.UserData.rb +1 -0
  206. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_enums.rb +0 -1
  207. data/lib/openstudio-standards/standards/cbes/data/cbes.curves.json +0 -200
  208. data/lib/openstudio-standards/standards/deer/data/deer.curves.json +0 -200
  209. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/btap_pre1980.rb +19 -10
  210. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/building_envelope.rb +12 -11
  211. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_systems.rb +4 -4
  212. data/lib/openstudio-standards/standards/necb/ECMS/ecms.rb +1 -1
  213. data/lib/openstudio-standards/standards/necb/ECMS/hvac_systems.rb +69 -92
  214. data/lib/openstudio-standards/standards/necb/NECB2011/autozone.rb +2 -1
  215. data/lib/openstudio-standards/standards/necb/NECB2011/beps_compliance_path.rb +16 -12
  216. data/lib/openstudio-standards/standards/necb/NECB2011/building_envelope.rb +799 -46
  217. data/lib/openstudio-standards/standards/necb/NECB2011/data/chillers.json +33 -51
  218. data/lib/openstudio-standards/standards/necb/NECB2011/data/constants.json +32 -0
  219. data/lib/openstudio-standards/standards/necb/NECB2011/data/fuel_type_sets.json +18 -0
  220. data/lib/openstudio-standards/standards/necb/NECB2011/data/heat_pumps_heating.json +21 -15
  221. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_namer.rb +5 -5
  222. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_1_single_speed.rb +2 -0
  223. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_systems.rb +30 -141
  224. data/lib/openstudio-standards/standards/necb/NECB2011/necb_2011.rb +233 -112
  225. data/lib/openstudio-standards/standards/necb/NECB2015/data/heat_pumps_heating.json +10 -2
  226. data/lib/openstudio-standards/standards/necb/NECB2015/hvac_systems.rb +2 -2
  227. data/lib/openstudio-standards/standards/necb/NECB2020/data/heat_pumps_heating.json +16 -6
  228. data/lib/openstudio-standards/standards/necb/NECB2020/data/unitary_acs.json +60 -61
  229. data/lib/openstudio-standards/standards/necb/NECB2020/service_water_heating.rb +30 -30
  230. data/lib/openstudio-standards/standards/necb/common/btap_analysis.rb +79 -0
  231. data/lib/openstudio-standards/standards/necb/common/btap_data.rb +16 -4
  232. data/lib/openstudio-standards/standards/necb/common/btap_datapoint.rb +65 -42
  233. data/lib/openstudio-standards/thermal_zone/{thermal_zone.rb → information.rb} +12 -45
  234. data/lib/openstudio-standards/thermal_zone/thermostat_schedules.rb +152 -0
  235. data/lib/openstudio-standards/version.rb +1 -1
  236. data/lib/openstudio-standards/weather/stat_file.rb +2 -2
  237. data/lib/openstudio-standards.rb +55 -38
  238. metadata +106 -66
  239. data/lib/openstudio-standards/btap/costing/common_resources/constructions_glazing.csv +0 -61
  240. data/lib/openstudio-standards/btap/costing/common_resources/costs.csv +0 -1904
  241. data/lib/openstudio-standards/hvac/components/create.rb +0 -169
  242. data/lib/openstudio-standards/hvac/components/modify.rb +0 -42
  243. data/lib/openstudio-standards/prototypes/common/objects/Prototype.AirConditionerVariableRefrigerantFlow.rb +0 -438
  244. data/lib/openstudio-standards/prototypes/common/objects/Prototype.BoilerHotWater.rb +0 -123
  245. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CentralAirSourceHeatPump.rb +0 -216
  246. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingDXSingleSpeed.rb +0 -273
  247. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingDXTwoSpeed.rb +0 -159
  248. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingWater.rb +0 -77
  249. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingWaterToAirHeatPumpEquationFit.rb +0 -154
  250. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingDXSingleSpeed.rb +0 -214
  251. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingElectric.rb +0 -53
  252. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingGas.rb +0 -72
  253. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingWater.rb +0 -95
  254. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingWaterToAirHeatPumpEquationFit.rb +0 -125
  255. data/lib/openstudio-standards/prototypes/common/objects/Prototype.ControllerWaterCoil.rb +0 -17
  256. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.transformers.rb +0 -90
  257. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Pump.rb +0 -4
  258. data/lib/openstudio-standards/prototypes/common/objects/Prototype.PumpVariableSpeed.rb +0 -70
  259. data/lib/openstudio-standards/prototypes/common/objects/Prototype.radiant_system_controls.rb +0 -590
  260. data/lib/openstudio-standards/prototypes/common/objects/Prototype.utilities.rb +0 -901
  261. data/lib/openstudio-standards/standards/Standards.FanConstantVolume.rb +0 -5
  262. data/lib/openstudio-standards/standards/Standards.FanOnOff.rb +0 -5
  263. data/lib/openstudio-standards/standards/Standards.FanZoneExhaust.rb +0 -5
  264. data/lib/openstudio-standards/standards/Standards.HeaderedPumpsConstantSpeed.rb +0 -5
  265. data/lib/openstudio-standards/standards/Standards.HeaderedPumpsVariableSpeed.rb +0 -55
  266. data/lib/openstudio-standards/standards/Standards.PumpConstantSpeed.rb +0 -5
  267. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.FanConstantVolume.rb +0 -5
  268. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.FanOnOff.rb +0 -5
  269. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.FanZoneExhaust.rb +0 -5
  270. data/lib/openstudio-standards/standards/cbes/data/cbes.fans.json +0 -328
  271. data/lib/openstudio-standards/standards/deer/data/deer.fans.json +0 -328
  272. /data/lib/openstudio-standards/btap/{costing/common_resources → common_resources}/ConstructionProperties.csv +0 -0
  273. /data/lib/openstudio-standards/btap/{costing/common_resources → common_resources}/Constructions.csv +0 -0
  274. /data/lib/openstudio-standards/btap/{costing/common_resources → common_resources}/construction_sets.csv +0 -0
  275. /data/lib/openstudio-standards/btap/{costing/common_resources → common_resources}/constructions_opaque.csv +0 -0
  276. /data/lib/openstudio-standards/btap/{costing/common_resources → common_resources}/costs_local_factors.csv +0 -0
  277. /data/lib/openstudio-standards/btap/{costing/common_resources → common_resources}/hvac_vent_ahu.csv +0 -0
  278. /data/lib/openstudio-standards/btap/{costing/common_resources → common_resources}/lighting_sets.csv +0 -0
  279. /data/lib/openstudio-standards/btap/{costing/common_resources → common_resources}/locations.csv +0 -0
  280. /data/lib/openstudio-standards/btap/{costing/common_resources → common_resources}/materials_glazing.csv +0 -0
  281. /data/lib/openstudio-standards/btap/{costing/common_resources → common_resources}/materials_lighting.csv +0 -0
  282. /data/lib/openstudio-standards/btap/{costing/common_resources → common_resources}/materials_opaque.csv +0 -0
  283. /data/lib/openstudio-standards/{prototypes → standards}/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.PumpVariableSpeed.rb +0 -0
  284. /data/lib/openstudio-standards/{prototypes → standards}/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.PumpVariableSpeed.rb +0 -0
  285. /data/lib/openstudio-standards/{prototypes → standards}/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.PumpVariableSpeed.rb +0 -0
  286. /data/lib/openstudio-standards/{prototypes → standards}/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.PumpVariableSpeed.rb +0 -0
  287. /data/lib/openstudio-standards/{prototypes → standards}/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.PumpVariableSpeed.rb +0 -0
  288. /data/lib/openstudio-standards/{prototypes → standards}/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Pump.rb +0 -0
  289. /data/lib/openstudio-standards/{prototypes → standards}/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.PumpVariableSpeed.rb +0 -0
@@ -147,7 +147,7 @@ class Standard
147
147
  ambient_loop.addDemandBranchForComponent(water_to_water_hp)
148
148
  # Central Air Source Heat Pump
149
149
  when 'AirSourceHeatPump', 'ASHP'
150
- create_central_air_source_heat_pump(model, hot_water_loop)
150
+ OpenstudioStandards::HVAC.create_central_air_source_heat_pump(model, hot_water_loop)
151
151
  # Boiler
152
152
  when 'Electricity', 'Gas', 'NaturalGas', 'Propane', 'PropaneGas', 'FuelOilNo1', 'FuelOilNo2'
153
153
  if boiler_lvg_temp_dsgn.nil?
@@ -162,16 +162,16 @@ class Standard
162
162
  out_temp_lmt_f = boiler_out_temp_lmt
163
163
  end
164
164
 
165
- boiler = create_boiler_hot_water(model,
166
- hot_water_loop: hot_water_loop,
167
- fuel_type: boiler_fuel_type,
168
- draft_type: boiler_draft_type,
169
- nominal_thermal_efficiency: 0.78,
170
- eff_curve_temp_eval_var: boiler_eff_curve_temp_eval_var,
171
- lvg_temp_dsgn_f: lvg_temp_dsgn_f,
172
- out_temp_lmt_f: out_temp_lmt_f,
173
- max_plr: boiler_max_plr,
174
- sizing_factor: boiler_sizing_factor)
165
+ boiler = OpenstudioStandards::HVAC.create_boiler_hot_water(model,
166
+ hot_water_loop: hot_water_loop,
167
+ fuel_type: boiler_fuel_type,
168
+ draft_type: boiler_draft_type,
169
+ nominal_thermal_efficiency: 0.78,
170
+ eff_curve_temp_eval_var: boiler_eff_curve_temp_eval_var,
171
+ lvg_temp_dsgn_f: lvg_temp_dsgn_f,
172
+ out_temp_lmt_f: out_temp_lmt_f,
173
+ max_plr: boiler_max_plr,
174
+ sizing_factor: boiler_sizing_factor)
175
175
 
176
176
  # @todo Yixing. Adding temperature setpoint controller at boiler outlet causes simulation errors
177
177
  # boiler_stpt_manager = OpenStudio::Model::SetpointManagerScheduled.new(self, hw_temp_sch)
@@ -319,7 +319,7 @@ class Standard
319
319
  # Add Constant pump, in plant loop, the number of chiller adjustment will assign pump to each chiller
320
320
  # pri_chw_pump = OpenStudio::Model::PumpConstantSpeed.new(model)
321
321
  pri_chw_pump = OpenStudio::Model::PumpVariableSpeed.new(model)
322
- pump_variable_speed_set_control_type(pri_chw_pump, control_type = 'Riding Curve')
322
+ OpenstudioStandards::HVAC.pump_variable_speed_set_control_type(pri_chw_pump, control_type: 'Riding Curve')
323
323
  # This pump name is important for function add_ems_for_multiple_chiller_pumps_w_secondary_plant. If you update
324
324
  # it here, you must update the logic there to account for this
325
325
  pri_chw_pump.setName("#{chilled_water_loop.name} Primary Pump")
@@ -386,11 +386,11 @@ class Standard
386
386
  # 0.66 kw/ton for a 150 ton Water Cooled positive displacement chiller
387
387
  case chiller_cooling_type
388
388
  when 'AirCooled'
389
- default_cop = kw_per_ton_to_cop(1.188)
389
+ default_cop = OpenstudioStandards::HVAC.kw_per_ton_to_cop(1.188)
390
390
  when 'WaterCooled'
391
- default_cop = kw_per_ton_to_cop(0.66)
391
+ default_cop = OpenstudioStandards::HVAC.kw_per_ton_to_cop(0.66)
392
392
  else
393
- default_cop = kw_per_ton_to_cop(0.66)
393
+ default_cop = OpenstudioStandards::HVAC.kw_per_ton_to_cop(0.66)
394
394
  end
395
395
 
396
396
  # make the correct type of chiller based these properties
@@ -920,18 +920,18 @@ class Standard
920
920
  heat_pump_water_loop.addSupplyBranchForComponent(heating_equipment)
921
921
  heating_equipment_stpt_manager.setName("#{heat_pump_water_loop.name} District Heating Scheduled Dual Setpoint")
922
922
  when 'AirSourceHeatPump', 'ASHP'
923
- heating_equipment = create_central_air_source_heat_pump(model, heat_pump_water_loop)
923
+ heating_equipment = OpenstudioStandards::HVAC.create_central_air_source_heat_pump(model, heat_pump_water_loop)
924
924
  heating_equipment_stpt_manager.setName("#{heat_pump_water_loop.name} ASHP Scheduled Dual Setpoint")
925
925
  when 'Electricity', 'Gas', 'NaturalGas', 'Propane', 'PropaneGas', 'FuelOilNo1', 'FuelOilNo2'
926
- heating_equipment = create_boiler_hot_water(model,
927
- hot_water_loop: heat_pump_water_loop,
928
- name: "#{heat_pump_water_loop.name} Supplemental Boiler",
929
- fuel_type: heating_fuel,
930
- flow_mode: 'ConstantFlow',
931
- lvg_temp_dsgn_f: 86.0, # 30.0 degrees Celsius
932
- min_plr: 0.0,
933
- max_plr: 1.2,
934
- opt_plr: 1.0)
926
+ heating_equipment = OpenstudioStandards::HVAC.create_boiler_hot_water(model,
927
+ hot_water_loop: heat_pump_water_loop,
928
+ name: "#{heat_pump_water_loop.name} Supplemental Boiler",
929
+ fuel_type: heating_fuel,
930
+ flow_mode: 'ConstantFlow',
931
+ lvg_temp_dsgn_f: 86.0, # 30.0 degrees Celsius
932
+ min_plr: 0.0,
933
+ max_plr: 1.2,
934
+ opt_plr: 1.0)
935
935
  heating_equipment_stpt_manager.setName("#{heat_pump_water_loop.name} Boiler Scheduled Dual Setpoint")
936
936
  else
937
937
  OpenStudio.logFree(OpenStudio::Error, 'openstudio.Model.Model', "Boiler fuel type #{heating_fuel} is not valid, no heating equipment will be added.")
@@ -1028,7 +1028,7 @@ class Standard
1028
1028
  loop_stpt_manager.addToNode(ground_hx_loop.supplyOutletNode)
1029
1029
 
1030
1030
  # edit name to be EMS friendly
1031
- ground_hx_ems_name = ems_friendly_name(ground_hx.name)
1031
+ ground_hx_ems_name = OpenstudioStandards::HVAC.ems_friendly_name(ground_hx.name)
1032
1032
 
1033
1033
  # sensor to read supply inlet temperature
1034
1034
  inlet_temp_sensor = OpenStudio::Model::EnergyManagementSystemSensor.new(model,
@@ -1206,8 +1206,8 @@ class Standard
1206
1206
  chilled_water_loop.addAvailabilityManager(chilled_water_loop_lockout_manager)
1207
1207
  else
1208
1208
  # create availability managers based on zone heating and cooling demand
1209
- hot_water_loop_name = ems_friendly_name(hot_water_loop.name)
1210
- chilled_water_loop_name = ems_friendly_name(chilled_water_loop.name)
1209
+ hot_water_loop_name = OpenstudioStandards::HVAC.ems_friendly_name(hot_water_loop.name)
1210
+ chilled_water_loop_name = OpenstudioStandards::HVAC.ems_friendly_name(chilled_water_loop.name)
1211
1211
 
1212
1212
  # create hot water plant availability schedule managers and create an EMS acuator
1213
1213
  sch_hot_water_availability = OpenstudioStandards::Schedules.create_constant_schedule_ruleset(model,
@@ -1368,10 +1368,9 @@ class Standard
1368
1368
  sizing_system.setCentralHeatingDesignSupplyAirTemperature(htg_dsgn_sup_air_temp_c)
1369
1369
 
1370
1370
  # create supply fan
1371
- supply_fan = create_fan_by_name(model,
1372
- 'Constant_DOAS_Fan',
1373
- fan_name: 'DOAS Supply Fan',
1374
- end_use_subcategory: 'DOAS Fans')
1371
+ supply_fan = OpenstudioStandards::HVAC.create_typical_fan(model, 'Constant_DOAS_Fan',
1372
+ fan_name: 'DOAS Supply Fan',
1373
+ end_use_subcategory: 'DOAS Fans')
1375
1374
  supply_fan.setAvailabilitySchedule(model.alwaysOnDiscreteSchedule)
1376
1375
  supply_fan.setMaximumFlowRate(OpenStudio.convert(fan_maximum_flow_rate, 'cfm', 'm^3/s').get) unless fan_maximum_flow_rate.nil?
1377
1376
  supply_fan.addToNode(air_loop.supplyInletNode)
@@ -1379,32 +1378,32 @@ class Standard
1379
1378
  # create heating coil
1380
1379
  if hot_water_loop.nil?
1381
1380
  # electric backup heating coil
1382
- create_coil_heating_electric(model,
1383
- air_loop_node: air_loop.supplyInletNode,
1384
- name: "#{air_loop.name} Backup Htg Coil")
1381
+ OpenstudioStandards::HVAC.create_coil_heating_electric(model,
1382
+ air_loop_node: air_loop.supplyInletNode,
1383
+ name: "#{air_loop.name} Backup Htg Coil")
1385
1384
  # heat pump coil
1386
- create_coil_heating_dx_single_speed(model,
1387
- air_loop_node: air_loop.supplyInletNode,
1388
- name: "#{air_loop.name} Htg Coil")
1385
+ OpenstudioStandards::HVAC.create_coil_heating_dx_single_speed(model,
1386
+ air_loop_node: air_loop.supplyInletNode,
1387
+ name: "#{air_loop.name} Htg Coil")
1389
1388
  else
1390
- create_coil_heating_water(model,
1391
- hot_water_loop,
1392
- air_loop_node: air_loop.supplyInletNode,
1393
- name: "#{air_loop.name} Htg Coil",
1394
- controller_convergence_tolerance: 0.0001)
1389
+ OpenstudioStandards::HVAC.create_coil_heating_water(model,
1390
+ hot_water_loop,
1391
+ air_loop_node: air_loop.supplyInletNode,
1392
+ name: "#{air_loop.name} Htg Coil",
1393
+ controller_convergence_tolerance: 0.0001)
1395
1394
  end
1396
1395
 
1397
1396
  # create cooling coil
1398
1397
  if chilled_water_loop.nil?
1399
- create_coil_cooling_dx_two_speed(model,
1400
- air_loop_node: air_loop.supplyInletNode,
1401
- name: "#{air_loop.name} 2spd DX Clg Coil",
1402
- type: 'OS default')
1398
+ OpenstudioStandards::HVAC.create_coil_cooling_dx_two_speed(model,
1399
+ air_loop_node: air_loop.supplyInletNode,
1400
+ name: "#{air_loop.name} 2spd DX Clg Coil",
1401
+ type: 'OS default')
1403
1402
  else
1404
- create_coil_cooling_water(model,
1405
- chilled_water_loop,
1406
- air_loop_node: air_loop.supplyInletNode,
1407
- name: "#{air_loop.name} Clg Coil")
1403
+ OpenstudioStandards::HVAC.create_coil_cooling_water(model,
1404
+ chilled_water_loop,
1405
+ air_loop_node: air_loop.supplyInletNode,
1406
+ name: "#{air_loop.name} Clg Coil")
1408
1407
  end
1409
1408
 
1410
1409
  # minimum outdoor air schedule
@@ -1462,18 +1461,18 @@ class Standard
1462
1461
  # create the ERV and set its properties
1463
1462
  # @todo come up with scheme for estimating power of ERV motor wheel which might require knowing airflow.
1464
1463
  # erv.setNominalElectricPower(value_new)
1465
- erv = OpenstudioStandards::HVAC.create_hx_air_to_air_sensible_and_latent(model,
1466
- name: "#{zone.name} ERV HX",
1467
- type: "Rotary",
1468
- economizer_lockout: true,
1469
- sensible_heating_100_eff: 0.76,
1470
- sensible_heating_75_eff: 0.81,
1471
- latent_heating_100_eff: 0.68,
1472
- latent_heating_75_eff: 0.73,
1473
- sensible_cooling_100_eff: 0.76,
1474
- sensible_cooling_75_eff: 0.81,
1475
- latent_cooling_100_eff: 0.68,
1476
- latent_cooling_75_eff: 0.73)
1464
+ erv = OpenstudioStandards::HVAC.create_heat_exchanger_air_to_air_sensible_and_latent(model,
1465
+ name: "#{zone.name} ERV HX",
1466
+ type: "Rotary",
1467
+ economizer_lockout: true,
1468
+ sensible_heating_100_eff: 0.76,
1469
+ sensible_heating_75_eff: 0.81,
1470
+ latent_heating_100_eff: 0.68,
1471
+ latent_heating_75_eff: 0.73,
1472
+ sensible_cooling_100_eff: 0.76,
1473
+ sensible_cooling_75_eff: 0.81,
1474
+ latent_cooling_100_eff: 0.68,
1475
+ latent_cooling_75_eff: 0.73)
1477
1476
  erv.addToNode(oa_system.outboardOANode.get)
1478
1477
 
1479
1478
  # increase fan static pressure to account for ERV
@@ -1598,15 +1597,15 @@ class Standard
1598
1597
  sizing_system.setCentralHeatingDesignSupplyAirTemperature(htg_dsgn_sup_air_temp_c)
1599
1598
 
1600
1599
  if doas_type == 'DOASCV'
1601
- supply_fan = create_fan_by_name(model,
1602
- 'Constant_DOAS_Fan',
1603
- fan_name: 'DOAS Supply Fan',
1604
- end_use_subcategory: 'DOAS Fans')
1600
+ supply_fan = OpenstudioStandards::HVAC.create_typical_fan(model,
1601
+ 'Constant_DOAS_Fan',
1602
+ fan_name: 'DOAS Supply Fan',
1603
+ end_use_subcategory: 'DOAS Fans')
1605
1604
  else # 'DOASVAV'
1606
- supply_fan = create_fan_by_name(model,
1607
- 'Variable_DOAS_Fan',
1608
- fan_name: 'DOAS Supply Fan',
1609
- end_use_subcategory: 'DOAS Fans')
1605
+ supply_fan = OpenstudioStandards::HVAC.create_typical_fan(model,
1606
+ 'Variable_DOAS_Fan',
1607
+ fan_name: 'DOAS Supply Fan',
1608
+ end_use_subcategory: 'DOAS Fans')
1610
1609
  end
1611
1610
  supply_fan.setAvailabilitySchedule(model.alwaysOnDiscreteSchedule)
1612
1611
  supply_fan.setMaximumFlowRate(OpenStudio.convert(fan_maximum_flow_rate, 'cfm', 'm^3/s').get) unless fan_maximum_flow_rate.nil?
@@ -1615,19 +1614,19 @@ class Standard
1615
1614
  # create heating coil
1616
1615
  if hot_water_loop.nil?
1617
1616
  # electric backup heating coil
1618
- create_coil_heating_electric(model,
1619
- air_loop_node: air_loop.supplyInletNode,
1620
- name: "#{air_loop.name} Backup Htg Coil")
1617
+ OpenstudioStandards::HVAC.create_coil_heating_electric(model,
1618
+ air_loop_node: air_loop.supplyInletNode,
1619
+ name: "#{air_loop.name} Backup Htg Coil")
1621
1620
  # heat pump coil
1622
- create_coil_heating_dx_single_speed(model,
1623
- air_loop_node: air_loop.supplyInletNode,
1624
- name: "#{air_loop.name} Htg Coil")
1621
+ OpenstudioStandards::HVAC.create_coil_heating_dx_single_speed(model,
1622
+ air_loop_node: air_loop.supplyInletNode,
1623
+ name: "#{air_loop.name} Htg Coil")
1625
1624
  else
1626
- create_coil_heating_water(model,
1627
- hot_water_loop,
1628
- air_loop_node: air_loop.supplyInletNode,
1629
- name: "#{air_loop.name} Htg Coil",
1630
- controller_convergence_tolerance: 0.0001)
1625
+ OpenstudioStandards::HVAC.create_coil_heating_water(model,
1626
+ hot_water_loop,
1627
+ air_loop_node: air_loop.supplyInletNode,
1628
+ name: "#{air_loop.name} Htg Coil",
1629
+ controller_convergence_tolerance: 0.0001)
1631
1630
  end
1632
1631
 
1633
1632
  # could add a humidity controller here set to limit supply air to a 16.6C/62F dewpoint
@@ -1644,15 +1643,15 @@ class Standard
1644
1643
 
1645
1644
  # create cooling coil
1646
1645
  if chilled_water_loop.nil?
1647
- create_coil_cooling_dx_two_speed(model,
1648
- air_loop_node: air_loop.supplyInletNode,
1649
- name: "#{air_loop.name} 2spd DX Clg Coil",
1650
- type: 'OS default')
1646
+ OpenstudioStandards::HVAC.create_coil_cooling_dx_two_speed(model,
1647
+ air_loop_node: air_loop.supplyInletNode,
1648
+ name: "#{air_loop.name} 2spd DX Clg Coil",
1649
+ type: 'OS default')
1651
1650
  else
1652
- create_coil_cooling_water(model,
1653
- chilled_water_loop,
1654
- air_loop_node: air_loop.supplyInletNode,
1655
- name: "#{air_loop.name} Clg Coil")
1651
+ OpenstudioStandards::HVAC.create_coil_cooling_water(model,
1652
+ chilled_water_loop,
1653
+ air_loop_node: air_loop.supplyInletNode,
1654
+ name: "#{air_loop.name} Clg Coil")
1656
1655
  end
1657
1656
 
1658
1657
  # minimum outdoor air schedule
@@ -1693,15 +1692,15 @@ class Standard
1693
1692
  # create an exhaust fan
1694
1693
  if include_exhaust_fan
1695
1694
  if doas_type == 'DOASCV'
1696
- exhaust_fan = create_fan_by_name(model,
1697
- 'Constant_DOAS_Fan',
1698
- fan_name: 'DOAS Exhaust Fan',
1699
- end_use_subcategory: 'DOAS Fans')
1695
+ exhaust_fan = OpenstudioStandards::HVAC.create_typical_fan(model,
1696
+ 'Constant_DOAS_Fan',
1697
+ fan_name: 'DOAS Exhaust Fan',
1698
+ end_use_subcategory: 'DOAS Fans')
1700
1699
  else # 'DOASVAV'
1701
- exhaust_fan = create_fan_by_name(model,
1702
- 'Variable_DOAS_Fan',
1703
- fan_name: 'DOAS Exhaust Fan',
1704
- end_use_subcategory: 'DOAS Fans')
1700
+ exhaust_fan = OpenstudioStandards::HVAC.create_typical_fan(model,
1701
+ 'Variable_DOAS_Fan',
1702
+ fan_name: 'DOAS Exhaust Fan',
1703
+ end_use_subcategory: 'DOAS Fans')
1705
1704
  end
1706
1705
  # set pressure rise 1.0 inH2O lower than supply fan, 1.0 inH2O minimum
1707
1706
  exhaust_fan_pressure_rise = supply_fan.pressureRise - OpenStudio.convert(1.0, 'inH_{2}O', 'Pa').get
@@ -1740,9 +1739,9 @@ class Standard
1740
1739
  elsif doas_type == 'DOASVAVReheat'
1741
1740
  # Reheat coil
1742
1741
  if hot_water_loop.nil?
1743
- rht_coil = create_coil_heating_electric(model, name: "#{zone.name} Electric Reheat Coil")
1742
+ rht_coil = OpenstudioStandards::HVAC.create_coil_heating_electric(model, name: "#{zone.name} Electric Reheat Coil")
1744
1743
  else
1745
- rht_coil = create_coil_heating_water(model, hot_water_loop, name: "#{zone.name} Reheat Coil")
1744
+ rht_coil = OpenstudioStandards::HVAC.create_coil_heating_water(model, hot_water_loop, name: "#{zone.name} Reheat Coil")
1746
1745
  end
1747
1746
  # VAV reheat terminal
1748
1747
  air_terminal = OpenStudio::Model::AirTerminalSingleDuctVAVReheat.new(model, model.alwaysOnDiscreteSchedule, rht_coil)
@@ -1892,36 +1891,36 @@ class Standard
1892
1891
 
1893
1892
  # create fan
1894
1893
  # @type [OpenStudio::Model::FanVariableVolume] fan
1895
- fan = create_fan_by_name(model,
1896
- 'VAV_System_Fan',
1897
- fan_name: "#{air_loop.name} Fan",
1898
- fan_efficiency: fan_efficiency,
1899
- pressure_rise: fan_pressure_rise,
1900
- motor_efficiency: fan_motor_efficiency,
1901
- end_use_subcategory: 'VAV System Fans')
1894
+ fan = OpenstudioStandards::HVAC.create_typical_fan(model,
1895
+ 'VAV_System_Fan',
1896
+ fan_name: "#{air_loop.name} Fan",
1897
+ fan_efficiency: fan_efficiency,
1898
+ pressure_rise: fan_pressure_rise,
1899
+ motor_efficiency: fan_motor_efficiency,
1900
+ end_use_subcategory: 'VAV System Fans')
1902
1901
  fan.setAvailabilitySchedule(model.alwaysOnDiscreteSchedule)
1903
1902
  fan.addToNode(air_loop.supplyInletNode)
1904
1903
 
1905
1904
  # create heating coil
1906
1905
  if hot_water_loop.nil?
1907
1906
  if heating_type == 'Electricity'
1908
- htg_coil = create_coil_heating_electric(model,
1909
- air_loop_node: air_loop.supplyInletNode,
1910
- name: "#{air_loop.name} Main Electric Htg Coil")
1907
+ htg_coil = OpenstudioStandards::HVAC.create_coil_heating_electric(model,
1908
+ air_loop_node: air_loop.supplyInletNode,
1909
+ name: "#{air_loop.name} Main Electric Htg Coil")
1911
1910
  else # default to NaturalGas
1912
- htg_coil = create_coil_heating_gas(model,
1913
- air_loop_node: air_loop.supplyInletNode,
1914
- name: "#{air_loop.name} Main Gas Htg Coil")
1911
+ htg_coil = OpenstudioStandards::HVAC.create_coil_heating_gas(model,
1912
+ air_loop_node: air_loop.supplyInletNode,
1913
+ name: "#{air_loop.name} Main Gas Htg Coil")
1915
1914
  end
1916
1915
  else
1917
- htg_coil = create_coil_heating_water(model,
1918
- hot_water_loop,
1919
- air_loop_node: air_loop.supplyInletNode,
1920
- name: "#{air_loop.name} Main Htg Coil",
1921
- rated_inlet_water_temperature: hw_temp_c,
1922
- rated_outlet_water_temperature: (hw_temp_c - hw_delta_t_k),
1923
- rated_inlet_air_temperature: dsgn_temps['prehtg_dsgn_sup_air_temp_c'],
1924
- rated_outlet_air_temperature: dsgn_temps['htg_dsgn_sup_air_temp_c'])
1916
+ htg_coil = OpenstudioStandards::HVAC.create_coil_heating_water(model,
1917
+ hot_water_loop,
1918
+ air_loop_node: air_loop.supplyInletNode,
1919
+ name: "#{air_loop.name} Main Htg Coil",
1920
+ rated_inlet_water_temperature: hw_temp_c,
1921
+ rated_outlet_water_temperature: (hw_temp_c - hw_delta_t_k),
1922
+ rated_inlet_air_temperature: dsgn_temps['prehtg_dsgn_sup_air_temp_c'],
1923
+ rated_outlet_air_temperature: dsgn_temps['htg_dsgn_sup_air_temp_c'])
1925
1924
  end
1926
1925
 
1927
1926
  # set the setpointmanager for the central/preheat coil if required
@@ -1929,15 +1928,15 @@ class Standard
1929
1928
 
1930
1929
  # create cooling coil
1931
1930
  if chilled_water_loop.nil?
1932
- create_coil_cooling_dx_two_speed(model,
1933
- air_loop_node: air_loop.supplyInletNode,
1934
- name: "#{air_loop.name} 2spd DX Clg Coil",
1935
- type: 'OS default')
1931
+ OpenstudioStandards::HVAC.create_coil_cooling_dx_two_speed(model,
1932
+ air_loop_node: air_loop.supplyInletNode,
1933
+ name: "#{air_loop.name} 2spd DX Clg Coil",
1934
+ type: 'OS default')
1936
1935
  else
1937
- create_coil_cooling_water(model,
1938
- chilled_water_loop,
1939
- air_loop_node: air_loop.supplyInletNode,
1940
- name: "#{air_loop.name} Clg Coil")
1936
+ OpenstudioStandards::HVAC.create_coil_cooling_water(model,
1937
+ chilled_water_loop,
1938
+ air_loop_node: air_loop.supplyInletNode,
1939
+ name: "#{air_loop.name} Clg Coil")
1941
1940
  end
1942
1941
 
1943
1942
  # outdoor air intake system
@@ -1987,19 +1986,19 @@ class Standard
1987
1986
  # create reheat coil
1988
1987
  case reheat_type
1989
1988
  when 'NaturalGas', 'Gas'
1990
- rht_coil = create_coil_heating_gas(model,
1991
- name: "#{zone.name} Gas Reheat Coil")
1989
+ rht_coil = OpenstudioStandards::HVAC.create_coil_heating_gas(model,
1990
+ name: "#{zone.name} Gas Reheat Coil")
1992
1991
  when 'Electricity'
1993
- rht_coil = create_coil_heating_electric(model,
1994
- name: "#{zone.name} Electric Reheat Coil")
1992
+ rht_coil = OpenstudioStandards::HVAC.create_coil_heating_electric(model,
1993
+ name: "#{zone.name} Electric Reheat Coil")
1995
1994
  when 'Water'
1996
- rht_coil = create_coil_heating_water(model,
1997
- hot_water_loop,
1998
- name: "#{zone.name} Reheat Coil",
1999
- rated_inlet_water_temperature: hw_temp_c,
2000
- rated_outlet_water_temperature: (hw_temp_c - hw_delta_t_k),
2001
- rated_inlet_air_temperature: dsgn_temps['htg_dsgn_sup_air_temp_c'],
2002
- rated_outlet_air_temperature: dsgn_temps['zn_htg_dsgn_sup_air_temp_c'])
1995
+ rht_coil = OpenstudioStandards::HVAC.create_coil_heating_water(model,
1996
+ hot_water_loop,
1997
+ name: "#{zone.name} Reheat Coil",
1998
+ rated_inlet_water_temperature: hw_temp_c,
1999
+ rated_outlet_water_temperature: (hw_temp_c - hw_delta_t_k),
2000
+ rated_inlet_air_temperature: dsgn_temps['htg_dsgn_sup_air_temp_c'],
2001
+ rated_outlet_air_temperature: dsgn_temps['zn_htg_dsgn_sup_air_temp_c'])
2003
2002
  else
2004
2003
  # no reheat
2005
2004
  OpenStudio.logFree(OpenStudio::Debug, 'openstudio.Model.Model', "No reheat coil for terminal in #{zone.name}")
@@ -2119,29 +2118,29 @@ class Standard
2119
2118
 
2120
2119
  # create fan
2121
2120
  # @type [OpenStudio::Model::FanVariableVolume] fan
2122
- fan = create_fan_by_name(model,
2123
- 'VAV_System_Fan',
2124
- fan_name: "#{air_loop.name} Fan",
2125
- fan_efficiency: fan_efficiency,
2126
- pressure_rise: fan_pressure_rise,
2127
- motor_efficiency: fan_motor_efficiency,
2128
- end_use_subcategory: 'VAV System Fans')
2121
+ fan = OpenstudioStandards::HVAC.create_typical_fan(model,
2122
+ 'VAV_System_Fan',
2123
+ fan_name: "#{air_loop.name} Fan",
2124
+ fan_efficiency: fan_efficiency,
2125
+ pressure_rise: fan_pressure_rise,
2126
+ motor_efficiency: fan_motor_efficiency,
2127
+ end_use_subcategory: 'VAV System Fans')
2129
2128
  fan.setAvailabilitySchedule(model.alwaysOnDiscreteSchedule)
2130
2129
  fan.addToNode(air_loop.supplyInletNode)
2131
2130
 
2132
2131
  # create heating coil
2133
- htg_coil = create_coil_heating_electric(model,
2134
- air_loop_node: air_loop.supplyInletNode,
2135
- name: "#{air_loop.name} Htg Coil")
2132
+ htg_coil = OpenstudioStandards::HVAC.create_coil_heating_electric(model,
2133
+ air_loop_node: air_loop.supplyInletNode,
2134
+ name: "#{air_loop.name} Htg Coil")
2136
2135
 
2137
2136
  # set the setpointmanager for the central/preheat coil if required
2138
2137
  model_set_central_preheat_coil_spm(model, thermal_zones, htg_coil)
2139
2138
 
2140
2139
  # create cooling coil
2141
- create_coil_cooling_water(model,
2142
- chilled_water_loop,
2143
- air_loop_node: air_loop.supplyInletNode,
2144
- name: "#{air_loop.name} Clg Coil")
2140
+ OpenstudioStandards::HVAC.create_coil_cooling_water(model,
2141
+ chilled_water_loop,
2142
+ air_loop_node: air_loop.supplyInletNode,
2143
+ name: "#{air_loop.name} Clg Coil")
2145
2144
 
2146
2145
  # create outdoor air intake system
2147
2146
  oa_intake_controller = OpenStudio::Model::ControllerOutdoorAir.new(model)
@@ -2166,14 +2165,14 @@ class Standard
2166
2165
  OpenStudio.logFree(OpenStudio::Info, 'openstudio.Model.Model', "Adding VAV with PFP Boxes and Reheat system terminal for #{zone.name}.")
2167
2166
 
2168
2167
  # create reheat coil
2169
- rht_coil = create_coil_heating_electric(model,
2170
- name: "#{zone.name} Electric Reheat Coil")
2168
+ rht_coil = OpenstudioStandards::HVAC.create_coil_heating_electric(model,
2169
+ name: "#{zone.name} Electric Reheat Coil")
2171
2170
 
2172
2171
  # create terminal fan
2173
2172
  # @type [OpenStudio::Model::FanConstantVolume] pfp_fan
2174
- pfp_fan = create_fan_by_name(model,
2175
- 'PFP_Fan',
2176
- fan_name: "#{zone.name} PFP Term Fan")
2173
+ pfp_fan = OpenstudioStandards::HVAC.create_typical_fan(model,
2174
+ 'PFP_Fan',
2175
+ fan_name: "#{zone.name} PFP Term Fan")
2177
2176
  pfp_fan.setAvailabilitySchedule(model.alwaysOnDiscreteSchedule)
2178
2177
 
2179
2178
  # create parallel fan powered terminal
@@ -2272,31 +2271,31 @@ class Standard
2272
2271
  sa_stpt_manager.addToNode(air_loop.supplyOutletNode)
2273
2272
 
2274
2273
  # create fan
2275
- fan = create_fan_by_name(model,
2276
- 'VAV_default',
2277
- fan_name: "#{air_loop.name} Fan")
2274
+ fan = OpenstudioStandards::HVAC.create_typical_fan(model,
2275
+ 'VAV_default',
2276
+ fan_name: "#{air_loop.name} Fan")
2278
2277
  fan.setAvailabilitySchedule(model.alwaysOnDiscreteSchedule)
2279
2278
  fan.addToNode(air_loop.supplyInletNode)
2280
2279
 
2281
2280
  # create heating coil
2282
2281
  if hot_water_loop.nil?
2283
2282
  if heating_type == 'Electricity'
2284
- htg_coil = create_coil_heating_electric(model,
2285
- air_loop_node: air_loop.supplyInletNode,
2286
- name: "#{air_loop.name} Main Electric Htg Coil")
2283
+ htg_coil = OpenstudioStandards::HVAC.create_coil_heating_electric(model,
2284
+ air_loop_node: air_loop.supplyInletNode,
2285
+ name: "#{air_loop.name} Main Electric Htg Coil")
2287
2286
  else # default to NaturalGas
2288
- htg_coil = create_coil_heating_gas(model,
2289
- air_loop_node: air_loop.supplyInletNode,
2290
- name: "#{air_loop.name} Main Gas Htg Coil")
2287
+ htg_coil = OpenstudioStandards::HVAC.create_coil_heating_gas(model,
2288
+ air_loop_node: air_loop.supplyInletNode,
2289
+ name: "#{air_loop.name} Main Gas Htg Coil")
2291
2290
  end
2292
2291
  else
2293
- htg_coil = create_coil_heating_water(model, hot_water_loop,
2294
- air_loop_node: air_loop.supplyInletNode,
2295
- name: "#{air_loop.name} Main Htg Coil",
2296
- rated_inlet_water_temperature: hw_temp_c,
2297
- rated_outlet_water_temperature: (hw_temp_c - hw_delta_t_k),
2298
- rated_inlet_air_temperature: dsgn_temps['prehtg_dsgn_sup_air_temp_c'],
2299
- rated_outlet_air_temperature: dsgn_temps['htg_dsgn_sup_air_temp_c'])
2292
+ htg_coil = OpenstudioStandards::HVAC.create_coil_heating_water(model, hot_water_loop,
2293
+ air_loop_node: air_loop.supplyInletNode,
2294
+ name: "#{air_loop.name} Main Htg Coil",
2295
+ rated_inlet_water_temperature: hw_temp_c,
2296
+ rated_outlet_water_temperature: (hw_temp_c - hw_delta_t_k),
2297
+ rated_inlet_air_temperature: dsgn_temps['prehtg_dsgn_sup_air_temp_c'],
2298
+ rated_outlet_air_temperature: dsgn_temps['htg_dsgn_sup_air_temp_c'])
2300
2299
  end
2301
2300
 
2302
2301
  # set the setpointmanager for the central/preheat coil if required
@@ -2304,15 +2303,15 @@ class Standard
2304
2303
 
2305
2304
  # create cooling coil
2306
2305
  if chilled_water_loop.nil?
2307
- create_coil_cooling_dx_two_speed(model,
2308
- air_loop_node: air_loop.supplyInletNode,
2309
- name: "#{air_loop.name} 2spd DX Clg Coil",
2310
- type: 'OS default')
2306
+ OpenstudioStandards::HVAC.create_coil_cooling_dx_two_speed(model,
2307
+ air_loop_node: air_loop.supplyInletNode,
2308
+ name: "#{air_loop.name} 2spd DX Clg Coil",
2309
+ type: 'OS default')
2311
2310
  else
2312
- create_coil_cooling_water(model,
2313
- chilled_water_loop,
2314
- air_loop_node: air_loop.supplyInletNode,
2315
- name: "#{air_loop.name} Clg Coil")
2311
+ OpenstudioStandards::HVAC.create_coil_cooling_water(model,
2312
+ chilled_water_loop,
2313
+ air_loop_node: air_loop.supplyInletNode,
2314
+ name: "#{air_loop.name} Clg Coil")
2316
2315
  end
2317
2316
 
2318
2317
  # outdoor air intake system
@@ -2361,16 +2360,16 @@ class Standard
2361
2360
 
2362
2361
  # create reheat coil
2363
2362
  if electric_reheat || hot_water_loop.nil?
2364
- rht_coil = create_coil_heating_electric(model,
2365
- name: "#{zone.name} Electric Reheat Coil")
2363
+ rht_coil = OpenstudioStandards::HVAC.create_coil_heating_electric(model,
2364
+ name: "#{zone.name} Electric Reheat Coil")
2366
2365
  else
2367
- rht_coil = create_coil_heating_water(model,
2368
- hot_water_loop,
2369
- name: "#{zone.name} Reheat Coil",
2370
- rated_inlet_water_temperature: hw_temp_c,
2371
- rated_outlet_water_temperature: (hw_temp_c - hw_delta_t_k),
2372
- rated_inlet_air_temperature: dsgn_temps['htg_dsgn_sup_air_temp_c'],
2373
- rated_outlet_air_temperature: dsgn_temps['zn_htg_dsgn_sup_air_temp_c'])
2366
+ rht_coil = OpenstudioStandards::HVAC.create_coil_heating_water(model,
2367
+ hot_water_loop,
2368
+ name: "#{zone.name} Reheat Coil",
2369
+ rated_inlet_water_temperature: hw_temp_c,
2370
+ rated_outlet_water_temperature: (hw_temp_c - hw_delta_t_k),
2371
+ rated_inlet_air_temperature: dsgn_temps['htg_dsgn_sup_air_temp_c'],
2372
+ rated_outlet_air_temperature: dsgn_temps['zn_htg_dsgn_sup_air_temp_c'])
2374
2373
  end
2375
2374
 
2376
2375
  # create VAV terminal
@@ -2462,34 +2461,34 @@ class Standard
2462
2461
 
2463
2462
  # create fan
2464
2463
  # @type [OpenStudio::Model::FanVariableVolume] fan
2465
- fan = create_fan_by_name(model,
2466
- 'VAV_System_Fan',
2467
- fan_name: "#{air_loop.name} Fan",
2468
- fan_efficiency: fan_efficiency,
2469
- pressure_rise: fan_pressure_rise,
2470
- motor_efficiency: fan_motor_efficiency,
2471
- end_use_subcategory: 'VAV System Fans')
2464
+ fan = OpenstudioStandards::HVAC.create_typical_fan(model,
2465
+ 'VAV_System_Fan',
2466
+ fan_name: "#{air_loop.name} Fan",
2467
+ fan_efficiency: fan_efficiency,
2468
+ pressure_rise: fan_pressure_rise,
2469
+ motor_efficiency: fan_motor_efficiency,
2470
+ end_use_subcategory: 'VAV System Fans')
2472
2471
  fan.setAvailabilitySchedule(model.alwaysOnDiscreteSchedule)
2473
2472
  fan.addToNode(air_loop.supplyInletNode)
2474
2473
 
2475
2474
  # create heating coil
2476
- htg_coil = create_coil_heating_electric(model,
2477
- air_loop_node: air_loop.supplyInletNode,
2478
- name: "#{air_loop.name} Main Htg Coil")
2475
+ htg_coil = OpenstudioStandards::HVAC.create_coil_heating_electric(model,
2476
+ air_loop_node: air_loop.supplyInletNode,
2477
+ name: "#{air_loop.name} Main Htg Coil")
2479
2478
 
2480
2479
  # set the setpointmanager for the central/preheat coil if required
2481
2480
  model_set_central_preheat_coil_spm(model, thermal_zones, htg_coil)
2482
2481
 
2483
2482
  # create cooling coil
2484
2483
  if chilled_water_loop.nil?
2485
- create_coil_cooling_dx_two_speed(model,
2486
- air_loop_node: air_loop.supplyInletNode,
2487
- name: "#{air_loop.name} 2spd DX Clg Coil", type: 'OS default')
2484
+ OpenstudioStandards::HVAC.create_coil_cooling_dx_two_speed(model,
2485
+ air_loop_node: air_loop.supplyInletNode,
2486
+ name: "#{air_loop.name} 2spd DX Clg Coil", type: 'OS default')
2488
2487
  else
2489
- create_coil_cooling_water(model,
2490
- chilled_water_loop,
2491
- air_loop_node: air_loop.supplyInletNode,
2492
- name: "#{air_loop.name} Clg Coil")
2488
+ OpenstudioStandards::HVAC.create_coil_cooling_water(model,
2489
+ chilled_water_loop,
2490
+ air_loop_node: air_loop.supplyInletNode,
2491
+ name: "#{air_loop.name} Clg Coil")
2493
2492
  end
2494
2493
 
2495
2494
  # create outdoor air intake system
@@ -2516,14 +2515,14 @@ class Standard
2516
2515
  OpenStudio.logFree(OpenStudio::Debug, 'openstudio.Model.Model', "Adding PVAV PFP Box to zone #{zone.name}")
2517
2516
 
2518
2517
  # create electric reheat coil
2519
- rht_coil = create_coil_heating_electric(model,
2520
- name: "#{zone.name} Electric Reheat Coil")
2518
+ rht_coil = OpenstudioStandards::HVAC.create_coil_heating_electric(model,
2519
+ name: "#{zone.name} Electric Reheat Coil")
2521
2520
 
2522
2521
  # create terminal fan
2523
2522
  # @type [OpenStudio::Model::FanConstantVolume] pfp_fan
2524
- pfp_fan = create_fan_by_name(model,
2525
- 'PFP_Fan',
2526
- fan_name: "#{zone.name} PFP Term Fan")
2523
+ pfp_fan = OpenstudioStandards::HVAC.create_typical_fan(model,
2524
+ 'PFP_Fan',
2525
+ fan_name: "#{zone.name} PFP Term Fan")
2527
2526
  pfp_fan.setAvailabilitySchedule(model.alwaysOnDiscreteSchedule)
2528
2527
 
2529
2528
  # parallel fan powered terminal
@@ -2619,37 +2618,37 @@ class Standard
2619
2618
  sa_stpt_manager.addToNode(air_loop.supplyOutletNode)
2620
2619
 
2621
2620
  # create fan
2622
- fan = create_fan_by_name(model,
2623
- 'Packaged_RTU_SZ_AC_CAV_Fan',
2624
- fan_name: "#{air_loop.name} Fan",
2625
- fan_efficiency: fan_efficiency,
2626
- pressure_rise: fan_pressure_rise,
2627
- motor_efficiency: fan_motor_efficiency,
2628
- end_use_subcategory: 'CAV System Fans')
2621
+ fan = OpenstudioStandards::HVAC.create_typical_fan(model,
2622
+ 'Packaged_RTU_SZ_AC_CAV_Fan',
2623
+ fan_name: "#{air_loop.name} Fan",
2624
+ fan_efficiency: fan_efficiency,
2625
+ pressure_rise: fan_pressure_rise,
2626
+ motor_efficiency: fan_motor_efficiency,
2627
+ end_use_subcategory: 'CAV System Fans')
2629
2628
  fan.setAvailabilitySchedule(model.alwaysOnDiscreteSchedule)
2630
2629
  fan.addToNode(air_loop.supplyInletNode)
2631
2630
 
2632
2631
  # create heating coil
2633
- create_coil_heating_water(model,
2634
- hot_water_loop,
2635
- air_loop_node: air_loop.supplyInletNode,
2636
- name: "#{air_loop.name} Main Htg Coil",
2637
- rated_inlet_water_temperature: hw_temp_c,
2638
- rated_outlet_water_temperature: (hw_temp_c - hw_delta_t_k),
2639
- rated_inlet_air_temperature: dsgn_temps['prehtg_dsgn_sup_air_temp_c'],
2640
- rated_outlet_air_temperature: dsgn_temps['htg_dsgn_sup_air_temp_c'])
2632
+ OpenstudioStandards::HVAC.create_coil_heating_water(model,
2633
+ hot_water_loop,
2634
+ air_loop_node: air_loop.supplyInletNode,
2635
+ name: "#{air_loop.name} Main Htg Coil",
2636
+ rated_inlet_water_temperature: hw_temp_c,
2637
+ rated_outlet_water_temperature: (hw_temp_c - hw_delta_t_k),
2638
+ rated_inlet_air_temperature: dsgn_temps['prehtg_dsgn_sup_air_temp_c'],
2639
+ rated_outlet_air_temperature: dsgn_temps['htg_dsgn_sup_air_temp_c'])
2641
2640
 
2642
2641
  # create cooling coil
2643
2642
  if chilled_water_loop.nil?
2644
- create_coil_cooling_dx_two_speed(model,
2645
- air_loop_node: air_loop.supplyInletNode,
2646
- name: "#{air_loop.name} 2spd DX Clg Coil",
2647
- type: 'OS default')
2643
+ OpenstudioStandards::HVAC.create_coil_cooling_dx_two_speed(model,
2644
+ air_loop_node: air_loop.supplyInletNode,
2645
+ name: "#{air_loop.name} 2spd DX Clg Coil",
2646
+ type: 'OS default')
2648
2647
  else
2649
- create_coil_cooling_water(model,
2650
- chilled_water_loop,
2651
- air_loop_node: air_loop.supplyInletNode,
2652
- name: "#{air_loop.name} Clg Coil")
2648
+ OpenstudioStandards::HVAC.create_coil_cooling_water(model,
2649
+ chilled_water_loop,
2650
+ air_loop_node: air_loop.supplyInletNode,
2651
+ name: "#{air_loop.name} Clg Coil")
2653
2652
  end
2654
2653
 
2655
2654
  # create outdoor air intake system
@@ -2675,13 +2674,13 @@ class Standard
2675
2674
  OpenStudio.logFree(OpenStudio::Debug, 'openstudio.Model.Model', "Adding CAV for #{zone.name}")
2676
2675
 
2677
2676
  # Reheat coil
2678
- rht_coil = create_coil_heating_water(model,
2679
- hot_water_loop,
2680
- name: "#{zone.name} Reheat Coil",
2681
- rated_inlet_water_temperature: hw_temp_c,
2682
- rated_outlet_water_temperature: (hw_temp_c - hw_delta_t_k),
2683
- rated_inlet_air_temperature: dsgn_temps['htg_dsgn_sup_air_temp_c'],
2684
- rated_outlet_air_temperature: dsgn_temps['zn_htg_dsgn_sup_air_temp_c'])
2677
+ rht_coil = OpenstudioStandards::HVAC.create_coil_heating_water(model,
2678
+ hot_water_loop,
2679
+ name: "#{zone.name} Reheat Coil",
2680
+ rated_inlet_water_temperature: hw_temp_c,
2681
+ rated_outlet_water_temperature: (hw_temp_c - hw_delta_t_k),
2682
+ rated_inlet_air_temperature: dsgn_temps['htg_dsgn_sup_air_temp_c'],
2683
+ rated_outlet_air_temperature: dsgn_temps['zn_htg_dsgn_sup_air_temp_c'])
2685
2684
  # VAV terminal
2686
2685
  terminal = OpenStudio::Model::AirTerminalSingleDuctVAVReheat.new(model, model.alwaysOnDiscreteSchedule, rht_coil)
2687
2686
  terminal.setName("#{zone.name} VAV Terminal")
@@ -2800,54 +2799,54 @@ class Standard
2800
2799
  # create heating coil
2801
2800
  case heating_type
2802
2801
  when 'NaturalGas', 'Gas'
2803
- htg_coil = create_coil_heating_gas(model,
2804
- name: "#{air_loop.name} Gas Htg Coil")
2802
+ htg_coil = OpenstudioStandards::HVAC.create_coil_heating_gas(model,
2803
+ name: "#{air_loop.name} Gas Htg Coil")
2805
2804
  when 'Water'
2806
2805
  if hot_water_loop.nil?
2807
2806
  OpenStudio.logFree(OpenStudio::Error, 'openstudio.model.Model', 'No hot water plant loop supplied')
2808
2807
  return false
2809
2808
  end
2810
- htg_coil = create_coil_heating_water(model,
2811
- hot_water_loop,
2812
- name: "#{air_loop.name} Water Htg Coil",
2813
- rated_inlet_water_temperature: hw_temp_c,
2814
- rated_outlet_water_temperature: (hw_temp_c - hw_delta_t_k),
2815
- rated_inlet_air_temperature: dsgn_temps['prehtg_dsgn_sup_air_temp_c'],
2816
- rated_outlet_air_temperature: dsgn_temps['htg_dsgn_sup_air_temp_c'])
2809
+ htg_coil = OpenstudioStandards::HVAC.create_coil_heating_water(model,
2810
+ hot_water_loop,
2811
+ name: "#{air_loop.name} Water Htg Coil",
2812
+ rated_inlet_water_temperature: hw_temp_c,
2813
+ rated_outlet_water_temperature: (hw_temp_c - hw_delta_t_k),
2814
+ rated_inlet_air_temperature: dsgn_temps['prehtg_dsgn_sup_air_temp_c'],
2815
+ rated_outlet_air_temperature: dsgn_temps['htg_dsgn_sup_air_temp_c'])
2817
2816
  when 'Single Speed Heat Pump'
2818
- htg_coil = create_coil_heating_dx_single_speed(model,
2819
- name: "#{zone.name} HP Htg Coil",
2820
- type: 'PSZ-AC',
2821
- cop: 3.3)
2817
+ htg_coil = OpenstudioStandards::HVAC.create_coil_heating_dx_single_speed(model,
2818
+ name: "#{zone.name} HP Htg Coil",
2819
+ type: 'PSZ-AC',
2820
+ cop: 3.3)
2822
2821
  when 'Water To Air Heat Pump'
2823
- htg_coil = create_coil_heating_water_to_air_heat_pump_equation_fit(model,
2824
- hot_water_loop,
2825
- name: "#{air_loop.name} Water-to-Air HP Htg Coil")
2822
+ htg_coil = OpenstudioStandards::HVAC.create_coil_heating_water_to_air_heat_pump_equation_fit(model,
2823
+ hot_water_loop,
2824
+ name: "#{air_loop.name} Water-to-Air HP Htg Coil")
2826
2825
  when 'Electricity', 'Electric'
2827
- htg_coil = create_coil_heating_electric(model,
2828
- name: "#{air_loop.name} Electric Htg Coil")
2826
+ htg_coil = OpenstudioStandards::HVAC.create_coil_heating_electric(model,
2827
+ name: "#{air_loop.name} Electric Htg Coil")
2829
2828
  else
2830
2829
  # zero-capacity, always-off electric heating coil
2831
- htg_coil = create_coil_heating_electric(model,
2832
- name: "#{air_loop.name} No Heat",
2833
- schedule: model.alwaysOffDiscreteSchedule,
2834
- nominal_capacity: 0.0)
2830
+ htg_coil = OpenstudioStandards::HVAC.create_coil_heating_electric(model,
2831
+ name: "#{air_loop.name} No Heat",
2832
+ schedule: model.alwaysOffDiscreteSchedule,
2833
+ nominal_capacity: 0.0)
2835
2834
  end
2836
2835
 
2837
2836
  # create supplemental heating coil
2838
2837
  case supplemental_heating_type
2839
2838
  when 'Electricity', 'Electric'
2840
- supplemental_htg_coil = create_coil_heating_electric(model,
2841
- name: "#{air_loop.name} Electric Backup Htg Coil")
2839
+ supplemental_htg_coil = OpenstudioStandards::HVAC.create_coil_heating_electric(model,
2840
+ name: "#{air_loop.name} Electric Backup Htg Coil")
2842
2841
  when 'NaturalGas', 'Gas'
2843
- supplemental_htg_coil = create_coil_heating_gas(model,
2844
- name: "#{air_loop.name} Gas Backup Htg Coil")
2842
+ supplemental_htg_coil = OpenstudioStandards::HVAC.create_coil_heating_gas(model,
2843
+ name: "#{air_loop.name} Gas Backup Htg Coil")
2845
2844
  else
2846
2845
  # Zero-capacity, always-off electric heating coil
2847
- supplemental_htg_coil = create_coil_heating_electric(model,
2848
- name: "#{air_loop.name} No Heat",
2849
- schedule: model.alwaysOffDiscreteSchedule,
2850
- nominal_capacity: 0.0)
2846
+ supplemental_htg_coil = OpenstudioStandards::HVAC.create_coil_heating_electric(model,
2847
+ name: "#{air_loop.name} No Heat",
2848
+ schedule: model.alwaysOffDiscreteSchedule,
2849
+ nominal_capacity: 0.0)
2851
2850
  end
2852
2851
 
2853
2852
  # create cooling coil
@@ -2857,20 +2856,20 @@ class Standard
2857
2856
  OpenStudio.logFree(OpenStudio::Error, 'openstudio.model.Model', 'No chilled water plant loop supplied')
2858
2857
  return false
2859
2858
  end
2860
- clg_coil = create_coil_cooling_water(model,
2861
- chilled_water_loop,
2862
- name: "#{air_loop.name} Water Clg Coil")
2859
+ clg_coil = OpenstudioStandards::HVAC.create_coil_cooling_water(model,
2860
+ chilled_water_loop,
2861
+ name: "#{air_loop.name} Water Clg Coil")
2863
2862
  when 'Two Speed DX AC'
2864
- clg_coil = create_coil_cooling_dx_two_speed(model,
2865
- name: "#{air_loop.name} 2spd DX AC Clg Coil")
2863
+ clg_coil = OpenstudioStandards::HVAC.create_coil_cooling_dx_two_speed(model,
2864
+ name: "#{air_loop.name} 2spd DX AC Clg Coil")
2866
2865
  when 'Single Speed DX AC'
2867
- clg_coil = create_coil_cooling_dx_single_speed(model,
2868
- name: "#{air_loop.name} 1spd DX AC Clg Coil",
2869
- type: 'PSZ-AC')
2866
+ clg_coil = OpenstudioStandards::HVAC.create_coil_cooling_dx_single_speed(model,
2867
+ name: "#{air_loop.name} 1spd DX AC Clg Coil",
2868
+ type: 'PSZ-AC')
2870
2869
  when 'Single Speed Heat Pump'
2871
- clg_coil = create_coil_cooling_dx_single_speed(model,
2872
- name: "#{air_loop.name} 1spd DX HP Clg Coil",
2873
- type: 'Heat Pump')
2870
+ clg_coil = OpenstudioStandards::HVAC.create_coil_cooling_dx_single_speed(model,
2871
+ name: "#{air_loop.name} 1spd DX HP Clg Coil",
2872
+ type: 'Heat Pump')
2874
2873
  # clg_coil.setMaximumOutdoorDryBulbTemperatureForCrankcaseHeaterOperation(OpenStudio::OptionalDouble.new(10.0))
2875
2874
  # clg_coil.setRatedSensibleHeatRatio(0.69)
2876
2875
  # clg_coil.setBasinHeaterCapacity(10)
@@ -2880,9 +2879,9 @@ class Standard
2880
2879
  OpenStudio.logFree(OpenStudio::Error, 'openstudio.model.Model', 'No chilled water plant loop supplied')
2881
2880
  return false
2882
2881
  end
2883
- clg_coil = create_coil_cooling_water_to_air_heat_pump_equation_fit(model,
2884
- chilled_water_loop,
2885
- name: "#{air_loop.name} Water-to-Air HP Clg Coil")
2882
+ clg_coil = OpenstudioStandards::HVAC.create_coil_cooling_water_to_air_heat_pump_equation_fit(model,
2883
+ chilled_water_loop,
2884
+ name: "#{air_loop.name} Water-to-Air HP Clg Coil")
2886
2885
  else
2887
2886
  clg_coil = nil
2888
2887
  end
@@ -2890,13 +2889,13 @@ class Standard
2890
2889
  # Use a Fan:OnOff in the unitary system object
2891
2890
  case fan_type
2892
2891
  when 'Cycling'
2893
- fan = create_fan_by_name(model,
2894
- 'Packaged_RTU_SZ_AC_Cycling_Fan',
2895
- fan_name: "#{air_loop.name} Fan")
2892
+ fan = OpenstudioStandards::HVAC.create_typical_fan(model,
2893
+ 'Packaged_RTU_SZ_AC_Cycling_Fan',
2894
+ fan_name: "#{air_loop.name} Fan")
2896
2895
  when 'ConstantVolume'
2897
- fan = create_fan_by_name(model,
2898
- 'Packaged_RTU_SZ_AC_CAV_OnOff_Fan',
2899
- fan_name: "#{air_loop.name} Fan")
2896
+ fan = OpenstudioStandards::HVAC.create_typical_fan(model,
2897
+ 'Packaged_RTU_SZ_AC_CAV_OnOff_Fan',
2898
+ fan_name: "#{air_loop.name} Fan")
2900
2899
  else
2901
2900
  OpenStudio.logFree(OpenStudio::Error, 'openstudio.model.Model', 'Invalid fan_type')
2902
2901
  return false
@@ -3073,54 +3072,54 @@ class Standard
3073
3072
 
3074
3073
  # create fan
3075
3074
  # @type [OpenStudio::Model::FanVariableVolume] fan
3076
- fan = create_fan_by_name(model,
3077
- fan_type,
3078
- fan_name: "#{air_loop.name} Fan",
3079
- end_use_subcategory: 'VAV System Fans')
3075
+ fan = OpenstudioStandards::HVAC.create_typical_fan(model,
3076
+ fan_type,
3077
+ fan_name: "#{air_loop.name} Fan",
3078
+ end_use_subcategory: 'VAV System Fans')
3080
3079
  fan.setAvailabilitySchedule(hvac_op_sch)
3081
3080
 
3082
3081
  # create heating coil
3083
3082
  case heating_type
3084
3083
  when 'NaturalGas', 'Gas'
3085
- htg_coil = create_coil_heating_gas(model,
3086
- name: "#{air_loop.name} Gas Htg Coil")
3084
+ htg_coil = OpenstudioStandards::HVAC.create_coil_heating_gas(model,
3085
+ name: "#{air_loop.name} Gas Htg Coil")
3087
3086
  when 'Electricity', 'Electric'
3088
- htg_coil = create_coil_heating_electric(model,
3089
- name: "#{air_loop.name} Electric Htg Coil")
3087
+ htg_coil = OpenstudioStandards::HVAC.create_coil_heating_electric(model,
3088
+ name: "#{air_loop.name} Electric Htg Coil")
3090
3089
  when 'Water'
3091
- htg_coil = create_coil_heating_water(model,
3092
- hot_water_loop,
3093
- name: "#{air_loop.name} Water Htg Coil")
3090
+ htg_coil = OpenstudioStandards::HVAC.create_coil_heating_water(model,
3091
+ hot_water_loop,
3092
+ name: "#{air_loop.name} Water Htg Coil")
3094
3093
  else
3095
3094
  # Zero-capacity, always-off electric heating coil
3096
- htg_coil = create_coil_heating_electric(model,
3097
- name: "#{air_loop.name} No Heat",
3098
- schedule: model.alwaysOffDiscreteSchedule,
3099
- nominal_capacity: 0.0)
3095
+ htg_coil = OpenstudioStandards::HVAC.create_coil_heating_electric(model,
3096
+ name: "#{air_loop.name} No Heat",
3097
+ schedule: model.alwaysOffDiscreteSchedule,
3098
+ nominal_capacity: 0.0)
3100
3099
  end
3101
3100
 
3102
3101
  # create supplemental heating coil
3103
3102
  case supplemental_heating_type
3104
3103
  when 'Electricity', 'Electric'
3105
- supplemental_htg_coil = create_coil_heating_electric(model,
3106
- name: "#{air_loop.name} Electric Backup Htg Coil")
3104
+ supplemental_htg_coil = OpenstudioStandards::HVAC.create_coil_heating_electric(model,
3105
+ name: "#{air_loop.name} Electric Backup Htg Coil")
3107
3106
  when 'NaturalGas', 'Gas'
3108
- supplemental_htg_coil = create_coil_heating_gas(model,
3109
- name: "#{air_loop.name} Gas Backup Htg Coil")
3107
+ supplemental_htg_coil = OpenstudioStandards::HVAC.create_coil_heating_gas(model,
3108
+ name: "#{air_loop.name} Gas Backup Htg Coil")
3110
3109
  else
3111
3110
  # zero-capacity, always-off electric heating coil
3112
- supplemental_htg_coil = create_coil_heating_electric(model,
3113
- name: "#{air_loop.name} No Backup Heat",
3114
- schedule: model.alwaysOffDiscreteSchedule,
3115
- nominal_capacity: 0.0)
3111
+ supplemental_htg_coil = OpenstudioStandards::HVAC.create_coil_heating_electric(model,
3112
+ name: "#{air_loop.name} No Backup Heat",
3113
+ schedule: model.alwaysOffDiscreteSchedule,
3114
+ nominal_capacity: 0.0)
3116
3115
  end
3117
3116
 
3118
3117
  # create cooling coil
3119
3118
  case cooling_type
3120
3119
  when 'WaterCooled'
3121
- clg_coil = create_coil_cooling_water(model,
3122
- chilled_water_loop,
3123
- name: "#{air_loop.name} Clg Coil")
3120
+ clg_coil = OpenstudioStandards::HVAC.create_coil_cooling_water(model,
3121
+ chilled_water_loop,
3122
+ name: "#{air_loop.name} Clg Coil")
3124
3123
  else # 'AirCooled'
3125
3124
  clg_coil = OpenStudio::Model::CoilCoolingDXVariableSpeed.new(model)
3126
3125
  clg_coil.setName("#{air_loop.name} Var spd DX AC Clg Coil")
@@ -3291,19 +3290,19 @@ class Standard
3291
3290
  # add the components to the air loop in order from closest to zone to furthest from zone
3292
3291
  if main_data_center
3293
3292
  # extra water heating coil
3294
- create_coil_heating_water(model,
3295
- hot_water_loop,
3296
- air_loop_node: air_loop.supplyInletNode,
3297
- name: "#{air_loop.name} Water Htg Coil",
3298
- rated_inlet_water_temperature: hw_temp_c,
3299
- rated_outlet_water_temperature: (hw_temp_c - hw_delta_t_k),
3300
- rated_inlet_air_temperature: dsgn_temps['prehtg_dsgn_sup_air_temp_c'],
3301
- rated_outlet_air_temperature: dsgn_temps['htg_dsgn_sup_air_temp_c'])
3293
+ OpenstudioStandards::HVAC.create_coil_heating_water(model,
3294
+ hot_water_loop,
3295
+ air_loop_node: air_loop.supplyInletNode,
3296
+ name: "#{air_loop.name} Water Htg Coil",
3297
+ rated_inlet_water_temperature: hw_temp_c,
3298
+ rated_outlet_water_temperature: (hw_temp_c - hw_delta_t_k),
3299
+ rated_inlet_air_temperature: dsgn_temps['prehtg_dsgn_sup_air_temp_c'],
3300
+ rated_outlet_air_temperature: dsgn_temps['htg_dsgn_sup_air_temp_c'])
3302
3301
 
3303
3302
  # extra electric heating coil
3304
- create_coil_heating_electric(model,
3305
- air_loop_node: air_loop.supplyInletNode,
3306
- name: "#{air_loop.name} Electric Htg Coil")
3303
+ OpenstudioStandards::HVAC.create_coil_heating_electric(model,
3304
+ air_loop_node: air_loop.supplyInletNode,
3305
+ name: "#{air_loop.name} Electric Htg Coil")
3307
3306
 
3308
3307
  # humidity controllers
3309
3308
  humidifier = OpenStudio::Model::HumidifierSteamElectric.new(model)
@@ -3321,20 +3320,20 @@ class Standard
3321
3320
 
3322
3321
  # create fan
3323
3322
  # @type [OpenStudio::Model::FanConstantVolume]
3324
- fan = create_fan_by_name(model,
3325
- 'Packaged_RTU_SZ_AC_Cycling_Fan',
3326
- fan_name: "#{air_loop.name} Fan")
3323
+ fan = OpenstudioStandards::HVAC.create_typical_fan(model,
3324
+ 'Packaged_RTU_SZ_AC_Cycling_Fan',
3325
+ fan_name: "#{air_loop.name} Fan")
3327
3326
  fan.setAvailabilitySchedule(hvac_op_sch)
3328
3327
 
3329
3328
  # create heating and cooling coils
3330
- htg_coil = create_coil_heating_water_to_air_heat_pump_equation_fit(model,
3331
- heat_pump_loop,
3332
- name: "#{air_loop.name} Water-to-Air HP Htg Coil")
3333
- clg_coil = create_coil_cooling_water_to_air_heat_pump_equation_fit(model,
3334
- heat_pump_loop,
3335
- name: "#{air_loop.name} Water-to-Air HP Clg Coil")
3336
- supplemental_htg_coil = create_coil_heating_electric(model,
3337
- name: "#{air_loop.name} Electric Backup Htg Coil")
3329
+ htg_coil = OpenstudioStandards::HVAC.create_coil_heating_water_to_air_heat_pump_equation_fit(model,
3330
+ heat_pump_loop,
3331
+ name: "#{air_loop.name} Water-to-Air HP Htg Coil")
3332
+ clg_coil = OpenstudioStandards::HVAC.create_coil_cooling_water_to_air_heat_pump_equation_fit(model,
3333
+ heat_pump_loop,
3334
+ name: "#{air_loop.name} Water-to-Air HP Clg Coil")
3335
+ supplemental_htg_coil = OpenstudioStandards::HVAC.create_coil_heating_electric(model,
3336
+ name: "#{air_loop.name} Electric Backup Htg Coil")
3338
3337
 
3339
3338
  # wrap fan and coils in a unitary system object
3340
3339
  unitary_system = OpenStudio::Model::AirLoopHVACUnitarySystem.new(model)
@@ -3457,19 +3456,19 @@ class Standard
3457
3456
  # Cycling: Unitary System
3458
3457
  # CyclingHeatPump: Unitary Heat Pump system
3459
3458
  if fan_type == 'VariableVolume'
3460
- fan = create_fan_by_name(model,
3461
- 'CRAC_VAV_fan',
3462
- fan_name: "#{air_loop.name} Fan")
3459
+ fan = OpenstudioStandards::HVAC.create_typical_fan(model,
3460
+ 'CRAC_VAV_fan',
3461
+ fan_name: "#{air_loop.name} Fan")
3463
3462
  fan.setAvailabilitySchedule(hvac_op_sch)
3464
3463
  elsif fan_type == 'ConstantVolume'
3465
- fan = create_fan_by_name(model,
3466
- 'CRAC_CAV_fan',
3467
- fan_name: "#{air_loop.name} Fan")
3464
+ fan = OpenstudioStandards::HVAC.create_typical_fan(model,
3465
+ 'CRAC_CAV_fan',
3466
+ fan_name: "#{air_loop.name} Fan")
3468
3467
  fan.setAvailabilitySchedule(hvac_op_sch)
3469
3468
  elsif fan_type == 'Cycling'
3470
- fan = create_fan_by_name(model,
3471
- 'CRAC_Cycling_fan',
3472
- fan_name: "#{air_loop.name} Fan")
3469
+ fan = OpenstudioStandards::HVAC.create_typical_fan(model,
3470
+ 'CRAC_Cycling_fan',
3471
+ fan_name: "#{air_loop.name} Fan")
3473
3472
  fan.setAvailabilitySchedule(hvac_op_sch)
3474
3473
  else
3475
3474
  OpenStudio.logFree(OpenStudio::Error, 'openstudio.Model.Model', "Fan type '#{fan_type}' not recognized, cannot add CRAC.")
@@ -3479,12 +3478,12 @@ class Standard
3479
3478
  # create cooling coil
3480
3479
  case cooling_type
3481
3480
  when 'Two Speed DX AC'
3482
- clg_coil = create_coil_cooling_dx_two_speed(model,
3483
- name: "#{air_loop.name} 2spd DX AC Clg Coil")
3481
+ clg_coil = OpenstudioStandards::HVAC.create_coil_cooling_dx_two_speed(model,
3482
+ name: "#{air_loop.name} 2spd DX AC Clg Coil")
3484
3483
  when 'Single Speed DX AC'
3485
- clg_coil = create_coil_cooling_dx_single_speed(model,
3486
- name: "#{air_loop.name} 1spd DX AC Clg Coil",
3487
- type: 'PSZ-AC')
3484
+ clg_coil = OpenstudioStandards::HVAC.create_coil_cooling_dx_single_speed(model,
3485
+ name: "#{air_loop.name} 1spd DX AC Clg Coil",
3486
+ type: 'PSZ-AC')
3488
3487
  else
3489
3488
  clg_coil = nil
3490
3489
  end
@@ -3671,9 +3670,9 @@ class Standard
3671
3670
  setpoint_mgr_cooling.addToNode(air_loop.supplyOutletNode)
3672
3671
 
3673
3672
  # create fan
3674
- fan = create_fan_by_name(model,
3675
- 'VAV_System_Fan',
3676
- fan_name: "#{air_loop.name} Fan")
3673
+ fan = OpenstudioStandards::HVAC.create_typical_fan(model,
3674
+ 'VAV_System_Fan',
3675
+ fan_name: "#{air_loop.name} Fan")
3677
3676
  fan.setAvailabilitySchedule(hvac_op_sch)
3678
3677
  fan.addToNode(air_loop.supplyInletNode)
3679
3678
 
@@ -3689,11 +3688,11 @@ class Standard
3689
3688
  OpenStudio.logFree(OpenStudio::Error, 'openstudio.model.Model', 'No chilled water plant loop supplied for CRAH system')
3690
3689
  return false
3691
3690
  else
3692
- create_coil_cooling_water(model,
3693
- chilled_water_loop,
3694
- air_loop_node: air_loop.supplyInletNode,
3695
- name: "#{air_loop.name} Water Clg Coil",
3696
- schedule: hvac_op_sch)
3691
+ OpenstudioStandards::HVAC.create_coil_cooling_water(model,
3692
+ chilled_water_loop,
3693
+ air_loop_node: air_loop.supplyInletNode,
3694
+ name: "#{air_loop.name} Water Clg Coil",
3695
+ schedule: hvac_op_sch)
3697
3696
  end
3698
3697
 
3699
3698
  # outdoor air intake system
@@ -3815,16 +3814,16 @@ class Standard
3815
3814
  # create fan
3816
3815
  fan = nil
3817
3816
  if fan_type == 'ConstantVolume'
3818
- fan = create_fan_by_name(model,
3819
- 'Split_AC_CAV_Fan',
3820
- fan_name: "#{air_loop.name} Fan",
3821
- end_use_subcategory: 'CAV System Fans')
3817
+ fan = OpenstudioStandards::HVAC.create_typical_fan(model,
3818
+ 'Split_AC_CAV_Fan',
3819
+ fan_name: "#{air_loop.name} Fan",
3820
+ end_use_subcategory: 'CAV System Fans')
3822
3821
  fan.setAvailabilitySchedule(model.alwaysOnDiscreteSchedule)
3823
3822
  elsif fan_type == 'Cycling'
3824
- fan = create_fan_by_name(model,
3825
- 'Split_AC_Cycling_Fan',
3826
- fan_name: "#{air_loop.name} Fan",
3827
- end_use_subcategory: 'CAV System Fans')
3823
+ fan = OpenstudioStandards::HVAC.create_typical_fan(model,
3824
+ 'Split_AC_Cycling_Fan',
3825
+ fan_name: "#{air_loop.name} Fan",
3826
+ end_use_subcategory: 'CAV System Fans')
3828
3827
  fan.setAvailabilitySchedule(model.alwaysOnDiscreteSchedule)
3829
3828
  else
3830
3829
  OpenStudio.logFree(OpenStudio::Error, 'openstudio.Model.Model', "fan_type #{fan_type} invalid for split AC system.")
@@ -3833,20 +3832,20 @@ class Standard
3833
3832
 
3834
3833
  # create supplemental heating coil
3835
3834
  if supplemental_heating_type == 'Electric'
3836
- create_coil_heating_electric(model,
3837
- air_loop_node: air_loop.supplyInletNode,
3838
- name: "#{air_loop.name} Electric Backup Htg Coil")
3835
+ OpenstudioStandards::HVAC.create_coil_heating_electric(model,
3836
+ air_loop_node: air_loop.supplyInletNode,
3837
+ name: "#{air_loop.name} Electric Backup Htg Coil")
3839
3838
  elsif supplemental_heating_type == 'Gas'
3840
- create_coil_heating_gas(model,
3841
- air_loop_node: air_loop.supplyInletNode,
3842
- name: "#{air_loop.name} Gas Backup Htg Coil")
3839
+ OpenstudioStandards::HVAC.create_coil_heating_gas(model,
3840
+ air_loop_node: air_loop.supplyInletNode,
3841
+ name: "#{air_loop.name} Gas Backup Htg Coil")
3843
3842
  end
3844
3843
 
3845
3844
  # create heating coil
3846
3845
  if heating_type == 'Gas'
3847
- htg_coil = create_coil_heating_gas(model,
3848
- air_loop_node: air_loop.supplyInletNode,
3849
- name: "#{air_loop.name} Gas Htg Coil")
3846
+ htg_coil = OpenstudioStandards::HVAC.create_coil_heating_gas(model,
3847
+ air_loop_node: air_loop.supplyInletNode,
3848
+ name: "#{air_loop.name} Gas Htg Coil")
3850
3849
  htg_part_load_fraction_correlation = OpenStudio::Model::CurveCubic.new(model)
3851
3850
  htg_part_load_fraction_correlation.setCoefficient1Constant(0.8)
3852
3851
  htg_part_load_fraction_correlation.setCoefficient2x(0.2)
@@ -3856,24 +3855,24 @@ class Standard
3856
3855
  htg_part_load_fraction_correlation.setMaximumValueofx(1.0)
3857
3856
  htg_coil.setPartLoadFractionCorrelationCurve(htg_part_load_fraction_correlation)
3858
3857
  elsif heating_type == 'Single Speed Heat Pump'
3859
- create_coil_heating_dx_single_speed(model,
3860
- air_loop_node: air_loop.supplyInletNode,
3861
- name: "#{air_loop.name} HP Htg Coil")
3858
+ OpenstudioStandards::HVAC.create_coil_heating_dx_single_speed(model,
3859
+ air_loop_node: air_loop.supplyInletNode,
3860
+ name: "#{air_loop.name} HP Htg Coil")
3862
3861
  end
3863
3862
 
3864
3863
  # create cooling coil
3865
3864
  if cooling_type == 'Two Speed DX AC'
3866
- create_coil_cooling_dx_two_speed(model,
3867
- air_loop_node: air_loop.supplyInletNode,
3868
- name: "#{air_loop.name} 2spd DX AC Clg Coil")
3865
+ OpenstudioStandards::HVAC.create_coil_cooling_dx_two_speed(model,
3866
+ air_loop_node: air_loop.supplyInletNode,
3867
+ name: "#{air_loop.name} 2spd DX AC Clg Coil")
3869
3868
  elsif cooling_type == 'Single Speed DX AC'
3870
- create_coil_cooling_dx_single_speed(model,
3869
+ OpenstudioStandards::HVAC.create_coil_cooling_dx_single_speed(model,
3871
3870
  air_loop_node: air_loop.supplyInletNode,
3872
3871
  name: "#{air_loop.name} 1spd DX AC Clg Coil", type: 'Split AC')
3873
3872
  elsif cooling_type == 'Single Speed Heat Pump'
3874
- create_coil_cooling_dx_single_speed(model,
3875
- air_loop_node: air_loop.supplyInletNode,
3876
- name: "#{air_loop.name} 1spd DX HP Clg Coil", type: 'Heat Pump')
3873
+ OpenstudioStandards::HVAC.create_coil_cooling_dx_single_speed(model,
3874
+ air_loop_node: air_loop.supplyInletNode,
3875
+ name: "#{air_loop.name} 1spd DX HP Clg Coil", type: 'Heat Pump')
3877
3876
  end
3878
3877
 
3879
3878
  # create outdoor air controller
@@ -3953,9 +3952,9 @@ class Standard
3953
3952
  # create heating coil
3954
3953
  case heating_type
3955
3954
  when 'Single Speed DX'
3956
- htg_coil = create_coil_heating_dx_single_speed(model,
3957
- name: "#{air_loop.name} Heating Coil",
3958
- type: 'Residential Minisplit HP')
3955
+ htg_coil = OpenstudioStandards::HVAC.create_coil_heating_dx_single_speed(model,
3956
+ name: "#{air_loop.name} Heating Coil",
3957
+ type: 'Residential Minisplit HP')
3959
3958
  htg_coil.setMinimumOutdoorDryBulbTemperatureforCompressorOperation(OpenStudio.convert(-30.0, 'F', 'C').get)
3960
3959
  htg_coil.setMaximumOutdoorDryBulbTemperatureforDefrostOperation(OpenStudio.convert(40.0, 'F', 'C').get)
3961
3960
  htg_coil.setCrankcaseHeaterCapacity(0)
@@ -3968,31 +3967,31 @@ class Standard
3968
3967
  end
3969
3968
 
3970
3969
  # create backup heating coil
3971
- supplemental_htg_coil = create_coil_heating_electric(model,
3972
- name: "#{air_loop.name} Electric Backup Htg Coil")
3970
+ supplemental_htg_coil = OpenstudioStandards::HVAC.create_coil_heating_electric(model,
3971
+ name: "#{air_loop.name} Electric Backup Htg Coil")
3973
3972
 
3974
3973
  # create cooling coil
3975
3974
  case cooling_type
3976
3975
  when 'Two Speed DX AC'
3977
- clg_coil = create_coil_cooling_dx_two_speed(model,
3978
- name: "#{air_loop.name} 2spd DX AC Clg Coil",
3979
- type: 'Residential Minisplit HP')
3976
+ clg_coil = OpenstudioStandards::HVAC.create_coil_cooling_dx_two_speed(model,
3977
+ name: "#{air_loop.name} 2spd DX AC Clg Coil",
3978
+ type: 'Residential Minisplit HP')
3980
3979
  when 'Single Speed DX AC'
3981
- clg_coil = create_coil_cooling_dx_single_speed(model,
3982
- name: "#{air_loop.name} 1spd DX AC Clg Coil", type: 'Split AC')
3980
+ clg_coil = OpenstudioStandards::HVAC.create_coil_cooling_dx_single_speed(model,
3981
+ name: "#{air_loop.name} 1spd DX AC Clg Coil", type: 'Split AC')
3983
3982
  when 'Single Speed Heat Pump'
3984
- clg_coil = create_coil_cooling_dx_single_speed(model,
3985
- name: "#{air_loop.name} 1spd DX HP Clg Coil", type: 'Heat Pump')
3983
+ clg_coil = OpenstudioStandards::HVAC.create_coil_cooling_dx_single_speed(model,
3984
+ name: "#{air_loop.name} 1spd DX HP Clg Coil", type: 'Heat Pump')
3986
3985
  else
3987
3986
  OpenStudio.logFree(OpenStudio::Warn, 'openstudio.Model.Model', "No cooling coil type selected for minisplit HP for #{zone.name}.")
3988
3987
  clg_coil = nil
3989
3988
  end
3990
3989
 
3991
3990
  # create fan
3992
- fan = create_fan_by_name(model,
3993
- 'Minisplit_HP_Fan',
3994
- fan_name: "#{air_loop.name} Fan",
3995
- end_use_subcategory: 'Minisplit HP Fans')
3991
+ fan = OpenstudioStandards::HVAC.create_typical_fan(model,
3992
+ 'Minisplit_HP_Fan',
3993
+ fan_name: "#{air_loop.name} Fan",
3994
+ end_use_subcategory: 'Minisplit HP Fans')
3996
3995
  fan.setAvailabilitySchedule(hvac_op_sch)
3997
3996
 
3998
3997
  # create unitary system (holds the coils and fan)
@@ -4070,13 +4069,13 @@ class Standard
4070
4069
 
4071
4070
  # add fan
4072
4071
  if fan_type == 'ConstantVolume'
4073
- fan = create_fan_by_name(model,
4074
- 'PTAC_CAV_Fan',
4075
- fan_name: "#{zone.name} PTAC Fan")
4072
+ fan = OpenstudioStandards::HVAC.create_typical_fan(model,
4073
+ 'PTAC_CAV_Fan',
4074
+ fan_name: "#{zone.name} PTAC Fan")
4076
4075
  elsif fan_type == 'Cycling'
4077
- fan = create_fan_by_name(model,
4078
- 'PTAC_Cycling_Fan',
4079
- fan_name: "#{zone.name} PTAC Fan")
4076
+ fan = OpenstudioStandards::HVAC.create_typical_fan(model,
4077
+ 'PTAC_Cycling_Fan',
4078
+ fan_name: "#{zone.name} PTAC Fan")
4080
4079
  else
4081
4080
  OpenStudio.logFree(OpenStudio::Error, 'openstudio.model.Model', "ptac_fan_type of #{fan_type} is not recognized.")
4082
4081
  end
@@ -4085,38 +4084,38 @@ class Standard
4085
4084
  # add heating coil
4086
4085
  case heating_type
4087
4086
  when 'NaturalGas', 'Gas'
4088
- htg_coil = create_coil_heating_gas(model,
4089
- name: "#{zone.name} PTAC Gas Htg Coil")
4087
+ htg_coil = OpenstudioStandards::HVAC.create_coil_heating_gas(model,
4088
+ name: "#{zone.name} PTAC Gas Htg Coil")
4090
4089
  when 'Electricity', 'Electric'
4091
- htg_coil = create_coil_heating_electric(model,
4092
- name: "#{zone.name} PTAC Electric Htg Coil")
4090
+ htg_coil = OpenstudioStandards::HVAC.create_coil_heating_electric(model,
4091
+ name: "#{zone.name} PTAC Electric Htg Coil")
4093
4092
  when nil
4094
- htg_coil = create_coil_heating_electric(model,
4095
- name: "#{zone.name} PTAC No Heat",
4096
- schedule: model.alwaysOffDiscreteSchedule,
4097
- nominal_capacity: 0)
4093
+ htg_coil = OpenstudioStandards::HVAC.create_coil_heating_electric(model,
4094
+ name: "#{zone.name} PTAC No Heat",
4095
+ schedule: model.alwaysOffDiscreteSchedule,
4096
+ nominal_capacity: 0)
4098
4097
  when 'Water'
4099
4098
  if hot_water_loop.nil?
4100
4099
  OpenStudio.logFree(OpenStudio::Error, 'openstudio.model.Model', 'No hot water plant loop supplied')
4101
4100
  return false
4102
4101
  end
4103
- htg_coil = create_coil_heating_water(model,
4104
- hot_water_loop,
4105
- name: "#{hot_water_loop.name} Water Htg Coil",
4106
- rated_inlet_water_temperature: hw_temp_c,
4107
- rated_outlet_water_temperature: (hw_temp_c - hw_delta_t_k))
4102
+ htg_coil = OpenstudioStandards::HVAC.create_coil_heating_water(model,
4103
+ hot_water_loop,
4104
+ name: "#{hot_water_loop.name} Water Htg Coil",
4105
+ rated_inlet_water_temperature: hw_temp_c,
4106
+ rated_outlet_water_temperature: (hw_temp_c - hw_delta_t_k))
4108
4107
  else
4109
4108
  OpenStudio.logFree(OpenStudio::Error, 'openstudio.model.Model', "ptac_heating_type of #{heating_type} is not recognized.")
4110
4109
  end
4111
4110
 
4112
4111
  # add cooling coil
4113
4112
  if cooling_type == 'Two Speed DX AC'
4114
- clg_coil = create_coil_cooling_dx_two_speed(model,
4115
- name: "#{zone.name} PTAC 2spd DX AC Clg Coil")
4113
+ clg_coil = OpenstudioStandards::HVAC.create_coil_cooling_dx_two_speed(model,
4114
+ name: "#{zone.name} PTAC 2spd DX AC Clg Coil")
4116
4115
  elsif cooling_type == 'Single Speed DX AC'
4117
- clg_coil = create_coil_cooling_dx_single_speed(model,
4118
- name: "#{zone.name} PTAC 1spd DX AC Clg Coil",
4119
- type: 'PTAC')
4116
+ clg_coil = OpenstudioStandards::HVAC.create_coil_cooling_dx_single_speed(model,
4117
+ name: "#{zone.name} PTAC 1spd DX AC Clg Coil",
4118
+ type: 'PTAC')
4120
4119
  else
4121
4120
  OpenStudio.logFree(OpenStudio::Error, 'openstudio.model.Model', "ptac_cooling_type of #{cooling_type} is not recognized.")
4122
4121
  end
@@ -4182,13 +4181,13 @@ class Standard
4182
4181
 
4183
4182
  # add fan
4184
4183
  if fan_type == 'ConstantVolume'
4185
- fan = create_fan_by_name(model,
4186
- 'PTAC_CAV_Fan',
4187
- fan_name: "#{zone.name} PTHP Fan")
4184
+ fan = OpenstudioStandards::HVAC.create_typical_fan(model,
4185
+ 'PTAC_CAV_Fan',
4186
+ fan_name: "#{zone.name} PTHP Fan")
4188
4187
  elsif fan_type == 'Cycling'
4189
- fan = create_fan_by_name(model,
4190
- 'PTAC_Cycling_Fan',
4191
- fan_name: "#{zone.name} PTHP Fan")
4188
+ fan = OpenstudioStandards::HVAC.create_typical_fan(model,
4189
+ 'PTAC_Cycling_Fan',
4190
+ fan_name: "#{zone.name} PTHP Fan")
4192
4191
  else
4193
4192
  OpenStudio.logFree(OpenStudio::Error, 'openstudio.model.Model', "PTHP fan_type of #{fan_type} is not recognized.")
4194
4193
  return false
@@ -4196,15 +4195,15 @@ class Standard
4196
4195
  fan.setAvailabilitySchedule(model.alwaysOnDiscreteSchedule)
4197
4196
 
4198
4197
  # add heating coil
4199
- htg_coil = create_coil_heating_dx_single_speed(model,
4200
- name: "#{zone.name} PTHP Htg Coil")
4198
+ htg_coil = OpenstudioStandards::HVAC.create_coil_heating_dx_single_speed(model,
4199
+ name: "#{zone.name} PTHP Htg Coil")
4201
4200
  # add cooling coil
4202
- clg_coil = create_coil_cooling_dx_single_speed(model,
4203
- name: "#{zone.name} PTHP Clg Coil",
4204
- type: 'Heat Pump')
4201
+ clg_coil = OpenstudioStandards::HVAC.create_coil_cooling_dx_single_speed(model,
4202
+ name: "#{zone.name} PTHP Clg Coil",
4203
+ type: 'Heat Pump')
4205
4204
  # supplemental heating coil
4206
- supplemental_htg_coil = create_coil_heating_electric(model,
4207
- name: "#{zone.name} PTHP Supplemental Htg Coil")
4205
+ supplemental_htg_coil = OpenstudioStandards::HVAC.create_coil_heating_electric(model,
4206
+ name: "#{zone.name} PTHP Supplemental Htg Coil")
4208
4207
  # wrap coils in a PTHP system
4209
4208
  pthp_system = OpenStudio::Model::ZoneHVACPackagedTerminalHeatPump.new(model,
4210
4209
  model.alwaysOnDiscreteSchedule,
@@ -4287,21 +4286,21 @@ class Standard
4287
4286
  sizing_zone.setZoneHeatingDesignSupplyAirTemperature(dsgn_temps['zn_htg_dsgn_sup_air_temp_c'])
4288
4287
 
4289
4288
  # add fan
4290
- fan = create_fan_by_name(model,
4291
- 'Unit_Heater_Fan',
4292
- fan_name: "#{zone.name} UnitHeater Fan",
4293
- pressure_rise: fan_pressure_rise)
4289
+ fan = OpenstudioStandards::HVAC.create_typical_fan(model,
4290
+ 'Unit_Heater_Fan',
4291
+ fan_name: "#{zone.name} UnitHeater Fan",
4292
+ pressure_rise: fan_pressure_rise)
4294
4293
  fan.setAvailabilitySchedule(hvac_op_sch)
4295
4294
 
4296
4295
  # add heating coil
4297
4296
  if heating_type == 'NaturalGas' || heating_type == 'Gas'
4298
- htg_coil = create_coil_heating_gas(model,
4299
- name: "#{zone.name} UnitHeater Gas Htg Coil",
4300
- schedule: hvac_op_sch)
4297
+ htg_coil = OpenstudioStandards::HVAC.create_coil_heating_gas(model,
4298
+ name: "#{zone.name} UnitHeater Gas Htg Coil",
4299
+ schedule: hvac_op_sch)
4301
4300
  elsif heating_type == 'Electricity' || heating_type == 'Electric'
4302
- htg_coil = create_coil_heating_electric(model,
4303
- name: "#{zone.name} UnitHeater Electric Htg Coil",
4304
- schedule: hvac_op_sch)
4301
+ htg_coil = OpenstudioStandards::HVAC.create_coil_heating_electric(model,
4302
+ name: "#{zone.name} UnitHeater Electric Htg Coil",
4303
+ schedule: hvac_op_sch)
4305
4304
  elsif heating_type.include?('DistrictHeating') && !hot_water_loop.nil?
4306
4305
  # control temperature for hot water loop
4307
4306
  if rated_inlet_water_temperature.nil?
@@ -4324,13 +4323,13 @@ class Standard
4324
4323
  else
4325
4324
  rated_outlet_air_temperature_c = OpenStudio.convert(rated_outlet_air_temperature, 'F', 'C').get
4326
4325
  end
4327
- htg_coil = create_coil_heating_water(model,
4328
- hot_water_loop,
4329
- name: "#{zone.name} UnitHeater Water Htg Coil",
4330
- rated_inlet_water_temperature: rated_inlet_water_temperature_c,
4331
- rated_outlet_water_temperature: rated_outlet_water_temperature_c,
4332
- rated_inlet_air_temperature: rated_inlet_air_temperature_c,
4333
- rated_outlet_air_temperature: rated_outlet_air_temperature_c)
4326
+ htg_coil = OpenstudioStandards::HVAC.create_coil_heating_water(model,
4327
+ hot_water_loop,
4328
+ name: "#{zone.name} UnitHeater Water Htg Coil",
4329
+ rated_inlet_water_temperature: rated_inlet_water_temperature_c,
4330
+ rated_outlet_water_temperature: rated_outlet_water_temperature_c,
4331
+ rated_inlet_air_temperature: rated_inlet_air_temperature_c,
4332
+ rated_outlet_air_temperature: rated_outlet_air_temperature_c)
4334
4333
  else
4335
4334
  OpenStudio.logFree(OpenStudio::Error, 'openstudio.Model.Model', 'No heating type was found when adding unit heater; no unit heater will be created.')
4336
4335
  return false
@@ -4469,20 +4468,20 @@ class Standard
4469
4468
  # Create a sensor to read the zone load
4470
4469
  zn_load_sensor = OpenStudio::Model::EnergyManagementSystemSensor.new(model,
4471
4470
  'Zone Predicted Sensible Load to Cooling Setpoint Heat Transfer Rate')
4472
- zn_load_sensor.setName("#{ems_friendly_name(zone_name_clean)} Clg Load Sensor")
4471
+ zn_load_sensor.setName("#{OpenstudioStandards::HVAC.ems_friendly_name(zone_name_clean)} Clg Load Sensor")
4473
4472
  zn_load_sensor.setKeyName(zone.handle.to_s)
4474
4473
 
4475
4474
  # Create an actuator to set the airloop availability
4476
4475
  air_loop_avail_actuator = OpenStudio::Model::EnergyManagementSystemActuator.new(air_loop_avail_sch,
4477
4476
  'Schedule:Constant',
4478
4477
  'Schedule Value')
4479
- air_loop_avail_actuator.setName("#{ems_friendly_name(air_loop.name)} Availability Actuator")
4478
+ air_loop_avail_actuator.setName("#{OpenstudioStandards::HVAC.ems_friendly_name(air_loop.name)} Availability Actuator")
4480
4479
 
4481
4480
  # Create a program to turn on Evap Cooler if
4482
4481
  # there is a cooling load in the target zone.
4483
4482
  # Load < 0.0 is a cooling load.
4484
4483
  avail_program = OpenStudio::Model::EnergyManagementSystemProgram.new(model)
4485
- avail_program.setName("#{ems_friendly_name(air_loop.name)} Availability Control")
4484
+ avail_program.setName("#{OpenstudioStandards::HVAC.ems_friendly_name(air_loop.name)} Availability Control")
4486
4485
  avail_program_body = <<-EMS
4487
4486
  IF #{zn_load_sensor.handle} < 0.0
4488
4487
  SET #{air_loop_avail_actuator.handle} = 1
@@ -4508,15 +4507,15 @@ class Standard
4508
4507
  evap.addToNode(air_loop.supplyInletNode)
4509
4508
 
4510
4509
  # Fan (cycling), must be inside unitary system to cycle on airloop
4511
- fan = create_fan_by_name(model,
4512
- 'Evap_Cooler_Supply_Fan',
4513
- fan_name: "#{zone.name} Evap Cooler Supply Fan")
4510
+ fan = OpenstudioStandards::HVAC.create_typical_fan(model,
4511
+ 'Evap_Cooler_Supply_Fan',
4512
+ fan_name: "#{zone.name} Evap Cooler Supply Fan")
4514
4513
  fan.setAvailabilitySchedule(model.alwaysOnDiscreteSchedule)
4515
4514
 
4516
4515
  # Dummy zero-capacity cooling coil
4517
- clg_coil = create_coil_cooling_dx_single_speed(model,
4518
- name: 'Dummy Always Off DX Coil',
4519
- schedule: model.alwaysOffDiscreteSchedule)
4516
+ clg_coil = OpenstudioStandards::HVAC.create_coil_cooling_dx_single_speed(model,
4517
+ name: 'Dummy Always Off DX Coil',
4518
+ schedule: model.alwaysOffDiscreteSchedule)
4520
4519
  unitary_system = OpenStudio::Model::AirLoopHVACUnitarySystem.new(model)
4521
4520
  unitary_system.setName("#{zone.name} Evap Cooler Cycling Fan")
4522
4521
  unitary_system.setSupplyFan(fan)
@@ -4624,9 +4623,9 @@ class Standard
4624
4623
 
4625
4624
  # create vrf outdoor unit
4626
4625
  master_zone = thermal_zones[0]
4627
- vrf_outdoor_unit = create_air_conditioner_variable_refrigerant_flow(model,
4628
- name: "#{thermal_zones.size} Zone VRF System",
4629
- master_zone: master_zone)
4626
+ vrf_outdoor_unit = OpenstudioStandards::HVAC.create_air_conditioner_variable_refrigerant_flow(model,
4627
+ name: "#{thermal_zones.size} Zone VRF System",
4628
+ master_zone: master_zone)
4630
4629
 
4631
4630
  # default design temperatures used across all air loops
4632
4631
  dsgn_temps = standard_design_sizing_temperatures
@@ -4699,38 +4698,38 @@ class Standard
4699
4698
  sizing_zone.setZoneHeatingDesignSupplyAirTemperature(dsgn_temps['zn_htg_dsgn_sup_air_temp_c'])
4700
4699
 
4701
4700
  if chilled_water_loop
4702
- fcu_clg_coil = create_coil_cooling_water(model,
4703
- chilled_water_loop,
4704
- name: "#{zone.name} FCU Cooling Coil")
4701
+ fcu_clg_coil = OpenstudioStandards::HVAC.create_coil_cooling_water(model,
4702
+ chilled_water_loop,
4703
+ name: "#{zone.name} FCU Cooling Coil")
4705
4704
  else
4706
4705
  OpenStudio.logFree(OpenStudio::Error, 'openstudio.Model.Model', 'Fan coil units require a chilled water loop, but none was provided.')
4707
4706
  return false
4708
4707
  end
4709
4708
 
4710
4709
  if hot_water_loop
4711
- fcu_htg_coil = create_coil_heating_water(model,
4712
- hot_water_loop,
4713
- name: "#{zone.name} FCU Heating Coil",
4714
- rated_outlet_air_temperature: dsgn_temps['zn_htg_dsgn_sup_air_temp_c'])
4710
+ fcu_htg_coil = OpenstudioStandards::HVAC.create_coil_heating_water(model,
4711
+ hot_water_loop,
4712
+ name: "#{zone.name} FCU Heating Coil",
4713
+ rated_outlet_air_temperature: dsgn_temps['zn_htg_dsgn_sup_air_temp_c'])
4715
4714
  else
4716
4715
  # Zero-capacity, always-off electric heating coil
4717
- fcu_htg_coil = create_coil_heating_electric(model,
4718
- name: "#{zone.name} No Heat",
4719
- schedule: model.alwaysOffDiscreteSchedule,
4720
- nominal_capacity: 0.0)
4716
+ fcu_htg_coil = OpenstudioStandards::HVAC.create_coil_heating_electric(model,
4717
+ name: "#{zone.name} No Heat",
4718
+ schedule: model.alwaysOffDiscreteSchedule,
4719
+ nominal_capacity: 0.0)
4721
4720
  end
4722
4721
 
4723
4722
  case capacity_control_method
4724
4723
  when 'VariableFanVariableFlow', 'VariableFanConstantFlow'
4725
- fcu_fan = create_fan_by_name(model,
4726
- 'Fan_Coil_VarSpeed_Fan',
4727
- fan_name: "#{zone.name} Fan Coil Variable Fan",
4728
- end_use_subcategory: 'FCU Fans')
4724
+ fcu_fan = OpenstudioStandards::HVAC.create_typical_fan(model,
4725
+ 'Fan_Coil_VarSpeed_Fan',
4726
+ fan_name: "#{zone.name} Fan Coil Variable Fan",
4727
+ end_use_subcategory: 'FCU Fans')
4729
4728
  else
4730
- fcu_fan = create_fan_by_name(model,
4731
- 'Fan_Coil_Fan',
4732
- fan_name: "#{zone.name} Fan Coil fan",
4733
- end_use_subcategory: 'FCU Fans')
4729
+ fcu_fan = OpenstudioStandards::HVAC.create_typical_fan(model,
4730
+ 'Fan_Coil_Fan',
4731
+ fan_name: "#{zone.name} Fan Coil fan",
4732
+ end_use_subcategory: 'FCU Fans')
4734
4733
  end
4735
4734
  fcu_fan.setAvailabilitySchedule(model.alwaysOnDiscreteSchedule)
4736
4735
  fcu_fan.autosizeMaximumFlowRate
@@ -5254,40 +5253,40 @@ class Standard
5254
5253
  radiant_loops << radiant_loop
5255
5254
 
5256
5255
  # rename nodes before adding EMS code
5257
- rename_plant_loop_nodes(model)
5256
+ OpenstudioStandards::HVAC.rename_plant_loop_nodes(model)
5258
5257
 
5259
5258
  # set radiant loop controls
5260
5259
  case control_strategy.downcase
5261
5260
  when 'proportional_control'
5262
5261
  # slab setpoint varies based on previous day zone conditions
5263
- model_add_radiant_proportional_controls(model, zone, radiant_loop,
5264
- radiant_temperature_control_type: radiant_temperature_control_type,
5265
- use_zone_occupancy_for_control: use_zone_occupancy_for_control,
5266
- occupied_percentage_threshold: occupied_percentage_threshold,
5267
- model_occ_hr_start: model_occ_hr_start,
5268
- model_occ_hr_end: model_occ_hr_end,
5269
- proportional_gain: proportional_gain,
5270
- switch_over_time: switch_over_time)
5262
+ OpenstudioStandards::HVAC.model_add_radiant_proportional_controls(model, zone, radiant_loop,
5263
+ radiant_temperature_control_type: radiant_temperature_control_type,
5264
+ use_zone_occupancy_for_control: use_zone_occupancy_for_control,
5265
+ occupied_percentage_threshold: occupied_percentage_threshold,
5266
+ model_occ_hr_start: model_occ_hr_start,
5267
+ model_occ_hr_end: model_occ_hr_end,
5268
+ proportional_gain: proportional_gain,
5269
+ switch_over_time: switch_over_time)
5271
5270
  when 'oa_based_control'
5272
5271
  # slab setpoint varies based on outdoor weather
5273
- model_add_radiant_basic_controls(model, zone, radiant_loop,
5274
- radiant_temperature_control_type: radiant_temperature_control_type,
5275
- slab_setpoint_oa_control: true,
5276
- switch_over_time: switch_over_time,
5277
- slab_sp_at_oat_low: slab_sp_at_oat_low,
5278
- slab_oat_low: slab_oat_low,
5279
- slab_sp_at_oat_high: slab_sp_at_oat_high,
5280
- slab_oat_high: slab_oat_high)
5272
+ OpenstudioStandards::HVAC.model_add_radiant_basic_controls(model, zone, radiant_loop,
5273
+ radiant_temperature_control_type: radiant_temperature_control_type,
5274
+ slab_setpoint_oa_control: true,
5275
+ switch_over_time: switch_over_time,
5276
+ slab_sp_at_oat_low: slab_sp_at_oat_low,
5277
+ slab_oat_low: slab_oat_low,
5278
+ slab_sp_at_oat_high: slab_sp_at_oat_high,
5279
+ slab_oat_high: slab_oat_high)
5281
5280
  when 'constant_control'
5282
5281
  # constant slab setpoint control
5283
- model_add_radiant_basic_controls(model, zone, radiant_loop,
5284
- radiant_temperature_control_type: radiant_temperature_control_type,
5285
- slab_setpoint_oa_control: false,
5286
- switch_over_time: switch_over_time,
5287
- slab_sp_at_oat_low: slab_sp_at_oat_low,
5288
- slab_oat_low: slab_oat_low,
5289
- slab_sp_at_oat_high: slab_sp_at_oat_high,
5290
- slab_oat_high: slab_oat_high)
5282
+ OpenstudioStandards::HVAC.model_add_radiant_basic_controls(model, zone, radiant_loop,
5283
+ radiant_temperature_control_type: radiant_temperature_control_type,
5284
+ slab_setpoint_oa_control: false,
5285
+ switch_over_time: switch_over_time,
5286
+ slab_sp_at_oat_low: slab_sp_at_oat_low,
5287
+ slab_oat_low: slab_oat_low,
5288
+ slab_sp_at_oat_high: slab_sp_at_oat_high,
5289
+ slab_oat_high: slab_oat_high)
5291
5290
  end
5292
5291
  end
5293
5292
  return radiant_loops
@@ -5312,26 +5311,26 @@ class Standard
5312
5311
  thermal_zones.each do |zone|
5313
5312
  OpenStudio.logFree(OpenStudio::Info, 'openstudio.Model.Model', "Adding window AC for #{zone.name}.")
5314
5313
 
5315
- clg_coil = create_coil_cooling_dx_single_speed(model,
5316
- name: "#{zone.name} Window AC Cooling Coil",
5317
- type: 'Window AC',
5318
- cop: cop)
5314
+ clg_coil = OpenstudioStandards::HVAC.create_coil_cooling_dx_single_speed(model,
5315
+ name: "#{zone.name} Window AC Cooling Coil",
5316
+ type: 'Window AC',
5317
+ cop: cop)
5319
5318
  clg_coil.setRatedSensibleHeatRatio(shr)
5320
5319
  clg_coil.setRatedEvaporatorFanPowerPerVolumeFlowRate(OpenStudio::OptionalDouble.new(773.3))
5321
5320
  clg_coil.setEvaporativeCondenserEffectiveness(OpenStudio::OptionalDouble.new(0.9))
5322
5321
  clg_coil.setMaximumOutdoorDryBulbTemperatureForCrankcaseHeaterOperation(OpenStudio::OptionalDouble.new(10))
5323
5322
  clg_coil.setBasinHeaterSetpointTemperature(OpenStudio::OptionalDouble.new(2))
5324
5323
 
5325
- fan = create_fan_by_name(model,
5326
- 'Window_AC_Supply_Fan',
5327
- fan_name: "#{zone.name} Window AC Supply Fan",
5328
- end_use_subcategory: 'Window AC Fans')
5324
+ fan = OpenstudioStandards::HVAC.create_typical_fan(model,
5325
+ 'Window_AC_Supply_Fan',
5326
+ fan_name: "#{zone.name} Window AC Supply Fan",
5327
+ end_use_subcategory: 'Window AC Fans')
5329
5328
  fan.setAvailabilitySchedule(model.alwaysOnDiscreteSchedule)
5330
5329
 
5331
- htg_coil = create_coil_heating_electric(model,
5332
- name: "#{zone.name} Window AC Always Off Htg Coil",
5333
- schedule: model.alwaysOffDiscreteSchedule,
5334
- nominal_capacity: 0)
5330
+ htg_coil = OpenstudioStandards::HVAC.create_coil_heating_electric(model,
5331
+ name: "#{zone.name} Window AC Always Off Htg Coil",
5332
+ schedule: model.alwaysOffDiscreteSchedule,
5333
+ nominal_capacity: 0)
5335
5334
  ptac = OpenStudio::Model::ZoneHVACPackagedTerminalAirConditioner.new(model,
5336
5335
  model.alwaysOnDiscreteSchedule,
5337
5336
  fan,
@@ -5406,19 +5405,19 @@ class Standard
5406
5405
  # create heating coil
5407
5406
  htg_coil = nil
5408
5407
  if heating
5409
- htg_coil = create_coil_heating_gas(model,
5410
- name: "#{air_loop.name} Heating Coil",
5411
- efficiency: afue_to_thermal_eff(afue))
5408
+ htg_coil = OpenstudioStandards::HVAC.create_coil_heating_gas(model,
5409
+ name: "#{air_loop.name} Heating Coil",
5410
+ efficiency: OpenstudioStandards::HVAC.afue_to_thermal_eff(afue))
5412
5411
  end
5413
5412
 
5414
5413
  # create cooling coil
5415
5414
  clg_coil = nil
5416
5415
  if cooling
5417
- clg_coil = create_coil_cooling_dx_single_speed(model,
5418
- name: "#{air_loop.name} Cooling Coil",
5419
- type: 'Residential Central AC')
5416
+ clg_coil = OpenstudioStandards::HVAC.create_coil_cooling_dx_single_speed(model,
5417
+ name: "#{air_loop.name} Cooling Coil",
5418
+ type: 'Residential Central AC')
5420
5419
  clg_coil.setRatedSensibleHeatRatio(shr)
5421
- clg_coil.setRatedCOP(OpenStudio::OptionalDouble.new(eer_to_cop_no_fan(eer)))
5420
+ clg_coil.setRatedCOP(OpenStudio::OptionalDouble.new(OpenstudioStandards::HVAC.eer_to_cop_no_fan(eer)))
5422
5421
  clg_coil.setRatedEvaporatorFanPowerPerVolumeFlowRate(OpenStudio::OptionalDouble.new(ac_w_per_cfm / OpenStudio.convert(1.0, 'cfm', 'm^3/s').get))
5423
5422
  clg_coil.setNominalTimeForCondensateRemovalToBegin(OpenStudio::OptionalDouble.new(1000.0))
5424
5423
  clg_coil.setRatioOfInitialMoistureEvaporationRateAndSteadyStateLatentCapacity(OpenStudio::OptionalDouble.new(1.5))
@@ -5430,10 +5429,10 @@ class Standard
5430
5429
  end
5431
5430
 
5432
5431
  # create fan
5433
- fan = create_fan_by_name(model,
5434
- 'Residential_HVAC_Fan',
5435
- fan_name: "#{air_loop.name} Supply Fan",
5436
- end_use_subcategory: 'Residential HVAC Fans')
5432
+ fan = OpenstudioStandards::HVAC.create_typical_fan(model,
5433
+ 'Residential_HVAC_Fan',
5434
+ fan_name: "#{air_loop.name} Supply Fan",
5435
+ end_use_subcategory: 'Residential HVAC Fans')
5437
5436
  fan.setAvailabilitySchedule(model.alwaysOnDiscreteSchedule)
5438
5437
 
5439
5438
  if ventilation
@@ -5529,10 +5528,10 @@ class Standard
5529
5528
  htg_coil = nil
5530
5529
  supplemental_htg_coil = nil
5531
5530
  if heating
5532
- htg_coil = create_coil_heating_dx_single_speed(model,
5533
- name: "#{air_loop.name} heating coil",
5534
- type: 'Residential Central Air Source HP',
5535
- cop: hspf_to_cop_no_fan(hspf))
5531
+ htg_coil = OpenstudioStandards::HVAC.create_coil_heating_dx_single_speed(model,
5532
+ name: "#{air_loop.name} heating coil",
5533
+ type: 'Residential Central Air Source HP',
5534
+ cop: OpenstudioStandards::HVAC.hspf_to_cop_no_fan(hspf))
5536
5535
  if model.version < OpenStudio::VersionString.new('3.5.0')
5537
5536
  htg_coil.setRatedSupplyFanPowerPerVolumeFlowRate(ac_w_per_cfm / OpenStudio.convert(1.0, 'cfm', 'm^3/s').get)
5538
5537
  else
@@ -5549,17 +5548,17 @@ class Standard
5549
5548
  # Supplemental Heating Coil
5550
5549
 
5551
5550
  # create supplemental heating coil
5552
- supplemental_htg_coil = create_coil_heating_electric(model,
5553
- name: "#{air_loop.name} Supplemental Htg Coil")
5551
+ supplemental_htg_coil = OpenstudioStandards::HVAC.create_coil_heating_electric(model,
5552
+ name: "#{air_loop.name} Supplemental Htg Coil")
5554
5553
  end
5555
5554
 
5556
5555
  # create cooling coil
5557
5556
  clg_coil = nil
5558
5557
  if cooling
5559
- clg_coil = create_coil_cooling_dx_single_speed(model,
5560
- name: "#{air_loop.name} Cooling Coil",
5561
- type: 'Residential Central ASHP',
5562
- cop: cop)
5558
+ clg_coil = OpenstudioStandards::HVAC.create_coil_cooling_dx_single_speed(model,
5559
+ name: "#{air_loop.name} Cooling Coil",
5560
+ type: 'Residential Central ASHP',
5561
+ cop: cop)
5563
5562
  clg_coil.setRatedSensibleHeatRatio(shr)
5564
5563
  clg_coil.setRatedEvaporatorFanPowerPerVolumeFlowRate(OpenStudio::OptionalDouble.new(ac_w_per_cfm / OpenStudio.convert(1.0, 'cfm', 'm^3/s').get))
5565
5564
  clg_coil.setNominalTimeForCondensateRemovalToBegin(OpenStudio::OptionalDouble.new(1000.0))
@@ -5572,10 +5571,10 @@ class Standard
5572
5571
  end
5573
5572
 
5574
5573
  # create fan
5575
- fan = create_fan_by_name(model,
5576
- 'Residential_HVAC_Fan',
5577
- fan_name: "#{air_loop.name} Supply Fan",
5578
- end_use_subcategory: 'Residential HVAC Fans')
5574
+ fan = OpenstudioStandards::HVAC.create_typical_fan(model,
5575
+ 'Residential_HVAC_Fan',
5576
+ fan_name: "#{air_loop.name} Supply Fan",
5577
+ end_use_subcategory: 'Residential HVAC Fans')
5579
5578
  fan.setAvailabilitySchedule(model.alwaysOnDiscreteSchedule)
5580
5579
 
5581
5580
  # create outdoor air intake
@@ -5637,19 +5636,19 @@ class Standard
5637
5636
 
5638
5637
  water_to_air_hp_systems = []
5639
5638
  thermal_zones.each do |zone|
5640
- supplemental_htg_coil = create_coil_heating_electric(model,
5641
- name: "#{zone.name} Supplemental Htg Coil")
5642
- htg_coil = create_coil_heating_water_to_air_heat_pump_equation_fit(model,
5643
- condenser_loop,
5644
- name: "#{zone.name} Water-to-Air HP Htg Coil")
5645
- clg_coil = create_coil_cooling_water_to_air_heat_pump_equation_fit(model,
5646
- condenser_loop,
5647
- name: "#{zone.name} Water-to-Air HP Clg Coil")
5639
+ supplemental_htg_coil = OpenstudioStandards::HVAC.create_coil_heating_electric(model,
5640
+ name: "#{zone.name} Supplemental Htg Coil")
5641
+ htg_coil = OpenstudioStandards::HVAC.create_coil_heating_water_to_air_heat_pump_equation_fit(model,
5642
+ condenser_loop,
5643
+ name: "#{zone.name} Water-to-Air HP Htg Coil")
5644
+ clg_coil = OpenstudioStandards::HVAC.create_coil_cooling_water_to_air_heat_pump_equation_fit(model,
5645
+ condenser_loop,
5646
+ name: "#{zone.name} Water-to-Air HP Clg Coil")
5648
5647
 
5649
5648
  # add fan
5650
- fan = create_fan_by_name(model,
5651
- 'WSHP_Fan',
5652
- fan_name: "#{zone.name} WSHP Fan")
5649
+ fan = OpenstudioStandards::HVAC.create_typical_fan(model,
5650
+ 'WSHP_Fan',
5651
+ fan_name: "#{zone.name} WSHP Fan")
5653
5652
  fan.setAvailabilitySchedule(model.alwaysOnDiscreteSchedule)
5654
5653
 
5655
5654
  water_to_air_hp_system = OpenStudio::Model::ZoneHVACWaterToAirHeatPump.new(model,
@@ -5686,14 +5685,14 @@ class Standard
5686
5685
 
5687
5686
  # Determine the OA requirement for this zone
5688
5687
  min_oa_flow_m3_per_s_per_m2 = OpenstudioStandards::ThermalZone.thermal_zone_get_outdoor_airflow_rate_per_area(zone)
5689
- supply_fan = create_fan_by_name(model,
5690
- 'ERV_Supply_Fan',
5691
- fan_name: "#{zone.name} ERV Supply Fan")
5688
+ supply_fan = OpenstudioStandards::HVAC.create_typical_fan(model,
5689
+ 'ERV_Supply_Fan',
5690
+ fan_name: "#{zone.name} ERV Supply Fan")
5692
5691
  impeller_eff = fan_baseline_impeller_efficiency(supply_fan)
5693
5692
  fan_change_impeller_efficiency(supply_fan, impeller_eff)
5694
- exhaust_fan = create_fan_by_name(model,
5695
- 'ERV_Supply_Fan',
5696
- fan_name: "#{zone.name} ERV Exhaust Fan")
5693
+ exhaust_fan = OpenstudioStandards::HVAC.create_typical_fan(model,
5694
+ 'ERV_Supply_Fan',
5695
+ fan_name: "#{zone.name} ERV Exhaust Fan")
5697
5696
  fan_change_impeller_efficiency(exhaust_fan, impeller_eff)
5698
5697
 
5699
5698
  erv_controller = OpenStudio::Model::ZoneHVACEnergyRecoveryVentilatorController.new(model)
@@ -5703,19 +5702,19 @@ class Standard
5703
5702
  # erv_controller.setTimeofDayEconomizerFlowControlSchedule(self.alwaysOnDiscreteSchedule)
5704
5703
  # erv_controller.setHighHumidityControlFlag(false)
5705
5704
 
5706
- heat_exchanger = OpenstudioStandards::HVAC.create_hx_air_to_air_sensible_and_latent(model,
5707
- name: "#{zone.name} ERV HX",
5708
- type: "Plate",
5709
- economizer_lockout: false,
5710
- supply_air_outlet_temperature_control: false,
5711
- sensible_heating_100_eff: 0.76,
5712
- sensible_heating_75_eff: 0.81,
5713
- latent_heating_100_eff: 0.68,
5714
- latent_heating_75_eff: 0.73,
5715
- sensible_cooling_100_eff: 0.76,
5716
- sensible_cooling_75_eff: 0.81,
5717
- latent_cooling_100_eff: 0.68,
5718
- latent_cooling_75_eff: 0.73)
5705
+ heat_exchanger = OpenstudioStandards::HVAC.create_heat_exchanger_air_to_air_sensible_and_latent(model,
5706
+ name: "#{zone.name} ERV HX",
5707
+ type: "Plate",
5708
+ economizer_lockout: false,
5709
+ supply_air_outlet_temperature_control: false,
5710
+ sensible_heating_100_eff: 0.76,
5711
+ sensible_heating_75_eff: 0.81,
5712
+ latent_heating_100_eff: 0.68,
5713
+ latent_heating_75_eff: 0.73,
5714
+ sensible_cooling_100_eff: 0.76,
5715
+ sensible_cooling_75_eff: 0.81,
5716
+ latent_cooling_100_eff: 0.68,
5717
+ latent_cooling_75_eff: 0.73)
5719
5718
 
5720
5719
  zone_hvac = OpenStudio::Model::ZoneHVACEnergyRecoveryVentilator.new(model, heat_exchanger, supply_fan, exhaust_fan)
5721
5720
  zone_hvac.setName("#{zone.name} ERV")
@@ -6014,12 +6013,12 @@ class Standard
6014
6013
  OpenStudio.logFree(OpenStudio::Info, 'openstudio.Model.Model', "Adding standalone ERV for #{thermal_zone.name}.")
6015
6014
 
6016
6015
  # Fan power with energy recovery = 0.934 W/cfm
6017
- supply_fan = create_fan_by_name(model,
6018
- 'ERV_Supply_Fan',
6019
- fan_name: "#{thermal_zone.name} ERV Supply Fan")
6020
- exhaust_fan = create_fan_by_name(model,
6021
- 'ERV_Supply_Fan',
6022
- fan_name: "#{thermal_zone.name} ERV Exhaust Fan")
6016
+ supply_fan = OpenstudioStandards::HVAC.create_typical_fan(model,
6017
+ 'ERV_Supply_Fan',
6018
+ fan_name: "#{thermal_zone.name} ERV Supply Fan")
6019
+ exhaust_fan = OpenstudioStandards::HVAC.create_typical_fan(model,
6020
+ 'ERV_Supply_Fan',
6021
+ fan_name: "#{thermal_zone.name} ERV Exhaust Fan")
6023
6022
  supply_fan.setMotorEfficiency(0.48)
6024
6023
  exhaust_fan.setMotorEfficiency(0.48)
6025
6024
  supply_fan.setFanTotalEfficiency(0.303158)
@@ -6028,12 +6027,12 @@ class Standard
6028
6027
  exhaust_fan.setPressureRise(270.64755)
6029
6028
 
6030
6029
  # Create heat exchanger
6031
- heat_exchanger = OpenstudioStandards::HVAC.create_hx_air_to_air_sensible_and_latent(model,
6032
- name: "#{thermal_zone.name} ERV HX",
6033
- type: 'Rotary',
6034
- economizer_lockout: false,
6035
- supply_air_outlet_temperature_control: false,
6036
- frost_control_type: 'ExhaustOnly')
6030
+ heat_exchanger = OpenstudioStandards::HVAC.create_heat_exchanger_air_to_air_sensible_and_latent(model,
6031
+ name: "#{thermal_zone.name} ERV HX",
6032
+ type: 'Rotary',
6033
+ economizer_lockout: false,
6034
+ supply_air_outlet_temperature_control: false,
6035
+ frost_control_type: 'ExhaustOnly')
6037
6036
  heat_exchanger.setThresholdTemperature(-23.3)
6038
6037
  heat_exchanger.setInitialDefrostTimeFraction(0.167)
6039
6038
  heat_exchanger.setRateofDefrostTimeFractionIncrease(1.44)
@@ -6090,9 +6089,9 @@ class Standard
6090
6089
  OpenStudio.logFree(OpenStudio::Info, 'openstudio.Model.Model', "Adding standalone unit ventilator for #{thermal_zone.name}.")
6091
6090
 
6092
6091
  # Fan power with no energy recovery = 0.806 W/cfm
6093
- supply_fan = create_fan_by_name(model,
6094
- 'ERV_Supply_Fan',
6095
- fan_name: "#{thermal_zone.name} Ventilator Supply Fan")
6092
+ supply_fan = OpenstudioStandards::HVAC.create_typical_fan(model,
6093
+ 'ERV_Supply_Fan',
6094
+ fan_name: "#{thermal_zone.name} Ventilator Supply Fan")
6096
6095
  supply_fan.setMotorEfficiency(0.48)
6097
6096
  supply_fan.setFanTotalEfficiency(0.303158)
6098
6097
  supply_fan.setPressureRise(233.6875)
@@ -6100,10 +6099,10 @@ class Standard
6100
6099
  unit_ventilator = OpenStudio::Model::ZoneHVACUnitVentilator.new(model, supply_fan)
6101
6100
  unit_ventilator.setName("#{thermal_zone.name} Unit Ventilator")
6102
6101
  unit_ventilator.addToThermalZone(thermal_zone)
6103
- fan_zone_exhaust = create_fan_zone_exhaust(model,
6104
- fan_name: "#{thermal_zone.name} Exhaust Fan",
6105
- fan_efficiency: 0.303158,
6106
- pressure_rise: 233.6875)
6102
+ fan_zone_exhaust = OpenstudioStandards::HVAC.create_fan_zone_exhaust(model,
6103
+ fan_name: "#{thermal_zone.name} Exhaust Fan",
6104
+ fan_efficiency: 0.303158,
6105
+ pressure_rise: 233.6875)
6107
6106
 
6108
6107
  # Set OA requirements; Assumes a default of 55 cfm
6109
6108
  if min_oa_flow_m3_per_s_per_m2.nil?
@@ -6374,7 +6373,7 @@ class Standard
6374
6373
  model_add_zone_heat_cool_request_count_program(model, thermal_zones)
6375
6374
  end
6376
6375
 
6377
- plant_water_loop_name = ems_friendly_name(plant_water_loop.name)
6376
+ plant_water_loop_name = OpenstudioStandards::HVAC.ems_friendly_name(plant_water_loop.name)
6378
6377
 
6379
6378
  if plant_water_loop.componentType.valueName == 'Heating'
6380
6379
  swt_upper_limit = sp_at_oat_low.nil? ? OpenStudio.convert(120, 'F', 'C').get : OpenStudio.convert(sp_at_oat_low, 'F', 'C').get
@@ -6550,7 +6549,7 @@ class Standard
6550
6549
  exisiting_ems_sensors_names = exisiting_ems_sensors.collect { |sensor| "#{sensor.name.get}-#{sensor.outputVariableOrMeterName}" }
6551
6550
 
6552
6551
  # Create zone air temperature 'sensor' for the zone.
6553
- zone_name = ems_friendly_name(zone.name)
6552
+ zone_name = OpenstudioStandards::HVAC.ems_friendly_name(zone.name)
6554
6553
  zone_air_sensor_name = "#{zone_name}_ctrl_temperature"
6555
6554
 
6556
6555
  unless exisiting_ems_sensors_names.include?("#{zone_air_sensor_name}-Zone Air Temperature")
@@ -7523,7 +7522,7 @@ class Standard
7523
7522
  end
7524
7523
 
7525
7524
  # rename air loop and plant loop nodes for readability
7526
- rename_air_loop_nodes(model)
7527
- rename_plant_loop_nodes(model)
7525
+ OpenstudioStandards::HVAC.rename_air_loop_nodes(model)
7526
+ OpenstudioStandards::HVAC.rename_plant_loop_nodes(model)
7528
7527
  end
7529
7528
  end