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,7 +1,7 @@
1
1
  # This class holds methods that apply NECB2011 rules.
2
2
  # @ref [References::NECB2011]
3
3
  class NECB2011 < Standard
4
- @template = self.new.class.name # rubocop:disable Style/ClassVars
4
+ @template = new.class.name
5
5
  register_standard(@template)
6
6
  attr_reader :template
7
7
  attr_accessor :standards_data
@@ -9,67 +9,63 @@ class NECB2011 < Standard
9
9
  attr_accessor :space_multiplier_map
10
10
 
11
11
  # This is a helper method to convert arguments that may support 'NECB_Default, and nils to convert to float'
12
- def convert_arg_to_f(variable:,default:)
13
- if variable.instance_of?(Numeric)
14
- return variable
15
- elsif variable.nil? or variable == 'NECB_Default'
16
- return default
17
- elsif variable.instance_of?(String)
18
- variable = variable.strip
19
- return variable.to_f
20
- end
21
- end
12
+ def convert_arg_to_f(variable:, default:)
13
+ return variable if variable.kind_of?(Numeric)
14
+ return default if variable.nil? || (variable == 'NECB_Default')
15
+ return unless variable.kind_of?(String)
22
16
 
17
+ variable = variable.strip
18
+ return variable.to_f
19
+ end
23
20
 
24
21
  def get_standards_table(table_name:)
25
- if @standards_data["tables"][table_name].nil?
22
+ if @standards_data['tables'][table_name].nil?
26
23
  message = "Could not find table #{table_name} in database."
27
24
  OpenStudio.logFree(OpenStudio::Error, 'openstudio.Standards.NECB', message)
28
25
  end
29
- @standards_data["tables"][table_name]
26
+ @standards_data['tables'][table_name]
30
27
  end
31
28
 
32
29
  def get_standard_constant_value(constant_name:)
33
- puts "do nothing"
30
+ puts 'do nothing'
34
31
  end
35
32
 
36
-
37
33
  # Combine the data from the JSON files into a single hash
38
34
  # Load JSON files differently depending on whether loading from
39
35
  # the OpenStudio CLI embedded filesystem or from typical gem installation
40
- def load_standards_database_new()
36
+ def load_standards_database_new
41
37
  @standards_data = {}
42
- @standards_data["tables"] = {}
38
+ @standards_data['tables'] = {}
43
39
 
44
40
  if __dir__[0] == ':' # Running from OpenStudio CLI
45
41
  embedded_files_relative('../common', /.*\.json/).each do |file|
46
42
  data = JSON.parse(EmbeddedScripting.getFileAsString(file))
47
- if not data["tables"].nil?
48
- @standards_data["tables"] = [*@standards_data["tables"], *data["tables"]].to_h
43
+ if !data['tables'].nil?
44
+ @standards_data['tables'] = [*@standards_data['tables'], *data['tables']].to_h
49
45
  else
50
46
  @standards_data[data.keys.first] = data[data.keys.first]
51
47
  end
52
48
  end
53
49
  else
54
50
  path = "#{File.dirname(__FILE__)}/../common/"
55
- raise ('Could not find common folder') unless Dir.exist?(path)
51
+ raise 'Could not find common folder' unless Dir.exist?(path)
52
+
56
53
  files = Dir.glob("#{path}/*.json").select { |e| File.file? e }
57
54
  files.each do |file|
58
55
  data = JSON.parse(File.read(file))
59
- if not data["tables"].nil?
60
- @standards_data["tables"] = [*@standards_data["tables"], *data["tables"]].to_h
56
+ if !data['tables'].nil?
57
+ @standards_data['tables'] = [*@standards_data['tables'], *data['tables']].to_h
61
58
  else
62
59
  @standards_data[data.keys.first] = data[data.keys.first]
63
60
  end
64
61
  end
65
62
  end
66
63
 
67
-
68
64
  if __dir__[0] == ':' # Running from OpenStudio CLI
69
65
  embedded_files_relative('data/', /.*\.json/).each do |file|
70
66
  data = JSON.parse(EmbeddedScripting.getFileAsString(file))
71
- if not data["tables"].nil?
72
- @standards_data["tables"] = [*@standards_data["tables"], *data["tables"]].to_h
67
+ if !data['tables'].nil?
68
+ @standards_data['tables'] = [*@standards_data['tables'], *data['tables']].to_h
73
69
  else
74
70
  @standards_data[data.keys.first] = data[data.keys.first]
75
71
  end
@@ -78,8 +74,8 @@ class NECB2011 < Standard
78
74
  files = Dir.glob("#{File.dirname(__FILE__)}/data/*.json").select { |e| File.file? e }
79
75
  files.each do |file|
80
76
  data = JSON.parse(File.read(file))
81
- if not data["tables"].nil?
82
- @standards_data["tables"] = [*@standards_data["tables"], *data["tables"]].to_h
77
+ if !data['tables'].nil?
78
+ @standards_data['tables'] = [*@standards_data['tables'], *data['tables']].to_h
83
79
  else
84
80
  @standards_data[data.keys.first] = data[data.keys.first]
85
81
  end
@@ -98,14 +94,13 @@ class NECB2011 < Standard
98
94
  # @return [ScheduleRuleset] the resulting schedule ruleset
99
95
  # @todo make return an OptionalScheduleRuleset
100
96
  def model_add_schedule(model, schedule_name)
101
-
102
97
  super(model, schedule_name)
103
98
  end
104
99
 
105
100
  def get_standards_constant(name)
106
101
  object = @standards_data['constants'][name]
107
102
 
108
- if object.nil? or object['value'].nil?
103
+ if object.nil? || object['value'].nil?
109
104
  raise("could not find #{name} in standards constants database. ")
110
105
  end
111
106
 
@@ -114,19 +109,19 @@ class NECB2011 < Standard
114
109
 
115
110
  def get_standards_formula(name)
116
111
  object = @standards_data['formulas'][name]
117
- raise("could not find #{name} in standards formual database. ") if object.nil? or object['value'].nil?
112
+ raise("could not find #{name} in standards formual database. ") if object.nil? || object['value'].nil?
113
+
118
114
  return object['value']
119
115
  end
120
116
 
121
-
122
117
  def initialize
123
118
  super()
124
119
  @template = self.class.name
125
- @standards_data = self.load_standards_database_new()
126
- self.corrupt_standards_database()
127
- #puts "loaded these tables..."
128
- #puts @standards_data.keys.size
129
- #raise("tables not all loaded in parent #{}") if @standards_data.keys.size < 24
120
+ @standards_data = load_standards_database_new
121
+ corrupt_standards_database
122
+ # puts "loaded these tables..."
123
+ # puts @standards_data.keys.size
124
+ # raise("tables not all loaded in parent #{}") if @standards_data.keys.size < 24
130
125
  end
131
126
 
132
127
  def get_all_spacetype_names
@@ -145,37 +140,37 @@ class NECB2011 < Standard
145
140
  lat1_rad, lon1_rad = loc1.map { |i| i * rad_per_deg }
146
141
  lat2_rad, lon2_rad = loc2.map { |i| i * rad_per_deg }
147
142
 
148
- a = Math.sin(dlat_rad / 2) ** 2 + Math.cos(lat1_rad) * Math.cos(lat2_rad) * Math.sin(dlon_rad / 2) ** 2
149
- c = 2 * Math::atan2(Math::sqrt(a), Math::sqrt(1 - a))
143
+ a = Math.sin(dlat_rad / 2)**2 + Math.cos(lat1_rad) * Math.cos(lat2_rad) * Math.sin(dlon_rad / 2)**2
144
+ c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a))
150
145
  rm * c # Delta in meters
151
146
  end
152
147
 
153
-
154
148
  def get_necb_hdd18(model)
155
149
  max_distance_tolerance = 500000
156
150
  min_distance = 100000000000000.0
157
151
  necb_closest = nil
158
152
  epw = BTAP::Environment::WeatherFile.new(model.weatherFile.get.path.get)
159
- #this extracts the table from the json database.
153
+ # this extracts the table from the json database.
160
154
  necb_2015_table_c1 = @standards_data['tables']['necb_2015_table_c1']['table']
161
155
  necb_2015_table_c1.each do |necb|
162
- next if necb['lat_long'].nil? #Need this until Tyson cleans up table.
156
+ next if necb['lat_long'].nil? # Need this until Tyson cleans up table.
157
+
163
158
  dist = distance([epw.latitude.to_f, epw.longitude.to_f], necb['lat_long'])
164
159
  if min_distance > dist
165
160
  min_distance = dist
166
161
  necb_closest = necb
167
162
  end
168
163
  end
169
- if (min_distance / 1000.0) > max_distance_tolerance and not epw.hdd18.nil?
164
+ if ((min_distance / 1000.0) > max_distance_tolerance) && !epw.hdd18.nil?
170
165
  puts "Could not find close NECB HDD from Table C1 < #{max_distance_tolerance}km. Closest city is #{min_distance / 1000.0}km away. Using epw hdd18 instead."
171
166
  return epw.hdd18.to_f
172
167
  else
173
- puts "INFO:NECB HDD18 of #{necb_closest['degree_days_below_18_c'].to_f} at nearest city #{necb_closest['city']},#{necb_closest['province']}, at a distance of #{'%.2f' % (min_distance / 1000.0)}km from epw location. Ref:necb_2015_table_c1"
168
+ dist_clause = "%.2f % #{(min_distance / 1000.0)}"
169
+ puts "INFO:NECB HDD18 of #{necb_closest['degree_days_below_18_c'].to_f} at nearest city #{necb_closest['city']},#{necb_closest['province']}, at a distance of " + dist_clause + 'km from epw location. Ref:necb_2015_table_c1'
174
170
  return necb_closest['degree_days_below_18_c'].to_f
175
171
  end
176
172
  end
177
173
 
178
-
179
174
  # This method is a wrapper to create the 16 archetypes easily. # 37 args
180
175
  def model_create_prototype_model(template:,
181
176
  building_type:,
@@ -212,8 +207,8 @@ class NECB2011 < Standard
212
207
  srr_set: -1.0,
213
208
  nv_type: nil,
214
209
  nv_opening_fraction: nil,
215
- nv_Tout_min: nil,
216
- nv_Delta_Tin_Tout: nil,
210
+ nv_temp_out_min: nil,
211
+ nv_delta_temp_in_out: nil,
217
212
  scale_x: nil,
218
213
  scale_y: nil,
219
214
  scale_z: nil,
@@ -221,9 +216,15 @@ class NECB2011 < Standard
221
216
  pv_ground_total_area_pv_panels_m2: nil,
222
217
  pv_ground_tilt_angle: nil,
223
218
  pv_ground_azimuth_angle: nil,
224
- pv_ground_module_description: nil
225
- )
226
-
219
+ pv_ground_module_description: nil,
220
+ chiller_type: nil,
221
+ occupancy_loads_scale: nil,
222
+ electrical_loads_scale: nil,
223
+ oa_scale: nil,
224
+ infiltration_scale: nil,
225
+ output_variables: nil,
226
+ output_meters: nil,
227
+ airloop_economizer_type: nil)
227
228
 
228
229
  model = load_building_type_from_library(building_type: building_type)
229
230
  return model_apply_standard(model: model,
@@ -257,30 +258,39 @@ class NECB2011 < Standard
257
258
  rotation_degrees: rotation_degrees,
258
259
  fdwr_set: fdwr_set,
259
260
  srr_set: srr_set,
260
- nv_type: 'NECB_Default', # Two options: (1) nil/none/false/'NECB_Default', (2) true
261
- nv_opening_fraction: nv_opening_fraction, #options: (1) nil/none/false (2) 'NECB_Default' (i.e. 0.1)
262
- nv_Tout_min: nv_Tout_min, #options: (1) nil/none/false(2) 'NECB_Default' (i.e. 13.0 based on inputs from Michel Tardif re a real school in QC)
263
- nv_Delta_Tin_Tout: nv_Delta_Tin_Tout, #options: (1) nil/none/false (2) 'NECB_Default' (i.e. 1.0 based on inputs from Michel Tardif re a real school in QC)
261
+ nv_type: nv_type, # Two options: (1) nil/none/false/'NECB_Default', (2) 'add_nv'
262
+ nv_opening_fraction: nv_opening_fraction, # options: (1) nil/none/false (2) 'NECB_Default' (i.e. 0.1)
263
+ nv_temp_out_min: nv_temp_out_min, # options: (1) nil/none/false(2) 'NECB_Default' (i.e. 13.0 based on inputs from Michel Tardif re a real school in QC)
264
+ nv_delta_temp_in_out: nv_delta_temp_in_out, # options: (1) nil/none/false (2) 'NECB_Default' (i.e. 1.0 based on inputs from Michel Tardif re a real school in QC)
264
265
  scale_x: scale_x,
265
266
  scale_y: scale_y,
266
267
  scale_z: scale_z,
267
- pv_ground_type: 'NECB_Default', # Two options: (1) nil/none/false/'NECB_Default', (2) true
268
+ pv_ground_type: pv_ground_type, # Two options: (1) nil/none/false/'NECB_Default', (2) 'add_pv_ground'
268
269
  pv_ground_total_area_pv_panels_m2: pv_ground_total_area_pv_panels_m2, # Options: (1) nil/none/false, (2) 'NECB_Default' (i.e. building footprint), (3) area value (e.g. 50)
269
270
  pv_ground_tilt_angle: pv_ground_tilt_angle, # Options: (1) nil/none/false, (2) 'NECB_Default' (i.e. latitude), (3) tilt angle value (e.g. 20)
270
271
  pv_ground_azimuth_angle: pv_ground_azimuth_angle, # Options: (1) nil/none/false, (2) 'NECB_Default' (i.e. south), (3) azimuth angle value (e.g. 90)
271
- pv_ground_module_description: pv_ground_module_description # Options: (1) nil/none/false, (2) 'NECB_Default' (i.e. Standard), (3) other options ('Standard', 'Premium', ThinFilm')
272
- )
272
+ pv_ground_module_description: pv_ground_module_description, # Options: (1) nil/none/false, (2) 'NECB_Default' (i.e. Standard), (3) other options ('Standard', 'Premium', ThinFilm')
273
+ occupancy_loads_scale: occupancy_loads_scale,
274
+ electrical_loads_scale: electrical_loads_scale,
275
+ oa_scale: oa_scale,
276
+ infiltration_scale: infiltration_scale,
277
+ chiller_type: chiller_type, # Options: (1) 'NECB_Default'/nil/'none'/false (i.e. do nothing), (2) e.g. 'VSD'
278
+ output_variables: output_variables,
279
+ output_meters: output_meters,
280
+ airloop_economizer_type: airloop_economizer_type) # (1) 'NECB_Default'/nil/' (2) 'DifferentialEnthalpy' (3) 'DifferentialTemperature'
273
281
 
