openstudio-standards 0.4.0 → 0.5.0.rc1

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