openstudio-standards 0.4.0 → 0.5.0.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 (376) hide show
  1. checksums.yaml +4 -4
  2. data/data/inventory/thermal_bridging.csv +90 -0
  3. data/data/standards/OpenStudio_Standards-deer-comstock.xlsx +0 -0
  4. data/data/standards/manage_OpenStudio_Standards.rb +1 -1
  5. data/data/standards/test_performance_expected_dd_results.csv +2014 -1891
  6. data/lib/openstudio-standards/btap/analysis.rb +8 -8
  7. data/lib/openstudio-standards/btap/bridging.rb +664 -645
  8. data/lib/openstudio-standards/btap/btap.model.rb +14 -14
  9. data/lib/openstudio-standards/btap/btap.rb +7 -7
  10. data/lib/openstudio-standards/btap/btap_result.rb +1 -1
  11. data/lib/openstudio-standards/btap/economics.rb +23 -23
  12. data/lib/openstudio-standards/btap/envelope.rb +8 -8
  13. data/lib/openstudio-standards/btap/equest.rb +1 -1
  14. data/lib/openstudio-standards/btap/geometry.rb +2 -2
  15. data/lib/openstudio-standards/btap/mpc.rb +7 -7
  16. data/lib/openstudio-standards/btap/schedules.rb +1 -1
  17. data/lib/openstudio-standards/btap/simmanager.rb +4 -4
  18. data/lib/openstudio-standards/btap/spaceloads.rb +26 -26
  19. data/lib/openstudio-standards/btap/utilities.rb +6 -6
  20. data/lib/openstudio-standards/btap/vintagizer.rb +1 -1
  21. data/lib/openstudio-standards/constructions/information.rb +83 -0
  22. data/lib/openstudio-standards/constructions/materials/modify.rb +72 -0
  23. data/lib/openstudio-standards/constructions/modify.rb +80 -0
  24. data/lib/openstudio-standards/create_typical/create_typical.rb +983 -0
  25. data/lib/openstudio-standards/create_typical/enumerations.rb +484 -0
  26. data/lib/openstudio-standards/create_typical/space_type_blend.rb +791 -0
  27. data/lib/openstudio-standards/create_typical/space_type_ratios.rb +494 -0
  28. data/lib/openstudio-standards/daylighting/space.rb +47 -0
  29. data/lib/openstudio-standards/geometry/create.rb +801 -0
  30. data/lib/openstudio-standards/geometry/create_bar.rb +2171 -0
  31. data/lib/openstudio-standards/geometry/information.rb +462 -0
  32. data/lib/openstudio-standards/geometry/modify.rb +48 -0
  33. data/lib/openstudio-standards/hvac/air_loop/information.rb +79 -0
  34. data/lib/openstudio-standards/hvac/cbecs_hvac.rb +616 -0
  35. data/lib/openstudio-standards/hvac/setpoint_managers/information.rb +91 -0
  36. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.AirTerminalSingleDuctVAVReheat.rb +1 -1
  37. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.AirTerminalSingleDuctVAVReheat.rb +1 -1
  38. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.AirTerminalSingleDuctVAVReheat.rb +1 -1
  39. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.Model.rb +1 -1
  40. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirTerminalSingleDuctVAVReheat.rb +1 -1
  41. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.Model.rb +2 -2
  42. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.hvac_systems.rb +1 -1
  43. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.AirTerminalSingleDuctVAVReheat.rb +1 -1
  44. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.Model.rb +4 -36
  45. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.hvac_systems.rb +1 -1
  46. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirTerminalSingleDuctVAVReheat.rb +1 -1
  47. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Model.rb +4 -36
  48. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Space.rb +3 -3
  49. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.hvac_systems.rb +1 -1
  50. data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.AirTerminalSingleDuctVAVReheat.rb +1 -1
  51. data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.Model.elevators.rb +1 -1
  52. data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.AirTerminalSingleDuctVAVReheat.rb +1 -1
  53. data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.CoilHeatingGas.rb +1 -1
  54. data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.Model.elevators.rb +1 -1
  55. data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.AirTerminalSingleDuctVAVReheat.rb +1 -1
  56. data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirTerminalSingleDuctVAVReheat.rb +1 -1
  57. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.College.rb +7 -7
  58. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Courthouse.rb +8 -8
  59. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.FullServiceRestaurant.rb +14 -14
  60. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.HighRiseApartment.rb +9 -9
  61. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Hospital.rb +16 -16
  62. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Laboratory.rb +7 -7
  63. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeDataCenterHighITE.rb +8 -8
  64. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeDataCenterLowITE.rb +8 -8
  65. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeHotel.rb +11 -11
  66. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeOffice.rb +7 -7
  67. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeOfficeDetailed.rb +9 -9
  68. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.MediumOffice.rb +8 -8
  69. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.MediumOfficeDetailed.rb +11 -11
  70. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.MidriseApartment.rb +9 -9
  71. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Outpatient.rb +19 -19
  72. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.PrimarySchool.rb +10 -10
  73. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.QuickServiceRestaurant.rb +13 -13
  74. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.RetailStandalone.rb +6 -6
  75. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.RetailStripmall.rb +6 -6
  76. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SecondarySchool.rb +9 -9
  77. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallDataCenterHighITE.rb +8 -8
  78. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallDataCenterLowITE.rb +8 -8
  79. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallHotel.rb +8 -8
  80. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallOffice.rb +8 -8
  81. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallOfficeDetailed.rb +11 -11
  82. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SuperMarket.rb +10 -10
  83. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SuperTallBuilding.rb +19 -19
  84. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.TallBuilding.rb +18 -18
  85. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Warehouse.rb +6 -6
  86. data/lib/openstudio-standards/prototypes/common/do_not_edit_metaclasses.rb +957 -957
  87. data/lib/openstudio-standards/prototypes/common/objects/Prototype.AirConditionerVariableRefrigerantFlow.rb +1 -1
  88. data/lib/openstudio-standards/prototypes/common/objects/Prototype.AirTerminalSingleDuctVAVReheat.rb +1 -1
  89. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingWaterToAirHeatPumpEquationFit.rb +84 -16
  90. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingDXSingleSpeed.rb +1 -1
  91. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingGas.rb +1 -1
  92. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingWaterToAirHeatPumpEquationFit.rb +61 -10
  93. data/lib/openstudio-standards/prototypes/common/objects/Prototype.ControllerWaterCoil.rb +1 -1
  94. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoolingTower.rb +1 -1
  95. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Fan.rb +1 -1
  96. data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanConstantVolume.rb +1 -1
  97. data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanOnOff.rb +1 -1
  98. data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanVariableVolume.rb +1 -1
  99. data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanZoneExhaust.rb +1 -1
  100. data/lib/openstudio-standards/prototypes/common/objects/Prototype.HeatExchangerAirToAirSensibleAndLatent.rb +2 -2
  101. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.exterior_lights.rb +4 -4
  102. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.hvac.rb +4 -4
  103. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.rb +43 -30
  104. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.swh.rb +1 -1
  105. data/lib/openstudio-standards/prototypes/common/objects/Prototype.ServiceWaterHeating.rb +18 -11
  106. data/lib/openstudio-standards/prototypes/common/objects/Prototype.SizingSystem.rb +1 -1
  107. data/lib/openstudio-standards/prototypes/common/objects/Prototype.hvac_systems.rb +774 -117
  108. data/lib/openstudio-standards/prototypes/common/objects/Prototype.radiant_system_controls.rb +340 -481
  109. data/lib/openstudio-standards/prototypes/common/objects/Prototype.refrigeration.rb +3 -3
  110. data/lib/openstudio-standards/prototypes/common/objects/Prototype.utilities.rb +3 -3
  111. data/lib/openstudio-standards/prototypes/common/prototype_metaprogramming.rb +22 -22
  112. data/lib/openstudio-standards/prototypes/deer/deer.Model.rb +1 -1
  113. data/lib/openstudio-standards/qaqc/calibration.rb +131 -0
  114. data/lib/openstudio-standards/qaqc/create_results.rb +983 -0
  115. data/lib/openstudio-standards/qaqc/envelope.rb +399 -0
  116. data/lib/openstudio-standards/qaqc/eui.rb +213 -0
  117. data/lib/openstudio-standards/qaqc/hvac.rb +1943 -0
  118. data/lib/openstudio-standards/qaqc/internal_loads.rb +568 -0
  119. data/lib/openstudio-standards/qaqc/reporting.rb +141 -0
  120. data/lib/openstudio-standards/qaqc/schedules.rb +129 -0
  121. data/lib/openstudio-standards/qaqc/service_water_heating.rb +273 -0
  122. data/lib/openstudio-standards/qaqc/weather_files.rb +497 -0
  123. data/lib/openstudio-standards/qaqc/zone_conditions.rb +278 -0
  124. data/lib/openstudio-standards/schedules/create.rb +364 -0
  125. data/lib/openstudio-standards/schedules/information.rb +169 -0
  126. data/lib/openstudio-standards/schedules/modify.rb +445 -0
  127. data/lib/openstudio-standards/standards/Standards.AirLoopHVAC.rb +110 -71
  128. data/lib/openstudio-standards/standards/Standards.AirTerminalSingleDuctParallelPIUReheat.rb +3 -3
  129. data/lib/openstudio-standards/standards/Standards.AirTerminalSingleDuctVAVReheat.rb +4 -4
  130. data/lib/openstudio-standards/standards/Standards.BoilerHotWater.rb +2 -1
  131. data/lib/openstudio-standards/standards/Standards.ChillerElectricEIR.rb +16 -10
  132. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXSingleSpeed.rb +4 -4
  133. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXTwoSpeed.rb +1 -1
  134. data/lib/openstudio-standards/standards/Standards.CoilCoolingWaterToAirHeatPumpEquationFit.rb +1 -1
  135. data/lib/openstudio-standards/standards/Standards.CoilDX.rb +4 -4
  136. data/lib/openstudio-standards/standards/Standards.CoilHeatingDXMultiSpeed.rb +1 -1
  137. data/lib/openstudio-standards/standards/Standards.CoilHeatingDXSingleSpeed.rb +5 -5
  138. data/lib/openstudio-standards/standards/Standards.CoilHeatingGas.rb +1 -1
  139. data/lib/openstudio-standards/standards/Standards.CoilHeatingGasMultiStage.rb +1 -1
  140. data/lib/openstudio-standards/standards/Standards.CoilHeatingWaterToAirHeatPumpEquationFit.rb +1 -1
  141. data/lib/openstudio-standards/standards/Standards.Construction.rb +17 -18
  142. data/lib/openstudio-standards/standards/Standards.CoolingTower.rb +6 -6
  143. data/lib/openstudio-standards/standards/Standards.CoolingTowerSingleSpeed.rb +1 -1
  144. data/lib/openstudio-standards/standards/Standards.CoolingTowerTwoSpeed.rb +1 -1
  145. data/lib/openstudio-standards/standards/Standards.CoolingTowerVariableSpeed.rb +1 -1
  146. data/lib/openstudio-standards/standards/Standards.Fan.rb +6 -12
  147. data/lib/openstudio-standards/standards/Standards.FanVariableVolume.rb +2 -2
  148. data/lib/openstudio-standards/standards/Standards.FluidCooler.rb +1 -1
  149. data/lib/openstudio-standards/standards/Standards.HeaderedPumpsVariableSpeed.rb +1 -1
  150. data/lib/openstudio-standards/standards/Standards.HeatExchangerSensLat.rb +3 -3
  151. data/lib/openstudio-standards/standards/Standards.Model.rb +411 -261
  152. data/lib/openstudio-standards/standards/Standards.PlanarSurface.rb +2 -2
  153. data/lib/openstudio-standards/standards/Standards.PlantLoop.rb +94 -29
  154. data/lib/openstudio-standards/standards/Standards.Pump.rb +2 -2
  155. data/lib/openstudio-standards/standards/Standards.ScheduleConstant.rb +2 -2
  156. data/lib/openstudio-standards/standards/Standards.ScheduleRuleset.rb +14 -14
  157. data/lib/openstudio-standards/standards/Standards.Space.rb +37 -30
  158. data/lib/openstudio-standards/standards/Standards.SpaceType.rb +38 -29
  159. data/lib/openstudio-standards/standards/Standards.SubSurface.rb +7 -7
  160. data/lib/openstudio-standards/standards/Standards.Surface.rb +13 -13
  161. data/lib/openstudio-standards/standards/Standards.ThermalZone.rb +109 -66
  162. data/lib/openstudio-standards/standards/Standards.WaterHeaterMixed.rb +11 -4
  163. data/lib/openstudio-standards/standards/Standards.ZoneHVACComponent.rb +6 -6
  164. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.AirLoopHVAC.rb +1 -1
  165. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.PlantLoop.rb +1 -1
  166. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.Space.rb +1 -1
  167. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.Space.rb +1 -1
  168. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.AirLoopHVAC.rb +4 -4
  169. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.AirTerminalSingleDuctVAVReheat.rb +1 -1
  170. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.Space.rb +4 -4
  171. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirLoopHVAC.rb +4 -4
  172. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirTerminalSingleDuctVAVReheat.rb +1 -1
  173. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.CoolingTowerVariableSpeed.rb +1 -1
  174. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.Model.rb +5 -21
  175. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.Space.rb +4 -4
  176. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.WaterHeaterMixed.rb +1 -1
  177. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.ZoneHVACComponent.rb +1 -1
  178. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.AirLoopHVAC.rb +36 -4
  179. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.AirTerminalSingleDuctVAVReheat.rb +1 -1
  180. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.CoolingTowerVariableSpeed.rb +1 -1
  181. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.Space.rb +4 -4
  182. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.ZoneHVACComponent.rb +1 -1
  183. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/comstock_ashrae_90_1_2016/comstock_ashrae_90_1_2016.AirLoopHVAC.rb +26 -0
  184. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirLoopHVAC.rb +53 -10
  185. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirTerminalSingleDuctVAVReheat.rb +1 -1
  186. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.CoolingTowerVariableSpeed.rb +1 -1
  187. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Space.rb +6 -6
  188. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.ZoneHVACComponent.rb +2 -2
  189. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/comstock_ashrae_90_1_2019/comstock_ashrae_90_1_2019.AirLoopHVAC.rb +26 -0
  190. data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.curves.json +211 -211
  191. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.economizers.json +14 -14
  192. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.AirLoopHVAC.rb +4 -4
  193. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.Model.rb +1 -1
  194. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.PlantLoop.rb +1 -1
  195. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.economizers.json +14 -14
  196. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.AirLoopHVAC.rb +4 -4
  197. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.Model.rb +1 -1
  198. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.PlantLoop.rb +1 -1
  199. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.AirLoopHVAC.rb +6 -6
  200. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.AirTerminalSingleDuctVAVReheat.rb +1 -1
  201. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.CoolingTowerVariableSpeed.rb +1 -1
  202. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.PlantLoop.rb +1 -1
  203. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.Space.rb +4 -4
  204. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirLoopHVAC.rb +6 -6
  205. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirTerminalSingleDuctVAVReheat.rb +1 -1
  206. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.CoolingTowerVariableSpeed.rb +1 -1
  207. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.PlantLoop.rb +1 -1
  208. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.Space.rb +4 -4
  209. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.AirLoopHVAC.rb +22 -28
  210. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.AirTerminalSingleDuctParallelPIUReheat.rb +1 -1
  211. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.AirTerminalSingleDuctVAVReheat.rb +2 -2
  212. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.BoilerHotWater.rb +1 -74
  213. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.ChillerElectricEIR.rb +7 -59
  214. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilCoolingDXSingleSpeed.rb +1 -1
  215. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilCoolingDXTwoSpeed.rb +1 -1
  216. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilDX.rb +1 -1
  217. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilHeatingDXSingleSpeed.rb +1 -1
  218. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilHeatingGas.rb +1 -21
  219. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.DesignSpecificationOutdoorAir.rb +101 -0
  220. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.FanConstantVolume.rb +1 -1
  221. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.FanOnOff.rb +1 -1
  222. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.FanVariableVolume.rb +1 -1
  223. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.HeatExchangerSensLat.rb +1 -1
  224. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.Model.rb +643 -526
  225. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.PlanarSurface.rb +8 -2
  226. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.PlantLoop.rb +17 -77
  227. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.Space.rb +74 -16
  228. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.SpaceType.rb +96 -44
  229. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.Surface.rb +6 -6
  230. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.ThermalZone.rb +18 -6
  231. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.ZoneHVACComponent.rb +1 -1
  232. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.rb +328 -74
  233. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/ashrae_90_1_prm_2019.Model.rb +0 -118
  234. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/ashrae_90_1_prm_2019.rb +2 -1
  235. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.heat_rejection.json +1 -1
  236. data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/baseline_outdoor_air.md +35 -0
  237. data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/set_plug_load_measures.md +1 -1
  238. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/ashrae_90_1_prm.UserData.rb +228 -0
  239. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_enums.rb +131 -0
  240. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_space.csv +1 -1
  241. data/lib/openstudio-standards/standards/cbes/cbes.AirLoopHVAC.rb +5 -5
  242. data/lib/openstudio-standards/standards/cbes/cbes.Model.rb +1 -1
  243. data/lib/openstudio-standards/standards/cbes/cbes.PlantLoop.rb +1 -1
  244. data/lib/openstudio-standards/standards/cbes/cbes.Space.rb +1 -1
  245. data/lib/openstudio-standards/standards/cbes/cbes_t24_2005/cbes_t24_2005.Space.rb +1 -1
  246. data/lib/openstudio-standards/standards/cbes/cbes_t24_2008/cbes_t24_2008.Space.rb +1 -1
  247. data/lib/openstudio-standards/standards/deer/deer.AirLoopHVAC.rb +109 -27
  248. data/lib/openstudio-standards/standards/deer/deer.Space.rb +1 -1
  249. data/lib/openstudio-standards/standards/deer/deer_1985/data/deer_1985.economizers.json +246 -4
  250. data/lib/openstudio-standards/standards/deer/deer_1996/data/deer_1996.economizers.json +246 -4
  251. data/lib/openstudio-standards/standards/deer/deer_2003/data/deer_2003.economizers.json +246 -4
  252. data/lib/openstudio-standards/standards/deer/deer_2003/deer_2003.ThermalZone.rb +18 -18
  253. data/lib/openstudio-standards/standards/deer/deer_2007/data/deer_2007.economizers.json +246 -4
  254. data/lib/openstudio-standards/standards/deer/deer_2007/deer_2007.ThermalZone.rb +18 -18
  255. data/lib/openstudio-standards/standards/deer/deer_2011/data/deer_2011.economizers.json +246 -4
  256. data/lib/openstudio-standards/standards/deer/deer_2011/deer_2011.ThermalZone.rb +18 -18
  257. data/lib/openstudio-standards/standards/deer/deer_2014/data/deer_2014.economizers.json +248 -6
  258. data/lib/openstudio-standards/standards/deer/deer_2014/deer_2014.Space.rb +3 -3
  259. data/lib/openstudio-standards/standards/deer/deer_2014/deer_2014.ThermalZone.rb +18 -18
  260. data/lib/openstudio-standards/standards/deer/deer_2015/data/deer_2015.economizers.json +248 -6
  261. data/lib/openstudio-standards/standards/deer/deer_2015/deer_2015.Space.rb +3 -3
  262. data/lib/openstudio-standards/standards/deer/deer_2015/deer_2015.ThermalZone.rb +18 -18
  263. data/lib/openstudio-standards/standards/deer/deer_2017/data/deer_2017.economizers.json +248 -6
  264. data/lib/openstudio-standards/standards/deer/deer_2017/deer_2017.Space.rb +3 -3
  265. data/lib/openstudio-standards/standards/deer/deer_2017/deer_2017.ThermalZone.rb +18 -18
  266. data/lib/openstudio-standards/standards/deer/deer_2020/data/deer_2020.economizers.json +248 -6
  267. data/lib/openstudio-standards/standards/deer/deer_2020/deer_2020.AirLoopHVAC.rb +18 -5
  268. data/lib/openstudio-standards/standards/deer/deer_2020/deer_2020.FanVariableVolume.rb +1 -1
  269. data/lib/openstudio-standards/standards/deer/deer_2020/deer_2020.Space.rb +3 -3
  270. data/lib/openstudio-standards/standards/deer/deer_2020/deer_2020.ThermalZone.rb +18 -18
  271. data/lib/openstudio-standards/standards/deer/deer_2025/data/deer_2025.economizers.json +248 -6
  272. data/lib/openstudio-standards/standards/deer/deer_2025/deer_2025.AirLoopHVAC.rb +3 -3
  273. data/lib/openstudio-standards/standards/deer/deer_2025/deer_2025.FanVariableVolume.rb +1 -1
  274. data/lib/openstudio-standards/standards/deer/deer_2025/deer_2025.Space.rb +3 -3
  275. data/lib/openstudio-standards/standards/deer/deer_2030/data/deer_2030.economizers.json +248 -6
  276. data/lib/openstudio-standards/standards/deer/deer_2030/data/deer_2030.heat_pumps.json +2 -2
  277. data/lib/openstudio-standards/standards/deer/deer_2030/deer_2030.AirLoopHVAC.rb +3 -3
  278. data/lib/openstudio-standards/standards/deer/deer_2030/deer_2030.FanVariableVolume.rb +1 -1
  279. data/lib/openstudio-standards/standards/deer/deer_2030/deer_2030.Space.rb +3 -3
  280. data/lib/openstudio-standards/standards/deer/deer_2035/data/deer_2035.economizers.json +248 -6
  281. data/lib/openstudio-standards/standards/deer/deer_2035/deer_2035.AirLoopHVAC.rb +3 -3
  282. data/lib/openstudio-standards/standards/deer/deer_2035/deer_2035.FanVariableVolume.rb +1 -1
  283. data/lib/openstudio-standards/standards/deer/deer_2035/deer_2035.Space.rb +3 -3
  284. data/lib/openstudio-standards/standards/deer/deer_2040/data/deer_2040.economizers.json +248 -6
  285. data/lib/openstudio-standards/standards/deer/deer_2040/deer_2040.AirLoopHVAC.rb +3 -3
  286. data/lib/openstudio-standards/standards/deer/deer_2040/deer_2040.FanVariableVolume.rb +1 -1
  287. data/lib/openstudio-standards/standards/deer/deer_2040/deer_2040.Space.rb +3 -3
  288. data/lib/openstudio-standards/standards/deer/deer_2045/data/deer_2045.economizers.json +260 -0
  289. data/lib/openstudio-standards/standards/deer/deer_2045/deer_2045.AirLoopHVAC.rb +3 -3
  290. data/lib/openstudio-standards/standards/deer/deer_2045/deer_2045.FanVariableVolume.rb +1 -1
  291. data/lib/openstudio-standards/standards/deer/deer_2045/deer_2045.Space.rb +3 -3
  292. data/lib/openstudio-standards/standards/deer/deer_2050/data/deer_2050.economizers.json +248 -6
  293. data/lib/openstudio-standards/standards/deer/deer_2050/deer_2050.AirLoopHVAC.rb +3 -3
  294. data/lib/openstudio-standards/standards/deer/deer_2050/deer_2050.FanVariableVolume.rb +1 -1
  295. data/lib/openstudio-standards/standards/deer/deer_2050/deer_2050.Space.rb +3 -3
  296. data/lib/openstudio-standards/standards/deer/deer_2055/data/deer_2055.economizers.json +248 -6
  297. data/lib/openstudio-standards/standards/deer/deer_2055/deer_2055.AirLoopHVAC.rb +3 -3
  298. data/lib/openstudio-standards/standards/deer/deer_2055/deer_2055.FanVariableVolume.rb +1 -1
  299. data/lib/openstudio-standards/standards/deer/deer_2055/deer_2055.Space.rb +3 -3
  300. data/lib/openstudio-standards/standards/deer/deer_2060/data/deer_2060.economizers.json +248 -6
  301. data/lib/openstudio-standards/standards/deer/deer_2060/deer_2060.AirLoopHVAC.rb +3 -3
  302. data/lib/openstudio-standards/standards/deer/deer_2060/deer_2060.FanVariableVolume.rb +1 -1
  303. data/lib/openstudio-standards/standards/deer/deer_2060/deer_2060.Space.rb +3 -3
  304. data/lib/openstudio-standards/standards/deer/deer_2065/data/deer_2065.economizers.json +248 -6
  305. data/lib/openstudio-standards/standards/deer/deer_2065/deer_2065.AirLoopHVAC.rb +3 -3
  306. data/lib/openstudio-standards/standards/deer/deer_2065/deer_2065.FanVariableVolume.rb +1 -1
  307. data/lib/openstudio-standards/standards/deer/deer_2065/deer_2065.Space.rb +3 -3
  308. data/lib/openstudio-standards/standards/deer/deer_2070/data/deer_2070.economizers.json +248 -6
  309. data/lib/openstudio-standards/standards/deer/deer_2070/deer_2070.AirLoopHVAC.rb +3 -3
  310. data/lib/openstudio-standards/standards/deer/deer_2070/deer_2070.FanVariableVolume.rb +1 -1
  311. data/lib/openstudio-standards/standards/deer/deer_2070/deer_2070.Space.rb +3 -3
  312. data/lib/openstudio-standards/standards/deer/deer_2075/data/deer_2075.economizers.json +248 -6
  313. data/lib/openstudio-standards/standards/deer/deer_2075/deer_2075.AirLoopHVAC.rb +3 -3
  314. data/lib/openstudio-standards/standards/deer/deer_2075/deer_2075.FanVariableVolume.rb +1 -1
  315. data/lib/openstudio-standards/standards/deer/deer_2075/deer_2075.Space.rb +3 -3
  316. data/lib/openstudio-standards/standards/deer/deer_pre_1975/data/deer_pre_1975.economizers.json +246 -4
  317. data/lib/openstudio-standards/standards/necb/BTAP1980TO2010/data/space_types.json +447 -223
  318. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/building_envelope.rb +1 -1
  319. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/data/space_types.json +447 -223
  320. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_systems.rb +5 -2
  321. data/lib/openstudio-standards/standards/necb/ECMS/data/chiller_types.json +25 -0
  322. data/lib/openstudio-standards/standards/necb/ECMS/data/chillers.json +44 -0
  323. data/lib/openstudio-standards/standards/necb/ECMS/data/curves.json +225 -0
  324. data/lib/openstudio-standards/standards/necb/ECMS/ecms.rb +2 -2
  325. data/lib/openstudio-standards/standards/necb/ECMS/hvac_systems.rb +193 -73
  326. data/lib/openstudio-standards/standards/necb/ECMS/pv_ground.rb +1 -1
  327. data/lib/openstudio-standards/standards/necb/NECB2011/autozone.rb +10 -4
  328. data/lib/openstudio-standards/standards/necb/NECB2011/beps_compliance_path.rb +7 -7
  329. data/lib/openstudio-standards/standards/necb/NECB2011/building_envelope.rb +4 -5
  330. data/lib/openstudio-standards/standards/necb/NECB2011/data/chiller_types.json +32 -0
  331. data/lib/openstudio-standards/standards/necb/NECB2011/data/chillers.json +1 -1
  332. data/lib/openstudio-standards/standards/necb/NECB2011/data/constants.json +36 -0
  333. data/lib/openstudio-standards/standards/necb/NECB2011/data/fuel_type_sets.json +7 -7
  334. data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/NorthernEducation.osm +47587 -0
  335. data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/NorthernHealthCare.osm +49764 -0
  336. data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/Warehouse.osm +283 -297
  337. data/lib/openstudio-standards/standards/necb/NECB2011/data/space_type_unit_definitions.txt +2 -1
  338. data/lib/openstudio-standards/standards/necb/NECB2011/data/space_types.json +447 -223
  339. data/lib/openstudio-standards/standards/necb/NECB2011/data/standards_data.rb +3 -3
  340. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_1_multi_speed.rb +1 -1
  341. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_systems.rb +49 -27
  342. data/lib/openstudio-standards/standards/necb/NECB2011/necb_2011.rb +400 -202
  343. data/lib/openstudio-standards/standards/necb/NECB2011/service_water_heating.rb +4 -4
  344. data/lib/openstudio-standards/standards/necb/NECB2015/data/space_types.json +637 -318
  345. data/lib/openstudio-standards/standards/necb/NECB2015/hvac_systems.rb +18 -1
  346. data/lib/openstudio-standards/standards/necb/NECB2015/necb_2015.rb +3 -3
  347. data/lib/openstudio-standards/standards/necb/NECB2017/data/space_types.json +637 -318
  348. data/lib/openstudio-standards/standards/necb/NECB2017/hvac_systems.rb +1 -1
  349. data/lib/openstudio-standards/standards/necb/NECB2017/necb_2017.rb +3 -3
  350. data/lib/openstudio-standards/standards/necb/NECB2020/building_envelope.rb +1 -1
  351. data/lib/openstudio-standards/standards/necb/NECB2020/data/space_types.json +615 -307
  352. data/lib/openstudio-standards/standards/necb/NECB2020/service_water_heating.rb +4 -4
  353. data/lib/openstudio-standards/standards/necb/common/btap_data.rb +10 -5
  354. data/lib/openstudio-standards/standards/necb/common/btap_datapoint.rb +1 -1
  355. data/lib/openstudio-standards/utilities/assertion.rb +128 -0
  356. data/lib/openstudio-standards/utilities/logging.rb +2 -3
  357. data/lib/openstudio-standards/utilities/object_info.rb +39 -18
  358. data/lib/openstudio-standards/utilities/schedule_translator.rb +8 -6
  359. data/lib/openstudio-standards/utilities/simulation.rb +24 -11
  360. data/lib/openstudio-standards/utilities/sqlfile.rb +10 -5
  361. data/lib/openstudio-standards/version.rb +1 -1
  362. data/lib/openstudio-standards/weather/Weather.Model.rb +8 -9
  363. data/lib/openstudio-standards/weather/Weather.stat_file.rb +3 -3
  364. data/lib/openstudio-standards/weather/information.rb +35 -0
  365. data/lib/openstudio-standards.rb +69 -5
  366. metadata +52 -16
  367. data/data/standards/OpenStudio_Standards-deer-ALL-comstock(space_types).xlsx +0 -0
  368. data/lib/openstudio-standards/hvac_sizing/Siz.AirLoopHVAC.rb +0 -59
  369. data/lib/openstudio-standards/hvac_sizing/Siz.CoilCoolingWater.rb +0 -13
  370. data/lib/openstudio-standards/hvac_sizing/Siz.HVACComponent.rb +0 -36
  371. data/lib/openstudio-standards/hvac_sizing/Siz.HeatingCoolingFuels.rb +0 -898
  372. data/lib/openstudio-standards/hvac_sizing/Siz.Model.rb +0 -126
  373. data/lib/openstudio-standards/hvac_sizing/Siz.ThermalZone.rb +0 -356
  374. data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.Model.rb +0 -35
  375. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoolingTower.rb +0 -110
  376. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoolingTowerVariableSpeed.rb +0 -5
