openstudio-standards 0.2.10 → 0.2.11.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (252) hide show
  1. checksums.yaml +5 -5
  2. data/data/geometry/ASHRAE90120042007LargeHotel.osm +101 -0
  3. data/data/geometry/ASHRAE90120042007RetailStandalone.osm +220 -0
  4. data/data/geometry/ASHRAE9012010LargeHotel.osm +101 -0
  5. data/data/geometry/ASHRAE9012010RetailStandalone.osm +218 -32
  6. data/data/geometry/ASHRAE9012013FullServiceRestaurant.osm +17 -0
  7. data/data/geometry/ASHRAE9012013Hospital.osm +288 -0
  8. data/data/geometry/ASHRAE9012013LargeHotel.osm +113 -12
  9. data/data/geometry/ASHRAE9012013LargeOffice.osm +205 -1
  10. data/data/geometry/ASHRAE9012013MediumOffice.osm +103 -1
  11. data/data/geometry/ASHRAE9012013Outpatient.osm +390 -102
  12. data/data/geometry/ASHRAE9012013PrimarySchool.osm +424 -0
  13. data/data/geometry/ASHRAE9012013QuickServiceRestaurant.osm +16 -0
  14. data/data/geometry/ASHRAE9012013RetailStandalone.osm +220 -0
  15. data/data/geometry/ASHRAE9012013SecondarySchool.osm +543 -0
  16. data/data/geometry/ASHRAE9012013SmallHotel.osm +50 -0
  17. data/data/geometry/ASHRAE9012013SmallOffice.osm +33 -0
  18. data/data/geometry/ASHRAE9012013Warehouse.osm +475 -238
  19. data/data/geometry/ASHRAEFullServiceRestaurant.osm +16 -0
  20. data/data/geometry/ASHRAEHospital.osm +288 -0
  21. data/data/geometry/ASHRAELargeOffice.osm +205 -1
  22. data/data/geometry/ASHRAELargeOfficeDetailed.osm +32 -32
  23. data/data/geometry/ASHRAEMediumOffice.osm +103 -1
  24. data/data/geometry/ASHRAEOutpatient.osm +390 -102
  25. data/data/geometry/ASHRAEPrimarySchool.osm +424 -0
  26. data/data/geometry/ASHRAEQuickServiceRestaurant.osm +16 -0
  27. data/data/geometry/ASHRAESecondarySchool.osm +1011 -162
  28. data/data/geometry/ASHRAESmallHotel.osm +50 -0
  29. data/data/geometry/ASHRAESmallOffice.osm +33 -0
  30. data/data/geometry/ASHRAEWarehouse.osm +476 -238
  31. data/data/standards/manage_OpenStudio_Standards.rb +1 -1
  32. data/data/standards/openstudio_standards_duplicates_log.csv +16 -0
  33. data/data/standards/test_performance_expected_dd_results.csv +1216 -1216
  34. data/data/weather/ARE_Abu.Dhabi.412170_IWEC.ddy +536 -0
  35. data/data/weather/ARE_Abu.Dhabi.412170_IWEC.epw +8768 -0
  36. data/data/weather/ARE_Abu.Dhabi.412170_IWEC.stat +544 -0
  37. data/data/weather/ARE_Dubai.Intl.AP.411940_IWEC2.ddy +533 -0
  38. data/data/weather/ARE_Dubai.Intl.AP.411940_IWEC2.epw +8768 -0
  39. data/data/weather/ARE_Dubai.Intl.AP.411940_IWEC2.stat +553 -0
  40. data/data/weather/VNM_Hanoi.488200_IWEC.ddy +533 -0
  41. data/data/weather/VNM_Hanoi.488200_IWEC.epw +8768 -0
  42. data/data/weather/VNM_Hanoi.488200_IWEC.stat +544 -0
  43. data/data/weather/VNM_Ho.Chi.Minh.City-Tan.Son.Nhat.AP.489000_IWEC2.ddy +533 -0
  44. data/data/weather/VNM_Ho.Chi.Minh.City-Tan.Son.Nhat.AP.489000_IWEC2.epw +8768 -0
  45. data/data/weather/VNM_Ho.Chi.Minh.City-Tan.Son.Nhat.AP.489000_IWEC2.stat +546 -0
  46. data/lib/openstudio-standards.rb +27 -0
  47. data/lib/openstudio-standards/btap/btap.model.rb +4 -4
  48. data/lib/openstudio-standards/btap/btap_result.rb +8 -8
  49. data/lib/openstudio-standards/btap/economics.rb +11 -11
  50. data/lib/openstudio-standards/btap/envelope.rb +5 -5
  51. data/lib/openstudio-standards/btap/hvac.rb +55 -11
  52. data/lib/openstudio-standards/btap/measures.rb +7 -7
  53. data/lib/openstudio-standards/btap/spaceloads.rb +4 -4
  54. data/lib/openstudio-standards/hvac_sizing/Siz.AirLoopHVAC.rb +105 -1
  55. data/lib/openstudio-standards/hvac_sizing/Siz.ControllerOutdoorAir.rb +2 -2
  56. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.AirTerminalSingleDuctVAVReheat.rb +0 -8
  57. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.AirTerminalSingleDuctVAVReheat.rb +0 -8
  58. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.AirTerminalSingleDuctVAVReheat.rb +0 -8
  59. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirTerminalSingleDuctVAVReheat.rb +0 -8
  60. data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.AirTerminalSingleDuctVAVReheat.rb +6 -1
  61. data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.HeatExchangerAirToAirSensibleAndLatent.rb +9 -0
  62. data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.Model.rb +3 -1
  63. data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirTerminalSingleDuctVAVReheat.rb +22 -0
  64. data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.FanConstantVolume.rb +32 -0
  65. data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.FanOnOff.rb +33 -0
  66. data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.FanVariableVolume.rb +32 -0
  67. data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.HeatExchangerAirToAirSensibleAndLatent.rb +9 -0
  68. data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.Model.elevators.rb +25 -0
  69. data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.Model.rb +35 -0
  70. data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.hvac_systems.rb +11 -0
  71. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Hospital.rb +17 -3
  72. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeHotel.rb +9 -0
  73. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeOffice.rb +9 -0
  74. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeOfficeDetailed.rb +22 -3
  75. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.MediumOffice.rb +9 -0
  76. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.MediumOfficeDetailed.rb +9 -0
  77. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Outpatient.rb +107 -5
  78. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.PrimarySchool.rb +9 -0
  79. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.RetailStandalone.rb +3 -0
  80. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SecondarySchool.rb +9 -0
  81. data/lib/openstudio-standards/prototypes/common/objects/Prototype.AirTerminalSingleDuctVAVReheat.rb +0 -8
  82. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingDXTwoSpeed.rb +2 -2
  83. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingDXSingleSpeed.rb +2 -4
  84. data/lib/openstudio-standards/prototypes/common/objects/Prototype.HeatExchangerAirToAirSensibleAndLatent.rb +15 -4
  85. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.exterior_lights.rb +2 -2
  86. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.rb +45 -5
  87. data/lib/openstudio-standards/prototypes/common/objects/Prototype.ServiceWaterHeating.rb +1 -1
  88. data/lib/openstudio-standards/prototypes/common/objects/Prototype.SizingSystem.rb +21 -2
  89. data/lib/openstudio-standards/prototypes/common/objects/Prototype.hvac_systems.rb +251 -364
  90. data/lib/openstudio-standards/prototypes/common/objects/Prototype.radiant_system_controls.rb +4 -0
  91. data/lib/openstudio-standards/prototypes/common/objects/Prototype.refrigeration.rb +4 -5
  92. data/lib/openstudio-standards/refs/references.rb +4 -0
  93. data/lib/openstudio-standards/standards/Standards.AirLoopHVAC.rb +283 -97
  94. data/lib/openstudio-standards/standards/Standards.AirTerminalSingleDuctParallelPIUReheat.rb +2 -2
  95. data/lib/openstudio-standards/standards/Standards.BuildingStory.rb +1 -1
  96. data/lib/openstudio-standards/standards/Standards.ChillerElectricEIR.rb +1 -1
  97. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXSingleSpeed.rb +1 -1
  98. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXTwoSpeed.rb +5 -5
  99. data/lib/openstudio-standards/standards/Standards.CoilDX.rb +3 -1
  100. data/lib/openstudio-standards/standards/Standards.CoilHeatingGasMultiStage.rb +1 -1
  101. data/lib/openstudio-standards/standards/Standards.Construction.rb +53 -45
  102. data/lib/openstudio-standards/standards/Standards.Fan.rb +10 -2
  103. data/lib/openstudio-standards/standards/Standards.FanVariableVolume.rb +4 -4
  104. data/lib/openstudio-standards/standards/Standards.HeatExchangerSensLat.rb +1 -1
  105. data/lib/openstudio-standards/standards/Standards.Model.rb +39 -18
  106. data/lib/openstudio-standards/standards/Standards.PlanarSurface.rb +8 -8
  107. data/lib/openstudio-standards/standards/Standards.PlantLoop.rb +12 -12
  108. data/lib/openstudio-standards/standards/Standards.ScheduleConstant.rb +1 -1
  109. data/lib/openstudio-standards/standards/Standards.ScheduleRuleset.rb +2 -2
  110. data/lib/openstudio-standards/standards/Standards.Space.rb +190 -181
  111. data/lib/openstudio-standards/standards/Standards.SpaceType.rb +36 -59
  112. data/lib/openstudio-standards/standards/Standards.SubSurface.rb +3 -3
  113. data/lib/openstudio-standards/standards/Standards.Surface.rb +1 -1
  114. data/lib/openstudio-standards/standards/Standards.ThermalZone.rb +16 -12
  115. data/lib/openstudio-standards/standards/Standards.WaterHeaterMixed.rb +1 -1
  116. data/lib/openstudio-standards/standards/Standards.ZoneHVACComponent.rb +16 -5
  117. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.AirLoopHVAC.rb +1 -1
  118. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/comstock_ashrae_90_1_2004/data/ashrae_90_1.schedules.json +159 -8
  119. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/comstock_ashrae_90_1_2004/data/comstock_ashrae_90_1_2004.spc_typ.json +1354 -1075
  120. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.construction_properties.json +557 -17
  121. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.economizers.json +28 -28
  122. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.ground_temperatures.json +36 -36
  123. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.spc_typ.json +233 -6
  124. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/comstock_ashrae_90_1_2007/data/ashrae_90_1.schedules.json +159 -8
  125. 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 +1356 -1077
  126. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.construction_properties.json +480 -0
  127. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.economizers.json +28 -28
  128. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.ground_temperatures.json +36 -36
  129. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.spc_typ.json +241 -14
  130. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.AirLoopHVAC.rb +0 -8
  131. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.Space.rb +12 -7
  132. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/comstock_ashrae_90_1_2010/data/ashrae_90_1.schedules.json +159 -8
  133. 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 +1367 -1087
  134. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.construction_properties.json +480 -0
  135. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.ground_temperatures.json +36 -36
  136. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.spc_typ.json +233 -5
  137. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirLoopHVAC.rb +20 -27
  138. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.Space.rb +8 -3
  139. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/comstock_ashrae_90_1_2013/data/ashrae_90_1.schedules.json +159 -8
  140. 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 +1432 -1138
  141. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.construction_properties.json +480 -0
  142. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.ground_temperatures.json +36 -36
  143. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.spc_typ.json +241 -5
  144. data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.climate_zone_sets.json +37 -0
  145. data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.climate_zones.json +39 -15
  146. data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.constructions.json +489 -7
  147. data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.curves.json +250 -0
  148. data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.fans.json +12 -0
  149. data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.materials.json +1920 -0
  150. data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.schedules.json +5265 -9
  151. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/comstock_doe_ref_1980_2004/data/ashrae_90_1.schedules.json +159 -8
  152. 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 +2441 -1925
  153. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.construction_properties.json +16658 -2578
  154. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.spc_typ.json +212 -8
  155. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.Model.rb +11 -1
  156. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/comstock_doe_ref_pre_1980/data/ashrae_90_1.schedules.json +159 -8
  157. 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 +2403 -1889
  158. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.construction_properties.json +16664 -2584
  159. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.spc_typ.json +209 -7
  160. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.Model.rb +11 -1
  161. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/data/nrel_zne_ready_2017.construction_properties.json +4113 -513
  162. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/data/nrel_zne_ready_2017.construction_sets.json +40 -40
  163. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/data/nrel_zne_ready_2017.elevators.json +1 -1
  164. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/data/nrel_zne_ready_2017.ground_temperatures.json +650 -0
  165. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/data/nrel_zne_ready_2017.heat_pumps.json +90 -2
  166. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/data/nrel_zne_ready_2017.heat_pumps_heating.json +25 -5
  167. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/data/nrel_zne_ready_2017.spc_typ.json +1909 -32
  168. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/data/nrel_zne_ready_2017.water_heaters.json +8 -8
  169. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.AirLoopHVAC.rb +147 -155
  170. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.AirTerminalSingleDuctVAVReheat.rb +1 -1
  171. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.HeatExchangerSensLat.rb +29 -10
  172. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.Model.rb +4 -4
  173. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.PlantLoop.rb +45 -73
  174. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.ZoneHVACComponent.rb +4 -72
  175. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.boilers.json +20 -0
  176. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.chillers.json +400 -0
  177. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.construction_properties.json +4444 -0
  178. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.construction_sets.json +391 -0
  179. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.economizers.json +536 -0
  180. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.elevators.json +36 -0
  181. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.ext_ltg.json +169 -0
  182. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.ground_temperatures.json +650 -0
  183. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.heat_pumps.json +290 -0
  184. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.heat_pumps_heating.json +164 -0
  185. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.heat_rejection.json +40 -0
  186. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.motors.json +274 -0
  187. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.prototype_inputs.json +704 -0
  188. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.refrigeration_compressors.json +22 -0
  189. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.spc_typ.json +6424 -0
  190. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.unitary_acs.json +142 -0
  191. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.water_heaters.json +72 -0
  192. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.water_source_heat_pumps.json +31 -0
  193. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.water_source_heat_pumps_heating.json +13 -0
  194. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirLoopHVAC.rb +829 -0
  195. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirTerminalSingleDuctVAVReheat.rb +24 -0
  196. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.CoolingTower.rb +19 -0
  197. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.CoolingTowerSingleSpeed.rb +5 -0
  198. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.CoolingTowerTwoSpeed.rb +5 -0
  199. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.CoolingTowerVariableSpeed.rb +16 -0
  200. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.FanVariableVolume.rb +37 -0
  201. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.HeatExchangerSensLat.rb +34 -0
  202. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.Model.rb +80 -0
  203. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.PlantLoop.rb +68 -0
  204. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.Space.rb +146 -0
  205. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.ThermalZone.rb +23 -0
  206. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.ZoneHVACComponent.rb +8 -0
  207. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.rb +16 -0
  208. data/lib/openstudio-standards/standards/deer/deer_1985/data/deer_1985.heat_pumps_heating.json +5 -5
  209. data/lib/openstudio-standards/standards/deer/deer_1996/data/deer_1996.economizers.json +18 -0
  210. data/lib/openstudio-standards/standards/deer/deer_1996/data/deer_1996.heat_pumps_heating.json +5 -5
  211. data/lib/openstudio-standards/standards/deer/deer_2003/data/deer_2003.heat_pumps_heating.json +5 -5
  212. data/lib/openstudio-standards/standards/deer/deer_2007/data/deer_2007.heat_pumps_heating.json +5 -5
  213. data/lib/openstudio-standards/standards/deer/deer_2011/data/deer_2011.heat_pumps_heating.json +5 -5
  214. data/lib/openstudio-standards/standards/deer/deer_2014/data/deer_2014.heat_pumps_heating.json +5 -5
  215. data/lib/openstudio-standards/standards/deer/deer_2015/data/deer_2015.heat_pumps_heating.json +5 -5
  216. data/lib/openstudio-standards/standards/deer/deer_2017/data/deer_2017.heat_pumps_heating.json +1 -1
  217. data/lib/openstudio-standards/standards/deer/deer_2020/data/deer_2020.heat_pumps_heating.json +5 -5
  218. data/lib/openstudio-standards/standards/deer/deer_2025/data/deer_2025.heat_pumps_heating.json +5 -5
  219. data/lib/openstudio-standards/standards/deer/deer_2030/data/deer_2030.heat_pumps_heating.json +5 -5
  220. data/lib/openstudio-standards/standards/deer/deer_2035/data/deer_2035.heat_pumps_heating.json +5 -5
  221. data/lib/openstudio-standards/standards/deer/deer_2040/data/deer_2040.heat_pumps_heating.json +5 -5
  222. data/lib/openstudio-standards/standards/deer/deer_2045/data/deer_2045.heat_pumps_heating.json +5 -5
  223. data/lib/openstudio-standards/standards/deer/deer_2050/data/deer_2050.heat_pumps_heating.json +5 -5
  224. data/lib/openstudio-standards/standards/deer/deer_2055/data/deer_2055.heat_pumps_heating.json +5 -5
  225. data/lib/openstudio-standards/standards/deer/deer_2060/data/deer_2060.heat_pumps_heating.json +5 -5
  226. data/lib/openstudio-standards/standards/deer/deer_2065/data/deer_2065.heat_pumps_heating.json +5 -5
  227. data/lib/openstudio-standards/standards/deer/deer_2070/data/deer_2070.heat_pumps_heating.json +5 -5
  228. data/lib/openstudio-standards/standards/deer/deer_2075/data/deer_2075.heat_pumps_heating.json +5 -5
  229. data/lib/openstudio-standards/standards/deer/deer_pre_1975/data/deer_pre_1975.heat_pumps_heating.json +5 -5
  230. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_1_multi_speed.rb +5 -1
  231. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_3_and_8_multi_speed.rb +5 -1
  232. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_6.rb +5 -2
  233. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_systems.rb +8 -2
  234. data/lib/openstudio-standards/standards/necb/NECB2011/qaqc/necb_qaqc.rb +12 -12
  235. data/lib/openstudio-standards/version.rb +1 -1
  236. data/lib/openstudio-standards/weather/Weather.Model.rb +4 -0
  237. metadata +102 -18
  238. data/data/standards/OpenStudio_Standards-ashrae_90_1(space_types).xlsx +0 -0
  239. data/data/standards/OpenStudio_Standards-ashrae_90_1-ALL-comstock(space_types).xlsx +0 -0
  240. data/data/standards/OpenStudio_Standards-ashrae_90_1.xlsx +0 -0
  241. data/data/standards/OpenStudio_Standards-cbes(space_types).xlsx +0 -0
  242. data/data/standards/OpenStudio_Standards-cbes.xlsx +0 -0
  243. data/data/standards/OpenStudio_Standards-deer(space_types).xlsx +0 -0
  244. data/data/standards/OpenStudio_Standards-deer-ALL-comstock(space_types).xlsx +0 -0
  245. data/data/standards/OpenStudio_Standards-deer.xlsx +0 -0
  246. data/data/standards/OpenStudio_Standards_LA100.xlsx +0 -0
  247. data/data/standards/junk/legacy_dd_results - Copy.csv +0 -960
  248. data/data/standards/junk/legacy_dd_results.csv +0 -960
  249. data/data/standards/junk/legacy_dd_results_new - Copy.csv +0 -960
  250. data/data/standards/junk/legacy_dd_results_new.csv +0 -960
  251. data/data/standards/junk/legacy_dd_results_original.csv +0 -960
  252. data/lib/openstudio-standards/standards/necb/NECB2011/newway.json +0 -8102
