openstudio-standards 0.4.0 → 0.5.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (376) hide show
  1. checksums.yaml +4 -4
  2. data/data/inventory/thermal_bridging.csv +90 -0
  3. data/data/standards/OpenStudio_Standards-deer-comstock.xlsx +0 -0
  4. data/data/standards/manage_OpenStudio_Standards.rb +1 -1
  5. data/data/standards/test_performance_expected_dd_results.csv +2014 -1891
  6. data/lib/openstudio-standards/btap/analysis.rb +8 -8
  7. data/lib/openstudio-standards/btap/bridging.rb +664 -645
  8. data/lib/openstudio-standards/btap/btap.model.rb +14 -14
  9. data/lib/openstudio-standards/btap/btap.rb +7 -7
  10. data/lib/openstudio-standards/btap/btap_result.rb +1 -1
  11. data/lib/openstudio-standards/btap/economics.rb +23 -23
  12. data/lib/openstudio-standards/btap/envelope.rb +8 -8
  13. data/lib/openstudio-standards/btap/equest.rb +1 -1
  14. data/lib/openstudio-standards/btap/geometry.rb +2 -2
  15. data/lib/openstudio-standards/btap/mpc.rb +7 -7
  16. data/lib/openstudio-standards/btap/schedules.rb +1 -1
  17. data/lib/openstudio-standards/btap/simmanager.rb +4 -4
  18. data/lib/openstudio-standards/btap/spaceloads.rb +26 -26
  19. data/lib/openstudio-standards/btap/utilities.rb +6 -6
  20. data/lib/openstudio-standards/btap/vintagizer.rb +1 -1
  21. data/lib/openstudio-standards/constructions/information.rb +83 -0
  22. data/lib/openstudio-standards/constructions/materials/modify.rb +72 -0
  23. data/lib/openstudio-standards/constructions/modify.rb +80 -0
  24. data/lib/openstudio-standards/create_typical/create_typical.rb +983 -0
  25. data/lib/openstudio-standards/create_typical/enumerations.rb +484 -0
  26. data/lib/openstudio-standards/create_typical/space_type_blend.rb +791 -0
  27. data/lib/openstudio-standards/create_typical/space_type_ratios.rb +494 -0
  28. data/lib/openstudio-standards/daylighting/space.rb +47 -0
  29. data/lib/openstudio-standards/geometry/create.rb +801 -0
  30. data/lib/openstudio-standards/geometry/create_bar.rb +2171 -0
  31. data/lib/openstudio-standards/geometry/information.rb +462 -0
  32. data/lib/openstudio-standards/geometry/modify.rb +48 -0
  33. data/lib/openstudio-standards/hvac/air_loop/information.rb +79 -0
  34. data/lib/openstudio-standards/hvac/cbecs_hvac.rb +616 -0
  35. data/lib/openstudio-standards/hvac/setpoint_managers/information.rb +91 -0
  36. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.AirTerminalSingleDuctVAVReheat.rb +1 -1
  37. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.AirTerminalSingleDuctVAVReheat.rb +1 -1
  38. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.AirTerminalSingleDuctVAVReheat.rb +1 -1
  39. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.Model.rb +1 -1
  40. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirTerminalSingleDuctVAVReheat.rb +1 -1
  41. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.Model.rb +2 -2
  42. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.hvac_systems.rb +1 -1
  43. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.AirTerminalSingleDuctVAVReheat.rb +1 -1
  44. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.Model.rb +4 -36
  45. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.hvac_systems.rb +1 -1
  46. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirTerminalSingleDuctVAVReheat.rb +1 -1
  47. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Model.rb +4 -36
  48. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Space.rb +3 -3
  49. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.hvac_systems.rb +1 -1
  50. data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.AirTerminalSingleDuctVAVReheat.rb +1 -1
  51. data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.Model.elevators.rb +1 -1
  52. data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.AirTerminalSingleDuctVAVReheat.rb +1 -1
  53. data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.CoilHeatingGas.rb +1 -1
  54. data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.Model.elevators.rb +1 -1
  55. data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.AirTerminalSingleDuctVAVReheat.rb +1 -1
  56. data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirTerminalSingleDuctVAVReheat.rb +1 -1
  57. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.College.rb +7 -7
  58. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Courthouse.rb +8 -8
  59. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.FullServiceRestaurant.rb +14 -14
  60. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.HighRiseApartment.rb +9 -9
  61. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Hospital.rb +16 -16
  62. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Laboratory.rb +7 -7
  63. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeDataCenterHighITE.rb +8 -8
  64. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeDataCenterLowITE.rb +8 -8
  65. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeHotel.rb +11 -11
  66. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeOffice.rb +7 -7
  67. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeOfficeDetailed.rb +9 -9
  68. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.MediumOffice.rb +8 -8
  69. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.MediumOfficeDetailed.rb +11 -11
  70. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.MidriseApartment.rb +9 -9
  71. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Outpatient.rb +19 -19
  72. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.PrimarySchool.rb +10 -10
  73. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.QuickServiceRestaurant.rb +13 -13
  74. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.RetailStandalone.rb +6 -6
  75. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.RetailStripmall.rb +6 -6
  76. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SecondarySchool.rb +9 -9
  77. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallDataCenterHighITE.rb +8 -8
  78. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallDataCenterLowITE.rb +8 -8
  79. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallHotel.rb +8 -8
  80. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallOffice.rb +8 -8
  81. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallOfficeDetailed.rb +11 -11
  82. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SuperMarket.rb +10 -10
  83. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SuperTallBuilding.rb +19 -19
  84. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.TallBuilding.rb +18 -18
  85. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Warehouse.rb +6 -6
  86. data/lib/openstudio-standards/prototypes/common/do_not_edit_metaclasses.rb +957 -957
  87. data/lib/openstudio-standards/prototypes/common/objects/Prototype.AirConditionerVariableRefrigerantFlow.rb +1 -1
  88. data/lib/openstudio-standards/prototypes/common/objects/Prototype.AirTerminalSingleDuctVAVReheat.rb +1 -1
  89. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingWaterToAirHeatPumpEquationFit.rb +84 -16
  90. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingDXSingleSpeed.rb +1 -1
  91. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingGas.rb +1 -1
  92. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingWaterToAirHeatPumpEquationFit.rb +61 -10
  93. data/lib/openstudio-standards/prototypes/common/objects/Prototype.ControllerWaterCoil.rb +1 -1
  94. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoolingTower.rb +1 -1
  95. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Fan.rb +1 -1
  96. data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanConstantVolume.rb +1 -1
  97. data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanOnOff.rb +1 -1
  98. data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanVariableVolume.rb +1 -1
  99. data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanZoneExhaust.rb +1 -1
  100. data/lib/openstudio-standards/prototypes/common/objects/Prototype.HeatExchangerAirToAirSensibleAndLatent.rb +2 -2
  101. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.exterior_lights.rb +4 -4
  102. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.hvac.rb +4 -4
  103. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.rb +43 -30
  104. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.swh.rb +1 -1
  105. data/lib/openstudio-standards/prototypes/common/objects/Prototype.ServiceWaterHeating.rb +18 -11
  106. data/lib/openstudio-standards/prototypes/common/objects/Prototype.SizingSystem.rb +1 -1
  107. data/lib/openstudio-standards/prototypes/common/objects/Prototype.hvac_systems.rb +774 -117
  108. data/lib/openstudio-standards/prototypes/common/objects/Prototype.radiant_system_controls.rb +340 -481
  109. data/lib/openstudio-standards/prototypes/common/objects/Prototype.refrigeration.rb +3 -3
  110. data/lib/openstudio-standards/prototypes/common/objects/Prototype.utilities.rb +3 -3
  111. data/lib/openstudio-standards/prototypes/common/prototype_metaprogramming.rb +22 -22
  112. data/lib/openstudio-standards/prototypes/deer/deer.Model.rb +1 -1
  113. data/lib/openstudio-standards/qaqc/calibration.rb +131 -0
  114. data/lib/openstudio-standards/qaqc/create_results.rb +983 -0
  115. data/lib/openstudio-standards/qaqc/envelope.rb +399 -0
  116. data/lib/openstudio-standards/qaqc/eui.rb +213 -0
  117. data/lib/openstudio-standards/qaqc/hvac.rb +1943 -0
  118. data/lib/openstudio-standards/qaqc/internal_loads.rb +568 -0
  119. data/lib/openstudio-standards/qaqc/reporting.rb +141 -0
  120. data/lib/openstudio-standards/qaqc/schedules.rb +129 -0
  121. data/lib/openstudio-standards/qaqc/service_water_heating.rb +273 -0
  122. data/lib/openstudio-standards/qaqc/weather_files.rb +497 -0
  123. data/lib/openstudio-standards/qaqc/zone_conditions.rb +278 -0
  124. data/lib/openstudio-standards/schedules/create.rb +364 -0
  125. data/lib/openstudio-standards/schedules/information.rb +169 -0
  126. data/lib/openstudio-standards/schedules/modify.rb +445 -0
  127. data/lib/openstudio-standards/standards/Standards.AirLoopHVAC.rb +110 -71
  128. data/lib/openstudio-standards/standards/Standards.AirTerminalSingleDuctParallelPIUReheat.rb +3 -3
  129. data/lib/openstudio-standards/standards/Standards.AirTerminalSingleDuctVAVReheat.rb +4 -4
  130. data/lib/openstudio-standards/standards/Standards.BoilerHotWater.rb +2 -1
  131. data/lib/openstudio-standards/standards/Standards.ChillerElectricEIR.rb +16 -10
  132. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXSingleSpeed.rb +4 -4
  133. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXTwoSpeed.rb +1 -1
  134. data/lib/openstudio-standards/standards/Standards.CoilCoolingWaterToAirHeatPumpEquationFit.rb +1 -1
  135. data/lib/openstudio-standards/standards/Standards.CoilDX.rb +4 -4
  136. data/lib/openstudio-standards/standards/Standards.CoilHeatingDXMultiSpeed.rb +1 -1
  137. data/lib/openstudio-standards/standards/Standards.CoilHeatingDXSingleSpeed.rb +5 -5
  138. data/lib/openstudio-standards/standards/Standards.CoilHeatingGas.rb +1 -1
  139. data/lib/openstudio-standards/standards/Standards.CoilHeatingGasMultiStage.rb +1 -1
  140. data/lib/openstudio-standards/standards/Standards.CoilHeatingWaterToAirHeatPumpEquationFit.rb +1 -1
  141. data/lib/openstudio-standards/standards/Standards.Construction.rb +17 -18
  142. data/lib/openstudio-standards/standards/Standards.CoolingTower.rb +6 -6
  143. data/lib/openstudio-standards/standards/Standards.CoolingTowerSingleSpeed.rb +1 -1
  144. data/lib/openstudio-standards/standards/Standards.CoolingTowerTwoSpeed.rb +1 -1
  145. data/lib/openstudio-standards/standards/Standards.CoolingTowerVariableSpeed.rb +1 -1
  146. data/lib/openstudio-standards/standards/Standards.Fan.rb +6 -12
  147. data/lib/openstudio-standards/standards/Standards.FanVariableVolume.rb +2 -2
  148. data/lib/openstudio-standards/standards/Standards.FluidCooler.rb +1 -1
  149. data/lib/openstudio-standards/standards/Standards.HeaderedPumpsVariableSpeed.rb +1 -1
  150. data/lib/openstudio-standards/standards/Standards.HeatExchangerSensLat.rb +3 -3
  151. data/lib/openstudio-standards/standards/Standards.Model.rb +411 -261
  152. data/lib/openstudio-standards/standards/Standards.PlanarSurface.rb +2 -2
  153. data/lib/openstudio-standards/standards/Standards.PlantLoop.rb +94 -29
  154. data/lib/openstudio-standards/standards/Standards.Pump.rb +2 -2
  155. data/lib/openstudio-standards/standards/Standards.ScheduleConstant.rb +2 -2
  156. data/lib/openstudio-standards/standards/Standards.ScheduleRuleset.rb +14 -14
  157. data/lib/openstudio-standards/standards/Standards.Space.rb +37 -30
  158. data/lib/openstudio-standards/standards/Standards.SpaceType.rb +38 -29
  159. data/lib/openstudio-standards/standards/Standards.SubSurface.rb +7 -7
  160. data/lib/openstudio-standards/standards/Standards.Surface.rb +13 -13
  161. data/lib/openstudio-standards/standards/Standards.ThermalZone.rb +109 -66
  162. data/lib/openstudio-standards/standards/Standards.WaterHeaterMixed.rb +11 -4
  163. data/lib/openstudio-standards/standards/Standards.ZoneHVACComponent.rb +6 -6
  164. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.AirLoopHVAC.rb +1 -1
  165. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.PlantLoop.rb +1 -1
  166. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.Space.rb +1 -1
  167. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.Space.rb +1 -1
  168. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.AirLoopHVAC.rb +4 -4
  169. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.AirTerminalSingleDuctVAVReheat.rb +1 -1
  170. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.Space.rb +4 -4
  171. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirLoopHVAC.rb +4 -4
  172. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirTerminalSingleDuctVAVReheat.rb +1 -1
  173. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.CoolingTowerVariableSpeed.rb +1 -1
  174. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.Model.rb +5 -21
  175. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.Space.rb +4 -4
  176. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.WaterHeaterMixed.rb +1 -1
  177. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.ZoneHVACComponent.rb +1 -1
  178. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.AirLoopHVAC.rb +36 -4
  179. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.AirTerminalSingleDuctVAVReheat.rb +1 -1
  180. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.CoolingTowerVariableSpeed.rb +1 -1
  181. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.Space.rb +4 -4
  182. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.ZoneHVACComponent.rb +1 -1
  183. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/comstock_ashrae_90_1_2016/comstock_ashrae_90_1_2016.AirLoopHVAC.rb +26 -0
  184. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirLoopHVAC.rb +53 -10
  185. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirTerminalSingleDuctVAVReheat.rb +1 -1
  186. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.CoolingTowerVariableSpeed.rb +1 -1
  187. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Space.rb +6 -6
  188. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.ZoneHVACComponent.rb +2 -2
  189. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/comstock_ashrae_90_1_2019/comstock_ashrae_90_1_2019.AirLoopHVAC.rb +26 -0
  190. data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.curves.json +211 -211
  191. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.economizers.json +14 -14
  192. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.AirLoopHVAC.rb +4 -4
  193. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.Model.rb +1 -1
  194. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.PlantLoop.rb +1 -1
  195. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.economizers.json +14 -14
  196. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.AirLoopHVAC.rb +4 -4
  197. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.Model.rb +1 -1
  198. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.PlantLoop.rb +1 -1
  199. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.AirLoopHVAC.rb +6 -6
  200. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.AirTerminalSingleDuctVAVReheat.rb +1 -1
  201. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.CoolingTowerVariableSpeed.rb +1 -1
  202. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.PlantLoop.rb +1 -1
  203. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.Space.rb +4 -4
  204. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirLoopHVAC.rb +6 -6
  205. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirTerminalSingleDuctVAVReheat.rb +1 -1
  206. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.CoolingTowerVariableSpeed.rb +1 -1
  207. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.PlantLoop.rb +1 -1
  208. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.Space.rb +4 -4
  209. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.AirLoopHVAC.rb +22 -28
  210. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.AirTerminalSingleDuctParallelPIUReheat.rb +1 -1
  211. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.AirTerminalSingleDuctVAVReheat.rb +2 -2
  212. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.BoilerHotWater.rb +1 -74
  213. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.ChillerElectricEIR.rb +7 -59
  214. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilCoolingDXSingleSpeed.rb +1 -1
  215. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilCoolingDXTwoSpeed.rb +1 -1
  216. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilDX.rb +1 -1
  217. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilHeatingDXSingleSpeed.rb +1 -1
  218. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilHeatingGas.rb +1 -21
  219. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.DesignSpecificationOutdoorAir.rb +101 -0
  220. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.FanConstantVolume.rb +1 -1
  221. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.FanOnOff.rb +1 -1
  222. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.FanVariableVolume.rb +1 -1
  223. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.HeatExchangerSensLat.rb +1 -1
  224. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.Model.rb +643 -526
  225. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.PlanarSurface.rb +8 -2
  226. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.PlantLoop.rb +17 -77
  227. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.Space.rb +74 -16
  228. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.SpaceType.rb +96 -44
  229. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.Surface.rb +6 -6
  230. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.ThermalZone.rb +18 -6
  231. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.ZoneHVACComponent.rb +1 -1
  232. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.rb +328 -74
  233. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/ashrae_90_1_prm_2019.Model.rb +0 -118
  234. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/ashrae_90_1_prm_2019.rb +2 -1
  235. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.heat_rejection.json +1 -1
  236. data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/baseline_outdoor_air.md +35 -0
  237. data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/set_plug_load_measures.md +1 -1
  238. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/ashrae_90_1_prm.UserData.rb +228 -0
  239. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_enums.rb +131 -0
  240. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_space.csv +1 -1
  241. data/lib/openstudio-standards/standards/cbes/cbes.AirLoopHVAC.rb +5 -5
  242. data/lib/openstudio-standards/standards/cbes/cbes.Model.rb +1 -1
  243. data/lib/openstudio-standards/standards/cbes/cbes.PlantLoop.rb +1 -1
  244. data/lib/openstudio-standards/standards/cbes/cbes.Space.rb +1 -1
  245. data/lib/openstudio-standards/standards/cbes/cbes_t24_2005/cbes_t24_2005.Space.rb +1 -1
  246. data/lib/openstudio-standards/standards/cbes/cbes_t24_2008/cbes_t24_2008.Space.rb +1 -1
  247. data/lib/openstudio-standards/standards/deer/deer.AirLoopHVAC.rb +109 -27
  248. data/lib/openstudio-standards/standards/deer/deer.Space.rb +1 -1
  249. data/lib/openstudio-standards/standards/deer/deer_1985/data/deer_1985.economizers.json +246 -4
  250. data/lib/openstudio-standards/standards/deer/deer_1996/data/deer_1996.economizers.json +246 -4
  251. data/lib/openstudio-standards/standards/deer/deer_2003/data/deer_2003.economizers.json +246 -4
  252. data/lib/openstudio-standards/standards/deer/deer_2003/deer_2003.ThermalZone.rb +18 -18
  253. data/lib/openstudio-standards/standards/deer/deer_2007/data/deer_2007.economizers.json +246 -4
  254. data/lib/openstudio-standards/standards/deer/deer_2007/deer_2007.ThermalZone.rb +18 -18
  255. data/lib/openstudio-standards/standards/deer/deer_2011/data/deer_2011.economizers.json +246 -4
  256. data/lib/openstudio-standards/standards/deer/deer_2011/deer_2011.ThermalZone.rb +18 -18
  257. data/lib/openstudio-standards/standards/deer/deer_2014/data/deer_2014.economizers.json +248 -6
  258. data/lib/openstudio-standards/standards/deer/deer_2014/deer_2014.Space.rb +3 -3
  259. data/lib/openstudio-standards/standards/deer/deer_2014/deer_2014.ThermalZone.rb +18 -18
  260. data/lib/openstudio-standards/standards/deer/deer_2015/data/deer_2015.economizers.json +248 -6
  261. data/lib/openstudio-standards/standards/deer/deer_2015/deer_2015.Space.rb +3 -3
  262. data/lib/openstudio-standards/standards/deer/deer_2015/deer_2015.ThermalZone.rb +18 -18
  263. data/lib/openstudio-standards/standards/deer/deer_2017/data/deer_2017.economizers.json +248 -6
  264. data/lib/openstudio-standards/standards/deer/deer_2017/deer_2017.Space.rb +3 -3
  265. data/lib/openstudio-standards/standards/deer/deer_2017/deer_2017.ThermalZone.rb +18 -18
  266. data/lib/openstudio-standards/standards/deer/deer_2020/data/deer_2020.economizers.json +248 -6
  267. data/lib/openstudio-standards/standards/deer/deer_2020/deer_2020.AirLoopHVAC.rb +18 -5
  268. data/lib/openstudio-standards/standards/deer/deer_2020/deer_2020.FanVariableVolume.rb +1 -1
  269. data/lib/openstudio-standards/standards/deer/deer_2020/deer_2020.Space.rb +3 -3
  270. data/lib/openstudio-standards/standards/deer/deer_2020/deer_2020.ThermalZone.rb +18 -18
  271. data/lib/openstudio-standards/standards/deer/deer_2025/data/deer_2025.economizers.json +248 -6
  272. data/lib/openstudio-standards/standards/deer/deer_2025/deer_2025.AirLoopHVAC.rb +3 -3
  273. data/lib/openstudio-standards/standards/deer/deer_2025/deer_2025.FanVariableVolume.rb +1 -1
  274. data/lib/openstudio-standards/standards/deer/deer_2025/deer_2025.Space.rb +3 -3
  275. data/lib/openstudio-standards/standards/deer/deer_2030/data/deer_2030.economizers.json +248 -6
  276. data/lib/openstudio-standards/standards/deer/deer_2030/data/deer_2030.heat_pumps.json +2 -2
  277. data/lib/openstudio-standards/standards/deer/deer_2030/deer_2030.AirLoopHVAC.rb +3 -3
  278. data/lib/openstudio-standards/standards/deer/deer_2030/deer_2030.FanVariableVolume.rb +1 -1
  279. data/lib/openstudio-standards/standards/deer/deer_2030/deer_2030.Space.rb +3 -3
  280. data/lib/openstudio-standards/standards/deer/deer_2035/data/deer_2035.economizers.json +248 -6
  281. data/lib/openstudio-standards/standards/deer/deer_2035/deer_2035.AirLoopHVAC.rb +3 -3
  282. data/lib/openstudio-standards/standards/deer/deer_2035/deer_2035.FanVariableVolume.rb +1 -1
  283. data/lib/openstudio-standards/standards/deer/deer_2035/deer_2035.Space.rb +3 -3
  284. data/lib/openstudio-standards/standards/deer/deer_2040/data/deer_2040.economizers.json +248 -6
  285. data/lib/openstudio-standards/standards/deer/deer_2040/deer_2040.AirLoopHVAC.rb +3 -3
  286. data/lib/openstudio-standards/standards/deer/deer_2040/deer_2040.FanVariableVolume.rb +1 -1
  287. data/lib/openstudio-standards/standards/deer/deer_2040/deer_2040.Space.rb +3 -3
  288. data/lib/openstudio-standards/standards/deer/deer_2045/data/deer_2045.economizers.json +260 -0
  289. data/lib/openstudio-standards/standards/deer/deer_2045/deer_2045.AirLoopHVAC.rb +3 -3
  290. data/lib/openstudio-standards/standards/deer/deer_2045/deer_2045.FanVariableVolume.rb +1 -1
  291. data/lib/openstudio-standards/standards/deer/deer_2045/deer_2045.Space.rb +3 -3
  292. data/lib/openstudio-standards/standards/deer/deer_2050/data/deer_2050.economizers.json +248 -6
  293. data/lib/openstudio-standards/standards/deer/deer_2050/deer_2050.AirLoopHVAC.rb +3 -3
  294. data/lib/openstudio-standards/standards/deer/deer_2050/deer_2050.FanVariableVolume.rb +1 -1
  295. data/lib/openstudio-standards/standards/deer/deer_2050/deer_2050.Space.rb +3 -3
  296. data/lib/openstudio-standards/standards/deer/deer_2055/data/deer_2055.economizers.json +248 -6
  297. data/lib/openstudio-standards/standards/deer/deer_2055/deer_2055.AirLoopHVAC.rb +3 -3
  298. data/lib/openstudio-standards/standards/deer/deer_2055/deer_2055.FanVariableVolume.rb +1 -1
  299. data/lib/openstudio-standards/standards/deer/deer_2055/deer_2055.Space.rb +3 -3
  300. data/lib/openstudio-standards/standards/deer/deer_2060/data/deer_2060.economizers.json +248 -6
  301. data/lib/openstudio-standards/standards/deer/deer_2060/deer_2060.AirLoopHVAC.rb +3 -3
  302. data/lib/openstudio-standards/standards/deer/deer_2060/deer_2060.FanVariableVolume.rb +1 -1
  303. data/lib/openstudio-standards/standards/deer/deer_2060/deer_2060.Space.rb +3 -3
  304. data/lib/openstudio-standards/standards/deer/deer_2065/data/deer_2065.economizers.json +248 -6
  305. data/lib/openstudio-standards/standards/deer/deer_2065/deer_2065.AirLoopHVAC.rb +3 -3
  306. data/lib/openstudio-standards/standards/deer/deer_2065/deer_2065.FanVariableVolume.rb +1 -1
  307. data/lib/openstudio-standards/standards/deer/deer_2065/deer_2065.Space.rb +3 -3
  308. data/lib/openstudio-standards/standards/deer/deer_2070/data/deer_2070.economizers.json +248 -6
  309. data/lib/openstudio-standards/standards/deer/deer_2070/deer_2070.AirLoopHVAC.rb +3 -3
  310. data/lib/openstudio-standards/standards/deer/deer_2070/deer_2070.FanVariableVolume.rb +1 -1
  311. data/lib/openstudio-standards/standards/deer/deer_2070/deer_2070.Space.rb +3 -3
  312. data/lib/openstudio-standards/standards/deer/deer_2075/data/deer_2075.economizers.json +248 -6
  313. data/lib/openstudio-standards/standards/deer/deer_2075/deer_2075.AirLoopHVAC.rb +3 -3
  314. data/lib/openstudio-standards/standards/deer/deer_2075/deer_2075.FanVariableVolume.rb +1 -1
  315. data/lib/openstudio-standards/standards/deer/deer_2075/deer_2075.Space.rb +3 -3
  316. data/lib/openstudio-standards/standards/deer/deer_pre_1975/data/deer_pre_1975.economizers.json +246 -4
  317. data/lib/openstudio-standards/standards/necb/BTAP1980TO2010/data/space_types.json +447 -223
  318. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/building_envelope.rb +1 -1
  319. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/data/space_types.json +447 -223
  320. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_systems.rb +5 -2
  321. data/lib/openstudio-standards/standards/necb/ECMS/data/chiller_types.json +25 -0
  322. data/lib/openstudio-standards/standards/necb/ECMS/data/chillers.json +44 -0
  323. data/lib/openstudio-standards/standards/necb/ECMS/data/curves.json +225 -0
  324. data/lib/openstudio-standards/standards/necb/ECMS/ecms.rb +2 -2
  325. data/lib/openstudio-standards/standards/necb/ECMS/hvac_systems.rb +193 -73
  326. data/lib/openstudio-standards/standards/necb/ECMS/pv_ground.rb +1 -1
  327. data/lib/openstudio-standards/standards/necb/NECB2011/autozone.rb +10 -4
  328. data/lib/openstudio-standards/standards/necb/NECB2011/beps_compliance_path.rb +7 -7
  329. data/lib/openstudio-standards/standards/necb/NECB2011/building_envelope.rb +4 -5
  330. data/lib/openstudio-standards/standards/necb/NECB2011/data/chiller_types.json +32 -0
  331. data/lib/openstudio-standards/standards/necb/NECB2011/data/chillers.json +1 -1
  332. data/lib/openstudio-standards/standards/necb/NECB2011/data/constants.json +36 -0
  333. data/lib/openstudio-standards/standards/necb/NECB2011/data/fuel_type_sets.json +7 -7
  334. data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/NorthernEducation.osm +47587 -0
  335. data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/NorthernHealthCare.osm +49764 -0
  336. data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/Warehouse.osm +283 -297
  337. data/lib/openstudio-standards/standards/necb/NECB2011/data/space_type_unit_definitions.txt +2 -1
  338. data/lib/openstudio-standards/standards/necb/NECB2011/data/space_types.json +447 -223
  339. data/lib/openstudio-standards/standards/necb/NECB2011/data/standards_data.rb +3 -3
  340. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_1_multi_speed.rb +1 -1
  341. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_systems.rb +49 -27
  342. data/lib/openstudio-standards/standards/necb/NECB2011/necb_2011.rb +400 -202
  343. data/lib/openstudio-standards/standards/necb/NECB2011/service_water_heating.rb +4 -4
  344. data/lib/openstudio-standards/standards/necb/NECB2015/data/space_types.json +637 -318
  345. data/lib/openstudio-standards/standards/necb/NECB2015/hvac_systems.rb +18 -1
  346. data/lib/openstudio-standards/standards/necb/NECB2015/necb_2015.rb +3 -3
  347. data/lib/openstudio-standards/standards/necb/NECB2017/data/space_types.json +637 -318
  348. data/lib/openstudio-standards/standards/necb/NECB2017/hvac_systems.rb +1 -1
  349. data/lib/openstudio-standards/standards/necb/NECB2017/necb_2017.rb +3 -3
  350. data/lib/openstudio-standards/standards/necb/NECB2020/building_envelope.rb +1 -1
  351. data/lib/openstudio-standards/standards/necb/NECB2020/data/space_types.json +615 -307
  352. data/lib/openstudio-standards/standards/necb/NECB2020/service_water_heating.rb +4 -4
  353. data/lib/openstudio-standards/standards/necb/common/btap_data.rb +10 -5
  354. data/lib/openstudio-standards/standards/necb/common/btap_datapoint.rb +1 -1
  355. data/lib/openstudio-standards/utilities/assertion.rb +128 -0
  356. data/lib/openstudio-standards/utilities/logging.rb +2 -3
  357. data/lib/openstudio-standards/utilities/object_info.rb +39 -18
  358. data/lib/openstudio-standards/utilities/schedule_translator.rb +8 -6
  359. data/lib/openstudio-standards/utilities/simulation.rb +24 -11
  360. data/lib/openstudio-standards/utilities/sqlfile.rb +10 -5
  361. data/lib/openstudio-standards/version.rb +1 -1
  362. data/lib/openstudio-standards/weather/Weather.Model.rb +8 -9
  363. data/lib/openstudio-standards/weather/Weather.stat_file.rb +3 -3
  364. data/lib/openstudio-standards/weather/information.rb +35 -0
  365. data/lib/openstudio-standards.rb +69 -5
  366. metadata +52 -16
  367. data/data/standards/OpenStudio_Standards-deer-ALL-comstock(space_types).xlsx +0 -0
  368. data/lib/openstudio-standards/hvac_sizing/Siz.AirLoopHVAC.rb +0 -59
  369. data/lib/openstudio-standards/hvac_sizing/Siz.CoilCoolingWater.rb +0 -13
  370. data/lib/openstudio-standards/hvac_sizing/Siz.HVACComponent.rb +0 -36
  371. data/lib/openstudio-standards/hvac_sizing/Siz.HeatingCoolingFuels.rb +0 -898
  372. data/lib/openstudio-standards/hvac_sizing/Siz.Model.rb +0 -126
  373. data/lib/openstudio-standards/hvac_sizing/Siz.ThermalZone.rb +0 -356
  374. data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.Model.rb +0 -35
  375. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoolingTower.rb +0 -110
  376. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoolingTowerVariableSpeed.rb +0 -5