274
282
  end
275
283
 
276
284
  def load_building_type_from_library(building_type:)
277
285
  osm_model_path = File.absolute_path(File.join(__FILE__, '..', '..', '..', "necb/NECB2011/data/geometry/#{building_type}.osm"))
278
- model = BTAP::FileIO::load_osm(osm_model_path)
279
- model.getBuilding.setName(building_type)
286
+ model = false
287
+ if File.file?(osm_model_path)
288
+ model = BTAP::FileIO.load_osm(osm_model_path)
289
+ model.getBuilding.setName(building_type)
290
+ end
280
291
  return model
281
292
  end
282
293
 
283
-
284
294
  # Created this method so that additional methods can be addded for bulding the prototype model in later
285
295
  # code versions without modifying the build_protoype_model method or copying it wholesale for a few changes.
286
296
  def model_apply_standard(model:,
@@ -319,43 +329,33 @@ class NECB2011 < Standard
319
329
  scale_z: nil,
320
330
  nv_type: nil,
321
331
  nv_opening_fraction: nil,
322
- nv_Tout_min: nil,
323
- nv_Delta_Tin_Tout: nil,
332
+ nv_temp_out_min: nil,
333
+ nv_delta_temp_in_out: nil,
324
334
  pv_ground_type: nil,
325
- pv_ground_total_area_pv_panels_m2: nil ,
335
+ pv_ground_total_area_pv_panels_m2: nil,
326
336
  pv_ground_tilt_angle: nil,
327
337
  pv_ground_azimuth_angle: nil,
328
- pv_ground_module_description: nil
329
- )
330
- #clean model..
331
- model = remove_all_HVAC(model)
332
- model.getThermalZones.sort.each {|zone| zone.setUseIdealAirLoads(true)}
333
- model.getZoneHVACPackagedTerminalAirConditioners.each(&:remove)
334
- model.getCoilCoolingDXSingleSpeeds.each(&:remove)
335
- model.getZoneHVACBaseboardConvectiveWaters.each(&:remove)
336
- model.getAirLoopHVACZoneMixers.each(&:remove)
337
- model.getAirLoopHVACZoneSplitters.each(&:remove)
338
- model.getAirTerminalSingleDuctConstantVolumeNoReheats.each(&:remove)
339
- model.getWaterUseEquipmentDefinitions.each(&:remove)
340
- model.getWaterUseEquipments.each(&:remove)
341
- model.getWaterUseConnectionss.each(&:remove)
342
-
343
- rotation_degrees = convert_arg_to_f(variable: rotation_degrees,default: 0.0)
344
- BTAP::Geometry::rotate_building(model: model,degrees: rotation_degrees) unless rotation_degrees == 0.0
345
- scale_x = convert_arg_to_f(variable: scale_x,default: 1.0)
346
- scale_y = convert_arg_to_f(variable: scale_y,default: 1.0)
347
- scale_z = convert_arg_to_f(variable: scale_z,default: 1.0)
348
- if scale_x != 1.0 || scale_y != 1.0 || scale_z != 1.0
349
- BTAP::Geometry::scale_model(model, scale_x, scale_x, scale_x)
350
- end
351
-
352
-
353
- fdwr_set = convert_arg_to_f(variable: fdwr_set,default: -1)
354
- srr_set = convert_arg_to_f(variable: srr_set,default: -1)
355
-
338
+ pv_ground_module_description: nil,
339
+ chiller_type: nil,
340
+ occupancy_loads_scale: nil,
341
+ electrical_loads_scale: nil,
342
+ oa_scale: nil,
343
+ infiltration_scale: nil,
344
+ output_variables: nil,
345
+ output_meters: nil,
346
+ airloop_economizer_type: nil)
347
+
348
+ clean_and_scale_model(model: model, rotation_degrees: rotation_degrees, scale_x: scale_x, scale_y: scale_y, scale_z: scale_z)
349
+ fdwr_set = convert_arg_to_f(variable: fdwr_set, default: -1)
350
+ srr_set = convert_arg_to_f(variable: srr_set, default: -1)
356
351
 
357
352
  apply_weather_data(model: model, epw_file: epw_file)
358
- apply_loads(model: model, lights_type: lights_type, lights_scale: lights_scale)
353
+ apply_loads(model: model,
354
+ lights_type: lights_type,
355
+ lights_scale: lights_scale,
356
+ occupancy_loads_scale: occupancy_loads_scale,
357
+ electrical_loads_scale: electrical_loads_scale,
358
+ oa_scale: oa_scale)
359
359
  apply_envelope(model: model,
360
360
  ext_wall_cond: ext_wall_cond,
361
361
  ext_floor_cond: ext_floor_cond,
@@ -370,7 +370,8 @@ class NECB2011 < Standard
370
370
  skylight_cond: skylight_cond,
371
371
  glass_door_solar_trans: glass_door_solar_trans,
372
372
  fixed_wind_solar_trans: fixed_wind_solar_trans,
373
- skylight_solar_trans: skylight_solar_trans)
373
+ skylight_solar_trans: skylight_solar_trans,
374
+ infiltration_scale: infiltration_scale)
374
375
  apply_fdwr_srr_daylighting(model: model,
375
376
  fdwr_set: fdwr_set,
376
377
  srr_set: srr_set)
@@ -391,18 +392,61 @@ class NECB2011 < Standard
391
392
  daylighting_type: daylighting_type,
392
393
  nv_type: nv_type,
393
394
  nv_opening_fraction: nv_opening_fraction,
394
- nv_Tout_min: nv_Tout_min,
395
- nv_Delta_Tin_Tout: nv_Delta_Tin_Tout,
395
+ nv_temp_out_min: nv_temp_out_min,
396
+ nv_delta_temp_in_out: nv_delta_temp_in_out,
396
397
  pv_ground_type: pv_ground_type,
397
398
  pv_ground_total_area_pv_panels_m2: pv_ground_total_area_pv_panels_m2,
398
399
  pv_ground_tilt_angle: pv_ground_tilt_angle,
399
400
  pv_ground_azimuth_angle: pv_ground_azimuth_angle,
400
- pv_ground_module_description: pv_ground_module_description
401
- )
401
+ pv_ground_module_description: pv_ground_module_description,
402
+ chiller_type: chiller_type,
403
+ airloop_economizer_type: airloop_economizer_type)
404
+ self.set_output_variables(model: model, output_variables: output_variables)
405
+ self.set_output_meters(model: model, output_meters: output_meters)
402
406
 
403
407
  return model
404
408
  end
405
409
 
410
+ # This method cleans the model of any existing HVAC systems and applies any desired ratation or scaling to the model.
411
+ def clean_and_scale_model(model:, rotation_degrees: nil, scale_x: nil, scale_y: nil, scale_z: nil)
412
+ # clean model..
413
+ BTAP::Resources::Envelope::remove_all_envelope_information(model)
414
+ model = remove_all_hvac(model)
415
+ model.getThermalZones.sort.each { |zone| zone.setUseIdealAirLoads(true) }
416
+ model.getZoneHVACPackagedTerminalAirConditioners.each(&:remove)
417
+ model.getCoilCoolingDXSingleSpeeds.each(&:remove)
418
+ model.getZoneHVACBaseboardConvectiveWaters.each(&:remove)
419
+ model.getAirLoopHVACZoneMixers.each(&:remove)
420
+ model.getAirLoopHVACZoneSplitters.each(&:remove)
421
+ model.getAirTerminalSingleDuctConstantVolumeNoReheats.each(&:remove)
422
+ model.getWaterUseEquipmentDefinitions.each(&:remove)
423
+ model.getWaterUseEquipments.each(&:remove)
424
+ model.getWaterUseConnectionss.each(&:remove)
425
+ model.getPumpConstantSpeeds.each(&:remove)
426
+ model.getPumpVariableSpeeds.each(&:remove)
427
+ model.getBoilerHotWaters.each(&:remove)
428
+ model.getBoilerSteams.each(&:remove)
429
+ model.getPlantLoops.each(&:remove)
430
+ model.getSchedules.each(&:remove)
431
+ model.getThermalZones.sort.each { |zone| zone.thermostat(&:remove) }
432
+ model.getSpaces.sort.each { |space| space.designSpecificationOutdoorAir(&:remove) }
433
+ model.getThermostatSetpointDualSetpoints.each(&:remove)
434
+
435
+ scale_x = 1.0
436
+ scale_y = 1.0
437
+ scale_z = 1.0
438
+ # Rotate to model if requested
439
+ rotation_degrees = convert_arg_to_f(variable: rotation_degrees, default: 0.0)
440
+ BTAP::Geometry.rotate_building(model: model, degrees: rotation_degrees) unless rotation_degrees == 0.0
441
+
442
+ # Scale model if requested
443
+ scale_x = convert_arg_to_f(variable: scale_x, default: 1.0)
444
+ scale_y = convert_arg_to_f(variable: scale_y, default: 1.0)
445
+ scale_z = convert_arg_to_f(variable: scale_z, default: 1.0)
446
+ return unless scale_x != 1.0 || scale_y != 1.0 || scale_z != 1.0
447
+
448
+ BTAP::Geometry.scale_model(model, scale_x, scale_y, scale_z)
449
+ end
406
450
 
407
451
  def apply_systems_and_efficiencies(model:,
408
452
  primary_heating_fuel:,
@@ -417,14 +461,15 @@ class NECB2011 < Standard
417
461
  daylighting_type: 'NECB_Default',
418
462
  nv_type: nil,
419
463
  nv_opening_fraction: nil,
420
- nv_Tout_min: nil,
421
- nv_Delta_Tin_Tout:nil,
464
+ nv_temp_out_min: nil,
465
+ nv_delta_temp_in_out: nil,
422
466
  pv_ground_type:,
423
467
  pv_ground_total_area_pv_panels_m2:,
424
468
  pv_ground_tilt_angle:,
425
469
  pv_ground_azimuth_angle:,
426
- pv_ground_module_description:
427
- )
470
+ pv_ground_module_description:,
471
+ chiller_type: 'NECB_Default',
472
+ airloop_economizer_type: nil)
428
473
 
429
474
  # Create ECM object.
430
475
  ecm = ECMS.new
@@ -439,15 +484,12 @@ class NECB2011 < Standard
439
484
 
440
485
  # Apply ERV equipment as required.
441
486
  ecm.apply_erv_ecm(model: model, erv_package: erv_package)
442
-
443
-
444
487
  # -------- Performace, Efficiencies, Controls and Sensors ------------
445
488
  #
446
489
  # Set code standard equipment charecteristics.
447
490
  sql_db_vars_map = apply_standard_efficiencies(model: model, sizing_run_dir: sizing_run_dir)
448
491
  # Apply System
449
492
  ecm.apply_system_efficiencies_ecm(model: model, ecm_system_name: ecm_system_name)
450
-
451
493
  # Apply ECM ERV charecteristics as required. Part 2 of above ECM.
452
494
  ecm.apply_erv_ecm_efficiency(model: model, erv_package: erv_package)
453
495
  # Apply DCV as required
@@ -457,12 +499,15 @@ class NECB2011 < Standard
457
499
  # Apply Furnace Efficiency
458
500
  ecm.modify_furnace_efficiency(model: model, furnace_eff: furnace_eff)
459
501
  # Apply Unitary efficiency
460
- ecm.modify_unitary_cop(model: model,unitary_cop: unitary_cop,sql_db_vars_map: sql_db_vars_map)
502
+ ecm.modify_unitary_cop(model: model, unitary_cop: unitary_cop, sql_db_vars_map: sql_db_vars_map)
461
503
  # Apply SHW Efficiency
462
504
  ecm.modify_shw_efficiency(model: model, shw_eff: shw_eff)
463
505
  # Apply daylight controls.
464
506
  model_add_daylighting_controls(model) if daylighting_type == 'add_daylighting_controls'
465
-
507
+ # Apply Chiller efficiency
508
+ ecm.modify_chiller_efficiency(model: model, chiller_type: chiller_type)
509
+ # Apply airloop economizer
510
+ ecm.add_airloop_economizer(model: model, airloop_economizer_type: airloop_economizer_type)
466
511
 
467
512
  # -------Pump sizing required by some vintages----------------
468
513
  # Apply Pump power as required.
@@ -470,34 +515,47 @@ class NECB2011 < Standard
470
515
 