@@ -1,4 +1,5 @@
1
1
  require 'csv'
2
+ require 'date'
2
3
 
3
4
  class Standard
4
5
  attr_accessor :space_multiplier_map
@@ -18,40 +19,37 @@ class Standard
18
19
  #
19
20
  # @note Per 90.1, the Performance Rating Method "does NOT offer an alternative compliance path for minimum standard compliance."
20
21
  # This means you can't use this method for code compliance to get a permit.
21
- # @param user_model [OpenStudio::model::Model] User specified OpenStudio model
22
+ # @param model [OpenStudio::Model::Model] User specified OpenStudio model
22
23
  # @param climate_zone [String] the climate zone
23
24
  # @param hvac_building_type [String] the building type for baseline HVAC system determination (90.1-2016 and onward)
24
25
  # @param wwr_building_type [String] the building type for baseline WWR determination (90.1-2016 and onward)
25
26
  # @param swh_building_type [String] the building type for baseline SWH determination (90.1-2016 and onward)
26
27
  # @param output_dir [String] the directory where the PRM generations will be performed
27
- # @param run_all_orients [Boolean] indicate weather a baseline model should be created for all 4 orientations: same as user model, +90 deg, +180 deg, +270 deg
28
28
  # @param debug [Boolean] If true, will report out more detailed debugging output
