openstudio-standards 0.2.14 → 0.2.15.pre.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 (642) hide show
  1. checksums.yaml +4 -4
  2. data/data/geometry/ASHRAECollege.json +0 -19
  3. data/data/geometry/ASHRAEMidriseApartment.json +47 -47
  4. data/data/geometry/ASHRAESecondarySchool.osm +2 -2
  5. data/data/standards/OpenStudio_Standards-ashrae_90_1.xlsx +0 -0
  6. data/data/standards/export_OpenStudio_libraries.rb +1 -1
  7. data/data/standards/manage_OpenStudio_Standards.rb +43 -87
  8. data/data/standards/metadata_units_OpenStudio_Standards-ashrae_90_1.csv +9 -0
  9. data/data/standards/openstudio_standards_duplicates_log.csv +142 -27
  10. data/data/standards/test_performance_expected_dd_results.csv +2016 -2016
  11. data/data/weather/CAN_NU_Iqaluit.AP.719090_CWEC2016.ddy +2316 -0
  12. data/data/weather/CAN_NU_Iqaluit.AP.719090_CWEC2016.epw +8768 -0
  13. data/data/weather/CAN_NU_Iqaluit.AP.719090_CWEC2016.stat +697 -0
  14. data/lib/openstudio-standards/btap/WeatherData1.json +54 -0
  15. data/lib/openstudio-standards/btap/WeatherData1.xlsx +0 -0
  16. data/lib/openstudio-standards/btap/btap_result.rb +12 -10
  17. data/lib/openstudio-standards/btap/envelope.rb +2 -2
  18. data/lib/openstudio-standards/btap/geometry.rb +96 -49
  19. data/lib/openstudio-standards/{utilities → btap/utilities}/Add_template_field_to_json.rb +0 -0
  20. data/lib/openstudio-standards/{utilities → btap/utilities}/convert_surfaces_to_adiabatic_necb_8426.rb +0 -0
  21. data/lib/openstudio-standards/{utilities → btap/utilities}/generate_space_types.rb +0 -0
  22. data/lib/openstudio-standards/{utilities → btap/utilities}/necb_to_epw_map.rb +0 -0
  23. data/lib/openstudio-standards/{utilities → btap/utilities}/os_sim_extract.rb +0 -0
  24. data/lib/openstudio-standards/{utilities → btap/utilities}/rename_surfaces.rb +0 -0
  25. data/lib/openstudio-standards/{utilities → btap/utilities}/round_surf_coords.rb +0 -0
  26. data/lib/openstudio-standards/{utilities → btap/utilities}/sched_create.rb +0 -0
  27. data/lib/openstudio-standards/{utilities → btap/utilities}/set_mult_to_adiabatic.rb +0 -0
  28. data/lib/openstudio-standards/btap/utilities/space_type.rb +78 -0
  29. data/lib/openstudio-standards/{utilities → btap/utilities}/weatherData1_xlsx_to_json.rb +0 -0
  30. data/lib/openstudio-standards/hvac_sizing/Siz.AirConditionerVariableRefrigerantFlow.rb +1 -1
  31. data/lib/openstudio-standards/hvac_sizing/Siz.HVACComponent.rb +1 -1
  32. data/lib/openstudio-standards/hvac_sizing/Siz.HeatingCoolingFuels.rb +20 -6
  33. data/lib/openstudio-standards/hvac_sizing/Siz.Model.rb +6 -6
  34. data/lib/openstudio-standards/hvac_sizing/Siz.WaterHeaterMixed.rb +2 -2
  35. data/lib/openstudio-standards/hvac_sizing/Siz.ZoneHVACTerminalUnitVariableRefrigerantFlow.rb +1 -1
  36. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.AirTerminalSingleDuctVAVReheat.rb +2 -1
  37. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.PumpVariableSpeed.rb +6 -7
  38. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.AirTerminalSingleDuctVAVReheat.rb +2 -1
  39. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.FanConstantVolume.rb +5 -4
  40. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.FanOnOff.rb +5 -5
  41. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.FanVariableVolume.rb +5 -4
  42. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.PumpVariableSpeed.rb +6 -7
  43. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.AirTerminalSingleDuctVAVReheat.rb +2 -1
  44. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.FanConstantVolume.rb +5 -4
  45. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.FanOnOff.rb +5 -5
  46. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.FanVariableVolume.rb +5 -4
  47. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.Model.elevators.rb +6 -4
  48. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.Model.rb +10 -9
  49. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.PumpVariableSpeed.rb +9 -11
  50. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirTerminalSingleDuctVAVReheat.rb +2 -1
  51. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.FanConstantVolume.rb +5 -4
  52. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.FanOnOff.rb +5 -5
  53. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.FanVariableVolume.rb +5 -4
  54. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.Model.elevators.rb +11 -7
  55. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.Model.rb +17 -16
  56. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.PumpVariableSpeed.rb +9 -11
  57. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.hvac_systems.rb +4 -2
  58. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.AirTerminalSingleDuctVAVReheat.rb +2 -1
  59. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.FanConstantVolume.rb +5 -4
  60. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.FanOnOff.rb +5 -5
  61. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.FanVariableVolume.rb +5 -4
  62. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.Model.elevators.rb +11 -7
  63. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.Model.rb +23 -22
  64. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.PumpVariableSpeed.rb +9 -10
  65. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.hvac_systems.rb +4 -2
  66. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirTerminalSingleDuctVAVReheat.rb +2 -1
  67. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.FanConstantVolume.rb +5 -4
  68. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.FanOnOff.rb +5 -5
  69. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.FanVariableVolume.rb +5 -4
  70. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Model.elevators.rb +11 -7
  71. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Model.rb +23 -22
  72. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Pump.rb +89 -0
  73. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.PumpVariableSpeed.rb +9 -10
  74. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Space.rb +76 -0
  75. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.hvac_systems.rb +22 -2
  76. data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.AirTerminalSingleDuctVAVReheat.rb +2 -1
  77. data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.Model.elevators.rb +11 -11
  78. data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.refrigeration.rb +5 -4
  79. data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.AirTerminalSingleDuctVAVReheat.rb +2 -1
  80. data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.CoilHeatingGas.rb +5 -4
  81. data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.Model.elevators.rb +11 -11
  82. data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.refrigeration.rb +5 -4
  83. data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.AirTerminalSingleDuctVAVReheat.rb +2 -1
  84. data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.FanConstantVolume.rb +5 -4
  85. data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.FanOnOff.rb +5 -5
  86. data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.FanVariableVolume.rb +5 -4
  87. data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.HeatExchangerAirToAirSensibleAndLatent.rb +2 -0
  88. data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.Model.elevators.rb +11 -7
  89. data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.Model.rb +10 -10
  90. data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.hvac_systems.rb +4 -2
  91. data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirTerminalSingleDuctVAVReheat.rb +2 -1
  92. data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.FanConstantVolume.rb +5 -4
  93. data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.FanOnOff.rb +5 -5
  94. data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.FanVariableVolume.rb +5 -4
  95. data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.HeatExchangerAirToAirSensibleAndLatent.rb +2 -0
  96. data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.Model.elevators.rb +11 -7
  97. data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.Model.rb +10 -10
  98. data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.hvac_systems.rb +4 -2
  99. data/lib/openstudio-standards/prototypes/cbes/cbes.Model.elevators.rb +3 -6
  100. data/lib/openstudio-standards/prototypes/cbes/cbes.refrigeration.rb +5 -4
  101. data/lib/openstudio-standards/prototypes/cbes/cbes_t24_2008/cbes_t24_2008.FanConstantVolume.rb +5 -3
  102. data/lib/openstudio-standards/prototypes/cbes/cbes_t24_2008/cbes_t24_2008.FanOnOff.rb +5 -4
  103. data/lib/openstudio-standards/prototypes/cbes/cbes_t24_2008/cbes_t24_2008.FanVariableVolume.rb +5 -3
  104. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.College.rb +65 -30
  105. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Courthouse.rb +54 -23
  106. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.FullServiceRestaurant.rb +135 -147
  107. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.HighRiseApartment.rb +42 -7
  108. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Hospital.rb +85 -12
  109. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Laboratory.rb +42 -30
  110. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeDataCenterHighITE.rb +39 -8
  111. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeDataCenterLowITE.rb +39 -8
  112. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeHotel.rb +60 -12
  113. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeOffice.rb +33 -265
  114. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeOfficeDetailed.rb +41 -3
  115. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.MediumOffice.rb +69 -297
  116. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.MediumOfficeDetailed.rb +68 -25
  117. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.MidriseApartment.rb +88 -59
  118. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Outpatient.rb +88 -9
  119. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.PrimarySchool.rb +48 -10
  120. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.QuickServiceRestaurant.rb +130 -145
  121. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.RetailStandalone.rb +29 -101
  122. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.RetailStripmall.rb +24 -7
  123. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SecondarySchool.rb +48 -589
  124. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallDataCenterHighITE.rb +38 -7
  125. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallDataCenterLowITE.rb +38 -8
  126. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallHotel.rb +40 -7
  127. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallOffice.rb +85 -171
  128. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallOfficeDetailed.rb +87 -44
  129. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SuperMarket.rb +46 -5
  130. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SuperTallBuilding.rb +105 -17
  131. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.TallBuilding.rb +97 -15
  132. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Warehouse.rb +26 -167
  133. data/lib/openstudio-standards/prototypes/common/do_not_edit_metaclasses.rb +3828 -1131
  134. data/lib/openstudio-standards/prototypes/common/objects/Prototype.AirConditionerVariableRefrigerantFlow.rb +3 -0
  135. data/lib/openstudio-standards/prototypes/common/objects/Prototype.AirTerminalSingleDuctVAVReheat.rb +2 -1
  136. data/lib/openstudio-standards/prototypes/common/objects/Prototype.BoilerHotWater.rb +2 -0
  137. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CentralAirSourceHeatPump.rb +2 -0
  138. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingDXSingleSpeed.rb +4 -1
  139. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingDXTwoSpeed.rb +3 -0
  140. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingWater.rb +4 -1
  141. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingWaterToAirHeatPumpEquationFit.rb +3 -0
  142. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingDXSingleSpeed.rb +9 -0
  143. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingElectric.rb +3 -0
  144. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingGas.rb +9 -4
  145. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingWater.rb +4 -1
  146. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingWaterToAirHeatPumpEquationFit.rb +3 -0
  147. data/lib/openstudio-standards/prototypes/common/objects/Prototype.ControllerWaterCoil.rb +2 -2
  148. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoolingTower.rb +4 -1
  149. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Fan.rb +23 -2
  150. data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanConstantVolume.rb +29 -4
  151. data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanOnOff.rb +29 -5
  152. data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanVariableVolume.rb +43 -4
  153. data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanZoneExhaust.rb +22 -0
  154. data/lib/openstudio-standards/prototypes/common/objects/Prototype.HeatExchangerAirToAirSensibleAndLatent.rb +46 -3
  155. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.elevators.rb +27 -22
  156. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.exterior_lights.rb +15 -8
  157. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.hvac.rb +22 -4
  158. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.rb +429 -59
  159. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.swh.rb +18 -11
  160. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.transformers.rb +11 -2
  161. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Pump.rb +1 -0
  162. data/lib/openstudio-standards/prototypes/common/objects/Prototype.PumpVariableSpeed.rb +8 -10
  163. data/lib/openstudio-standards/prototypes/common/objects/Prototype.ServiceWaterHeating.rb +37 -28
  164. data/lib/openstudio-standards/prototypes/common/objects/Prototype.SizingSystem.rb +24 -6
  165. data/lib/openstudio-standards/prototypes/common/objects/Prototype.hvac_systems.rb +251 -65
  166. data/lib/openstudio-standards/prototypes/common/objects/Prototype.radiant_system_controls.rb +1 -1
  167. data/lib/openstudio-standards/prototypes/common/objects/Prototype.refrigeration.rb +46 -31
  168. data/lib/openstudio-standards/prototypes/common/objects/Prototype.utilities.rb +62 -10
  169. data/lib/openstudio-standards/prototypes/common/prototype_metaprogramming.rb +76 -33
  170. data/lib/openstudio-standards/prototypes/deer/deer.Model.rb +1 -1
  171. data/lib/openstudio-standards/standards/Standards.AirLoopHVAC.rb +445 -275
  172. data/lib/openstudio-standards/standards/Standards.AirTerminalSingleDuctParallelPIUReheat.rb +3 -3
  173. data/lib/openstudio-standards/standards/Standards.AirTerminalSingleDuctVAVReheat.rb +26 -21
  174. data/lib/openstudio-standards/standards/Standards.BoilerHotWater.rb +5 -2
  175. data/lib/openstudio-standards/standards/Standards.BuildingStory.rb +7 -9
  176. data/lib/openstudio-standards/standards/Standards.ChillerElectricEIR.rb +8 -2
  177. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXMultiSpeed.rb +10 -6
  178. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXSingleSpeed.rb +5 -1
  179. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXTwoSpeed.rb +6 -1
  180. data/lib/openstudio-standards/standards/Standards.CoilCoolingWaterToAirHeatPumpEquationFit.rb +45 -4
  181. data/lib/openstudio-standards/standards/Standards.CoilDX.rb +18 -8
  182. data/lib/openstudio-standards/standards/Standards.CoilHeatingDXMultiSpeed.rb +9 -7
  183. data/lib/openstudio-standards/standards/Standards.CoilHeatingDXSingleSpeed.rb +8 -4
  184. data/lib/openstudio-standards/standards/Standards.CoilHeatingGas.rb +86 -3
  185. data/lib/openstudio-standards/standards/Standards.CoilHeatingGasMultiStage.rb +5 -2
  186. data/lib/openstudio-standards/standards/Standards.CoilHeatingWaterToAirHeatPumpEquationFit.rb +6 -2
  187. data/lib/openstudio-standards/standards/Standards.Construction.rb +66 -35
  188. data/lib/openstudio-standards/standards/Standards.CoolingTower.rb +7 -7
  189. data/lib/openstudio-standards/standards/Standards.CoolingTowerSingleSpeed.rb +2 -2
  190. data/lib/openstudio-standards/standards/Standards.CoolingTowerTwoSpeed.rb +2 -1
  191. data/lib/openstudio-standards/standards/Standards.CoolingTowerVariableSpeed.rb +2 -1
  192. data/lib/openstudio-standards/standards/Standards.Fan.rb +53 -35
  193. data/lib/openstudio-standards/standards/Standards.FanVariableVolume.rb +22 -16
  194. data/lib/openstudio-standards/standards/Standards.FluidCooler.rb +2 -2
  195. data/lib/openstudio-standards/standards/Standards.HeaderedPumpsVariableSpeed.rb +4 -4
  196. data/lib/openstudio-standards/standards/Standards.HeatExchangerSensLat.rb +77 -19
  197. data/lib/openstudio-standards/standards/Standards.Model.rb +387 -245
  198. data/lib/openstudio-standards/standards/Standards.PlanarSurface.rb +13 -15
  199. data/lib/openstudio-standards/standards/Standards.PlantLoop.rb +94 -48
  200. data/lib/openstudio-standards/standards/Standards.Pump.rb +28 -20
  201. data/lib/openstudio-standards/standards/Standards.PumpVariableSpeed.rb +3 -4
  202. data/lib/openstudio-standards/standards/Standards.ScheduleCompact.rb +2 -1
  203. data/lib/openstudio-standards/standards/Standards.ScheduleConstant.rb +2 -0
  204. data/lib/openstudio-standards/standards/Standards.ScheduleRuleset.rb +34 -24
  205. data/lib/openstudio-standards/standards/Standards.Space.rb +179 -116
  206. data/lib/openstudio-standards/standards/Standards.SpaceType.rb +23 -12
  207. data/lib/openstudio-standards/standards/Standards.SubSurface.rb +55 -25
  208. data/lib/openstudio-standards/standards/Standards.Surface.rb +57 -32
  209. data/lib/openstudio-standards/standards/Standards.ThermalZone.rb +157 -107
  210. data/lib/openstudio-standards/standards/Standards.WaterHeaterMixed.rb +9 -6
  211. data/lib/openstudio-standards/standards/Standards.ZoneHVACComponent.rb +52 -1
  212. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1.Standards.FanVariableVolume.rb +2 -2
  213. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1.rb +4 -0
  214. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.AirLoopHVAC.rb +28 -18
  215. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.FanVariableVolume.rb +1 -1
  216. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.PlantLoop.rb +4 -2
  217. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.rb +4 -0
  218. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/comstock_ashrae_90_1_2004/comstock_ashrae_90_1_2004.rb +4 -0
  219. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/comstock_ashrae_90_1_2004/data/ashrae_90_1.schedules.json +696 -2938
  220. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/comstock_ashrae_90_1_2004/data/comstock_ashrae_90_1_2004.ext_ltg.json +1 -1
  221. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/comstock_ashrae_90_1_2004/data/comstock_ashrae_90_1_2004.spc_typ.json +123 -123
  222. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.furnaces.json +26 -0
  223. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.prototype_inputs.json +11 -11
  224. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.refrigeration_system.json +0 -8
  225. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.spc_typ.json +395 -384
  226. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.unitary_acs.json +69 -0
  227. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.AirLoopHVAC.rb +20 -13
  228. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.FanVariableVolume.rb +1 -1
  229. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.Model.rb +1 -1
  230. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.rb +4 -0
  231. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/comstock_ashrae_90_1_2007/comstock_ashrae_90_1_2007.rb +4 -0
  232. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/comstock_ashrae_90_1_2007/data/ashrae_90_1.schedules.json +696 -2938
  233. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/comstock_ashrae_90_1_2007/data/comstock_ashrae_90_1_2007.ext_ltg.json +1 -1
  234. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/comstock_ashrae_90_1_2007/data/comstock_ashrae_90_1_2007.spc_typ.json +122 -122
  235. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.furnaces.json +26 -0
  236. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.prototype_inputs.json +11 -11
  237. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.refrigeration_system.json +0 -8
  238. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.spc_typ.json +413 -401
  239. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.unitary_acs.json +69 -0
  240. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.AirLoopHVAC.rb +42 -53
  241. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.AirTerminalSingleDuctVAVReheat.rb +3 -2
  242. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.CoolingTower.rb +5 -8
  243. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.FanVariableVolume.rb +1 -1
  244. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.Space.rb +6 -4
  245. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.rb +4 -0
  246. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/comstock_ashrae_90_1_2010/comstock_ashrae_90_1_2010.rb +4 -0
  247. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/comstock_ashrae_90_1_2010/data/ashrae_90_1.schedules.json +696 -2938
  248. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/comstock_ashrae_90_1_2010/data/comstock_ashrae_90_1_2010.ext_ltg.json +1 -1
  249. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/comstock_ashrae_90_1_2010/data/comstock_ashrae_90_1_2010.spc_typ.json +129 -129
  250. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.energy_recovery.json +210 -42
  251. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.furnaces.json +26 -0
  252. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.prototype_inputs.json +11 -11
  253. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.refrigeration_system.json +0 -8
  254. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.spc_typ.json +460 -320
  255. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.unitary_acs.json +69 -0
  256. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirLoopHVAC.rb +45 -51
  257. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirTerminalSingleDuctVAVReheat.rb +3 -2
  258. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.CoolingTower.rb +5 -8
  259. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.CoolingTowerVariableSpeed.rb +2 -3
  260. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.FanVariableVolume.rb +2 -2
  261. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.Space.rb +8 -5
  262. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.ThermalZone.rb +2 -1
  263. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.WaterHeaterMixed.rb +1 -1
  264. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.ZoneHVACComponent.rb +1 -0
  265. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.rb +4 -0
  266. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/comstock_ashrae_90_1_2013/comstock_ashrae_90_1_2013.rb +4 -0
  267. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/comstock_ashrae_90_1_2013/data/ashrae_90_1.schedules.json +696 -2938
  268. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/comstock_ashrae_90_1_2013/data/comstock_ashrae_90_1_2013.ext_ltg.json +1 -1
  269. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/comstock_ashrae_90_1_2013/data/comstock_ashrae_90_1_2013.spc_typ.json +121 -121
  270. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.energy_recovery.json +420 -84
  271. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.furnaces.json +26 -0
  272. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.prototype_inputs.json +12 -12
  273. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.refrigeration_system.json +0 -8
  274. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.spc_typ.json +475 -335
  275. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.unitary_acs.json +69 -0
  276. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.AirLoopHVAC.rb +40 -50
  277. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.AirTerminalSingleDuctVAVReheat.rb +3 -2
  278. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.CoolingTower.rb +5 -8
  279. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.CoolingTowerVariableSpeed.rb +2 -3
  280. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.FanVariableVolume.rb +2 -2
  281. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.Space.rb +8 -5
  282. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.ThermalZone.rb +2 -1
  283. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.ZoneHVACComponent.rb +1 -0
  284. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.rb +4 -0
  285. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/comstock_ashrae_90_1_2016/comstock_ashrae_90_1_2016.rb +4 -0
  286. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/comstock_ashrae_90_1_2016/data/ashrae_90_1.schedules.json +696 -2938
  287. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/comstock_ashrae_90_1_2016/data/comstock_ashrae_90_1_2016.ext_ltg.json +1 -1
  288. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/comstock_ashrae_90_1_2016/data/comstock_ashrae_90_1_2016.spc_typ.json +152 -128
  289. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.energy_recovery.json +488 -84
  290. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.furnaces.json +26 -0
  291. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.spc_typ.json +47 -47
  292. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.unitary_acs.json +69 -0
  293. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirLoopHVAC.rb +342 -56
  294. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirTerminalSingleDuctVAVReheat.rb +3 -2
  295. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.CoolingTower.rb +5 -8
  296. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.CoolingTowerVariableSpeed.rb +2 -3
  297. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.FanVariableVolume.rb +2 -2
  298. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Space.rb +25 -5
  299. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.ThermalZone.rb +2 -1
  300. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.ZoneHVACComponent.rb +30 -0
  301. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.rb +4 -0
  302. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/comstock_ashrae_90_1_2019/comstock_ashrae_90_1_2019.rb +4 -0
  303. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/comstock_ashrae_90_1_2019/data/ashrae_90_1.schedules.json +696 -2938
  304. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/comstock_ashrae_90_1_2019/data/comstock_ashrae_90_1_2019.ext_ltg.json +1 -1
  305. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/comstock_ashrae_90_1_2019/data/comstock_ashrae_90_1_2019.spc_typ.json +151 -127
  306. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.boilers.json +1 -1
  307. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.energy_recovery.json +2307 -101
  308. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.furnaces.json +26 -0
  309. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.refrigeration_compressors.json +1 -1
  310. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.spc_typ.json +47 -47
  311. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.unitary_acs.json +69 -0
  312. data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.curves.json +25 -0
  313. data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.schedules.json +286 -224
  314. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/comstock_doe_ref_1980_2004/comstock_doe_ref_1980_2004.rb +4 -0
  315. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/comstock_doe_ref_1980_2004/data/ashrae_90_1.schedules.json +696 -2938
  316. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/comstock_doe_ref_1980_2004/data/comstock_doe_ref_1980_2004.ext_ltg.json +1 -1
  317. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/comstock_doe_ref_1980_2004/data/comstock_doe_ref_1980_2004.spc_typ.json +126 -126
  318. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.furnaces.json +26 -0
  319. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.prototype_inputs.json +11 -11
  320. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.refrigeration_system.json +0 -8
  321. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.spc_typ.json +405 -393
  322. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.AirLoopHVAC.rb +15 -11
  323. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.Model.rb +1 -1
  324. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.PlantLoop.rb +3 -0
  325. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.rb +4 -0
  326. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/comstock_doe_ref_pre_1980/comstock_doe_ref_pre_1980.rb +4 -0
  327. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/comstock_doe_ref_pre_1980/data/ashrae_90_1.schedules.json +696 -2938
  328. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/comstock_doe_ref_pre_1980/data/comstock_doe_ref_pre_1980.spc_typ.json +121 -121
  329. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.furnaces.json +37 -0
  330. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.prototype_inputs.json +11 -11
  331. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.refrigeration_system.json +0 -8
  332. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.spc_typ.json +403 -391
  333. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.AirLoopHVAC.rb +15 -11
  334. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.Model.rb +1 -1
  335. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.PlantLoop.rb +3 -0
  336. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.rb +4 -0
  337. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/data/nrel_zne_ready_2017.furnaces.json +15 -0
  338. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.AirLoopHVAC.rb +64 -42
  339. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.AirTerminalSingleDuctVAVReheat.rb +3 -2
  340. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.CoolingTower.rb +5 -8
  341. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.CoolingTowerVariableSpeed.rb +2 -3
  342. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.FanVariableVolume.rb +2 -2
  343. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.HeatExchangerSensLat.rb +1 -1
  344. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.Model.rb +1 -1
  345. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.PlantLoop.rb +4 -1
  346. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.Space.rb +5 -3
  347. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.ZoneHVACComponent.rb +3 -0
  348. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.rb +4 -0
  349. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.furnaces.json +15 -0
  350. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirLoopHVAC.rb +61 -36
  351. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirTerminalSingleDuctVAVReheat.rb +3 -2
  352. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.CoolingTower.rb +5 -8
  353. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.CoolingTowerVariableSpeed.rb +2 -3
  354. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.FanVariableVolume.rb +2 -2
  355. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.HeatExchangerSensLat.rb +1 -1
  356. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.Model.rb +1 -1
  357. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.PlantLoop.rb +4 -1
  358. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.Space.rb +6 -4
  359. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.ZoneHVACComponent.rb +3 -0
  360. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.rb +4 -0
  361. data/lib/openstudio-standards/standards/cbes/cbes.AirLoopHVAC.rb +20 -14
  362. data/lib/openstudio-standards/standards/cbes/cbes.PlantLoop.rb +3 -0
  363. data/lib/openstudio-standards/standards/cbes/cbes.rb +4 -0
  364. data/lib/openstudio-standards/standards/cbes/cbes_pre_1978/cbes_pre_1978.rb +4 -0
  365. data/lib/openstudio-standards/standards/cbes/cbes_t24_1978/cbes_t24_1978.rb +4 -0
  366. data/lib/openstudio-standards/standards/cbes/cbes_t24_1992/cbes_t24_1992.rb +4 -0
  367. data/lib/openstudio-standards/standards/cbes/cbes_t24_2001/cbes_t24_2001.rb +4 -0
  368. data/lib/openstudio-standards/standards/cbes/cbes_t24_2005/cbes_t24_2005.rb +4 -0
  369. data/lib/openstudio-standards/standards/cbes/cbes_t24_2008/cbes_t24_2008.rb +4 -0
  370. data/lib/openstudio-standards/standards/deer/deer.AirLoopHVAC.rb +10 -5
  371. data/lib/openstudio-standards/standards/deer/deer.PlanarSurface.rb +1 -1
  372. data/lib/openstudio-standards/standards/deer/deer.rb +4 -0
  373. data/lib/openstudio-standards/standards/deer/deer_1985/comstock_deer_1985/comstock_deer_1985.rb +4 -0
  374. data/lib/openstudio-standards/standards/deer/deer_1985/comstock_deer_1985/data/comstock_deer_1985.ext_ltg.json +2 -2
  375. data/lib/openstudio-standards/standards/deer/deer_1985/deer_1985.rb +4 -0
  376. data/lib/openstudio-standards/standards/deer/deer_1996/comstock_deer_1996/comstock_deer_1996.rb +4 -0
  377. data/lib/openstudio-standards/standards/deer/deer_1996/comstock_deer_1996/data/comstock_deer_1996.ext_ltg.json +2 -2
  378. data/lib/openstudio-standards/standards/deer/deer_1996/deer_1996.rb +4 -0
  379. data/lib/openstudio-standards/standards/deer/deer_2003/comstock_deer_2003/comstock_deer_2003.rb +4 -0
  380. data/lib/openstudio-standards/standards/deer/deer_2003/comstock_deer_2003/data/comstock_deer_2003.ext_ltg.json +2 -2
  381. data/lib/openstudio-standards/standards/deer/deer_2003/deer_2003.rb +4 -0
  382. data/lib/openstudio-standards/standards/deer/deer_2007/comstock_deer_2007/comstock_deer_2007.rb +4 -0
  383. data/lib/openstudio-standards/standards/deer/deer_2007/comstock_deer_2007/data/comstock_deer_2007.ext_ltg.json +2 -2
  384. data/lib/openstudio-standards/standards/deer/deer_2007/deer_2007.rb +4 -0
  385. data/lib/openstudio-standards/standards/deer/deer_2011/comstock_deer_2011/comstock_deer_2011.rb +4 -0
  386. data/lib/openstudio-standards/standards/deer/deer_2011/comstock_deer_2011/data/comstock_deer_2011.ext_ltg.json +2 -2
  387. data/lib/openstudio-standards/standards/deer/deer_2011/deer_2011.rb +4 -0
  388. data/lib/openstudio-standards/standards/deer/deer_2014/comstock_deer_2014/comstock_deer_2014.rb +4 -0
  389. data/lib/openstudio-standards/standards/deer/deer_2014/comstock_deer_2014/data/comstock_deer_2014.ext_ltg.json +2 -2
  390. data/lib/openstudio-standards/standards/deer/deer_2014/deer_2014.Space.rb +5 -3
  391. data/lib/openstudio-standards/standards/deer/deer_2014/deer_2014.rb +4 -0
  392. data/lib/openstudio-standards/standards/deer/deer_2015/comstock_deer_2015/comstock_deer_2015.rb +4 -0
  393. data/lib/openstudio-standards/standards/deer/deer_2015/comstock_deer_2015/data/comstock_deer_2015.ext_ltg.json +2 -2
  394. data/lib/openstudio-standards/standards/deer/deer_2015/deer_2015.Space.rb +5 -3
  395. data/lib/openstudio-standards/standards/deer/deer_2015/deer_2015.rb +4 -0
  396. data/lib/openstudio-standards/standards/deer/deer_2017/comstock_deer_2017/comstock_deer_2017.rb +4 -0
  397. data/lib/openstudio-standards/standards/deer/deer_2017/comstock_deer_2017/data/comstock_deer_2017.ext_ltg.json +2 -2
  398. data/lib/openstudio-standards/standards/deer/deer_2017/deer_2017.Space.rb +5 -3
  399. data/lib/openstudio-standards/standards/deer/deer_2017/deer_2017.rb +4 -0
  400. data/lib/openstudio-standards/standards/deer/deer_2020/comstock_deer_2020/comstock_deer_2020.rb +4 -0
  401. data/lib/openstudio-standards/standards/deer/deer_2020/deer_2020.AirLoopHVAC.rb +9 -5
  402. data/lib/openstudio-standards/standards/deer/deer_2020/deer_2020.FanVariableVolume.rb +3 -0
  403. data/lib/openstudio-standards/standards/deer/deer_2020/deer_2020.Space.rb +5 -3
  404. data/lib/openstudio-standards/standards/deer/deer_2020/deer_2020.rb +4 -0
  405. data/lib/openstudio-standards/standards/deer/deer_2025/comstock_deer_2025/comstock_deer_2025.rb +4 -0
  406. data/lib/openstudio-standards/standards/deer/deer_2025/deer_2025.AirLoopHVAC.rb +9 -5
  407. data/lib/openstudio-standards/standards/deer/deer_2025/deer_2025.FanVariableVolume.rb +3 -0
  408. data/lib/openstudio-standards/standards/deer/deer_2025/deer_2025.Space.rb +5 -3
  409. data/lib/openstudio-standards/standards/deer/deer_2025/deer_2025.rb +4 -0
  410. data/lib/openstudio-standards/standards/deer/deer_2030/comstock_deer_2030/comstock_deer_2030.rb +4 -0
  411. data/lib/openstudio-standards/standards/deer/deer_2030/deer_2030.AirLoopHVAC.rb +9 -5
  412. data/lib/openstudio-standards/standards/deer/deer_2030/deer_2030.FanVariableVolume.rb +3 -0
  413. data/lib/openstudio-standards/standards/deer/deer_2030/deer_2030.Space.rb +5 -3
  414. data/lib/openstudio-standards/standards/deer/deer_2030/deer_2030.rb +4 -0
  415. data/lib/openstudio-standards/standards/deer/deer_2035/comstock_deer_2035/comstock_deer_2035.rb +4 -0
  416. data/lib/openstudio-standards/standards/deer/deer_2035/deer_2035.AirLoopHVAC.rb +9 -5
  417. data/lib/openstudio-standards/standards/deer/deer_2035/deer_2035.FanVariableVolume.rb +3 -0
  418. data/lib/openstudio-standards/standards/deer/deer_2035/deer_2035.Space.rb +5 -3
  419. data/lib/openstudio-standards/standards/deer/deer_2035/deer_2035.rb +4 -0
  420. data/lib/openstudio-standards/standards/deer/deer_2040/comstock_deer_2040/comstock_deer_2040.rb +4 -0
  421. data/lib/openstudio-standards/standards/deer/deer_2040/deer_2040.AirLoopHVAC.rb +9 -5
  422. data/lib/openstudio-standards/standards/deer/deer_2040/deer_2040.FanVariableVolume.rb +3 -0
  423. data/lib/openstudio-standards/standards/deer/deer_2040/deer_2040.Space.rb +5 -3
  424. data/lib/openstudio-standards/standards/deer/deer_2040/deer_2040.rb +4 -0
  425. data/lib/openstudio-standards/standards/deer/deer_2045/comstock_deer_2045/comstock_deer_2045.rb +4 -0
  426. data/lib/openstudio-standards/standards/deer/deer_2045/deer_2045.AirLoopHVAC.rb +9 -5
  427. data/lib/openstudio-standards/standards/deer/deer_2045/deer_2045.FanVariableVolume.rb +3 -0
  428. data/lib/openstudio-standards/standards/deer/deer_2045/deer_2045.Space.rb +5 -3
  429. data/lib/openstudio-standards/standards/deer/deer_2045/deer_2045.rb +4 -0
  430. data/lib/openstudio-standards/standards/deer/deer_2050/comstock_deer_2050/comstock_deer_2050.rb +4 -0
  431. data/lib/openstudio-standards/standards/deer/deer_2050/deer_2050.AirLoopHVAC.rb +9 -5
  432. data/lib/openstudio-standards/standards/deer/deer_2050/deer_2050.FanVariableVolume.rb +3 -0
  433. data/lib/openstudio-standards/standards/deer/deer_2050/deer_2050.Space.rb +5 -3
  434. data/lib/openstudio-standards/standards/deer/deer_2050/deer_2050.rb +4 -0
  435. data/lib/openstudio-standards/standards/deer/deer_2055/comstock_deer_2055/comstock_deer_2055.rb +4 -0
  436. data/lib/openstudio-standards/standards/deer/deer_2055/deer_2055.AirLoopHVAC.rb +9 -5
  437. data/lib/openstudio-standards/standards/deer/deer_2055/deer_2055.FanVariableVolume.rb +3 -0
  438. data/lib/openstudio-standards/standards/deer/deer_2055/deer_2055.Space.rb +5 -3
  439. data/lib/openstudio-standards/standards/deer/deer_2055/deer_2055.rb +4 -0
  440. data/lib/openstudio-standards/standards/deer/deer_2060/comstock_deer_2060/comstock_deer_2060.rb +4 -0
  441. data/lib/openstudio-standards/standards/deer/deer_2060/deer_2060.AirLoopHVAC.rb +9 -5
  442. data/lib/openstudio-standards/standards/deer/deer_2060/deer_2060.FanVariableVolume.rb +3 -0
  443. data/lib/openstudio-standards/standards/deer/deer_2060/deer_2060.Space.rb +5 -3
  444. data/lib/openstudio-standards/standards/deer/deer_2060/deer_2060.rb +4 -0
  445. data/lib/openstudio-standards/standards/deer/deer_2065/comstock_deer_2065/comstock_deer_2065.rb +4 -0
  446. data/lib/openstudio-standards/standards/deer/deer_2065/deer_2065.AirLoopHVAC.rb +9 -5
  447. data/lib/openstudio-standards/standards/deer/deer_2065/deer_2065.FanVariableVolume.rb +3 -0
  448. data/lib/openstudio-standards/standards/deer/deer_2065/deer_2065.Space.rb +5 -3
  449. data/lib/openstudio-standards/standards/deer/deer_2065/deer_2065.rb +4 -0
  450. data/lib/openstudio-standards/standards/deer/deer_2070/comstock_deer_2070/comstock_deer_2070.rb +4 -0
  451. data/lib/openstudio-standards/standards/deer/deer_2070/deer_2070.AirLoopHVAC.rb +9 -5
  452. data/lib/openstudio-standards/standards/deer/deer_2070/deer_2070.FanVariableVolume.rb +3 -0
  453. data/lib/openstudio-standards/standards/deer/deer_2070/deer_2070.Space.rb +5 -3
  454. data/lib/openstudio-standards/standards/deer/deer_2070/deer_2070.rb +4 -0
  455. data/lib/openstudio-standards/standards/deer/deer_2075/comstock_deer_2075/comstock_deer_2075.rb +4 -0
  456. data/lib/openstudio-standards/standards/deer/deer_2075/deer_2075.AirLoopHVAC.rb +9 -5
  457. data/lib/openstudio-standards/standards/deer/deer_2075/deer_2075.FanVariableVolume.rb +3 -0
  458. data/lib/openstudio-standards/standards/deer/deer_2075/deer_2075.Space.rb +5 -3
  459. data/lib/openstudio-standards/standards/deer/deer_2075/deer_2075.rb +4 -0
  460. data/lib/openstudio-standards/standards/deer/deer_pre_1975/comstock_deer_pre_1975/comstock_deer_pre_1975.rb +4 -0
  461. data/lib/openstudio-standards/standards/deer/deer_pre_1975/comstock_deer_pre_1975/data/comstock_deer_pre_1975.ext_ltg.json +2 -2
  462. data/lib/openstudio-standards/standards/deer/deer_pre_1975/deer_pre_1975.rb +4 -0
  463. data/lib/openstudio-standards/standards/icc_iecc/icc_iecc_2015/icc_iecc_2015.rb +4 -0
  464. data/lib/openstudio-standards/standards/necb/BTAP1980TO2010/btap_1980to2010.rb +6 -28
  465. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/btap_pre1980.rb +25 -110
  466. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/building_envelope.rb +45 -60
  467. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_3_and_8_single_speed.rb +19 -23
  468. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_4.rb +84 -83
  469. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_6.rb +52 -47
  470. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_systems.rb +43 -40
  471. data/lib/openstudio-standards/standards/necb/ECMS/data/boiler_set.json +18 -0
  472. data/lib/openstudio-standards/standards/necb/ECMS/data/chiller_set.json +211 -0
  473. data/lib/openstudio-standards/standards/necb/ECMS/data/curves.json +1195 -20
  474. data/lib/openstudio-standards/standards/necb/ECMS/data/furnace_set.json +18 -0
  475. data/lib/openstudio-standards/standards/necb/ECMS/data/heat_pumps.json +244 -182
  476. data/lib/openstudio-standards/standards/necb/ECMS/data/heat_pumps_heating.json +232 -185
  477. data/lib/openstudio-standards/standards/necb/ECMS/data/shw_set.json +20 -2
  478. data/lib/openstudio-standards/standards/necb/ECMS/ecms.rb +18 -25
  479. data/lib/openstudio-standards/standards/necb/ECMS/erv.rb +12 -13
  480. data/lib/openstudio-standards/standards/necb/ECMS/hvac_systems.rb +1647 -466
  481. data/lib/openstudio-standards/standards/necb/ECMS/loads.rb +93 -0
  482. data/lib/openstudio-standards/standards/necb/ECMS/nv.rb +40 -47
  483. data/lib/openstudio-standards/standards/necb/ECMS/pv_ground.rb +26 -25
  484. data/lib/openstudio-standards/standards/necb/NECB2011/autozone.rb +303 -305
  485. data/lib/openstudio-standards/standards/necb/NECB2011/beps_compliance_path.rb +45 -45
  486. data/lib/openstudio-standards/standards/necb/NECB2011/building_envelope.rb +90 -120
  487. data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/Hospital.osm +1176 -1115
  488. data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/LowriseApartment.osm +8279 -28923
  489. data/lib/openstudio-standards/standards/necb/NECB2011/data/space_types.json +1173 -1173
  490. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_1_multi_speed.rb +15 -13
  491. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_1_single_speed.rb +32 -29
  492. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_2_and_5.rb +25 -26
  493. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_3_and_8_multi_speed.rb +14 -14
  494. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_3_and_8_single_speed.rb +24 -29
  495. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_4.rb +85 -84
  496. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_6.rb +41 -42
  497. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_systems.rb +209 -197
  498. data/lib/openstudio-standards/standards/necb/NECB2011/lighting.rb +87 -82
  499. data/lib/openstudio-standards/standards/necb/NECB2011/necb_2011.rb +510 -406
  500. data/lib/openstudio-standards/standards/necb/NECB2011/nv.md +3 -3
  501. data/lib/openstudio-standards/standards/necb/NECB2011/qaqc/necb_qaqc.rb +686 -683
  502. data/lib/openstudio-standards/standards/necb/NECB2011/service_water_heating.rb +129 -82
  503. data/lib/openstudio-standards/standards/necb/NECB2015/data/space_types.json +1608 -1608
  504. data/lib/openstudio-standards/standards/necb/NECB2015/hvac_systems.rb +25 -18
  505. data/lib/openstudio-standards/standards/necb/NECB2015/lighting.rb +73 -67
  506. data/lib/openstudio-standards/standards/necb/NECB2015/necb_2015.rb +18 -22
  507. data/lib/openstudio-standards/standards/necb/NECB2015/qaqc/necb_2015_qaqc.rb +59 -63
  508. data/lib/openstudio-standards/standards/necb/NECB2017/data/space_types.json +1608 -1608
  509. data/lib/openstudio-standards/standards/necb/NECB2017/hvac_systems.rb +1 -4
  510. data/lib/openstudio-standards/standards/necb/NECB2017/necb_2017.rb +10 -14
  511. data/lib/openstudio-standards/standards/necb/NECB2020/building_envelope.rb +779 -0
  512. data/lib/openstudio-standards/standards/necb/NECB2020/data/boilers.json +122 -0
  513. data/lib/openstudio-standards/standards/necb/NECB2020/data/chillers.json +335 -0
  514. data/lib/openstudio-standards/standards/necb/NECB2020/data/constants.json +13 -0
  515. data/lib/openstudio-standards/standards/necb/NECB2020/data/furnaces.json +41 -0
  516. data/lib/openstudio-standards/standards/necb/NECB2020/data/heat_pumps.json +452 -0
  517. data/lib/openstudio-standards/standards/necb/NECB2020/data/heat_pumps_heating.json +164 -0
  518. data/lib/openstudio-standards/standards/necb/NECB2020/data/heat_rejection.json +228 -0
  519. data/lib/openstudio-standards/standards/necb/NECB2020/data/led_lighting_data.json +2883 -0
  520. data/lib/openstudio-standards/standards/necb/NECB2020/data/space_types.json +25851 -0
  521. data/lib/openstudio-standards/standards/necb/NECB2020/data/surface_thermal_transmittance.json +60 -0
  522. data/lib/openstudio-standards/standards/necb/NECB2020/data/unitary_acs.json +585 -0
  523. data/lib/openstudio-standards/standards/necb/NECB2020/necb_2020.rb +175 -0
  524. data/lib/openstudio-standards/standards/necb/common/bc_step_code_indicators.md +10 -0
  525. data/lib/openstudio-standards/standards/necb/common/btap_data.rb +1963 -0
  526. data/lib/openstudio-standards/standards/necb/common/btap_datapoint.rb +410 -0
  527. data/lib/openstudio-standards/standards/necb/common/neb_end_use_prices.csv +42 -0
  528. data/lib/openstudio-standards/standards/necb/common/necb_reference_runs.csv +28705 -0
  529. data/lib/openstudio-standards/standards/necb/common/phius.md +23 -0
  530. data/lib/openstudio-standards/standards/necb/common/space_type_upgrade_map.json +1158 -386
  531. data/lib/openstudio-standards/standards/oeesc/oeesc_2014/oeesc_2014.rb +4 -0
  532. data/lib/openstudio-standards/standards/standard.rb +2 -1
  533. data/lib/openstudio-standards/utilities/define_thermal_zone_and_mulitpliers.rb +1 -1
  534. data/lib/openstudio-standards/utilities/logging.rb +6 -0
  535. data/lib/openstudio-standards/utilities/simulation.rb +30 -14
  536. data/lib/openstudio-standards/utilities/{speacetype_map_converter.rb → spacetype_map_converter.rb} +0 -0
  537. data/lib/openstudio-standards/utilities/sqlfile.rb +112 -71
  538. data/lib/openstudio-standards/version.rb +2 -2
  539. data/lib/openstudio-standards/weather/Weather.Model.rb +209 -9
  540. data/lib/openstudio-standards/weather/Weather.stat_file.rb +1 -1
  541. data/lib/openstudio-standards.rb +9 -0
  542. metadata +106 -205
  543. data/data/standards/OpenStudio_Standards-ashrae_90_1-ALL-comstock(space_types).xlsx +0 -0
  544. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.boilers.json +0 -49
  545. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.chillers.json +0 -293
  546. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.construction_properties.json +0 -25426
  547. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.construction_sets.json +0 -1600
  548. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.economizers.json +0 -564
  549. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.elevators.json +0 -349
  550. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.ext_ltg.json +0 -164
  551. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.ground_temperatures.json +0 -10663
  552. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.heat_pumps.json +0 -508
  553. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.heat_pumps_heating.json +0 -156
  554. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.heat_rejection.json +0 -44
  555. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.motors.json +0 -184
  556. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.prototype_inputs.json +0 -3094
  557. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.ref_cases.json +0 -829
  558. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.ref_lnup.json +0 -562
  559. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.refrigeration_compressors.json +0 -52
  560. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.refrigeration_condenser.json +0 -220
  561. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.refrigeration_system.json +0 -156
  562. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.refrigeration_walkins.json +0 -1316
  563. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.spc_typ.json +0 -21446
  564. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.unitary_acs.json +0 -554
  565. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.water_heaters.json +0 -68
  566. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.water_source_heat_pumps.json +0 -28
  567. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.water_source_heat_pumps_heating.json +0 -12
  568. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.boilers.json +0 -49
  569. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.chillers.json +0 -293
  570. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.construction_properties.json +0 -12487
  571. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.construction_sets.json +0 -1600
  572. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.economizers.json +0 -564
  573. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.elevators.json +0 -349
  574. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.ext_ltg.json +0 -164
  575. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.ground_temperatures.json +0 -10663
  576. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.heat_pumps.json +0 -466
  577. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.heat_pumps_heating.json +0 -137
  578. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.heat_rejection.json +0 -44
  579. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.motors.json +0 -184
  580. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.prototype_inputs.json +0 -3094
  581. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.ref_cases.json +0 -829
  582. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.ref_lnup.json +0 -562
  583. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.refrigeration_compressors.json +0 -52
  584. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.refrigeration_condenser.json +0 -220
  585. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.refrigeration_system.json +0 -156
  586. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.refrigeration_walkins.json +0 -1316
  587. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.spc_typ.json +0 -21380
  588. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.unitary_acs.json +0 -554
  589. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.water_heaters.json +0 -68
  590. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.water_source_heat_pumps.json +0 -28
  591. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.water_source_heat_pumps_heating.json +0 -12
  592. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.boilers.json +0 -49
  593. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.chillers.json +0 -395
  594. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.construction_properties.json +0 -12487
  595. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.construction_sets.json +0 -1600
  596. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.economizers.json +0 -592
  597. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.elevators.json +0 -349
  598. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.energy_recovery.json +0 -550
  599. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.ext_ltg.json +0 -164
  600. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.ground_temperatures.json +0 -10663
  601. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.heat_pumps.json +0 -466
  602. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.heat_pumps_heating.json +0 -137
  603. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.heat_rejection.json +0 -44
  604. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.motors.json +0 -238
  605. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.prototype_inputs.json +0 -3094
  606. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.ref_cases.json +0 -829
  607. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.ref_lnup.json +0 -562
  608. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.refrigeration_compressors.json +0 -52
  609. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.refrigeration_condenser.json +0 -220
  610. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.refrigeration_system.json +0 -156
  611. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.refrigeration_walkins.json +0 -1316
  612. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.spc_typ.json +0 -21548
  613. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.unitary_acs.json +0 -554
  614. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.water_heaters.json +0 -68
  615. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.water_source_heat_pumps.json +0 -28
  616. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.water_source_heat_pumps_heating.json +0 -12
  617. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.boilers.json +0 -64
  618. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.chillers.json +0 -871
  619. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.construction_properties.json +0 -12487
  620. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.construction_sets.json +0 -1600
  621. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.economizers.json +0 -592
  622. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.elevators.json +0 -349
  623. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.energy_recovery.json +0 -1096
  624. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.ext_ltg.json +0 -164
  625. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.ground_temperatures.json +0 -10663
  626. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.heat_pumps.json +0 -886
  627. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.heat_pumps_heating.json +0 -194
  628. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.heat_rejection.json +0 -44
  629. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.motors.json +0 -247
  630. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.prototype_inputs.json +0 -3094
  631. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.ref_cases.json +0 -829
  632. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.ref_lnup.json +0 -562
  633. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.refrigeration_compressors.json +0 -52
  634. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.refrigeration_condenser.json +0 -220
  635. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.refrigeration_system.json +0 -156
  636. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.refrigeration_walkins.json +0 -1316
  637. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.spc_typ.json +0 -22079
  638. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.unitary_acs.json +0 -994
  639. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.water_heaters.json +0 -68
  640. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.water_source_heat_pumps.json +0 -28
  641. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.water_source_heat_pumps_heating.json +0 -12
  642. data/lib/openstudio-standards/utilities/convert_costing_constructions.rb +0 -105