471
516
  # -------Natural ventilation----------------
472
517
  # Apply natural ventilation using simplified method.
473
- ecm.apply_nv(model: model,
474
- nv_type: nv_type,
475
- nv_opening_fraction: nv_opening_fraction,
476
- nv_Tout_min: nv_Tout_min,
477
- nv_Delta_Tin_Tout: nv_Delta_Tin_Tout)
518
+ if nv_type == 'add_nv'
519
+ ecm.apply_nv(model: model,
520
+ nv_type: nv_type,
521
+ nv_opening_fraction: nv_opening_fraction,
522
+ nv_temp_out_min: nv_temp_out_min,
523
+ nv_delta_temp_in_out: nv_delta_temp_in_out)
524
+ end
478
525
 
479
- # -------Ground-mounted PV panels---------------- #Sara
526
+ # -------Ground-mounted PV panels----------------
480
527
  # Apply ground-mounted PV panels as required.
528
+ return unless pv_ground_type == 'add_pv_ground'
529
+
481
530
  ecm.apply_pv_ground(model: model,
482
531
  pv_ground_type: pv_ground_type,
483
532
  pv_ground_total_area_pv_panels_m2: pv_ground_total_area_pv_panels_m2,
484
533
  pv_ground_tilt_angle: pv_ground_tilt_angle,
485
534
  pv_ground_azimuth_angle: pv_ground_azimuth_angle,
486
535
  pv_ground_module_description: pv_ground_module_description)
487
-
488
536
  end
489
537
 
490
-
491
- def apply_loads(model:, lights_type: 'NECB_Default', lights_scale: 1.0, validate: true)
492
- lights_scale = convert_arg_to_f(variable: lights_scale,default: 1.0)
538
+ def apply_loads(model:,
539
+ lights_type: 'NECB_Default',
540
+ lights_scale: 1.0,
541
+ validate: true,
542
+ occupancy_loads_scale: nil,
543
+ electrical_loads_scale: nil,
544
+ oa_scale: nil)
545
+ # Create ECM object.
546
+ ecm = ECMS.new
547
+ lights_scale = convert_arg_to_f(variable: lights_scale, default: 1.0)
493
548
  if validate
494
549
  raise('validation of model failed.') unless validate_initial_model(model)
495
550
  raise('validation of spacetypes failed.') unless validate_and_upate_space_types(model)
496
551
  end
497
- #this sets/stores the template version loads that the model uses.
552
+ # this sets/stores the template version loads that the model uses.
498
553
  model.getBuilding.setStandardsTemplate(self.class.name)
499
554
  set_occ_sensor_spacetypes(model, @space_type_map)
500
555
  model_add_loads(model, lights_type, lights_scale)
556
+ ecm.scale_occupancy_loads(model: model, scale: occupancy_loads_scale)
557
+ ecm.scale_electrical_loads(model: model, scale: electrical_loads_scale)
558
+ ecm.scale_oa_loads(model: model, scale: oa_scale)
501
559
  end
502
560
 
503
561
  def apply_weather_data(model:, epw_file:)
@@ -524,9 +582,13 @@ class NECB2011 < Standard
524
582
  skylight_cond: nil,
525
583
  glass_door_solar_trans: nil,
526
584
  fixed_wind_solar_trans: nil,
527
- skylight_solar_trans: nil)
585
+ skylight_solar_trans: nil,
586
+ infiltration_scale: nil)
528
587
  raise('validation of model failed.') unless validate_initial_model(model)
588
+
529
589
  model_apply_infiltration_standard(model)
590
+ ecm = ECMS.new
591
+ ecm.scale_infiltration_loads(model: model, scale: infiltration_scale)
530
592
  model.getInsideSurfaceConvectionAlgorithm.setAlgorithm('TARP')
531
593
  model.getOutsideSurfaceConvectionAlgorithm.setAlgorithm('TARP')
532
594
  model_add_constructions(model)
@@ -545,10 +607,7 @@ class NECB2011 < Standard
545
607
  glass_door_solar_trans: glass_door_solar_trans,
546
608
  fixed_wind_solar_trans: fixed_wind_solar_trans,
547
609
  skylight_solar_trans: skylight_solar_trans)
548
-
549
-
550
610
  model_create_thermal_zones(model, @space_multiplier_map)
551
-
552
611
  end
553
612
 
554
613
  # Thermal zones need to be set to determine conditioned spaces when applying fdwr and srr limits.
@@ -561,8 +620,8 @@ class NECB2011 < Standard
561
620
  # # <-3.1: Remove all the windows/skylights
562
621
  # # > 1: Do nothing
563
622
  def apply_fdwr_srr_daylighting(model:, fdwr_set: -1.0, srr_set: -1.0)
564
- fdwr_set = -1.0 if fdwr_set == 'NECB_default' or fdwr_set.nil?
565
- srr_set = -1.0 if srr_set == 'NECB_default' or srr_set.nil?
623
+ fdwr_set = -1.0 if (fdwr_set == 'NECB_default') || fdwr_set.nil?
624
+ srr_set = -1.0 if (srr_set == 'NECB_default') || srr_set.nil?
566
625
  fdwr_set = fdwr_set.to_f
567
626
  srr_set = srr_set.to_f
568
627
  apply_standard_window_to_wall_ratio(model: model, fdwr_set: fdwr_set)
@@ -572,8 +631,10 @@ class NECB2011 < Standard
572
631
 
573
632
  def apply_standard_efficiencies(model:, sizing_run_dir:, dcv_type: 'NECB_Default')
574
633
  raise('validation of model failed.') unless validate_initial_model(model)
634
+
575
635
  climate_zone = 'NECB HDD Method'
576
636
  raise("sizing run 1 failed! check #{sizing_run_dir}") if model_run_sizing_run(model, "#{sizing_run_dir}/plant_loops") == false
637
+
577
638
  # This is needed for NECB2011 as a workaround for sizing the reheat boxes
578
639
  model.getAirTerminalSingleDuctVAVReheats.each { |iobj| air_terminal_single_duct_vav_reheat_set_heating_cap(iobj) }
579
640
  # Apply the prototype HVAC assumptions
@@ -640,23 +701,22 @@ class NECB2011 < Standard
640
701
  return model
641
702
  end
642
703
 
643
-
644
- #this method will determine the vintage of NECB spacetypes the model contains. It will return nil if it can't
704
+ # this method will determine the vintage of NECB spacetypes the model contains. It will return nil if it can't
645
705
  # determine it.
646
706
  def determine_spacetype_vintage(model)
647
707
  #this code is the list of available vintages
648
- space_type_vintage_list = ['NECB2011', 'NECB2015', 'NECB2017', 'BTAPPRE1980', 'BTAP1980TO2010']
708
+ space_type_vintage_list = ['NECB2011', 'NECB2015', 'NECB2017', 'NECB2020', 'BTAPPRE1980', 'BTAP1980TO2010']
649
709
  #this reorders the list to do the current class first.
650
710
  space_type_vintage_list.insert(0, space_type_vintage_list.delete(self.class.name))
651
- #Set the space_type
711
+ # Set the space_type
652
712
  space_type_vintage = nil
653
713
  # get list of space types used in model and a mapped string.
654
714
  model_space_type_names = model.getSpaceTypes.map do |spacetype|
655
715
  [spacetype.standardsBuildingType.get.to_s + '-' + spacetype.standardsSpaceType.get.to_s]
656
716
  end
657
- #Now iterate though each vintage
717
+ # Now iterate though each vintage
658
718
  space_type_vintage_list.each do |template|
659
- #Create the standard object and get a list of all the spacetypes available for that vintage.
719
+ # Create the standard object and get a list of all the spacetypes available for that vintage.
660
720
  standard_space_type_list = Standard.build(template).get_all_spacetype_names.map { |spacetype| [spacetype[0].to_s + '-' + spacetype[1].to_s] }
661
721
  # set array to contain unknown spacetypes.
662
722
  unknown_spacetypes = []
@@ -666,7 +726,7 @@ class NECB2011 < Standard
666
726
  unknown_spacetypes << space_type_name unless standard_space_type_list.include?(space_type_name)
667
727
  end
668
728
  if unknown_spacetypes.empty?
669
- #No unknowns, so return the template and don't bother looking for others.
729
+ # No unknowns, so return the template and don't bother looking for others.
670
730
  return template
671
731
  end
672
732
  end
@@ -686,7 +746,7 @@ class NECB2011 < Standard
686
746
  # no translation neccesary.
687
747
  return true
688
748
  else
689
- #Need to translate to current vintage.
749
+ # Need to translate to current vintage.
690
750
  no_errors = true
691
751
  st_model_vintage_string = "#{space_type_vintage}_space_type"
692
752
  bt_model_vintage_string = "#{space_type_vintage}_building_type"
@@ -698,14 +758,14 @@ class NECB2011 < Standard
698
758
  st.setStandardsBuildingType(space_type_map[bt_target_vintage_string].to_s.strip)
699
759
  raise('could not set buildingtype') unless st.setStandardsBuildingType(space_type_map[bt_target_vintage_string].to_s.strip)
700
760
  raise('could not set this') unless st.setStandardsSpaceType(space_type_map[st_target_vintage_string].to_s.strip)
701
- #Set name of spacetype to new name.
702
- st.setName("#{st.standardsBuildingType.get.to_s} #{st.standardsSpaceType.get.to_s}")
761
+
762
+ # Set name of spacetype to new name.
763
+ st.setName("#{st.standardsBuildingType.get} #{st.standardsSpaceType.get}")
703
764
  end
704
765
  return no_errors
705
766
  end
706
767
  end
707
768
 
708
-
709
769
  # Determine whether or not water fixtures are attached to spaces
710
770
  def model_attach_water_fixtures_to_spaces?(model)
711
771
  return true
@@ -735,7 +795,7 @@ class NECB2011 < Standard
735
795
  # that it only occurs through exterior walls and roofs (not floors as
736
796
  # explicit stated in the NECB2011 so overhang/cantilevered floors will
737
797
  # have no effective infiltration)
738
- tot_infil_m3_per_s = self.get_standards_constant('infiltration_rate_m3_per_s_per_m2') * exterior_wall_and_roof_and_subsurface_area
798
+ tot_infil_m3_per_s = get_standards_constant('infiltration_rate_m3_per_s_per_m2') * exterior_wall_and_roof_and_subsurface_area
739
799
  # Now spread the total infiltration rate over all
740
800
  # exterior surface area (for the E+ input field) this will include the exterior floor if present.
741
801
  all_ext_infil_m3_per_s_per_m2 = tot_infil_m3_per_s / space.exteriorArea
@@ -771,10 +831,10 @@ class NECB2011 < Standard
771
831
  infiltration.setName("#{space.name} Infiltration")
772
832
  infiltration.setFlowperExteriorSurfaceArea(all_ext_infil_m3_per_s_per_m2)
773
833
  infiltration.setSchedule(infil_sch)
774
- infiltration.setConstantTermCoefficient(self.get_standards_constant('infiltration_constant_term_coefficient'))
775
- infiltration.setTemperatureTermCoefficient(self.get_standards_constant('infiltration_constant_term_coefficient'))
776
- infiltration.setVelocityTermCoefficient(self.get_standards_constant('infiltration_velocity_term_coefficient'))
777
- infiltration.setVelocitySquaredTermCoefficient(self.get_standards_constant('infiltration_velocity_squared_term_coefficient'))
834
+ infiltration.setConstantTermCoefficient(get_standards_constant('infiltration_constant_term_coefficient'))
835
+ infiltration.setTemperatureTermCoefficient(get_standards_constant('infiltration_constant_term_coefficient'))
836
+ infiltration.setVelocityTermCoefficient(get_standards_constant('infiltration_velocity_term_coefficient'))
837
+ infiltration.setVelocitySquaredTermCoefficient(get_standards_constant('infiltration_velocity_squared_term_coefficient'))
778
838
  infiltration.setSpace(space)
779
839
 
780
840
  return true
@@ -787,12 +847,13 @@ class NECB2011 < Standard
787
847
  space_names.sort.each do |space_name|
788
848
  space = model.getSpaceByName(space_name)
789
849
  next if space.empty?
850
+
790
851
  space = space.get
791
852
 
792
853
  # Check if space type for this space matches NECB2011 specific space type
793
854
  # for occupancy sensor that is area dependent. Note: space.floorArea in m2.
794
855
 
795
- #Evaluate the formula in the database.
856
+ # Evaluate the formula in the database.
796
857
  standard_space_type_name = space_type_name
797
858
  floor_area = space.floorArea
798
859
  if eval(@standards_data['formulas']['occupancy_sensors_space_types_formula']['value'])
@@ -831,79 +892,81 @@ class NECB2011 < Standard
831
892
  # criteria. NECB standards assumes that the 'standards_lookup_table_first' method is used. This does basically the
832
893
  # some thing as 'model_find_objects' only it assumes that you are looking in the standards hash and you tell it which
833
894
  # table in the standards hash to look for.
834
- def corrupt_standards_database()
895
+ def corrupt_standards_database
835
896
  @standards_data['tables'].each do |table|
836
897
  @standards_data[table[0]] = table[1]['table']
837
898
  end
838
899
  end
839
900
 
840
- #This model gets the climate zone column index from tables 3.2.2.x
841
- #@author phylroy.lopez@nrcan.gc.ca
842
- #@param hdd [Float]
843
- #@return [Fixnum] climate zone 4-8
901
+ # This model gets the climate zone column index from tables 3.2.2.x
902
+ # @author phylroy.lopez@nrcan.gc.ca
903
+ # @param hdd [Float]
904
+ # @return [Fixnum] climate zone 4-8
844
905
  def get_climate_zone_index(hdd)