29
- # @return [Bool] returns true if successful, false if not
30
-
31
- # Method used for 90.1-2016 and onward
29
+ # @return [Boolean] returns true if successful, false if not
32
30
  def model_create_prm_stable_baseline_building(model, climate_zone, hvac_building_type, wwr_building_type, swh_building_type, output_dir = Dir.pwd, unmet_load_hours_check = true, debug = false)
33
- model_create_prm_any_baseline_building(model, '', climate_zone, hvac_building_type, wwr_building_type, swh_building_type, true, false, output_dir, true, unmet_load_hours_check, debug)
31
+ model_create_prm_any_baseline_building(model, '', climate_zone, hvac_building_type, wwr_building_type, swh_building_type, true, true, false, output_dir, true, unmet_load_hours_check, debug)
34
32
  end
35
33
 
36
34
  # Creates a Performance Rating Method (aka Appendix G aka LEED) baseline building model
37
35
  # Method used for 90.1-2013 and prior
38
- # @param user_model [OpenStudio::model::Model] User specified OpenStudio model
36
+ # @param model [OpenStudio::Model::Model] User specified OpenStudio model
39
37
  # @param building_type [String] the building type
40
38
  # @param climate_zone [String] the climate zone
41
39
  # @param custom [String] the custom logic that will be applied during baseline creation. Valid choices are 'Xcel Energy CO EDA' or '90.1-2007 with addenda dn'.
42
40
  # If nothing is specified, no custom logic will be applied; the process will follow the template logic explicitly.
43
41
  # @param sizing_run_dir [String] the directory where the sizing runs will be performed
44
- # @param debug [Boolean] If true, will report out more detailed debugging output
42
+ # @param debug [Boolean] if true, will report out more detailed debugging output
45
43
  def model_create_prm_baseline_building(model, building_type, climate_zone, custom = nil, sizing_run_dir = Dir.pwd, debug = false)
46
- model_create_prm_any_baseline_building(model, building_type, climate_zone, 'All others', 'All others', 'All others', false, custom, sizing_run_dir, false, false, debug)
44
+ model_create_prm_any_baseline_building(model, building_type, climate_zone, 'All others', 'All others', 'All others', false, false, custom, sizing_run_dir, false, false, debug)
47
45
  end
48
46
 
49
- # Creates a Performance Rating Method (aka Appendix G aka LEED) baseline building model
50
- # based on the inputs currently in the model.
47
+ # Creates a Performance Rating Method (aka 90.1-Appendix G) baseline building model
48
+ # based on the inputs currently in the user model.
51
49
  #
52
50
  # @note Per 90.1, the Performance Rating Method "does NOT offer an alternative compliance path for minimum standard compliance."
53
51
  # This means you can't use this method for code compliance to get a permit.
54
- # @param user_model [OpenStudio::model::Model] User specified OpenStudio model
52
+ # @param user_model [OpenStudio::Model::Model] User specified OpenStudio model
55
53
  # @param building_type [String] the building type
56
54
  # @param climate_zone [String] the climate zone
57
55
  # @param hvac_building_type [String] the building type for baseline HVAC system determination (90.1-2016 and onward)
@@ -63,27 +61,69 @@ class Standard
63
61
  # @param sizing_run_dir [String] the directory where the sizing runs will be performed
64
62
  # @param run_all_orients [Boolean] indicate weather a baseline model should be created for all 4 orientations: same as user model, +90 deg, +180 deg, +270 deg
65
63
  # @param debug [Boolean] If true, will report out more detailed debugging output
66
- # @return [Bool] returns true if successful, false if not
67
- def model_create_prm_any_baseline_building(user_model, building_type, climate_zone, hvac_building_type = 'All others', wwr_building_type = 'All others', swh_building_type = 'All others', model_deep_copy = false, custom = nil, sizing_run_dir = Dir.pwd, run_all_orients = false, unmet_load_hours_check = true, debug = false)
64
+ # @return [Boolean] returns true if successful, false if not
65
+ def model_create_prm_any_baseline_building(user_model, building_type, climate_zone, hvac_building_type = 'All others', wwr_building_type = 'All others', swh_building_type = 'All others', model_deep_copy = false, create_proposed_model = false, custom = nil, sizing_run_dir = Dir.pwd, run_all_orients = false, unmet_load_hours_check = true, debug = false)
66
+ if create_proposed_model
67
+ # Perform a user model design day run only to make sure
68
+ # that the user model is valid, i.e. can run without major
69
+ # errors
70
+ if !model_run_sizing_run(user_model, "#{sizing_run_dir}/USER-SR")
71
+ OpenStudio.logFree(OpenStudio::Warn, 'prm.log',
72
+ "The user model is not a valid OpenStudio model. Baseline and proposed model(s) won't be created.")
73
+ prm_raise(false,
74
+ sizing_run_dir,
75
+ "The user model is not a valid OpenStudio model. Baseline and proposed model(s) won't be created.")
76
+ end
77
+
78
+ # Check if proposed HVAC system is autosized
79
+ if model_is_hvac_autosized(user_model)
80
+ OpenStudio.logFree(OpenStudio::Warn, 'prm.log',
81
+ "The user model's HVAC system is partly autosized.")
82
+ end
83
+
84
+ # Generate proposed model from the user-provided model
85
+ proposed_model = model_create_prm_proposed_building(user_model)
86
+ end
87
+
68
88
  # Check proposed model unmet load hours
69
89
  if unmet_load_hours_check
70
- # Run proposed model; need annual simulation to get unmet load hours
71
- if model_run_simulation_and_log_errors(user_model, run_dir = "#{sizing_run_dir}/PROP")
72
- umlh = model_get_unmet_load_hours(user_model)
90
+ # Run user model; need annual simulation to get unmet load hours
91
+ if model_run_simulation_and_log_errors(proposed_model, run_dir = "#{sizing_run_dir}/PROP")
92
+ umlh = model_get_unmet_load_hours(proposed_model)
73
93
  if umlh > 300
74
- OpenStudio.logFree(OpenStudio::Error, 'prm.log', "Proposed model unmet load hours exceed 300. Baseline model(s) won't be created.")
75
- raise "Proposed model unmet load hours exceed 300. Baseline model(s) won't be created."
94
+ OpenStudio.logFree(OpenStudio::Warn, 'prm.log',
95
+ "Proposed model unmet load hours (#{umlh}) exceed 300. Baseline model(s) won't be created.")
96
+ prm_raise(false,
97
+ sizing_run_dir,
98
+ "Proposed model unmet load hours exceed 300. Baseline model(s) won't be created.")
76
99
  end
77
100
  else
78
- OpenStudio.logFree(OpenStudio::Error, 'prm.log', 'Simulation failed. Check the model to make sure no severe errors.')
79
- raise 'Simulation on proposed model failed. Baseline generation is stopped.'
101
+ OpenStudio.logFree(OpenStudio::Error, 'prm.log',
102
+ 'Simulation failed. Check the model to make sure no severe errors.')
103
+ prm_raise(false,
104
+ sizing_run_dir,
105
+ 'Simulation on proposed model failed. Baseline generation is stopped.')
80
106
  end
81
107
  end
108
+ if create_proposed_model
109
+ # Make the run directory if it doesn't exist
110
+ unless Dir.exist?(sizing_run_dir)
111
+ FileUtils.mkdir_p(sizing_run_dir)
112
+ end
113
+ # Save proposed model
114
+ proposed_model.save(OpenStudio::Path.new("#{sizing_run_dir}/proposed_final.osm"), true)
115
+ forward_translator = OpenStudio::EnergyPlus::ForwardTranslator.new
116
+ idf = forward_translator.translateModel(proposed_model)
117
+ idf_path = OpenStudio::Path.new("#{sizing_run_dir}/proposed_final.idf")
118
+ idf.save(idf_path, true)
119
+ end
82
120
 
83
121
  # User data process
84
122
  # bldg_type_hvac_zone_hash could be an empty hash if all zones in the models are unconditioned
123
+ # TODO - move this portion to the top of the function
85
124
  bldg_type_hvac_zone_hash = {}
86
- handle_user_input_data(user_model, climate_zone, hvac_building_type, wwr_building_type, swh_building_type, bldg_type_hvac_zone_hash)
125
+ handle_user_input_data(user_model, climate_zone, sizing_run_dir, hvac_building_type, wwr_building_type, swh_building_type, bldg_type_hvac_zone_hash)
126
+
87
127
  # Define different orientation from original orientation
88
128
  # for each individual baseline models
89
129
  # Need to run proposed model sizing simulation if no sql data is available
@@ -175,17 +215,26 @@ class Standard
175
215
  # For PRM, it only applies lights for now.
176
216
  space_type_apply_internal_loads(space_type, set_people, set_lights, set_electric_equipment, set_gas_equipment, set_ventilation, set_infiltration)
177
217
  end
218
+
178
219
  # Modify the lighting schedule to handle lighting occupancy sensors
179
220
  # Modify the upper limit value of fractional schedule to avoid the fatal error caused by schedule value higher than 1
180
221
  space_type_light_sch_change(model)
181
222
 
223
+ # Modify electric equipment computer room schedule
224
+ model.getSpaces.sort.each do |space|
225
+ space_add_prm_computer_room_equipment_schedule(space)
226
+ end
227
+
182
228
  model_apply_baseline_exterior_lighting(model)
183
229
 
184
230
  # Modify the elevator motor peak power
185
231
  model_add_prm_elevators(model)
186
232
 
187
233
  # Calculate infiltration as per 90.1 PRM rules
188
- model_baseline_apply_infiltration_standard(model, climate_zone)
234
+ model_apply_standard_infiltration(model)
235
+
236
+ # Apply user outdoor air specs as per 90.1 PRM rules exceptions
237
+ model_apply_userdata_outdoor_air(model)
189
238
 
190
239
  # If any of the lights are missing schedules, assign an always-off schedule to those lights.
191
240
  # This is assumed to be the user's intent in the proposed model.
@@ -256,11 +305,7 @@ class Standard
256
305
  end
257
306
 
258
307
  # Compute and marke DCV related information before deleting proposed model HVAC systems
259
- model_mark_zone_dcv_existence(model)
260
- model_add_dcv_user_exception_properties(model)
261
- model_add_dcv_requirement_properties(model)
262
- model_add_apxg_dcv_properties(model)
263
- model_raise_user_model_dcv_errors(model)
308
+ model_evaluate_dcv_requirements(model)
264
309
 
265
310
  # Remove all HVAC from model, excluding service water heating
266
311
  model_remove_prm_hvac(model)
@@ -442,7 +487,7 @@ class Standard
442
487
  # Set Solar Distribution to MinimalShadowing... problem is when you also have detached shading such as surrounding buildings etc
443
488
  # It won't be taken into account, while it should: only self shading from the building itself should be turned off but to my knowledge there isn't a way to do this in E+
444
489
 
445
- model_status = degs > 0 ? "final_#{degs}" : 'final'
490
+ model_status = degs > 0 ? "baseline_final_#{degs}" : 'baseline_final'
446
491
  model.save(OpenStudio::Path.new("#{sizing_run_dir}/#{model_status}.osm"), true)
447
492
 
448
493
  # Translate to IDF and save for debugging
@@ -521,12 +566,138 @@ class Standard
521
566
  return true
522
567
  end
523
568
 
