openstudio-standards 0.2.14 → 0.2.15.pre.rc1

Sign up to get free protection for your applications and to get access to all the features.
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