@@ -307,6 +307,10 @@ class Standard
307
307
  surfaces << surface if surface.surfaceType == surface_type
308
308
  end
309
309
  end
310
+ if surfaces.empty?
311
+ OpenStudio.logFree(OpenStudio::Error, 'openstudio.Model.Model', "Zone #{zone.name} does not have floor surfaces; cannot add radiant system.")
312
+ return false
313
+ end
310
314
  zone_floor = surfaces.sort_by { |s| s.grossArea }[-1]
311
315
  zone_srf_temp = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Surface Inside Face Temperature')
312
316
  zone_srf_temp.setName("#{zone_name}_Srf_Temp")
@@ -524,19 +524,20 @@ class Standard
524
524
  }
525
525
  props_lineup = model_find_object(standards_data['refrigeration_system_lineup'], search_criteria)
526
526
  if props_lineup.nil?
527
- OpenStudio.logFree(OpenStudio::Debug, 'openstudio.Model.Model', "No refrigeration system lineup found for #{search_criteria}, no system will be added.")
527
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.Model.Model', "No refrigeration system lineup found for #{search_criteria}, no system will be added.")
528
528
  next
529
529
  end
530
530
  number_of_display_cases = props_lineup['number_of_display_cases']
531
531
  number_of_walkins = props_lineup['number_of_walkins']