@@ -1,5 +1,4 @@
1
1
  class NECB2011
2
-
3
2
  # Creates thermal zones to contain each space, as defined for each building in the
4
3
  # system_to_space_map inside the Prototype.building_name
5
4
  # e.g. (Prototype.secondary_school.rb) file.
@@ -63,7 +62,6 @@ class NECB2011
63
62
  @standards_data['space_types'] = Standard.build(template).standards_data['space_types']
64
63
  end
65
64
 
66
-
67
65
  # The first thing we need to do is get a sizing run to determine the heating loads of all the spaces. The default
68
66
  # btap geometry has a one to one relationship of zones to spaces.. So we simply create the thermal zones for all the spaces.
69
67
  # to do this we need to create thermals zone for each space.
@@ -78,25 +76,26 @@ class NECB2011
78
76
  end
79
77
 
80
78
  # collect sizing information on each space.
81
- self.store_space_sizing_loads(model)
79
+ store_space_sizing_loads(model)
82
80
  # Remove any Thermal zones assigned again to start fresh.
83
81
  model.getThermalZones.each(&:remove)
84
- self.auto_zone_dwelling_units(model)
85
- self.auto_zone_wet_spaces(model: model, lights_type: lights_type, lights_scale: lights_scale)
86
- self.auto_zone_all_other_spaces(model)
87
- self.auto_zone_wild_spaces(model: model, lights_type: lights_type, lights_scale: lights_scale)
88
- #THis will color the spaces and zones.
82
+ auto_zone_dwelling_units(model)
83
+ auto_zone_wet_spaces(model: model, lights_type: lights_type, lights_scale: lights_scale)
84
+ auto_zone_all_other_spaces(model)
85
+ auto_zone_wild_spaces(model: model, lights_type: lights_type, lights_scale: lights_scale)
86
+ # This will color the spaces and zones.
89
87
  random = Random.new(1234)