569
+ # Creates a Performance Rating Method (aka 90.1-Appendix G) proposed building model
570
+ # based on the inputs currently in the user model.
571
+ #
572
+ # @param user_model [OpenStudio::model::Model] User specified OpenStudio model
573
+ # @return [OpenStudio::model::Model] returns the proposed building model corresponding to a user model
574
+ def model_create_prm_proposed_building(user_model)
575
+ # Create copy of the user model
576
+ proposed_model = BTAP::FileIO.deep_copy(user_model)
577
+
578
+ # Get user building level data
579
+ building_name = proposed_model.building.get.name.get
580
+ user_buildings = @standards_data.key?('userdata_building') ? @standards_data['userdata_building'] : nil
581
+
582
+ # If needed, modify user model infiltration
583
+ if user_buildings
584
+ user_building_index = user_buildings.index { |user_building| building_name.include? user_building['name'] }
585
+ # TODO: Move the user data processing section
586
+ infiltration_modeled_from_field_verification_results = 'false'
587
+ if user_building_index && user_buildings[user_building_index]['infiltration_modeled_from_field_verification_results']
588
+ infiltration_modeled_from_field_verification_results = user_buildings[user_building_index]['infiltration_modeled_from_field_verification_results'].to_s.downcase
589
+ end
590
+
591
+ # Calculate total infiltration flow rate per envelope area
592
+ building_envelope_area_m2 = model_building_envelope_area(proposed_model)
593
+ curr_tot_infil_m3_per_s_per_envelope_area = model_current_building_envelope_infiltration_at_75pa(proposed_model, building_envelope_area_m2)
594
+ curr_tot_infil_cfm_per_envelope_area = OpenStudio.convert(curr_tot_infil_m3_per_s_per_envelope_area, 'm^3/s*m^2', 'cfm/ft^2').get
595
+
596
+ # Warn users if the infiltration modeling in the user/proposed model is not based on field verification
597
+ # If not modeled based on field verification, it should be modeled as 0.6 cfm/ft2
598
+ unless infiltration_modeled_from_field_verification_results.casecmp('true')
599
+ if curr_tot_infil_cfm_per_envelope_area < 0.6
600
+ OpenStudio.logFree(OpenStudio::Info, 'prm.log', "The user model's I_75Pa is estimated to be #{curr_tot_infil_cfm_per_envelope_area} m3/s per m2 of total building envelope")
601
+ end
602
+ end
603
+
604
+ # Modify model to follow the PRM infiltration modeling method
605
+ model_apply_standard_infiltration(proposed_model, curr_tot_infil_cfm_per_envelope_area)
606
+ end
607
+
608
+ # If needed, remove all non-adiabatic pipes of SWH loops
609
+ proposed_model.getPlantLoops.sort.each do |plant_loop|
610
+ # Skip non service water heating loops
611
+ next unless plant_loop_swh_loop?(plant_loop)
612
+
613
+ plant_loop_adiabatic_pipes_only(plant_loop)
614
+ end
615
+
616
+ # TODO: Once data refactoring has been completed lookup values from the database;
617
+ # For now, hard-code LPD for selected spaces. Current Standards Space Type
618
+ # of OS:SpaceType is the PRM interior lighting space type. These values are
619
+ # from Table 9.6.1 as required by Section G3.1.6.e.
620
+ proposed_lpd_residential_spaces = {
621
+ 'dormitory - living quarters' => 0.5, # "primary_space_type": "Dormitory—Living Quarters",
622
+ 'apartment - hardwired' => 0.6, # "primary_space_type": "Dwelling Unit"
623
+ 'guest room' => 0.41 # "primary_space_type": "Guest Room",
624
+ }
625
+
626
+ # Make proposed model space related adjustments
627
+ proposed_model.getSpaces.each do |space|
628
+ # If needed, modify computer equipment schedule
629
+ # Section G3.1.3.16
630
+ space_add_prm_computer_room_equipment_schedule(space)
631
+
632
+ # If needed, modify lighting power denstities in residential spaces/zones
633
+ # Section G3.1.6.e
634
+ standard_space_type = prm_get_optional_handler(space, @sizing_run_dir, 'spaceType', 'standardsSpaceType').downcase
635
+ user_spaces = @standards_data.key?('userdata_space') ? @standards_data['userdata_space'] : nil
636
+ if ['dormitory - living quarters', 'apartment - hardwired', 'guest room'].include?(standard_space_type)
637
+ user_spaces.each do |user_data|
638
+ if user_data['name'].to_s == space.name.to_s && user_data['has_residential_exception'].to_s.downcase != 'yes'
639
+ # Get LPDs
640
+ lpd_w_per_m2 = space.lightingPowerPerFloorArea
641
+ ref_space_lpd_per_ft2 = proposed_lpd_residential_spaces[standard_space_type]
642
+ ref_space_lpd_per_m2 = OpenStudio.convert(ref_space_lpd_per_ft2, 'W/ft^2', 'W/m^2').get
643
+ # Set new LPD
644
+ space.setLightingPowerPerFloorArea([lpd_w_per_m2, ref_space_lpd_per_m2].max)
645
+ end
646
+ end
647
+ end
648
+ end
649
+
650
+ return proposed_model
651
+ end
652
+
653
+ # Determine whether or not the HVAC system in a model is autosized
654
+ #
655
+ # As it is not realistic expectation to have all autosizable
656
+ # fields hard input, the method relies on autosizable field
657
+ # of prime movers (fans, pumps) and heating/cooling devices
658
+ # in the models (boilers, chillers, coils)
659
+ #
660
+ # @param model [OpenStudio::Model::Model] OpenStudio model object
661
+ # @return [Boolean] returns true if the HVAC system is likely autosized, false otherwise
662
+ def model_is_hvac_autosized(model)
663
+ is_hvac_autosized = false
664
+ model.modelObjects.each do |obj|
665
+ obj_type = obj.iddObjectType.valueName.to_s.downcase
666
+
667
+ # Check if the object needs to be checked for autosizing
668
+ obj_to_be_checked_for_autosizing = false
669
+ if obj_type.include?('chiller') || obj_type.include?('boiler') || obj_type.include?('coil') || obj_type.include?('fan') || obj_type.include?('pump') || obj_type.include?('waterheater')
670
+ if !obj_type.include?('controller')
671
+ obj_to_be_checked_for_autosizing = true
672
+ end
673
+ end
674
+
675
+ # Check for autosizing
676
+ if obj_to_be_checked_for_autosizing
677
+ casted_obj = model_cast_model_object(obj)
678
+
679
+ next if casted_obj.nil?
680
+
681
+ casted_obj.methods.each do |method|
682
+ if method.to_s.include?('is') && method.to_s.include?('Autosized')
683
+ if casted_obj.public_send(method) == true
684
+ is_hvac_autosized = true
685
+ OpenStudio.logFree(OpenStudio::Info, 'prm.log', "The #{method.to_s.sub('is', '').sub('Autosized', '').sub(':', '')} field of the #{obj_type} named #{casted_obj.name} is autosized. It should be hard sized.")
686
+ end
687
+ end
688
+ end
689
+ end
690
+ end
691
+
692
+ return is_hvac_autosized
693
+ end
694
+
524
695
  # Determine if there needs to be a sizing run after constructions are added
525
696
  # so that EnergyPlus can calculate the VLTs of layer-by-layer glazing constructions.
526
697
  # These VLT values are needed for the daylighting controls logic for some templates.
527
698
  #
528
699
  # @param model [OpenStudio::Model::Model] OpenStudio model object
529
- # @return [Bool] returns true if required, false if not
700
+ # @return [Boolean] returns true if required, false if not
530
701
  def model_create_prm_baseline_building_requires_vlt_sizing_run(model)
531
702
  return false # Not required for most templates
532
703
  end
@@ -596,7 +767,7 @@ class Standard
596
767
  # Add design day schedule objects for space loads,
597
768
  # not used for 2013 and earlier
598
769
  # @author Xuechen (Jerry) Lei, PNNL
599
- # @param model [OpenStudio::model::Model] OpenStudio model object
770
+ # @param model [OpenStudio::Model::Model] OpenStudio model object
600
771
  #
601
772
  def model_apply_prm_baseline_sizing_schedule(model)
602
773
  return true
@@ -670,8 +841,14 @@ class Standard
670
841
  # Define the minimum area for the
671
842
  # exception that allows a different
672
843
  # system type in part of the building.
673
- exception_min_area_m2 = model_prm_baseline_system_group_minimum_area(model, custom)
674
- exception_min_area_ft2 = OpenStudio.convert(exception_min_area_m2, 'm^2', 'ft^2').get
844
+ if custom == 'Xcel Energy CO EDA'
845
+ # Customization - Xcel EDA Program Manual 2014
846
+ # 3.2.1 Mechanical System Selection ii
847
+ exception_min_area_ft2 = 5000
848
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.Standards.Model', "Customization; per Xcel EDA Program Manual 2014 3.2.1 Mechanical System Selection ii, minimum area for non-predominant conditions reduced to #{exception_min_area_ft2} ft2.")
849
+ else
850
+ exception_min_area_ft2 = 20_000
851
+ end
675
852
 
676
853
  # Get occupancy type, fuel type, and area information for all zones,
677
854
  # excluding unconditioned zones.
@@ -865,16 +1042,22 @@ class Standard
865
1042
  # fuels in the entire baseline building are changed for the purposes of HVAC system assignment
866
1043
  all_htg_fuels = []
867
1044
  all_clg_fuels = []
1045
+
1046
+ # error if HVACComponent heating fuels method is not available
1047
+ if model.version < OpenStudio::VersionString.new('3.6.0')
1048
+ OpenStudio.logFree(OpenStudio::Error, 'openstudio.Standards.Model', 'Required HVACComponent methods .heatingFuelTypes and .coolingFuelTypes are not available in pre-OpenStudio 3.6.0 versions. Use a more recent version of OpenStudio.')
1049
+ end
1050
+
868
1051
  model.getThermalZones.sort.each do |zone|
869
- all_htg_fuels += zone.heating_fuels
870
- all_clg_fuels += zone.cooling_fuels
1052
+ all_htg_fuels += zone.heatingFuelTypes.map(&:valueName)
1053
+ all_clg_fuels += zone.coolingFuelTypes.map(&:valueName)
871
1054
  end
872
1055
 
873
1056
  purchased_heating = false
874
1057
  purchased_cooling = false
875
1058
 
876
1059
  # Purchased heating
877
- if all_htg_fuels.include?('DistrictHeating')
1060
+ if all_htg_fuels.include?('DistrictHeating') || all_htg_fuels.include?('DistrictHeatingWater') || all_htg_fuels.include?('DistrictHeatingSteam')
878
1061
  purchased_heating = true
879
1062
  end
880
1063
 
@@ -923,13 +1106,19 @@ class Standard
923
1106
  end
924
1107
 
925
1108
  # Before deleting proposed HVAC components, determine for each zone if it has district heating
926
- # @return [Hash] of boolean with zone name as key
1109
+ # @return [Hash] Hash of boolean with zone name as key
927
1110
  def model_get_district_heating_zones(model)
928
1111
  has_district_hash = {}
929
1112
  model.getThermalZones.sort.each do |zone|
930
1113
  has_district_hash['building'] = false
931
- htg_fuels = zone.heating_fuels
932
- if htg_fuels.include?('DistrictHeating')
1114
+
1115
+ # error if HVACComponent heating fuels method is not available
1116
+ if model.version < OpenStudio::VersionString.new('3.6.0')
1117
+ OpenStudio.logFree(OpenStudio::Error, 'openstudio.Standards.Model', 'Required HVACComponent method .heatingFuelTypes is not available in pre-OpenStudio 3.6.0 versions. Use a more recent version of OpenStudio.')
1118
+ end
1119
+
1120
+ htg_fuels = zone.heatingFuelTypes.map(&:valueName)
1121
+ if htg_fuels.include?('DistrictHeating') || htg_fuels.include?('DistrictHeatingWater') || htg_fuels.include?('DistrictHeatingSteam')
933
1122
  has_district_hash[zone.name] = true
934
1123
  has_district_hash['building'] = true
935
1124
  else
@@ -941,14 +1130,21 @@ class Standard
941
1130
 
942
1131
  # Get list of heat types across a list of zones
943
1132
  # @param zones [array of objects] array of zone objects
944
- # @return [string] concatenated string showing different fuel types in a group of zones
1133
+ # @return [String concatenated string showing different fuel types in a group of zones
945
1134
  def get_group_heat_types(model, zones)
946
1135
  heat_list = ''
947
1136
  has_district_heat = false
948
1137
  has_fuel_heat = false
949
1138
  has_elec_heat = false
1139
+
1140
+ # error if HVACComponent heating fuels method is not available
1141
+ if model.version < OpenStudio::VersionString.new('3.6.0')
1142
+ OpenStudio.logFree(OpenStudio::Error, 'openstudio.Standards.Model', 'Required HVACComponent method .heatingFuelTypes is not available in pre-OpenStudio 3.6.0 versions. Use a more recent version of OpenStudio.')
1143
+ end
1144
+
950
1145
  zones.each do |zone|
951
- if zone.heating_fuels.include?('DistrictHeating')
1146
+ htg_fuels = zone.heatingFuelTypes.map(&:valueName)
1147
+ if htg_fuels.include?('DistrictHeating') || htg_fuels.include?('DistrictHeatingWater') || htg_fuels.include?('DistrictHeatingSteam')
952
1148
  has_district_heat = true
953
1149
  end
954
1150
  other_heat = thermal_zone_fossil_or_electric_type(zone, '')
@@ -973,7 +1169,7 @@ class Standard
973
1169
  # Store fan operation schedule for each zone before deleting HVAC objects
974
1170
  # @author Doug Maddox, PNNL
975
1171
  # @param model [object]
976
- # @return [hash] of zoneName:fan_schedule_8760
1172
+ # @return [Hash] of zoneName:fan_schedule_8760
977
1173
  def get_fan_schedule_for_each_zone(model)
978
1174
  fan_sch_names = {}
979
1175
 
@@ -982,7 +1178,7 @@ class Standard
982
1178
  fan_schedule_8760 = []
983
1179
  # Check for availability managers
984
1180
  # Assume only AvailabilityManagerScheduled will control fan schedule
985
- # TODO: also check AvailabilityManagerScheduledOn
1181
+ # @todo also check AvailabilityManagerScheduledOn
986
1182
  avail_mgrs = air_loop_hvac.availabilityManagers
987
1183
  # if avail_mgrs.is_initialized
988
1184
  if !avail_mgrs.nil?
@@ -1099,7 +1295,7 @@ class Standard
1099
1295
  # Array will include extra 24 values for leap year