532
532
  compressor_name = props_lineup['compressor_name']
533
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.Model.Model', "Refrigeration system lineup found for #{search_criteria}: #{number_of_display_cases} display cases and #{number_of_walkins} walkins, with compressor '#{compressor_name}'.")
533
534
 
534
535
  # Find the thermal zones most suited for holding the display cases
535
536
  thermal_zone_case = nil
536
537
  if number_of_display_cases > 0
537
538
  thermal_zone_case = model_typical_display_case_zone(model)
538
539
  if thermal_zone_case.nil?
539
- OpenStudio.logFree(OpenStudio::Error, 'openstudio.model.Model',"Attempted to add #{number_of_display_cases} display cases to the model, but could find no thermal zone to put them into.")
540
+ OpenStudio.logFree(OpenStudio::Error, 'openstudio.model.Model', "Attempted to add #{number_of_display_cases} display cases to the model, but could find no thermal zone to put them into.")
540
541
  return false
541
542
  end
542
543
  end
@@ -636,9 +637,7 @@ class Standard
636
637
  walkin_floor_area_ft2 = OpenStudio.convert(ref_walkin.insulatedFloorSurfaceArea, 'm^2', 'ft^2').get.round
637
638
  walkin_zone_floor_area_ft2 = OpenStudio.convert(thermal_zone_walkin.floorArea, 'm^2', 'ft^2').get.round
638
639
  if walkin_floor_area_ft2 > walkin_zone_floor_area_ft2
639
- OpenStudio.logFree(OpenStudio::Warn, 'openstudio.Model.Model', "Walkin #{ref_walkin.name} has an area of #{walkin_floor_area_ft2} ft^2, which is larger than the #{walkin_zone_floor_area_ft2} ft^2 zone. Walkin will be removed from model.")
640
- ref_walkin.remove
641
- next
640
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.Model.Model', "Walkin #{ref_walkin.name} has an area of #{walkin_floor_area_ft2} ft^2, which is larger than the #{walkin_zone_floor_area_ft2} ft^2 zone. Walkin will be kept in the model, but considered re-sizing the zone '#{thermal_zone_walkin.name}'.")
642
641
  end
643
642
 
644
643
  # Find defrost and dripdown properties
@@ -36,6 +36,10 @@ module References
36
36
  # as of 2017.
37
37
  class NRELZNEReady2017; end
38
38
 
39
+ # ZE AEDG Multifamily
40
+ # This template contains values from the Zero Energy Advanced Energy Design Guide for Multifamily Buildings
41
+ class ZEAEDGMultifamily; end
42
+
39
43
  # NECB2011
40
44
  # @see https://www.nrc-cnrc.gc.ca/eng/publications/codes_centre/2011_national_energy_code_buildings.html Purchase in the NRC Virtual Store
41
45
  class NECB2011; end
@@ -1,4 +1,3 @@
1
-
2
1
  class Standard
3
2
  # @!group AirLoopHVAC
4
3
 
@@ -34,7 +33,7 @@ class Standard
34
33
  def air_loop_hvac_apply_standard_controls(air_loop_hvac, climate_zone)
35
34
  # Energy Recovery Ventilation
36
35
  if air_loop_hvac_energy_recovery_ventilator_required?(air_loop_hvac, climate_zone)
37
- air_loop_hvac_apply_energy_recovery_ventilator(air_loop_hvac)
36
+ air_loop_hvac_apply_energy_recovery_ventilator(air_loop_hvac, climate_zone)
38
37
  end
39
38
 
40
39
  # Economizers
@@ -100,16 +99,6 @@ class Standard
100
99
  ## end
101
100
  end
102
101
 
103
- # Single zone systems
104
- if air_loop_hvac.thermalZones.size == 1
105
- air_loop_hvac_supply_return_exhaust_relief_fans(air_loop_hvac).each do |fan|
106
- if fan.to_FanVariableVolume.is_initialized
107
- fan_variable_volume_set_control_type(fan, 'Single Zone VAV Fan')
108
- end
109
- end
110
- air_loop_hvac_apply_single_zone_controls(air_loop_hvac, climate_zone)
111
- end
112
-
113
102
  # DCV
114
103
  if air_loop_hvac_demand_control_ventilation_required?(air_loop_hvac, climate_zone)
115
104
  air_loop_hvac_enable_demand_control_ventilation(air_loop_hvac, climate_zone)
@@ -159,10 +148,8 @@ class Standard
159
148
  air_loop_hvac_remove_motorized_oa_damper(air_loop_hvac)
160
149
  end
161
150
 