@@ -0,0 +1,983 @@
1
+ # Methods to create typical models
2
+ module OpenstudioStandards
3
+ module CreateTypical
4
+ # @!group CreateTypical
5
+
6
+ # create typical building from model
7
+ # creates a complete energy model from model with defined geometry and standards space type assignments
8
+ #
9
+ # @param template [String] standard template
10
+ # @param climate_zone [String] ASHRAE climate zone, e.g. 'ASHRAE 169-2013-4A'.
11
+ # @param add_hvac [Boolean] Add HVAC systems to the model
12
+ # @param hvac_system_type [String] HVAC system type
13
+ # @param hvac_delivery_type [String] HVAC delivery type, how the system delivers heating or cooling to zones.
14
+ # Options are 'Forced Air' or 'Hydronic'.
15
+ # @param heating_fuel [String] The primary HVAC heating fuel type.
16
+ # Options are 'Electricity', 'NaturalGas', 'DistrictHeating', 'DistrictHeatingWater', 'DistrictHeatingSteam', 'DistrictAmbient'
17
+ # @param service_water_heating_fuel [String] The primary service water heating fuel type.
18
+ # Options are 'Inferred', 'Electricity', 'NaturalGas', 'DistrictHeating', 'DistrictHeatingWater', 'DistrictHeatingSteam', 'HeatPump'
19
+ # @param cooling_fuel [String] The primary HVAC cooling fuel type
20
+ # Options are 'Electricity', 'DistrictCooling', 'DistrictAmbient'
21
+ # @param kitchen_makeup [String] Source of makeup air for kitchen exhaust
22
+ # Options are 'None', 'Largest Zone', 'Adjacent'
23
+ # @param exterior_lighting_zone [String] The exterior lighting zone for exterior lighting allowance.
24
+ # Options are '0 - Undeveloped Areas Parks', '1 - Developed Areas Parks', '2 - Neighborhood', '3 - All Other Areas', '4 - High Activity'
25
+ # @param add_constructions [Boolean] Create and apply default construction set
26
+ # @param wall_construction_type [String] wall construction type.
27
+ # Options are 'Inferred', 'Mass', 'Metal Building', 'WoodFramed', 'SteelFramed'
28
+ # @param add_space_type_loads [Boolean] Populate existing standards space types in the model with internal loads
29
+ # @param add_daylighting_controls [Boolean] Add daylighting controls
30
+ # @param add_elevators [Boolean] Apply elevators directly to a space in the model instead of to a space type
31
+ # @param add_internal_mass [Boolean] Add internal mass to each space
32
+ # @param add_exterior_lights [Boolean] Add exterior lightings objects to parking, canopies, and facades
33
+ # @param onsite_parking_fraction [Double] Fraction of allowable exterior parking lighting applied. Set to 0 to add no parking lighting.
34
+ # @param add_exhaust [Boolean] Add exhaust fans to the models. Primarly kitchen exhaust fans.
35
+ # @param add_swh [Boolean] Add service water heating supply and demand objects
36
+ # @param add_thermostat [Boolean] Add thermostats to thermal zones based on the standards space type
37
+ # @param add_refrigeration [Boolean] Add refrigerated cases and walkin refrigeration
38
+ # @param modify_wkdy_op_hrs [Boolean] Modify the default weekday hours of operation
39
+ # @param wkdy_op_hrs_start_time [Double] Weekday operating hours start time. Enter as a fractional value, e.g. 5:15pm is 17.25. Only used if modify_wkdy_op_hrs is true.
40
+ # @param wkdy_op_hrs_duration [Double] Weekday operating hours duration from start time. Enter as a fractional value, e.g. 5:15pm is 17.25. Only used if modify_wkdy_op_hrs is true.
41
+ # @param modify_wknd_op_hrs [Boolean] Modify the default weekend hours of operation
42
+ # @param wknd_op_hrs_start_time [Double] Weekend operation hours start time. Enter as a fractional value, e.g. 5:15pm is 17.25. Only used if modify_wknd_op_hrs is true.
43
+ # @param wknd_op_hrs_duration [Double] Weekend operating hours duration from start time. Enter as a fractional value, e.g. 5:15pm is 17.25. Only used if modify_wknd_op_hrs is true.
44
+ # @param hoo_var_method [String] hours of operation variable method. Options are 'hours' or 'fractional'.
45
+ # @param enable_dst [Boolean] Enable daylight savings
46
+ # @param unmet_hours_tolerance_r [Double] Thermostat setpoint tolerance for unmet hours in degrees Rankine
47
+ # @param remove_objects [Boolean] Clean model of non-geometry objects. Only removes the same objects types as those added to the model.
48
+ # @return [Boolean] returns true if successful, false if not
49
+ def self.create_typical_building_from_model(model,
50
+ template,
51
+ climate_zone: 'Lookup From Model',
52
+ add_hvac: true,
53
+ hvac_system_type: 'Inferred',
54
+ hvac_delivery_type: 'Forced Air',
55
+ heating_fuel: 'NaturalGas',
56
+ service_water_heating_fuel: 'NaturalGas',
57
+ cooling_fuel: 'Electricity',
58
+ kitchen_makeup: 'Adjacent',
59
+ exterior_lighting_zone: '3 - All Other Areas',
60
+ add_constructions: true,
61
+ wall_construction_type: 'Inferred',
62
+ add_space_type_loads: true,
63
+ add_daylighting_controls: true,
64
+ add_elevators: true,
65
+ add_internal_mass: true,
66
+ add_exterior_lights: true,
67
+ onsite_parking_fraction: 1.0,
68
+ add_exhaust: true,
69
+ add_swh: true,
70
+ add_thermostat: true,
71
+ add_refrigeration: true,
72
+ modify_wkdy_op_hrs: false,
73
+ wkdy_op_hrs_start_time: 8.0,
74
+ wkdy_op_hrs_duration: 8.0,
75
+ modify_wknd_op_hrs: false,
76
+ wknd_op_hrs_start_time: 8.0,
77
+ wknd_op_hrs_duration: 8.0,
78
+ hoo_var_method: 'hours',
79
+ enable_dst: true,
80
+ unmet_hours_tolerance_r: 1.0,
81
+ remove_objects: true)
82
+
83
+ # report initial condition of model
84
+ initial_object_size = model.getModelObjects.size
85
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', "The building started with #{initial_object_size} objects.")
86
+
87
+ # create a new standard class
88
+ standard = Standard.build(template)
89
+
90
+ # validate climate zone
91
+ if climate_zone == 'Lookup From Model' || climate_zone.nil?
92
+ climate_zone = standard.model_get_building_properties(model)['climate_zone']
93
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', "Using climate zone #{climate_zone} from model")
94
+ else
95
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', "Using climate zone #{climate_zone} from user arguments")
96
+ end
97
+ if climate_zone == ''
98
+ OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.CreateTypical', 'Could not determine climate zone from measure arguments or model.')
99
+ return false
100
+ end
101
+
102
+ # validate weekday hours of operation
103
+ wkdy_op_hrs_start_time_hr = nil
104
+ wkdy_op_hrs_start_time_min = nil
105
+ wkdy_op_hrs_duration_hr = nil
106
+ wkdy_op_hrs_duration_min = nil
107
+ if modify_wkdy_op_hrs
108
+ # weekday start time hr
109
+ wkdy_op_hrs_start_time_hr = wkdy_op_hrs_start_time.floor
110
+ if wkdy_op_hrs_start_time_hr < 0 || wkdy_op_hrs_start_time_hr > 24
111
+ OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.CreateTypical', "Weekday operating hours start time hrs must be between 0 and 24. #{wkdy_op_hrs_start_time} was entered.")
112
+ return false
113
+ end
114
+
115
+ # weekday start time min
116
+ wkdy_op_hrs_start_time_min = (60.0 * (wkdy_op_hrs_start_time - wkdy_op_hrs_start_time.floor)).floor
117
+ if wkdy_op_hrs_start_time_min < 0 || wkdy_op_hrs_start_time_min > 59
118
+ OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.CreateTypical', "Weekday operating hours start time mins must be between 0 and 59. #{wkdy_op_hrs_start_time} was entered.")
119
+ return false
120
+ end
121
+
122
+ # weekday duration hr
123
+ wkdy_op_hrs_duration_hr = wkdy_op_hrs_duration.floor
124
+ if wkdy_op_hrs_duration_hr < 0 || wkdy_op_hrs_duration_hr > 24
125
+ OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.CreateTypical', "Weekday operating hours duration hrs must be between 0 and 24. #{wkdy_op_hrs_duration} was entered.")
126
+ return false
127
+ end
128
+
129
+ # weekday duration min
130
+ wkdy_op_hrs_duration_min = (60.0 * (wkdy_op_hrs_duration - wkdy_op_hrs_duration.floor)).floor
131
+ if wkdy_op_hrs_duration_min < 0 || wkdy_op_hrs_duration_min > 59
132
+ OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.CreateTypical', "Weekday operating hours duration mins must be between 0 and 59. #{wkdy_op_hrs_duration} was entered.")
133
+ return false
134
+ end
135
+
136
+ # check that weekday start time plus duration does not exceed 24 hrs
137
+ if (wkdy_op_hrs_start_time_hr + wkdy_op_hrs_duration_hr + (wkdy_op_hrs_start_time_min + wkdy_op_hrs_duration_min) / 60.0) > 24.0
138
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', "Weekday start time of #{wkdy_op_hrs_start} plus duration of #{wkdy_op_hrs_duration} is more than 24 hrs, hours of operation overlap midnight.")
139
+ end
140
+ end
141
+
142
+ # validate weekend hours of operation
143
+ wknd_op_hrs_start_time_hr = nil
144
+ wknd_op_hrs_start_time_min = nil
145
+ wknd_op_hrs_duration_hr = nil
146
+ wknd_op_hrs_duration_min = nil
147
+ if modify_wknd_op_hrs
148
+ # weekend start time hr
149
+ wknd_op_hrs_start_time_hr = wknd_op_hrs_start_time.floor
150
+ if wknd_op_hrs_start_time_hr < 0 || wknd_op_hrs_start_time_hr > 24
151
+ OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.CreateTypical', "Weekend operating hours start time hrs must be between 0 and 24. #{wknd_op_hrs_start_time} was entered.")
152
+ return false
153
+ end
154
+
155
+ # weekend start time min
156
+ wknd_op_hrs_start_time_min = (60.0 * (wknd_op_hrs_start_time - wknd_op_hrs_start_time.floor)).floor
157
+ if wknd_op_hrs_start_time_min < 0 || wknd_op_hrs_start_time_min > 59
158
+ OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.CreateTypical', "Weekend operating hours start time mins must be between 0 and 59. #{wknd_op_hrs_start_time} was entered.")
159
+ return false
160
+ end
161
+
162
+ # weekend duration hr
163
+ wknd_op_hrs_duration_hr = wknd_op_hrs_duration.floor
164
+ if wknd_op_hrs_duration_hr < 0 || wknd_op_hrs_duration_hr > 24
165
+ OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.CreateTypical', "Weekend operating hours duration hrs must be between 0 and 24. #{wknd_op_hrs_duration} was entered.")
166
+ return false
167
+ end
168
+
169
+ # weekend duration min
170
+ wknd_op_hrs_duration_min = (60.0 * (wknd_op_hrs_duration - wknd_op_hrs_duration.floor)).floor
171
+ if wknd_op_hrs_duration_min < 0 || wknd_op_hrs_duration_min > 59
172
+ OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.CreateTypical', "Weekend operating hours duration min smust be between 0 and 59. #{wknd_op_hrs_duration} was entered.")
173
+ return false
174
+ end
175
+
176
+ # check that weekend start time plus duration does not exceed 24 hrs
177
+ if (wknd_op_hrs_start_time_hr + wknd_op_hrs_duration_hr + (wknd_op_hrs_start_time_min + wknd_op_hrs_duration_min) / 60.0) > 24.0
178
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', "Weekend start time of #{wknd_op_hrs_start} plus duration of #{wknd_op_hrs_duration} is more than 24 hrs, hours of operation overlap midnight.")
179
+ end
180
+ end
181
+
182
+ # validate unmet hours tolerance
183
+ if unmet_hours_tolerance_r < 0
184
+ OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.CreateTypical', 'unmet_hours_tolerance_r must be greater than or equal to 0 Rankine.')
185
+ return false
186
+ elsif unmet_hours_tolerance_r > 5.0
187
+ OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.CreateTypical', 'unmet_hours_tolerance_r must be less than or equal to 5 Rankine.')
188
+ return false
189
+ end
190
+
191
+ # make sure daylight savings is turned on up prior to any sizing runs being done.
192
+ if enable_dst
193
+ start_date = '2nd Sunday in March'
194
+ end_date = '1st Sunday in November'
195
+
196
+ runperiodctrl_daylightsaving = model.getRunPeriodControlDaylightSavingTime
197
+ runperiodctrl_daylightsaving.setStartDate(start_date)
198
+ runperiodctrl_daylightsaving.setEndDate(end_date)
199
+ end
200
+
201
+ # add internal loads to space types
202
+ if add_space_type_loads
203
+
204
+ # remove internal loads
205
+ if remove_objects
206
+ model.getSpaceLoads.sort.each do |instance|
207
+ # most prototype building types model exterior elevators with name Elevator
208
+ next if instance.name.to_s.include?('Elevator')
209
+ next if instance.to_InternalMass.is_initialized
210
+ next if instance.to_WaterUseEquipment.is_initialized
211
+
212
+ instance.remove
213
+ end
214
+ model.getDesignSpecificationOutdoorAirs.each(&:remove)
215
+ model.getDefaultScheduleSets.each(&:remove)
216
+ end
217
+
218
+ model.getSpaceTypes.sort.each do |space_type|
219
+ # Don't add infiltration here; will be added later in the script
220
+ test = standard.space_type_apply_internal_loads(space_type, true, true, true, true, true, false)
221
+ if test == false
222
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CreateTypical', "Could not add loads for #{space_type.name}. Not expected for #{template}")
223
+ next
224
+ end
225
+
226
+ # apply internal load schedules
227
+ # the last bool test it to make thermostat schedules. They are now added in HVAC section instead of here
228
+ standard.space_type_apply_internal_load_schedules(space_type, true, true, true, true, true, true, false)
229
+
230
+ # extend space type name to include the template. Consider this as well for load defs
231
+ space_type.setName("#{space_type.name} - #{template}")
232
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', "Adding loads to space type named #{space_type.name}")
233
+ end
234
+
235
+ # warn if spaces in model without space type
236
+ spaces_without_space_types = []
237
+ model.getSpaces.sort.each do |space|
238
+ next if space.spaceType.is_initialized
239
+
240
+ spaces_without_space_types << space
241
+ end
242
+ if !spaces_without_space_types.empty?
243
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CreateTypical', "#{spaces_without_space_types.size} spaces do not have space types assigned, and wont' receive internal loads from standards space type lookups.")
244
+ end
245
+ end
246
+
247
+ # identify primary building type (used for construction, and ideally HVAC as well)
248
+ building_types = {}
249
+ model.getSpaceTypes.sort.each do |space_type|
250
+ # populate hash of building types
251
+ if space_type.standardsBuildingType.is_initialized
252
+ bldg_type = space_type.standardsBuildingType.get
253
+ if !building_types.key?(bldg_type)
254
+ building_types[bldg_type] = space_type.floorArea
255
+ else
256
+ building_types[bldg_type] += space_type.floorArea
257
+ end
258
+ else
259
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CreateTypical', "Can't identify building type for #{space_type.name}")
260
+ end
261
+ end
262
+ # @todo this fails if no space types, or maybe just no space types with standards
263
+ primary_bldg_type = building_types.key(building_types.values.max)
264
+ # Used for some lookups in the standards gem
265
+ lookup_building_type = standard.model_get_lookup_name(primary_bldg_type)
266
+ model.getBuilding.setStandardsBuildingType(primary_bldg_type)
267
+
268
+ # set FC factor constructions before adding other constructions
269
+ standard.model_set_below_grade_wall_constructions(model, lookup_building_type, climate_zone)
270
+ standard.model_set_floor_constructions(model, lookup_building_type, climate_zone)
271
+ if model.getFFactorGroundFloorConstructions.empty?
272
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', 'Unable to determine FC factor value to use. Using default ground construction instead.')
273
+ else
274
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', 'Set FC factor constructions for slab and below grade walls.')
275
+ end
276
+
277
+ # make construction set and apply to building
278
+ if add_constructions
279
+
280
+ # remove default construction sets
281
+ if remove_objects
282
+ model.getDefaultConstructionSets.each(&:remove)
283
+ end
284
+
285
+ if ['SmallHotel', 'LargeHotel', 'MidriseApartment', 'HighriseApartment'].include?(primary_bldg_type)
286
+ is_residential = 'Yes'
287
+ occ_type = 'Residential'
288
+ else
289
+ is_residential = 'No'
290
+ occ_type = 'Nonresidential'
291
+ end
292
+ bldg_def_const_set = standard.model_add_construction_set(model, climate_zone, lookup_building_type, nil, is_residential)
293
+ if bldg_def_const_set.is_initialized
294
+ bldg_def_const_set = bldg_def_const_set.get
295
+ if is_residential == 'Yes'
296
+ bldg_def_const_set.setName("Res #{bldg_def_const_set.name}")
297
+ end
298
+ model.getBuilding.setDefaultConstructionSet(bldg_def_const_set)
299
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', "Adding default construction set named #{bldg_def_const_set.name}")
300
+ else
301
+ OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.CreateTypical', "Could not create default construction set for the building type #{lookup_building_type} in climate zone #{climate_zone}.")
302
+ return false
303
+ end
304
+
305
+ # Replace the construction of exterior walls with user-specified wall construction type
306
+ unless wall_construction_type == 'Inferred'
307
+ # Check that a default exterior construction set is defined
308
+ if bldg_def_const_set.defaultExteriorSurfaceConstructions.empty?
309
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', 'Default construction set has no default exterior surface constructions.')
310
+ return false
311
+ end
312
+ ext_surf_consts = bldg_def_const_set.defaultExteriorSurfaceConstructions.get
313
+
314
+ # Check that a default exterior wall is defined
315
+ if ext_surf_consts.wallConstruction.empty?
316
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', 'Default construction set has no default exterior wall construction.')
317
+ return false
318
+ end
319
+ old_construction = ext_surf_consts.wallConstruction.get
320
+ standards_info = old_construction.standardsInformation
321
+
322
+ # Get the old wall construction type
323
+ if standards_info.standardsConstructionType.empty?
324
+ old_wall_construction_type = 'Not defined'
325
+ else
326
+ old_wall_construction_type = standards_info.standardsConstructionType.get
327
+ end
328
+
329
+ # Modify the default wall construction if different from measure input
330
+ if old_wall_construction_type == wall_construction_type
331
+ # Don't modify if the default matches the user-specified wall construction type
332
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', "Exterior wall construction type #{wall_construction_type} is the default for this building type.")
333
+ else
334
+ climate_zone_set = standard.model_find_climate_zone_set(model, climate_zone)
335
+ new_construction = standard.model_find_and_add_construction(model,
336
+ climate_zone_set,
337
+ 'ExteriorWall',
338
+ wall_construction_type,
339
+ occ_type)
340
+ ext_surf_consts.setWallConstruction(new_construction)
341
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', "Set exterior wall construction to #{new_construction.name}, replacing building type default #{old_construction.name}.")
342
+ end
343
+ end
344
+
345
+ # Replace the construction of any outdoor-facing "AtticFloor" surfaces
346
+ # with the "ExteriorRoof" - "IEAD" construction for the specific climate zone and template.
347
+ # This prevents creation of buildings where the DOE Prototype building construction set
348
+ # assumes an attic but the supplied geometry used does not have an attic.
349
+ new_construction = nil
350
+ climate_zone_set = standard.model_find_climate_zone_set(model, climate_zone)
351
+ model.getSurfaces.sort.each do |surf|
352
+ next unless surf.outsideBoundaryCondition == 'Outdoors'
353
+ next unless surf.surfaceType == 'RoofCeiling'
354
+ next if surf.construction.empty?
355
+
356
+ construction = surf.construction.get
357
+ standards_info = construction.standardsInformation
358
+ next if standards_info.intendedSurfaceType.empty?
359
+ next unless standards_info.intendedSurfaceType.get == 'AtticFloor'
360
+
361
+ if new_construction.nil?
362
+ new_construction = standard.model_find_and_add_construction(model,
363
+ climate_zone_set,
364
+ 'ExteriorRoof',
365
+ 'IEAD',
366
+ occ_type)
367
+ end
368
+ surf.setConstruction(new_construction)
369
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', "Changed the construction for #{surf.name} from #{construction.name} to #{new_construction.name} to avoid outdoor-facing attic floor constructions in buildings with no attic space.")
370
+ end
371
+
372
+ # address any adiabatic surfaces that don't have hard assigned constructions
373
+ model.getSurfaces.sort.each do |surface|
374
+ next if surface.outsideBoundaryCondition != 'Adiabatic'
375
+ next if surface.construction.is_initialized
376
+
377
+ surface.setAdjacentSurface(surface)
378
+ surface.setConstruction(surface.construction.get)
379
+ surface.setOutsideBoundaryCondition('Adiabatic')
380
+ end
381
+
382
+ # modify the infiltration rates
383
+ if remove_objects
384
+ model.getSpaceInfiltrationDesignFlowRates.each(&:remove)
385
+ end
386
+ standard.model_apply_infiltration_standard(model)
387
+ standard.model_modify_infiltration_coefficients(model, primary_bldg_type, climate_zone)
388
+
389
+ # set ground temperatures from DOE prototype buildings
390
+ standard.model_add_ground_temperatures(model, primary_bldg_type, climate_zone)
391
+ end
392
+
393
+ # add elevators (returns ElectricEquipment object)
394
+ if add_elevators
395
+
396
+ # remove elevators as spaceLoads or exteriorLights
397
+ model.getSpaceLoads.sort.each do |instance|
398
+ next if !instance.name.to_s.include?('Elevator') # most prototype building types model exterior elevators with name Elevator
399
+
400
+ instance.remove
401
+ end
402
+ model.getExteriorLightss.sort.each do |ext_light|
403
+ next if !ext_light.name.to_s.include?('Fuel equipment') # some prototype building types model exterior elevators by this name
404
+
405
+ ext_light.remove
406
+ end
407
+
408
+ elevators = standard.model_add_elevators(model)
409
+ if elevators.nil?
410
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', 'No elevators added to the building.')
411
+ else
412
+ elevator_def = elevators.electricEquipmentDefinition
413
+ design_level = elevator_def.designLevel.get
414
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', "Adding #{elevators.multiplier.round(1)} elevators each with power of #{OpenStudio.toNeatString(design_level, 0, true)} (W), plus lights and fans.")
415
+ elevator_def.setFractionLatent(0.0)
416
+ elevator_def.setFractionRadiant(0.0)
417
+ elevator_def.setFractionLost(1.0)
418
+ end
419
+ end
420
+
421
+ # add exterior lights (returns a hash where key is lighting type and value is exteriorLights object)
422
+ if add_exterior_lights
423
+
424
+ if remove_objects
425
+ model.getExteriorLightss.sort.each do |ext_light|
426
+ next if ext_light.name.to_s.include?('Fuel equipment') # some prototype building types model exterior elevators by this name
427
+
428
+ ext_light.remove
429
+ end
430
+ end
431
+
432
+ exterior_lights = standard.model_add_typical_exterior_lights(model, exterior_lighting_zone.chars[0].to_i, onsite_parking_fraction)
433
+ exterior_lights.each do |k, v|
434
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', "Adding Exterior Lights named #{v.exteriorLightsDefinition.name} with design level of #{v.exteriorLightsDefinition.designLevel} * #{OpenStudio.toNeatString(v.multiplier, 0, true)}.")
435
+ end
436
+ end
437
+
438
+ # add_exhaust
439
+ if add_exhaust
440
+
441
+ # remove exhaust objects
442
+ if remove_objects
443
+ model.getFanZoneExhausts.each(&:remove)
444
+ end
445
+
446
+ zone_exhaust_fans = standard.model_add_exhaust(model, kitchen_makeup) # second argument is strategy for finding makeup zones for exhaust zones
447
+ zone_exhaust_fans.each do |k, v|
448
+ max_flow_rate_ip = OpenStudio.convert(k.maximumFlowRate.get, 'm^3/s', 'cfm').get
449
+ if v.key?(:zone_mixing)
450
+ zone_mixing = v[:zone_mixing]
451
+ mixing_source_zone_name = zone_mixing.sourceZone.get.name
452
+ mixing_design_flow_rate_ip = OpenStudio.convert(zone_mixing.designFlowRate.get, 'm^3/s', 'cfm').get
453
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', "Adding #{OpenStudio.toNeatString(max_flow_rate_ip, 0, true)} (cfm) of exhaust to #{k.thermalZone.get.name}, with #{OpenStudio.toNeatString(mixing_design_flow_rate_ip, 0, true)} (cfm) of makeup air from #{mixing_source_zone_name}")
454
+ else
455
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', "Adding #{OpenStudio.toNeatString(max_flow_rate_ip, 0, true)} (cfm) of exhaust to #{k.thermalZone.get.name}")
456
+ end
457
+ end
458
+ end
459
+
460
+ # add service water heating demand and supply
461
+ if add_swh
462
+
463
+ # remove water use equipment and water use connections
464
+ if remove_objects
465
+ # @todo remove plant loops used for service water heating
466
+ model.getWaterUseEquipments.each(&:remove)
467
+ model.getWaterUseConnectionss.each(&:remove)
468
+ end
469
+
470
+ # Infer the SWH type
471
+ if service_water_heating_fuel == 'Inferred'
472
+ if heating_fuel == 'NaturalGas' || heating_fuel.include?('DistrictHeating')
473
+ # If building has gas service, probably uses natural gas for SWH
474
+ service_water_heating_fuel = 'NaturalGas'
475
+ elsif heating_fuel == 'Electricity'
476
+ # If building is doing space heating with electricity, probably used for SWH
477
+ service_water_heating_fuel = 'Electricity'
478
+ elsif heating_fuel == 'DistrictAmbient'
479
+ # If building has district ambient loop, it is fancy and probably uses HPs for SWH
480
+ service_water_heating_fuel = 'HeatPump'
481
+ else
482
+ # Use inferences built into OpenStudio Standards for each building and space type
483
+ service_water_heating_fuel = nil
484
+ end
485
+ end
486
+
487
+ typical_swh = standard.model_add_typical_swh(model, water_heater_fuel: service_water_heating_fuel)
488
+ midrise_swh_loops = []
489
+ stripmall_swh_loops = []
490
+ typical_swh.each do |loop|
491
+ if loop.name.get.include?('MidriseApartment')
492
+ midrise_swh_loops << loop
493
+ elsif loop.name.get.include?('RetailStripmall')
494
+ stripmall_swh_loops << loop
495
+ else
496
+ water_use_connections = []
497
+ loop.demandComponents.each do |component|
498
+ next if !component.to_WaterUseConnections.is_initialized
499
+
500
+ water_use_connections << component
501
+ end
502
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', "Adding #{loop.name} to the building. It has #{water_use_connections.size} water use connections.")
503
+ end
504
+ end
505
+ if !midrise_swh_loops.empty?
506
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', "Adding #{midrise_swh_loops.size} MidriseApartment service water heating loops.")
507
+ end
508
+ if !stripmall_swh_loops.empty?
509
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', "Adding #{stripmall_swh_loops.size} RetailStripmall service water heating loops.")
510
+ end
511
+ end
512
+
513
+ # add_daylighting_controls
514
+ if add_daylighting_controls
515
+ # remove add_daylighting_controls objects
516
+ if remove_objects
517
+ model.getDaylightingControls.each(&:remove)
518
+ end
519
+
520
+ # add daylight controls, need to perform a sizing run for 2010
521
+ if template == '90.1-2010' || template == 'ComStock 90.1-2010'
522
+ if standard.model_run_sizing_run(model, "#{Dir.pwd}/create_typical_building_from_model_SR0") == false
523
+ return false
524
+ end
525
+ end
526
+ standard.model_add_daylighting_controls(model)
527
+ end
528
+
529
+ # add refrigeration
530
+ if add_refrigeration
531
+
532
+ # remove refrigeration equipment
533
+ if remove_objects
534
+ model.getRefrigerationSystems.each(&:remove)
535
+ end
536
+
537
+ # Add refrigerated cases and walkins
538
+ standard.model_add_typical_refrigeration(model, primary_bldg_type)
539
+ end
540
+
541
+ # @todo add slab modeling and slab insulation
542
+ # @todo fuel customization for cooking and laundry
543
+ # works by switching some fraction of electric loads to gas if requested (assuming base load is electric)
544
+
545
+ # add thermostats
546
+ if add_thermostat
547
+
548
+ # remove thermostats
549
+ if remove_objects
550
+ model.getThermostatSetpointDualSetpoints.each(&:remove)
551
+ end
552
+
553
+ model.getSpaceTypes.sort.each do |space_type|
554
+ # create thermostat schedules
555
+ # skip un-recognized space types
556
+ next if standard.space_type_get_standards_data(space_type).empty?
557
+
558
+ # the last bool test it to make thermostat schedules. They are added to the model but not assigned
559
+ standard.space_type_apply_internal_load_schedules(space_type, false, false, false, false, false, false, true)
560
+
561
+ # identify thermal thermostat and apply to zones (apply_internal_load_schedules names )
562
+ model.getThermostatSetpointDualSetpoints.sort.each do |thermostat|
563
+ next if thermostat.name.to_s != "#{space_type.name} Thermostat"
564
+ next if !thermostat.coolingSetpointTemperatureSchedule.is_initialized
565
+ next if !thermostat.heatingSetpointTemperatureSchedule.is_initialized
566
+
567
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', "Assigning #{thermostat.name} to thermal zones with #{space_type.name} assigned.")
568
+ space_type.spaces.sort.each do |space|
569
+ next if !space.thermalZone.is_initialized
570
+
571
+ space.thermalZone.get.setThermostatSetpointDualSetpoint(thermostat)
572
+ end
573
+ end
574
+ end
575
+ end
576
+
577
+ # add internal mass
578
+ if add_internal_mass
579
+
580
+ if remove_objects
581
+ model.getSpaceLoads.sort.each do |instance|
582
+ next unless instance.to_InternalMass.is_initialized
583
+
584
+ instance.remove
585
+ end
586
+ end
587
+
588
+ # add internal mass to conditioned spaces; needs to happen after thermostats are applied
589
+ standard.model_add_internal_mass(model, primary_bldg_type)
590
+ end
591
+
592
+ # add hvac system
593
+ if add_hvac
594
+
595
+ # remove HVAC objects
596
+ if remove_objects
597
+ standard.model_remove_prm_hvac(model)
598
+ end
599
+
600
+ case hvac_system_type
601
+ when 'Inferred'
602
+
603
+ # Get the hvac delivery type enum
604
+ hvac_delivery = case hvac_delivery_type
605
+ when 'Forced Air'
606
+ 'air'
607
+ when 'Hydronic'
608
+ 'hydronic'
609
+ end
610
+
611
+ # Group the zones by occupancy type. Only split out non-dominant groups if their total area exceeds the limit.
612
+ sys_groups = standard.model_group_zones_by_type(model, OpenStudio.convert(20_000, 'ft^2', 'm^2').get)
613
+
614
+ # For each group, infer the HVAC system type.
615
+ sys_groups.each do |sys_group|
616
+ # Infer the primary system type
617
+ sys_type, central_htg_fuel, zone_htg_fuel, clg_fuel = standard.model_typical_hvac_system_type(model,
618
+ climate_zone,
619
+ sys_group['type'],
620
+ hvac_delivery,
621
+ heating_fuel,
622
+ cooling_fuel,
623
+ OpenStudio.convert(sys_group['area_ft2'], 'ft^2', 'm^2').get,
624
+ sys_group['stories'])
625
+
626
+ # Infer the secondary system type for multizone systems
627
+ sec_sys_type = case sys_type
628
+ when 'PVAV Reheat', 'VAV Reheat'
629
+ 'PSZ-AC'
630
+ when 'PVAV PFP Boxes', 'VAV PFP Boxes'
631
+ 'PSZ-HP'
632
+ else
633
+ sys_type # same as primary system type
634
+ end
635
+
636
+ # group zones
637
+ story_zone_lists = standard.model_group_zones_by_story(model, sys_group['zones'])
638
+
639
+ # On each story, add the primary system to the primary zones
640
+ # and add the secondary system to any zones that are different.
641
+ story_zone_lists.each do |story_group|
642
+ # Differentiate primary and secondary zones, based on
643
+ # operating hours and internal loads (same as 90.1 PRM)
644
+ pri_sec_zone_lists = standard.model_differentiate_primary_secondary_thermal_zones(model, story_group)
645
+ system_zones = pri_sec_zone_lists['primary']
646
+
647
+ # if the primary system type is PTAC, filter to cooled zones to prevent sizing error if no cooling
648
+ if sys_type == 'PTAC'
649
+ heated_and_cooled_zones = system_zones.select { |zone| standard.thermal_zone_heated?(zone) && standard.thermal_zone_cooled?(zone) }
650
+ cooled_only_zones = system_zones.select { |zone| !standard.thermal_zone_heated?(zone) && standard.thermal_zone_cooled?(zone) }
651
+ system_zones = heated_and_cooled_zones + cooled_only_zones
652
+ end
653
+
654
+ # Add the primary system to the primary zones
655
+ unless standard.model_add_hvac_system(model, sys_type, central_htg_fuel, zone_htg_fuel, clg_fuel, system_zones)
656
+ OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.CreateTypical', "HVAC system type '#{sys_type}' not recognized. Check input system type argument against Model.hvac.rb for valid hvac system type names.")
657
+ return false
658
+ end
659
+
660
+ # Add the secondary system to the secondary zones (if any)
661
+ if !pri_sec_zone_lists['secondary'].empty?
662
+ system_zones = pri_sec_zone_lists['secondary']
663
+ if (sec_sys_type == 'PTAC') || (sec_sys_type == 'PSZ-AC')
664
+ heated_and_cooled_zones = system_zones.select { |zone| standard.thermal_zone_heated?(zone) && standard.thermal_zone_cooled?(zone) }
665
+ cooled_only_zones = system_zones.select { |zone| !standard.thermal_zone_heated?(zone) && standard.thermal_zone_cooled?(zone) }
666
+ system_zones = heated_and_cooled_zones + cooled_only_zones
667
+ end
668
+ unless standard.model_add_hvac_system(model, sec_sys_type, central_htg_fuel, zone_htg_fuel, clg_fuel, system_zones)
669
+ OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.CreateTypical', "HVAC system type '#{sys_type}' not recognized. Check input system type argument against Model.hvac.rb for valid hvac system type names.")
670
+ return false
671
+ end
672
+ end
673
+ end
674
+ end
675
+
676
+ else
677
+ # HVAC system_type specified
678
+ # Group the zones by occupancy type. Only split out non-dominant groups if their total area exceeds the limit.
679
+ sys_groups = standard.model_group_zones_by_type(model, OpenStudio.convert(20_000, 'ft^2', 'm^2').get)
680
+ sys_groups.each do |sys_group|
681
+ # group zones
682
+ story_zone_groups = standard.model_group_zones_by_story(model, sys_group['zones'])
683
+
684
+ # Add the user specified HVAC system for each story.
685
+ # Single-zone systems will get one per zone.
686
+ story_zone_groups.each do |zones|
687
+ unless OpenstudioStandards::HVAC.add_cbecs_hvac_system(model, standard, hvac_system_type, zones)
688
+ OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.CreateTypical', "HVAC system type '#{hvac_system_type}' not recognized. Check input system type argument against cbecs_hvac.rb in the HVAC module for valid HVAC system type names.")
689
+ return false
690
+ end
691
+ end
692
+ end
693
+ end
694
+ end
695
+
696
+ # hours of operation
697
+ if modify_wkdy_op_hrs || modify_wknd_op_hrs
698
+ # Infer the current hours of operation schedule for the building
699
+ op_sch = standard.model_infer_hours_of_operation_building(model)
700
+
701
+ # Convert existing schedules in the model to parametric schedules based on current hours of operation
702
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', "Generating parametric schedules from ruleset schedules using #{hoo_var_method} variable method for hours of operation formula.")
703
+ standard.model_setup_parametric_schedules(model, hoo_var_method: hoo_var_method)
704
+
705
+ # Create start and end times from start time and duration supplied
706
+ wkdy_start_time = nil
707
+ wkdy_end_time = nil
708
+ wknd_start_time = nil
709
+ wknd_end_time = nil
710
+ # weekdays
711
+ if modify_wkdy_op_hrs
712
+ wkdy_start_time = OpenStudio::Time.new(0, wkdy_op_hrs_start_time_hr, wkdy_op_hrs_start_time_min, 0)
713
+ wkdy_end_time = wkdy_start_time + OpenStudio::Time.new(0, wkdy_op_hrs_duration_hr, wkdy_op_hrs_duration_min, 0)
714
+ end
715
+ # weekends
716
+ if modify_wknd_op_hrs
717
+ wknd_start_time = OpenStudio::Time.new(0, wknd_op_hrs_start_time_hr, wknd_op_hrs_start_time_min, 0)
718
+ wknd_end_time = wknd_start_time + OpenStudio::Time.new(0, wknd_op_hrs_duration_hr, wknd_op_hrs_duration_min, 0)
719
+ end
720
+
721
+ # Modify hours of operation, using weekdays values for all weekdays and weekend values for Saturday and Sunday
722
+ standard.schedule_ruleset_set_hours_of_operation(op_sch,
723
+ wkdy_start_time: wkdy_start_time,
724
+ wkdy_end_time: wkdy_end_time,
725
+ sat_start_time: wknd_start_time,
726
+ sat_end_time: wknd_end_time,
727
+ sun_start_time: wknd_start_time,
728
+ sun_end_time: wknd_end_time)
729
+
730
+ # Apply new operating hours to parametric schedules to make schedules in model reflect modified hours of operation
731
+ parametric_schedules = standard.model_apply_parametric_schedules(model, error_on_out_of_order: false)
732
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', "Updated #{parametric_schedules.size} schedules with new hours of operation.")
733
+ end
734
+
735
+ # set hvac controls and efficiencies (this should be last model articulation element)
736
+ if add_hvac
737
+ # set additional properties for building
738
+ props = model.getBuilding.additionalProperties
739
+ props.setFeature('hvac_system_type', hvac_system_type)
740
+
741
+ case hvac_system_type
742
+ when 'Ideal Air Loads'
743
+
744
+ else
745
+ # Set the heating and cooling sizing parameters
746
+ standard.model_apply_prm_sizing_parameters(model)
747
+
748
+ # Perform a sizing run
749
+ if standard.model_run_sizing_run(model, "#{Dir.pwd}/create_typical_building_from_model_SR1") == false
750
+ return false
751
+ end
752
+
753
+ # If there are any multizone systems, reset damper positions
754
+ # to achieve a 60% ventilation effectiveness minimum for the system
755
+ # following the ventilation rate procedure from 62.1
756
+ standard.model_apply_multizone_vav_outdoor_air_sizing(model)
757
+
758
+ # Apply the prototype HVAC assumptions
759
+ standard.model_apply_prototype_hvac_assumptions(model, primary_bldg_type, climate_zone)
760
+
761
+ # Apply the HVAC efficiency standard
762
+ standard.model_apply_hvac_efficiency_standard(model, climate_zone)
763
+ end
764
+ end
765
+
766
+ # set unmet hours tolerance
767
+ unmet_hrs_tol_k = OpenStudio.convert(unmet_hours_tolerance_r, 'R', 'K').get
768
+ tolerances = model.getOutputControlReportingTolerances
769
+ tolerances.setToleranceforTimeHeatingSetpointNotMet(unmet_hrs_tol_k)
770
+ tolerances.setToleranceforTimeCoolingSetpointNotMet(unmet_hrs_tol_k)
771
+
772
+ # remove everything but spaces, zones, and stub space types (extend as needed for additional objects, may make bool arg for this)
773
+ if remove_objects
774
+ model.purgeUnusedResourceObjects
775
+ objects_after_cleanup = initial_object_size - model.getModelObjects.size
776
+ if objects_after_cleanup > 0
777
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', "Removing #{objects_after_cleanup} objects from model")
778
+ end
779
+ end
780
+
781
+ # change night cycling control to "Thermostat" cycling and increase thermostat tolerance to 1.99999
782
+ manager_night_cycles = model.getAvailabilityManagerNightCycles
783
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', "Changing thermostat tollerance to 1.99999 for #{manager_night_cycles.size} night cycle manager objects.")
784
+ manager_night_cycles.each do |night_cycle|
785
+ night_cycle.setThermostatTolerance(1.9999)
786
+ night_cycle.setCyclingRunTimeControlType('Thermostat')
787
+ end
788
+
789
+ # disable HVAC Sizing Simulation for Sizing Periods, not used for the type of PlantLoop sizing used in ComStock
790
+ if model.version >= OpenStudio::VersionString.new('3.0.0')
791
+ sim_control = model.getSimulationControl
792
+ sim_control.setDoHVACSizingSimulationforSizingPeriodsNoFail(false)
793
+ end
794
+
795
+ # report final condition of model
796
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', "The building finished with #{model.getModelObjects.size} objects.")
797
+
798
+ return true
799
+ end
800
+
801
+ # creates spaces types and construction objects in the model for the given
802
+ # building type, template, and climate zone
803
+ #
804
+ # @param building_type [String] standard building type
805
+ # @param template [String] standard template
806
+ # @param climate_zone [String] ASHRAE climate zone, e.g. 'ASHRAE 169-2013-4A'
807
+ # @param create_space_types [Boolean] Create space types
808
+ # @param create_construction_set [Boolean] Create the construction set
809
+ # @param set_building_defaults [Boolean] Set the climate zone, newly generated construction set,
810
+ # and first newly generated space type as the building default
811
+ # @return [Boolean] returns true if successful, false if not
812
+ def self.create_space_types_and_constructions(model,
813
+ building_type,
814
+ template,
815
+ climate_zone,
816
+ create_space_types: true,
817
+ create_construction_set: true,
818
+ set_building_defaults: true)
819
+ # reporting initial condition of model
820
+ starting_space_types = model.getSpaceTypes.sort
821
+ starting_construction_sets = model.getDefaultConstructionSets.sort
822
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', "The building started with #{starting_space_types.size} space types and #{starting_construction_sets.size} construction sets.")
823
+
824
+ # lookup space types for specified building type (false indicates not to use whole building type only)
825
+ space_type_hash = OpenstudioStandards::CreateTypical.get_space_types_from_building_type(building_type, template: template, whole_building: false)
826
+ if space_type_hash == false
827
+ OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.CreateTypical', "#{building_type} is an unexpected building type.")
828
+ return false
829
+ end
830
+
831
+ # create space_type_map from array
832
+ space_type_map = {}
833
+ default_space_type_name = nil
834
+ space_type_hash.each do |space_type_name, hash|
835
+ # skip space types like undeveloped and basement
836
+ next if hash[:space_type_gen] == false
837
+
838
+ # no spaces to pass in
839
+ space_type_map[space_type_name] = []
840
+ if hash[:default]
841
+ default_space_type_name = space_type_name
842
+ end
843
+ end
844
+
845
+ # Make the standard applier
846
+ standard = Standard.build(template)
847
+
848
+ # mapping building_type name is needed for a few methods
849
+ lookup_building_type = standard.model_get_lookup_name(building_type)
850
+
851
+ # remap small medium and large office to office
852
+ if building_type.include?('Office')
853
+ building_type = 'Office'
854
+ end
855
+
856
+ # get array of new space types
857
+ space_types_new = []
858
+
859
+ # create_space_types
860
+ if create_space_types
861
+
862
+ # array of starting space types
863
+ space_types_starting = model.getSpaceTypes.sort
864
+
865
+ # create stub space types
866
+ space_type_hash.each do |space_type_name, hash|
867
+ # skip space types like undeveloped and basement
868
+ next if hash[:space_type_gen] == false
869
+
870
+ # create space type
871
+ space_type = OpenStudio::Model::SpaceType.new(model)
872
+ space_type.setStandardsBuildingType(lookup_building_type)
873
+ space_type.setStandardsSpaceType(space_type_name)
874
+ space_type.setName("#{lookup_building_type} #{space_type_name}")
875
+
876
+ # add to array of new space types
877
+ space_types_new << space_type
878
+
879
+ # add internal loads (the nil check isn't necessary, but I will keep it in as a warning instad of an error)
880
+ test = standard.space_type_apply_internal_loads(space_type, true, true, true, true, true, true)
881
+ if test.nil?
882
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CreateTypical', "Could not add loads for #{space_type.name}. Not expected for #{template} #{lookup_building_type}")
883
+ end
884
+
885
+ # the last bool test it to make thermostat schedules. They are added to the model but not assigned
886
+ standard.space_type_apply_internal_load_schedules(space_type, true, true, true, true, true, true, true)
887
+
888
+ # assign colors
889
+ standard.space_type_apply_rendering_color(space_type)
890
+
891
+ # exend space type name to include the template. Consider this as well for load defs
892
+ space_type.setName("#{space_type.name} - #{template}")
893
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', "Added space type named #{space_type.name}")
894
+ end
895
+
896
+ end
897
+
898
+ # add construction sets
899
+ bldg_def_const_set = nil
900
+ if create_construction_set
901
+
902
+ # Make the default construction set for the building
903
+ is_residential = 'No' # default is nonresidential for building level
904
+ bldg_def_const_set = standard.model_add_construction_set(model, climate_zone, lookup_building_type, nil, is_residential)
905
+ if bldg_def_const_set.is_initialized
906
+ bldg_def_const_set = bldg_def_const_set.get
907
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', "Added default construction set named #{bldg_def_const_set.name}")
908
+ else
909
+ OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.CreateTypical', 'Could not create default construction set for the building.')
910
+ return false
911
+ end
912
+
913
+ # make residential construction set as unused resource
914
+ if ['SmallHotel', 'LargeHotel', 'MidriseApartment', 'HighriseApartment'].include?(building_type)
915
+ res_const_set = standard.model_add_construction_set(model, climate_zone, lookup_building_type, nil, 'Yes')
916
+ if res_const_set.is_initialized
917
+ res_const_set = res_const_set.get
918
+ res_const_set.setName("#{bldg_def_const_set.name} - Residential ")
919
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', "Added residential construction set named #{res_const_set.name}")
920
+ else
921
+ OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.CreateTypical', 'Could not create residential construction set for the building.')
922
+ return false
923
+ end
924
+ end
925
+
926
+ end
927
+
928
+ # set_building_defaults
929
+ if set_building_defaults
930
+
931
+ # identify default space type
932
+ default_space_type = nil
933
+ space_types_new.each do |space_type|
934
+ standards_building_type = space_type.standardsBuildingType.is_initialized ? space_type.standardsBuildingType.get : nil
935
+ standards_space_type = space_type.standardsSpaceType.is_initialized ? space_type.standardsSpaceType.get : nil
936
+ if default_space_type_name == standards_space_type
937
+ default_space_type = space_type
938
+ end
939
+ end
940
+
941
+ # set default space type
942
+ building = model.getBuilding
943
+ if !default_space_type.nil?
944
+ building.setSpaceType(default_space_type)
945
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', "Setting default Space Type for building to #{building.spaceType.get.name}")
946
+ end
947
+
948
+ # default construction
949
+ if !bldg_def_const_set.nil?
950
+ building.setDefaultConstructionSet(bldg_def_const_set)
951
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', "Setting default Construction Set for building to #{building.defaultConstructionSet.get.name}")
952
+ end
953
+
954
+ # set climate zone
955
+ os_climate_zone = climate_zone.gsub('ASHRAE 169-2013-', '')
956
+ # trim off letter from climate zone 7 or 8
957
+ if (os_climate_zone[0] == '7') || (os_climate_zone[0] == '8')
958
+ os_climate_zone = os_climate_zone[0]
959
+ end
960
+ climate_zone = model.getClimateZones.setClimateZone('ASHRAE', os_climate_zone)
961
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', "Setting #{climate_zone.institution} Climate Zone to #{climate_zone.value}")
962
+
963
+ # set building type
964
+ # use lookup_building_type so spaces like MediumOffice will map to Office (Supports baseline automation)
965
+ building.setStandardsBuildingType(lookup_building_type)
966
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', "Setting Standards Building Type to #{building.standardsBuildingType}")
967
+
968
+ # rename building if it is named "Building 1"
969
+ if model.getBuilding.name.to_s == 'Building 1'
970
+ model.getBuilding.setName("#{building_type} #{template} #{os_climate_zone}")
971
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', "Renaming building to #{model.getBuilding.name}")
972
+ end
973
+ end
974
+
975
+ # reporting final condition of model
976
+ finishing_space_types = model.getSpaceTypes.sort
977
+ finishing_construction_sets = model.getDefaultConstructionSets.sort
978
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', "The building finished with #{finishing_space_types.size} space types and #{finishing_construction_sets.size} construction sets.")
979
+
980
+ return true
981
+ end
982
+ end
983
+ end