1100
1296
  # Array will also include extra 24 values at end for holiday day type
1101
1297
  # @author: Doug Maddox, PNNL
1102
- # @TODO: consider moving this to Standards.Schedule.rb
1298
+ # @todo consider moving this to Standards.Schedule.rb
1103
1299
  # @param: model [Object]
1104
1300
  # @param: fan_schedule [Object]
1105
1301
  # @return: [Array<String>] annual hourly values from schedule
@@ -1118,32 +1314,20 @@ class Standard
1118
1314
  fan_schedule_ruleset = sch_translator.convert_schedule_compact_to_schedule_ruleset
1119
1315
  fan_8760 = get_8760_values_from_schedule_ruleset(model, fan_schedule_ruleset)
1120
1316
  when 'OS_Schedule_Year'
1121
- # TODO: add function for ScheduleYear
1317
+ # @todo add function for ScheduleYear
1122
1318
  # fan_8760 = get_8760_values_from_schedule_year(model, fan_schedule)
1123
1319
  OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.Model', 'Automated baseline measure does not support use of Schedule Year')
1124
1320
  end
1125
1321
  return fan_8760
1126
1322
  end
1127
1323
 
1128
- # Determines the area of the building above which point
1129
- # the non-dominant area type gets it's own HVAC system type.
1130
- #
1131
- # @param model [OpenStudio::Model::Model] OpenStudio model object
1132
- # @param custom [String] custom fuel type
1133
- # @return [Double] the minimum area (m^2)
1134
- def model_prm_baseline_system_group_minimum_area(model, custom)
1135
- exception_min_area_ft2 = 20_000
1136
- exception_min_area_m2 = OpenStudio.convert(exception_min_area_ft2, 'ft^2', 'm^2').get
1137
- return exception_min_area_m2
1138
- end
1139
-
1140
1324
  # Determine the baseline system type given the inputs. Logic is different for different standards.
1141
1325
  #
1142
1326
  # 90.1-2007, 90.1-2010, 90.1-2013
1143
1327
  #
1144
1328
  # @param model [OpenStudio::Model::Model] OpenStudio model object
1145
1329
  # @param climate_zone [String] ASHRAE climate zone, e.g. 'ASHRAE 169-2013-4A'
1146
- # @param sys_group [hash] Hash defining a group of zones that have the same Appendix G system type
1330
+ # @param sys_group [Hash] Hash defining a group of zones that have the same Appendix G system type
1147
1331
  # @param custom [String] custom fuel type
1148
1332
  # @return [String] The system type. Possibilities are PTHP, PTAC, PSZ_AC, PSZ_HP, PVAV_Reheat, PVAV_PFP_Boxes,
1149
1333
  # VAV_Reheat, VAV_PFP_Boxes, Gas_Furnace, Electric_Furnace
@@ -1154,14 +1338,19 @@ class Standard
1154
1338
  area_ft2 = sys_group['area_ft2']
1155
1339
  num_stories = sys_group['stories']
1156
1340
 
1157
- # [type, central_heating_fuel, zone_heating_fuel, cooling_fuel]
1341
+ # [type, central_heating_fuel, zone_heating_fuel, cooling_fuel]
1158
1342
  system_type = [nil, nil, nil, nil]
1159
1343
 
1160
1344
  # Get the row from TableG3.1.1A
1161
1345
  sys_num = model_prm_baseline_system_number(model, climate_zone, area_type, fuel_type, area_ft2, num_stories, custom)
1162
1346
 
1163
1347
  # Modify the fuel type if called for by the standard
1164
- fuel_type = model_prm_baseline_system_change_fuel_type(model, fuel_type, climate_zone, custom)
1348
+ if custom == 'Xcel Energy CO EDA'
1349
+ # fuel type remains unchanged
1350
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.Model', 'Custom; per Xcel EDA Program Manual 2014 Table 3.2.2 Baseline HVAC System Types, the 90.1-2010 rules for heating fuel type (based on proposed model) rules apply.')
1351
+ else
1352
+ fuel_type = model_prm_baseline_system_change_fuel_type(model, fuel_type, climate_zone)
1353
+ end
1165
1354
 
1166
1355
  # Define the lookup by row and by fuel type
1167
1356
  sys_lookup = Hash.new { |h, k| h[k] = Hash.new(&h.default_proc) }
@@ -1261,41 +1450,10 @@ class Standard
1261
1450
  # @param fuel_type [String] Valid choices are electric, fossil, fossilandelectric,
1262
1451
  # purchasedheat, purchasedcooling, purchasedheatandcooling
1263
1452
  # @param climate_zone [String] ASHRAE climate zone, e.g. 'ASHRAE 169-2013-4A'
1264
- # @param custom [String] custom fuel type
1265
1453
  # @return [String] the revised fuel type
1266
- def model_prm_baseline_system_change_fuel_type(model, fuel_type, climate_zone, custom = nil)
1267
- return fuel_type # Don't change fuel type for most templates
1268
- end
1269
-
1270
- # Determine whether heating type is fuel or electric
1271
- # @param hvac_building_type [String] Key for lookup of baseline system type
1272
- # @param climate_zone [String] full name of climate zone
1273
- # @return [String] fuel or electric
1274
- def find_prm_heat_type(hvac_building_type, climate_zone)
1275
- climate_code = get_climate_zone_code(climate_zone)
1276
- heat_type_props = model_find_object(standards_data['prm_heat_type'],
1277
- 'template' => template,
1278
- 'hvac_building_type' => hvac_building_type,
1279
- 'climate_zone' => climate_code)
1280
- if !heat_type_props
1281
- # try again with wild card for climate
1282
- heat_type_props = model_find_object(standards_data['prm_heat_type'],
1283
- 'template' => template,
1284
- 'hvac_building_type' => hvac_building_type,
1285
- 'climate_zone' => 'any')
1286
- end
1287
- if !heat_type_props
1288
- # try again with wild card for building type
1289
- heat_type_props = model_find_object(standards_data['prm_heat_type'],
1290
- 'template' => template,
1291
- 'hvac_building_type' => 'all others',
1292
- 'climate_zone' => climate_code)
1293
- end
1294
- if !heat_type_props
1295
- OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.Model', "Could not find baseline heat type for: #{template}-#{hvac_building_type}-#{climate_zone}.")
1296
- else
1297
- return heat_type_props['heat_type']
1298
- end
1454
+ def model_prm_baseline_system_change_fuel_type(model, fuel_type, climate_zone)
1455
+ # Don't change fuel type for most templates
1456
+ return fuel_type
1299
1457
  end
1300
1458
 
1301
1459
  # Get ASHRAE ID code for climate zone
@@ -1341,11 +1499,11 @@ class Standard
1341
1499
  # @param system_type [String] The system type. Valid choices are PTHP, PTAC, PSZ_AC, PSZ_HP, PVAV_Reheat,
1342
1500
  # PVAV_PFP_Boxes, VAV_Reheat, VAV_PFP_Boxes, Gas_Furnace, Electric_Furnace,
1343
1501
  # which are also returned by the method OpenStudio::Model::Model.prm_baseline_system_type.
1344
- # @param main_heat_fuel [String] main heating fuel. Valid choices are Electricity, NaturalGas, DistrictHeating
1345
- # @param zone_heat_fuel [String] zone heating/reheat fuel. Valid choices are Electricity, NaturalGas, DistrictHeating
1502
+ # @param main_heat_fuel [String] main heating fuel. Valid choices are Electricity, NaturalGas, DistrictHeating, DistrictHeatingWater, DistrictHeatingSteam
1503
+ # @param zone_heat_fuel [String] zone heating/reheat fuel. Valid choices are Electricity, NaturalGas, DistrictHeating, DistrictHeatingWater, DistrictHeatingSteam
1346
1504
  # @param cool_fuel [String] cooling fuel. Valid choices are Electricity, DistrictCooling
1347
1505
  # @param zones [Array<OpenStudio::Model::ThermalZone>] an array of zones
1348
- # @return [Bool] returns true if successful, false if not
1506
+ # @return [Boolean] returns true if successful, false if not
1349
1507
  # @todo Add 90.1-2013 systems 11-13
1350
1508
  def model_add_prm_baseline_system(model, system_type, main_heat_fuel, zone_heat_fuel, cool_fuel, zones, zone_fan_scheds)
1351
1509
  case system_type
@@ -1381,7 +1539,7 @@ class Standard
1381
1539
  heating_type = 'Gas'
1382
1540
  # if district heating
1383
1541
  hot_water_loop = nil
1384
- if main_heat_fuel == 'DistrictHeating'
1542
+ if main_heat_fuel.include?('DistrictHeating')
1385
1543
  heating_type = 'Water'
1386
1544
  hot_water_loop = if model.getPlantLoopByName('Hot Water Loop').is_initialized
1387
1545
  model.getPlantLoopByName('Hot Water Loop').get
@@ -1481,12 +1639,14 @@ class Standard
1481
1639
  # If and only if there are primary zones to attach to the loop
1482
1640
  # counter example: floor with only one elevator machine room that get classified as sec_zones
1483
1641
  unless pri_zones.empty?
1484
- model_add_pvav(model,
1485
- pri_zones,
1486
- system_name: system_name,
1487
- hot_water_loop: hot_water_loop,
1488
- chilled_water_loop: chilled_water_loop,
1489
- electric_reheat: electric_reheat)
1642
+ air_loop = model_add_pvav(model,
1643
+ pri_zones,
1644
+ system_name: system_name,
1645
+ hot_water_loop: hot_water_loop,
1646
+ chilled_water_loop: chilled_water_loop,
1647
+ electric_reheat: electric_reheat)
1648
+ model_system_outdoor_air_sizing_vrp_method(air_loop)
1649
+ air_loop_hvac_apply_vav_damper_action(air_loop)
1490
1650
  model_create_multizone_fan_schedule(model, zone_op_hrs, pri_zones, system_name)
1491
1651
  end
1492
1652
 
@@ -1618,15 +1778,17 @@ class Standard
1618
1778
  if chilled_water_loop.additionalProperties.hasFeature('secondary_loop_name')
1619
1779
  chilled_water_loop = model.getPlantLoopByName(chilled_water_loop.additionalProperties.getFeatureAsString('secondary_loop_name').get).get
1620
1780
  end
1621
- model_add_vav_reheat(model,
1622
- pri_zones,
1623
- system_name: system_name,
1624
- reheat_type: reheat_type,
1625
- hot_water_loop: hot_water_loop,
1626
- chilled_water_loop: chilled_water_loop,
1627
- fan_efficiency: 0.62,
1628
- fan_motor_efficiency: 0.9,
1629
- fan_pressure_rise: 4.0)
1781
+ air_loop = model_add_vav_reheat(model,
1782
+ pri_zones,
1783
+ system_name: system_name,
1784
+ reheat_type: reheat_type,
1785
+ hot_water_loop: hot_water_loop,
1786
+ chilled_water_loop: chilled_water_loop,
1787
+ fan_efficiency: 0.62,
1788
+ fan_motor_efficiency: 0.9,
1789
+ fan_pressure_rise: 4.0)
1790
+ model_system_outdoor_air_sizing_vrp_method(air_loop)
1791
+ air_loop_hvac_apply_vav_damper_action(air_loop)
1630
1792
  model_create_multizone_fan_schedule(model, zone_op_hrs, pri_zones, system_name)
1631
1793
  end
1632
1794
 
@@ -1708,7 +1870,7 @@ class Standard
1708
1870
  unless zones.empty?
1709
1871
  # If district heating
1710
1872
  hot_water_loop = nil
1711
- if main_heat_fuel == 'DistrictHeating'
1873
+ if main_heat_fuel.include?('DistrictHeating')
1712
1874
  hot_water_loop = if model.getPlantLoopByName('Hot Water Loop').is_initialized
1713
1875
  model.getPlantLoopByName('Hot Water Loop').get
1714
1876
  else
@@ -1737,7 +1899,7 @@ class Standard
1737
1899
  when 'SZ_CV' # System 12 (gas or district heat) or System 13 (electric resistance heat)
1738
1900
  unless zones.empty?
1739
1901
  hot_water_loop = nil
1740
- if zone_heat_fuel == 'DistrictHeating' || zone_heat_fuel == 'NaturalGas'
1902
+ if zone_heat_fuel.include?('DistrictHeating') || zone_heat_fuel == 'NaturalGas'
1741
1903
  heating_type = 'Water'
1742
1904
  hot_water_loop = if model.getPlantLoopByName('Hot Water Loop').is_initialized
1743
1905
  model.getPlantLoopByName('Hot Water Loop').get
@@ -2144,8 +2306,8 @@ class Standard
2144
2306
 
2145
2307
  # For a multizone system, create the fan schedule based on zone occupancy/fan schedules
2146
2308
  # @author Doug Maddox, PNNL
2147
- # @param model
2148
- # @param zone_fan_scheds [Hash] of hash of zoneName:8760FanSchedPerZone
2309
+ # @param model [OpenStudio::Model::Model] OpenStudio model object
2310
+ # @param zone_op_hrs [Hash] hash of zoneName zone_op_hrs
2149
2311
  # @param pri_zones [Array<String>] names of zones served by the multizone system
2150
2312
  # @param system_name [String] name of air loop
2151
2313
  def model_create_multizone_fan_schedule(model, zone_op_hrs, pri_zones, system_name)
@@ -2204,7 +2366,7 @@ class Standard
2204
2366
  # Does not assign a story to plenum spaces.
2205
2367
  #
2206
2368
  # @param model [OpenStudio::Model::Model] OpenStudio model object
2207
- # @return [Bool] returns true if successful, false if not
2369
+ # @return [Boolean] returns true if successful, false if not
2208
2370
  def model_assign_spaces_to_stories(model)
2209
2371
  # Make hash of spaces and minz values
2210
2372
  sorted_spaces = {}
@@ -2244,7 +2406,7 @@ class Standard
2244
2406
  # @note This must be performed before the sizing run because it impacts component sizes, which in turn impact efficiencies.
2245
2407
  #
2246
2408
  # @param model [OpenStudio::Model::Model] OpenStudio model object
2247
- # @return [Bool] returns true if successful, false if not
2409
+ # @return [Boolean] returns true if successful, false if not
2248
2410
  def model_apply_multizone_vav_outdoor_air_sizing(model)
2249
2411
  OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.Model', 'Started applying multizone vav OA sizing.')
2250
2412
 
@@ -2258,10 +2420,10 @@ class Standard
2258
2420
  #
2259
2421
  # @param model [OpenStudio::Model::Model] OpenStudio model object