90
- #Set ideal hvac in case we want to not implement the hvac yet and still run osm right after this function.
91
- #model.getThermalZones.each { |zone| zone.setUseIdealAirLoads(true) }
92
- model.getThermalZones.sort.each {|item| item.setRenderingColor(self.set_random_rendering_color(item, random))}
93
- model.getSpaceTypes.sort.each {|item| item.setRenderingColor(self.set_random_rendering_color(item, random))}
88
+ # Set ideal hvac in case we want to not implement the hvac yet and still run osm right after this function.
89
+ # model.getThermalZones.each { |zone| zone.setUseIdealAirLoads(true) }
90
+ model.getThermalZones.sort.each { |item| item.setRenderingColor(set_random_rendering_color(item, random)) }
91
+ model.getSpaceTypes.sort.each { |item| item.setRenderingColor(set_random_rendering_color(item, random)) }
94
92
  end
95
93
 
96
94
  # Organizes Zones and assigns them to appropriate systems according to NECB 2011-17 systems spacetype rules in Sec 8.
97
95
  # requires requires fuel type to be assigned for each system aspect. Defaults to gas hydronic.
98
96
  def apply_systems(model:, primary_heating_fuel:, sizing_run_dir:)
99
97
  raise('validation of model failed.') unless validate_initial_model(model)