162
- # Zones that require DCV preserve
163
- # both per-area and per-person OA reqs.
164
- # Other zones have OA reqs converted
165
- # to per-area values only so that DCV
151
+ # Zones that require DCV preserve both per-area and per-person OA reqs.
152
+ # Other zones have OA reqs converted to per-area values only so that DCV
166
153
  air_loop_hvac.thermalZones.sort.each do |zone|
167
154
  if thermal_zone_demand_control_ventilation_required?(zone, climate_zone)
168
155
  thermal_zone_convert_oa_req_to_per_area(zone)
@@ -170,8 +157,16 @@ class Standard
170
157
  end
171
158
 
172
159
  # Optimum Start
173
- if air_loop_hvac_optimum_start_required?(air_loop_hvac)
174
- air_loop_hvac_enable_optimum_start(air_loop_hvac)
160
+ air_loop_hvac_enable_optimum_start(air_loop_hvac) if air_loop_hvac_optimum_start_required?(air_loop_hvac)
161
+
162
+ # Single zone systems
163
+ if air_loop_hvac.thermalZones.size == 1
164
+ air_loop_hvac_supply_return_exhaust_relief_fans(air_loop_hvac).each do |fan|
165
+ if fan.to_FanVariableVolume.is_initialized
166
+ fan_variable_volume_set_control_type(fan, 'Single Zone VAV Fan')
167
+ end
168
+ end
169
+ air_loop_hvac_apply_single_zone_controls(air_loop_hvac, climate_zone)
175
170
  end
176
171
  end
177
172
 
@@ -830,7 +825,13 @@ class Standard
830
825
  def air_loop_hvac_economizer_required?(air_loop_hvac, climate_zone)
831
826
  economizer_required = false
832
827
 
833
- return economizer_required if air_loop_hvac.name.to_s.include? 'Outpatient F1'
828
+ # skip systems without outdoor air
829
+ return economizer_required unless air_loop_hvac.airLoopHVACOutdoorAirSystem.is_initialized
830
+ # Determine if the system serves residential spaces
831
+ is_res = false
832
+ if air_loop_hvac_residential_area_served(air_loop_hvac) > 0
833
+ is_res = true
834
+ end
834
835
 
835
836
  # Determine if the airloop serves any computer rooms
836
837
  # / data centers, which changes the economizer.
@@ -858,6 +859,11 @@ class Standard
858
859
  infinity_btu_per_hr = 999_999_999_999
859
860
  minimum_capacity_btu_per_hr = infinity_btu_per_hr if minimum_capacity_btu_per_hr.nil?
860
861
 
862
+ # Exception valid for 90.1-2004 (6.5.1.(e)) through 90.1-2013 (6.5.1.5)
863
+ if is_res
864
+ minimum_capacity_btu_per_hr *= 5
865
+ end
866
+
861
867
  # Check whether the system requires an economizer by comparing
862
868
  # the system capacity to the minimum capacity.
863
869
  total_cooling_capacity_w = air_loop_hvac_total_cooling_capacity(air_loop_hvac)
@@ -866,6 +872,8 @@ class Standard
866
872
  if total_cooling_capacity_btu_per_hr >= minimum_capacity_btu_per_hr
867
873
  if is_dc
868
874
  OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.AirLoopHVAC', "#{air_loop_hvac.name} requires an economizer because the total cooling capacity of #{total_cooling_capacity_btu_per_hr.round} Btu/hr exceeds the minimum capacity of #{minimum_capacity_btu_per_hr.round} Btu/hr for data centers.")
875
+ elsif is_res
876
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.AirLoopHVAC', "#{air_loop_hvac.name} requires an economizer because the total cooling capacity of #{total_cooling_capacity_btu_per_hr.round} Btu/hr exceeds the minimum capacity of #{minimum_capacity_btu_per_hr.round} Btu/hr for residential spaces.")
869
877
  else
870
878
  OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.AirLoopHVAC', "#{air_loop_hvac.name} requires an economizer because the total cooling capacity of #{total_cooling_capacity_btu_per_hr.round} Btu/hr exceeds the minimum capacity of #{minimum_capacity_btu_per_hr.round} Btu/hr.")
871
879
  end
@@ -873,6 +881,8 @@ class Standard
873
881
  else
874
882
  if is_dc
875
883
  OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.AirLoopHVAC', "#{air_loop_hvac.name} does not require an economizer because the total cooling capacity of #{total_cooling_capacity_btu_per_hr.round} Btu/hr is less than the minimum capacity of #{minimum_capacity_btu_per_hr.round} Btu/hr for data centers.")
884
+ elsif is_res
885
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.AirLoopHVAC', "#{air_loop_hvac.name} requires an economizer because the total cooling capacity of #{total_cooling_capacity_btu_per_hr.round} Btu/hr exceeds the minimum capacity of #{minimum_capacity_btu_per_hr.round} Btu/hr for residential spaces.")
876
886
  else
877
887
  OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.AirLoopHVAC', "#{air_loop_hvac.name} does not require an economizer because the total cooling capacity of #{total_cooling_capacity_btu_per_hr.round} Btu/hr is less than the minimum capacity of #{minimum_capacity_btu_per_hr.round} Btu/hr.")
878
888
  end
@@ -976,7 +986,8 @@ class Standard
976
986
  return [nil, nil, nil]
977
987
  when 'FixedDryBulb'
978
988
  case climate_zone
979
- when 'ASHRAE 169-2006-1B',
989
+ when 'ASHRAE 169-2006-0B',
990
+ 'ASHRAE 169-2006-1B',
980
991
  'ASHRAE 169-2006-2B',
981
992
  'ASHRAE 169-2006-3B',
982
993
  'ASHRAE 169-2006-3C',
@@ -988,6 +999,7 @@ class Standard
988
999
  'ASHRAE 169-2006-7B',
989
1000
  'ASHRAE 169-2006-8A',
990
1001
  'ASHRAE 169-2006-8B',
1002
+ 'ASHRAE 169-2013-0B',
991
1003
  'ASHRAE 169-2013-1B',
992
1004
  'ASHRAE 169-2013-2B',
993
1005
  'ASHRAE 169-2013-3B',
@@ -1008,10 +1020,12 @@ class Standard
1008
1020
  'ASHRAE 169-2013-6A',
1009
1021
  'ASHRAE 169-2013-7A'
1010
1022
  drybulb_limit_f = 70
1011
- when 'ASHRAE 169-2006-1A',
1023
+ when 'ASHRAE 169-2006-0A',
1024
+ 'ASHRAE 169-2006-1A',
1012
1025
  'ASHRAE 169-2006-2A',
1013
1026
  'ASHRAE 169-2006-3A',
1014
1027
  'ASHRAE 169-2006-4A',
1028
+ 'ASHRAE 169-2013-0A',
1015
1029
  'ASHRAE 169-2013-1A',
1016
1030
  'ASHRAE 169-2013-2A',
1017
1031
  'ASHRAE 169-2013-3A',
@@ -1041,23 +1055,57 @@ class Standard
1041
1055
 
1042
1056
  # Get the OA system and OA controller
1043
1057
  oa_sys = air_loop_hvac.airLoopHVACOutdoorAirSystem
1044
- if oa_sys.is_initialized
1045
- oa_sys = oa_sys.get
1046
- else
1047
- return false # No OA system
1048
- end
1049
- oa_control = oa_sys.getControllerOutdoorAir
1050
1058
 
1059
+ return false unless oa_sys.is_initialized
1060
+
1061
+ oa_sys = oa_sys.get
1062
+ oa_control = oa_sys.getControllerOutdoorAir
1051
1063
  # Apply integrated or non-integrated economizer
1052
1064
  if integrated_economizer_required
1053
- oa_control.setLockoutType('NoLockout')
1065
+ oa_control.setLockoutType('LockoutWithHeating')
1054
1066
  else
1055
- oa_control.setLockoutType('LockoutWithCompressor')
1067
+ # If the airloop include hyrdronic cooling coils,
1068
+ # prevent economizer from operating at and above SAT,
1069
+ # similar to a non-integrated economizer. This is done
1070
+ # because LockoutWithCompressor doesn't work with hydronic
1071
+ # coils
1072
+ if air_loop_hvac_include_hydronic_cooling_coil?(air_loop_hvac)
1073
+ oa_control.setLockoutType('LockoutWithHeating')
1074
+ oa_control.setEconomizerMaximumLimitDryBulbTemperature(standard_design_sizing_temperatures['clg_dsgn_sup_air_temp_c'])
1075
+ else
1076
+ oa_control.setLockoutType('LockoutWithCompressor')
1077
+ end
1056
1078
  end
1057
1079
 
1058
1080
  return true
1059
1081
  end