2260
2422
  # @param climate_zone [String] ASHRAE climate zone, e.g. 'ASHRAE 169-2013-4A'
2261
- # @param apply_controls [Bool] toggle whether to apply air loop and plant loop controls
2423
+ # @param apply_controls [Boolean] toggle whether to apply air loop and plant loop controls
2262
2424
  # @param sql_db_vars_map [Hash] hash map
2263
- # @param necb_ref_hp [Bool] for compatability with NECB ruleset only.
2264
- # @return [Bool] returns true if successful, false if not
2425
+ # @param necb_ref_hp [Boolean] for compatability with NECB ruleset only.
2426
+ # @return [Boolean] returns true if successful, false if not
2265
2427
  def model_apply_hvac_efficiency_standard(model, climate_zone, apply_controls: true, sql_db_vars_map: nil, necb_ref_hp: false)
2266
2428
  sql_db_vars_map = {} if sql_db_vars_map.nil?
2267
2429
 
@@ -2345,7 +2507,7 @@ class Standard
2345
2507
  # Applies daylighting controls to each space in the model per the standard.
2346
2508
  #
2347
2509
  # @param model [OpenStudio::Model::Model] OpenStudio model object
2348
- # @return [Bool] returns true if successful, false if not
2510
+ # @return [Boolean] returns true if successful, false if not
2349
2511
  def model_add_daylighting_controls(model)
2350
2512
  OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.Model', 'Started adding daylighting controls.')
2351
2513
 
@@ -2359,8 +2521,9 @@ class Standard
2359
2521
  end
2360
2522
 
2361
2523
  # For backward compatibility, infiltration standard not used for 2013 and earlier
2362
- # @return [Bool] true if successful, false if not
2363
- def model_baseline_apply_infiltration_standard(model, climate_zone)
2524
+ #
2525
+ # @return [Boolean] true if successful, false if not
2526
+ def model_apply_standard_infiltration(model, specific_space_infiltration_rate_75_pa = nil)
2364
2527
  return true
2365
2528
  end
2366
2529
 
@@ -2369,7 +2532,7 @@ class Standard
2369
2532
  # and removes the SpaceType-level infiltration objects.
2370
2533
  #
2371
2534
  # @param model [OpenStudio::Model::Model] OpenStudio model object
2372
- # @return [Bool] returns true if successful, false if not
2535
+ # @return [Boolean] returns true if successful, false if not
2373
2536
  # @todo This infiltration method is not used by the Reference buildings, fix this inconsistency.
2374
2537
  def model_apply_infiltration_standard(model)
2375
2538
  # Set the infiltration rate at each space
@@ -2785,7 +2948,7 @@ class Standard
2785
2948
  #
2786
2949
  # @param model [OpenStudio::Model::Model] OpenStudio model object
2787
2950
  # @param standard_sch_type_limit [String] the name of a standard schedule type limit with predefined limits
2788
- # options are Temperature, Humidity Ratio, Fractional, OnOff, and Activity
2951
+ # options are Dimensionless, Temperature, Humidity Ratio, Fractional, OnOff, and Activity
2789
2952
  # @param name [String] the name of the schedule type limits
2790
2953
  # @param lower_limit_value [double] the lower limit value for the schedule type
2791
2954
  # @param upper_limit_value [double] the upper limit value for the schedule type
@@ -2823,6 +2986,14 @@ class Standard
2823
2986
  end
2824
2987
  else
2825
2988
  case standard_sch_type_limit.downcase
2989
+ when 'dimensionless'
2990
+ schedule_type_limits = OpenStudio::Model::ScheduleTypeLimits.new(model)
2991
+ schedule_type_limits.setName('Dimensionless')
2992
+ schedule_type_limits.setLowerLimitValue(0.0)
2993
+ schedule_type_limits.setUpperLimitValue(1000.0)
2994
+ schedule_type_limits.setNumericType('Continuous')
2995
+ schedule_type_limits.setUnitType('Dimensionless')
2996
+
2826
2997
  when 'temperature'
2827
2998
  schedule_type_limits = OpenStudio::Model::ScheduleTypeLimits.new(model)
2828
2999
  schedule_type_limits.setName('Temperature')
@@ -3237,7 +3408,7 @@ class Standard
3237
3408
  skylights_frame_added = 0
3238
3409
  model.getSubSurfaces.each do |sub_surface|
3239
3410
  next unless sub_surface.outsideBoundaryCondition == 'Outdoors' && sub_surface.subSurfaceType == 'Skylight'
3240
-
3411
+
3241
3412
  if model.version < OpenStudio::VersionString.new('3.1.0')
3242
3413
  # window frame setting before https://github.com/NREL/OpenStudio/issues/2895 was fixed
3243
3414
  sub_surface.setString(8, frame.name.get.to_s)
@@ -3366,7 +3537,7 @@ class Standard
3366
3537
  # @param climate_zone [String] ASHRAE climate zone, e.g. 'ASHRAE 169-2013-4A'
3367
3538
  # @param building_type [String] the building type
3368
3539
  # @param spc_type [String] the space type
3369
- # @param is_residential [Bool] true if the building is residential
3540
+ # @param is_residential [Boolean] true if the building is residential
3370
3541
  # @return [OpenStudio::Model::OptionalDefaultConstructionSet] an optional default construction set
3371
3542
  def model_add_construction_set(model, climate_zone, building_type, spc_type, is_residential)
3372
3543
  construction_set = OpenStudio::Model::OptionalDefaultConstructionSet.new
@@ -3970,8 +4141,8 @@ class Standard
3970
4141
  # medium or large based on building area that can be turned off
3971
4142
  #
3972
4143
  # @param model [OpenStudio::Model::Model] OpenStudio model object
3973
- # @param remap_office [bool] re-map small office or leave it alone
3974
- # @return [hash] key for climate zone, building type, and standards template. All values are strings.
4144
+ # @param remap_office [Boolean] re-map small office or leave it alone
4145
+ # @return [Hash] key for climate zone, building type, and standards template. All values are strings.
3975
4146
  def model_get_building_properties(model, remap_office = true)
3976
4147
  # get climate zone from model
3977
4148
  climate_zone = model_standards_climate_zone(model)
@@ -4253,7 +4424,7 @@ class Standard
4253
4424
  #
4254
4425
  # 90.1-2007, 90.1-2010, 90.1-2013
4255
4426
  # @param model [OpenStudio::Model::Model] OpenStudio model object
4256
- # @return [Bool] returns true if successful, false if not
4427
+ # @return [Boolean] returns true if successful, false if not
4257
4428
  def model_apply_prm_construction_types(model)
4258
4429
  types_to_modify = []
4259
4430
 
@@ -4339,7 +4510,7 @@ class Standard
4339
4510
  #
4340
4511
  # @param model [OpenStudio::Model::Model] OpenStudio model object
4341
4512
  # @param climate_zone [String] ASHRAE climate zone, e.g. 'ASHRAE 169-2013-4A'
4342
- # @return [Bool] returns true if successful, false if not
4513
+ # @return [Boolean] returns true if successful, false if not
4343
4514
  def model_apply_standard_constructions(model, climate_zone, wwr_building_type: nil, wwr_info: {})
4344
4515
  types_to_modify = []
4345
4516
 
@@ -4481,7 +4652,7 @@ class Standard
4481
4652
  #
4482
4653
  # @param model [OpenStudio::Model::Model] OpenStudio model object
4483
4654
  # @param climate_zone [String] ASHRAE climate zone, e.g. 'ASHRAE 169-2013-4A'
4484
- # @return [Bool] returns true if successful, false if not
4655
+ # @return [Boolean] returns true if successful, false if not
4485
4656
  # @todo add proper support for 90.1-2013 with all those building type specific values
4486
4657
  # @todo support 90.1-2004 requirement that windows be modeled as horizontal bands.
4487
4658
  # Currently just using existing window geometry, and shrinking as necessary if WWR is above limit.
@@ -4584,7 +4755,7 @@ class Standard
4584
4755
  # based on sizing run results
4585
4756
  cat = space_conditioning_category(space)
4586
4757
  else
4587
- # TODO: This should really use the heating/cooling loads from the proposed building.
4758
+ # @todo This should really use the heating/cooling loads from the proposed building.
4588
4759
  # However, in an attempt to avoid another sizing run just for this purpose,
4589
4760
  # conditioned status is based on heating/cooling setpoints.
4590
4761
  # If heated-only, will be assumed Semiheated.
@@ -4735,21 +4906,20 @@ class Standard
4735
4906
  # reduce toward centroid.
4736
4907
  #
4737
4908
  # daylighting control isn't modeled
4738
- surface_wwr = surface_get_wwr_of_a_surface(surface)
4739
- red = model_get_wwr_reduction_ratio(mult,
4740
- surface_wwr: surface_wwr,
4741
- surface_dr: surface_get_door_ratio_of_a_surface(surface),
4742
- wwr_building_type: bat,
4743
- wwr_target: wwr_lim / 100, # divide by 100 to revise it to decimals
4744
- total_wall_m2: total_wall_area,
4745
- total_wall_with_fene_m2: total_wall_with_fene_area,
4746
- total_fene_m2: total_fene_area,
4747
- total_plenum_wall_m2: total_plenum_wall_area)
4909
+ red = surface_get_wwr_reduction_ratio(mult,
4910
+ surface,
4911
+ wwr_building_type: bat,
4912
+ wwr_target: wwr_lim / 100, # divide by 100 to revise it to decimals
4913
+ total_wall_m2: total_wall_area,
4914
+ total_wall_with_fene_m2: total_wall_with_fene_area,
4915
+ total_fene_m2: total_fene_area,
4916
+ total_plenum_wall_m2: total_plenum_wall_area)
4748
4917
 
4749
4918
  if red < 0.0
4750
4919
  # surface with fenestration to its maximum but adjusted by door areas when need to add windows in surfaces no fenestration
4751
4920
  # turn negative to positive to get the correct adjustment factor.
4752
4921
  red = -red
4922
+ surface_wwr = surface_get_wwr(surface)
4753
4923
  residual_fene += (0.9 - red * surface_wwr) * surface.grossArea
4754
4924
  end
4755
4925
  surface_adjust_fenestration_in_a_surface(surface, red, model)
@@ -4768,7 +4938,7 @@ class Standard
4768
4938
  # Reduces the SRR to the values specified by the PRM. SRR reduction will be done by shrinking vertices toward the centroid.
4769
4939
  #
4770
4940
  # @param model [OpenStudio::Model::Model] OpenStudio model object
4771
- # @return [Bool] returns true if successful, false if not
4941
+ # @return [Boolean] returns true if successful, false if not
4772
4942
  # @todo support semiheated spaces as a separate SRR category
4773
4943
  # @todo add skylight frame area to calculation of SRR
4774
4944
  def model_apply_prm_baseline_skylight_to_roof_ratio(model)
@@ -4913,7 +5083,7 @@ class Standard
4913
5083
  # Apply baseline values to exterior lights objects
4914
5084
  # Only implemented for stable baseline
4915
5085
  #
4916
- # @param model [OpenStudio::model::Model] OpenStudio model object
5086
+ # @param model [OpenStudio::Model::Model] OpenStudio model object
4917
5087
  def model_apply_baseline_exterior_lighting(model)
4918
5088
  return false
4919
5089
  end
@@ -4929,7 +5099,7 @@ class Standard
4929
5099
  # This does not include plant loops that serve WaterUse:Equipment or Fan:ZoneExhaust
4930
5100
  #
4931
5101
  # @param model [OpenStudio::Model::Model] OpenStudio model object
4932
- # @return [Bool] returns true if successful, false if not
5102
+ # @return [Boolean] returns true if successful, false if not
4933
5103
  def model_remove_prm_hvac(model)
4934
5104
  # Plant loops
4935
5105
  model.getPlantLoops.sort.each do |loop|
@@ -4985,7 +5155,7 @@ class Standard
4985
5155
  # Remove EMS objects that may be orphaned from removing HVAC
4986
5156
  #
4987
5157
  # @param model [OpenStudio::Model::Model] OpenStudio model object
4988
- # @return [Bool] returns true if successful, false if not
5158
+ # @return [Boolean] returns true if successful, false if not
4989
5159
  def model_remove_prm_ems_objects(model)
4990
5160
  model.getEnergyManagementSystemActuators.each(&:remove)
4991
5161
  model.getEnergyManagementSystemConstructionIndexVariables.each(&:remove)
@@ -5006,7 +5176,7 @@ class Standard
5006
5176
  # Remove external shading devices. Site shading will not be impacted.
5007
5177
  #
5008
5178
  # @param model [OpenStudio::Model::Model] OpenStudio model object
5009
- # @return [Bool] returns true if successful, false if not
5179
+ # @return [Boolean] returns true if successful, false if not
5010
5180
  def model_remove_external_shading_devices(model)
5011
5181
  shading_surfaces_removed = 0
5012
5182
  model.getShadingSurfaceGroups.sort.each do |shade_group|
@@ -5026,7 +5196,7 @@ class Standard
5026
5196
  # Changes the sizing parameters to the PRM specifications.
5027
5197
  #
5028
5198
  # @param model [OpenStudio::Model::Model] OpenStudio model object
5029
- # @return [Bool] returns true if successful, false if not
5199
+ # @return [Boolean] returns true if successful, false if not
5030
5200
  def model_apply_prm_sizing_parameters(model)
5031
5201
  clg = 1.15
5032
5202
  htg = 1.25
@@ -5303,7 +5473,7 @@ class Standard
5303
5473
  # with information that the spacetype needs to be defined.
5304
5474
  #
5305
5475
  # @param model [OpenStudio::Model::Model] OpenStudio model object
5306
- # @return [Bool] returns true if successful, false if not
5476
+ # @return [Boolean] returns true if successful, false if not
5307
5477
  def model_validate_standards_spacetypes_in_model(model)
5308
5478
  error_string = ''
5309
5479
  # populate search hash
@@ -5456,7 +5626,7 @@ class Standard
5456
5626
  # create space_type_hash with info such as effective_num_spaces, num_units, num_meds, num_meals
5457
5627
  #
5458
5628
  # @param model [OpenStudio::Model::Model] OpenStudio model object
5459
- # @param trust_effective_num_spaces [Bool] defaults to false - set to true if modeled every space as a real rpp, vs. space as collection of rooms
5629
+ # @param trust_effective_num_spaces [Boolean] defaults to false - set to true if modeled every space as a real rpp, vs. space as collection of rooms
5460
5630
  # @return [Hash] hash of space types with misc information
5461
5631
  # @todo - add code when determining number of units to makeuse of trust_effective_num_spaces arg
5462
5632
  def model_create_space_type_hash(model, trust_effective_num_spaces = false)