98
+
100
99
  # Check to see if model is using another vintage of spacetypes. If so overwrite the @standards for the object with the
101
100
  # other spacetype data. This is required for correct system mapping.
102
101
  template = determine_spacetype_vintage(model)
@@ -106,23 +105,22 @@ class NECB2011
106
105
  end
107
106
 
108
107
  # do a sizing run.
109
- if model_run_sizing_run(model, "#{sizing_run_dir}/autozone") == false
108
+ if model_run_sizing_run(model, "#{sizing_run_dir}/autozone_systems") == false
110
109
  raise('autorun sizing run failed!')
111
110
  end
112
111
 
113
112
  # collect sizing information on each space.
114
- self.store_space_sizing_loads(model)
113
+ store_space_sizing_loads(model)
115
114
 
116
115
  # Set the primary fuel set to default to to specific fuel type.
117
116
  if primary_heating_fuel == 'DefaultFuel'
118
117
  epw = BTAP::Environment::WeatherFile.new(model.weatherFile.get.path.get)
119
- primary_heating_fuel = @standards_data['regional_fuel_use'].detect {|fuel_sources| fuel_sources['state_province_regions'].include?(epw.state_province_region)}['fueltype_set']
118
+ primary_heating_fuel = @standards_data['regional_fuel_use'].detect { |fuel_sources| fuel_sources['state_province_regions'].include?(epw.state_province_region) }['fueltype_set']
120
119
  end
121
120
  # Get fuelset.
122
- system_fuel_defaults = @standards_data['fuel_type_sets'].detect {|fuel_type_set| fuel_type_set['name'] == primary_heating_fuel}
121
+ system_fuel_defaults = @standards_data['fuel_type_sets'].detect { |fuel_type_set| fuel_type_set['name'] == primary_heating_fuel }
123
122
  raise("fuel_type_sets named #{primary_heating_fuel} not found in fuel_type_sets table.") if system_fuel_defaults.nil?
124
123
 
125
-
126
124
  # Assign fuel sources.
127
125
  boiler_fueltype = system_fuel_defaults['boiler_fueltype']
128
126
  baseboard_type = system_fuel_defaults['baseboard_type']
@@ -135,13 +133,13 @@ class NECB2011
135
133
  heating_coil_type_sys6 = system_fuel_defaults['heating_coil_type_sys6']
136
134
  fan_type = system_fuel_defaults['fan_type']
137
135
 
138
- #remove idealair from zones if any.
136
+ # remove idealair from zones if any.
139
137
  model.getZoneHVACIdealLoadsAirSystems.each(&:remove)
140
138
  @hw_loop = create_hw_loop_if_required(baseboard_type,
141
139
  boiler_fueltype,
142
140
  mau_heating_coil_type,
143
141
  model)
144
- #Rule that all dwelling units have their own zone and system.
142
+ # Rule that all dwelling units have their own zone and system.
145
143
  auto_system_dwelling_units(model: model,
146
144
  baseboard_type: baseboard_type,
147
145
  boiler_fueltype: boiler_fueltype,
@@ -153,24 +151,21 @@ class NECB2011
153
151
  heating_coil_type_sys6: heating_coil_type_sys6,
154
152
  mau_cooling_type: mau_cooling_type,
155
153
  mau_heating_coil_type: mau_heating_coil_type,
156
- mau_type: mau_type
157
- )
154
+ mau_type: mau_type)
158
155
 
159
- #Assign a single system 4 for all wet spaces.. and assign the control zone to the one with the largest load.
156
+ # Assign a single system 4 for all wet spaces.. and assign the control zone to the one with the largest load.
160
157
  auto_system_wet_spaces(baseboard_type: baseboard_type,
161
158
  boiler_fueltype: boiler_fueltype,
162
159
  heating_coil_type_sys4: heating_coil_type_sys4,
163
160
  model: model)
164
161
 
165
-
166
- #Assign a single system 4 for all storage spaces.. and assign the control zone to the one with the largest load.
162
+ # Assign a single system 4 for all storage spaces.. and assign the control zone to the one with the largest load.
167
163
  auto_system_storage_spaces(baseboard_type: baseboard_type,
168
164
  boiler_fueltype: boiler_fueltype,
169
165
  heating_coil_type_sys4: heating_coil_type_sys4,
170
166
  model: model)
171
167
 
172
-
173
- #Assign the wild spaces to a single system 4 system with a control zone with the largest load.
168
+ # Assign the wild spaces to a single system 4 system with a control zone with the largest load.
174
169
  auto_system_wild_spaces(baseboard_type: baseboard_type,
175
170
  heating_coil_type_sys4: heating_coil_type_sys4,
176
171
  model: model)
@@ -186,14 +181,12 @@ class NECB2011
186
181
  heating_coil_type_sys6: heating_coil_type_sys6,
187
182
  mau_cooling_type: mau_cooling_type,
188
183
  mau_heating_coil_type: mau_heating_coil_type,
189
- mau_type: mau_type
190
- )
184
+ mau_type: mau_type)
191
185
  model_add_swh(model: model, swh_fueltype: system_fuel_defaults['swh_fueltype'])
192
186
  model_apply_sizing_parameters(model)
193
187
  # set a larger tolerance for unmet hours from default 0.2 to 1.0C
194
188
  model.getOutputControlReportingTolerances.setToleranceforTimeHeatingSetpointNotMet(1.0)
195
189
  model.getOutputControlReportingTolerances.setToleranceforTimeCoolingSetpointNotMet(1.0)
196
-
197
190
  end
198
191
 
199
192
  # Method to store space sizing loads. This is needed because later when the zones are destroyed this information will be lost.
@@ -201,7 +194,6 @@ class NECB2011
201
194
  @stored_space_heating_sizing_loads = {}
202
195
  @stored_space_cooling_sizing_loads = {}
203
196
  model.getSpaces.sort.each do |space|
204
-
205
197
  space_type = space.spaceType.get.standardsSpaceType.get
206
198
  @stored_space_heating_sizing_loads[space] = space_type == '- undefined -' ? 0.0 : space.thermalZone.get.heatingDesignLoad.get
207
199
  @stored_space_cooling_sizing_loads[space] = space_type == '- undefined -' ? 0.0 : space.thermalZone.get.coolingDesignLoad.get
@@ -212,9 +204,10 @@ class NECB2011
212
204
  def stored_space_heating_load(space)
213
205
  if @stored_space_heating_sizing_loads.nil?
214
206
  # do a sizing run.
215
- raise("autorun sizing run failed!") if model_run_sizing_run(space.model, "#{Dir.pwd}/autozone") == false
216
- #collect sizing information on each space.
217
- self.store_space_sizing_loads(space.model)
207
+ raise('autorun sizing run failed!') if model_run_sizing_run(space.model, "#{Dir.pwd}/autozone") == false
208
+
209
+ # collect sizing information on each space.
210
+ store_space_sizing_loads(space.model)
218
211
  end
219
212
  @stored_space_heating_sizing_loads[space]
220
213
  end
@@ -223,9 +216,10 @@ class NECB2011
223
216
  def stored_space_cooling_load(space)
224
217
  if @stored_space_cooling_sizing_loads.nil?
225
218
  # do a sizing run.
226
- raise("autorun sizing run failed!") if model_run_sizing_run(space.model, "#{Dir.pwd}/autozone") == false
227
- #collect sizing information on each space.
228
- self.store_space_sizing_loads(space.model)
219
+ raise('autorun sizing run failed!') if model_run_sizing_run(space.model, "#{Dir.pwd}/autozone") == false
220
+
221
+ # collect sizing information on each space.
222
+ store_space_sizing_loads(space.model)
229
223
  end
230
224
  @stored_space_cooling_sizing_loads[space]
231
225
  end
@@ -255,9 +249,9 @@ class NECB2011
255
249
  def auto_zone_dwelling_units(model)
256
250
  dwelling_tz_array = []
257
251
  # ----Dwelling units----------- will always have their own system per unit, so they should have their own thermal zone.
258
- model.getSpaces.select {|space| is_a_necb_dwelling_unit?(space)}.each do |space|
252
+ model.getSpaces.select { |space| is_a_necb_dwelling_unit?(space) }.each do |space|
259
253
  zone = OpenStudio::Model::ThermalZone.new(model)