1060
1082
 
1083
+ # Determine if the airloop includes hydronic cooling coils
1084
+ #
1085
+ # @return [Bool] returns true if hydronic coolings coils are included on the airloop
1086
+ def air_loop_hvac_include_hydronic_cooling_coil?(air_loop_hvac)
1087
+ air_loop_hvac.supplyComponents.each do |comp|
1088
+ return true if comp.to_CoilCoolingWater.is_initialized
1089
+ end
1090
+ return false
1091
+ end
1092
+
1093
+ # Determine if the airloop includes WSHP cooling coils
1094
+ #
1095
+ # @return [Bool] returns true if WSHP cooling coils are included on the airloop
1096
+ def air_loop_hvac_include_wshp?(air_loop_hvac)
1097
+ air_loop_hvac.supplyComponents.each do |comp|
1098
+ return true if comp.to_CoilCoolingWaterToAirHeatPumpEquationFit.is_initialized
1099
+
1100
+ if comp.to_AirLoopHVACUnitarySystem.is_initialized
1101
+ clg_coil = comp.to_AirLoopHVACUnitarySystem.get.coolingCoil.get
1102
+ return true if clg_coil.to_CoilCoolingWaterToAirHeatPumpEquationFit.is_initialized
1103
+
1104
+ end
1105
+ end
1106
+ return false
1107
+ end
1108
+
1061
1109
  # Determine if the system economizer must be integrated or not.
1062
1110
  # Default logic is from 90.1-2004.
1063
1111
  def air_loop_hvac_integrated_economizer_required?(air_loop_hvac, climate_zone)
@@ -1081,7 +1129,9 @@ class Standard
1081
1129
  else
1082
1130
  # Exception c, Systems in climate zones 1,2,3a,4a,5a,5b,6,7,8
1083
1131
  case climate_zone
1084
- when 'ASHRAE 169-2006-1A',
1132
+ when 'ASHRAE 169-2006-0A',
1133
+ 'ASHRAE 169-2006-0B',
1134
+ 'ASHRAE 169-2006-1A',
1085
1135
  'ASHRAE 169-2006-1B',
1086
1136
  'ASHRAE 169-2006-2A',
1087
1137
  'ASHRAE 169-2006-2B',
@@ -1095,6 +1145,8 @@ class Standard
1095
1145
  'ASHRAE 169-2006-7B',
1096
1146
  'ASHRAE 169-2006-8A',
1097
1147
  'ASHRAE 169-2006-8B',
1148
+ 'ASHRAE 169-2013-0A',
1149
+ 'ASHRAE 169-2013-0B',
1098
1150
  'ASHRAE 169-2013-1A',
1099
1151
  'ASHRAE 169-2013-1B',
1100
1152
  'ASHRAE 169-2013-2A',
@@ -1143,11 +1195,15 @@ class Standard
1143
1195
 
1144
1196
  # Determine the minimum capacity that requires an economizer
1145
1197
  case climate_zone
1146
- when 'ASHRAE 169-2006-1A',
1198
+ when 'ASHRAE 169-2006-0A',
1199
+ 'ASHRAE 169-2006-0B',
1200
+ 'ASHRAE 169-2006-1A',
1147
1201
  'ASHRAE 169-2006-1B',
1148
1202
  'ASHRAE 169-2006-2A',
1149
1203
  'ASHRAE 169-2006-3A',
1150
1204
  'ASHRAE 169-2006-4A',
1205
+ 'ASHRAE 169-2013-0A',
1206
+ 'ASHRAE 169-2013-0B',
1151
1207
  'ASHRAE 169-2013-1A',
1152
1208
  'ASHRAE 169-2013-1B',
1153
1209
  'ASHRAE 169-2013-2A',
@@ -1174,7 +1230,7 @@ class Standard
1174
1230
  if min_int_area_served_ft2 == infinity_ft2 && min_ext_area_served_ft2 == infinity_ft2
1175
1231
  OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.AirLoopHVAC', "For #{air_loop_hvac.name}: Economizer not required for climate zone #{climate_zone}.")
1176
1232
  else
1177
- OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.AirLoopHVAC', "For #{air_loop_hvac.name}: Economizer not required for because the interior area served of #{int_area_served_m2} ft2 < minimum of #{min_int_area_served_m2} and the perimeter area served of #{ext_area_served_m2} ft2 < minimum of #{min_ext_area_served_m2} for climate zone #{climate_zone}.")
1233
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.AirLoopHVAC', "For #{air_loop_hvac.name}: Economizer not required for because the interior area served of #{int_area_served_m2} ft2 is less than the minimum of #{min_int_area_served_m2} and the perimeter area served of #{ext_area_served_m2} ft2 is less than the minimum of #{min_ext_area_served_m2} for climate zone #{climate_zone}.")
1178
1234
  end
1179
1235
  return economizer_required
1180
1236
  end
@@ -1259,7 +1315,8 @@ class Standard
1259
1315
  dewpoint_limit_f = nil
1260
1316
 
1261
1317
  case climate_zone
1262
- when 'ASHRAE 169-2006-1B',
1318
+ when 'ASHRAE 169-2006-0B',
1319
+ 'ASHRAE 169-2006-1B',
1263
1320
  'ASHRAE 169-2006-2B',
1264
1321
  'ASHRAE 169-2006-3B',
1265
1322
  'ASHRAE 169-2006-3C',
@@ -1271,6 +1328,7 @@ class Standard
1271
1328
  'ASHRAE 169-2006-7B',
1272
1329
  'ASHRAE 169-2006-8A',
1273
1330
  'ASHRAE 169-2006-8B',
1331
+ 'ASHRAE 169-2013-0B',
1274
1332
  'ASHRAE 169-2013-1B',
1275
1333
  'ASHRAE 169-2013-2B',
1276
1334
  'ASHRAE 169-2013-3B',
@@ -1336,7 +1394,8 @@ class Standard
1336
1394
  # Determine the prohibited types
1337
1395
  prohibited_types = []
1338
1396
  case climate_zone
1339
- when 'ASHRAE 169-2006-1B',
1397
+ when 'ASHRAE 169-2006-0B',
1398
+ 'ASHRAE 169-2006-1B',
1340
1399
  'ASHRAE 169-2006-2B',
1341
1400
  'ASHRAE 169-2006-3B',
1342
1401
  'ASHRAE 169-2006-3C',
@@ -1348,6 +1407,7 @@ class Standard
1348
1407
  'ASHRAE 169-2006-7B',
1349
1408
  'ASHRAE 169-2006-8A',
1350
1409
  'ASHRAE 169-2006-8B',
1410
+ 'ASHRAE 169-2013-0B',
1351
1411
  'ASHRAE 169-2013-1B',
1352
1412
  'ASHRAE 169-2013-2B',
1353
1413
  'ASHRAE 169-2013-3B',
@@ -1361,10 +1421,12 @@ class Standard
1361
1421
  'ASHRAE 169-2013-8A',
1362
1422
  'ASHRAE 169-2013-8B'
1363
1423
  prohibited_types = ['FixedEnthalpy']
1364
- when 'ASHRAE 169-2006-1A',
1424
+ when 'ASHRAE 169-2006-0A',
1425
+ 'ASHRAE 169-2006-1A',
1365
1426
  'ASHRAE 169-2006-2A',
1366
1427
  'ASHRAE 169-2006-3A',
1367
1428
  'ASHRAE 169-2006-4A',
1429
+ 'ASHRAE 169-2013-0A',
1368
1430
  'ASHRAE 169-2013-1A',
1369
1431
  'ASHRAE 169-2013-2A',
1370
1432
  'ASHRAE 169-2013-3A',
@@ -1374,7 +1436,7 @@ class Standard
1374
1436
  'ASHRAE 169-2006-6A',
1375
1437
  'ASHRAE 169-2013-5A',
1376
1438
  'ASHRAE 169-2013-6A'
1377
- prohibited_types = []
1439
+ prohibited_types = []
1378
1440
  end
1379
1441
 
1380
1442
  # Check if the specified type is allowed
@@ -1429,11 +1491,7 @@ class Standard
1429
1491
  end
1430
1492
  end
1431
1493
 
1432
- # ERV Not Applicable for AHUs that have DCV
1433
- # or that have no OA intake.
1434
- controller_oa = nil
1435
- controller_mv = nil
1436
- oa_system = nil
1494
+ # ERV Not Applicable for AHUs that have DCV or that have no OA intake.
1437
1495
  if air_loop_hvac.airLoopHVACOutdoorAirSystem.is_initialized