845
- #check for climate zone index from NECB 3.2.2.X
906
+ # check for climate zone index from NECB 3.2.2.X
846
907
  case hdd
847
908
  when 0..2999 then
848
- return 0 #climate zone 4
909
+ return 0 # climate zone 4
849
910
  when 3000..3999 then
850
- return 1 #climate zone 5
911
+ return 1 # climate zone 5
851
912
  when 4000..4999 then
852
- return 2 #climate zone 6
913
+ return 2 # climate zone 6
853
914
  when 5000..5999 then
854
- return 3 #climate zone 7a
915
+ return 3 # climate zone 7a
855
916
  when 6000..6999 then
856
- return 4 #climate zone 7b
917
+ return 4 # climate zone 7b
857
918
  when 7000..1000000 then
858
- return 5 #climate zone 8
919
+ return 5 # climate zone 8
859
920
  end
860
921
  end
861
922
 
862
- #This model gets the climate zone name and returns the climate zone string.
863
- #@author phylroy.lopez@nrcan.gc.ca
864
- #@param hdd [Float]
865
- #@return [Fixnum] climate zone 4-8
923
+ # This model gets the climate zone name and returns the climate zone string.
924
+ # @author phylroy.lopez@nrcan.gc.ca
925
+ # @param hdd [Float]
926
+ # @return [Fixnum] climate zone 4-8
866
927
  def get_climate_zone_name(hdd)
867
- case self.get_climate_zone_index(hdd)
928
+ case get_climate_zone_index(hdd)
868
929
  when 0 then
869
- return "4"
930
+ return '4'
870
931
  when 1 then
871
- return "5" #climate zone 5
932
+ return '5' # climate zone 5
872
933
  when 2 then
873
- return "6" #climate zone 6
934
+ return '6' # climate zone 6
874
935
  when 3 then
875
- return "7a" #climate zone 7a
936
+ return '7a' # climate zone 7a
876
937
  when 4 then
877
- return "7b" #climate zone 7b
938
+ return '7b' # climate zone 7b
878
939
  when 5 then
879
- return "8" #climate zone 8
940
+ return '8' # climate zone 8
880
941
  end
881
942
  end
882
943
 
944
+ ##### Ask user's inputs for daylighting controls illuminance setpoint and number of stepped control steps.
945
+ ##### Note that the minimum number of stepped control steps is two steps as per NECB2011.
946
+ def daylighting_controls_settings(illuminance_setpoint: 500.0,
947
+ number_of_stepped_control_steps: 2)
948
+ return illuminance_setpoint, number_of_stepped_control_steps
949
+ end
883
950
 
884
951
  def model_add_daylighting_controls(model)
885
-
886
- ##### Ask user's inputs for daylighting controls illuminance setpoint and number of stepped control steps.
887
- ##### Note that the minimum number of stepped control steps is two steps as per NECB2011.
888
- def daylighting_controls_settings(illuminance_setpoint: 500.0,
889
- number_of_stepped_control_steps: 2)
890
- return illuminance_setpoint, number_of_stepped_control_steps
891
- end
892
-
893
952
  ##### Find spaces with exterior fenestration including fixed window, operable window, and skylight.
894
953
  daylight_spaces = []
895
954
  model.getSpaces.sort.each do |space|
896
955
  space.surfaces.sort.each do |surface|
897
956
  surface.subSurfaces.sort.each do |subsurface|
898
- if subsurface.outsideBoundaryCondition == "Outdoors" &&
899
- (subsurface.subSurfaceType == "FixedWindow" ||
900
- subsurface.subSurfaceType == "OperableWindow" ||
901
- subsurface.subSurfaceType == "Skylight")
957
+ if subsurface.outsideBoundaryCondition == 'Outdoors' &&
958
+ (subsurface.subSurfaceType == 'FixedWindow' ||
959
+ subsurface.subSurfaceType == 'OperableWindow' ||
960
+ subsurface.subSurfaceType == 'Skylight')
902
961
  daylight_spaces << space
903
- end #subsurface.outsideBoundaryCondition == "Outdoors" && (subsurface.subSurfaceType == "FixedWindow" || "OperableWindow")
904
- end #surface.subSurfaces.each do |subsurface|
905
- end #space.surfaces.each do |surface|
906
- end #model.getSpaces.sort.each do |space|
962
+ # subsurface.outsideBoundaryCondition == "Outdoors" && (subsurface.subSurfaceType == "FixedWindow" || "OperableWindow")
963
+ end
964
+ # surface.subSurfaces.each do |subsurface|
965
+ end
966
+ # space.surfaces.each do |surface|
967
+ end
968
+ # model.getSpaces.sort.each do |space|
969
+ end
907
970
 
908
971
  ##### Remove duplicate spaces from the "daylight_spaces" array, as a daylighted space may have various fenestration types.
909
972
  daylight_spaces = daylight_spaces.uniq
@@ -931,7 +994,7 @@ class NECB2011 < Standard
931
994
  floor_area = 0.0
932
995
  floor_vertices = []
933
996
  daylight_space.surfaces.sort.each do |surface|
934
- if surface.surfaceType == "Floor"
997
+ if surface.surfaceType == 'Floor'
935
998
  floor_surface = surface
936
999
  floor_area += surface.netArea
937
1000
  floor_vertices << surface.vertices
@@ -941,22 +1004,21 @@ class NECB2011 < Standard
941
1004
  ##### Loop through the surfaces of each daylight_space to calculate primary_sidelighted_area and
942
1005
  ##### area-weighted visible transmittance and window_area_sum which are used to calculate sidelighting_effective_aperture
943
1006
  primary_sidelighted_area, area_weighted_vt_handle, window_area_sum =
944
- get_parameters_sidelighting(daylight_space: daylight_space,
945
- floor_surface: floor_surface,
946
- floor_vertices: floor_vertices,
947
- floor_area: floor_area,
948
- primary_sidelighted_area: primary_sidelighted_area,
949
- area_weighted_vt_handle: area_weighted_vt_handle,
950
- window_area_sum: window_area_sum)
1007
+ get_parameters_sidelighting(daylight_space: daylight_space,
1008
+ floor_surface: floor_surface,
1009
+ floor_vertices: floor_vertices,
1010
+ floor_area: floor_area,
1011
+ primary_sidelighted_area: primary_sidelighted_area,
1012
+ area_weighted_vt_handle: area_weighted_vt_handle,
1013
+ window_area_sum: window_area_sum)
951
1014
 
952
1015
  primary_sidelighted_area_hash[daylight_space.name.to_s] = primary_sidelighted_area
953
1016
 
954
1017
  ##### Calculate area-weighted VT of glazing (this is used to calculate sidelighting effective aperture; see NECB2011: 4.2.2.10.).
955
1018
  area_weighted_vt = area_weighted_vt_handle / window_area_sum
956
1019
  sidelighting_effective_aperture_hash[daylight_space.name.to_s] = window_area_sum * area_weighted_vt / primary_sidelighted_area
957
-
958
- end #daylight_spaces.each do |daylight_space|
959
-
1020
+ # daylight_spaces.each do |daylight_space|
1021
+ end
960
1022
 
961
1023
  ##### Calculate "Daylighted Area Under Skylights" AND "Skylight Effective Aperture"
962
1024
  daylight_spaces.sort.each do |daylight_space|
@@ -969,10 +1031,10 @@ class NECB2011 < Standard
969
1031
 
970
1032
  ##### Loop through the surfaces of each daylight_space to calculate daylighted_area_under_skylights and skylight_effective_aperture for each daylight_space
971
1033
  daylighted_under_skylight_area, skylight_area_weighted_vt_handle, skylight_area_sum =
972
- get_parameters_skylight(daylight_space: daylight_space,
973
- skylight_area_weighted_vt_handle: skylight_area_weighted_vt_handle,
974
- skylight_area_sum: skylight_area_sum,
975
- daylighted_under_skylight_area: daylighted_under_skylight_area)
1034
+ get_parameters_skylight(daylight_space: daylight_space,
1035
+ skylight_area_weighted_vt_handle: skylight_area_weighted_vt_handle,
1036
+ skylight_area_sum: skylight_area_sum,
1037
+ daylighted_under_skylight_area: daylighted_under_skylight_area)
976
1038
 
977
1039
  daylighted_area_under_skylights_hash[daylight_space.name.to_s] = daylighted_under_skylight_area
978
1040
 
@@ -980,9 +1042,8 @@ class NECB2011 < Standard
980
1042
  ##### Note that it was assumed that the skylight is flush with the ceiling. Therefore, area-weighted average well factor (WF) was set to 0.9 in the below Equation.
981
1043
  skylight_area_weighted_vt = skylight_area_weighted_vt_handle / skylight_area_sum
982
1044
  skylight_effective_aperture_hash[daylight_space.name.to_s] = 0.85 * skylight_area_sum * skylight_area_weighted_vt * 0.9 / daylighted_under_skylight_area
983
-
984
- end #daylight_spaces.each do |daylight_space|
985
-
1045
+ # daylight_spaces.each do |daylight_space|
1046
+ end
986
1047
  # puts primary_sidelighted_area_hash
987
1048
  # puts sidelighting_effective_aperture_hash
988
1049
  # puts daylighted_area_under_skylights_hash
@@ -991,7 +1052,6 @@ class NECB2011 < Standard
991
1052
  ##### Find office spaces >= 25m2 among daylight_spaces
992
1053
  offices_larger_25m2 = []
993
1054
  daylight_spaces.sort.each do |daylight_space|
994
-
995
1055
  ## The following steps are for in case an office has multiple floors at various heights
996
1056
  ## 1. Calculate number of floors of each daylight_space
997
1057
  ## 2. Find the lowest z among all floors of each daylight_space
@@ -1039,12 +1099,12 @@ class NECB2011 < Standard
1039
1099
  floor_vertices = surface.vertices
1040
1100
  if floor_vertices[0].z == lowest_floor_z
1041
1101
  lowest_floors_vertices << floor_vertices
1042
- daylight_space_area = daylight_space_area + surface.netArea
1102
+ daylight_space_area += surface.netArea
1043
1103
  end
1044
1104
  end
1045
1105
  end
1046
1106
 
1047
- if daylight_space.spaceType.get.standardsSpaceType.get.to_s == "Office - enclosed" && daylight_space_area >= 25.0
1107
+ if daylight_space.spaceType.get.standardsSpaceType.get.to_s == 'Office - enclosed' && daylight_space_area >= 25.0
1048
1108
  offices_larger_25m2 << daylight_space.name.to_s
1049
1109
  end
1050
1110
  end
@@ -1145,7 +1205,7 @@ class NECB2011 < Standard
1145
1205
  floor_vertices = surface.vertices
1146
1206
  if floor_vertices[0].z == lowest_floor_z
1147
1207
  lowest_floors_vertices << floor_vertices
1148
- daylight_space_area = daylight_space_area + surface.netArea
1208
+ daylight_space_area += surface.netArea
1149
1209
  end
1150
1210
  end
1151
1211
  end
@@ -1160,8 +1220,8 @@ class NECB2011 < Standard
1160
1220
  xmax = lowest_floors_vertices[0][0].x
1161
1221
  ymax = lowest_floors_vertices[0][0].y
1162
1222
  zmin = lowest_floor_z
1163
- for i in 0..lowest_floors_vertices.count - 1 #this loops through each of the lowers floors of daylight_space
1164
- for j in 0..lowest_floors_vertices[i].count - 1 #this loops through each of vertices of each of the lowers floors of daylight_space
1223
+ for i in 0..lowest_floors_vertices.count - 1 # this loops through each of the lowers floors of daylight_space
1224
+ for j in 0..lowest_floors_vertices[i].count - 1 # this loops through each of vertices of each of the lowers floors of daylight_space
1165
1225
 
1166
1226
  if xmin > lowest_floors_vertices[i][j].x
1167
1227
  xmin = lowest_floors_vertices[i][j].x
@@ -1190,7 +1250,7 @@ class NECB2011 < Standard
1190
1250
  ##### Get the floor of the daylight_space
1191
1251
  floors = []
1192
1252
  daylight_space.surfaces.sort.each do |surface|
1193
- if surface.surfaceType == "Floor"
1253
+ if surface.surfaceType == 'Floor'
1194
1254
  floors << surface
1195
1255
  end
1196
1256
  end
@@ -1208,168 +1268,162 @@ class NECB2011 < Standard
1208
1268
  ##### Furthermore, the one daylighting sensor in each thermal zone (where the thermal zone needs daylighting sensor),
1209
1269
  ##### the sensor has been put at the intersection of the minimum and maximum x and y of the lowest floor of that thermal zones.
1210
1270
  sensor = OpenStudio::Model::DaylightingControl.new(daylight_space.model)
1211
- sensor.setName("#{daylight_space.name.to_s} daylighting control")
1271
+ sensor.setName("#{daylight_space.name} daylighting control")
1212
1272
  sensor.setSpace(daylight_space)
1213
1273
  sensor.setIlluminanceSetpoint(illuminance_setpoint)
1214
1274
  sensor.setLightingControlType('Stepped')
1215
1275
  sensor.setNumberofSteppedControlSteps(number_of_stepped_control_steps)
1216
1276
  x_pos = (xmin + xmax) / 2.0
1217
1277
  y_pos = (ymin + ymax) / 2.0
1218
- z_pos = zmin + 0.8 #put it 0.8 meter above the floor
1278
+ z_pos = zmin + 0.8 # put it 0.8 meter above the floor
1219
1279
  sensor_vertex = OpenStudio::Point3d.new(x_pos, y_pos, z_pos)
