openstudio-standards 0.4.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (378) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.md +33 -0
  3. data/data/inventory/thermal_bridging.csv +90 -0
  4. data/data/standards/OpenStudio_Standards-deer-comstock.xlsx +0 -0
  5. data/data/standards/manage_OpenStudio_Standards.rb +1 -1
  6. data/data/standards/test_performance_expected_dd_results.csv +2014 -1891
  7. data/lib/openstudio-standards/btap/analysis.rb +8 -8
  8. data/lib/openstudio-standards/btap/bridging.rb +664 -645
  9. data/lib/openstudio-standards/btap/btap.model.rb +14 -14
  10. data/lib/openstudio-standards/btap/btap.rb +7 -7
  11. data/lib/openstudio-standards/btap/btap_result.rb +1 -1
  12. data/lib/openstudio-standards/btap/economics.rb +23 -23
  13. data/lib/openstudio-standards/btap/envelope.rb +8 -8
  14. data/lib/openstudio-standards/btap/equest.rb +1 -1
  15. data/lib/openstudio-standards/btap/geometry.rb +2 -2
  16. data/lib/openstudio-standards/btap/mpc.rb +7 -7
  17. data/lib/openstudio-standards/btap/schedules.rb +1 -1
  18. data/lib/openstudio-standards/btap/simmanager.rb +4 -4
  19. data/lib/openstudio-standards/btap/spaceloads.rb +26 -26
  20. data/lib/openstudio-standards/btap/utilities.rb +6 -6
  21. data/lib/openstudio-standards/btap/vintagizer.rb +1 -1
  22. data/lib/openstudio-standards/constructions/information.rb +83 -0
  23. data/lib/openstudio-standards/constructions/materials/modify.rb +72 -0
  24. data/lib/openstudio-standards/constructions/modify.rb +80 -0
  25. data/lib/openstudio-standards/create_typical/create_typical.rb +983 -0
  26. data/lib/openstudio-standards/create_typical/enumerations.rb +484 -0
  27. data/lib/openstudio-standards/create_typical/space_type_blend.rb +791 -0
  28. data/lib/openstudio-standards/create_typical/space_type_ratios.rb +494 -0
  29. data/lib/openstudio-standards/daylighting/space.rb +47 -0
  30. data/lib/openstudio-standards/geometry/create.rb +801 -0
  31. data/lib/openstudio-standards/geometry/create_bar.rb +2170 -0
  32. data/lib/openstudio-standards/geometry/information.rb +462 -0
  33. data/lib/openstudio-standards/geometry/modify.rb +48 -0
  34. data/lib/openstudio-standards/hvac/air_loop/information.rb +79 -0
  35. data/lib/openstudio-standards/hvac/cbecs_hvac.rb +616 -0
  36. data/lib/openstudio-standards/hvac/setpoint_managers/information.rb +91 -0
  37. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.AirTerminalSingleDuctVAVReheat.rb +1 -1
  38. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.AirTerminalSingleDuctVAVReheat.rb +1 -1
  39. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.AirTerminalSingleDuctVAVReheat.rb +1 -1
  40. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.Model.rb +1 -1
  41. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirTerminalSingleDuctVAVReheat.rb +1 -1
  42. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.Model.rb +2 -2
  43. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.hvac_systems.rb +1 -1
  44. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.AirTerminalSingleDuctVAVReheat.rb +1 -1
  45. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.Model.rb +4 -36
  46. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.hvac_systems.rb +1 -1
  47. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirTerminalSingleDuctVAVReheat.rb +1 -1
  48. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Model.rb +4 -36
  49. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Space.rb +3 -3
  50. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.hvac_systems.rb +1 -1
  51. data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.AirTerminalSingleDuctVAVReheat.rb +1 -1
  52. data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.Model.elevators.rb +1 -1
  53. data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.AirTerminalSingleDuctVAVReheat.rb +1 -1
  54. data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.CoilHeatingGas.rb +1 -1
  55. data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.Model.elevators.rb +1 -1
  56. data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.AirTerminalSingleDuctVAVReheat.rb +1 -1
  57. data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirTerminalSingleDuctVAVReheat.rb +1 -1
  58. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.College.rb +7 -7
  59. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Courthouse.rb +8 -8
  60. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.FullServiceRestaurant.rb +14 -14
  61. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.HighRiseApartment.rb +9 -9
  62. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Hospital.rb +16 -16
  63. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Laboratory.rb +7 -7
  64. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeDataCenterHighITE.rb +8 -8
  65. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeDataCenterLowITE.rb +8 -8
  66. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeHotel.rb +11 -11
  67. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeOffice.rb +7 -7
  68. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeOfficeDetailed.rb +9 -9
  69. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.MediumOffice.rb +8 -8
  70. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.MediumOfficeDetailed.rb +11 -11
  71. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.MidriseApartment.rb +9 -9
  72. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Outpatient.rb +19 -19
  73. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.PrimarySchool.rb +10 -10
  74. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.QuickServiceRestaurant.rb +13 -13
  75. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.RetailStandalone.rb +6 -6
  76. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.RetailStripmall.rb +6 -6
  77. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SecondarySchool.rb +9 -9
  78. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallDataCenterHighITE.rb +8 -8
  79. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallDataCenterLowITE.rb +8 -8
  80. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallHotel.rb +8 -8
  81. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallOffice.rb +8 -8
  82. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallOfficeDetailed.rb +11 -11
  83. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SuperMarket.rb +10 -10
  84. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SuperTallBuilding.rb +19 -19
  85. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.TallBuilding.rb +18 -18
  86. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Warehouse.rb +6 -6
  87. data/lib/openstudio-standards/prototypes/common/do_not_edit_metaclasses.rb +957 -957
  88. data/lib/openstudio-standards/prototypes/common/objects/Prototype.AirConditionerVariableRefrigerantFlow.rb +1 -1
  89. data/lib/openstudio-standards/prototypes/common/objects/Prototype.AirTerminalSingleDuctVAVReheat.rb +1 -1
  90. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingWaterToAirHeatPumpEquationFit.rb +84 -16
  91. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingDXSingleSpeed.rb +1 -1
  92. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingGas.rb +1 -1
  93. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingWaterToAirHeatPumpEquationFit.rb +61 -10
  94. data/lib/openstudio-standards/prototypes/common/objects/Prototype.ControllerWaterCoil.rb +1 -1
  95. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoolingTower.rb +1 -1
  96. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Fan.rb +1 -1
  97. data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanConstantVolume.rb +1 -1
  98. data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanOnOff.rb +1 -1
  99. data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanVariableVolume.rb +1 -1
  100. data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanZoneExhaust.rb +1 -1
  101. data/lib/openstudio-standards/prototypes/common/objects/Prototype.HeatExchangerAirToAirSensibleAndLatent.rb +2 -2
  102. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.exterior_lights.rb +4 -4
  103. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.hvac.rb +4 -4
  104. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.rb +43 -30
  105. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.swh.rb +1 -1
  106. data/lib/openstudio-standards/prototypes/common/objects/Prototype.ServiceWaterHeating.rb +18 -11
  107. data/lib/openstudio-standards/prototypes/common/objects/Prototype.SizingSystem.rb +1 -1
  108. data/lib/openstudio-standards/prototypes/common/objects/Prototype.hvac_systems.rb +774 -117
  109. data/lib/openstudio-standards/prototypes/common/objects/Prototype.radiant_system_controls.rb +340 -481
  110. data/lib/openstudio-standards/prototypes/common/objects/Prototype.refrigeration.rb +3 -3
  111. data/lib/openstudio-standards/prototypes/common/objects/Prototype.utilities.rb +3 -3
  112. data/lib/openstudio-standards/prototypes/common/prototype_metaprogramming.rb +22 -22
  113. data/lib/openstudio-standards/prototypes/deer/deer.Model.rb +1 -1
  114. data/lib/openstudio-standards/qaqc/calibration.rb +131 -0
  115. data/lib/openstudio-standards/qaqc/create_results.rb +983 -0
  116. data/lib/openstudio-standards/qaqc/envelope.rb +399 -0
  117. data/lib/openstudio-standards/qaqc/eui.rb +213 -0
  118. data/lib/openstudio-standards/qaqc/hvac.rb +1943 -0
  119. data/lib/openstudio-standards/qaqc/internal_loads.rb +568 -0
  120. data/lib/openstudio-standards/qaqc/reporting.rb +141 -0
  121. data/lib/openstudio-standards/qaqc/schedules.rb +129 -0
  122. data/lib/openstudio-standards/qaqc/service_water_heating.rb +273 -0
  123. data/lib/openstudio-standards/qaqc/weather_files.rb +497 -0
  124. data/lib/openstudio-standards/qaqc/zone_conditions.rb +278 -0
  125. data/lib/openstudio-standards/schedules/create.rb +364 -0
  126. data/lib/openstudio-standards/schedules/information.rb +169 -0
  127. data/lib/openstudio-standards/schedules/modify.rb +445 -0
  128. data/lib/openstudio-standards/standards/Standards.AirLoopHVAC.rb +110 -71
  129. data/lib/openstudio-standards/standards/Standards.AirTerminalSingleDuctParallelPIUReheat.rb +3 -3
  130. data/lib/openstudio-standards/standards/Standards.AirTerminalSingleDuctVAVReheat.rb +4 -4
  131. data/lib/openstudio-standards/standards/Standards.BoilerHotWater.rb +2 -1
  132. data/lib/openstudio-standards/standards/Standards.ChillerElectricEIR.rb +16 -10
  133. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXSingleSpeed.rb +4 -4
  134. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXTwoSpeed.rb +1 -1
  135. data/lib/openstudio-standards/standards/Standards.CoilCoolingWaterToAirHeatPumpEquationFit.rb +1 -1
  136. data/lib/openstudio-standards/standards/Standards.CoilDX.rb +4 -4
  137. data/lib/openstudio-standards/standards/Standards.CoilHeatingDXMultiSpeed.rb +1 -1
  138. data/lib/openstudio-standards/standards/Standards.CoilHeatingDXSingleSpeed.rb +5 -5
  139. data/lib/openstudio-standards/standards/Standards.CoilHeatingGas.rb +1 -1
  140. data/lib/openstudio-standards/standards/Standards.CoilHeatingGasMultiStage.rb +1 -1
  141. data/lib/openstudio-standards/standards/Standards.CoilHeatingWaterToAirHeatPumpEquationFit.rb +1 -1
  142. data/lib/openstudio-standards/standards/Standards.Construction.rb +17 -18
  143. data/lib/openstudio-standards/standards/Standards.CoolingTower.rb +6 -6
  144. data/lib/openstudio-standards/standards/Standards.CoolingTowerSingleSpeed.rb +1 -1
  145. data/lib/openstudio-standards/standards/Standards.CoolingTowerTwoSpeed.rb +1 -1
  146. data/lib/openstudio-standards/standards/Standards.CoolingTowerVariableSpeed.rb +1 -1
  147. data/lib/openstudio-standards/standards/Standards.Fan.rb +6 -12
  148. data/lib/openstudio-standards/standards/Standards.FanVariableVolume.rb +2 -2
  149. data/lib/openstudio-standards/standards/Standards.FluidCooler.rb +1 -1
  150. data/lib/openstudio-standards/standards/Standards.HeaderedPumpsVariableSpeed.rb +1 -1
  151. data/lib/openstudio-standards/standards/Standards.HeatExchangerSensLat.rb +3 -3
  152. data/lib/openstudio-standards/standards/Standards.Model.rb +411 -261
  153. data/lib/openstudio-standards/standards/Standards.PlanarSurface.rb +2 -2
  154. data/lib/openstudio-standards/standards/Standards.PlantLoop.rb +94 -29
  155. data/lib/openstudio-standards/standards/Standards.Pump.rb +2 -2
  156. data/lib/openstudio-standards/standards/Standards.ScheduleConstant.rb +2 -2
  157. data/lib/openstudio-standards/standards/Standards.ScheduleRuleset.rb +14 -14
  158. data/lib/openstudio-standards/standards/Standards.Space.rb +37 -30
  159. data/lib/openstudio-standards/standards/Standards.SpaceType.rb +38 -29
  160. data/lib/openstudio-standards/standards/Standards.SubSurface.rb +7 -7
  161. data/lib/openstudio-standards/standards/Standards.Surface.rb +13 -13
  162. data/lib/openstudio-standards/standards/Standards.ThermalZone.rb +109 -66
  163. data/lib/openstudio-standards/standards/Standards.WaterHeaterMixed.rb +11 -4
  164. data/lib/openstudio-standards/standards/Standards.ZoneHVACComponent.rb +6 -6
  165. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.AirLoopHVAC.rb +1 -1
  166. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.PlantLoop.rb +1 -1
  167. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.Space.rb +1 -1
  168. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.Space.rb +1 -1
  169. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.AirLoopHVAC.rb +4 -4
  170. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.AirTerminalSingleDuctVAVReheat.rb +1 -1
  171. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.Space.rb +4 -4
  172. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirLoopHVAC.rb +4 -4
  173. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirTerminalSingleDuctVAVReheat.rb +1 -1
  174. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.CoolingTowerVariableSpeed.rb +1 -1
  175. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.Model.rb +5 -21
  176. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.Space.rb +4 -4
  177. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.WaterHeaterMixed.rb +1 -1
  178. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.ZoneHVACComponent.rb +1 -1
  179. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.AirLoopHVAC.rb +36 -4
  180. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.AirTerminalSingleDuctVAVReheat.rb +1 -1
  181. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.CoolingTowerVariableSpeed.rb +1 -1
  182. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.Space.rb +4 -4
  183. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.ZoneHVACComponent.rb +1 -1
  184. 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
  185. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirLoopHVAC.rb +53 -10
  186. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirTerminalSingleDuctVAVReheat.rb +1 -1
  187. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.CoolingTowerVariableSpeed.rb +1 -1
  188. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Space.rb +6 -6
  189. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.ZoneHVACComponent.rb +2 -2
  190. 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
  191. data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.curves.json +211 -211
  192. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.economizers.json +14 -14
  193. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.AirLoopHVAC.rb +4 -4
  194. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.Model.rb +1 -1
  195. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.PlantLoop.rb +1 -1
  196. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.economizers.json +14 -14
  197. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.AirLoopHVAC.rb +4 -4
  198. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.Model.rb +1 -1
  199. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.PlantLoop.rb +1 -1
  200. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.AirLoopHVAC.rb +6 -6
  201. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.AirTerminalSingleDuctVAVReheat.rb +1 -1
  202. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.CoolingTowerVariableSpeed.rb +1 -1
  203. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.PlantLoop.rb +1 -1
  204. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.Space.rb +4 -4
  205. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirLoopHVAC.rb +6 -6
  206. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirTerminalSingleDuctVAVReheat.rb +1 -1
  207. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.CoolingTowerVariableSpeed.rb +1 -1
  208. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.PlantLoop.rb +1 -1
  209. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.Space.rb +4 -4
  210. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.AirLoopHVAC.rb +22 -28
  211. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.AirTerminalSingleDuctParallelPIUReheat.rb +1 -1
  212. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.AirTerminalSingleDuctVAVReheat.rb +2 -2
  213. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.BoilerHotWater.rb +1 -74
  214. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.ChillerElectricEIR.rb +7 -59
  215. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilCoolingDXSingleSpeed.rb +1 -1
  216. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilCoolingDXTwoSpeed.rb +1 -1
  217. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilDX.rb +1 -1
  218. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilHeatingDXSingleSpeed.rb +1 -1
  219. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilHeatingGas.rb +1 -21
  220. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.DesignSpecificationOutdoorAir.rb +101 -0
  221. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.FanConstantVolume.rb +1 -1
  222. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.FanOnOff.rb +1 -1
  223. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.FanVariableVolume.rb +1 -1
  224. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.HeatExchangerSensLat.rb +1 -1
  225. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.Model.rb +643 -526
  226. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.PlanarSurface.rb +8 -2
  227. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.PlantLoop.rb +17 -77
  228. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.Space.rb +74 -16
  229. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.SpaceType.rb +96 -44
  230. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.Surface.rb +6 -6
  231. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.ThermalZone.rb +18 -6
  232. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.ZoneHVACComponent.rb +1 -1
  233. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.rb +328 -74
  234. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/ashrae_90_1_prm_2019.Model.rb +0 -118
  235. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/ashrae_90_1_prm_2019.rb +2 -1
  236. 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
  237. data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/baseline_outdoor_air.md +35 -0
  238. data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/set_plug_load_measures.md +1 -1
  239. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/ashrae_90_1_prm.UserData.rb +228 -0
  240. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_enums.rb +131 -0
  241. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_space.csv +1 -1
  242. data/lib/openstudio-standards/standards/cbes/cbes.AirLoopHVAC.rb +5 -5
  243. data/lib/openstudio-standards/standards/cbes/cbes.Model.rb +1 -1
  244. data/lib/openstudio-standards/standards/cbes/cbes.PlantLoop.rb +1 -1
  245. data/lib/openstudio-standards/standards/cbes/cbes.Space.rb +1 -1
  246. data/lib/openstudio-standards/standards/cbes/cbes_t24_2005/cbes_t24_2005.Space.rb +1 -1
  247. data/lib/openstudio-standards/standards/cbes/cbes_t24_2008/cbes_t24_2008.Space.rb +1 -1
  248. data/lib/openstudio-standards/standards/deer/deer.AirLoopHVAC.rb +109 -27
  249. data/lib/openstudio-standards/standards/deer/deer.Space.rb +1 -1
  250. data/lib/openstudio-standards/standards/deer/deer_1985/data/deer_1985.economizers.json +246 -4
  251. data/lib/openstudio-standards/standards/deer/deer_1996/data/deer_1996.economizers.json +246 -4
  252. data/lib/openstudio-standards/standards/deer/deer_2003/data/deer_2003.economizers.json +246 -4
  253. data/lib/openstudio-standards/standards/deer/deer_2003/deer_2003.ThermalZone.rb +18 -18
  254. data/lib/openstudio-standards/standards/deer/deer_2007/data/deer_2007.economizers.json +246 -4
  255. data/lib/openstudio-standards/standards/deer/deer_2007/deer_2007.ThermalZone.rb +18 -18
  256. data/lib/openstudio-standards/standards/deer/deer_2011/data/deer_2011.economizers.json +246 -4
  257. data/lib/openstudio-standards/standards/deer/deer_2011/deer_2011.ThermalZone.rb +18 -18
  258. data/lib/openstudio-standards/standards/deer/deer_2014/data/deer_2014.economizers.json +248 -6
  259. data/lib/openstudio-standards/standards/deer/deer_2014/deer_2014.Space.rb +3 -3
  260. data/lib/openstudio-standards/standards/deer/deer_2014/deer_2014.ThermalZone.rb +18 -18
  261. data/lib/openstudio-standards/standards/deer/deer_2015/data/deer_2015.economizers.json +248 -6
  262. data/lib/openstudio-standards/standards/deer/deer_2015/deer_2015.Space.rb +3 -3
  263. data/lib/openstudio-standards/standards/deer/deer_2015/deer_2015.ThermalZone.rb +18 -18
  264. data/lib/openstudio-standards/standards/deer/deer_2017/data/deer_2017.economizers.json +248 -6
  265. data/lib/openstudio-standards/standards/deer/deer_2017/deer_2017.Space.rb +3 -3
  266. data/lib/openstudio-standards/standards/deer/deer_2017/deer_2017.ThermalZone.rb +18 -18
  267. data/lib/openstudio-standards/standards/deer/deer_2020/data/deer_2020.economizers.json +248 -6
  268. data/lib/openstudio-standards/standards/deer/deer_2020/deer_2020.AirLoopHVAC.rb +18 -5
  269. data/lib/openstudio-standards/standards/deer/deer_2020/deer_2020.FanVariableVolume.rb +1 -1
  270. data/lib/openstudio-standards/standards/deer/deer_2020/deer_2020.Space.rb +3 -3
  271. data/lib/openstudio-standards/standards/deer/deer_2020/deer_2020.ThermalZone.rb +18 -18
  272. data/lib/openstudio-standards/standards/deer/deer_2025/data/deer_2025.economizers.json +248 -6
  273. data/lib/openstudio-standards/standards/deer/deer_2025/deer_2025.AirLoopHVAC.rb +3 -3
  274. data/lib/openstudio-standards/standards/deer/deer_2025/deer_2025.FanVariableVolume.rb +1 -1
  275. data/lib/openstudio-standards/standards/deer/deer_2025/deer_2025.Space.rb +3 -3
  276. data/lib/openstudio-standards/standards/deer/deer_2030/data/deer_2030.economizers.json +248 -6
  277. data/lib/openstudio-standards/standards/deer/deer_2030/data/deer_2030.heat_pumps.json +2 -2
  278. data/lib/openstudio-standards/standards/deer/deer_2030/deer_2030.AirLoopHVAC.rb +3 -3
  279. data/lib/openstudio-standards/standards/deer/deer_2030/deer_2030.FanVariableVolume.rb +1 -1
  280. data/lib/openstudio-standards/standards/deer/deer_2030/deer_2030.Space.rb +3 -3
  281. data/lib/openstudio-standards/standards/deer/deer_2035/data/deer_2035.economizers.json +248 -6
  282. data/lib/openstudio-standards/standards/deer/deer_2035/deer_2035.AirLoopHVAC.rb +3 -3
  283. data/lib/openstudio-standards/standards/deer/deer_2035/deer_2035.FanVariableVolume.rb +1 -1
  284. data/lib/openstudio-standards/standards/deer/deer_2035/deer_2035.Space.rb +3 -3
  285. data/lib/openstudio-standards/standards/deer/deer_2040/data/deer_2040.economizers.json +248 -6
  286. data/lib/openstudio-standards/standards/deer/deer_2040/deer_2040.AirLoopHVAC.rb +3 -3
  287. data/lib/openstudio-standards/standards/deer/deer_2040/deer_2040.FanVariableVolume.rb +1 -1
  288. data/lib/openstudio-standards/standards/deer/deer_2040/deer_2040.Space.rb +3 -3
  289. data/lib/openstudio-standards/standards/deer/deer_2045/data/deer_2045.economizers.json +260 -0
  290. data/lib/openstudio-standards/standards/deer/deer_2045/deer_2045.AirLoopHVAC.rb +3 -3
  291. data/lib/openstudio-standards/standards/deer/deer_2045/deer_2045.FanVariableVolume.rb +1 -1
  292. data/lib/openstudio-standards/standards/deer/deer_2045/deer_2045.Space.rb +3 -3
  293. data/lib/openstudio-standards/standards/deer/deer_2050/data/deer_2050.economizers.json +248 -6
  294. data/lib/openstudio-standards/standards/deer/deer_2050/deer_2050.AirLoopHVAC.rb +3 -3
  295. data/lib/openstudio-standards/standards/deer/deer_2050/deer_2050.FanVariableVolume.rb +1 -1
  296. data/lib/openstudio-standards/standards/deer/deer_2050/deer_2050.Space.rb +3 -3
  297. data/lib/openstudio-standards/standards/deer/deer_2055/data/deer_2055.economizers.json +248 -6
  298. data/lib/openstudio-standards/standards/deer/deer_2055/deer_2055.AirLoopHVAC.rb +3 -3
  299. data/lib/openstudio-standards/standards/deer/deer_2055/deer_2055.FanVariableVolume.rb +1 -1
  300. data/lib/openstudio-standards/standards/deer/deer_2055/deer_2055.Space.rb +3 -3
  301. data/lib/openstudio-standards/standards/deer/deer_2060/data/deer_2060.economizers.json +248 -6
  302. data/lib/openstudio-standards/standards/deer/deer_2060/deer_2060.AirLoopHVAC.rb +3 -3
  303. data/lib/openstudio-standards/standards/deer/deer_2060/deer_2060.FanVariableVolume.rb +1 -1
  304. data/lib/openstudio-standards/standards/deer/deer_2060/deer_2060.Space.rb +3 -3
  305. data/lib/openstudio-standards/standards/deer/deer_2065/data/deer_2065.economizers.json +248 -6
  306. data/lib/openstudio-standards/standards/deer/deer_2065/deer_2065.AirLoopHVAC.rb +3 -3
  307. data/lib/openstudio-standards/standards/deer/deer_2065/deer_2065.FanVariableVolume.rb +1 -1
  308. data/lib/openstudio-standards/standards/deer/deer_2065/deer_2065.Space.rb +3 -3
  309. data/lib/openstudio-standards/standards/deer/deer_2070/data/deer_2070.economizers.json +248 -6
  310. data/lib/openstudio-standards/standards/deer/deer_2070/deer_2070.AirLoopHVAC.rb +3 -3
  311. data/lib/openstudio-standards/standards/deer/deer_2070/deer_2070.FanVariableVolume.rb +1 -1
  312. data/lib/openstudio-standards/standards/deer/deer_2070/deer_2070.Space.rb +3 -3
  313. data/lib/openstudio-standards/standards/deer/deer_2075/data/deer_2075.economizers.json +248 -6
  314. data/lib/openstudio-standards/standards/deer/deer_2075/deer_2075.AirLoopHVAC.rb +3 -3
  315. data/lib/openstudio-standards/standards/deer/deer_2075/deer_2075.FanVariableVolume.rb +1 -1
  316. data/lib/openstudio-standards/standards/deer/deer_2075/deer_2075.Space.rb +3 -3
  317. data/lib/openstudio-standards/standards/deer/deer_pre_1975/data/deer_pre_1975.economizers.json +246 -4
  318. data/lib/openstudio-standards/standards/necb/BTAP1980TO2010/data/space_types.json +447 -223
  319. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/building_envelope.rb +1 -1
  320. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/data/space_types.json +447 -223
  321. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_systems.rb +5 -2
  322. data/lib/openstudio-standards/standards/necb/ECMS/data/chiller_types.json +25 -0
  323. data/lib/openstudio-standards/standards/necb/ECMS/data/chillers.json +44 -0
  324. data/lib/openstudio-standards/standards/necb/ECMS/data/curves.json +225 -0
  325. data/lib/openstudio-standards/standards/necb/ECMS/ecms.rb +2 -2
  326. data/lib/openstudio-standards/standards/necb/ECMS/hvac_systems.rb +193 -73
  327. data/lib/openstudio-standards/standards/necb/ECMS/pv_ground.rb +1 -1
  328. data/lib/openstudio-standards/standards/necb/NECB2011/autozone.rb +10 -4
  329. data/lib/openstudio-standards/standards/necb/NECB2011/beps_compliance_path.rb +7 -7
  330. data/lib/openstudio-standards/standards/necb/NECB2011/building_envelope.rb +4 -5
  331. data/lib/openstudio-standards/standards/necb/NECB2011/data/chiller_types.json +32 -0
  332. data/lib/openstudio-standards/standards/necb/NECB2011/data/chillers.json +1 -1
  333. data/lib/openstudio-standards/standards/necb/NECB2011/data/constants.json +36 -0
  334. data/lib/openstudio-standards/standards/necb/NECB2011/data/fuel_type_sets.json +7 -7
  335. data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/NorthernEducation.osm +47587 -0
  336. data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/NorthernHealthCare.osm +49764 -0
  337. data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/Warehouse.osm +283 -297
  338. data/lib/openstudio-standards/standards/necb/NECB2011/data/space_type_unit_definitions.txt +2 -1
  339. data/lib/openstudio-standards/standards/necb/NECB2011/data/space_types.json +447 -223
  340. data/lib/openstudio-standards/standards/necb/NECB2011/data/standards_data.rb +3 -3
  341. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_1_multi_speed.rb +1 -1
  342. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_systems.rb +49 -27
  343. data/lib/openstudio-standards/standards/necb/NECB2011/necb_2011.rb +400 -202
  344. data/lib/openstudio-standards/standards/necb/NECB2011/service_water_heating.rb +4 -4
  345. data/lib/openstudio-standards/standards/necb/NECB2015/data/space_types.json +637 -318
  346. data/lib/openstudio-standards/standards/necb/NECB2015/hvac_systems.rb +18 -1
  347. data/lib/openstudio-standards/standards/necb/NECB2015/necb_2015.rb +3 -3
  348. data/lib/openstudio-standards/standards/necb/NECB2017/data/space_types.json +637 -318
  349. data/lib/openstudio-standards/standards/necb/NECB2017/hvac_systems.rb +1 -1
  350. data/lib/openstudio-standards/standards/necb/NECB2017/necb_2017.rb +3 -3
  351. data/lib/openstudio-standards/standards/necb/NECB2020/building_envelope.rb +1 -1
  352. data/lib/openstudio-standards/standards/necb/NECB2020/data/space_types.json +615 -307
  353. data/lib/openstudio-standards/standards/necb/NECB2020/service_water_heating.rb +4 -4
  354. data/lib/openstudio-standards/standards/necb/common/btap_data.rb +10 -5
  355. data/lib/openstudio-standards/standards/necb/common/btap_datapoint.rb +1 -1
  356. data/lib/openstudio-standards/utilities/assertion.rb +128 -0
  357. data/lib/openstudio-standards/utilities/logging.rb +2 -3
  358. data/lib/openstudio-standards/utilities/object_info.rb +39 -18
  359. data/lib/openstudio-standards/utilities/schedule_translator.rb +8 -6
  360. data/lib/openstudio-standards/utilities/simulation.rb +24 -11
  361. data/lib/openstudio-standards/utilities/sqlfile.rb +10 -5
  362. data/lib/openstudio-standards/version.rb +1 -1
  363. data/lib/openstudio-standards/weather/Weather.Model.rb +8 -9
  364. data/lib/openstudio-standards/weather/Weather.stat_file.rb +3 -3
  365. data/lib/openstudio-standards/weather/information.rb +35 -0
  366. data/lib/openstudio-standards.rb +69 -5
  367. metadata +54 -18
  368. data/License.txt +0 -65
  369. data/data/standards/OpenStudio_Standards-deer-ALL-comstock(space_types).xlsx +0 -0
  370. data/lib/openstudio-standards/hvac_sizing/Siz.AirLoopHVAC.rb +0 -59
  371. data/lib/openstudio-standards/hvac_sizing/Siz.CoilCoolingWater.rb +0 -13
  372. data/lib/openstudio-standards/hvac_sizing/Siz.HVACComponent.rb +0 -36
  373. data/lib/openstudio-standards/hvac_sizing/Siz.HeatingCoolingFuels.rb +0 -898
  374. data/lib/openstudio-standards/hvac_sizing/Siz.Model.rb +0 -126
  375. data/lib/openstudio-standards/hvac_sizing/Siz.ThermalZone.rb +0 -356
  376. data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.Model.rb +0 -35
  377. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoolingTower.rb +0 -110
  378. 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