1438
1496
  oa_system = air_loop_hvac.airLoopHVACOutdoorAirSystem.get
1439
1497
  controller_oa = oa_system.getControllerOutdoorAir
@@ -1502,14 +1560,29 @@ class Standard
1502
1560
  return erv_cfm
1503
1561
  end
1504
1562
 
1505
- # Add an ERV to this airloop.
1506
- # Will be a rotary-type HX
1563
+ # Determine whether to apply an Energy Recovery Ventilator 'ERV' or a Heat Recovery Ventilator 'HRV' depending on the climate zone
1564
+ # Defaults to ERV.
1565
+ # @return [String] the ERV type
1566
+ def air_loop_hvac_energy_recovery_ventilator_type(air_loop_hvac, climate_zone)
1567
+ erv_type = 'ERV'
1568
+ return erv_type
1569
+ end
1570
+
1571
+ # Determine whether to use a Plate-Frame or Rotary Wheel style ERV depending on air loop outdoor air flow rate
1572
+ # Defaults to Rotary.
1573
+ # @return [String] the ERV type
1574
+ def air_loop_hvac_energy_recovery_ventilator_heat_exchanger_type(air_loop_hvac)
1575
+ heat_exchanger_type = 'Rotary'
1576
+ return heat_exchanger_type
1577
+ end
1578
+
1579
+ # Add an ERV to this airloop
1507
1580
  #
1508
1581
  # @param (see #economizer_required?)
1509
1582
  # @return [Bool] Returns true if required, false if not.
1510
1583
  # @todo Add exception logic for systems serving parking garage, warehouse, or multifamily
1511
- def air_loop_hvac_apply_energy_recovery_ventilator(air_loop_hvac)
1512
- # Get the oa system
1584
+ def air_loop_hvac_apply_energy_recovery_ventilator(air_loop_hvac, climate_zone)
1585
+ # Get the OA system
1513
1586
  oa_system = nil
1514
1587
  if air_loop_hvac.airLoopHVACOutdoorAirSystem.is_initialized
1515
1588
  oa_system = air_loop_hvac.airLoopHVACOutdoorAirSystem.get
@@ -1518,57 +1591,52 @@ class Standard
1518
1591
  return false
1519
1592
  end
1520
1593
 
1521
- # Create an ERV
1594
+ # Create an ERV and add it to the OA system
1522
1595
  erv = OpenStudio::Model::HeatExchangerAirToAirSensibleAndLatent.new(air_loop_hvac.model)
1523
- erv.setName("#{air_loop_hvac.name} ERV")
1524
- erv.setSensibleEffectivenessat100HeatingAirFlow(0.7)
1525
- erv.setLatentEffectivenessat100HeatingAirFlow(0.6)
1526
- erv.setSensibleEffectivenessat75HeatingAirFlow(0.7)
1527
- erv.setLatentEffectivenessat75HeatingAirFlow(0.6)
1528
- erv.setSensibleEffectivenessat100CoolingAirFlow(0.75)
1529
- erv.setLatentEffectivenessat100CoolingAirFlow(0.6)
1530
- erv.setSensibleEffectivenessat75CoolingAirFlow(0.75)
1531
- erv.setLatentEffectivenessat75CoolingAirFlow(0.6)
1596
+ erv.addToNode(oa_system.outboardOANode.get)
1597
+
1598
+ # Determine whether to use an ERV and HRV and heat exchanger style
1599
+ erv_type = air_loop_hvac_energy_recovery_ventilator_type(air_loop_hvac, climate_zone)
1600
+ heat_exchanger_type = air_loop_hvac_energy_recovery_ventilator_heat_exchanger_type(air_loop_hvac)
1601
+ erv.setName("#{air_loop_hvac.name} #{erv_type}")
1602
+ erv.setHeatExchangerType(heat_exchanger_type)
1603
+
1604
+ # apply heat exchanger efficiencies
1605
+ air_loop_hvac_apply_energy_recovery_ventilator_efficiency(erv, erv_type: erv_type, heat_exchanger_type: heat_exchanger_type)
1606
+
1607
+ # Apply the prototype heat exchanger power assumptions for rotary style heat exchangers
1608
+ heat_exchanger_air_to_air_sensible_and_latent_apply_prototype_nominal_electric_power(erv)
1609
+
1610
+ # add economizer lockout
1532
1611
  erv.setSupplyAirOutletTemperatureControl(false)
1533
- erv.setHeatExchangerType('Rotary')
1534
- erv.setFrostControlType('ExhaustOnly')
1535
1612
  erv.setEconomizerLockout(true)
1613
+
1614
+ # add defrost
1615
+ erv.setFrostControlType('ExhaustOnly')
1536
1616
  erv.setThresholdTemperature(-23.3) # -10F
1537
1617
  erv.setInitialDefrostTimeFraction(0.167)
1538
1618
  erv.setRateofDefrostTimeFractionIncrease(1.44)
1539
1619
 
1540
- # Add the ERV to the OA system
1541
- erv.addToNode(oa_system.outboardOANode.get)
1542
-
1543
- # Add a setpoint manager OA pretreat
1544
- # to control the ERV
1620
+ # Add a setpoint manager OA pretreat to control the ERV
1545
1621
  spm_oa_pretreat = OpenStudio::Model::SetpointManagerOutdoorAirPretreat.new(air_loop_hvac.model)
1546
1622
  spm_oa_pretreat.setMinimumSetpointTemperature(-99.0)
1547
1623
  spm_oa_pretreat.setMaximumSetpointTemperature(99.0)
1548
1624
  spm_oa_pretreat.setMinimumSetpointHumidityRatio(0.00001)
1549
1625
  spm_oa_pretreat.setMaximumSetpointHumidityRatio(1.0)
1550
- # Reference setpoint node and
1551
- # Mixed air stream node are outlet
1552
- # node of the OA system
1626
+ # Reference setpoint node and mixed air stream node are outlet node of the OA system
1553
1627
  mixed_air_node = oa_system.mixedAirModelObject.get.to_Node.get
1554
1628
  spm_oa_pretreat.setReferenceSetpointNode(mixed_air_node)
1555
1629
  spm_oa_pretreat.setMixedAirStreamNode(mixed_air_node)
1556
- # Outdoor air node is
1557
- # the outboard OA node of teh OA system
1630
+ # Outdoor air node is the outboard OA node of the OA system
1558
1631
  spm_oa_pretreat.setOutdoorAirStreamNode(oa_system.outboardOANode.get)
1559
- # Return air node is the inlet
1560
- # node of the OA system
1632
+ # Return air node is the inlet node of the OA system
1561
1633
  return_air_node = oa_system.returnAirModelObject.get.to_Node.get
1562
1634
  spm_oa_pretreat.setReturnAirStreamNode(return_air_node)
1563
1635
  # Attach to the outlet of the ERV
1564
1636
  erv_outlet = erv.primaryAirOutletModelObject.get.to_Node.get
1565
1637
  spm_oa_pretreat.addToNode(erv_outlet)
1566
1638
 
1567
- # Apply the prototype Heat Exchanger power assumptions.
1568
- heat_exchanger_air_to_air_sensible_and_latent_apply_prototype_nominal_electric_power(erv)
1569
-
1570
- # Determine if the system is a DOAS based on
1571
- # whether there is 100% OA in heating and cooling sizing.
1639
+ # Determine if the system is a DOAS based on whether there is 100% OA in heating and cooling sizing.
1572
1640
  is_doas = false
1573
1641
  sizing_system = air_loop_hvac.sizingSystem
1574
1642
  if sizing_system.allOutdoorAirinCooling && sizing_system.allOutdoorAirinHeating
@@ -1591,6 +1659,24 @@ class Standard
1591
1659
  return true
1592
1660
  end
1593
1661
 
1662
+ # Apply efficiency values to the erv
1663
+ #
1664
+ # @param erv [OpenStudio::Model::HeatExchangerAirToAirSensibleAndLatent] erv to apply efficiency values
1665
+ # @param erv_type [String] erv type ERV or HRV
1666
+ # @param heat_exchanger_type [String] heat exchanger type Rotary or Plate
1667
+ # @return erv [OpenStudio::Model::HeatExchangerAirToAirSensibleAndLatent] erv to apply efficiency values
1668
+ def air_loop_hvac_apply_energy_recovery_ventilator_efficiency(erv, erv_type: 'ERV', heat_exchanger_type: 'Rotary')
1669
+ erv.setSensibleEffectivenessat100HeatingAirFlow(0.7)
1670
+ erv.setLatentEffectivenessat100HeatingAirFlow(0.6)
1671
+ erv.setSensibleEffectivenessat75HeatingAirFlow(0.7)
1672
+ erv.setLatentEffectivenessat75HeatingAirFlow(0.6)
1673
+ erv.setSensibleEffectivenessat100CoolingAirFlow(0.75)
1674
+ erv.setLatentEffectivenessat100CoolingAirFlow(0.6)
1675
+ erv.setSensibleEffectivenessat75CoolingAirFlow(0.75)
1676
+ erv.setLatentEffectivenessat75CoolingAirFlow(0.6)
1677
+ return erv
1678
+ end
1679
+
1594
1680
  # Determine if multizone vav optimization is required.