1220
1280
  sensor.setPosition(sensor_vertex)
1221
1281
  zone.setPrimaryDaylightingControl(sensor)
1222
1282
  zone.setFractionofZoneControlledbyPrimaryDaylightingControl(1.0)
1283
+ # if !zone.empty?
1284
+ end
1285
+ # daylight_spaces.each do |daylight_space|
1286
+ end
1287
+ end
1223
1288
 
1224
- end #if !zone.empty?
1225
- end #daylight_spaces.each do |daylight_space|
1289
+ ##### Define ScheduleTypeLimits for Any_Number_ppm
1290
+ ##### TODO: (upon other BTAP tasks) This function can be added to btap/schedules.rb > module StandardScheduleTypeLimits
1291
+ def get_any_number_ppm(model)
1292
+ name = 'Any_Number_ppm'
1293
+ any_number_ppm_schedule_type_limits = model.getScheduleTypeLimitsByName(name)
1294
+ return any_number_ppm_schedule_type_limits.get unless any_number_ppm_schedule_type_limits.empty?
1295
+
1296
+ any_number_ppm_schedule_type_limits = OpenStudio::Model::ScheduleTypeLimits.new(model)
1297
+ any_number_ppm_schedule_type_limits.setName(name)
1298
+ any_number_ppm_schedule_type_limits.setNumericType('CONTINUOUS')
1299
+ any_number_ppm_schedule_type_limits.setUnitType('Dimensionless')
1300
+ any_number_ppm_schedule_type_limits.setLowerLimitValue(400.0)
1301
+ any_number_ppm_schedule_type_limits.setUpperLimitValue(1000.0)
1302
+ return any_number_ppm_schedule_type_limits
1226
1303
  end
1227
1304
 
1228
- #def model_add_daylighting_controls(model)
1229
-
1230
-
1231
- def model_enable_demand_controlled_ventilation(model, dcv_type = 'No_DCV') # Note: Values for dcv_type are: 'Occupancy_based_DCV', 'CO2_based_DCV', 'No_DCV', 'NECB_Default'
1232
- if dcv_type != 'NECB_Default'
1233
- if dcv_type == 'Occupancy_based_DCV' || dcv_type == 'CO2_based_DCV'
1234
- #TODO: IMPORTANT: (upon other BTAP tasks) Set a value for the "Outdoor Air Flow per Person" field of the "OS:DesignSpecification:OutdoorAir" object
1235
- # Note: The "Outdoor Air Flow per Person" field is required for occupancy-based DCV.
1236
- # Note: The "Outdoor Air Flow per Person" values should be based on ASHRAE 62.1: Article 6.2.2.1.
1237
- # Note: The "Outdoor Air Flow per Person" should be entered for "ventilation_per_person" in "lib/openstudio-standards/standards/necb/NECB2011/data/space_types.json"
1238
-
1239
- ##### Define ScheduleTypeLimits for Any_Number_ppm
1240
- ##### TODO: (upon other BTAP tasks) This function can be added to btap/schedules.rb > module StandardScheduleTypeLimits
1241
- def self.get_any_number_ppm(model)
1242
- name = 'Any_Number_ppm'
1243
- any_number_ppm_schedule_type_limits = model.getScheduleTypeLimitsByName(name)
1244
- if any_number_ppm_schedule_type_limits.empty?
1245
- any_number_ppm_schedule_type_limits = OpenStudio::Model::ScheduleTypeLimits.new(model)
1246
- any_number_ppm_schedule_type_limits.setName(name)
1247
- any_number_ppm_schedule_type_limits.setNumericType('CONTINUOUS')
1248
- any_number_ppm_schedule_type_limits.setUnitType('Dimensionless')
1249
- any_number_ppm_schedule_type_limits.setLowerLimitValue(400.0)
1250
- any_number_ppm_schedule_type_limits.setUpperLimitValue(1000.0)
1251
- return any_number_ppm_schedule_type_limits
1252
- else
1253
- return any_number_ppm_schedule_type_limits.get
1254
- end
1305
+ # Note: Values for dcv_type are: 'Occupancy_based_DCV', 'CO2_based_DCV', 'No_DCV', 'NECB_Default'
1306
+ def model_enable_demand_controlled_ventilation(model, dcv_type = 'No_DCV')
1307
+ return if dcv_type == 'NECB_Defualt'
1308
+
1309
+ if dcv_type == 'Occupancy_based_DCV' || dcv_type == 'CO2_based_DCV'
1310
+ # TODO: IMPORTANT: (upon other BTAP tasks) Set a value for the "Outdoor Air Flow per Person" field of the "OS:DesignSpecification:OutdoorAir" object
1311
+ # Note: The "Outdoor Air Flow per Person" field is required for occupancy-based DCV.
1312
+ # Note: The "Outdoor Air Flow per Person" values should be based on ASHRAE 62.1: Article 6.2.2.1.
1313
+ # Note: The "Outdoor Air Flow per Person" should be entered for "ventilation_per_person" in "lib/openstudio-standards/standards/necb/NECB2011/data/space_types.json"
1314
+
1315
+ ##### Define indoor CO2 availability schedule (required for CO2-based DCV)
1316
+ ##### Reference: see page B.13 of PNNL (2017), "Impacts of Commercial Building Controls on Energy Savings and Peak Load Reduction", available a: https://www.energy.gov/eere/buildings/downloads/impacts-commercial-building-controls-energy-savings-and-peak-load-reduction
1317
+ ##### Note: the defined schedule here is redundant as the schedule says it is always on AND
1318
+ ##### the "ZoneControl:ContaminantController" object says that "If this field is left blank, the schedule has a value of 1 for all time periods".
1319
+ indoor_co2_availability_schedule = OpenStudio::Model::ScheduleCompact.new(model)
1320
+ indoor_co2_availability_schedule.setName('indoor_co2_availability_schedule')
1321
+ indoor_co2_availability_schedule.setScheduleTypeLimits(BTAP::Resources::Schedules::StandardScheduleTypeLimits.get_fraction(model))
1322
+ indoor_co2_availability_schedule.to_ScheduleCompact.get
1323
+ # indoor_co2_availability_schedule.setString(1,"indoor_co2_availability_schedule")
1324
+ indoor_co2_availability_schedule.setString(3, 'Through: 12/31')
1325
+ indoor_co2_availability_schedule.setString(4, 'For: Weekdays SummerDesignDay')
1326
+ indoor_co2_availability_schedule.setString(5, 'Until: 07:00')
1327
+ indoor_co2_availability_schedule.setString(6, '0.0')
1328
+ indoor_co2_availability_schedule.setString(7, 'Until: 22:00')
1329
+ indoor_co2_availability_schedule.setString(8, '1.0')
1330
+ indoor_co2_availability_schedule.setString(9, 'Until: 24:00')
1331
+ indoor_co2_availability_schedule.setString(10, '0.0')
1332
+ indoor_co2_availability_schedule.setString(11, 'For: Saturday WinterDesignDay')
1333
+ indoor_co2_availability_schedule.setString(12, 'Until: 07:00')
1334
+ indoor_co2_availability_schedule.setString(13, '0.0')
1335
+ indoor_co2_availability_schedule.setString(14, 'Until: 18:00')
1336
+ indoor_co2_availability_schedule.setString(15, '1.0')
1337
+ indoor_co2_availability_schedule.setString(16, 'Until: 24:00')
1338
+ indoor_co2_availability_schedule.setString(17, '0.0')
1339
+ indoor_co2_availability_schedule.setString(18, 'For: AllOtherDays')
1340
+ indoor_co2_availability_schedule.setString(19, 'Until: 24:00')
1341
+ indoor_co2_availability_schedule.setString(20, '0.0')
1342
+
1343
+ ##### Define indoor CO2 setpoint schedule (required for CO2-based DCV)
1344
+ ##### Reference: see page B.13 of PNNL (2017), "Impacts of Commercial Building Controls on Energy Savings and Peak Load Reduction", available a: https://www.energy.gov/eere/buildings/downloads/impacts-commercial-building-controls-energy-savings-and-peak-load-reduction
1345
+ indoor_co2_setpoint_schedule = OpenStudio::Model::ScheduleCompact.new(model)
1346
+ indoor_co2_setpoint_schedule.setName('indoor_co2_setpoint_schedule')
1347
+ indoor_co2_setpoint_schedule.setScheduleTypeLimits(get_any_number_ppm(model))
1348
+ indoor_co2_setpoint_schedule.to_ScheduleCompact.get
1349
+ indoor_co2_setpoint_schedule.setString(3, 'Through: 12/31')
1350
+ indoor_co2_setpoint_schedule.setString(4, 'For: AllDays')
1351
+ indoor_co2_setpoint_schedule.setString(5, 'Until: 24:00')
1352
+ indoor_co2_setpoint_schedule.setString(6, '1000.0')
1353
+ # indoor_co2_setpoint_schedule.setToConstantValue(1000.0) #1000 ppm
1354
+
1355
+ ##### Define outdoor CO2 schedule (required for CO2-based DCV
1356
+ ##### Reference: see page B.13 of PNNL (2017), "Impacts of Commercial Building Controls on Energy Savings and Peak Load Reduction", available a: https://www.energy.gov/eere/buildings/downloads/impacts-commercial-building-controls-energy-savings-and-peak-load-reduction
1357
+ outdoor_co2_schedule = OpenStudio::Model::ScheduleCompact.new(model)
1358
+ outdoor_co2_schedule.setName('outdoor_co2_schedule')
1359
+ outdoor_co2_schedule.setScheduleTypeLimits(get_any_number_ppm(model))
1360
+ outdoor_co2_schedule.to_ScheduleCompact.get
1361
+ outdoor_co2_schedule.setString(3, 'Through: 12/31')
1362
+ outdoor_co2_schedule.setString(4, 'For: AllDays')
1363
+ outdoor_co2_schedule.setString(5, 'Until: 24:00')
1364
+ outdoor_co2_schedule.setString(6, '400.0')
1365
+ # outdoor_co2_schedule.setToConstantValue(400.0) #400 ppm
1366
+
1367
+ ##### Define ZoneAirContaminantBalance (required for CO2-based DCV)
1368
+ zone_air_contaminant_balance = model.getZoneAirContaminantBalance
1369
+ zone_air_contaminant_balance.setCarbonDioxideConcentration(true)
1370
+ zone_air_contaminant_balance.setOutdoorCarbonDioxideSchedule(outdoor_co2_schedule)
1371
+
1372
+ ##### Set CO2 controller in each space (required for CO2-based DCV)
1373
+ model.getSpaces.sort.each do |space|
1374
+ # puts space.name.to_s
1375
+ zone = space.thermalZone
1376
+ if !zone.empty?
1377
+ zone = space.thermalZone.get
1255
1378
  end
1379
+ zone_control_co2 = OpenStudio::Model::ZoneControlContaminantController.new(zone.model)
1380
+ zone_control_co2.setName("#{space.name} Zone Control Contaminant Controller")
1381
+ zone_control_co2.setCarbonDioxideControlAvailabilitySchedule(indoor_co2_availability_schedule)
1382
+ zone_control_co2.setCarbonDioxideSetpointSchedule(indoor_co2_setpoint_schedule)
1383
+ zone.setZoneControlContaminantController(zone_control_co2)
1384
+ end
1385
+ # if dcv_type == "Occupancy_based_DCV" || dcv_type == "CO2_based_DCV"
1386
+ end
1256
1387
 