260
- zone.setName("DU_BT=#{space.spaceType.get.standardsBuildingType.get}_ST=#{space.spaceType.get.standardsSpaceType.get}_FL=#{space.buildingStory().get.name}_SCH#{ determine_dominant_schedule([space])}")
254
+ zone.setName("DU_BT=#{space.spaceType.get.standardsBuildingType.get}_ST=#{space.spaceType.get.standardsSpaceType.get}_FL=#{space.buildingStory.get.name}_SCH#{determine_dominant_schedule([space])}")
261
255
  unless space_multiplier_map[space.name.to_s].nil? || (space_multiplier_map[space.name.to_s] == 1)
262
256
  zone.setMultiplier(space_multiplier_map[space.name.to_s])
263
257
  end
@@ -286,27 +280,28 @@ class NECB2011
286
280
  # their own single system 4 system. These will be set to the dominant floor schedule.
287
281
 
288
282
  def auto_zone_wet_spaces(model:, lights_type: 'NECB_Default', lights_scale: 1.0)
289
- wet_zone_array = Array.new
290
- model.getSpaces.select {|space| is_an_necb_wet_space?(space)}.each do |space|
291
- #if this space was already assigned to something skip it.
283
+ wet_zone_array = []
284
+ model.getSpaces.select { |space| is_an_necb_wet_space?(space) }.each do |space|
285
+ # if this space was already assigned to something skip it.
292
286
  next unless space.thermalZone.empty?
287
+
293
288
  # get space to dominant schedule
294
289
  dominant_schedule = determine_dominant_schedule(space.model.getSpaces)
295
- #create new TZ and set space to the zone.
290
+ # create new TZ and set space to the zone.
296
291
  zone = OpenStudio::Model::ThermalZone.new(model)
297
292
  space.setThermalZone(zone)
298
- tz_name = "WET_ST=#{space.spaceType.get.standardsSpaceType.get}_FL=#{space.buildingStory().get.name}_SCH#{dominant_schedule}"
293
+ tz_name = "WET_ST=#{space.spaceType.get.standardsSpaceType.get}_FL=#{space.buildingStory.get.name}_SCH#{dominant_schedule}"
299
294
  zone.setName(tz_name)
300
- #Set multiplier from the original tz multiplier.
295
+ # Set multiplier from the original tz multiplier.
301
296
  unless space_multiplier_map[space.name.to_s].nil? || (space_multiplier_map[space.name.to_s] == 1)
302
297
  zone.setMultiplier(space_multiplier_map[space.name.to_s])
303
298
  end
304
299
 
305
- #this method will determine if the right schedule was used for this wet & wild space if not.. it will reset the space
300
+ # this method will determine if the right schedule was used for this wet & wild space if not.. it will reset the space
306
301
  # to use the correct schedule version of the wet and wild space type.
307
302
  adjust_wildcard_spacetype_schedule(space: space, schedule: dominant_schedule, lights_type: lights_type, lights_scale: lights_scale)
308
303
 
309
- #Find spacetype thermostat and assign it to the zone.
304
+ # Find spacetype thermostat and assign it to the zone.
310
305
  thermostat_name = space.spaceType.get.name.get + ' Thermostat'
311
306
  thermostat = model.getThermostatSetpointDualSetpointByName(thermostat_name)
312
307
  if thermostat.empty?
@@ -320,10 +315,10 @@ class NECB2011
320
315
  ideal_loads.addToThermalZone(zone)
321
316
  end
322
317
  # Go through other spaces to see if there are similar spaces with similar loads on the same floor that can be grouped.
323
- model.getSpaces.select {|s| is_an_necb_wet_space?(s)}.each do |space_target|
318
+ model.getSpaces.select { |s| is_an_necb_wet_space?(s) }.each do |space_target|
324
319
  if space_target.thermalZone.empty?
325
- if are_space_loads_similar?(space_1: space, space_2: space_target) && space.buildingStory().get == space_target.buildingStory().get # added since chris needs zones to not span floors for costing.
326
- adjust_wildcard_spacetype_schedule(space_target, dominant_schedule, lights_type, lights_scale, space_height)
320
+ if are_space_loads_similar?(space_1: space, space_2: space_target) && space.buildingStory.get == space_target.buildingStory.get # added since chris needs zones to not span floors for costing.
321
+ adjust_wildcard_spacetype_schedule(space: space_target, schedule: dominant_schedule, lights_type: lights_type, lights_scale: lights_scale)
327
322
  space_target.setThermalZone(zone)
328
323
  end
329
324
  end
@@ -337,20 +332,21 @@ class NECB2011
337
332
  # if the spaces are similar based on exposure and load and blend those spaces into the same zone. It will not merge spaces
338
333
  # from different floors, since this will impact Chris Kirneys costing algorithms.
339
334
  def auto_zone_all_other_spaces(model)
340
- other_tz_array = Array.new
341
- #iterate through all non wildcard spaces.
342
- model.getSpaces.select {|space| not is_a_necb_dwelling_unit?(space) and not is_an_necb_wildcard_space?(space)}.each do |space|
343
- #skip if already assigned to a thermal zone.
335
+ other_tz_array = []
336
+ # iterate through all non wildcard spaces.
337
+ model.getSpaces.select { |space| !is_a_necb_dwelling_unit?(space) && !is_an_necb_wildcard_space?(space) }.each do |space|
338
+ # skip if already assigned to a thermal zone.
344
339
  next unless space.thermalZone.empty?
345
- #create new zone for this space based on the space name.
340
+
341
+ # create new zone for this space based on the space name.
346
342
  zone = OpenStudio::Model::ThermalZone.new(model)
347
- tz_name = "ALL_ST=#{space.spaceType.get.standardsSpaceType.get}_FL=#{space.buildingStory().get.name}_SCH=#{ determine_dominant_schedule([space])}"
343
+ tz_name = "ALL_ST=#{space.spaceType.get.standardsSpaceType.get}_FL=#{space.buildingStory.get.name}_SCH=#{determine_dominant_schedule([space])}"
348
344
  zone.setName(tz_name)
349
- #sets space mulitplier unless it is nil or 1.
345
+ # sets space mulitplier unless it is nil or 1.
350
346
  unless space_multiplier_map[space.name.to_s].nil? || (space_multiplier_map[space.name.to_s] == 1)
351
347
  zone.setMultiplier(space_multiplier_map[space.name.to_s])
352
348
  end
353
- #Assign space to the new zone.
349
+ # Assign space to the new zone.
354
350
  space.setThermalZone(zone)
355
351
 
356
352
  # Add a thermostat
@@ -368,9 +364,9 @@ class NECB2011
368
364
  ideal_loads.addToThermalZone(zone)
369
365
  end
370
366
  # Go through other spaces and if you find something with similar loads on the same floor, add it to the zone.
371
- model.getSpaces.select {|space| not is_a_necb_dwelling_unit?(space) and not is_an_necb_wildcard_space?(space)}.each do |space_target|
367
+ model.getSpaces.select { |curr_space| !is_a_necb_dwelling_unit?(curr_space) && !is_an_necb_wildcard_space?(curr_space) }.each do |space_target|
372
368
  if space_target.thermalZone.empty?
373
- if are_space_loads_similar?(space_1: space, space_2: space_target) and space.buildingStory().get == space_target.buildingStory().get # added since chris needs zones to not span floors for costing.
369
+ if are_space_loads_similar?(space_1: space, space_2: space_target) && space.buildingStory.get == space_target.buildingStory.get # added since chris needs zones to not span floors for costing.
374
370
  space_target.setThermalZone(zone)
375
371
  end
376
372
  end
@@ -383,20 +379,21 @@ class NECB2011
383
379
  # This will take all the wildcard spaces and merge them to be supported by a system 4. The control zone will be the
384
380
  # zone that has the largest heating load per area.
385
381
  def auto_zone_wild_spaces(model:, lights_type: 'NECB_Default', lights_scale: 1.0)
386
- other_tz_array = Array.new
387
- #iterate through wildcard spaces.
388
- model.getSpaces.select {|space| is_an_necb_wildcard_space?(space) and not is_an_necb_wet_space?(space)}.each do |space|
389
- #skip if already assigned to a thermal zone.
382
+ other_tz_array = []
383
+ # iterate through wildcard spaces.
384
+ model.getSpaces.select { |space| is_an_necb_wildcard_space?(space) && !is_an_necb_wet_space?(space) }.each do |space|
385
+ # skip if already assigned to a thermal zone.
390
386
  next unless space.thermalZone.empty?
391
- #create new zone for this space based on the space name.
387
+
388
+ # create new zone for this space based on the space name.
392
389
  zone = OpenStudio::Model::ThermalZone.new(model)
393
- tz_name = "WILD_ST=#{space.spaceType.get.standardsSpaceType.get}_FL=#{space.buildingStory().get.name}_SCH=#{determine_dominant_schedule(space.model.getSpaces)}"
390
+ tz_name = "WILD_ST=#{space.spaceType.get.standardsSpaceType.get}_FL=#{space.buildingStory.get.name}_SCH=#{determine_dominant_schedule(space.model.getSpaces)}"
394
391
  zone.setName(tz_name)
395
- #sets space mulitplier unless it is nil or 1.
392
+ # sets space mulitplier unless it is nil or 1.
396
393
  unless space_multiplier_map[space.name.to_s].nil? || (space_multiplier_map[space.name.to_s] == 1)
397
394
  zone.setMultiplier(space_multiplier_map[space.name.to_s])
398
395
  end
399
- #Assign space to the new zone.
396
+ # Assign space to the new zone.
400
397
  space.setThermalZone(zone)
401
398
 
402
399
  # lets keep the wild schedules to be the same as what dominate the floor.
@@ -422,10 +419,10 @@ class NECB2011
422
419
  ideal_loads.addToThermalZone(zone)
423
420
  end
424
421
  # Go through other spaces and if you find something with similar loads on the same floor, add it to the zone.
425
- model.getSpaces.select {|space| is_an_necb_wildcard_space?(space) and not is_an_necb_wet_space?(space)}.each do |space_target|
422
+ model.getSpaces.select { |curr_space| is_an_necb_wildcard_space?(curr_space) && !is_an_necb_wet_space?(curr_space) }.each do |space_target|
426
423
  if space_target.thermalZone.empty?
427
- if are_space_loads_similar?(space_1: space, space_2: space_target) and
428
- space.buildingStory().get == space_target.buildingStory().get # added since chris needs zones to not span floors for costing.
424
+ if are_space_loads_similar?(space_1: space, space_2: space_target) &&
425
+ (space.buildingStory.get == space_target.buildingStory.get) # added since chris needs zones to not span floors for costing.
429
426
  space_target.setThermalZone(zone)
430
427
  end
431
428
  end
@@ -435,62 +432,63 @@ class NECB2011
435
432
  return other_tz_array
436
433
 
437
434
  wild_zone_array = []
438
- #Get a list of all the wild spaces.
439
- model.getSpaces.select {|space| is_an_necb_wildcard_space?(space) and not is_an_necb_wet_space?(space)}.each do |space|
440
- #if this space was already assigned to something skip it.
435
+ # Get a list of all the wild spaces.
436
+ model.getSpaces.select { |space| is_an_necb_wildcard_space?(space) && !is_an_necb_wet_space?(space) }.each do |space|
437
+ # if this space was already assigned to something skip it.
441
438
  next unless space.thermalZone.empty?
442
- #find adjacent spaces to the current space.
439
+
440
+ # find adjacent spaces to the current space.
443
441
  adj_spaces = space_get_adjacent_spaces_with_shared_wall_areas(space, true)
444
- adj_spaces = adj_spaces.map {|key, value| key}
442
+ adj_spaces = adj_spaces.map { |key, value| key }
445
443
 
446
444
  # find unassigned adjacent wild spaces that have not been assigned that have the same multiplier these will be
447
445
  # lumped together in the same zone.
448
- wild_adjacent_spaces = adj_spaces.select {|adj_space|
449
- is_an_necb_wildcard_space?(adj_space) and
450
- not is_an_necb_wet_space?(adj_space) and
451
- adj_space.thermalZone.empty? and
452
- space_multiplier_map[space.name.to_s] == space_multiplier_map[adj_space.name.to_s]
453
- }
454
- #put them all together.
446
+ wild_adjacent_spaces = adj_spaces.select do |adj_space|
447
+ is_an_necb_wildcard_space?(adj_space) &&
448
+ !is_an_necb_wet_space?(adj_space) &&
449
+ adj_space.thermalZone.empty? &&
450
+ (space_multiplier_map[space.name.to_s] == space_multiplier_map[adj_space.name.to_s])
451
+ end
452
+ # put them all together.
455
453
  wild_adjacent_spaces << space
456
454
 
457
455
  # Get adjacent candidate foster zones. Must not be a wildcard space and must not be linked to another space incase
458
456
  # it is part of a mirrored space.
459
457
  other_adjacent_spaces = adj_spaces.select do |adj_space|
460
- is_an_necb_wildcard_space?(adj_space) == false and
461
- adj_space.thermalZone.get.spaces.size == 1 and
462
- space_multiplier_map[space.name.to_s] == space_multiplier_map[adj_space.name.to_s]
458
+ (is_an_necb_wildcard_space?(adj_space) == false) &&
459
+ (adj_space.thermalZone.get.spaces.size == 1) &&
460
+ (space_multiplier_map[space.name.to_s] == space_multiplier_map[adj_space.name.to_s])
463
461
  end
464
462
 
465
- #If there are adjacent spaces that fit the above criteria.
463
+ # If there are adjacent spaces that fit the above criteria.
466
464
  # We will need to set each space to the dominant floor schedule by setting the spaces spacetypes to that
467
465
  # schedule version and eventually set it to a system 4
468
466
  unless other_adjacent_spaces.empty?
469
- #assign the space(s) to the adjacent thermal zone.
467
+ # assign the space(s) to the adjacent thermal zone.
470
468
  schedule_type = determine_dominant_schedule(space.buildingStory.get.spaces)
471
469
  zone = other_adjacent_spaces.first.thermalZone.get
472
- wild_adjacent_spaces.each do |space|
473
- adjust_wildcard_spacetype_schedule(space, schedule_type, @lights_type, @lights_scale, @space_height)
474
- space.setThermalZone(zone)
470
+ wild_adjacent_spaces.each do |curr_space|
471
+ adjust_wildcard_spacetype_schedule(curr_space, schedule_type, @lights_type, @lights_scale, @space_height)
472
+ curr_space.setThermalZone(zone)
475
473
  end
476
474
  end
477
475
 
478
- #create new TZ and set space to the zone.
476
+ # create new TZ and set space to the zone.
479
477
  zone = OpenStudio::Model::ThermalZone.new(model)
480
478
  space.setThermalZone(zone)
481
- zone.setName("Wild-ZN:BT=#{space.spaceType.get.standardsBuildingType.get}:ST=#{space.spaceType.get.standardsSpaceType.get}:FL=#{space.buildingStory().get.name}:")
482
- #Set multiplier from the original tz multiplier.
479
+ zone.setName("Wild-ZN:BT=#{space.spaceType.get.standardsBuildingType.get}:ST=#{space.spaceType.get.standardsSpaceType.get}:FL=#{space.buildingStory.get.name}:")
480
+ # Set multiplier from the original tz multiplier.
483
481
  unless space_multiplier_map[space.name.to_s].nil? || (space_multiplier_map[space.name.to_s] == 1)
484
482
  zone.setMultiplier(space_multiplier_map[space.name.to_s])
485
483
  end
486
484
 
487
485
  # Set space to dominant
488
486
 