@@ -5567,7 +5737,7 @@ class Standard
5567
5737
  # @param model [OpenStudio::Model::Model] OpenStudio model object
5568
5738
  # @param ratio [Double] ratio
5569
5739
  # @param surface_type [String] surface type
5570
- # @return [Bool] returns true if successful, false if not
5740
+ # @return [Boolean] returns true if successful, false if not
5571
5741
  def apply_limit_to_subsurface_ratio(model, ratio, surface_type = 'Wall')
5572
5742
  fdwr = get_outdoor_subsurface_ratio(model, surface_type)
5573
5743
  if fdwr <= ratio
@@ -5602,7 +5772,7 @@ class Standard
5602
5772
  # institution: ASHRAE, value: 6A becomes: ASHRAE 169-2013-6A.
5603
5773
  # institution: CEC, value: 3 becomes: CEC T24-CEC3.
5604
5774
  #
5605
- # @param model [OpenStudio::Model::Model] the model
5775
+ # @param model [OpenStudio::Model::Model] OpenStudio model object
5606
5776
  # @return [String] the string representation of the climate zone,
5607
5777
  # empty string if no climate zone is present in the model.
5608
5778
  def model_standards_climate_zone(model)
@@ -5630,9 +5800,9 @@ class Standard
5630
5800
  # in the format used by the openstudio-standards lookups.
5631
5801
  # Clears out any climate zones previously added to the model.
5632
5802
  #
5633
- # @param model [OpenStudio::Model::Model] the model
5803
+ # @param model [OpenStudio::Model::Model] OpenStudio model object
5634
5804
  # @param climate_zone [String] ASHRAE climate zone, e.g. 'ASHRAE 169-2013-4A'
5635
- # @return [Bool] returns true if successful, false if not
5805
+ # @return [Boolean] returns true if successful, false if not
5636
5806
  def model_set_climate_zone(model, climate_zone)
5637
5807
  # Remove previous climate zones from the model
5638
5808
  model.getClimateZones.clear
@@ -5651,7 +5821,7 @@ class Standard
5651
5821
  # This method return the building ratio of subsurface_area / surface_type_area
5652
5822
  # where surface_type can be "Wall" or "RoofCeiling"
5653
5823
  #
5654
- # @param model [OpenStudio::Model::Model] the model
5824
+ # @param model [OpenStudio::Model::Model] OpenStudio model object
5655
5825
  # @param surface_type [String] surface type
5656
5826
  # @return [Double] surface ratio
5657
5827
  def get_outdoor_subsurface_ratio(model, surface_type = 'Wall')
@@ -5680,7 +5850,7 @@ class Standard
5680
5850
  # Loads a osm as a starting point.
5681
5851
  #
5682
5852
  # @param osm_file [String] path to the .osm file, relative to the /data folder
5683
- # @return [Bool] returns true if successful, false if not
5853
+ # @return [Boolean] returns true if successful, false if not
5684
5854
  def load_initial_osm(osm_file)
5685
5855
  # Load the geometry .osm
5686
5856
  unless File.exist?(osm_file)
@@ -5697,8 +5867,8 @@ class Standard
5697
5867
 
5698
5868
  # validate that model contains objects
5699
5869
  #
5700
- # @param model [OpenStudio::Model::Model] the model
5701
- # @return [Bool] returns true if valid, false if not
5870
+ # @param model [OpenStudio::Model::Model] OpenStudio model object
5871
+ # @return [Boolean] returns true if valid, false if not
5702
5872
  def validate_initial_model(model)
5703
5873
  is_valid = true
5704
5874
  if model.getBuildingStorys.empty?
@@ -5747,7 +5917,7 @@ class Standard
5747
5917
  # When 'Sum', all min OA flow rates are added up. Commonly used by 90.1.
5748
5918
  # When 'Maximum', only the biggest OA flow rate. Used by T24.
5749
5919
  #
5750
- # @param model [OpenStudio::Model::Model] the model
5920
+ # @param model [OpenStudio::Model::Model] OpenStudio model object
5751
5921
  # @return [String] the ventilation method, either Sum or Maximum
5752
5922
  def model_ventilation_method(model)
5753
5923
  building_data = model_get_building_properties(model)
@@ -5764,8 +5934,8 @@ class Standard
5764
5934
  # Removes all of the unused ResourceObjects
5765
5935
  # (Curves, ScheduleDay, Material, etc.) from the model.
5766
5936
  #
5767
- # @param model [OpenStudio::Model::Model] the model
5768
- # @return [Bool] returns true if successful, false if not
5937
+ # @param model [OpenStudio::Model::Model] OpenStudio model object
5938
+ # @return [Boolean] returns true if successful, false if not
5769
5939
  def model_remove_unused_resource_objects(model)
5770
5940
  start_size = model.objects.size
5771
5941
  model.getResourceObjects.sort.each do |obj|
@@ -5789,10 +5959,10 @@ class Standard
5789
5959
  # Future new schedules should be designed as paramtric from the start and would not need to run through this inference process
5790
5960
  #
5791
5961
  # @author David Goldwasser
5792
- # @param model [OpenStudio::Model::Model] the model
5962
+ # @param model [OpenStudio::Model::Model] OpenStudio model object
5793
5963
  # @param fraction_of_daily_occ_range [Double] fraction above/below daily min range required to start and end hours of operation
5794
- # @param invert_res [Bool] if true will reverse hours of operation for residential space types
5795
- # @param gen_occ_profile [Bool] if true creates a merged occupancy schedule for diagnostic purposes. This schedule is added to the model but no specifically returned by this method
5964
+ # @param invert_res [Boolean] if true will reverse hours of operation for residential space types
5965
+ # @param gen_occ_profile [Boolean] if true creates a merged occupancy schedule for diagnostic purposes. This schedule is added to the model but no specifically returned by this method
5796
5966
  # @return [ScheduleRuleset] schedule that is assigned to the building as default hours of operation
5797
5967
  def model_infer_hours_of_operation_building(model, fraction_of_daily_occ_range: 0.25, invert_res: true, gen_occ_profile: false)
5798
5968
  # create an array of non-residential and residential spaces
@@ -5943,10 +6113,10 @@ class Standard
5943
6113
  # should be traced back to a space or spaces.
5944
6114
  #
5945
6115
  # @author David Goldwasser
5946
- # @param model [OpenStudio::Model::Model] the model
6116
+ # @param model [OpenStudio::Model::Model] OpenStudio model object
5947
6117
  # @param step_ramp_logic [String] type of step logic to use
5948
- # @param infer_hoo_for_non_assigned_objects [Bool] attempt to get hoo for objects like swh with and exterior lighting
5949
- # @param gather_data_only [Bool] false (stops method before changes made if true)
6118
+ # @param infer_hoo_for_non_assigned_objects [Boolean] attempt to get hoo for objects like swh with and exterior lighting
6119
+ # @param gather_data_only [Boolean] false (stops method before changes made if true)
5950
6120
  # @param hoo_var_method [String] accepts hours and fractional. Any other value value will result in hoo variables not being applied
5951
6121
  # @return [Hash] schedule is key, value is hash of number of objects
5952
6122
  def model_setup_parametric_schedules(model, step_ramp_logic: nil, infer_hoo_for_non_assigned_objects: true, gather_data_only: false, hoo_var_method: 'hours')
@@ -6106,10 +6276,10 @@ class Standard
6106
6276
  # @note This measure will replace any prior chagnes made to ScheduleRule objects with new ScheduleRule values from
6107
6277
  # profile formulas
6108
6278
  # @author David Goldwasser
6109
- # @param model [OpenStudio::Model::Model] the model
6279
+ # @param model [OpenStudio::Model::Model] OpenStudio model object
6110
6280
  # @param ramp_frequency [Double] ramp frequency in minutes. If nil method will match simulation timestep
6111
- # @param infer_hoo_for_non_assigned_objects [Bool] # attempt to get hoo for objects like swh with and exterior lighting
6112
- # @param error_on_out_of_order [Bool] true will error if applying formula creates out of order values
6281
+ # @param infer_hoo_for_non_assigned_objects [Boolean] # attempt to get hoo for objects like swh with and exterior lighting
6282
+ # @param error_on_out_of_order [Boolean] true will error if applying formula creates out of order values
6113
6283
  # @return [Array] of modified ScheduleRuleset objects
6114
6284
  def model_apply_parametric_schedules(model, ramp_frequency: nil, infer_hoo_for_non_assigned_objects: true, error_on_out_of_order: true)
6115
6285
  # get ramp frequency (fractional hour) from timestep
@@ -6148,10 +6318,14 @@ class Standard
6148
6318
 
6149
6319
  private
6150
6320
 
6321
+ def model_apply_userdata_outdoor_air(model)
6322
+ return true
6323
+ end
6324
+
6151
6325
  # This function checks whether it is required to adjust the window to wall ratio based on the model WWR and wwr limit.
6152
- # @param wwr_limit [Float] return wwr_limit
6326
+ # @param wwr_limit [Double] window to wall ratio limit
6153
6327
  # @param wwr_list [Array] list of wwr of zone conditioning category in a building area type category - residential, nonresidential and semiheated
6154
- # @return require_adjustment [Boolean] True, require adjustment, false not require adjustment.
6328
+ # @return [Boolean] True, require adjustment, false not require adjustment.
6155
6329
  def model_does_require_wwr_adjustment?(wwr_limit, wwr_list)
6156
6330
  require_adjustment = false
6157
6331
  wwr_list.each do |wwr|
@@ -6164,7 +6338,7 @@ class Standard
6164
6338
  #
6165
6339
  # @param bat [String] building area type category
6166
6340
  # @param wwr_list [Array] list of wwr of zone conditioning category in a building area type category - residential, nonresidential and semiheated
6167
- # @return wwr_limit [Float] return adjusted wwr_limit
6341
+ # @return [Double] return adjusted wwr_limit
6168
6342
  def model_get_bat_wwr_target(bat, wwr_list)
6169
6343
  return 40.0
6170
6344
  end
@@ -6174,21 +6348,21 @@ class Standard
6174
6348
  # This function shall only be called if the maximum WWR value for surfaces with fenestration is lower than 90% due to
6175
6349
  # accommodating the total door surface areas
6176
6350
  #
6177
- # @param residual_ratio: [Float] the ratio of residual surfaces among the total wall surface area with no fenestrations
6351
+ # @param residual_ratio [Double] the ratio of residual surfaces among the total wall surface area with no fenestrations
6178
6352
  # @param space [OpenStudio::Model:Space] a space
6179
6353
  # @param model [OpenStudio::Model::Model] openstudio model
6180
- # @return [Bool] return true if successful, false if not
6354
+ # @return [Boolean] returns true if successful, false if not
6181
6355
  def model_readjust_surface_wwr(residual_ratio, space, model)
6182
6356
  return true
6183
6357
  end
6184
6358
 
6185
6359
  # Helper method to fill in hourly values
6186
6360
  #
6187
- # @param model [OpenStudio::Model::Model] the model
6361
+ # @param model [OpenStudio::Model::Model] OpenStudio model object
6188
6362
  # @param day_sch [OpenStudio::Model::ScheduleDay] schedule day object
6189
6363
  # @param sch_type [String] Constant or Hourly
6190
6364
  # @param values [Array<Double>]
6191
- # @return [Bool] returns true if successful, false if not
6365
+ # @return [Boolean] returns true if successful, false if not
6192
6366
  def model_add_vals_to_sch(model, day_sch, sch_type, values)
6193
6367
  if sch_type == 'Constant'
6194
6368
  day_sch.addValue(OpenStudio::Time.new(0, 24, 0, 0), values[0])
@@ -6205,9 +6379,9 @@ class Standard
6205
6379
 
6206
6380
  # Modify the existing service water heating loops to match the baseline required heating type.
6207
6381
  #
6208
- # @param model [OpenStudio::Model::Model] the model
6382
+ # @param model [OpenStudio::Model::Model] OpenStudio model object
6209
6383
  # @param building_type [String] the building type
6210
- # @return [Bool] returns true if successful, false if not
6384
+ # @return [Boolean] returns true if successful, false if not
6211
6385
  # @author Julien Marrec
6212
6386
  def model_apply_baseline_swh_loops(model, building_type)
6213
6387
  model.getPlantLoops.sort.each do |plant_loop|
@@ -6293,8 +6467,8 @@ class Standard
6293
6467
  # This should be done by the forward translator, and this code should be removed after this bug is fixed:
6294
6468
  # https://github.com/NREL/OpenStudio/issues/2598
6295
6469
  #
6296
- # @param model [OpenStudio::Model::Model] the model
6297
- # @return [Bool] returns true if successful, false if not
6470
+ # @param model [OpenStudio::Model::Model] OpenStudio model object
6471
+ # @return [Boolean] returns true if successful, false if not
6298
6472
  # @todo remove this method after OpenStudio issue #2598 is fixed.
6299
6473
  def model_temp_fix_ems_references(model)
6300
6474
  # Internal Variables
@@ -6436,7 +6610,7 @@ class Standard
6436
6610
  # @author David Goldwasser
6437
6611
  # @param space_space_types [Array] array of spaces or space types
6438
6612
  # @param parametric_inputs [Hash]
6439
- # @param gather_data_only [Bool]
6613
+ # @param gather_data_only [Boolean]
6440
6614
  # @return [Hash]
6441
6615
  def gather_inputs_parametric_space_space_type_schedules(space_space_types, parametric_inputs, gather_data_only)
6442
6616
  space_space_types.each do |space_type|
@@ -6495,7 +6669,7 @@ class Standard
6495
6669
  # @param load_inst [OpenStudio::Model::SpaceLoadInstance]
6496
6670
  # @param parametric_inputs [Hash]
6497
6671
  # @param hours_of_operation [Hash]
6498
- # @param gather_data_only [Bool]
6672
+ # @param gather_data_only [Boolean]
6499
6673
  # @return [Hash]
6500
6674
  def gather_inputs_parametric_load_inst_schedules(load_inst, parametric_inputs, hours_of_operation, gather_data_only)
6501
6675
  if load_inst.class.to_s == 'OpenStudio::Model::People'
@@ -6521,9 +6695,9 @@ class Standard
6521
6695
  # @param load_inst [OpenStudio::Model::SpaceLoadInstance]
6522
6696
  # @param parametric_inputs [Hash]
6523
6697
  # @param hours_of_operation [Hash]
6524
- # @param ramp [Bool]
6698
+ # @param ramp [Boolean]
6525
6699
  # @param min_ramp_dur_hr [Double]