1257
- ##### Define indoor CO2 availability schedule (required for CO2-based DCV)
1258
- ##### Reference: see page B.13 of PNNL (2017), "Impacts of Commercial Building Controls on Energy Savings and Peak Load Reduction", available a: https://www.energy.gov/eere/buildings/downloads/impacts-commercial-building-controls-energy-savings-and-peak-load-reduction
1259
- ##### Note: the defined schedule here is redundant as the schedule says it is always on AND
1260
- ##### the "ZoneControl:ContaminantController" object says that "If this field is left blank, the schedule has a value of 1 for all time periods".
1261
- indoor_co2_availability_schedule = OpenStudio::Model::ScheduleCompact.new(model)
1262
- indoor_co2_availability_schedule.setName('indoor_co2_availability_schedule')
1263
- indoor_co2_availability_schedule.setScheduleTypeLimits(BTAP::Resources::Schedules::StandardScheduleTypeLimits::get_fraction(model))
1264
- indoor_co2_availability_schedule.to_ScheduleCompact.get
1265
- # indoor_co2_availability_schedule.setString(1,"indoor_co2_availability_schedule")
1266
- indoor_co2_availability_schedule.setString(3, "Through: 12/31")
1267
- indoor_co2_availability_schedule.setString(4, "For: Weekdays SummerDesignDay")
1268
- indoor_co2_availability_schedule.setString(5, "Until: 07:00")
1269
- indoor_co2_availability_schedule.setString(6, "0.0")
1270
- indoor_co2_availability_schedule.setString(7, "Until: 22:00")
1271
- indoor_co2_availability_schedule.setString(8, "1.0")
1272
- indoor_co2_availability_schedule.setString(9, "Until: 24:00")
1273
- indoor_co2_availability_schedule.setString(10, "0.0")
1274
- indoor_co2_availability_schedule.setString(11, "For: Saturday WinterDesignDay")
1275
- indoor_co2_availability_schedule.setString(12, "Until: 07:00")
1276
- indoor_co2_availability_schedule.setString(13, "0.0")
1277
- indoor_co2_availability_schedule.setString(14, "Until: 18:00")
1278
- indoor_co2_availability_schedule.setString(15, "1.0")
1279
- indoor_co2_availability_schedule.setString(16, "Until: 24:00")
1280
- indoor_co2_availability_schedule.setString(17, "0.0")
1281
- indoor_co2_availability_schedule.setString(18, "For: AllOtherDays")
1282
- indoor_co2_availability_schedule.setString(19, "Until: 24:00")
1283
- indoor_co2_availability_schedule.setString(20, "0.0")
1284
-
1285
- ##### Define indoor CO2 setpoint schedule (required for CO2-based DCV)
1286
- ##### Reference: see page B.13 of PNNL (2017), "Impacts of Commercial Building Controls on Energy Savings and Peak Load Reduction", available a: https://www.energy.gov/eere/buildings/downloads/impacts-commercial-building-controls-energy-savings-and-peak-load-reduction
1287
- indoor_co2_setpoint_schedule = OpenStudio::Model::ScheduleCompact.new(model)
1288
- indoor_co2_setpoint_schedule.setName('indoor_co2_setpoint_schedule')
1289
- indoor_co2_setpoint_schedule.setScheduleTypeLimits(get_any_number_ppm(model))
1290
- indoor_co2_setpoint_schedule.to_ScheduleCompact.get
1291
- indoor_co2_setpoint_schedule.setString(3, "Through: 12/31")
1292
- indoor_co2_setpoint_schedule.setString(4, "For: AllDays")
1293
- indoor_co2_setpoint_schedule.setString(5, "Until: 24:00")
1294
- indoor_co2_setpoint_schedule.setString(6, "1000.0")
1295
- # indoor_co2_setpoint_schedule.setToConstantValue(1000.0) #1000 ppm
1296
-
1297
-
1298
- ##### Define outdoor CO2 schedule (required for CO2-based DCV
1299
- ##### Reference: see page B.13 of PNNL (2017), "Impacts of Commercial Building Controls on Energy Savings and Peak Load Reduction", available a: https://www.energy.gov/eere/buildings/downloads/impacts-commercial-building-controls-energy-savings-and-peak-load-reduction
1300
- outdoor_co2_schedule = OpenStudio::Model::ScheduleCompact.new(model)
1301
- outdoor_co2_schedule.setName('outdoor_co2_schedule')
1302
- outdoor_co2_schedule.setScheduleTypeLimits(get_any_number_ppm(model))
1303
- outdoor_co2_schedule.to_ScheduleCompact.get
1304
- outdoor_co2_schedule.setString(3, "Through: 12/31")
1305
- outdoor_co2_schedule.setString(4, "For: AllDays")
1306
- outdoor_co2_schedule.setString(5, "Until: 24:00")
1307
- outdoor_co2_schedule.setString(6, "400.0")
1308
- # outdoor_co2_schedule.setToConstantValue(400.0) #400 ppm
1309
-
1310
- ##### Define ZoneAirContaminantBalance (required for CO2-based DCV)
1311
- zone_air_contaminant_balance = model.getZoneAirContaminantBalance()
1312
- zone_air_contaminant_balance.setCarbonDioxideConcentration(true)
1313
- zone_air_contaminant_balance.setOutdoorCarbonDioxideSchedule(outdoor_co2_schedule)
1314
-
1315
- ##### Set CO2 controller in each space (required for CO2-based DCV)
1316
- model.getSpaces.sort.each do |space|
1317
- # puts space.name.to_s
1318
- zone = space.thermalZone
1319
- if !zone.empty?
1320
- zone = space.thermalZone.get
1388
+ ##### Loop through AirLoopHVACs
1389
+ model.getAirLoopHVACs.sort.each do |air_loop|
1390
+ ##### Loop through AirLoopHVAC's supply nodes to:
1391
+ ##### (1) Find its AirLoopHVAC:OutdoorAirSystem using the supply node;
1392
+ ##### (2) Find Controller:OutdoorAir using AirLoopHVAC:OutdoorAirSystem;
1393
+ ##### (3) Get "Controller Mechanical Ventilation" from Controller:OutdoorAir.
1394
+ air_loop.supplyComponents.sort.each do |supply_component|
1395
+ ##### Find AirLoopHVAC:OutdoorAirSystem of AirLoopHVAC using the supply node.
1396
+ hvac_component = supply_component.to_AirLoopHVACOutdoorAirSystem
1397
+
1398
+ if !hvac_component.empty?
1399
+ ##### Find Controller:OutdoorAir using AirLoopHVAC:OutdoorAirSystem.
1400
+ hvac_component = hvac_component.get
1401
+ controller_oa = hvac_component.getControllerOutdoorAir
1402
+
1403
+ ##### Get "Controller Mechanical Ventilation" from Controller:OutdoorAir.
1404
+ controller_mv = controller_oa.controllerMechanicalVentilation
1405
+
1406
+ ##### Set "Demand Controlled Ventilation" to "Yes" or "No" in Controller:MechanicalVentilation depending on dcv_type.
1407
+ if (dcv_type == 'CO2_based_DCV') || (dcv_type == 'Occupancy_based_DCV') # Occupancy
1408
+ controller_mv.setDemandControlledVentilation(true)
1409
+ ##### Set the "System Outdoor Air Method" field based on dcv_type in the Controller:MechanicalVentilation object
1410
+ if dcv_type == 'CO2_based_DCV'
1411
+ controller_mv.setSystemOutdoorAirMethod('IndoorAirQualityProcedure')
1412
+ else # dcv_type == 'Occupancy_based_DCV'
1413
+ controller_mv.setSystemOutdoorAirMethod('ZoneSum')
1414
+ end
1415
+ elsif dcv_type == 'No_DCV'
1416
+ controller_mv.setDemandControlledVentilation(false)
1321
1417
  end
1322
- zone_control_co2 = OpenStudio::Model::ZoneControlContaminantController.new(zone.model)
1323
- zone_control_co2.setName("#{space.name.to_s} Zone Control Contaminant Controller")
1324
- zone_control_co2.setCarbonDioxideControlAvailabilitySchedule(indoor_co2_availability_schedule)
1325
- zone_control_co2.setCarbonDioxideSetpointSchedule(indoor_co2_setpoint_schedule)
1326
- zone.setZoneControlContaminantController(zone_control_co2)
1418
+ # puts controller_mv
1419
+ # if !hvac_component.empty?
1327
1420
  end
1328
-
1329
- end #if dcv_type == "Occupancy_based_DCV" || dcv_type == "CO2_based_DCV"
1330
-
1331
- ##### Loop through AirLoopHVACs
1332
- model.getAirLoopHVACs.sort.each do |air_loop|
1333
- ##### Loop through AirLoopHVAC's supply nodes to:
1334
- ##### (1) Find its AirLoopHVAC:OutdoorAirSystem using the supply node;
1335
- ##### (2) Find Controller:OutdoorAir using AirLoopHVAC:OutdoorAirSystem;
1336
- ##### (3) Get "Controller Mechanical Ventilation" from Controller:OutdoorAir.
1337
- air_loop.supplyComponents.sort.each do |supply_component|
1338
- ##### Find AirLoopHVAC:OutdoorAirSystem of AirLoopHVAC using the supply node.
1339
- hvac_component = supply_component.to_AirLoopHVACOutdoorAirSystem
1340
-
1341
- if !hvac_component.empty?
1342
- ##### Find Controller:OutdoorAir using AirLoopHVAC:OutdoorAirSystem.
1343
- hvac_component = hvac_component.get
1344
- controller_oa = hvac_component.getControllerOutdoorAir
1345
-
1346
- ##### Get "Controller Mechanical Ventilation" from Controller:OutdoorAir.
1347
- controller_mv = controller_oa.controllerMechanicalVentilation
1348
-
1349
- ##### Set "Demand Controlled Ventilation" to "Yes" or "No" in Controller:MechanicalVentilation depending on dcv_type.
1350
- if (dcv_type == 'CO2_based_DCV') || (dcv_type == 'Occupancy_based_DCV') #Occupancy
1351
- controller_mv.setDemandControlledVentilation(true)
1352
- ##### Set the "System Outdoor Air Method" field based on dcv_type in the Controller:MechanicalVentilation object
1353
- if dcv_type == 'CO2_based_DCV'
1354
- controller_mv.setSystemOutdoorAirMethod('IndoorAirQualityProcedure')
1355
- else #dcv_type == 'Occupancy_based_DCV'
1356
- controller_mv.setSystemOutdoorAirMethod('ZoneSum')
1357
- end
1358
- elsif dcv_type == 'No_DCV'
1359
- controller_mv.setDemandControlledVentilation(false)
1360
- end
1361
- # puts controller_mv
1362
-
1363
- end #if !hvac_component.empty?
1364
-
1365
- end #air_loop.supplyComponents.each do |supply_component|
1366
- end #model.getAirLoopHVACs.each do |air_loop|
1367
- end #if dcv_type != 'NECB_Default'
1421
+ # air_loop.supplyComponents.each do |supply_component|
1422
+ end
1423
+ # model.getAirLoopHVACs.each do |air_loop|
1424
+ end
1368
1425
  end
1369
1426
 
1370
- #def model_enable_demand_controlled_ventilation
1371
-
1372
-
1373
1427
  def set_lighting_per_area_led_lighting(space_type:, definition:, lighting_per_area_led_lighting:, lights_scale:)
1374
1428
  # puts "#{space_type.name.to_s} - 'space_height' - #{space_height.to_s}"
1375
1429
  occ_sens_lpd_frac = 1.0
@@ -1390,11 +1444,11 @@ class NECB2011 < Standard
1390
1444
 
1391
1445
  # ##### Since Atrium's LPD for LED lighting depends on atrium's height, the height of the atrium (if applicable) should be found.
1392
1446
  standards_space_type = space_type.standardsSpaceType.is_initialized ? space_type.standardsSpaceType.get : nil
1393
- if standards_space_type.include? 'Atrium' #TODO: Note that since none of the archetypes has Atrium, this was tested for 'Dining'. #Atrium
1394
- puts "#{standards_space_type} - has atrium" #space_type.name.to_s
1447
+ if standards_space_type.include? 'Atrium' # TODO: Note that since none of the archetypes has Atrium, this was tested for 'Dining'. #Atrium
1448
+ puts "#{standards_space_type} - has atrium" # space_type.name.to_s
1395
1449
  # Get the max height for the spacetype.
1396
1450
  max_space_height_for_spacetype = get_max_space_height_for_space_type(space_type: space_type)
1397
- if max_space_height_for_spacetype < 12.0 #TODO: Note that since none of the archetypes has Atrium, this was tested for 'Dining' with the threshold of 5.0 m for space_height.
1451
+ if max_space_height_for_spacetype < 12.0 # TODO: Note that since none of the archetypes has Atrium, this was tested for 'Dining' with the threshold of 5.0 m for space_height.
1398
1452
  # TODO: Regarding the below equations, identify which version of ASHRAE 90.1 was used in NECB2015.
1399
1453
  atrium_lpd_eq_smaller_12_intercept = 0
1400
1454
  atrium_lpd_eq_smaller_12_slope = 1.06
@@ -1403,13 +1457,13 @@ class NECB2011 < Standard
1403
1457
  lighting_per_area_led_lighting_atrium = (atrium_lpd_eq_smaller_12_intercept + atrium_lpd_eq_smaller_12_slope * 12.0) * 0.092903 # W/ft2 TODO: Note that for NECB2011, a constant LPD is used for atrium based on NECB2015's equations. NECB2011's threshold for height is 13.0 m.
1404
1458
  elsif max_space_height_for_spacetype >= 12.0 && max_space_height_for_spacetype < 13.0
1405
1459
  lighting_per_area_led_lighting_atrium = (atrium_lpd_eq_larger_12_intercept + atrium_lpd_eq_larger_12_slope * 12.5) * 0.092903 # W/ft2
1406
- else #i.e. space_height >= 13.0
1460
+ else # i.e. space_height >= 13.0
1407
1461
  lighting_per_area_led_lighting_atrium = (atrium_lpd_eq_larger_12_intercept + atrium_lpd_eq_larger_12_slope * 13.0) * 0.092903 # W/ft2
1408
1462
  end
1409
1463
  puts "#{standards_space_type} - has lighting_per_area_led_lighting_atrium - #{lighting_per_area_led_lighting_atrium}"
1410
1464
  lighting_per_area_led_lighting = lighting_per_area_led_lighting_atrium
1411
1465
  end
1412
- lighting_per_area_led_lighting = lighting_per_area_led_lighting * lights_scale
1466
+ lighting_per_area_led_lighting *= lights_scale
1413
1467
  definition.setWattsperSpaceFloorArea(OpenStudio.convert(lighting_per_area_led_lighting.to_f * occ_sens_lpd_frac, 'W/ft^2', 'W/m^2').get)
1414
1468
 
1415
1469
  OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.SpaceType', "#{space_type.name} set LPD to #{lighting_per_area_led_lighting} W/ft^2.")
@@ -1463,13 +1517,11 @@ class NECB2011 < Standard
1463
1517
 
1464
1518
  ##### The below method is for the 'model_add_daylighting_controls' method
1465
1519
  def get_parameters_sidelighting(daylight_space:, floor_surface:, floor_vertices:, floor_area:, primary_sidelighted_area:, area_weighted_vt_handle:, window_area_sum:)
1466
-
1467
1520
  daylight_space.surfaces.sort.each do |surface|
1468
-
1469
1521
  ##### Get the vertices of each exterior wall of the daylight_space on the floor
1470
1522
  ##### (these vertices will be used to calculate daylight_space depth in relation to the exterior wall, and