489
- dominant_floor_schedule = determine_dominant_schedule(space.buildingStory().get.spaces)
490
- #this method will determine if the right schedule was used for this wet & wild space if not.. it will reset the space
487
+ dominant_floor_schedule = determine_dominant_schedule(space.buildingStory.get.spaces)
488
+ # this method will determine if the right schedule was used for this wet & wild space if not.. it will reset the space
491
489
  # to use the correct schedule version of the wet and wild space type.
492
- adjust_wildcard_spacetype_schedule(space, dominant_floor_schedule, @lights_type, @lights_scale, @space_height)
493
- #Find spacetype thermostat and assign it to the zone.
490
+ adjust_wildcard_spacetype_schedule(space: space, schedule: dominant_floor_schedule, lights_type: @lights_type, lights_scale: @lights_scale)
491
+ # Find spacetype thermostat and assign it to the zone.
494
492
  thermostat_name = space.spaceType.get.name.get + ' Thermostat'
495
493
  thermostat = model.getThermostatSetpointDualSetpointByName(thermostat_name)
496
494
  if thermostat.empty?
@@ -504,11 +502,11 @@ class NECB2011
504
502
  ideal_loads.addToThermalZone(zone)
505
503
  end
506
504
  # Go through other spaces to see if there are similar spaces with similar loads on the same floor that can be grouped.
507
- model.getSpaces.select {|s| is_an_necb_wildcard_space?(s) and not is_an_necb_wet_space?(s)}.each do |space_target|
505
+ model.getSpaces.select { |s| is_an_necb_wildcard_space?(s) && !is_an_necb_wet_space?(s) }.each do |space_target|
508
506
  if space_target.thermalZone.empty?
509
507
  if are_space_loads_similar?(space_1: space, space_2: space_target) &&
510
- space.buildingStory().get == space_target.buildingStory().get # added since chris needs zones to not span floors for costing.
511
- adjust_wildcard_spacetype_schedule(space_target, dominant_floor_schedule, @lights_type, @lights_scale, @space_height)
508
+ space.buildingStory.get == space_target.buildingStory.get # added since chris needs zones to not span floors for costing.
509
+ adjust_wildcard_spacetype_schedule(space: space_target, schedule: dominant_floor_schedule, lights_type: @lights_type, lights_scale: @lights_scale)
512
510
  space_target.setThermalZone(zone)
513
511
  end
514
512
  end
@@ -520,9 +518,10 @@ class NECB2011
520
518
 
521
519
  # This method will determine if the loads on a zone are similar. (Exposure, space type, space loads, and schedules, etc)
522
520
  def are_zone_loads_similar?(zone_1:, zone_2:)
523
- #make sure they have the same number of spaces.
521
+ # make sure they have the same number of spaces.
524
522
  truthes = []
525
523
  return false if zone_1.spaces.size != zone_2.spaces.size
524
+
526
525
  zone_1.spaces.each do |space_1|
527
526
  zone_2.spaces.each do |space_2|
528
527
  if are_space_loads_similar?(space_1: space_1, space_2: space_2)
@@ -530,7 +529,7 @@ class NECB2011
530
529
  end
531
530
  end
532
531
  end
533
- #truthes sizes should be the same as the # of spaces if all spaces are similar.
532
+ # truthes sizes should be the same as the # of spaces if all spaces are similar.
534
533
  return truthes.size == zone_1.spaces.size
535
534
  end
536
535
 
@@ -547,129 +546,130 @@ class NECB2011
547
546
  return false if space_2.spaceType.empty?
548
547
  # ensure that they have the same spacetype.
549
548
  return false unless space_1.spaceType.get == space_2.spaceType.get
549
+
550
550
  # Perform surface comparision. If ranges are within percent_difference_tolerance.. they can be considered the same.
551
551
  space_1_floor_area = space_1.floorArea
552
552
  space_2_floor_area = space_2.floorArea
553
553
  space_1_surface_report = space_surface_report(space_1)
554
554
  space_2_surface_report = space_surface_report(space_2)
555
- #Spaces should have the same number of surface orientations.
555
+ # Spaces should have the same number of surface orientations.
556
556
  return false unless space_1_surface_report.size == space_2_surface_report.size
557
- #spaces should have similar loads
558
- return false unless self.percentage_difference(stored_space_heating_load(space_1), stored_space_heating_load(space_2)) <= heating_load_percent_difference_tolerance
559
- #Each surface should match
557
+ # spaces should have similar loads
558
+ return false unless percentage_difference(stored_space_heating_load(space_1), stored_space_heating_load(space_2)) <= heating_load_percent_difference_tolerance
559
+
560
+ # Each surface should match
560
561
  space_1_surface_report.each do |space_1_surface|
561
562
  surface_match = space_2_surface_report.detect do |space_2_surface|
562
563
  space_1_surface[:surface_type] == space_2_surface[:surface_type] &&
563
- space_1_surface[:boundary_condition] == space_2_surface[:boundary_condition] &&
564
- self.percentage_difference(space_1_surface[:tilt], space_2_surface[:tilt]) <= angular_percent_difference_tolerance &&
565
- self.percentage_difference(space_1_surface[:azimuth], space_2_surface[:azimuth]) <= angular_percent_difference_tolerance &&
566
- self.percentage_difference(space_1_surface[:surface_area_to_floor_ratio],
567
- space_2_surface[:surface_area_to_floor_ratio]) <= surface_percent_difference_tolerance &&
568
- self.percentage_difference(space_1_surface[:glazed_subsurface_area_to_floor_ratio],
569
- space_2_surface[:glazed_subsurface_area_to_floor_ratio]) <= surface_percent_difference_tolerance &&
570
- self.percentage_difference(space_1_surface[:opaque_subsurface_area_to_floor_ratio],
571
- space_2_surface[:opaque_subsurface_area_to_floor_ratio]) <= surface_percent_difference_tolerance
572
-
564
+ space_1_surface[:boundary_condition] == space_2_surface[:boundary_condition] &&
565
+ percentage_difference(space_1_surface[:tilt], space_2_surface[:tilt]) <= angular_percent_difference_tolerance &&
566
+ percentage_difference(space_1_surface[:azimuth], space_2_surface[:azimuth]) <= angular_percent_difference_tolerance &&
567
+ percentage_difference(space_1_surface[:surface_area_to_floor_ratio],
568
+ space_2_surface[:surface_area_to_floor_ratio]) <= surface_percent_difference_tolerance &&
569
+ percentage_difference(space_1_surface[:glazed_subsurface_area_to_floor_ratio],
570
+ space_2_surface[:glazed_subsurface_area_to_floor_ratio]) <= surface_percent_difference_tolerance &&
571
+ percentage_difference(space_1_surface[:opaque_subsurface_area_to_floor_ratio],
572
+ space_2_surface[:opaque_subsurface_area_to_floor_ratio]) <= surface_percent_difference_tolerance
573
573
  end
574
574
  return false if surface_match.nil?
575
575
  end
576
576
  return true
577
577
  end
578
578
 
579
- #This method gathers the surface information for the space to determine if spaces are the same.
579
+ # This method gathers the surface information for the space to determine if spaces are the same.
580
580
  def space_surface_report(space)
581
581
  surface_report = []
582
582
  space_floor_area = space.floorArea
583
583
  ['Outdoors', 'Ground'].each do |bc|
584
584
  surfaces = BTAP::Geometry::Surfaces.filter_by_boundary_condition(space.surfaces, [bc]).each do |surface|
585
- #sum wall area and subsurface area by direction. This is the old way so excluding top and bottom surfaces.
586
- #new way
587
- glazings = BTAP::Geometry::Surfaces::filter_subsurfaces_by_types(surface.subSurfaces, ["FixedWindow",
588
- "OperableWindow",
589
- "GlassDoor",
590
- "Skylight",
591
- "TubularDaylightDiffuser",
592
- "TubularDaylightDome"])
593
- doors = BTAP::Geometry::Surfaces::filter_subsurfaces_by_types(surface.subSurfaces, ["Door",
594
- "OverheadDoor"])
585
+ # sum wall area and subsurface area by direction. This is the old way so excluding top and bottom surfaces.
586
+ # new way
587
+ glazings = BTAP::Geometry::Surfaces.filter_subsurfaces_by_types(surface.subSurfaces, ['FixedWindow',
588
+ 'OperableWindow',
589
+ 'GlassDoor',
590
+ 'Skylight',
591
+ 'TubularDaylightDiffuser',
592
+ 'TubularDaylightDome'])
593
+ doors = BTAP::Geometry::Surfaces.filter_subsurfaces_by_types(surface.subSurfaces, ['Door',
594
+ 'OverheadDoor'])
595
595
  azimuth = (surface.azimuth() * 180.0 / Math::PI)
596
596
  tilt = (surface.tilt() * 180.0 / Math::PI)
597
- surface_data = surface_report.detect do |surface_data|
598
- surface_data[:surface_type] == surface.surfaceType &&
599
- surface_data[:azimuth] == azimuth &&
600
- surface_data[:tilt] == tilt &&
601
- surface_data[:boundary_condition] == bc
597
+ surface_data = surface_report.detect do |curr_surface_data|
598
+ curr_surface_data[:surface_type] == surface.surfaceType &&
599
+ curr_surface_data[:azimuth] == azimuth &&
600
+ curr_surface_data[:tilt] == tilt &&
601
+ curr_surface_data[:boundary_condition] == bc
602
602
  end
603
603
 
604
604
  if surface_data.nil?
605
605
  surface_data = {
606
- surface_type: surface.surfaceType,
607
- azimuth: azimuth,
608
- tilt: tilt,
609
- boundary_condition: bc,
610
- surface_area: 0,
611
- surface_area_to_floor_ratio: 0,
612
- glazed_subsurface_area: 0,
613
- glazed_subsurface_area_to_floor_ratio: 0,
614
- opaque_subsurface_area: 0,
615
- opaque_subsurface_area_to_floor_ratio: 0
606
+ surface_type: surface.surfaceType,
607
+ azimuth: azimuth,
608
+ tilt: tilt,
609
+ boundary_condition: bc,
610
+ surface_area: 0,
611
+ surface_area_to_floor_ratio: 0,
612
+ glazed_subsurface_area: 0,
613
+ glazed_subsurface_area_to_floor_ratio: 0,
614
+ opaque_subsurface_area: 0,
615
+ opaque_subsurface_area_to_floor_ratio: 0
616
616
  }
617
617
  surface_report << surface_data
618
618
  end
619
619
  surface_data[:surface_area] += surface.grossArea.to_i
620
620
  surface_data[:surface_area_to_floor_ratio] += surface.grossArea / space.floorArea
621
621
 
622
- surface_data[:glazed_subsurface_area] += glazings.map {|subsurface| subsurface.grossArea * subsurface.multiplier}.inject(0) {|sum, x| sum + x}.to_i
623
- surface_data[:glazed_subsurface_area_to_floor_ratio] += glazings.map {|subsurface| subsurface.grossArea * subsurface.multiplier}.inject(0) {|sum, x| sum + x} / space.floorArea
622
+ surface_data[:glazed_subsurface_area] += glazings.map { |subsurface| subsurface.grossArea * subsurface.multiplier }.inject(0) { |sum, x| sum + x }.to_i
623
+ surface_data[:glazed_subsurface_area_to_floor_ratio] += glazings.map { |subsurface| subsurface.grossArea * subsurface.multiplier }.inject(0) { |sum, x| sum + x } / space.floorArea
624
624
 
625
- surface_data[:surface_area] += doors.map {|subsurface| subsurface.grossArea * subsurface.multiplier}.inject(0) {|sum, x| sum + x}.to_i
626
- surface_data[:surface_area_to_floor_ratio] += doors.map {|subsurface| subsurface.grossArea * subsurface.multiplier}.inject(0) {|sum, x| sum + x} / space.floorArea
625
+ surface_data[:surface_area] += doors.map { |subsurface| subsurface.grossArea * subsurface.multiplier }.inject(0) { |sum, x| sum + x }.to_i
626
+ surface_data[:surface_area_to_floor_ratio] += doors.map { |subsurface| subsurface.grossArea * subsurface.multiplier }.inject(0) { |sum, x| sum + x } / space.floorArea
627
627
  end
628
628
  end
629
- surface_report.sort! {|a, b| [a[:surface_type], a[:azimuth], a[:tilt], a[:boundary_condition]] <=> [b[:surface_type], b[:azimuth], b[:tilt], b[:boundary_condition]]}
629
+ surface_report.sort! { |a, b| [a[:surface_type], a[:azimuth], a[:tilt], a[:boundary_condition]] <=> [b[:surface_type], b[:azimuth], b[:tilt], b[:boundary_condition]] }
630
630
 
631
631
  return surface_report
632
632
  end
633
633
 
634
- #Check to see if this is a wildcard space that the NECB does not have a specified schedule or system for.
634
+ # Check to see if this is a wildcard space that the NECB does not have a specified schedule or system for.
635
635
  def is_an_necb_wildcard_space?(space)
636
636
  space_type_table = @standards_data['space_types']
637
637
  space_type_data = model_find_object(space_type_table,
638
- {'template' => self.class.name,
639
- 'space_type' => space.spaceType.get.standardsSpaceType.get,
640
- 'building_type' => space.spaceType.get.standardsBuildingType.get})
641
- raise("#{space}") if space_type_data.nil?
642
- return space_type_data["necb_hvac_system_selection_type"] == "Wildcard"
638
+ 'template' => self.class.name,
639
+ 'space_type' => space.spaceType.get.standardsSpaceType.get,
640
+ 'building_type' => space.spaceType.get.standardsBuildingType.get)
641
+ raise(space.to_s) if space_type_data.nil?
642
+
643
+ return space_type_data['necb_hvac_system_selection_type'] == 'Wildcard'
643
644
  end
644
645
 
645
646
  # Check to see if this is a wet space that the NECB does not have a specified schedule or system for. Currently hardcoded to
646
647
  # Locker room and washroom.
647
648
  def is_an_necb_wet_space?(space)
648
- #Hack! Should replace this with a proper table lookup.
649
+ # Hack! Should replace this with a proper table lookup.
649
650
  return space.spaceType.get.standardsSpaceType.get.include?('Locker room') || space.spaceType.get.standardsSpaceType.get.include?('Washroom')
650
651
  end
651
652
 
652
653
  # Check to see if this is a wet space that the NECB does not have a specified schedule or system for. Currently hardcoded to
653
654
  # Locker room and washroom.
654
655
  def is_an_necb_storage_space?(space)
655
- #Hack! Should replace this with a proper table lookup.
656
+ # Hack! Should replace this with a proper table lookup.
656
657
  return space.spaceType.get.standardsSpaceType.get.include?('Storage')
657
658
  end
658
659
 
659
-
660
660
  # Check if the space spactype is a dwelling unit as per NECB.
661
661
  def is_a_necb_dwelling_unit?(space)
662
662
  space_type_table = @standards_data['space_types']
663
663
  space_type_data = model_find_object(space_type_table,
664
- {'template' => self.class.name,
665
- 'space_type' => space.spaceType.get.standardsSpaceType.get,
666
- 'building_type' => space.spaceType.get.standardsBuildingType.get})
664
+ 'template' => self.class.name,
665
+ 'space_type' => space.spaceType.get.standardsSpaceType.get,
666
+ 'building_type' => space.spaceType.get.standardsBuildingType.get)
667
667
 
668
668
  necb_hvac_system_selection_table = @standards_data['necb_hvac_system_selection_type']