1595
1681
  # Defaults to 90.1-2007 logic, where it is not required.
1596
1682
  #
@@ -1668,10 +1754,24 @@ class Standard
1668
1754
  # @return [Bool] Returns true if required, false if not.
1669
1755
  # @todo Add exception logic for systems serving parking garage, warehouse, or multifamily
1670
1756
  def air_loop_hvac_adjust_minimum_vav_damper_positions(air_loop_hvac)
1757
+ # Do not apply the adjustment to some of the system in
1758
+ # the hospital and outpatient which have their minimum
1759
+ # damper position determined based on AIA 2001 ventilation
1760
+ # requirements
1761
+ if (@instvarbuilding_type == 'Hospital' && (air_loop_hvac.name.to_s.include?('VAV_ER') || air_loop_hvac.name.to_s.include?('VAV_ICU') ||
1762
+ air_loop_hvac.name.to_s.include?('VAV_OR') || air_loop_hvac.name.to_s.include?('VAV_LABS') ||
1763
+ air_loop_hvac.name.to_s.include?('VAV_PATRMS'))) ||
1764
+ (@instvarbuilding_type == 'Outpatient' && air_loop_hvac.name.to_s.include?('Outpatient F1'))
1765
+
1766
+ return true
1767
+ end
1768
+
1671
1769
  # Total uncorrected outdoor airflow rate
1672
1770
  v_ou = 0.0
1673
1771
  air_loop_hvac.thermalZones.each do |zone|
1674
- v_ou += thermal_zone_outdoor_airflow_rate(zone)
1772
+ # Vou is the system uncorrected outdoor airflow:
1773
+ # Zone airflow is multiplied by the zone multiplier
1774
+ v_ou += thermal_zone_outdoor_airflow_rate(zone) * zone.multiplier.to_f
1675
1775
  end
1676
1776
 
1677
1777
  v_ou_cfm = OpenStudio.convert(v_ou, 'm^3/s', 'cfm').get
@@ -1698,6 +1798,10 @@ class Standard
1698
1798
  e_vzs = []
1699
1799
  e_vzs_adj = []
1700
1800
  num_zones_adj = 0
1801
+
1802
+ # Retrieve the sum of the zone minimum primary airflow
1803
+ vpz_min_sum = air_loop_hvac.autosizeSumMinimumHeatingAirFlowRates
1804
+
1701
1805
  air_loop_hvac.thermalZones.sort.each do |zone|
1702
1806
  # Breathing zone airflow rate
1703
1807
  v_bz = thermal_zone_outdoor_airflow_rate(zone)
@@ -1757,14 +1861,18 @@ class Standard
1757
1861
  end
1758
1862
  end
1759
1863
 
1864
+ # Zone ventilation efficiency calculation is computed
1865
+ # on a per zone basis, the zone primary airflow is
1866
+ # adjusted to removed the zone multiplier
1867
+ v_pz /= zone.multiplier.to_f
1868
+
1760
1869
  # For VAV Reheat terminals, min flow is greater of mdp
1761
1870
  # and min flow rate / design flow rate.
1762
1871
  mdp = mdp_term
1763
- mdp_oa = min_zn_flow / v_ps
1872
+ mdp_oa = min_zn_flow / v_pz
1764
1873
  if min_zn_flow > 0.0
1765
1874
  mdp = [mdp_term, mdp_oa].max.round(2)
1766
1875
  end
1767
- # OpenStudio::logFree(OpenStudio::Info, 'openstudio.standards.AirLoopHVAC', "For #{self.name}: Zone #{zone.name} mdp_term = #{mdp_term.round(2)}, mdp_oa = #{mdp_oa.round(2)}; mdp_final = #{mdp}")
1768
1876
 
1769
1877
  # Zone minimum discharge airflow rate
1770
1878
  v_dz = v_pz * mdp
@@ -1772,7 +1880,7 @@ class Standard
1772
1880
  # Zone discharge air fraction
1773
1881
  z_d = v_oz / v_dz
1774
1882
 
1775
- # Zone ventilation effectiveness !!!
1883
+ # Zone ventilation effectiveness
1776
1884
  e_vz = 1.0 + x_s - z_d
1777
1885
 
1778
1886
  # Store the ventilation effectiveness
@@ -1804,27 +1912,12 @@ class Standard
1804
1912
 
1805
1913
  # Store the ventilation effectiveness
1806
1914
  e_vzs_adj << e_vz_adj
1807
-
1808
1915
  # Round the minimum damper position to avoid nondeterministic results
1809
1916
  # at the ~13th decimal place, which can cause regression errors
1810
1917
  mdp_adj = mdp_adj.round(11)
1811
1918
 
1812
1919
  # Set the adjusted minimum damper position
1813
- zone.equipment.each do |equip|
1814
- if equip.to_AirTerminalSingleDuctVAVHeatAndCoolNoReheat.is_initialized
1815
- term = equip.to_AirTerminalSingleDuctVAVHeatAndCoolNoReheat.get
1816
- term.setZoneMinimumAirFlowFraction(mdp_adj)
1817
- elsif equip.to_AirTerminalSingleDuctVAVHeatAndCoolReheat.is_initialized
1818
- term = equip.to_AirTerminalSingleDuctVAVHeatAndCoolReheat.get
1819
- term.setZoneMinimumAirFlowFraction(mdp_adj)
1820
- elsif equip.to_AirTerminalSingleDuctVAVNoReheat.is_initialized
1821
- term = equip.to_AirTerminalSingleDuctVAVNoReheat.get
1822
- term.setConstantMinimumAirFlowFraction(mdp_adj)
1823
- elsif equip.to_AirTerminalSingleDuctVAVReheat.is_initialized
1824
- term = equip.to_AirTerminalSingleDuctVAVReheat.get
1825
- term.setConstantMinimumAirFlowFraction(mdp_adj)
1826
- end
1827
- end
1920
+ air_loop_hvac_set_minimum_damper_position(zone, mdp_adj)
1828
1921
 
1829
1922
  num_zones_adj += 1
1830
1923
 
@@ -1850,6 +1943,16 @@ class Standard
1850
1943
  v_ot_adj = v_ou / e_v_adj
1851
1944
  v_ot_adj_cfm = OpenStudio.convert(v_ot_adj, 'm^3/s', 'cfm').get
1852
1945
 
1946
+ # Adjust minimum damper position if the sum of maximum
1947
+ # zone airflow are lower than the calculated system
1948
+ # outdoor air intake
1949
+ if v_ot_adj > vpz_min_sum && v_ot_adj > 0
1950
+ mdp_adj = [v_ot_adj / air_loop_hvac.autosizeSumAirTerminalMaxAirFlowRate, 1].min
1951
+ air_loop_hvac.thermalZones.sort.each do |zone|
1952
+ air_loop_hvac_set_minimum_damper_position(zone, mdp_adj)
1953
+ end
1954
+ end
1955
+
1853
1956
  # Report out the results of the multizone calculations
1854
1957
  if num_zones_adj > 0
1855
1958
  OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.AirLoopHVAC', "For #{air_loop_hvac.name}: the multizone outdoor air calculation method was applied. A simple summation of the zone outdoor air requirements gives a value of #{v_ou_cfm.round} cfm. Applying the multizone method gives a value of #{v_ot_cfm.round} cfm, with an original system ventilation effectiveness of #{e_v.round(2)}. After increasing the minimum damper position in #{num_zones_adj} critical zones, the resulting requirement is #{v_ot_adj_cfm.round} cfm with a system ventilation effectiveness of #{e_v_adj.round(2)}.")
@@ -1865,6 +1968,27 @@ class Standard
1865
1968
  return true
1866
1969
  end
1867
1970
 