1471
1523
  ##### the distance of the window to vertical walls on each side of the window)
1472
- if surface.outsideBoundaryCondition == "Outdoors" && surface.surfaceType == "Wall"
1524
+ if surface.outsideBoundaryCondition == 'Outdoors' && surface.surfaceType == 'Wall'
1473
1525
  wall_vertices_x_on_floor = []
1474
1526
  wall_vertices_y_on_floor = []
1475
1527
  surface_z_min = [surface.vertices[0].z, surface.vertices[1].z, surface.vertices[2].z, surface.vertices[3].z].min
@@ -1482,7 +1534,7 @@ class NECB2011 < Standard
1482
1534
  end
1483
1535
  end
1484
1536
 
1485
- if surface.outsideBoundaryCondition == "Outdoors" && surface.surfaceType == "Wall" && surface_z_min == floor_vertices[0][0].z
1537
+ if surface.outsideBoundaryCondition == 'Outdoors' && surface.surfaceType == 'Wall' && surface_z_min == floor_vertices[0][0].z
1486
1538
 
1487
1539
  ##### Calculate the daylight_space depth in relation to the considered exterior wall.
1488
1540
  ##### To calculate daylight_space depth, first get the floor vertices which are on the opposite side of the considered exterior wall.
@@ -1496,8 +1548,8 @@ class NECB2011 < Standard
1496
1548
  end
1497
1549
 
1498
1550
  ##### To calculate daylight_space depth, second calculate floor length on both sides: (1) exterior wall side, (2) on the opposite side of the exterior wall
1499
- floor_width_wall_side = Math.sqrt((wall_vertices_x_on_floor[0] - wall_vertices_x_on_floor[1]) ** 2 + (wall_vertices_y_on_floor[0] - wall_vertices_y_on_floor[1]) ** 2)
1500
- floor_width_wall_opposite = Math.sqrt((floor_vertices_x_wall_opposite[0] - floor_vertices_x_wall_opposite[1]) ** 2 + (floor_vertices_y_wall_opposite[0] - floor_vertices_y_wall_opposite[1]) ** 2)
1551
+ floor_width_wall_side = Math.sqrt((wall_vertices_x_on_floor[0] - wall_vertices_x_on_floor[1])**2 + (wall_vertices_y_on_floor[0] - wall_vertices_y_on_floor[1])**2)
1552
+ floor_width_wall_opposite = Math.sqrt((floor_vertices_x_wall_opposite[0] - floor_vertices_x_wall_opposite[1])**2 + (floor_vertices_y_wall_opposite[0] - floor_vertices_y_wall_opposite[1])**2)
1501
1553
 
1502
1554
  ##### Now, daylight_space depth can be calculated using the floor area and two lengths of the floor (note that these two lengths are in parallel to each other).
1503
1555
  daylight_space_depth = 2 * floor_area / (floor_width_wall_side + floor_width_wall_opposite)
@@ -1505,7 +1557,7 @@ class NECB2011 < Standard
1505
1557
  ##### Loop through the windows (including fixed and operable ones) to get window specification (width, height, area, visible transmittance (VT)), and area-weighted VT
1506
1558
  surface.subSurfaces.sort.each do |subsurface|
1507
1559
  # puts subsurface.name.to_s
1508
- if subsurface.subSurfaceType == "FixedWindow" || subsurface.subSurfaceType == "OperableWindow"
1560
+ if subsurface.subSurfaceType == 'FixedWindow' || subsurface.subSurfaceType == 'OperableWindow'
1509
1561
  window_vt = subsurface.visibleTransmittance
1510
1562
  window_vt = window_vt.get
1511
1563
  window_area = subsurface.netArea
@@ -1513,46 +1565,49 @@ class NECB2011 < Standard
1513
1565
  area_weighted_vt_handle += window_area * window_vt
1514
1566
  window_vertices = subsurface.vertices
1515
1567
  if window_vertices[0].z.round(2) == window_vertices[1].z.round(2)
1516
- window_width = Math.sqrt((window_vertices[0].x - window_vertices[1].x) ** 2.0 + (window_vertices[0].y - window_vertices[1].y) ** 2.0)
1568
+ window_width = Math.sqrt((window_vertices[0].x - window_vertices[1].x)**2.0 + (window_vertices[0].y - window_vertices[1].y)**2.0)
1517
1569
  else
1518
- window_width = Math.sqrt((window_vertices[1].x - window_vertices[2].x) ** 2.0 + (window_vertices[1].y - window_vertices[2].y) ** 2.0)
1570
+ window_width = Math.sqrt((window_vertices[1].x - window_vertices[2].x)**2.0 + (window_vertices[1].y - window_vertices[2].y)**2.0)
1519
1571
  end
1520
1572
  window_head_height = [window_vertices[0].z, window_vertices[1].z, window_vertices[2].z, window_vertices[3].z].max.round(2)
1521
- primary_sidelighted_area_depth = [window_head_height, daylight_space_depth].min #as per NECB2011: 4.2.2.9.
1573
+ primary_sidelighted_area_depth = [window_head_height, daylight_space_depth].min # as per NECB2011: 4.2.2.9.
1522
1574
 
1523
1575
  ##### Calculate the distance of the window to vertical walls on each side of the window (this is used to determine the sidelighted area's width).
1524
1576
  window_vertices_on_floor = []
1525
1577
  window_vertices.each do |vertex|
1526
1578
  window_vertices_on_floor << floor_surface.plane.project(vertex)
1527
1579
  end