669
- necb_hvac_system_select = necb_hvac_system_selection_table.detect do |necb_hvac_system_select|
670
- necb_hvac_system_select['necb_hvac_system_selection_type'] == space_type_data['necb_hvac_system_selection_type'] &&
671
- necb_hvac_system_select['min_stories'] <= space.model.getBuilding.standardsNumberOfAboveGroundStories.get &&
672
- necb_hvac_system_select['max_stories'] >= space.model.getBuilding.standardsNumberOfAboveGroundStories.get
669
+ necb_hvac_system_select = necb_hvac_system_selection_table.detect do |curr_necb_hvac_system_select|
670
+ curr_necb_hvac_system_select['necb_hvac_system_selection_type'] == space_type_data['necb_hvac_system_selection_type'] &&
671
+ curr_necb_hvac_system_select['min_stories'] <= space.model.getBuilding.standardsNumberOfAboveGroundStories.get &&
672
+ curr_necb_hvac_system_select['max_stories'] >= space.model.getBuilding.standardsNumberOfAboveGroundStories.get
673
673
  end
674
674
  return necb_hvac_system_select['dwelling'] == true
675
675
  end
@@ -677,21 +677,24 @@ class NECB2011
677
677
  # Determines what system index number is required for the space's spacetype by NECB rules.
678
678
  def get_necb_spacetype_system_selection(space)
679
679
  space_type_table = @standards_data['space_types']
680
- space_type_data = model_find_object(space_type_table, {'space_type' => space.spaceType.get.standardsSpaceType.get,
681
- 'building_type' => space.spaceType.get.standardsBuildingType.get})
682
- raise("Could not find space_type_data for #{{'space_type' => space.spaceType.get.standardsSpaceType.get,
683
- 'building_type' => space.spaceType.get.standardsBuildingType.get}} ")if space_type_data.nil?
680
+ space_type_data = model_find_object(space_type_table, 'space_type' => space.spaceType.get.standardsSpaceType.get,
681
+ 'building_type' => space.spaceType.get.standardsBuildingType.get)
682
+ if space_type_data.nil?
683
+ raise("Could not find space_type_data for #{{ 'space_type' => space.spaceType.get.standardsSpaceType.get,
684
+ 'building_type' => space.spaceType.get.standardsBuildingType.get }} ")
685
+ end
684
686
 
685
687
  # identify space-system_index and assign the right NECB system type 1-7.
686
688
  necb_hvac_system_selection_table = @standards_data['necb_hvac_system_selection_type']
687
- necb_hvac_system_select = necb_hvac_system_selection_table.detect do |necb_hvac_system_select|
688
- necb_hvac_system_select['necb_hvac_system_selection_type'] == space_type_data['necb_hvac_system_selection_type'] &&
689
- necb_hvac_system_select['min_stories'] <= space.model.getBuilding.standardsNumberOfAboveGroundStories.get &&
690
- necb_hvac_system_select['max_stories'] >= space.model.getBuilding.standardsNumberOfAboveGroundStories.get &&
691
- necb_hvac_system_select['min_cooling_capacity_kw'] <= self.stored_space_cooling_load(space) &&
692
- necb_hvac_system_select['max_cooling_capacity_kw'] >= self.stored_space_cooling_load(space)
689
+ necb_hvac_system_select = necb_hvac_system_selection_table.detect do |curr_necb_hvac_system_select|
690
+ curr_necb_hvac_system_select['necb_hvac_system_selection_type'] == space_type_data['necb_hvac_system_selection_type'] &&
691
+ curr_necb_hvac_system_select['min_stories'] <= space.model.getBuilding.standardsNumberOfAboveGroundStories.get &&
692
+ curr_necb_hvac_system_select['max_stories'] >= space.model.getBuilding.standardsNumberOfAboveGroundStories.get &&
693
+ curr_necb_hvac_system_select['min_cooling_capacity_kw'] <= stored_space_cooling_load(space) &&
694
+ curr_necb_hvac_system_select['max_cooling_capacity_kw'] >= stored_space_cooling_load(space)
693
695
  end
694
- raise("could not find system for given spacetype") if necb_hvac_system_select.nil?
696
+ raise('could not find system for given spacetype') if necb_hvac_system_select.nil?
697
+
695
698
  return necb_hvac_system_select['system_type']
696
699
  end
697
700
 
@@ -703,20 +706,22 @@ class NECB2011
703
706
  end
704
707
  systems.uniq!
705
708
  systems.compact!
706
- raise("This thermal zone spaces require different systems.") if systems.size > 1
709
+ raise('This thermal zone spaces require different systems.') if systems.size > 1
710
+
707
711
  return systems.first
708
712
  end
709
713
 
710
714
  # Math fundtion to determine percent difference.
711
715
  def percentage_difference(value_1, value_2)
712
716
  return 0.0 if value_1 == value_2
717
+
713
718
  return ((value_1 - value_2).abs / ((value_1 + value_2) / 2) * 100)
714
719
  end
715
720
 
716
721
  # Set wildcard spactype schedule to NECB letter index.
717
722
  def adjust_wildcard_spacetype_schedule(space:, schedule:, lights_type: 'NECB_Default', lights_scale: 1.0)
718
723
  if space.spaceType.empty?
719
- OpenStudio.logFree(OpenStudio::Error, 'Error: No spacetype assigned for #{space.name.get}. This must be assigned. Aborting.')
724
+ OpenStudio.logFree(OpenStudio::Error, "Error: No spacetype assigned for #{space.name.get}. This must be assigned. Aborting.")
720
725
  end
721
726
  # Get current spacetype name
722
727
  space_type_name = space.spaceType.get.standardsSpaceType.get.to_s
@@ -725,13 +730,13 @@ class NECB2011
725
730
  new_spacetype_name = "#{space_type_name.match(regex).captures.first}#{schedule}"
726
731
  new_spacetype = nil
727
732
 
728
- #if the new spacetype does not match the old space type. we gotta update the space with the new spacetype.
733
+ # if the new spacetype does not match the old space type. we gotta update the space with the new spacetype.
729
734
  if space_type_name != new_spacetype_name
730
735
  new_spacetype = space.model.getSpaceTypes.detect do |spacetype|
731
- (not spacetype.standardsBuildingType.empty?) and #need to do this to prevent an exception.
732
- spacetype.standardsBuildingType.get == space.spaceType.get.standardsBuildingType.get and
733
- (not spacetype.standardsSpaceType.empty?) and #need to do this to prevent an exception.
734
- spacetype.standardsSpaceType.get == new_spacetype_name
736
+ !spacetype.standardsBuildingType.empty? && # need to do this to prevent an exception.
737
+ (spacetype.standardsBuildingType.get == space.spaceType.get.standardsBuildingType.get) &&
738
+ !spacetype.standardsSpaceType.empty? && # need to do this to prevent an exception.
739
+ (spacetype.standardsSpaceType.get == new_spacetype_name)
735
740
  end
736
741
  if new_spacetype.nil?
737
742
  # Space type is not in model. need to create from scratch.
@@ -743,14 +748,14 @@ class NECB2011
743
748
  space_type_apply_internal_load_schedules(new_spacetype, true, true, true, true, true, true, true)
744
749
  end
745
750
  space.setSpaceType(new_spacetype)
746
- #sanity check.
747
- raise ("could not reassign space type schedule.") if schedule != space.spaceType.get.name.get.match(regex)[2]
751
+ # sanity check.
752
+ raise 'could not reassign space type schedule.' if schedule != space.spaceType.get.name.get.match(regex)[2]
748
753
  end
749
754
  return space
750
755
  end
751
756
 
752
757
  def set_wildcard_schedules_to_dominant_building_schedule(model, runner = nil)
753
- #Get rid of.
758
+ # Get rid of.
754
759
  end
755
760
 
756
761
  def determine_dominant_schedule(spaces)
@@ -780,15 +785,14 @@ class NECB2011
780
785
  'Q', 0
781
786
  ]
782
787
  # iterate through spaces in building.
783
- spaces.select {|space| not is_an_necb_wildcard_space?(space) and not space.spaceType.get.standardsSpaceType.get == '- undefined -'}.each do |space|
784
-
788
+ spaces.select { |space| !is_an_necb_wildcard_space?(space) && (space.spaceType.get.standardsSpaceType.get != '- undefined -') }.each do |space|
785
789
  # Ensure space floors are multiplied.
786
790
  mult = @space_multiplier_map[space.name.to_s].nil? ? 1.0 : @space_multiplier_map[space.name.to_s]
787
791
  # puts "this #{determine_necb_schedule_type(space)}"
788
792
  schedule_hash[determine_necb_schedule_type(space)] += space.floorArea * mult
789
793
  end
790
794
  # finds max value and returns NECB schedule letter.
791
- #determine dominant letter schedule.
795
+ # determine dominant letter schedule.
792
796
  return schedule_hash.max_by(&:last).first
793
797
  end
794
798
 
@@ -807,7 +811,8 @@ class NECB2011
807
811
  spacetype_data = @standards_data['space_types']
808
812
  raise "Spacetype not defined for space #{space.get.name}) if space.spaceType.empty?" if space.spaceType.empty?
809
813
  raise "Undefined standardsSpaceType or StandardsBuildingType for space #{space.spaceType.get.name}) if space.spaceType.empty?" if space.spaceType.get.standardsSpaceType.empty? | space.spaceType.get.standardsBuildingType.empty?
810
- space_type_properties = spacetype_data.detect {|st| (st['space_type'] == space.spaceType.get.standardsSpaceType.get) && (st['building_type'] == space.spaceType.get.standardsBuildingType.get)}
814
+
815
+ space_type_properties = spacetype_data.detect { |st| (st['space_type'] == space.spaceType.get.standardsSpaceType.get) && (st['building_type'] == space.spaceType.get.standardsBuildingType.get) }
811
816
  return space_type_properties['necb_schedule_type'].strip
812
817
  end
813
818
 
@@ -815,34 +820,35 @@ class NECB2011
815
820
 
816
821
  # Method will create a hot water loop if systems default fuel and medium sources require it.
817
822
  def create_hw_loop_if_required(baseboard_type, boiler_fueltype, mau_heating_coil_type, model)
818
- #get systems that will be used in the model based on the space types to determine if a hw_loop is required.
823
+ # get systems that will be used in the model based on the space types to determine if a hw_loop is required.
819
824
  systems_used = []
820
825
  model.getSpaces.sort.each do |space|
821
826
  systems_used << get_necb_spacetype_system_selection(space)
822
827
  systems_used.uniq!
823
828
  end
824
829
 
825
- #See if we need to create a hot water loop based on fueltype and systems used.
830
+ # See if we need to create a hot water loop based on fueltype and systems used.
826
831
  hw_loop_needed = false
827
832
  systems_used.each do |system|
828
833
  case system.to_s
829
834
  when '2', '5', '7'
830
835
  hw_loop_needed = true
831
836
  when '1', '6'
832
- if mau_heating_coil_type == 'Hot Water' or baseboard_type == 'Hot Water'
837
+ if (mau_heating_coil_type == 'Hot Water') || (baseboard_type == 'Hot Water')
833
838
  hw_loop_needed = true
834
839
  end
835
840
  when '3', '4'
836
- if mau_heating_coil_type == 'Hot Water' or baseboard_type == 'Hot Water'
837
- hw_loop_needed = true if (baseboard_type == 'Hot Water')
841
+ if (mau_heating_coil_type == 'Hot Water') || (baseboard_type == 'Hot Water')
842
+ hw_loop_needed = true if baseboard_type == 'Hot Water'
838
843
  end
839
844
  end
840
845
  if hw_loop_needed
841
846
  # just need one true condition to need a boiler.
842
847
  break
843
848
  end
844
- end # each
845
- #create hw_loop as needed.. Assuming one loop per model.
849
+ # each
850
+ end
851
+ # create hw_loop as needed.. Assuming one loop per model.
846
852
  if hw_loop_needed
847
853
  @hw_loop = OpenStudio::Model::PlantLoop.new(model)
848
854
  always_on = model.alwaysOnDiscreteSchedule
@@ -874,16 +880,16 @@ class NECB2011
874
880
  system_zones_hash[get_necb_thermal_zone_system_selection(zone)] = [] if system_zones_hash[get_necb_thermal_zone_system_selection(zone)].nil?
875
881
  system_zones_hash[get_necb_thermal_zone_system_selection(zone)] << zone
876
882
  end
877
- #puts JSON.pretty_generate(system_zones_hash)
883
+ # puts JSON.pretty_generate(system_zones_hash)
878
884
  # go through each system and zones pairs to
879
- system_zones_hash.each_pair do |system, zones|
885
+ system_zones_hash.each_pair do |system, sys_zones|
880
886
  case system
881
887
  when 0, nil
882
888
  # Do nothing no system assigned to zone. Used for Unconditioned spaces
883
889
  when 1
884
- group_similar_zones_together(zones).each do |zones|
890
+ group_similar_zones_together(sys_zones).each do |curr_zones|
885
891
  mau_air_loop = add_sys1_unitary_ac_baseboard_heating(model: model,
886
- zones: zones,
892
+ zones: curr_zones,
887
893
  mau_type: mau_type,
888
894
  mau_heating_coil_type: mau_heating_coil_type,
889
895
  baseboard_type: baseboard_type,
@@ -891,41 +897,41 @@ class NECB2011
891
897
  multispeed: false)
892
898
  end
893
899
  when 2
894
- group_similar_zones_together(zones).each do |zones|
900
+ group_similar_zones_together(sys_zones).each do |curr_zones|
895
901
  add_sys2_FPFC_sys5_TPFC(model: model,
896
- zones: zones,
902
+ zones: curr_zones,
897
903
  chiller_type: chiller_type,
898
904
  mau_cooling_type: mau_cooling_type,
899
905
  fan_coil_type: 'FPFC',
900
906
  hw_loop: @hw_loop)
901
907
  end
902
908
  when 3
903
- group_similar_zones_together(zones).each do |zones|
909
+ group_similar_zones_together(sys_zones).each do |curr_zones|
904
910
  add_sys3and8_single_zone_packaged_rooftop_unit_with_baseboard_heating(model: model,
905
- zones: zones,
911
+ zones: curr_zones,
906
912
  heating_coil_type: heating_coil_type_sys3,
907
913
  baseboard_type: baseboard_type,
908
914
  hw_loop: @hw_loop,
909
915
  multispeed: false)
910
916
  end
911
917
  when 4
912
- group_similar_zones_together(zones).each do |zones|
918
+ group_similar_zones_together(sys_zones).each do |curr_zones|
913
919
  add_sys4_single_zone_make_up_air_unit_with_baseboard_heating(model: model,
914
- zones: zones,
920
+ zones: curr_zones,
915
921
  heating_coil_type: heating_coil_type_sys4,
916
922
  baseboard_type: baseboard_type,
917
923
  hw_loop: @hw_loop)
918
- # add_sys3and8_single_zone_packaged_rooftop_unit_with_baseboard_heating(model: model,
919
- # zones: zones,
920
- # heating_coil_type: heating_coil_type_sys4,
921
- # baseboard_type: baseboard_type,
922
- # hw_loop: @hw_loop,
923
- # multispeed: false)
924
+ # add_sys3and8_single_zone_packaged_rooftop_unit_with_baseboard_heating(model: model,
925
+ # zones: zones,
926
+ # heating_coil_type: heating_coil_type_sys4,
927
+ # baseboard_type: baseboard_type,
928
+ # hw_loop: @hw_loop,
929
+ # multispeed: false)
924
930
  end