1971
+ # Set an air terminal's minimum damper position
1972
+ def air_loop_hvac_set_minimum_damper_position(zone, mdp)
1973
+ zone.equipment.each do |equip|
1974
+ if equip.to_AirTerminalSingleDuctVAVHeatAndCoolNoReheat.is_initialized
1975
+ term = equip.to_AirTerminalSingleDuctVAVHeatAndCoolNoReheat.get
1976
+ term.setZoneMinimumAirFlowFraction(mdp)
1977
+ elsif equip.to_AirTerminalSingleDuctVAVHeatAndCoolReheat.is_initialized
1978
+ term = equip.to_AirTerminalSingleDuctVAVHeatAndCoolReheat.get
1979
+ term.setZoneMinimumAirFlowFraction(mdp)
1980
+ elsif equip.to_AirTerminalSingleDuctVAVNoReheat.is_initialized
1981
+ term = equip.to_AirTerminalSingleDuctVAVNoReheat.get
1982
+ term.setConstantMinimumAirFlowFraction(mdp)
1983
+ elsif equip.to_AirTerminalSingleDuctVAVReheat.is_initialized
1984
+ term = equip.to_AirTerminalSingleDuctVAVReheat.get
1985
+ term.setConstantMinimumAirFlowFraction(mdp)
1986
+ end
1987
+ end
1988
+
1989
+ return true
1990
+ end
1991
+
1868
1992
  # For critical zones of Outpatient, if the minimum airflow rate required by the accreditation standard (AIA 2001) is significantly
1869
1993
  # less than the autosized peak design airflow in any of the three climate zones (Houston, Baltimore and Burlington), the minimum
1870
1994
  # airflow fraction of the terminal units is reduced to the value: "required minimum airflow rate / autosized peak design flow"
@@ -1888,6 +2012,10 @@ class Standard
1888
2012
  rated_maximum_flow_rate = vav_terminal.autosizedMaximumAirFlowRate.get
1889
2013
  # compare the VAV autosized maximum airflow with the minimum airflow rate required by the accreditation standard
1890
2014
  ratio = minimum_airflow_per_zone / rated_maximum_flow_rate
2015
+
2016
+ # round to avoid results variances in sizing runs
2017
+ ratio = ratio.round(11)
2018
+
1891
2019
  if ratio >= 0.95
1892
2020
  vav_terminal.setConstantMinimumAirFlowFraction(1)
1893
2021
  elsif ratio < 0.95
@@ -2130,7 +2258,7 @@ class Standard
2130
2258
  # supply outlet node of the system.
2131
2259
  sat_oa_reset.addToNode(supplyOutletNode)
2132
2260
 
2133
- OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.AirLoopHVAC', "For #{air_loop_hvac.name}: Supply air temperature reset was enabled. When OAT > #{hi_oat_f.round}F, SAT is #{sat_at_hi_oat_f.round}F. When OAT < #{lo_oat_f.round}F, SAT is #{sat_at_lo_oat_f.round}F. It varies linearly in between these points.")
2261
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.AirLoopHVAC', "For #{air_loop_hvac.name}: Supply air temperature reset was enabled. When OAT is greater than #{hi_oat_f.round}F, SAT is #{sat_at_hi_oat_f.round}F. When OAT is less than #{lo_oat_f.round}F, SAT is #{sat_at_lo_oat_f.round}F. It varies linearly in between these points.")
2134
2262
 
2135
2263
  return true
2136
2264
  end
@@ -2248,6 +2376,21 @@ class Standard
2248
2376
  return has_erv
2249
2377
  end
2250
2378
 
2379
+ # Determine if the air loop is a unitary system
2380
+ #
2381
+ # @return [Bool] Returns true if a unitary system is present, false if not.
2382
+ def air_loop_hvac_unitary_system?(air_loop_hvac)
2383
+ is_unitary_system = false
2384
+ air_loop_hvac.supplyComponents.each do |component|
2385
+ obj_type = component.iddObjectType.valueName.to_s
2386
+ case obj_type
2387
+ when 'OS_AirLoopHVAC_UnitarySystem', 'OS_AirLoopHVAC_UnitaryHeatPump_AirToAir', 'OS_AirLoopHVAC_UnitaryHeatPump_AirToAir_MultiSpeed', 'OS_AirLoopHVAC_UnitaryHeatCool_VAVChangeoverBypass'
2388
+ is_unitary_system = true
2389
+ end
2390
+ end
2391
+ return is_unitary_system
2392
+ end
2393
+
2251
2394
  # Set the VAV damper control to single maximum or dual maximum control depending on the standard.
2252
2395
  #
2253
2396
  # @return [Bool] Returns true if successful, false if not
@@ -2370,7 +2513,7 @@ class Standard
2370
2513
  end
2371
2514
 
2372
2515
  # If here, motorized damper is required
2373
- OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.AirLoopHVAC', "For #{air_loop_hvac.name}: Motorized OA damper is required because the building has #{num_stories} stories, >= the minimum of #{maximum_stories} stories for climate zone #{climate_zone}, and the system OA intake of #{oa_flow_cfm.round} cfm is >= the minimum threshold of #{minimum_oa_flow_cfm} cfm. ")
2516
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.AirLoopHVAC', "For #{air_loop_hvac.name}: Motorized OA damper is required because the building has #{num_stories} stories which is greater than or equal to the minimum of #{maximum_stories} stories for climate zone #{climate_zone}, and the system OA intake of #{oa_flow_cfm.round} cfm is greater than or equal to the minimum threshold of #{minimum_oa_flow_cfm} cfm. ")
2374
2517
  motorized_oa_damper_required = true
2375
2518
 
2376
2519
  return motorized_oa_damper_required
@@ -2993,12 +3136,38 @@ class Standard
2993
3136
  elsif air_loop_hvac.autosizedDesignSupplyAirFlowRate.is_initialized
2994
3137
  design_supply_air_flow_rate = air_loop_hvac.autosizedDesignSupplyAirFlowRate.get
2995
3138
  else
2996
- OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.AirLoopHVAC', "For #{air_loop_hvac.name} design sypply air flow rate is not available.")
3139
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.AirLoopHVAC', "For #{air_loop_hvac.name} design supply air flow rate is not available.")
2997
3140
  end
2998
3141
 
2999
3142
  return design_supply_air_flow_rate
3000
3143
  end
3001
3144
 
3145
+ # Determine how much residential area the airloop serves
3146
+ #
3147
+ # @returns [Double] res_area m^2
3148
+ def air_loop_hvac_residential_area_served(air_loop_hvac)
3149
+ res_area = 0.0
3150
+
3151
+ air_loop_hvac.thermalZones.each do |zone|
3152
+ zone.spaces.each do |space|
3153
+ # Skip spaces with no space type
3154
+ next if space.spaceType.empty?
3155
+
3156
+ space_type = space.spaceType.get
3157
+
3158
+ # Skip spaces with no standards space type
3159
+ next if space_type.standardsSpaceType.empty?
3160
+
3161
+ standards_space_type = space_type.standardsSpaceType.get
3162
+ if standards_space_type.downcase.include?('apartment') || standards_space_type.downcase.include?('guestroom') || standards_space_type.downcase.include?('patroom')
3163
+ res_area += space.floorArea
3164
+ end
3165
+ end
3166
+ end
3167
+
3168
+ return res_area
3169
+ end
3170
+
3002
3171
  # Determine how much data center
3003
3172
  # area the airloop serves.
3004
3173
  #
@@ -3015,8 +3184,12 @@ class Standard
3015
3184
  zone.spaces.each do |space|
3016
3185
  # Skip spaces with no space type
3017
3186
  next if space.spaceType.empty?
3187
+
3018
3188
  space_type = space.spaceType.get
3189
+
3190
+ # Skip spaces with no standards space type
3019
3191
  next if space_type.standardsSpaceType.empty?
3192
+
3020
3193
  standards_space_type = space_type.standardsSpaceType.get
3021
3194
  # Counts as a data center if the name includes 'data'
3022
3195
  if standards_space_type.downcase.include?('data center') || standards_space_type.downcase.include?('datacenter')
@@ -3032,6 +3205,19 @@ class Standard
3032
3205
  return dc_area_m2
3033
3206
  end
3034
3207
 
3208
+ # Determine how many humidifies are on the airloop
3209
+ #
3210
+ # @return [Integer] the number of humidifiers
3211
+ def air_loop_hvac_humidifier_count(air_loop_hvac)
3212
+ humidifiers = 0
3213
+ air_loop_hvac.supplyComponents.each do |cmp|
3214
+ if cmp.to_HumidifierSteamElectric.is_initialized
3215
+ humidifiers += 1
3216
+ end
3217
+ end
3218
+ return humidifiers
3219
+ end
3220
+
3035
3221
  # Sets the maximum reheat temperature to the specified
3036
3222
  # value for all reheat terminals (of any type) on the loop.
3037
3223
  #