1528
- window_wall_distance_side1 = [Math.sqrt((wall_vertices_x_on_floor[0] - window_vertices_on_floor[0].x) ** 2.0 + (wall_vertices_y_on_floor[0] - window_vertices_on_floor[0].y) ** 2.0),
1529
- Math.sqrt((wall_vertices_x_on_floor[0] - window_vertices_on_floor[2].x) ** 2.0 + (wall_vertices_y_on_floor[0] - window_vertices_on_floor[2].y) ** 2.0),
1580
+ window_wall_distance_side1 = [Math.sqrt((wall_vertices_x_on_floor[0] - window_vertices_on_floor[0].x)**2.0 + (wall_vertices_y_on_floor[0] - window_vertices_on_floor[0].y)**2.0),
1581
+ Math.sqrt((wall_vertices_x_on_floor[0] - window_vertices_on_floor[2].x)**2.0 + (wall_vertices_y_on_floor[0] - window_vertices_on_floor[2].y)**2.0),
1530
1582
  0.6].min # 0.6 m as per NECB2011: 4.2.2.9.
1531
- window_wall_distance_side2 = [Math.sqrt((wall_vertices_x_on_floor[1] - window_vertices_on_floor[0].x) ** 2.0 + (wall_vertices_y_on_floor[1] - window_vertices_on_floor[0].y) ** 2.0),
1532
- Math.sqrt((wall_vertices_x_on_floor[1] - window_vertices_on_floor[2].x) ** 2.0 + (wall_vertices_y_on_floor[1] - window_vertices_on_floor[2].y) ** 2.0),
1583
+ window_wall_distance_side2 = [Math.sqrt((wall_vertices_x_on_floor[1] - window_vertices_on_floor[0].x)**2.0 + (wall_vertices_y_on_floor[1] - window_vertices_on_floor[0].y)**2.0),
1584
+ Math.sqrt((wall_vertices_x_on_floor[1] - window_vertices_on_floor[2].x)**2.0 + (wall_vertices_y_on_floor[1] - window_vertices_on_floor[2].y)**2.0),
1533
1585
  0.6].min # 0.6 m as per NECB2011: 4.2.2.9.
1534
1586
  primary_sidelighted_area_width = window_wall_distance_side1 + window_width + window_wall_distance_side2
1535
- primary_sidelighted_area = primary_sidelighted_area + primary_sidelighted_area_depth * primary_sidelighted_area_width
1536
- end #if subsurface.subSurfaceType == "FixedWindow" || subsurface.subSurfaceType == "OperableWindow"
1537
- end #surface.subSurfaces.each do |subsurface|
1538
- end #if surface.outsideBoundaryCondition == "Outdoors" && surface.surfaceType == "Wall" && surface_z_min == floor_vertices[0][0].z
1539
- end #daylight_space.surfaces.each do |surface|
1587
+ primary_sidelighted_area += primary_sidelighted_area_depth * primary_sidelighted_area_width
1588
+ # if subsurface.subSurfaceType == "FixedWindow" || subsurface.subSurfaceType == "OperableWindow"
1589
+ end
1590
+ # surface.subSurfaces.each do |subsurface|
1591
+ end
1592
+ # if surface.outsideBoundaryCondition == "Outdoors" && surface.surfaceType == "Wall" && surface_z_min == floor_vertices[0][0].z
1593
+ end
1594
+ # daylight_space.surfaces.each do |surface|
1595
+ end
1540
1596
 
1541
1597
  return primary_sidelighted_area, area_weighted_vt_handle, window_area_sum
1542
1598
  end
1543
1599
 
1544
1600
  ##### The below method is for the 'model_add_daylighting_controls' method
1545
1601
  def get_parameters_skylight(daylight_space:, skylight_area_weighted_vt_handle:, skylight_area_sum:, daylighted_under_skylight_area:)
1546
-
1547
1602
  daylight_space.surfaces.sort.each do |surface|
1548
1603
  ##### Get roof vertices
1549
- if surface.outsideBoundaryCondition == "Outdoors" && surface.surfaceType == "RoofCeiling"
1604
+ if surface.outsideBoundaryCondition == 'Outdoors' && surface.surfaceType == 'RoofCeiling'
1550
1605
  roof_vertices = surface.vertices
1551
1606
  end
1552
1607
 
1553
- ##### Loop through each subsurafce to calculate daylighted_area_under_skylights and skylight_effective_aperture for each daylight_space
1608
+ ##### Loop through each subsurface to calculate daylighted_area_under_skylights and skylight_effective_aperture for each daylight_space
1554
1609
  surface.subSurfaces.sort.each do |subsurface|
1555
- if subsurface.subSurfaceType == "Skylight"
1610
+ if subsurface.subSurfaceType == 'Skylight'
1556
1611
  skylight_vt = subsurface.visibleTransmittance
1557
1612
  skylight_vt = skylight_vt.get
1558
1613
  skylight_area = subsurface.netArea
@@ -1563,25 +1618,25 @@ class NECB2011 < Standard
1563
1618
  skylight_vertices = subsurface.vertices
1564
1619
 
1565
1620
  ##### Calculate skylight width and height
1566
- skylight_width = Math.sqrt((skylight_vertices[0].x - skylight_vertices[1].x) ** 2.0 + (skylight_vertices[0].y - skylight_vertices[1].y) ** 2.0)
1567
- skylight_length = Math.sqrt((skylight_vertices[0].x - skylight_vertices[3].x) ** 2.0 + (skylight_vertices[0].y - skylight_vertices[3].y) ** 2.0)
1621
+ skylight_width = Math.sqrt((skylight_vertices[0].x - skylight_vertices[1].x)**2.0 + (skylight_vertices[0].y - skylight_vertices[1].y)**2.0)
1622
+ skylight_length = Math.sqrt((skylight_vertices[0].x - skylight_vertices[3].x)**2.0 + (skylight_vertices[0].y - skylight_vertices[3].y)**2.0)
1568
1623
 
1569
1624
  ##### Get ceiling height assuming the skylight is flush with the ceiling
1570
1625
  ceiling_height = skylight_vertices[0].z
1571
1626
 
1572
1627
  ##### Calculate roof lengths
1573
1628
  ##### (Note: used OpenStudio BCL measure called "assign_ashrae_9012010_daylighting_controls" with some changes/correcctions)
1574
- roof_length_0 = Math.sqrt((roof_vertices[0].x - roof_vertices[1].x) ** 2.0 + (roof_vertices[0].y - roof_vertices[1].y) ** 2.0)
1575
- roof_length_1 = Math.sqrt((roof_vertices[1].x - roof_vertices[2].x) ** 2.0 + (roof_vertices[1].y - roof_vertices[2].y) ** 2.0)
1576
- roof_length_2 = Math.sqrt((roof_vertices[2].x - roof_vertices[3].x) ** 2.0 + (roof_vertices[2].y - roof_vertices[3].y) ** 2.0)
1577
- roof_length_3 = Math.sqrt((roof_vertices[3].x - roof_vertices[0].x) ** 2.0 + (roof_vertices[3].y - roof_vertices[0].y) ** 2.0)
1629
+ roof_length_0 = Math.sqrt((roof_vertices[0].x - roof_vertices[1].x)**2.0 + (roof_vertices[0].y - roof_vertices[1].y)**2.0)
1630
+ roof_length_1 = Math.sqrt((roof_vertices[1].x - roof_vertices[2].x)**2.0 + (roof_vertices[1].y - roof_vertices[2].y)**2.0)
1631
+ roof_length_2 = Math.sqrt((roof_vertices[2].x - roof_vertices[3].x)**2.0 + (roof_vertices[2].y - roof_vertices[3].y)**2.0)
1632
+ roof_length_3 = Math.sqrt((roof_vertices[3].x - roof_vertices[0].x)**2.0 + (roof_vertices[3].y - roof_vertices[0].y)**2.0)
1578
1633
 
1579
1634
  ##### Find the skylight point that is the closest one to roof_vertex_0
1580
1635
  ##### (Note: used OpenStudio BCL measure called "assign_ashrae_9012010_daylighting_controls" with some changes/correcctions)
1581
- roof_vertex_0_skylight_vertex_0 = Math.sqrt((roof_vertices[0].x - skylight_vertices[0].x) ** 2.0 + (roof_vertices[0].y - skylight_vertices[0].y) ** 2.0)
1582
- roof_vertex_0_skylight_vertex_1 = Math.sqrt((roof_vertices[0].x - skylight_vertices[1].x) ** 2.0 + (roof_vertices[0].y - skylight_vertices[1].y) ** 2.0)
1583
- roof_vertex_0_skylight_vertex_2 = Math.sqrt((roof_vertices[0].x - skylight_vertices[2].x) ** 2.0 + (roof_vertices[0].y - skylight_vertices[2].y) ** 2.0)
1584
- roof_vertex_0_skylight_vertex_3 = Math.sqrt((roof_vertices[0].x - skylight_vertices[3].x) ** 2.0 + (roof_vertices[0].y - skylight_vertices[3].y) ** 2.0)
1636
+ roof_vertex_0_skylight_vertex_0 = Math.sqrt((roof_vertices[0].x - skylight_vertices[0].x)**2.0 + (roof_vertices[0].y - skylight_vertices[0].y)**2.0)
1637
+ roof_vertex_0_skylight_vertex_1 = Math.sqrt((roof_vertices[0].x - skylight_vertices[1].x)**2.0 + (roof_vertices[0].y - skylight_vertices[1].y)**2.0)
1638
+ roof_vertex_0_skylight_vertex_2 = Math.sqrt((roof_vertices[0].x - skylight_vertices[2].x)**2.0 + (roof_vertices[0].y - skylight_vertices[2].y)**2.0)
1639
+ roof_vertex_0_skylight_vertex_3 = Math.sqrt((roof_vertices[0].x - skylight_vertices[3].x)**2.0 + (roof_vertices[0].y - skylight_vertices[3].y)**2.0)
1585
1640
  roof_vertex_0_closest_distance = [roof_vertex_0_skylight_vertex_0, roof_vertex_0_skylight_vertex_1, roof_vertex_0_skylight_vertex_2, roof_vertex_0_skylight_vertex_3].min
1586
1641
  if roof_vertex_0_closest_distance == roof_vertex_0_skylight_vertex_0
1587
1642
  roof_vertex_0_closest_point = skylight_vertices[0]
@@ -1595,10 +1650,10 @@ class NECB2011 < Standard
1595
1650
 
1596
1651
  ##### Find the skylight point that is the closest one to roof_vertex_2
1597
1652
  ##### (Note: used OpenStudio BCL measure called "assign_ashrae_9012010_daylighting_controls" with some changes/correcctions)
1598
- roof_vertex_2_skylight_vertex_0 = Math.sqrt((roof_vertices[2].x - skylight_vertices[0].x) ** 2.0 + (roof_vertices[2].y - skylight_vertices[0].y) ** 2.0)
1599
- roof_vertex_2_skylight_vertex_1 = Math.sqrt((roof_vertices[2].x - skylight_vertices[1].x) ** 2.0 + (roof_vertices[2].y - skylight_vertices[1].y) ** 2.0)
1600
- roof_vertex_2_skylight_vertex_2 = Math.sqrt((roof_vertices[2].x - skylight_vertices[2].x) ** 2.0 + (roof_vertices[2].y - skylight_vertices[2].y) ** 2.0)
1601
- roof_vertex_2_skylight_vertex_3 = Math.sqrt((roof_vertices[2].x - skylight_vertices[3].x) ** 2.0 + (roof_vertices[2].y - skylight_vertices[3].y) ** 2.0)
1653
+ roof_vertex_2_skylight_vertex_0 = Math.sqrt((roof_vertices[2].x - skylight_vertices[0].x)**2.0 + (roof_vertices[2].y - skylight_vertices[0].y)**2.0)
1654
+ roof_vertex_2_skylight_vertex_1 = Math.sqrt((roof_vertices[2].x - skylight_vertices[1].x)**2.0 + (roof_vertices[2].y - skylight_vertices[1].y)**2.0)
1655
+ roof_vertex_2_skylight_vertex_2 = Math.sqrt((roof_vertices[2].x - skylight_vertices[2].x)**2.0 + (roof_vertices[2].y - skylight_vertices[2].y)**2.0)
1656
+ roof_vertex_2_skylight_vertex_3 = Math.sqrt((roof_vertices[2].x - skylight_vertices[3].x)**2.0 + (roof_vertices[2].y - skylight_vertices[3].y)**2.0)
1602
1657
  roof_vertex_2_closest_distance = [roof_vertex_2_skylight_vertex_0, roof_vertex_2_skylight_vertex_1, roof_vertex_2_skylight_vertex_2, roof_vertex_2_skylight_vertex_3].min
1603
1658
  if roof_vertex_2_closest_distance == roof_vertex_2_skylight_vertex_0
1604
1659
  roof_vertex_2_closest_point = skylight_vertices[0]
@@ -1641,11 +1696,11 @@ class NECB2011 < Standard
1641
1696
 
1642
1697
  ##### As noted above, the width and length of the daylighted area under the skylight are re-calculated (as per NECB2011: 4.2.2.5.), if any exterior walls has window(s).
1643
1698
  ##### To this end, the window_head_height should be calculated, as below:
1644
- daylight_space.surfaces.sort.each do |surface|
1645
- if surface.outsideBoundaryCondition == "Outdoors" && surface.surfaceType == "Wall"
1699
+ daylight_space.surfaces.sort.each do |curr_surface|
1700
+ if curr_surface.outsideBoundaryCondition == 'Outdoors' && curr_surface.surfaceType == 'Wall'
1646
1701
  wall_vertices_on_floor_x = []
1647
1702
  wall_vertices_on_floor_y = []
1648
- wall_vertices = surface.vertices
1703
+ wall_vertices = curr_surface.vertices
1649
1704
  if wall_vertices[0].z == wall_vertices[1].z
1650
1705
  wall_vertices_on_floor_x << wall_vertices[0].x
1651
1706
  wall_vertices_on_floor_x << wall_vertices[1].x
@@ -1661,7 +1716,7 @@ class NECB2011 < Standard
1661
1716
  window_head_height = [window_vertices[0].z, window_vertices[1].z, window_vertices[2].z, window_vertices[3].z].max.round(2)
1662
1717
 
1663
1718
  ##### Calculate the exterior wall length (on the floor)
1664
- exterior_wall_length = Math.sqrt((wall_vertices_on_floor_x[0] - wall_vertices_on_floor_x[1]) ** 2.0 + (wall_vertices_on_floor_y[0] - wall_vertices_on_floor_y[1]) ** 2.0)
1719
+ exterior_wall_length = Math.sqrt((wall_vertices_on_floor_x[0] - wall_vertices_on_floor_x[1])**2.0 + (wall_vertices_on_floor_y[0] - wall_vertices_on_floor_y[1])**2.0)
1665
1720
 
1666
1721
  ##### Calculate the vertical distance of skylight_vertices[0] projection onto the roof/floor to the exterior wall
1667
1722
  skylight_vertex_0_triangle_area = 0.5 * (((wall_vertices_on_floor_x[0] - wall_vertices_on_floor_x[1]) * (wall_vertices_on_floor_y[0] - skylight_vertices[0].y)) -
@@ -1679,35 +1734,84 @@ class NECB2011 < Standard
1679
1734
  skylight_vertex_3_distance = (2.0 * skylight_vertex_3_triangle_area) / exterior_wall_length
1680
1735
 
1681
1736
  ##### Loop through the subsurfaces that has exterior windows to re-calculate the width and length of the daylighted area under the skylight
1682
- surface.subSurfaces.sort.each do |subsurface|
1683
- if subsurface.subSurfaceType == "FixedWindow" || subsurface.subSurfaceType == "OperableWindow"
1737
+ curr_surface.subSurfaces.sort.each do |curr_subsurface|
1738
+ if curr_subsurface.subSurfaceType == 'FixedWindow' || curr_subsurface.subSurfaceType == 'OperableWindow'
1684
1739
 
1685
- if skylight_vertex_0_distance == skylight_vertex_1_distance #skylight_01 is in parellel to the exterior wall
1740
+ if skylight_vertex_0_distance == skylight_vertex_1_distance # skylight_01 is in parellel to the exterior wall
1686
1741
  if skylight_vertex_0_distance.round(2) == distance_2.round(2)
1687
1742
  daylighted_under_skylight_length = skylight_length + [0.7 * ceiling_height, distance_2, distance_2 - window_head_height].min + [0.7 * ceiling_height, distance_3].min
1688
1743
  elsif skylight_vertex_0_distance.round(2) == distance_3.round(2)
1689
1744
  daylighted_under_skylight_length = skylight_length + [0.7 * ceiling_height, distance_2].min + [0.7 * ceiling_height, distance_3, distance_3 - window_head_height].min
1690
1745
  end
1691
- elsif skylight_vertex_0_distance == skylight_vertex_3_distance #skylight_03 is in parellel to the exterior wall
1746
+ elsif skylight_vertex_0_distance == skylight_vertex_3_distance # skylight_03 is in parellel to the exterior wall
1692
1747
  if skylight_vertex_0_distance.round(2) == distance_1.round(2)
1693
1748
  daylighted_under_skylight_width = skylight_width + [0.7 * ceiling_height, distance_1, distance_1 - window_head_height].min + [0.7 * ceiling_height, distance_4].min
1694
1749
  elsif skylight_vertex_0_distance.round(2) == distance_4.round(2)
1695
1750
  daylighted_under_skylight_width = skylight_width + [0.7 * ceiling_height, distance_1].min + [0.7 * ceiling_height, distance_4, distance_4 - window_head_height].min
1696
1751
  end
1697
- end #if skylight_vertex_0_distance == skylight_vertex_1_distance
1752
+ # if skylight_vertex_0_distance == skylight_vertex_1_distance
1753
+ end
1698
1754
 
1699
1755
  daylighted_under_skylight_area += daylighted_under_skylight_length * daylighted_under_skylight_width
1756
+ # if subsurface.subSurfaceType == "FixedWindow" || subsurface.subSurfaceType == "OperableWindow"
1757
+ end
1758
+ # surface.subSurfaces.each do |subsurface|
1759
+ end
1760
+ # if surface.outsideBoundaryCondition == "Outdoors" && surface.surfaceType == "Wall"
1761
+ end
1762
+ # daylight_space.surfaces.each do |surface|
1763
+ end
1764
+ # if subsurface.subSurfaceType == "Skylight"
1765
+ end
1766
+ # surface.subSurfaces.each do |subsurface|
1767
+ end
1768
+ # daylight_space.surfaces.each do |surface|
1769
+ end
1700
1770
 
1701
- end #if subsurface.subSurfaceType == "FixedWindow" || subsurface.subSurfaceType == "OperableWindow"
1702
- end #surface.subSurfaces.each do |subsurface|
1703
- end #if surface.outsideBoundaryCondition == "Outdoors" && surface.surfaceType == "Wall"
1704
- end #daylight_space.surfaces.each do |surface|
1771
+ return daylighted_under_skylight_area, skylight_area_weighted_vt_handle, skylight_area_sum
1772
+ end
1705
1773
 
1706
- end #if subsurface.subSurfaceType == "Skylight"
1707
- end #surface.subSurfaces.each do |subsurface|
1708
- end #daylight_space.surfaces.each do |surface|
1774
+ def set_output_variables(model:,output_variables:)
1775
+ unless output_variables.nil? or output_variables.empty?
1776
+ output_variables.each do |output_variable|
1777
+ puts output_variable
1778
+ puts output_variable['frequency']
1779
+ raise("Frequency is not valid. Must by \"hourly\" or \"timestep\" but got #{output_variable}.") unless ["timestep","hourly",'daily','monthly','annual'].include?(output_variable['frequency'])
1780
+ output = OpenStudio::Model::OutputVariable.new(output_variable['variable'],model)
1781
+ output.setKeyValue(output_variable['key'])
1782
+ output.setReportingFrequency(output_variable['frequency'])
1783
+ end
1784
+ end
1785
+ return model
1786
+ end
1709
1787
 
1710
- return daylighted_under_skylight_area, skylight_area_weighted_vt_handle, skylight_area_sum
1788
+ def set_output_meters(model:,output_meters:)
1789
+ unless output_meters.nil? or output_meters.empty?
1790
+ # remove existing output meters
1791
+ existing_meters = model.getOutputMeters
1792
+
1793
+ # OpenStudio doesn't seemt to like two meters of the same name, even if they have different reporting frequencies.
1794
+ output_meters.each do |new_meter|
1795
+ #check if meter already exists
1796
+ result = existing_meters.select { |e_m| e_m.name == new_meter['name'] }
1797
+ puts("More and one output meter named #{new_meter['name']}") if result.size > 1
1798
+ if result.size >= 1
1799
+ existing_meter = result[0]
1800
+ puts("A meter named #{new_meter['name']} already exists. One will not be added to the model.")
1801
+ if existing_meter.reportingFrequency != new_meter['frequency']
1802
+ existing_meter.setReportingFrequency(new_meter['frequency'])
1803
+ puts("Changing reporting frequency of existing meter to #{new_meter['frequency']}.")
1804
+ end
1805
+ end
1806
+ if result.size == 0
1807
+ meter = OpenStudio::Model::OutputMeter.new(model)
1808
+ meter.setName(new_meter['name'])
1809
+ meter.setReportingFrequency(new_meter['frequency'])
1810
+ puts("Adding meter for #{meter.name} reporting #{new_meter['frequency']}")
1811
+ end
1812
+ end
1813
+ end
1814
+ return model
1711
1815
  end
1712
1816
 
1713
- end
1817
+ end