925
931
  when 5
926
- group_similar_zones_together(zones).each do |zones|
932
+ group_similar_zones_together(sys_zones).each do |curr_zones|
927
933
  add_sys2_FPFC_sys5_TPFC(model: model,
928
- zones: zones,
934
+ zones: curr_zones,
929
935
  chiller_type: chiller_type,
930
936
  mau_cooling_type: mau_cooling_type,
931
937
  fan_coil_type: 'TPFC',
@@ -933,7 +939,7 @@ class NECB2011
933
939
  end
934
940
  when 6
935
941
  add_sys6_multi_zone_built_up_system_with_baseboard_heating(model: model,
936
- zones: zones,
942
+ zones: sys_zones,
937
943
  heating_coil_type: heating_coil_type_sys6,
938
944
  baseboard_type: baseboard_type,
939
945
  chiller_type: chiller_type,
@@ -941,9 +947,9 @@ class NECB2011
941
947
  hw_loop: @hw_loop)
942
948
 
943
949
  when 7
944
- group_similar_zones_together(zones).each do |zones|
950
+ group_similar_zones_together(sys_zones).each do |curr_zones|
945
951
  add_sys2_FPFC_sys5_TPFC(model: model,
946
- zones: zones,
952
+ zones: curr_zones,
947
953
  chiller_type: chiller_type,
948
954
  fan_coil_type: 'FPFC',
949
955
  mau_cooling_type: mau_cooling_type,
@@ -965,21 +971,20 @@ class NECB2011
965
971
  mau_cooling_type:,
966
972
  mau_heating_coil_type:,
967
973
  mau_type:,
968
- model:
969
- )
974
+ model:)
970
975
 
971
976
  zones = []
972
977
  other_spaces = model.getSpaces.select do |space|
973
- (not is_a_necb_dwelling_unit?(space)) and
974
- (not is_an_necb_wildcard_space?(space)) and
975
- (not is_an_necb_storage_space?(space))
978
+ !is_a_necb_dwelling_unit?(space) &&
979
+ !is_an_necb_wildcard_space?(space) &&
980
+ !is_an_necb_storage_space?(space)
976
981
  end
977
982
  other_spaces.each do |space|
978
983
  zones << space.thermalZone.get
979
984
  end
980
985
  zones.uniq!
981
986
 
982
- #since dwelling units are all zoned 1:1 to space:zone we simply add the zone to the appropriate btap system.
987
+ # since dwelling units are all zoned 1:1 to space:zone we simply add the zone to the appropriate btap system.
983
988
  create_necb_system(baseboard_type: baseboard_type,
984
989
  boiler_fueltype: boiler_fueltype,
985
990
  chiller_type: chiller_type,
@@ -1009,40 +1014,39 @@ class NECB2011
1009
1014
  mau_cooling_type:,
1010
1015
  mau_heating_coil_type:,
1011
1016
  mau_type:,
1012
- model:
1013
- )
1017
+ model:)
1014
1018
 
1015
1019
  system_zones_hash = {}
1016
1020
  # Detemine if dwelling units have a shared AHU. If user entered building stories > 4 then set to true.
1017
1021
  dwelling_shared_ahu = model.getBuilding.standardsNumberOfAboveGroundStories.get > 4
1018
1022
  # store dwelling zones into array
1019
1023
  zones = []
1020
- model.getSpaces.select {|space| is_a_necb_dwelling_unit?(space)}.each do |space|
1024
+ model.getSpaces.select { |space| is_a_necb_dwelling_unit?(space) }.each do |space|
1021
1025
  zones << space.thermalZone.get
1022
1026
  end
1023
1027
  zones.uniq!
1024
1028
 
1025
- #sort system 1 or 3 used for each dwelling unit as per T8.4.4.8.A NECB 2011-17
1029
+ # sort system 1 or 3 used for each dwelling unit as per T8.4.4.8.A NECB 2011-17
1026
1030
  zones.each do |zone|
1027
1031
  system_zones_hash[get_necb_thermal_zone_system_selection(zone)] = [] if system_zones_hash[get_necb_thermal_zone_system_selection(zone)].nil?
1028
1032
  system_zones_hash[get_necb_thermal_zone_system_selection(zone)] << zone
1029
1033
  end
1030
1034
 
1031
1035
  # go through each system and zones pairs to
1032
- system_zones_hash.each_pair do |system, zones|
1036
+ system_zones_hash.each_pair do |system, sys_zones|
1033
1037
  case system
1034
1038
  when 1
1035
1039
  if dwelling_shared_ahu
1036
1040
  add_sys1_unitary_ac_baseboard_heating(model: model,
1037
- zones: zones,
1041
+ zones: sys_zones,
1038
1042
  mau_type: mau_type,
1039
1043
  mau_heating_coil_type: mau_heating_coil_type,
1040
1044
  baseboard_type: baseboard_type,
1041
1045
  hw_loop: @hw_loop,
1042
1046
  multispeed: false)
1043
1047
  else
1044
- #Create a separate air loop for each unit.
1045
- zones.each do |zone|
1048
+ # Create a separate air loop for each unit.
1049
+ sys_zones.each do |zone|
1046
1050
  add_sys1_unitary_ac_baseboard_heating(model: model,
1047
1051
  zones: [zone],
1048
1052
  mau_type: mau_type,
@@ -1050,21 +1054,20 @@ class NECB2011
1050
1054
  baseboard_type: baseboard_type,
1051
1055
  hw_loop: @hw_loop,
1052
1056
  multispeed: false)
1053
-
1054
1057
  end
1055
1058
  end
1056
1059
 
1057
1060
  when 3
1058
1061
  if dwelling_shared_ahu
1059
1062
  add_sys3and8_single_zone_packaged_rooftop_unit_with_baseboard_heating(model: model,
1060
- zones: zones,
1063
+ zones: sys_zones,
1061
1064
  heating_coil_type: heating_coil_type_sys3,
1062
1065
  baseboard_type: baseboard_type,
1063
1066
  hw_loop: @hw_loop,
1064
1067
  multispeed: false)
1065
1068
  else
1066
- #Create a separate air loop for each unit.
1067
- zones.each do |zone|
1069
+ # Create a separate air loop for each unit.
1070
+ sys_zones.each do |zone|
1068
1071
  add_sys3and8_single_zone_packaged_rooftop_unit_with_baseboard_heating(model: model,
1069
1072
  zones: [zone],
1070
1073
  heating_coil_type: heating_coil_type_sys3,
@@ -1082,94 +1085,87 @@ class NECB2011
1082
1085
  boiler_fueltype:,
1083
1086
  heating_coil_type_sys4:,
1084
1087
  model:)
1085
- #Determine what zones are wet zones.
1088
+ # Determine what zones are wet zones.
1086
1089
  wet_tz = []
1087
- model.getSpaces.select {|space|
1088
- is_an_necb_wet_space?(space)}.each do |space|
1089
- wet_tz << space.thermalZone.get
1090
- end
1090
+ wet_spaces = model.getSpaces.select { |space| is_an_necb_wet_space?(space) }
1091
+ wet_spaces.each { |space| wet_tz << space.thermalZone.get }
1091
1092
  wet_tz.uniq!
1092
- #create a system 4 for the wet zones.
1093
- unless wet_tz.empty?
1094
- add_sys4_single_zone_make_up_air_unit_with_baseboard_heating(model: model,
1095
- zones: wet_tz,
1096
- heating_coil_type: heating_coil_type_sys4,
1097
- baseboard_type: baseboard_type,
1098
- hw_loop: @hw_loop)
1099
- # add_sys3and8_single_zone_packaged_rooftop_unit_with_baseboard_heating(model: model,
1100
- # zones: wet_tz,
1101
- # heating_coil_type: heating_coil_type_sys4,
1102
- # baseboard_type: baseboard_type,
1103
- # hw_loop: @hw_loop,
1104
- # multispeed: false)
1105
- end
1093
+ # create a system 4 for the wet zones.
1094
+ return if wet_tz.empty?
1095
+
1096
+ add_sys4_single_zone_make_up_air_unit_with_baseboard_heating(model: model,
1097
+ zones: wet_tz,
1098
+ heating_coil_type: heating_coil_type_sys4,
1099
+ baseboard_type: baseboard_type,
1100
+ hw_loop: @hw_loop)
1101
+ # add_sys3and8_single_zone_packaged_rooftop_unit_with_baseboard_heating(model: model,
1102
+ # zones: wet_tz,
1103
+ # heating_coil_type: heating_coil_type_sys4,
1104
+ # baseboard_type: baseboard_type,
1105
+ # hw_loop: @hw_loop,
1106
+ # multispeed: false)
1106
1107
  end
1107
1108
 
1108
-
1109
1109
  # All wet spaces will be on their own system 4 AHU.
1110
1110
  def auto_system_storage_spaces(baseboard_type:,
1111
1111
  boiler_fueltype:,
1112
1112
  heating_coil_type_sys4:,
1113
1113
  model:)
1114
- #Determine what zones are wet zones.
1114
+ # Determine what zones are storage zones.
1115
1115
  tz = []
1116
- model.getSpaces.select {|space|
1117
- is_an_necb_storage_space?(space)}.each do |space|
1118
- tz << space.thermalZone.get
1119
- end
1116
+ storage_spaces = model.getSpaces.select { |space| is_an_necb_storage_space?(space) }
1117
+ storage_spaces.each { |space| tz << space.thermalZone.get }
1120
1118
  tz.uniq!
1121
- #create a system 4 for the zones.
1122
- unless tz.empty?
1123
- add_sys4_single_zone_make_up_air_unit_with_baseboard_heating(model: model,
1124
- zones: tz,
1125
- heating_coil_type: heating_coil_type_sys4,
1126
- baseboard_type: baseboard_type,
1127
- hw_loop: @hw_loop)
1128
- # add_sys3and8_single_zone_packaged_rooftop_unit_with_baseboard_heating(model: model,
1129
- # zones: tz,
1130
- # heating_coil_type: heating_coil_type_sys4,
1131
- # baseboard_type: baseboard_type,
1132
- # hw_loop: @hw_loop,
1133
- # multispeed: true)
1134
- end
1135
- end
1136
1119
 
1120
+ return if tz.empty?
1121
+
1122
+ # create a system 4 for the zones.
1123
+ add_sys4_single_zone_make_up_air_unit_with_baseboard_heating(model: model,
1124
+ zones: tz,
1125
+ heating_coil_type: heating_coil_type_sys4,
1126
+ baseboard_type: baseboard_type,
1127
+ hw_loop: @hw_loop)
1128
+ # add_sys3and8_single_zone_packaged_rooftop_unit_with_baseboard_heating(model: model,
1129
+ # zones: tz,
1130
+ # heating_coil_type: heating_coil_type_sys4,
1131
+ # baseboard_type: baseboard_type,
1132
+ # hw_loop: @hw_loop,
1133
+ # multispeed: true)
1134
+ end
1137
1135
 
1138
1136
  # All wild spaces will be on a single system 4 ahu with the largests heating load zone being the control zone.
1139
1137
  def auto_system_wild_spaces(baseboard_type:,
1140
1138
  heating_coil_type_sys4:,
1141
- model:
1142
- )
1139
+ model:)
1143
1140
 
1144
1141
  zones = []
1145
- model.getSpaces.select {|space|
1146
- not is_an_necb_wet_space?(space) and is_an_necb_wildcard_space?(space)}.each do |space|
1147
- zones << space.thermalZone.get
1148
- end
1142
+ wild_spaces = model.getSpaces.select { |space| !is_an_necb_wet_space?(space) && is_an_necb_wildcard_space?(space) }
1143
+ wild_spaces.each { |space| zones << space.thermalZone.get }
1149
1144
  zones.uniq!
1150
- unless zones.empty?
1151
- #create a system 4 for the wild zones.
1152
- add_sys4_single_zone_make_up_air_unit_with_baseboard_heating(model: model,
1153
- zones: zones,
1154
- heating_coil_type: heating_coil_type_sys4,
1155
- baseboard_type: baseboard_type,
1156
- hw_loop: @hw_loop)
1157
- # add_sys3and8_single_zone_packaged_rooftop_unit_with_baseboard_heating(model: model,
1158
- # zones: zones,
1159
- # heating_coil_type: heating_coil_type_sys4,
1160
- # baseboard_type: baseboard_type,
1161
- # hw_loop: @hw_loop,
1162
- # multispeed: true)
1163
- end
1145
+
1146
+ return if zones.empty?
1147
+
1148
+ # create a system 4 for the wild zones.
1149
+ add_sys4_single_zone_make_up_air_unit_with_baseboard_heating(model: model,
1150
+ zones: zones,
1151
+ heating_coil_type: heating_coil_type_sys4,
1152
+ baseboard_type: baseboard_type,
1153
+ hw_loop: @hw_loop)
1154
+ # add_sys3and8_single_zone_packaged_rooftop_unit_with_baseboard_heating(model: model,
1155
+ # zones: zones,
1156
+ # heating_coil_type: heating_coil_type_sys4,
1157
+ # baseboard_type: baseboard_type,
1158
+ # hw_loop: @hw_loop,
1159
+ # multispeed: true)
1164
1160
  end
1165
1161
 
1166
- #This method will determine the control zone from the last sizing run space loads.
1162
+ # This method will determine the control zone from the last sizing run space loads.
1167
1163
  def determine_control_zone(zones)
1168
1164
  # In this case the control zone is the load with the largest heating loads. This may cause overheating of some zones.
1169
1165
  # but this is preferred to unmet heating.
1170
- #Iterate through zones.
1166
+ # Iterate through zones.
1171
1167
  zone_heating_load_hash = {}
1172
- zones.each {|zone| zone_heating_load_hash[zone] = self.stored_zone_heating_load(zone)}
1168
+ zones.each { |zone| zone_heating_load_hash[zone] = stored_zone_heating_load(zone) }
1173
1169
  return zone_heating_load_hash.max_by(&:last).first
1174
1170
  end
1175
1171
 
@@ -1182,6 +1178,7 @@ class NECB2011
1182
1178
  zones.each do |zone|
1183
1179
  similar_array_of_zones = []
1184
1180
  next if accounted_for.include?(zone.name.to_s)
1181
+
1185
1182
  similar_array_of_zones << zone
1186
1183
  accounted_for << zone.name.to_s
1187
1184
  zones.each do |zone_target|
@@ -1196,17 +1193,18 @@ class NECB2011
1196
1193
  array_of_array_of_zones << similar_array_of_zones
1197
1194
  end
1198
1195
  total_zones_output = 0
1199
- array_of_array_of_zones.each do |zones|
1200
- total_zones_output += zones.size
1196
+ array_of_array_of_zones.each do |curr_zones|
1197
+ total_zones_output += curr_zones.size
1201
1198
  end
1202
- #puts total_zones_output
1203
- #puts accounted_for.sort
1204
- #sanity check.
1199
+ # puts total_zones_output
1200
+ # puts accounted_for.sort
1201
+ # sanity check.
1205
1202
  if total_zones_output != total_zones_input
1206
- #puts JSON.pretty_generate(array_of_array_of_zones)
1207
- #puts JSON.pretty_generate(accounted_for.sort)
1208
- raise("#{}")
1203
+ # puts JSON.pretty_generate(array_of_array_of_zones)
1204
+ # puts JSON.pretty_generate(accounted_for.sort)
1205
+ raise('')
1209
1206
  end
1207
+
1210
1208
  return array_of_array_of_zones
1211
1209
  end
1212
1210