6526
- # @param gather_data_only [Bool]
6700
+ # @param gather_data_only [Boolean]
6527
6701
  # @param hoo_var_method [String] accepts hours and fractional. Any other value value will result in hoo variables not being applied
6528
6702
  # @return [Hash]
6529
6703
  def gather_inputs_parametric_schedules(sch, load_inst, parametric_inputs, hours_of_operation, ramp: true, min_ramp_dur_hr: 2.0, gather_data_only: false, hoo_var_method: 'hours')
@@ -6843,8 +7017,8 @@ class Standard
6843
7017
 
6844
7018
  # Retrieves the lowest story in a model
6845
7019
  #
6846
- # @param model [OpenStudio::model::Model] OpenStudio model object
6847
- # @return [OpenStudio::model::BuildingStory] Lowest story included in the model
7020
+ # @param model [OpenStudio::Model::Model] OpenStudio model object
7021
+ # @return [OpenStudio::Model::BuildingStory] Lowest story included in the model
6848
7022
  def find_lowest_story(model)
6849
7023
  min_z_story = 1E+10
6850
7024
  lowest_story = nil
@@ -6862,7 +7036,7 @@ class Standard
6862
7036
 
6863
7037
  # Utility function that returns the min and max value in a design day schedule.
6864
7038
  #
6865
- # TODO: move this to Standards.Schedule.rb
7039
+ # @todo move this to Standards.Schedule.rb
6866
7040
  # @param schedule [OpenStudio::Model::Schedule] can be ScheduleCompact, ScheduleRuleset, ScheduleConstant
6867
7041
  # @param type [String] 'heating' for winter design day, 'cooling' for summer design day
6868
7042
  # @return [Hash] Hash has two keys, min and max. if failed, return 999.9 for min and max.
@@ -6888,8 +7062,8 @@ class Standard
6888
7062
 
6889
7063
  # Identifies non mechanically cooled ("nmc") systems, if applicable
6890
7064
  #
6891
- # @param model [OpenStudio::model::Model] OpenStudio model object
6892
- # @return zone_nmc_sys_type [Hash] Zone to nmc system type mapping
7065
+ # @param model [OpenStudio::Model::Model] OpenStudio model object
7066
+ # @return [Hash] Zone to nmc system type mapping
6893
7067
  def model_identify_non_mechanically_cooled_systems(model)
6894
7068
  return true
6895
7069
  end
@@ -6908,6 +7082,7 @@ class Standard
6908
7082
  # @param model [OpenStudio::Model::Model] OpenStudio model object
6909
7083
  # @param wwr_parameter [Hash] parameters to choose min and max percent of surfaces,
6910
7084
  # could be different set in different standard
7085
+ # @return [Hash] Hash of minimum_percent_of_surface and maximum_percent_of_surface
6911
7086
  def model_get_percent_of_surface_range(model, wwr_parameter = {})
6912
7087
  return { 'minimum_percent_of_surface' => nil, 'maximum_percent_of_surface' => nil }
6913
7088
  end
@@ -6922,25 +7097,22 @@ class Standard
6922
7097
 
6923
7098
  # Calculate the window to wall ratio reduction factor
6924
7099
  #
6925
- # @param multiplier [Float] multiplier of the wwr
6926
- # @param surface_wwr [Float] the surface window to wall ratio
6927
- # @param surface_dr [Float] the surface door to wall ratio
6928
- # @param wwr_building_type[String] building type for wwr
6929
- # @param wwr_target [Float] target window to wall ratio
6930
- # @param total_wall_m2 [Float] total wall area of the category in m2.
6931
- # @param total_wall_with_fene_m2 [Float] total wall area of the category with fenestrations in m2.
6932
- # @param total_fene_m2 [Float] total fenestration area
6933
- # @param total_plenum_wall_m2 [Float] total sqaure meter of a plenum
6934
- # @return [Float] reduction factor
6935
- def model_get_wwr_reduction_ratio(multiplier,
6936
- surface_wwr: 0.0,
6937
- surface_dr: 0.0,
6938
- wwr_building_type: 'All others',
6939
- wwr_target: 0.0,
6940
- total_wall_m2: 0.0,
6941
- total_wall_with_fene_m2: 0.0,
6942
- total_fene_m2: 0.0,
6943
- total_plenum_wall_m2: 0.0)
7100
+ # @param multiplier [Double] multiplier of the wwr
7101
+ # @param surface [OpenStudio::Model:Surface] OpenStudio Surface object
7102
+ # @param wwr_target [Double] target window to wall ratio
7103
+ # @param total_wall_m2 [Double] total wall area of the category in m2.
7104
+ # @param total_wall_with_fene_m2 [Double] total wall area of the category with fenestrations in m2.
7105
+ # @param total_fene_m2 [Double] total fenestration area
7106
+ # @param total_plenum_wall_m2 [Double] total sqaure meter of a plenum
7107
+ # @return [Double] reduction factor
7108
+ def surface_get_wwr_reduction_ratio(multiplier,
7109
+ surface,
7110
+ wwr_building_type: 'All others',
7111
+ wwr_target: 0.0,
7112
+ total_wall_m2: 0.0,
7113
+ total_wall_with_fene_m2: 0.0,
7114
+ total_fene_m2: 0.0,
7115
+ total_plenum_wall_m2: 0.0)
6944
7116
  return 1.0 - multiplier
6945
7117
  end
6946
7118
 
@@ -6950,12 +7122,13 @@ class Standard
6950
7122
  # 2. data from measure and OpenStudio interface
6951
7123
  # @param [OpenStudio:model:Model] model
6952
7124
  # @param [String] climate_zone
7125
+ # @param [String] sizing_run_dir
6953
7126
  # @param [String] default_hvac_building_type
6954
7127
  # @param [String] default_wwr_building_type
6955
7128
  # @param [String] default_swh_building_type
6956
7129
  # @param [Hash] bldg_type_hvac_zone_hash A hash maps building type for hvac to a list of thermal zones
6957
- # @return True
6958
- def handle_user_input_data(model, climate_zone, default_hvac_building_type, default_wwr_building_type, default_swh_building_type, bldg_type_hvac_zone_hash)
7130
+ # @return [Boolean] returns true
7131
+ def handle_user_input_data(model, climate_zone, sizing_run_dir, default_hvac_building_type, default_wwr_building_type, default_swh_building_type, bldg_type_hvac_zone_hash)
6959
7132
  return true
6960
7133
  end
6961
7134
 
@@ -6963,67 +7136,36 @@ class Standard
6963
7136
  # ASHRAE 90.1-2019 Appendix G.
6964
7137
  #
6965
7138
  # @param model [OpenStudio::Model::Model] OpenStudio model
6966
- # @param thermalZones Array([OpenStudio::Model::ThermalZone]) thermal zone array
6967
- # @param coil Heating Coils
6968
- # @return [Boolean] true
7139
+ # @param thermal_zones [Array<OpenStudio::Model::ThermalZone>] thermal zone array
7140
+ # @param coil [OpenStudio::Model::StraightComponent] heating coil
7141
+ # @return [Boolean] returns true if successful, false if not
6969
7142
  def model_set_central_preheat_coil_spm(model, thermal_zones, coil)
6970
7143
  return true
6971
7144
  end
6972
7145
 
6973
- # Template method for adding zone additional property "zone DCV implemented in user model"
7146
+ # Template method for evaluate DCV requirements in the user model
6974
7147
  #
6975
- # @author Xuechen (Jerry) Lei, PNNL
6976
7148
  # @param model [OpenStudio::Model::Model] OpenStudio model
6977
- def model_mark_zone_dcv_existence(model)
7149
+ # @return [Boolean] returns true if successful, false if not
7150
+ def model_evaluate_dcv_requirements(model)
6978
7151
  return true
6979
7152
  end
6980
7153
 
6981
7154
  # Check whether the baseline model generation needs to run all four orientations
6982
7155
  # The default shall be true
6983
7156
  #
6984
- # @param [Boolean] run_all_orients: user inputs to indicate whether it is required to run all orientations
6985
- # @param [OpenStudio::Model::Model] OpenStudio model
7157
+ # @param run_all_orients [Boolean] user inputs to indicate whether it is required to run all orientations
7158
+ # @param user_model [OpenStudio::Model::Model] OpenStudio model
7159
+ # @return [Boolean] return True if all orientation need to be run, False if not
6986
7160
  def run_all_orientations(run_all_orients, user_model)
6987
7161
  return run_all_orients
6988
7162
  end
6989
7163
 
6990
- # Template method for reading user data and adding to zone additional properties
6991
- #
6992
- # @author Xuechen (Jerry) Lei, PNNL
6993
- # @param model [OpenStudio::Model::Model] OpenStudio model
6994
- def model_add_dcv_user_exception_properties(model)
6995
- return true
6996
- end
6997
-
6998
- # Template method for raising user model DCV warning and errors
6999
- #
7000
- # @author Xuechen (Jerry) Lei, PNNL
7001
- # @param model [OpenStudio::Model::Model] OpenStudio model
7002
- def model_raise_user_model_dcv_errors(model)
7003
- return true
7004
- end
7005
-
7006
- # Template method for adding zone additional property "airloop dcv required by 901" and "zone dcv required by 901"
7007
- #
7008
- # @author Xuechen (Jerry) Lei, PNNL
7009
- # @param model [OpenStudio::Model::Model] OpenStudio model
7010
- def model_add_dcv_requirement_properties(model)
7011
- return true
7012
- end
7013
-
7014
- # Template method for checking if zones in the baseline model should have DCV based on 90.1 2019 G3.1.2.5.
7015
- # Zone additional property 'apxg no need to have DCV' added
7016
- #
7017
- # @author Xuechen (Jerry) Lei, PNNL
7018
- # @param model [OpenStudio::Model::Model] OpenStudio model
7019
- def model_add_apxg_dcv_properties(model)
7020
- return true
7021
- end
7022
-
7023
7164
  # Template method for setting DCV in baseline HVAC system if required
7024
7165
  #
7025
7166
  # @author Xuechen (Jerry) Lei, PNNL
7026
7167
  # @param model [OpenStudio::Model::Model] OpenStudio model
7168
+ # @return [Boolean] returns true if successful, false if not
7027
7169
  def model_set_baseline_demand_control_ventilation(model, climate_zone)
7028
7170
  return true
7029
7171
  end
@@ -7031,6 +7173,7 @@ class Standard
7031
7173
  # Identify the return air type associated with each thermal zone
7032
7174
  #
7033
7175
  # @param model [OpenStudio::Model::Model] OpenStudio model object
7176
+ # @return [Boolean] returns true if successful, false if not
7034
7177
  def model_identify_return_air_type(model)
7035
7178
  # air-loop based system
7036
7179
  model.getThermalZones.each do |zone|
@@ -7100,10 +7243,16 @@ class Standard
7100
7243
  return_air_type = 'ducted_return_or_direct_to_unit'
7101
7244
  end
7102
7245
 
7246
+ # error if zone design air flow rate is not available
7247
+ if zone.model.version < OpenStudio::VersionString.new('3.6.0')
7248
+ OpenStudio.logFree(OpenStudio::Error, 'openstudio.Standards.Model', 'Required ThermalZone method .autosizedDesignAirFlowRate is not available in pre-OpenStudio 3.6.0 versions. Use a more recent version of OpenStudio.')
7249
+ end
7250
+
7103
7251
  zone.additionalProperties.setFeature('return_air_type', return_air_type)
7104
7252
  zone.additionalProperties.setFeature('plenum', return_plenum) unless return_plenum.nil?
7105
- zone.additionalProperties.setFeature('proposed_model_zone_design_air_flow', zone.designAirFlowRate.to_f)
7253
+ zone.additionalProperties.setFeature('proposed_model_zone_design_air_flow', zone.autosizedDesignAirFlowRate.to_f)
7106
7254
  end
7255
+ return true
7107
7256
  end
7108
7257
 
7109
7258
  # Determine the baseline return air type associated with each zone
@@ -7173,8 +7322,9 @@ class Standard
7173
7322
  # Add reporting tolerances. Default values are based on the suggestions from the PRM-RM.
7174
7323
  #
7175
7324
  # @param model [OpenStudio::Model::Model] OpenStudio Model
7176
- # @param heating_tolerance_deg_f [Float] Tolerance for time heating setpoint not met in degree F
7177
- # @param cooling_tolerance_deg_f [Float] Tolerance for time cooling setpoint not met in degree F
7325
+ # @param heating_tolerance_deg_f [Double] Tolerance for time heating setpoint not met in degree F
7326
+ # @param cooling_tolerance_deg_f [Double] Tolerance for time cooling setpoint not met in degree F
7327
+ # @return [Boolean] returns true if successful, false if not
7178
7328
  def model_add_reporting_tolerances(model, heating_tolerance_deg_f: 1.0, cooling_tolerance_deg_f: 1.0)
7179
7329
  reporting_tolerances = model.getOutputControlReportingTolerances
7180
7330
  heating_tolerance_deg_c = OpenStudio.convert(heating_tolerance_deg_f, 'R', 'K').get
@@ -7187,10 +7337,9 @@ class Standard
7187
7337
 
7188
7338
  # Apply the standard construction to each surface in the model, based on the construction type currently assigned.
7189
7339
  #
7190
- # @return [Bool] true if successful, false if not
7191
7340
  # @param model [OpenStudio::Model::Model] OpenStudio model object
7192
7341
  # @param climate_zone [String] ASHRAE climate zone, e.g. 'ASHRAE 169-2013-4A'
7193
- # @return [Bool] returns true if successful, false if not
7342
+ # @return [Boolean] returns true if successful, false if not
7194
7343
  def model_apply_constructions(model, climate_zone, wwr_building_type, wwr_info)
7195
7344
  model_apply_standard_constructions(model, climate_zone, wwr_building_type: nil, wwr_info: {})
7196
7345
 
@@ -7199,6 +7348,7 @@ class Standard
7199
7348
 
7200
7349
  # Generate baseline log to a specific file directory
7201
7350
  # @param file_directory [String] file directory
7351
+ # @return [Boolean] returns true if successful, false if not
7202
7352
  def generate_baseline_log(file_directory)
7203
7353
  return true
7204
7354
  end
@@ -7207,7 +7357,7 @@ class Standard
7207
7357
  #
7208
7358
  # @param model [OpenStudio::Model::Model] OpenStudio model object
7209
7359
  # @param climate_zone [String] ASHRAE climate zone, e.g. 'ASHRAE 169-2013-4A'
7210
- # @return [Bool] returns true if successful, false if not
7360
+ # @return [Boolean] returns true if successful, false if not
7211
7361
  def model_update_ground_temperature_profile(model, climate_zone)
7212
7362
  return true
7213
7363
  end