openstudio-standards 0.2.14 → 0.2.15.pre.rc1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (642) hide show
  1. checksums.yaml +4 -4
  2. data/data/geometry/ASHRAECollege.json +0 -19
  3. data/data/geometry/ASHRAEMidriseApartment.json +47 -47
  4. data/data/geometry/ASHRAESecondarySchool.osm +2 -2
  5. data/data/standards/OpenStudio_Standards-ashrae_90_1.xlsx +0 -0
  6. data/data/standards/export_OpenStudio_libraries.rb +1 -1
  7. data/data/standards/manage_OpenStudio_Standards.rb +43 -87
  8. data/data/standards/metadata_units_OpenStudio_Standards-ashrae_90_1.csv +9 -0
  9. data/data/standards/openstudio_standards_duplicates_log.csv +142 -27
  10. data/data/standards/test_performance_expected_dd_results.csv +2016 -2016
  11. data/data/weather/CAN_NU_Iqaluit.AP.719090_CWEC2016.ddy +2316 -0
  12. data/data/weather/CAN_NU_Iqaluit.AP.719090_CWEC2016.epw +8768 -0
  13. data/data/weather/CAN_NU_Iqaluit.AP.719090_CWEC2016.stat +697 -0
  14. data/lib/openstudio-standards/btap/WeatherData1.json +54 -0
  15. data/lib/openstudio-standards/btap/WeatherData1.xlsx +0 -0
  16. data/lib/openstudio-standards/btap/btap_result.rb +12 -10
  17. data/lib/openstudio-standards/btap/envelope.rb +2 -2
  18. data/lib/openstudio-standards/btap/geometry.rb +96 -49
  19. data/lib/openstudio-standards/{utilities → btap/utilities}/Add_template_field_to_json.rb +0 -0
  20. data/lib/openstudio-standards/{utilities → btap/utilities}/convert_surfaces_to_adiabatic_necb_8426.rb +0 -0
  21. data/lib/openstudio-standards/{utilities → btap/utilities}/generate_space_types.rb +0 -0
  22. data/lib/openstudio-standards/{utilities → btap/utilities}/necb_to_epw_map.rb +0 -0
  23. data/lib/openstudio-standards/{utilities → btap/utilities}/os_sim_extract.rb +0 -0
  24. data/lib/openstudio-standards/{utilities → btap/utilities}/rename_surfaces.rb +0 -0
  25. data/lib/openstudio-standards/{utilities → btap/utilities}/round_surf_coords.rb +0 -0
  26. data/lib/openstudio-standards/{utilities → btap/utilities}/sched_create.rb +0 -0
  27. data/lib/openstudio-standards/{utilities → btap/utilities}/set_mult_to_adiabatic.rb +0 -0
  28. data/lib/openstudio-standards/btap/utilities/space_type.rb +78 -0
  29. data/lib/openstudio-standards/{utilities → btap/utilities}/weatherData1_xlsx_to_json.rb +0 -0
  30. data/lib/openstudio-standards/hvac_sizing/Siz.AirConditionerVariableRefrigerantFlow.rb +1 -1
  31. data/lib/openstudio-standards/hvac_sizing/Siz.HVACComponent.rb +1 -1
  32. data/lib/openstudio-standards/hvac_sizing/Siz.HeatingCoolingFuels.rb +20 -6
  33. data/lib/openstudio-standards/hvac_sizing/Siz.Model.rb +6 -6
  34. data/lib/openstudio-standards/hvac_sizing/Siz.WaterHeaterMixed.rb +2 -2
  35. data/lib/openstudio-standards/hvac_sizing/Siz.ZoneHVACTerminalUnitVariableRefrigerantFlow.rb +1 -1
  36. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.AirTerminalSingleDuctVAVReheat.rb +2 -1
  37. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.PumpVariableSpeed.rb +6 -7
  38. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.AirTerminalSingleDuctVAVReheat.rb +2 -1
  39. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.FanConstantVolume.rb +5 -4
  40. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.FanOnOff.rb +5 -5
  41. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.FanVariableVolume.rb +5 -4
  42. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.PumpVariableSpeed.rb +6 -7
  43. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.AirTerminalSingleDuctVAVReheat.rb +2 -1
  44. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.FanConstantVolume.rb +5 -4
  45. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.FanOnOff.rb +5 -5
  46. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.FanVariableVolume.rb +5 -4
  47. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.Model.elevators.rb +6 -4
  48. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.Model.rb +10 -9
  49. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.PumpVariableSpeed.rb +9 -11
  50. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirTerminalSingleDuctVAVReheat.rb +2 -1
  51. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.FanConstantVolume.rb +5 -4
  52. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.FanOnOff.rb +5 -5
  53. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.FanVariableVolume.rb +5 -4
  54. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.Model.elevators.rb +11 -7
  55. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.Model.rb +17 -16
  56. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.PumpVariableSpeed.rb +9 -11
  57. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.hvac_systems.rb +4 -2
  58. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.AirTerminalSingleDuctVAVReheat.rb +2 -1
  59. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.FanConstantVolume.rb +5 -4
  60. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.FanOnOff.rb +5 -5
  61. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.FanVariableVolume.rb +5 -4
  62. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.Model.elevators.rb +11 -7
  63. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.Model.rb +23 -22
  64. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.PumpVariableSpeed.rb +9 -10
  65. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.hvac_systems.rb +4 -2
  66. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirTerminalSingleDuctVAVReheat.rb +2 -1
  67. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.FanConstantVolume.rb +5 -4
  68. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.FanOnOff.rb +5 -5
  69. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.FanVariableVolume.rb +5 -4
  70. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Model.elevators.rb +11 -7
  71. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Model.rb +23 -22
  72. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Pump.rb +89 -0
  73. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.PumpVariableSpeed.rb +9 -10
  74. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Space.rb +76 -0
  75. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.hvac_systems.rb +22 -2
  76. data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.AirTerminalSingleDuctVAVReheat.rb +2 -1
  77. data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.Model.elevators.rb +11 -11
  78. data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.refrigeration.rb +5 -4
  79. data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.AirTerminalSingleDuctVAVReheat.rb +2 -1
  80. data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.CoilHeatingGas.rb +5 -4
  81. data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.Model.elevators.rb +11 -11
  82. data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.refrigeration.rb +5 -4
  83. data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.AirTerminalSingleDuctVAVReheat.rb +2 -1
  84. data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.FanConstantVolume.rb +5 -4
  85. data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.FanOnOff.rb +5 -5
  86. data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.FanVariableVolume.rb +5 -4
  87. data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.HeatExchangerAirToAirSensibleAndLatent.rb +2 -0
  88. data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.Model.elevators.rb +11 -7
  89. data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.Model.rb +10 -10
  90. data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.hvac_systems.rb +4 -2
  91. data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirTerminalSingleDuctVAVReheat.rb +2 -1
  92. data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.FanConstantVolume.rb +5 -4
  93. data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.FanOnOff.rb +5 -5
  94. data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.FanVariableVolume.rb +5 -4
  95. data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.HeatExchangerAirToAirSensibleAndLatent.rb +2 -0
  96. data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.Model.elevators.rb +11 -7
  97. data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.Model.rb +10 -10
  98. data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.hvac_systems.rb +4 -2
  99. data/lib/openstudio-standards/prototypes/cbes/cbes.Model.elevators.rb +3 -6
  100. data/lib/openstudio-standards/prototypes/cbes/cbes.refrigeration.rb +5 -4
  101. data/lib/openstudio-standards/prototypes/cbes/cbes_t24_2008/cbes_t24_2008.FanConstantVolume.rb +5 -3
  102. data/lib/openstudio-standards/prototypes/cbes/cbes_t24_2008/cbes_t24_2008.FanOnOff.rb +5 -4
  103. data/lib/openstudio-standards/prototypes/cbes/cbes_t24_2008/cbes_t24_2008.FanVariableVolume.rb +5 -3
  104. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.College.rb +65 -30
  105. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Courthouse.rb +54 -23
  106. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.FullServiceRestaurant.rb +135 -147
  107. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.HighRiseApartment.rb +42 -7
  108. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Hospital.rb +85 -12
  109. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Laboratory.rb +42 -30
  110. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeDataCenterHighITE.rb +39 -8
  111. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeDataCenterLowITE.rb +39 -8
  112. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeHotel.rb +60 -12
  113. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeOffice.rb +33 -265
  114. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeOfficeDetailed.rb +41 -3
  115. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.MediumOffice.rb +69 -297
  116. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.MediumOfficeDetailed.rb +68 -25
  117. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.MidriseApartment.rb +88 -59
  118. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Outpatient.rb +88 -9
  119. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.PrimarySchool.rb +48 -10
  120. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.QuickServiceRestaurant.rb +130 -145
  121. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.RetailStandalone.rb +29 -101
  122. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.RetailStripmall.rb +24 -7
  123. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SecondarySchool.rb +48 -589
  124. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallDataCenterHighITE.rb +38 -7
  125. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallDataCenterLowITE.rb +38 -8
  126. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallHotel.rb +40 -7
  127. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallOffice.rb +85 -171
  128. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallOfficeDetailed.rb +87 -44
  129. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SuperMarket.rb +46 -5
  130. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SuperTallBuilding.rb +105 -17
  131. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.TallBuilding.rb +97 -15
  132. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Warehouse.rb +26 -167
  133. data/lib/openstudio-standards/prototypes/common/do_not_edit_metaclasses.rb +3828 -1131
  134. data/lib/openstudio-standards/prototypes/common/objects/Prototype.AirConditionerVariableRefrigerantFlow.rb +3 -0
  135. data/lib/openstudio-standards/prototypes/common/objects/Prototype.AirTerminalSingleDuctVAVReheat.rb +2 -1
  136. data/lib/openstudio-standards/prototypes/common/objects/Prototype.BoilerHotWater.rb +2 -0
  137. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CentralAirSourceHeatPump.rb +2 -0
  138. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingDXSingleSpeed.rb +4 -1
  139. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingDXTwoSpeed.rb +3 -0
  140. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingWater.rb +4 -1
  141. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingWaterToAirHeatPumpEquationFit.rb +3 -0
  142. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingDXSingleSpeed.rb +9 -0
  143. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingElectric.rb +3 -0
  144. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingGas.rb +9 -4
  145. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingWater.rb +4 -1
  146. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingWaterToAirHeatPumpEquationFit.rb +3 -0
  147. data/lib/openstudio-standards/prototypes/common/objects/Prototype.ControllerWaterCoil.rb +2 -2
  148. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoolingTower.rb +4 -1
  149. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Fan.rb +23 -2
  150. data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanConstantVolume.rb +29 -4
  151. data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanOnOff.rb +29 -5
  152. data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanVariableVolume.rb +43 -4
  153. data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanZoneExhaust.rb +22 -0
  154. data/lib/openstudio-standards/prototypes/common/objects/Prototype.HeatExchangerAirToAirSensibleAndLatent.rb +46 -3
  155. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.elevators.rb +27 -22
  156. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.exterior_lights.rb +15 -8
  157. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.hvac.rb +22 -4
  158. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.rb +429 -59
  159. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.swh.rb +18 -11
  160. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.transformers.rb +11 -2
  161. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Pump.rb +1 -0
  162. data/lib/openstudio-standards/prototypes/common/objects/Prototype.PumpVariableSpeed.rb +8 -10
  163. data/lib/openstudio-standards/prototypes/common/objects/Prototype.ServiceWaterHeating.rb +37 -28
  164. data/lib/openstudio-standards/prototypes/common/objects/Prototype.SizingSystem.rb +24 -6
  165. data/lib/openstudio-standards/prototypes/common/objects/Prototype.hvac_systems.rb +251 -65
  166. data/lib/openstudio-standards/prototypes/common/objects/Prototype.radiant_system_controls.rb +1 -1
  167. data/lib/openstudio-standards/prototypes/common/objects/Prototype.refrigeration.rb +46 -31
  168. data/lib/openstudio-standards/prototypes/common/objects/Prototype.utilities.rb +62 -10
  169. data/lib/openstudio-standards/prototypes/common/prototype_metaprogramming.rb +76 -33
  170. data/lib/openstudio-standards/prototypes/deer/deer.Model.rb +1 -1
  171. data/lib/openstudio-standards/standards/Standards.AirLoopHVAC.rb +445 -275
  172. data/lib/openstudio-standards/standards/Standards.AirTerminalSingleDuctParallelPIUReheat.rb +3 -3
  173. data/lib/openstudio-standards/standards/Standards.AirTerminalSingleDuctVAVReheat.rb +26 -21
  174. data/lib/openstudio-standards/standards/Standards.BoilerHotWater.rb +5 -2
  175. data/lib/openstudio-standards/standards/Standards.BuildingStory.rb +7 -9
  176. data/lib/openstudio-standards/standards/Standards.ChillerElectricEIR.rb +8 -2
  177. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXMultiSpeed.rb +10 -6
  178. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXSingleSpeed.rb +5 -1
  179. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXTwoSpeed.rb +6 -1
  180. data/lib/openstudio-standards/standards/Standards.CoilCoolingWaterToAirHeatPumpEquationFit.rb +45 -4
  181. data/lib/openstudio-standards/standards/Standards.CoilDX.rb +18 -8
  182. data/lib/openstudio-standards/standards/Standards.CoilHeatingDXMultiSpeed.rb +9 -7
  183. data/lib/openstudio-standards/standards/Standards.CoilHeatingDXSingleSpeed.rb +8 -4
  184. data/lib/openstudio-standards/standards/Standards.CoilHeatingGas.rb +86 -3
  185. data/lib/openstudio-standards/standards/Standards.CoilHeatingGasMultiStage.rb +5 -2
  186. data/lib/openstudio-standards/standards/Standards.CoilHeatingWaterToAirHeatPumpEquationFit.rb +6 -2
  187. data/lib/openstudio-standards/standards/Standards.Construction.rb +66 -35
  188. data/lib/openstudio-standards/standards/Standards.CoolingTower.rb +7 -7
  189. data/lib/openstudio-standards/standards/Standards.CoolingTowerSingleSpeed.rb +2 -2
  190. data/lib/openstudio-standards/standards/Standards.CoolingTowerTwoSpeed.rb +2 -1
  191. data/lib/openstudio-standards/standards/Standards.CoolingTowerVariableSpeed.rb +2 -1
  192. data/lib/openstudio-standards/standards/Standards.Fan.rb +53 -35
  193. data/lib/openstudio-standards/standards/Standards.FanVariableVolume.rb +22 -16
  194. data/lib/openstudio-standards/standards/Standards.FluidCooler.rb +2 -2
  195. data/lib/openstudio-standards/standards/Standards.HeaderedPumpsVariableSpeed.rb +4 -4
  196. data/lib/openstudio-standards/standards/Standards.HeatExchangerSensLat.rb +77 -19
  197. data/lib/openstudio-standards/standards/Standards.Model.rb +387 -245
  198. data/lib/openstudio-standards/standards/Standards.PlanarSurface.rb +13 -15
  199. data/lib/openstudio-standards/standards/Standards.PlantLoop.rb +94 -48
  200. data/lib/openstudio-standards/standards/Standards.Pump.rb +28 -20
  201. data/lib/openstudio-standards/standards/Standards.PumpVariableSpeed.rb +3 -4
  202. data/lib/openstudio-standards/standards/Standards.ScheduleCompact.rb +2 -1
  203. data/lib/openstudio-standards/standards/Standards.ScheduleConstant.rb +2 -0
  204. data/lib/openstudio-standards/standards/Standards.ScheduleRuleset.rb +34 -24
  205. data/lib/openstudio-standards/standards/Standards.Space.rb +179 -116
  206. data/lib/openstudio-standards/standards/Standards.SpaceType.rb +23 -12
  207. data/lib/openstudio-standards/standards/Standards.SubSurface.rb +55 -25
  208. data/lib/openstudio-standards/standards/Standards.Surface.rb +57 -32
  209. data/lib/openstudio-standards/standards/Standards.ThermalZone.rb +157 -107
  210. data/lib/openstudio-standards/standards/Standards.WaterHeaterMixed.rb +9 -6
  211. data/lib/openstudio-standards/standards/Standards.ZoneHVACComponent.rb +52 -1
  212. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1.Standards.FanVariableVolume.rb +2 -2
  213. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1.rb +4 -0
  214. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.AirLoopHVAC.rb +28 -18
  215. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.FanVariableVolume.rb +1 -1
  216. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.PlantLoop.rb +4 -2
  217. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.rb +4 -0
  218. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/comstock_ashrae_90_1_2004/comstock_ashrae_90_1_2004.rb +4 -0
  219. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/comstock_ashrae_90_1_2004/data/ashrae_90_1.schedules.json +696 -2938
  220. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/comstock_ashrae_90_1_2004/data/comstock_ashrae_90_1_2004.ext_ltg.json +1 -1
  221. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/comstock_ashrae_90_1_2004/data/comstock_ashrae_90_1_2004.spc_typ.json +123 -123
  222. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.furnaces.json +26 -0
  223. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.prototype_inputs.json +11 -11
  224. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.refrigeration_system.json +0 -8
  225. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.spc_typ.json +395 -384
  226. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.unitary_acs.json +69 -0
  227. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.AirLoopHVAC.rb +20 -13
  228. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.FanVariableVolume.rb +1 -1
  229. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.Model.rb +1 -1
  230. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.rb +4 -0
  231. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/comstock_ashrae_90_1_2007/comstock_ashrae_90_1_2007.rb +4 -0
  232. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/comstock_ashrae_90_1_2007/data/ashrae_90_1.schedules.json +696 -2938
  233. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/comstock_ashrae_90_1_2007/data/comstock_ashrae_90_1_2007.ext_ltg.json +1 -1
  234. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/comstock_ashrae_90_1_2007/data/comstock_ashrae_90_1_2007.spc_typ.json +122 -122
  235. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.furnaces.json +26 -0
  236. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.prototype_inputs.json +11 -11
  237. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.refrigeration_system.json +0 -8
  238. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.spc_typ.json +413 -401
  239. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.unitary_acs.json +69 -0
  240. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.AirLoopHVAC.rb +42 -53
  241. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.AirTerminalSingleDuctVAVReheat.rb +3 -2
  242. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.CoolingTower.rb +5 -8
  243. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.FanVariableVolume.rb +1 -1
  244. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.Space.rb +6 -4
  245. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.rb +4 -0
  246. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/comstock_ashrae_90_1_2010/comstock_ashrae_90_1_2010.rb +4 -0
  247. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/comstock_ashrae_90_1_2010/data/ashrae_90_1.schedules.json +696 -2938
  248. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/comstock_ashrae_90_1_2010/data/comstock_ashrae_90_1_2010.ext_ltg.json +1 -1
  249. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/comstock_ashrae_90_1_2010/data/comstock_ashrae_90_1_2010.spc_typ.json +129 -129
  250. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.energy_recovery.json +210 -42
  251. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.furnaces.json +26 -0
  252. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.prototype_inputs.json +11 -11
  253. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.refrigeration_system.json +0 -8
  254. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.spc_typ.json +460 -320
  255. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.unitary_acs.json +69 -0
  256. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirLoopHVAC.rb +45 -51
  257. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirTerminalSingleDuctVAVReheat.rb +3 -2
  258. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.CoolingTower.rb +5 -8
  259. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.CoolingTowerVariableSpeed.rb +2 -3
  260. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.FanVariableVolume.rb +2 -2
  261. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.Space.rb +8 -5
  262. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.ThermalZone.rb +2 -1
  263. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.WaterHeaterMixed.rb +1 -1
  264. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.ZoneHVACComponent.rb +1 -0
  265. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.rb +4 -0
  266. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/comstock_ashrae_90_1_2013/comstock_ashrae_90_1_2013.rb +4 -0
  267. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/comstock_ashrae_90_1_2013/data/ashrae_90_1.schedules.json +696 -2938
  268. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/comstock_ashrae_90_1_2013/data/comstock_ashrae_90_1_2013.ext_ltg.json +1 -1
  269. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/comstock_ashrae_90_1_2013/data/comstock_ashrae_90_1_2013.spc_typ.json +121 -121
  270. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.energy_recovery.json +420 -84
  271. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.furnaces.json +26 -0
  272. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.prototype_inputs.json +12 -12
  273. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.refrigeration_system.json +0 -8
  274. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.spc_typ.json +475 -335
  275. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.unitary_acs.json +69 -0
  276. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.AirLoopHVAC.rb +40 -50
  277. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.AirTerminalSingleDuctVAVReheat.rb +3 -2
  278. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.CoolingTower.rb +5 -8
  279. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.CoolingTowerVariableSpeed.rb +2 -3
  280. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.FanVariableVolume.rb +2 -2
  281. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.Space.rb +8 -5
  282. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.ThermalZone.rb +2 -1
  283. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.ZoneHVACComponent.rb +1 -0
  284. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.rb +4 -0
  285. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/comstock_ashrae_90_1_2016/comstock_ashrae_90_1_2016.rb +4 -0
  286. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/comstock_ashrae_90_1_2016/data/ashrae_90_1.schedules.json +696 -2938
  287. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/comstock_ashrae_90_1_2016/data/comstock_ashrae_90_1_2016.ext_ltg.json +1 -1
  288. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/comstock_ashrae_90_1_2016/data/comstock_ashrae_90_1_2016.spc_typ.json +152 -128
  289. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.energy_recovery.json +488 -84
  290. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.furnaces.json +26 -0
  291. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.spc_typ.json +47 -47
  292. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.unitary_acs.json +69 -0
  293. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirLoopHVAC.rb +342 -56
  294. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirTerminalSingleDuctVAVReheat.rb +3 -2
  295. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.CoolingTower.rb +5 -8
  296. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.CoolingTowerVariableSpeed.rb +2 -3
  297. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.FanVariableVolume.rb +2 -2
  298. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Space.rb +25 -5
  299. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.ThermalZone.rb +2 -1
  300. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.ZoneHVACComponent.rb +30 -0
  301. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.rb +4 -0
  302. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/comstock_ashrae_90_1_2019/comstock_ashrae_90_1_2019.rb +4 -0
  303. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/comstock_ashrae_90_1_2019/data/ashrae_90_1.schedules.json +696 -2938
  304. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/comstock_ashrae_90_1_2019/data/comstock_ashrae_90_1_2019.ext_ltg.json +1 -1
  305. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/comstock_ashrae_90_1_2019/data/comstock_ashrae_90_1_2019.spc_typ.json +151 -127
  306. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.boilers.json +1 -1
  307. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.energy_recovery.json +2307 -101
  308. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.furnaces.json +26 -0
  309. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.refrigeration_compressors.json +1 -1
  310. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.spc_typ.json +47 -47
  311. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.unitary_acs.json +69 -0
  312. data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.curves.json +25 -0
  313. data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.schedules.json +286 -224
  314. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/comstock_doe_ref_1980_2004/comstock_doe_ref_1980_2004.rb +4 -0
  315. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/comstock_doe_ref_1980_2004/data/ashrae_90_1.schedules.json +696 -2938
  316. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/comstock_doe_ref_1980_2004/data/comstock_doe_ref_1980_2004.ext_ltg.json +1 -1
  317. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/comstock_doe_ref_1980_2004/data/comstock_doe_ref_1980_2004.spc_typ.json +126 -126
  318. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.furnaces.json +26 -0
  319. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.prototype_inputs.json +11 -11
  320. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.refrigeration_system.json +0 -8
  321. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.spc_typ.json +405 -393
  322. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.AirLoopHVAC.rb +15 -11
  323. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.Model.rb +1 -1
  324. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.PlantLoop.rb +3 -0
  325. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.rb +4 -0
  326. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/comstock_doe_ref_pre_1980/comstock_doe_ref_pre_1980.rb +4 -0
  327. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/comstock_doe_ref_pre_1980/data/ashrae_90_1.schedules.json +696 -2938
  328. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/comstock_doe_ref_pre_1980/data/comstock_doe_ref_pre_1980.spc_typ.json +121 -121
  329. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.furnaces.json +37 -0
  330. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.prototype_inputs.json +11 -11
  331. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.refrigeration_system.json +0 -8
  332. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.spc_typ.json +403 -391
  333. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.AirLoopHVAC.rb +15 -11
  334. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.Model.rb +1 -1
  335. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.PlantLoop.rb +3 -0
  336. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.rb +4 -0
  337. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/data/nrel_zne_ready_2017.furnaces.json +15 -0
  338. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.AirLoopHVAC.rb +64 -42
  339. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.AirTerminalSingleDuctVAVReheat.rb +3 -2
  340. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.CoolingTower.rb +5 -8
  341. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.CoolingTowerVariableSpeed.rb +2 -3
  342. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.FanVariableVolume.rb +2 -2
  343. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.HeatExchangerSensLat.rb +1 -1
  344. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.Model.rb +1 -1
  345. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.PlantLoop.rb +4 -1
  346. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.Space.rb +5 -3
  347. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.ZoneHVACComponent.rb +3 -0
  348. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.rb +4 -0
  349. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.furnaces.json +15 -0
  350. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirLoopHVAC.rb +61 -36
  351. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirTerminalSingleDuctVAVReheat.rb +3 -2
  352. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.CoolingTower.rb +5 -8
  353. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.CoolingTowerVariableSpeed.rb +2 -3
  354. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.FanVariableVolume.rb +2 -2
  355. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.HeatExchangerSensLat.rb +1 -1
  356. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.Model.rb +1 -1
  357. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.PlantLoop.rb +4 -1
  358. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.Space.rb +6 -4
  359. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.ZoneHVACComponent.rb +3 -0
  360. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.rb +4 -0
  361. data/lib/openstudio-standards/standards/cbes/cbes.AirLoopHVAC.rb +20 -14
  362. data/lib/openstudio-standards/standards/cbes/cbes.PlantLoop.rb +3 -0
  363. data/lib/openstudio-standards/standards/cbes/cbes.rb +4 -0
  364. data/lib/openstudio-standards/standards/cbes/cbes_pre_1978/cbes_pre_1978.rb +4 -0
  365. data/lib/openstudio-standards/standards/cbes/cbes_t24_1978/cbes_t24_1978.rb +4 -0
  366. data/lib/openstudio-standards/standards/cbes/cbes_t24_1992/cbes_t24_1992.rb +4 -0
  367. data/lib/openstudio-standards/standards/cbes/cbes_t24_2001/cbes_t24_2001.rb +4 -0
  368. data/lib/openstudio-standards/standards/cbes/cbes_t24_2005/cbes_t24_2005.rb +4 -0
  369. data/lib/openstudio-standards/standards/cbes/cbes_t24_2008/cbes_t24_2008.rb +4 -0
  370. data/lib/openstudio-standards/standards/deer/deer.AirLoopHVAC.rb +10 -5
  371. data/lib/openstudio-standards/standards/deer/deer.PlanarSurface.rb +1 -1
  372. data/lib/openstudio-standards/standards/deer/deer.rb +4 -0
  373. data/lib/openstudio-standards/standards/deer/deer_1985/comstock_deer_1985/comstock_deer_1985.rb +4 -0
  374. data/lib/openstudio-standards/standards/deer/deer_1985/comstock_deer_1985/data/comstock_deer_1985.ext_ltg.json +2 -2
  375. data/lib/openstudio-standards/standards/deer/deer_1985/deer_1985.rb +4 -0
  376. data/lib/openstudio-standards/standards/deer/deer_1996/comstock_deer_1996/comstock_deer_1996.rb +4 -0
  377. data/lib/openstudio-standards/standards/deer/deer_1996/comstock_deer_1996/data/comstock_deer_1996.ext_ltg.json +2 -2
  378. data/lib/openstudio-standards/standards/deer/deer_1996/deer_1996.rb +4 -0
  379. data/lib/openstudio-standards/standards/deer/deer_2003/comstock_deer_2003/comstock_deer_2003.rb +4 -0
  380. data/lib/openstudio-standards/standards/deer/deer_2003/comstock_deer_2003/data/comstock_deer_2003.ext_ltg.json +2 -2
  381. data/lib/openstudio-standards/standards/deer/deer_2003/deer_2003.rb +4 -0
  382. data/lib/openstudio-standards/standards/deer/deer_2007/comstock_deer_2007/comstock_deer_2007.rb +4 -0
  383. data/lib/openstudio-standards/standards/deer/deer_2007/comstock_deer_2007/data/comstock_deer_2007.ext_ltg.json +2 -2
  384. data/lib/openstudio-standards/standards/deer/deer_2007/deer_2007.rb +4 -0
  385. data/lib/openstudio-standards/standards/deer/deer_2011/comstock_deer_2011/comstock_deer_2011.rb +4 -0
  386. data/lib/openstudio-standards/standards/deer/deer_2011/comstock_deer_2011/data/comstock_deer_2011.ext_ltg.json +2 -2
  387. data/lib/openstudio-standards/standards/deer/deer_2011/deer_2011.rb +4 -0
  388. data/lib/openstudio-standards/standards/deer/deer_2014/comstock_deer_2014/comstock_deer_2014.rb +4 -0
  389. data/lib/openstudio-standards/standards/deer/deer_2014/comstock_deer_2014/data/comstock_deer_2014.ext_ltg.json +2 -2
  390. data/lib/openstudio-standards/standards/deer/deer_2014/deer_2014.Space.rb +5 -3
  391. data/lib/openstudio-standards/standards/deer/deer_2014/deer_2014.rb +4 -0
  392. data/lib/openstudio-standards/standards/deer/deer_2015/comstock_deer_2015/comstock_deer_2015.rb +4 -0
  393. data/lib/openstudio-standards/standards/deer/deer_2015/comstock_deer_2015/data/comstock_deer_2015.ext_ltg.json +2 -2
  394. data/lib/openstudio-standards/standards/deer/deer_2015/deer_2015.Space.rb +5 -3
  395. data/lib/openstudio-standards/standards/deer/deer_2015/deer_2015.rb +4 -0
  396. data/lib/openstudio-standards/standards/deer/deer_2017/comstock_deer_2017/comstock_deer_2017.rb +4 -0
  397. data/lib/openstudio-standards/standards/deer/deer_2017/comstock_deer_2017/data/comstock_deer_2017.ext_ltg.json +2 -2
  398. data/lib/openstudio-standards/standards/deer/deer_2017/deer_2017.Space.rb +5 -3
  399. data/lib/openstudio-standards/standards/deer/deer_2017/deer_2017.rb +4 -0
  400. data/lib/openstudio-standards/standards/deer/deer_2020/comstock_deer_2020/comstock_deer_2020.rb +4 -0
  401. data/lib/openstudio-standards/standards/deer/deer_2020/deer_2020.AirLoopHVAC.rb +9 -5
  402. data/lib/openstudio-standards/standards/deer/deer_2020/deer_2020.FanVariableVolume.rb +3 -0
  403. data/lib/openstudio-standards/standards/deer/deer_2020/deer_2020.Space.rb +5 -3
  404. data/lib/openstudio-standards/standards/deer/deer_2020/deer_2020.rb +4 -0
  405. data/lib/openstudio-standards/standards/deer/deer_2025/comstock_deer_2025/comstock_deer_2025.rb +4 -0
  406. data/lib/openstudio-standards/standards/deer/deer_2025/deer_2025.AirLoopHVAC.rb +9 -5
  407. data/lib/openstudio-standards/standards/deer/deer_2025/deer_2025.FanVariableVolume.rb +3 -0
  408. data/lib/openstudio-standards/standards/deer/deer_2025/deer_2025.Space.rb +5 -3
  409. data/lib/openstudio-standards/standards/deer/deer_2025/deer_2025.rb +4 -0
  410. data/lib/openstudio-standards/standards/deer/deer_2030/comstock_deer_2030/comstock_deer_2030.rb +4 -0
  411. data/lib/openstudio-standards/standards/deer/deer_2030/deer_2030.AirLoopHVAC.rb +9 -5
  412. data/lib/openstudio-standards/standards/deer/deer_2030/deer_2030.FanVariableVolume.rb +3 -0
  413. data/lib/openstudio-standards/standards/deer/deer_2030/deer_2030.Space.rb +5 -3
  414. data/lib/openstudio-standards/standards/deer/deer_2030/deer_2030.rb +4 -0
  415. data/lib/openstudio-standards/standards/deer/deer_2035/comstock_deer_2035/comstock_deer_2035.rb +4 -0
  416. data/lib/openstudio-standards/standards/deer/deer_2035/deer_2035.AirLoopHVAC.rb +9 -5
  417. data/lib/openstudio-standards/standards/deer/deer_2035/deer_2035.FanVariableVolume.rb +3 -0
  418. data/lib/openstudio-standards/standards/deer/deer_2035/deer_2035.Space.rb +5 -3
  419. data/lib/openstudio-standards/standards/deer/deer_2035/deer_2035.rb +4 -0
  420. data/lib/openstudio-standards/standards/deer/deer_2040/comstock_deer_2040/comstock_deer_2040.rb +4 -0
  421. data/lib/openstudio-standards/standards/deer/deer_2040/deer_2040.AirLoopHVAC.rb +9 -5
  422. data/lib/openstudio-standards/standards/deer/deer_2040/deer_2040.FanVariableVolume.rb +3 -0
  423. data/lib/openstudio-standards/standards/deer/deer_2040/deer_2040.Space.rb +5 -3
  424. data/lib/openstudio-standards/standards/deer/deer_2040/deer_2040.rb +4 -0
  425. data/lib/openstudio-standards/standards/deer/deer_2045/comstock_deer_2045/comstock_deer_2045.rb +4 -0
  426. data/lib/openstudio-standards/standards/deer/deer_2045/deer_2045.AirLoopHVAC.rb +9 -5
  427. data/lib/openstudio-standards/standards/deer/deer_2045/deer_2045.FanVariableVolume.rb +3 -0
  428. data/lib/openstudio-standards/standards/deer/deer_2045/deer_2045.Space.rb +5 -3
  429. data/lib/openstudio-standards/standards/deer/deer_2045/deer_2045.rb +4 -0
  430. data/lib/openstudio-standards/standards/deer/deer_2050/comstock_deer_2050/comstock_deer_2050.rb +4 -0
  431. data/lib/openstudio-standards/standards/deer/deer_2050/deer_2050.AirLoopHVAC.rb +9 -5
  432. data/lib/openstudio-standards/standards/deer/deer_2050/deer_2050.FanVariableVolume.rb +3 -0
  433. data/lib/openstudio-standards/standards/deer/deer_2050/deer_2050.Space.rb +5 -3
  434. data/lib/openstudio-standards/standards/deer/deer_2050/deer_2050.rb +4 -0
  435. data/lib/openstudio-standards/standards/deer/deer_2055/comstock_deer_2055/comstock_deer_2055.rb +4 -0
  436. data/lib/openstudio-standards/standards/deer/deer_2055/deer_2055.AirLoopHVAC.rb +9 -5
  437. data/lib/openstudio-standards/standards/deer/deer_2055/deer_2055.FanVariableVolume.rb +3 -0
  438. data/lib/openstudio-standards/standards/deer/deer_2055/deer_2055.Space.rb +5 -3
  439. data/lib/openstudio-standards/standards/deer/deer_2055/deer_2055.rb +4 -0
  440. data/lib/openstudio-standards/standards/deer/deer_2060/comstock_deer_2060/comstock_deer_2060.rb +4 -0
  441. data/lib/openstudio-standards/standards/deer/deer_2060/deer_2060.AirLoopHVAC.rb +9 -5
  442. data/lib/openstudio-standards/standards/deer/deer_2060/deer_2060.FanVariableVolume.rb +3 -0
  443. data/lib/openstudio-standards/standards/deer/deer_2060/deer_2060.Space.rb +5 -3
  444. data/lib/openstudio-standards/standards/deer/deer_2060/deer_2060.rb +4 -0
  445. data/lib/openstudio-standards/standards/deer/deer_2065/comstock_deer_2065/comstock_deer_2065.rb +4 -0
  446. data/lib/openstudio-standards/standards/deer/deer_2065/deer_2065.AirLoopHVAC.rb +9 -5
  447. data/lib/openstudio-standards/standards/deer/deer_2065/deer_2065.FanVariableVolume.rb +3 -0
  448. data/lib/openstudio-standards/standards/deer/deer_2065/deer_2065.Space.rb +5 -3
  449. data/lib/openstudio-standards/standards/deer/deer_2065/deer_2065.rb +4 -0
  450. data/lib/openstudio-standards/standards/deer/deer_2070/comstock_deer_2070/comstock_deer_2070.rb +4 -0
  451. data/lib/openstudio-standards/standards/deer/deer_2070/deer_2070.AirLoopHVAC.rb +9 -5
  452. data/lib/openstudio-standards/standards/deer/deer_2070/deer_2070.FanVariableVolume.rb +3 -0
  453. data/lib/openstudio-standards/standards/deer/deer_2070/deer_2070.Space.rb +5 -3
  454. data/lib/openstudio-standards/standards/deer/deer_2070/deer_2070.rb +4 -0
  455. data/lib/openstudio-standards/standards/deer/deer_2075/comstock_deer_2075/comstock_deer_2075.rb +4 -0
  456. data/lib/openstudio-standards/standards/deer/deer_2075/deer_2075.AirLoopHVAC.rb +9 -5
  457. data/lib/openstudio-standards/standards/deer/deer_2075/deer_2075.FanVariableVolume.rb +3 -0
  458. data/lib/openstudio-standards/standards/deer/deer_2075/deer_2075.Space.rb +5 -3
  459. data/lib/openstudio-standards/standards/deer/deer_2075/deer_2075.rb +4 -0
  460. data/lib/openstudio-standards/standards/deer/deer_pre_1975/comstock_deer_pre_1975/comstock_deer_pre_1975.rb +4 -0
  461. data/lib/openstudio-standards/standards/deer/deer_pre_1975/comstock_deer_pre_1975/data/comstock_deer_pre_1975.ext_ltg.json +2 -2
  462. data/lib/openstudio-standards/standards/deer/deer_pre_1975/deer_pre_1975.rb +4 -0
  463. data/lib/openstudio-standards/standards/icc_iecc/icc_iecc_2015/icc_iecc_2015.rb +4 -0
  464. data/lib/openstudio-standards/standards/necb/BTAP1980TO2010/btap_1980to2010.rb +6 -28
  465. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/btap_pre1980.rb +25 -110
  466. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/building_envelope.rb +45 -60
  467. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_3_and_8_single_speed.rb +19 -23
  468. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_4.rb +84 -83
  469. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_6.rb +52 -47
  470. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_systems.rb +43 -40
  471. data/lib/openstudio-standards/standards/necb/ECMS/data/boiler_set.json +18 -0
  472. data/lib/openstudio-standards/standards/necb/ECMS/data/chiller_set.json +211 -0
  473. data/lib/openstudio-standards/standards/necb/ECMS/data/curves.json +1195 -20
  474. data/lib/openstudio-standards/standards/necb/ECMS/data/furnace_set.json +18 -0
  475. data/lib/openstudio-standards/standards/necb/ECMS/data/heat_pumps.json +244 -182
  476. data/lib/openstudio-standards/standards/necb/ECMS/data/heat_pumps_heating.json +232 -185
  477. data/lib/openstudio-standards/standards/necb/ECMS/data/shw_set.json +20 -2
  478. data/lib/openstudio-standards/standards/necb/ECMS/ecms.rb +18 -25
  479. data/lib/openstudio-standards/standards/necb/ECMS/erv.rb +12 -13
  480. data/lib/openstudio-standards/standards/necb/ECMS/hvac_systems.rb +1647 -466
  481. data/lib/openstudio-standards/standards/necb/ECMS/loads.rb +93 -0
  482. data/lib/openstudio-standards/standards/necb/ECMS/nv.rb +40 -47
  483. data/lib/openstudio-standards/standards/necb/ECMS/pv_ground.rb +26 -25
  484. data/lib/openstudio-standards/standards/necb/NECB2011/autozone.rb +303 -305
  485. data/lib/openstudio-standards/standards/necb/NECB2011/beps_compliance_path.rb +45 -45
  486. data/lib/openstudio-standards/standards/necb/NECB2011/building_envelope.rb +90 -120
  487. data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/Hospital.osm +1176 -1115
  488. data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/LowriseApartment.osm +8279 -28923
  489. data/lib/openstudio-standards/standards/necb/NECB2011/data/space_types.json +1173 -1173
  490. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_1_multi_speed.rb +15 -13
  491. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_1_single_speed.rb +32 -29
  492. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_2_and_5.rb +25 -26
  493. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_3_and_8_multi_speed.rb +14 -14
  494. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_3_and_8_single_speed.rb +24 -29
  495. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_4.rb +85 -84
  496. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_6.rb +41 -42
  497. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_systems.rb +209 -197
  498. data/lib/openstudio-standards/standards/necb/NECB2011/lighting.rb +87 -82
  499. data/lib/openstudio-standards/standards/necb/NECB2011/necb_2011.rb +510 -406
  500. data/lib/openstudio-standards/standards/necb/NECB2011/nv.md +3 -3
  501. data/lib/openstudio-standards/standards/necb/NECB2011/qaqc/necb_qaqc.rb +686 -683
  502. data/lib/openstudio-standards/standards/necb/NECB2011/service_water_heating.rb +129 -82
  503. data/lib/openstudio-standards/standards/necb/NECB2015/data/space_types.json +1608 -1608
  504. data/lib/openstudio-standards/standards/necb/NECB2015/hvac_systems.rb +25 -18
  505. data/lib/openstudio-standards/standards/necb/NECB2015/lighting.rb +73 -67
  506. data/lib/openstudio-standards/standards/necb/NECB2015/necb_2015.rb +18 -22
  507. data/lib/openstudio-standards/standards/necb/NECB2015/qaqc/necb_2015_qaqc.rb +59 -63
  508. data/lib/openstudio-standards/standards/necb/NECB2017/data/space_types.json +1608 -1608
  509. data/lib/openstudio-standards/standards/necb/NECB2017/hvac_systems.rb +1 -4
  510. data/lib/openstudio-standards/standards/necb/NECB2017/necb_2017.rb +10 -14
  511. data/lib/openstudio-standards/standards/necb/NECB2020/building_envelope.rb +779 -0
  512. data/lib/openstudio-standards/standards/necb/NECB2020/data/boilers.json +122 -0
  513. data/lib/openstudio-standards/standards/necb/NECB2020/data/chillers.json +335 -0
  514. data/lib/openstudio-standards/standards/necb/NECB2020/data/constants.json +13 -0
  515. data/lib/openstudio-standards/standards/necb/NECB2020/data/furnaces.json +41 -0
  516. data/lib/openstudio-standards/standards/necb/NECB2020/data/heat_pumps.json +452 -0
  517. data/lib/openstudio-standards/standards/necb/NECB2020/data/heat_pumps_heating.json +164 -0
  518. data/lib/openstudio-standards/standards/necb/NECB2020/data/heat_rejection.json +228 -0
  519. data/lib/openstudio-standards/standards/necb/NECB2020/data/led_lighting_data.json +2883 -0
  520. data/lib/openstudio-standards/standards/necb/NECB2020/data/space_types.json +25851 -0
  521. data/lib/openstudio-standards/standards/necb/NECB2020/data/surface_thermal_transmittance.json +60 -0
  522. data/lib/openstudio-standards/standards/necb/NECB2020/data/unitary_acs.json +585 -0
  523. data/lib/openstudio-standards/standards/necb/NECB2020/necb_2020.rb +175 -0
  524. data/lib/openstudio-standards/standards/necb/common/bc_step_code_indicators.md +10 -0
  525. data/lib/openstudio-standards/standards/necb/common/btap_data.rb +1963 -0
  526. data/lib/openstudio-standards/standards/necb/common/btap_datapoint.rb +410 -0
  527. data/lib/openstudio-standards/standards/necb/common/neb_end_use_prices.csv +42 -0
  528. data/lib/openstudio-standards/standards/necb/common/necb_reference_runs.csv +28705 -0
  529. data/lib/openstudio-standards/standards/necb/common/phius.md +23 -0
  530. data/lib/openstudio-standards/standards/necb/common/space_type_upgrade_map.json +1158 -386
  531. data/lib/openstudio-standards/standards/oeesc/oeesc_2014/oeesc_2014.rb +4 -0
  532. data/lib/openstudio-standards/standards/standard.rb +2 -1
  533. data/lib/openstudio-standards/utilities/define_thermal_zone_and_mulitpliers.rb +1 -1
  534. data/lib/openstudio-standards/utilities/logging.rb +6 -0
  535. data/lib/openstudio-standards/utilities/simulation.rb +30 -14
  536. data/lib/openstudio-standards/utilities/{speacetype_map_converter.rb → spacetype_map_converter.rb} +0 -0
  537. data/lib/openstudio-standards/utilities/sqlfile.rb +112 -71
  538. data/lib/openstudio-standards/version.rb +2 -2
  539. data/lib/openstudio-standards/weather/Weather.Model.rb +209 -9
  540. data/lib/openstudio-standards/weather/Weather.stat_file.rb +1 -1
  541. data/lib/openstudio-standards.rb +9 -0
  542. metadata +106 -205
  543. data/data/standards/OpenStudio_Standards-ashrae_90_1-ALL-comstock(space_types).xlsx +0 -0
  544. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.boilers.json +0 -49
  545. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.chillers.json +0 -293
  546. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.construction_properties.json +0 -25426
  547. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.construction_sets.json +0 -1600
  548. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.economizers.json +0 -564
  549. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.elevators.json +0 -349
  550. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.ext_ltg.json +0 -164
  551. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.ground_temperatures.json +0 -10663
  552. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.heat_pumps.json +0 -508
  553. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.heat_pumps_heating.json +0 -156
  554. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.heat_rejection.json +0 -44
  555. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.motors.json +0 -184
  556. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.prototype_inputs.json +0 -3094
  557. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.ref_cases.json +0 -829
  558. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.ref_lnup.json +0 -562
  559. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.refrigeration_compressors.json +0 -52
  560. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.refrigeration_condenser.json +0 -220
  561. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.refrigeration_system.json +0 -156
  562. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.refrigeration_walkins.json +0 -1316
  563. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.spc_typ.json +0 -21446
  564. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.unitary_acs.json +0 -554
  565. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.water_heaters.json +0 -68
  566. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.water_source_heat_pumps.json +0 -28
  567. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.water_source_heat_pumps_heating.json +0 -12
  568. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.boilers.json +0 -49
  569. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.chillers.json +0 -293
  570. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.construction_properties.json +0 -12487
  571. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.construction_sets.json +0 -1600
  572. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.economizers.json +0 -564
  573. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.elevators.json +0 -349
  574. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.ext_ltg.json +0 -164
  575. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.ground_temperatures.json +0 -10663
  576. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.heat_pumps.json +0 -466
  577. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.heat_pumps_heating.json +0 -137
  578. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.heat_rejection.json +0 -44
  579. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.motors.json +0 -184
  580. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.prototype_inputs.json +0 -3094
  581. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.ref_cases.json +0 -829
  582. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.ref_lnup.json +0 -562
  583. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.refrigeration_compressors.json +0 -52
  584. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.refrigeration_condenser.json +0 -220
  585. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.refrigeration_system.json +0 -156
  586. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.refrigeration_walkins.json +0 -1316
  587. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.spc_typ.json +0 -21380
  588. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.unitary_acs.json +0 -554
  589. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.water_heaters.json +0 -68
  590. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.water_source_heat_pumps.json +0 -28
  591. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.water_source_heat_pumps_heating.json +0 -12
  592. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.boilers.json +0 -49
  593. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.chillers.json +0 -395
  594. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.construction_properties.json +0 -12487
  595. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.construction_sets.json +0 -1600
  596. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.economizers.json +0 -592
  597. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.elevators.json +0 -349
  598. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.energy_recovery.json +0 -550
  599. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.ext_ltg.json +0 -164
  600. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.ground_temperatures.json +0 -10663
  601. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.heat_pumps.json +0 -466
  602. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.heat_pumps_heating.json +0 -137
  603. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.heat_rejection.json +0 -44
  604. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.motors.json +0 -238
  605. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.prototype_inputs.json +0 -3094
  606. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.ref_cases.json +0 -829
  607. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.ref_lnup.json +0 -562
  608. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.refrigeration_compressors.json +0 -52
  609. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.refrigeration_condenser.json +0 -220
  610. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.refrigeration_system.json +0 -156
  611. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.refrigeration_walkins.json +0 -1316
  612. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.spc_typ.json +0 -21548
  613. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.unitary_acs.json +0 -554
  614. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.water_heaters.json +0 -68
  615. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.water_source_heat_pumps.json +0 -28
  616. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.water_source_heat_pumps_heating.json +0 -12
  617. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.boilers.json +0 -64
  618. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.chillers.json +0 -871
  619. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.construction_properties.json +0 -12487
  620. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.construction_sets.json +0 -1600
  621. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.economizers.json +0 -592
  622. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.elevators.json +0 -349
  623. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.energy_recovery.json +0 -1096
  624. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.ext_ltg.json +0 -164
  625. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.ground_temperatures.json +0 -10663
  626. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.heat_pumps.json +0 -886
  627. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.heat_pumps_heating.json +0 -194
  628. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.heat_rejection.json +0 -44
  629. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.motors.json +0 -247
  630. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.prototype_inputs.json +0 -3094
  631. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.ref_cases.json +0 -829
  632. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.ref_lnup.json +0 -562
  633. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.refrigeration_compressors.json +0 -52
  634. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.refrigeration_condenser.json +0 -220
  635. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.refrigeration_system.json +0 -156
  636. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.refrigeration_walkins.json +0 -1316
  637. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.spc_typ.json +0 -22079
  638. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.unitary_acs.json +0 -994
  639. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.water_heaters.json +0 -68
  640. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.water_source_heat_pumps.json +0 -28
  641. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.water_source_heat_pumps_heating.json +0 -12
  642. data/lib/openstudio-standards/utilities/convert_costing_constructions.rb +0 -105
@@ -1,8 +1,7 @@
1
1
  class NECB2011
2
-
3
2
  attr_accessor :qaqc_data
4
3
 
5
- def get_sql_table_to_json( model, report_name, report_for_string, table_name )
4
+ def get_sql_table_to_json(model, report_name, report_for_string, table_name)
6
5
  table = []
7
6
  query_row_names = "
8
7
  SELECT DISTINCT
@@ -17,7 +16,7 @@ class NECB2011
17
16
  TableName='#{table_name}'"
18
17
  row_names = model.sqlFile.get.execAndReturnVectorOfString(query_row_names).get
19
18
 
20
- #get Columns
19
+ # get Columns
21
20
  query_col_names = "
22
21
  SELECT DISTINCT
23
22
  ColumnName
@@ -27,7 +26,7 @@ class NECB2011
27
26
  AND TableName='#{table_name}'"
28
27
  col_names = model.sqlFile.get.execAndReturnVectorOfString(query_col_names).get
29
28
 
30
- #get units
29
+ # get units
31
30
  query_unit_names = "
32
31
  SELECT DISTINCT
33
32
  Units
@@ -39,6 +38,7 @@ class NECB2011
39
38
 
40
39
  row_names.each do |row|
41
40
  next if row.nil? || row == ''
41
+
42
42
  row_hash = {}
43
43
  row_hash[:name] = row
44
44
  col_names.each do |col|
@@ -61,26 +61,31 @@ class NECB2011
61
61
  AND
62
62
  Units='#{unit}'
63
63
  "
64
- column_name = "#{col}".gsub(/\s+/, "_").downcase
64
+ column_name = col.to_s.gsub(/\s+/, '_').downcase
65
65
  # If the column name is "additional_fuel" and the file contains a boiler with a FuelOilNo2 fuel type assume
66
66
  # the column name should be "fueloilno2".
67
- if column_name.include? "additional_fuel"
67
+ if column_name.include? 'additional_fuel'
68
68
  model.getPlantLoops.sort.each do |iplantloop|
69
- boilers = iplantloop.components.select {|icomponent| icomponent.to_BoilerHotWater.is_initialized}
70
- column_name = "fueloilno2" unless boilers.select {|boiler| boiler.to_BoilerHotWater.get.fuelType.to_s == "FuelOilNo2"}.empty?
69
+ boilers = iplantloop.components.select { |icomponent| icomponent.to_BoilerHotWater.is_initialized }
70
+ column_name = 'fueloilno2' unless boilers.select { |boiler| boiler.to_BoilerHotWater.get.fuelType.to_s == 'FuelOilNo2' }.empty?
71
71
  end
72
72
  end
73
- column_name = column_name + "_#{unit}" if unit != ''
73
+ column_name += "_#{unit}" if unit != ''
74
74
  value = model.sqlFile.get.execAndReturnFirstString(query)
75
75
  next if value.empty? || value.get.nil?
76
+
76
77
  value = value.get.strip
77
- #check is value is a number
78
- if (!!Float(value) rescue false) && value.to_f != 0
78
+ # check is value is a number
79
+ if (begin
80
+ Float(value)
81
+ rescue StandardError
82
+ false
83
+ end) && value.to_f != 0
79
84
  row_hash[column_name] = value.to_f
80
- #Check if value is a date
81
- elsif unit == '' && value =~ /\d\d-\D\D\D-\d\d:\d\d/
85
+ # Check if value is a date
86
+ elsif unit == '' && value =~ /\d\d-\D\D\D-\d\d:\d\d/
82
87
  row_hash[column_name] = DateTime.parse(value)
83
- #skip if value in an empty string or a zero value
88
+ # skip if value in an empty string or a zero value
84
89
  elsif value != '' && value != '0.00'
85
90
  row_hash[column_name] = value
86
91
  end
@@ -95,14 +100,13 @@ class NECB2011
95
100
  end
96
101
 
97
102
  def merge_recursively(a, b)
98
- a.merge(b) {|key, a_item, b_item| merge_recursively(a_item, b_item) }
103
+ a.merge(b) { |key, a_item, b_item| merge_recursively(a_item, b_item) }
99
104
  end
100
105
 
101
-
102
106
  def get_sql_tables_to_json(model)
103
107
  sql_data = []
104
- sql_data << get_sql_table_to_json(model, "AnnualBuildingUtilityPerformanceSummary", "Entire Facility", "End Uses")
105
- sql_data << get_sql_table_to_json(model, "AnnualBuildingUtilityPerformanceSummary", "Entire Facility", "Site and Source Energy")
108
+ sql_data << get_sql_table_to_json(model, 'AnnualBuildingUtilityPerformanceSummary', 'Entire Facility', 'End Uses')
109
+ sql_data << get_sql_table_to_json(model, 'AnnualBuildingUtilityPerformanceSummary', 'Entire Facility', 'Site and Source Energy')
106
110
  # sql_data << get_sql_table_to_json(model, "AnnualBuildingUtilityPerformanceSummary", "Entire Facility", "On-Site Thermal Sources")
107
111
  # sql_data << get_sql_table_to_json(model, "AnnualBuildingUtilityPerformanceSummary", "Entire Facility", "Comfort and Setpoint Not Met Summary")
108
112
  # sql_data << get_sql_table_to_json(model, "InputVerificationandResultsSummary", "Entire Facility", "Window-Wall Ratio")
@@ -113,26 +117,23 @@ class NECB2011
113
117
  return sql_data
114
118
  end
115
119
 
116
-
117
-
118
-
119
- def load_qaqc_database_new()
120
+ def load_qaqc_database_new
120
121
  # Combine the data from the JSON files into a single hash
121
- files = Dir.glob("#{File.dirname(__FILE__)}/qaqc_data/*.json").select {|e| File.file? e}
122
+ files = Dir.glob("#{File.dirname(__FILE__)}/qaqc_data/*.json").select { |e| File.file? e }
122
123
  @qaqc_data = {}
123
- @qaqc_data["tables"] = {}
124
+ @qaqc_data['tables'] = {}
124
125
  files.each do |file|
125
- #puts "loading qaqc data from #{file}"
126
+ # puts "loading qaqc data from #{file}"
126
127
  data = JSON.parse(File.read(file))
127
- if not data["tables"].nil?
128
- @qaqc_data["tables"] = [*@qaqc_data["tables"], *data["tables"] ].to_h
128
+ if !data['tables'].nil?
129
+ @qaqc_data['tables'] = [*@qaqc_data['tables'], *data['tables']].to_h
129
130
  else
130
131
  @qaqc_data[data.keys.first] = data[data.keys.first]
131
132
  end
132
133
  end
133
- #Write test report file.
134
+ # Write test report file.
134
135
  test_result_file = File.join(File.dirname(__FILE__), '..', 'NECB2011_QAQC.json')
135
- File.open(test_result_file, 'w') {|f| f.write(JSON.pretty_generate(@qaqc_data))}
136
+ File.open(test_result_file, 'w') { |f| f.write(JSON.pretty_generate(@qaqc_data)) }
136
137
  return @qaqc_data
137
138
  end
138
139
 
@@ -140,16 +141,14 @@ class NECB2011
140
141
  return_objects = nil
141
142
  table = @qaqc_data['tables'][table_name]
142
143
  raise("could not find #{table_name} in qaqc table database. ") if table.nil?
143
- if search_criteria.nil?
144
- #return object['table']
145
- return table # removed table beause need to use the object['refs']
146
- else
147
- rows = table['table']
148
- search_criteria.each do |key, value|
149
- rows = rows.select{ |row| row[key] == value}
150
- end
151
- return rows
144
+
145
+ return table if search_criteria.nil? # removed table beause need to use the object['refs']
146
+
147
+ rows = table['table']
148
+ search_criteria.each do |key, value|
149
+ rows = rows.select { |row| row[key] == value }
152
150
  end
151
+ return rows
153
152
  end
154
153
 
155
154
  # generates full qaqc.json
@@ -161,14 +160,14 @@ class NECB2011
161
160
  # generate base qaqc hash
162
161
  qaqc = create_base_data(model)
163
162
  # performs the qaqc on the given base qaqc hash
164
- #necb_qaqc(qaqc, model)
163
+ # necb_qaqc(qaqc, model)
165
164
  return qaqc
166
165
  end
167
166
 
168
167
  # generates only qaqc component
169
168
  def qaqc_only(model)
170
169
  # load the qaqc.json files
171
- @qaqc_data = self.load_qaqc_database_new()
170
+ @qaqc_data = load_qaqc_database_new
172
171
 
173
172
  # generate base qaqc hash
174
173
  qaqc = create_base_data(model)
@@ -182,96 +181,89 @@ class NECB2011
182
181
 
183
182
  # Generates the base data hash mainly used to perform qaqc.
184
183
  def create_base_data(model)
185
-
186
- #construct command with local libs
184
+ # construct command with local libs
187
185
  os_version = OpenStudio.openStudioLongVersion
188
186
  eplus_version = OpenStudio.energyPlusVersion
189
187
  puts "\n\n\nOS_version is [#{os_version.strip}]"
190
188
  puts "\n\n\nEP_version is [#{eplus_version.strip}]"
191
189
 
192
-
193
- #Ensure all surfaces are unique.
190
+ # Ensure all surfaces are unique.
194
191
  surfaces = model.getSurfaces.sort
195
192
 
196
-
197
- #Sort surfaces by type
198
-
199
- interior_surfaces = BTAP::Geometry::Surfaces::filter_by_boundary_condition(surfaces, ["Surface","Adiabatic"])
200
- interior_floors = BTAP::Geometry::Surfaces::filter_by_surface_types(interior_surfaces, "Floor")
201
- outdoor_surfaces = BTAP::Geometry::Surfaces::filter_by_boundary_condition(surfaces, "Outdoors")
202
- outdoor_walls = BTAP::Geometry::Surfaces::filter_by_surface_types(outdoor_surfaces, "Wall")
203
- outdoor_roofs = BTAP::Geometry::Surfaces::filter_by_surface_types(outdoor_surfaces, "RoofCeiling")
204
- outdoor_floors = BTAP::Geometry::Surfaces::filter_by_surface_types(outdoor_surfaces, "Floor")
205
- outdoor_subsurfaces = BTAP::Geometry::Surfaces::get_subsurfaces_from_surfaces(outdoor_surfaces)
206
-
207
- ground_surfaces = BTAP::Geometry::Surfaces::filter_by_boundary_condition(surfaces, "Ground")
208
- ground_walls = BTAP::Geometry::Surfaces::filter_by_surface_types(ground_surfaces, "Wall")
209
- ground_roofs = BTAP::Geometry::Surfaces::filter_by_surface_types(ground_surfaces, "RoofCeiling")
210
- ground_floors = BTAP::Geometry::Surfaces::filter_by_surface_types(ground_surfaces, "Floor")
211
-
212
- windows = BTAP::Geometry::Surfaces::filter_subsurfaces_by_types(outdoor_subsurfaces, ["FixedWindow", "OperableWindow"])
213
- skylights = BTAP::Geometry::Surfaces::filter_subsurfaces_by_types(outdoor_subsurfaces, ["Skylight", "TubularDaylightDiffuser", "TubularDaylightDome"])
214
- doors = BTAP::Geometry::Surfaces::filter_subsurfaces_by_types(outdoor_subsurfaces, ["Door", "GlassDoor"])
215
- overhead_doors = BTAP::Geometry::Surfaces::filter_subsurfaces_by_types(outdoor_subsurfaces, ["OverheadDoor"])
216
-
217
- #Peaks
218
- electric_peak = model.sqlFile().get().execAndReturnFirstDouble("SELECT Value FROM tabulardatawithstrings WHERE ReportName='EnergyMeters'" +
219
- " AND ReportForString='Entire Facility' AND TableName='Annual and Peak Values - Electricity' AND RowName='Electricity:Facility'" +
193
+ # Sort surfaces by type
194
+
195
+ interior_surfaces = BTAP::Geometry::Surfaces.filter_by_boundary_condition(surfaces, ['Surface', 'Adiabatic'])
196
+ interior_floors = BTAP::Geometry::Surfaces.filter_by_surface_types(interior_surfaces, 'Floor')
197
+ outdoor_surfaces = BTAP::Geometry::Surfaces.filter_by_boundary_condition(surfaces, 'Outdoors')
198
+ outdoor_walls = BTAP::Geometry::Surfaces.filter_by_surface_types(outdoor_surfaces, 'Wall')
199
+ outdoor_roofs = BTAP::Geometry::Surfaces.filter_by_surface_types(outdoor_surfaces, 'RoofCeiling')
200
+ outdoor_floors = BTAP::Geometry::Surfaces.filter_by_surface_types(outdoor_surfaces, 'Floor')
201
+ outdoor_subsurfaces = BTAP::Geometry::Surfaces.get_subsurfaces_from_surfaces(outdoor_surfaces)
202
+
203
+ ground_surfaces = BTAP::Geometry::Surfaces.filter_by_boundary_condition(surfaces, 'Ground')
204
+ ground_walls = BTAP::Geometry::Surfaces.filter_by_surface_types(ground_surfaces, 'Wall')
205
+ ground_roofs = BTAP::Geometry::Surfaces.filter_by_surface_types(ground_surfaces, 'RoofCeiling')
206
+ ground_floors = BTAP::Geometry::Surfaces.filter_by_surface_types(ground_surfaces, 'Floor')
207
+
208
+ windows = BTAP::Geometry::Surfaces.filter_subsurfaces_by_types(outdoor_subsurfaces, ['FixedWindow', 'OperableWindow'])
209
+ skylights = BTAP::Geometry::Surfaces.filter_subsurfaces_by_types(outdoor_subsurfaces, ['Skylight', 'TubularDaylightDiffuser', 'TubularDaylightDome'])
210
+ doors = BTAP::Geometry::Surfaces.filter_subsurfaces_by_types(outdoor_subsurfaces, ['Door', 'GlassDoor'])
211
+ overhead_doors = BTAP::Geometry::Surfaces.filter_subsurfaces_by_types(outdoor_subsurfaces, ['OverheadDoor'])
212
+
213
+ # Peaks
214
+ electric_peak = model.sqlFile.get.execAndReturnFirstDouble("SELECT Value FROM tabulardatawithstrings WHERE ReportName='EnergyMeters'" \
215
+ " AND ReportForString='Entire Facility' AND TableName='Annual and Peak Values - Electricity' AND RowName='Electricity:Facility'" \
220
216
  " AND ColumnName='Electricity Maximum Value' AND Units='W'")
221
- natural_gas_peak = model.sqlFile().get().execAndReturnFirstDouble("SELECT Value FROM tabulardatawithstrings WHERE ReportName='EnergyMeters'" +
222
- " AND ReportForString='Entire Facility' AND TableName='Annual and Peak Values - Gas' AND RowName='Gas:Facility'" +
217
+ natural_gas_peak = model.sqlFile.get.execAndReturnFirstDouble("SELECT Value FROM tabulardatawithstrings WHERE ReportName='EnergyMeters'" \
218
+ " AND ReportForString='Entire Facility' AND TableName='Annual and Peak Values - Gas' AND RowName='Gas:Facility'" \
223
219
  " AND ColumnName='Gas Maximum Value' AND Units='W'")
224
220
 
225
-
226
221
  get_sql_tables_to_json(model)
227
222
 
228
-
229
223
  # Create hash to store all the collected data.
230
224
  qaqc = {}
231
225
  qaqc[:sql_data] = get_sql_tables_to_json(model)
232
226
  error_warning = []
233
- qaqc[:os_standards_revision] = OpenstudioStandards::git_revision
227
+ qaqc[:os_standards_revision] = OpenstudioStandards.git_revision
234
228
  qaqc[:os_standards_version] = OpenstudioStandards::VERSION
235
229
  qaqc[:openstudio_version] = os_version.strip
236
230
  qaqc[:energyplus_version] = eplus_version.strip
237
231
  # Store Building data.
238
232
  qaqc[:building] = {}
239
233
  qaqc[:building][:name] = model.building.get.name.get
240
- qaqc[:building][:conditioned_floor_area_m2]=nil
241
- unless model.building.get.conditionedFloorArea().empty?
242
- qaqc[:building][:conditioned_floor_area_m2] = model.building.get.conditionedFloorArea().get
243
- else
234
+ qaqc[:building][:conditioned_floor_area_m2] = nil
235
+ if model.building.get.conditionedFloorArea.empty?
244
236
  error_warning << "model.building.get.conditionedFloorArea() is empty for #{model.building.get.name.get}"
237
+ else
238
+ qaqc[:building][:conditioned_floor_area_m2] = model.building.get.conditionedFloorArea.get
245
239
  end
246
- qaqc[:building][:exterior_area_m2] = model.building.get.exteriorSurfaceArea() #m2
247
- qaqc[:building][:volume] = model.building.get.airVolume() #m3
240
+ qaqc[:building][:exterior_area_m2] = model.building.get.exteriorSurfaceArea # m2
241
+ qaqc[:building][:volume] = model.building.get.airVolume # m3
248
242
  qaqc[:building][:number_of_stories] = model.getBuildingStorys.size
249
243
  qaqc[:building][:standards_number_of_stories] = nil
250
- qaqc[:building][:standards_number_of_stories] = model.building.get.standardsNumberOfStories().get unless model.building.get.standardsNumberOfStories().empty?
244
+ qaqc[:building][:standards_number_of_stories] = model.building.get.standardsNumberOfStories.get unless model.building.get.standardsNumberOfStories.empty?
251
245
  qaqc[:building][:standards_number_of_above_ground_stories] = nil
252
- qaqc[:building][:standards_number_of_above_ground_stories] = model.building.get.standardsNumberOfAboveGroundStories.get unless model.building.get.standardsNumberOfAboveGroundStories().empty?
246
+ qaqc[:building][:standards_number_of_above_ground_stories] = model.building.get.standardsNumberOfAboveGroundStories.get unless model.building.get.standardsNumberOfAboveGroundStories.empty?
253
247
  qaqc[:building][:standards_number_of_living_units] = nil
254
- qaqc[:building][:standards_number_of_living_units] = model.building.get.standardsNumberOfLivingUnits().get unless model.building.get.standardsNumberOfLivingUnits().empty?
248
+ qaqc[:building][:standards_number_of_living_units] = model.building.get.standardsNumberOfLivingUnits.get unless model.building.get.standardsNumberOfLivingUnits.empty?
255
249
  qaqc[:building][:nominal_floor_to_ceiling_height] = nil
256
- qaqc[:building][:nominal_floor_to_ceiling_height] = model.building.get.nominalFloortoCeilingHeight.get unless model.building.get.nominalFloortoCeilingHeight().empty?
250
+ qaqc[:building][:nominal_floor_to_ceiling_height] = model.building.get.nominalFloortoCeilingHeight.get unless model.building.get.nominalFloortoCeilingHeight.empty?
257
251
  qaqc[:building][:nominal_floor_to_floor_height] = nil
258
- qaqc[:building][:nominal_floor_to_floor_height] = model.building.get.nominalFloortoFloorHeight.get unless model.building.get.nominalFloortoFloorHeight().empty?
259
-
260
-
252
+ qaqc[:building][:nominal_floor_to_floor_height] = model.building.get.nominalFloortoFloorHeight.get unless model.building.get.nominalFloortoFloorHeight.empty?
261
253
 
262
254
  # Store Geography Data
263
- qaqc[:geography] ={}
255
+ qaqc[:geography] = {}
264
256
  qaqc[:geography][:hdd] = get_necb_hdd18(model)
265
257
  qaqc[:geography][:cdd] = BTAP::Environment::WeatherFile.new(model.getWeatherFile.path.get.to_s).cdd18
266
- qaqc[:geography][:climate_zone] = NECB2011.new().get_climate_zone_name(qaqc[:geography][:hdd])
258
+ qaqc[:geography][:climate_zone] = NECB2011.new.get_climate_zone_name(qaqc[:geography][:hdd])
267
259
  qaqc[:geography][:city] = model.getWeatherFile.city
268
260
  qaqc[:geography][:state_province_region] = model.getWeatherFile.stateProvinceRegion
269
261
  qaqc[:geography][:country] = model.getWeatherFile.country
270
262
  qaqc[:geography][:latitude] = model.getWeatherFile.latitude
271
263
  qaqc[:geography][:longitude] = model.getWeatherFile.longitude
272
264
 
273
- #Spacetype Breakdown
274
- qaqc[:spacetype_area_breakdown]={}
265
+ # Spacetype Breakdown
266
+ qaqc[:spacetype_area_breakdown] = {}
275
267
  model.getSpaceTypes.sort.each do |spaceType|
276
268
  next if spaceType.floorArea == 0
277
269
 
@@ -280,239 +272,239 @@ class NECB2011
280
272
  floor_area_si = 0
281
273
  # loop through spaces so I can skip if not included in floor area
282
274
  spaceType.spaces.sort.each do |space|
283
- next if not space.partofTotalFloorArea
275
+ next if !space.partofTotalFloorArea
276
+
284
277
  floor_area_si += space.floorArea * space.multiplier
285
278
  end
286
- qaqc[:spacetype_area_breakdown][spaceType.name.get.gsub(/\s+/, "_").downcase.to_sym] = floor_area_si
279
+ qaqc[:spacetype_area_breakdown][spaceType.name.get.gsub(/\s+/, '_').downcase.to_sym] = floor_area_si
287
280
  end
288
281
 
289
- #Economics Section
282
+ # Economics Section
290
283
  qaqc[:economics] = {}
291
- provinces_names_map = {'QC' => 'Quebec', 'NL' => 'Newfoundland and Labrador', 'NS' => 'Nova Scotia', 'PE' => 'Prince Edward Island', 'ON' => 'Ontario', 'MB' => 'Manitoba', 'SK' => 'Saskatchewan', 'AB' => 'Alberta', 'BC' => 'British Columbia', 'YT' => 'Yukon', 'NT' => 'Northwest Territories', 'NB' => 'New Brunswick', 'NU' => 'Nunavut'}
292
- neb_prices_csv_file_name ="#{File.dirname(__FILE__)}/qaqc_resources/neb_end_use_prices.csv"
284
+ provinces_names_map = { 'QC' => 'Quebec', 'NL' => 'Newfoundland and Labrador', 'NS' => 'Nova Scotia', 'PE' => 'Prince Edward Island', 'ON' => 'Ontario', 'MB' => 'Manitoba', 'SK' => 'Saskatchewan', 'AB' => 'Alberta', 'BC' => 'British Columbia', 'YT' => 'Yukon', 'NT' => 'Northwest Territories', 'NB' => 'New Brunswick', 'NU' => 'Nunavut' }
285
+ neb_prices_csv_file_name = "#{File.dirname(__FILE__)}/qaqc_resources/neb_end_use_prices.csv"
293
286
  puts neb_prices_csv_file_name
294
287
  building_type = 'Commercial'
295
288
  province = provinces_names_map[qaqc[:geography][:state_province_region]]
296
- neb_fuel_list = ['Electricity', 'Natural Gas', "Oil"]
297
- neb_eplus_fuel_map = {'Electricity' => 'Electricity', 'Natural Gas' => 'Gas', 'Oil' => "FuelOilNo2"}
289
+ neb_fuel_list = ['Electricity', 'Natural Gas', 'Oil']
290
+ neb_eplus_fuel_map = { 'Electricity' => 'Electricity', 'Natural Gas' => 'Gas', 'Oil' => 'FuelOilNo2' }
298
291
  qaqc[:economics][:total_neb_cost] = 0.0
299
292
  qaqc[:economics][:total_neb_cost_per_m2] = 0.0
300
293
  neb_eplus_fuel_map.each do |neb_fuel, ep_fuel|
301
- row = look_up_csv_data(neb_prices_csv_file_name, {0 => building_type, 1 => province, 2 => neb_fuel})
294
+ search_info = {
295
+ 0 => building_type,
296
+ 1 => province,
297
+ 2 => neb_fuel
298
+ }
299
+ row = look_up_csv_data(neb_prices_csv_file_name, search_info)
302
300
  neb_fuel_cost = row['2020']
303
301
  fuel_consumption_gj = 0.0
304
302
  if neb_fuel == 'Electricity' || neb_fuel == 'Natural Gas'
305
- if model.sqlFile().get().execAndReturnFirstDouble("SELECT Value FROM tabulardatawithstrings WHERE ReportName='EnergyMeters' AND ReportForString='Entire Facility' AND
303
+ if model.sqlFile.get.execAndReturnFirstDouble("SELECT Value FROM tabulardatawithstrings WHERE ReportName='EnergyMeters' AND ReportForString='Entire Facility' AND
306
304
  TableName='Annual and Peak Values - #{ep_fuel}' AND RowName='#{ep_fuel}:Facility' AND ColumnName='#{ep_fuel} Annual Value' AND Units='GJ'").is_initialized
307
- fuel_consumption_gj = model.sqlFile().get().execAndReturnFirstDouble("SELECT Value FROM tabulardatawithstrings WHERE ReportName='EnergyMeters' AND ReportForString='Entire Facility' AND
305
+ fuel_consumption_gj = model.sqlFile.get.execAndReturnFirstDouble("SELECT Value FROM tabulardatawithstrings WHERE ReportName='EnergyMeters' AND ReportForString='Entire Facility' AND
308
306
  TableName='Annual and Peak Values - #{ep_fuel}' AND RowName='#{ep_fuel}:Facility' AND ColumnName='#{ep_fuel} Annual Value' AND Units='GJ'").get
309
307
  end
310
308
  else
311
- if model.sqlFile().get().execAndReturnFirstDouble("SELECT Value FROM tabulardatawithstrings WHERE ReportName='EnergyMeters' AND ReportForString='Entire Facility' AND
309
+ if model.sqlFile.get.execAndReturnFirstDouble("SELECT Value FROM tabulardatawithstrings WHERE ReportName='EnergyMeters' AND ReportForString='Entire Facility' AND
312
310
  TableName='Annual and Peak Values - Other' AND RowName='#{ep_fuel}:Facility' AND ColumnName='Annual Value' AND Units='GJ'").is_initialized
313
- fuel_consumption_gj = model.sqlFile().get().execAndReturnFirstDouble("SELECT Value FROM tabulardatawithstrings WHERE ReportName='EnergyMeters' AND ReportForString='Entire Facility' AND
311
+ fuel_consumption_gj = model.sqlFile.get.execAndReturnFirstDouble("SELECT Value FROM tabulardatawithstrings WHERE ReportName='EnergyMeters' AND ReportForString='Entire Facility' AND
314
312
  TableName='Annual and Peak Values - Other' AND RowName='#{ep_fuel}:Facility' AND ColumnName='Annual Value' AND Units='GJ'").get
315
313
  end
316
314
  end
317
- qaqc[:economics][:"#{neb_fuel}_neb_cost"] = fuel_consumption_gj*neb_fuel_cost.to_f
318
- qaqc[:economics][:"#{neb_fuel}_neb_cost_per_m2"] = qaqc[:economics][:"#{neb_fuel}_neb_cost"]/qaqc[:building][:conditioned_floor_area_m2] unless model.building.get.conditionedFloorArea().empty?
315
+ qaqc[:economics][:"#{neb_fuel}_neb_cost"] = fuel_consumption_gj * neb_fuel_cost.to_f
316
+ qaqc[:economics][:"#{neb_fuel}_neb_cost_per_m2"] = qaqc[:economics][:"#{neb_fuel}_neb_cost"] / qaqc[:building][:conditioned_floor_area_m2] unless model.building.get.conditionedFloorArea.empty?
319
317
  qaqc[:economics][:total_neb_cost] += qaqc[:economics][:"#{neb_fuel}_neb_cost"]
320
- qaqc[:economics][:total_neb_cost_per_m2] += qaqc[:economics][:"#{neb_fuel}_neb_cost_per_m2"]
318
+ qaqc[:economics][:total_neb_cost_per_m2] += qaqc[:economics][:"#{neb_fuel}_neb_cost_per_m2"] || 0.0
321
319
  end
322
320
 
323
- #Fuel cost based local utility rates
324
- costing_rownames = model.sqlFile().get().execAndReturnVectorOfString("SELECT RowName FROM TabularDataWithStrings WHERE ReportName='LEEDsummary' AND ReportForString='Entire Facility' AND TableName='EAp2-7. Energy Cost Summary' AND ColumnName='Total Energy Cost'")
321
+ # Fuel cost based local utility rates
322
+ costing_rownames = model.sqlFile.get.execAndReturnVectorOfString("SELECT RowName FROM TabularDataWithStrings WHERE ReportName='LEEDsummary' AND ReportForString='Entire Facility' AND TableName='EAp2-7. Energy Cost Summary' AND ColumnName='Total Energy Cost'")
325
323
  #==> ["Electricity", "Natural Gas", "Additional", "Total"]
326
- costing_rownames = validate_optional(costing_rownames, model, "N/A")
327
- unless costing_rownames == "N/A"
324
+ costing_rownames = validate_optional(costing_rownames, model, 'N/A')
325
+ if costing_rownames != 'N/A'
328
326
  costing_rownames.each do |rowname|
329
327
  case rowname
330
- when "Electricity"
331
- qaqc[:economics][:electricity_cost] = model.sqlFile().get().execAndReturnFirstDouble("SELECT Value FROM TabularDataWithStrings WHERE ReportName='LEEDsummary' AND ReportForString='Entire Facility' AND TableName='EAp2-7. Energy Cost Summary' AND ColumnName='Total Energy Cost' AND RowName='#{rowname}'").get
332
- qaqc[:economics][:electricity_cost_per_m2]=qaqc[:economics][:electricity_cost]/qaqc[:building][:conditioned_floor_area_m2] unless model.building.get.conditionedFloorArea().empty?
333
- when "Natural Gas"
334
- qaqc[:economics][:natural_gas_cost] = model.sqlFile().get().execAndReturnFirstDouble("SELECT Value FROM TabularDataWithStrings WHERE ReportName='LEEDsummary' AND ReportForString='Entire Facility' AND TableName='EAp2-7. Energy Cost Summary' AND ColumnName='Total Energy Cost' AND RowName='#{rowname}'").get
335
- qaqc[:economics][:natural_gas_cost_per_m2]=qaqc[:economics][:natural_gas_cost]/qaqc[:building][:conditioned_floor_area_m2] unless model.building.get.conditionedFloorArea().empty?
336
-
337
- when "Additional"
338
- qaqc[:economics][:additional_cost] = model.sqlFile().get().execAndReturnFirstDouble("SELECT Value FROM TabularDataWithStrings WHERE ReportName='LEEDsummary' AND ReportForString='Entire Facility' AND TableName='EAp2-7. Energy Cost Summary' AND ColumnName='Total Energy Cost' AND RowName='#{rowname}'").get
339
- qaqc[:economics][:additional_cost_per_m2]=qaqc[:economics][:additional_cost]/qaqc[:building][:conditioned_floor_area_m2] unless model.building.get.conditionedFloorArea().empty?
340
-
341
- when "Total"
342
- qaqc[:economics][:total_cost] = model.sqlFile().get().execAndReturnFirstDouble("SELECT Value FROM TabularDataWithStrings WHERE ReportName='LEEDsummary' AND ReportForString='Entire Facility' AND TableName='EAp2-7. Energy Cost Summary' AND ColumnName='Total Energy Cost' AND RowName='#{rowname}'").get
343
- qaqc[:economics][:total_cost_per_m2]=qaqc[:economics][:total_cost]/qaqc[:building][:conditioned_floor_area_m2] unless model.building.get.conditionedFloorArea().empty?
328
+ when 'Electricity'
329
+ qaqc[:economics][:electricity_cost] = model.sqlFile.get.execAndReturnFirstDouble("SELECT Value FROM TabularDataWithStrings WHERE ReportName='LEEDsummary' AND ReportForString='Entire Facility' AND TableName='EAp2-7. Energy Cost Summary' AND ColumnName='Total Energy Cost' AND RowName='#{rowname}'").get
330
+ qaqc[:economics][:electricity_cost_per_m2] = qaqc[:economics][:electricity_cost] / qaqc[:building][:conditioned_floor_area_m2] unless model.building.get.conditionedFloorArea.empty?
331
+ when 'Natural Gas'
332
+ qaqc[:economics][:natural_gas_cost] = model.sqlFile.get.execAndReturnFirstDouble("SELECT Value FROM TabularDataWithStrings WHERE ReportName='LEEDsummary' AND ReportForString='Entire Facility' AND TableName='EAp2-7. Energy Cost Summary' AND ColumnName='Total Energy Cost' AND RowName='#{rowname}'").get
333
+ qaqc[:economics][:natural_gas_cost_per_m2] = qaqc[:economics][:natural_gas_cost] / qaqc[:building][:conditioned_floor_area_m2] unless model.building.get.conditionedFloorArea.empty?
334
+
335
+ when 'Additional'
336
+ qaqc[:economics][:additional_cost] = model.sqlFile.get.execAndReturnFirstDouble("SELECT Value FROM TabularDataWithStrings WHERE ReportName='LEEDsummary' AND ReportForString='Entire Facility' AND TableName='EAp2-7. Energy Cost Summary' AND ColumnName='Total Energy Cost' AND RowName='#{rowname}'").get
337
+ qaqc[:economics][:additional_cost_per_m2] = qaqc[:economics][:additional_cost] / qaqc[:building][:conditioned_floor_area_m2] unless model.building.get.conditionedFloorArea.empty?
338
+
339
+ when 'Total'
340
+ qaqc[:economics][:total_cost] = model.sqlFile.get.execAndReturnFirstDouble("SELECT Value FROM TabularDataWithStrings WHERE ReportName='LEEDsummary' AND ReportForString='Entire Facility' AND TableName='EAp2-7. Energy Cost Summary' AND ColumnName='Total Energy Cost' AND RowName='#{rowname}'").get
341
+ qaqc[:economics][:total_cost_per_m2] = qaqc[:economics][:total_cost] / qaqc[:building][:conditioned_floor_area_m2] unless model.building.get.conditionedFloorArea.empty?
344
342
  end
345
343
  end
346
344
  else
347
345
  error_warning << "costing is unavailable because the sql statement is nil RowName FROM TabularDataWithStrings WHERE ReportName='LEEDsummary' AND ReportForString='Entire Facility' AND TableName='EAp2-7. Energy Cost Summary' AND ColumnName='Total Energy Cost'"
348
346
  end
349
347
 
350
- #Store end_use data
348
+ # Store end_use data
351
349
  end_uses = [
352
- 'Heating',
353
- 'Cooling',
354
- 'Interior Lighting',
355
- 'Exterior Lighting',
356
- 'Interior Equipment',
357
- 'Exterior Equipment',
358
- 'Fans',
359
- 'Pumps',
360
- 'Heat Rejection',
361
- 'Humidification',
362
- 'Heat Recovery',
363
- 'Water Systems',
364
- 'Refrigeration',
365
- 'Generators',
366
- 'Total End Uses'
350
+ 'Heating',
351
+ 'Cooling',
352
+ 'Interior Lighting',
353
+ 'Exterior Lighting',
354
+ 'Interior Equipment',
355
+ 'Exterior Equipment',
356
+ 'Fans',
357
+ 'Pumps',
358
+ 'Heat Rejection',
359
+ 'Humidification',
360
+ 'Heat Recovery',
361
+ 'Water Systems',
362
+ 'Refrigeration',
363
+ 'Generators',
364
+ 'Total End Uses'
367
365
  ]
368
366
 
369
367
  fuels = [
370
- ['Electricity', 'GJ'],
371
- ['Natural Gas', 'GJ'],
372
- ['Additional Fuel', 'GJ'],
373
- ['District Cooling', 'GJ'],
374
- ['District Heating', 'GJ'],
368
+ ['Electricity', 'GJ'],
369
+ ['Natural Gas', 'GJ'],
370
+ ['Additional Fuel', 'GJ'],
371
+ ['District Cooling', 'GJ'],
372
+ ['District Heating', 'GJ']
375
373
  ]
376
374
 
377
375
  qaqc[:end_uses] = {}
378
376
  qaqc[:end_uses_eui] = {}
379
377
  end_uses.each do |use_type|
380
- qaqc[:end_uses]["#{use_type.gsub(/\s+/, "_").downcase.to_sym}_gj"] = 0
381
- qaqc[:end_uses_eui]["#{use_type.gsub(/\s+/, "_").downcase.to_sym}_gj_per_m2"] = 0
378
+ qaqc[:end_uses]["#{use_type.gsub(/\s+/, '_').downcase.to_sym}_gj"] = 0
379
+ qaqc[:end_uses_eui]["#{use_type.gsub(/\s+/, '_').downcase.to_sym}_gj_per_m2"] = 0
382
380
  fuels.each do |fuel_type|
383
- value = model.sqlFile().get().execAndReturnFirstDouble("SELECT Value FROM tabulardatawithstrings WHERE ReportName='AnnualBuildingUtilityPerformanceSummary' AND ReportForString='Entire Facility' AND TableName='End Uses' AND RowName='#{use_type}' AND ColumnName='#{fuel_type[0]}' AND Units='#{fuel_type[1]}'")
384
- if value.empty? or value.get == 0
381
+ value = model.sqlFile.get.execAndReturnFirstDouble("SELECT Value FROM tabulardatawithstrings WHERE ReportName='AnnualBuildingUtilityPerformanceSummary' AND ReportForString='Entire Facility' AND TableName='End Uses' AND RowName='#{use_type}' AND ColumnName='#{fuel_type[0]}' AND Units='#{fuel_type[1]}'")
382
+ if value.empty? || (value.get == 0)
385
383
  else
386
- qaqc[:end_uses]["#{use_type.gsub(/\s+/, "_").downcase.to_sym}_gj"] += value.get
384
+ qaqc[:end_uses]["#{use_type.gsub(/\s+/, '_').downcase.to_sym}_gj"] += value.get
387
385
  unless qaqc[:building][:conditioned_floor_area_m2].nil?
388
- qaqc[:end_uses_eui]["#{use_type.gsub(/\s+/, "_").downcase.to_sym}_gj_per_m2"] += value.get / qaqc[:building][:conditioned_floor_area_m2]
386
+ qaqc[:end_uses_eui]["#{use_type.gsub(/\s+/, '_').downcase.to_sym}_gj_per_m2"] += value.get / qaqc[:building][:conditioned_floor_area_m2]
389
387
  end
390
388
  end
391
389
  end
392
- value = model.sqlFile().get().execAndReturnFirstDouble("SELECT Value FROM tabulardatawithstrings WHERE ReportName='AnnualBuildingUtilityPerformanceSummary' AND ReportForString='Entire Facility' AND TableName='End Uses' AND RowName='#{use_type}' AND ColumnName='Water' AND Units='m3'")
393
- if value.empty? or value.get == 0
390
+ value = model.sqlFile.get.execAndReturnFirstDouble("SELECT Value FROM tabulardatawithstrings WHERE ReportName='AnnualBuildingUtilityPerformanceSummary' AND ReportForString='Entire Facility' AND TableName='End Uses' AND RowName='#{use_type}' AND ColumnName='Water' AND Units='m3'")
391
+ if value.empty? || (value.get == 0)
394
392
  else
395
- qaqc[:end_uses]["#{use_type.gsub(/\s+/, "_").downcase.to_sym}_water_m3"] = value.get
393
+ qaqc[:end_uses]["#{use_type.gsub(/\s+/, '_').downcase.to_sym}_water_m3"] = value.get
396
394
  unless qaqc[:building][:conditioned_floor_area_m2].nil?
397
- qaqc[:end_uses_eui]["#{use_type.gsub(/\s+/, "_").downcase.to_sym}_water_m3_per_m2"] = value.get / qaqc[:building][:conditioned_floor_area_m2]
395
+ qaqc[:end_uses_eui]["#{use_type.gsub(/\s+/, '_').downcase.to_sym}_water_m3_per_m2"] = value.get / qaqc[:building][:conditioned_floor_area_m2]
398
396
  end
399
397
  end
400
398
  end
401
399
 
402
400
  # Store Peak Data
403
401
  qaqc[:meter_peaks] = {}
404
- qaqc[:meter_peaks][:electric_w] = electric_peak.empty? ? "NA" : electric_peak.get
405
- qaqc[:meter_peaks][:natural_gas_w] = natural_gas_peak.empty? ? "NA" : natural_gas_peak.get
406
-
402
+ qaqc[:meter_peaks][:electric_w] = electric_peak.empty? ? 'NA' : electric_peak.get
403
+ qaqc[:meter_peaks][:natural_gas_w] = natural_gas_peak.empty? ? 'NA' : natural_gas_peak.get
407
404
 
408
- #Store unmet hour data
405
+ # Store unmet hour data
409
406
  qaqc[:unmet_hours] = {}
410
- qaqc[:unmet_hours][:cooling] = model.getFacility.hoursCoolingSetpointNotMet().get unless model.getFacility.hoursCoolingSetpointNotMet().empty?
411
- qaqc[:unmet_hours][:heating] = model.getFacility.hoursHeatingSetpointNotMet().get unless model.getFacility.hoursHeatingSetpointNotMet().empty?
407
+ qaqc[:unmet_hours][:cooling] = model.getFacility.hoursCoolingSetpointNotMet.get unless model.getFacility.hoursCoolingSetpointNotMet.empty?
408
+ qaqc[:unmet_hours][:heating] = model.getFacility.hoursHeatingSetpointNotMet.get unless model.getFacility.hoursHeatingSetpointNotMet.empty?
412
409
 
410
+ # puts "\n\n\n#{costing_rownames}\n\n\n"
411
+ # Padmassun's Code -- Tarrif end
413
412
 
414
- #puts "\n\n\n#{costing_rownames}\n\n\n"
415
- #Padmassun's Code -- Tarrif end
416
-
417
-
418
- #Padmassun's Code -- Service Hotwater Heating *start*
413
+ # Padmassun's Code -- Service Hotwater Heating *start*
419
414
  qaqc[:service_water_heating] = {}
420
- qaqc[:service_water_heating][:total_nominal_occupancy]=-1
421
- #qaqc[:service_water_heating][:total_nominal_occupancy]=model.sqlFile().get().execAndReturnVectorOfDouble("SELECT Value FROM TabularDataWithStrings WHERE ReportName='OutdoorAirSummary' AND ReportForString='Entire Facility' AND TableName='Average Outdoor Air During Occupied Hours' AND ColumnName='Nominal Number of Occupants'").get.inject(0, :+)
422
- qaqc[:service_water_heating][:total_nominal_occupancy]=get_total_nominal_capacity(model)
415
+ qaqc[:service_water_heating][:total_nominal_occupancy] = -1
416
+ # qaqc[:service_water_heating][:total_nominal_occupancy]=model.sqlFile().get().execAndReturnVectorOfDouble("SELECT Value FROM TabularDataWithStrings WHERE ReportName='OutdoorAirSummary' AND ReportForString='Entire Facility' AND TableName='Average Outdoor Air During Occupied Hours' AND ColumnName='Nominal Number of Occupants'").get.inject(0, :+)
417
+ qaqc[:service_water_heating][:total_nominal_occupancy] = get_total_nominal_capacity(model)
423
418
 
424
- qaqc[:service_water_heating][:electricity_per_year]=model.sqlFile().get().execAndReturnFirstDouble("SELECT Value FROM TabularDataWithStrings WHERE ReportName='AnnualBuildingUtilityPerformanceSummary' AND ReportForString='Entire Facility' AND TableName='End Uses' AND ColumnName='Electricity' AND RowName='Water Systems'")
425
- qaqc[:service_water_heating][:electricity_per_year]= validate_optional(qaqc[:service_water_heating][:electricity_per_year], model, -1)
419
+ qaqc[:service_water_heating][:electricity_per_year] = model.sqlFile.get.execAndReturnFirstDouble("SELECT Value FROM TabularDataWithStrings WHERE ReportName='AnnualBuildingUtilityPerformanceSummary' AND ReportForString='Entire Facility' AND TableName='End Uses' AND ColumnName='Electricity' AND RowName='Water Systems'")
420
+ qaqc[:service_water_heating][:electricity_per_year] = validate_optional(qaqc[:service_water_heating][:electricity_per_year], model, -1)
426
421
 
427
- qaqc[:service_water_heating][:electricity_per_day]=qaqc[:service_water_heating][:electricity_per_year]/365.5
428
- qaqc[:service_water_heating][:electricity_per_day_per_occupant]=qaqc[:service_water_heating][:electricity_per_day]/qaqc[:service_water_heating][:total_nominal_occupancy]
422
+ qaqc[:service_water_heating][:electricity_per_day] = qaqc[:service_water_heating][:electricity_per_year] / 365.5
423
+ qaqc[:service_water_heating][:electricity_per_day_per_occupant] = qaqc[:service_water_heating][:electricity_per_day] / qaqc[:service_water_heating][:total_nominal_occupancy]
429
424
 
425
+ qaqc[:service_water_heating][:natural_gas_per_year] = model.sqlFile.get.execAndReturnFirstDouble("SELECT Value FROM TabularDataWithStrings WHERE ReportName='AnnualBuildingUtilityPerformanceSummary' AND ReportForString='Entire Facility' AND TableName='End Uses' AND ColumnName='Natural Gas' AND RowName='Water Systems'")
426
+ qaqc[:service_water_heating][:natural_gas_per_year] = validate_optional(qaqc[:service_water_heating][:natural_gas_per_year], model, -1)
430
427
 
431
- qaqc[:service_water_heating][:natural_gas_per_year]=model.sqlFile().get().execAndReturnFirstDouble("SELECT Value FROM TabularDataWithStrings WHERE ReportName='AnnualBuildingUtilityPerformanceSummary' AND ReportForString='Entire Facility' AND TableName='End Uses' AND ColumnName='Natural Gas' AND RowName='Water Systems'")
432
- qaqc[:service_water_heating][:natural_gas_per_year]=validate_optional(qaqc[:service_water_heating][:natural_gas_per_year], model, -1)
433
-
434
- qaqc[:service_water_heating][:additional_fuel_per_year]=model.sqlFile().get().execAndReturnFirstDouble("SELECT Value FROM TabularDataWithStrings WHERE ReportName='AnnualBuildingUtilityPerformanceSummary' AND ReportForString='Entire Facility' AND TableName='End Uses' AND ColumnName='Additional Fuel' AND RowName='Water Systems'")
428
+ qaqc[:service_water_heating][:additional_fuel_per_year] = model.sqlFile.get.execAndReturnFirstDouble("SELECT Value FROM TabularDataWithStrings WHERE ReportName='AnnualBuildingUtilityPerformanceSummary' AND ReportForString='Entire Facility' AND TableName='End Uses' AND ColumnName='Additional Fuel' AND RowName='Water Systems'")
435
429
  qaqc[:service_water_heating][:additional_fuel_per_year] = validate_optional(qaqc[:service_water_heating][:additional_fuel_per_year], model, -1)
436
430
 
437
- qaqc[:service_water_heating][:water_m3_per_year]=model.sqlFile().get().execAndReturnFirstDouble("SELECT Value FROM TabularDataWithStrings WHERE ReportName='AnnualBuildingUtilityPerformanceSummary' AND ReportForString='Entire Facility' AND TableName='End Uses' AND ColumnName='Water' AND RowName='Water Systems'")
438
- qaqc[:service_water_heating][:water_m3_per_year]=validate_optional(qaqc[:service_water_heating][:water_m3_per_year], model, -1)
431
+ qaqc[:service_water_heating][:water_m3_per_year] = model.sqlFile.get.execAndReturnFirstDouble("SELECT Value FROM TabularDataWithStrings WHERE ReportName='AnnualBuildingUtilityPerformanceSummary' AND ReportForString='Entire Facility' AND TableName='End Uses' AND ColumnName='Water' AND RowName='Water Systems'")
432
+ qaqc[:service_water_heating][:water_m3_per_year] = validate_optional(qaqc[:service_water_heating][:water_m3_per_year], model, -1)
439
433
 
440
- qaqc[:service_water_heating][:water_m3_per_day]=qaqc[:service_water_heating][:water_m3_per_year]/365.5
441
- qaqc[:service_water_heating][:water_m3_per_day_per_occupant]=qaqc[:service_water_heating][:water_m3_per_day]/qaqc[:service_water_heating][:total_nominal_occupancy]
442
- #puts qaqc[:service_water_heating][:total_nominal_occupancy]
443
- #Padmassun's Code -- Service Hotwater Heating *end*
434
+ qaqc[:service_water_heating][:water_m3_per_day] = qaqc[:service_water_heating][:water_m3_per_year] / 365.5
435
+ qaqc[:service_water_heating][:water_m3_per_day_per_occupant] = qaqc[:service_water_heating][:water_m3_per_day] / qaqc[:service_water_heating][:total_nominal_occupancy]
436
+ # puts qaqc[:service_water_heating][:total_nominal_occupancy]
437
+ # Padmassun's Code -- Service Hotwater Heating *end*
444
438
 
445
- #Store Envelope data.
439
+ # Store Envelope data.
446
440
  qaqc[:envelope] = {}
447
- #Get Areas
448
- qaqc[:envelope][:outdoor_walls_area_m2] = outdoor_walls.inject(0){|sum,e| sum + e.netArea() * e.space.get.multiplier }
449
- qaqc[:envelope][:outdoor_roofs_area_m2] = outdoor_roofs.inject(0){|sum,e| sum + e.netArea() * e.space.get.multiplier }
450
- qaqc[:envelope][:outdoor_floors_area_m2] = outdoor_floors.inject(0){|sum,e| sum + e.netArea() * e.space.get.multiplier }
451
- qaqc[:envelope][:ground_walls_area_m2] = ground_walls.inject(0){|sum,e| sum + e.netArea() * e.space.get.multiplier }
452
- qaqc[:envelope][:ground_roofs_area_m2] = ground_roofs.inject(0){|sum,e| sum + e.netArea() * e.space.get.multiplier }
453
- qaqc[:envelope][:ground_floors_area_m2] = ground_floors.inject(0){|sum,e| sum + e.netArea() * e.space.get.multiplier }
454
- qaqc[:envelope][:interior_floors_area_m2] = interior_floors.inject(0){|sum,e| sum + e.netArea() * e.space.get.multiplier }
455
-
456
- #Subsurface areas
457
- qaqc[:envelope][:windows_area_m2] = windows.inject(0){|sum,e| sum + e.netArea() * e.space.get.multiplier * e.multiplier }
458
- qaqc[:envelope][:skylights_area_m2] = skylights.inject(0){|sum,e| sum + e.netArea() * e.space.get.multiplier * e.multiplier }
459
- qaqc[:envelope][:doors_area_m2] = doors.inject(0){|sum,e| sum + e.netArea() * e.space.get.multiplier * e.multiplier }
460
- qaqc[:envelope][:overhead_doors_area_m2] = overhead_doors.inject(0){|sum,e| sum + e.netArea() * e.space.get.multiplier * e.multiplier }
461
-
462
- #Total Building Surface Area.
441
+ # Get Areas
442
+ qaqc[:envelope][:outdoor_walls_area_m2] = outdoor_walls.inject(0) { |sum, e| sum + e.netArea * e.space.get.multiplier }
443
+ qaqc[:envelope][:outdoor_roofs_area_m2] = outdoor_roofs.inject(0) { |sum, e| sum + e.netArea * e.space.get.multiplier }
444
+ qaqc[:envelope][:outdoor_floors_area_m2] = outdoor_floors.inject(0) { |sum, e| sum + e.netArea * e.space.get.multiplier }
445
+ qaqc[:envelope][:ground_walls_area_m2] = ground_walls.inject(0) { |sum, e| sum + e.netArea * e.space.get.multiplier }
446
+ qaqc[:envelope][:ground_roofs_area_m2] = ground_roofs.inject(0) { |sum, e| sum + e.netArea * e.space.get.multiplier }
447
+ qaqc[:envelope][:ground_floors_area_m2] = ground_floors.inject(0) { |sum, e| sum + e.netArea * e.space.get.multiplier }
448
+ qaqc[:envelope][:interior_floors_area_m2] = interior_floors.inject(0) { |sum, e| sum + e.netArea * e.space.get.multiplier }
449
+
450
+ # Subsurface areas
451
+ qaqc[:envelope][:windows_area_m2] = windows.inject(0) { |sum, e| sum + e.netArea * e.space.get.multiplier * e.multiplier }
452
+ qaqc[:envelope][:skylights_area_m2] = skylights.inject(0) { |sum, e| sum + e.netArea * e.space.get.multiplier * e.multiplier }
453
+ qaqc[:envelope][:doors_area_m2] = doors.inject(0) { |sum, e| sum + e.netArea * e.space.get.multiplier * e.multiplier }
454
+ qaqc[:envelope][:overhead_doors_area_m2] = overhead_doors.inject(0) { |sum, e| sum + e.netArea * e.space.get.multiplier * e.multiplier }
455
+
456
+ # Total Building Surface Area.
463
457
  qaqc[:envelope][:total_exterior_area_m2] = qaqc[:envelope][:outdoor_walls_area_m2] +
464
- qaqc[:envelope][:outdoor_roofs_area_m2] +
465
- qaqc[:envelope][:outdoor_floors_area_m2] +
466
- qaqc[:envelope][:ground_walls_area_m2] +
467
- qaqc[:envelope][:ground_roofs_area_m2] +
468
- qaqc[:envelope][:ground_floors_area_m2] +
469
- qaqc[:envelope][:windows_area_m2] +
470
- qaqc[:envelope][:skylights_area_m2] +
471
- qaqc[:envelope][:doors_area_m2] +
472
- qaqc[:envelope][:overhead_doors_area_m2]
473
- #Total Building Ground Surface Area.
458
+ qaqc[:envelope][:outdoor_roofs_area_m2] +
459
+ qaqc[:envelope][:outdoor_floors_area_m2] +
460
+ qaqc[:envelope][:ground_walls_area_m2] +
461
+ qaqc[:envelope][:ground_roofs_area_m2] +
462
+ qaqc[:envelope][:ground_floors_area_m2] +
463
+ qaqc[:envelope][:windows_area_m2] +
464
+ qaqc[:envelope][:skylights_area_m2] +
465
+ qaqc[:envelope][:doors_area_m2] +
466
+ qaqc[:envelope][:overhead_doors_area_m2]
467
+ # Total Building Ground Surface Area.
474
468
  qaqc[:envelope][:total_ground_area_m2] = qaqc[:envelope][:ground_walls_area_m2] +
475
- qaqc[:envelope][:ground_roofs_area_m2] +
476
- qaqc[:envelope][:ground_floors_area_m2]
477
- #Total Building Outdoor Surface Area.
469
+ qaqc[:envelope][:ground_roofs_area_m2] +
470
+ qaqc[:envelope][:ground_floors_area_m2]
471
+ # Total Building Outdoor Surface Area.
478
472
  qaqc[:envelope][:total_outdoor_area_m2] = qaqc[:envelope][:outdoor_walls_area_m2] +
479
- qaqc[:envelope][:outdoor_roofs_area_m2] +
480
- qaqc[:envelope][:outdoor_floors_area_m2] +
481
- qaqc[:envelope][:windows_area_m2] +
482
- qaqc[:envelope][:skylights_area_m2] +
483
- qaqc[:envelope][:doors_area_m2] +
484
- qaqc[:envelope][:overhead_doors_area_m2]
485
-
486
-
487
- #Average Conductances by surface Type
488
- qaqc[:envelope][:outdoor_walls_average_conductance_w_per_m2_k] = BTAP::Geometry::Surfaces::get_weighted_average_surface_conductance(outdoor_walls).round(4) if outdoor_walls.size > 0
489
- qaqc[:envelope][:outdoor_roofs_average_conductance_w_per_m2_k] = BTAP::Geometry::Surfaces::get_weighted_average_surface_conductance(outdoor_roofs).round(4) if outdoor_roofs.size > 0
490
- qaqc[:envelope][:outdoor_floors_average_conductance_w_per_m2_k] = BTAP::Geometry::Surfaces::get_weighted_average_surface_conductance(outdoor_floors).round(4) if outdoor_floors.size > 0
491
- qaqc[:envelope][:ground_walls_average_conductance_w_per_m2_k] = BTAP::Geometry::Surfaces::get_weighted_average_surface_conductance(ground_walls).round(4) if ground_walls.size > 0
492
- qaqc[:envelope][:ground_roofs_average_conductance_w_per_m2_k] = BTAP::Geometry::Surfaces::get_weighted_average_surface_conductance(ground_roofs).round(4) if ground_roofs.size > 0
493
- qaqc[:envelope][:ground_floors_average_conductance_w_per_m2_k] = BTAP::Geometry::Surfaces::get_weighted_average_surface_conductance(ground_floors).round(4) if ground_floors.size > 0
494
- qaqc[:envelope][:windows_average_conductance_w_per_m2_k] = BTAP::Geometry::Surfaces::get_weighted_average_surface_conductance(windows).round(4) if windows.size > 0
495
- qaqc[:envelope][:skylights_average_conductance_w_per_m2_k] = BTAP::Geometry::Surfaces::get_weighted_average_surface_conductance(skylights).round(4) if skylights.size > 0
496
- qaqc[:envelope][:doors_average_conductance_w_per_m2_k] = BTAP::Geometry::Surfaces::get_weighted_average_surface_conductance(doors).round(4) if doors.size > 0
497
- qaqc[:envelope][:overhead_doors_average_conductance_w_per_m2_k] = BTAP::Geometry::Surfaces::get_weighted_average_surface_conductance(overhead_doors).round(4) if overhead_doors.size > 0
473
+ qaqc[:envelope][:outdoor_roofs_area_m2] +
474
+ qaqc[:envelope][:outdoor_floors_area_m2] +
475
+ qaqc[:envelope][:windows_area_m2] +
476
+ qaqc[:envelope][:skylights_area_m2] +
477
+ qaqc[:envelope][:doors_area_m2] +
478
+ qaqc[:envelope][:overhead_doors_area_m2]
479
+
480
+ # Average Conductances by surface Type
481
+ qaqc[:envelope][:outdoor_walls_average_conductance_w_per_m2_k] = BTAP::Geometry::Surfaces.get_weighted_average_surface_conductance(outdoor_walls).round(4) if !outdoor_walls.empty?
482
+ qaqc[:envelope][:outdoor_roofs_average_conductance_w_per_m2_k] = BTAP::Geometry::Surfaces.get_weighted_average_surface_conductance(outdoor_roofs).round(4) if !outdoor_roofs.empty?
483
+ qaqc[:envelope][:outdoor_floors_average_conductance_w_per_m2_k] = BTAP::Geometry::Surfaces.get_weighted_average_surface_conductance(outdoor_floors).round(4) if !outdoor_floors.empty?
484
+ qaqc[:envelope][:ground_walls_average_conductance_w_per_m2_k] = BTAP::Geometry::Surfaces.get_weighted_average_surface_conductance(ground_walls).round(4) if !ground_walls.empty?
485
+ qaqc[:envelope][:ground_roofs_average_conductance_w_per_m2_k] = BTAP::Geometry::Surfaces.get_weighted_average_surface_conductance(ground_roofs).round(4) if !ground_roofs.empty?
486
+ qaqc[:envelope][:ground_floors_average_conductance_w_per_m2_k] = BTAP::Geometry::Surfaces.get_weighted_average_surface_conductance(ground_floors).round(4) if !ground_floors.empty?
487
+ qaqc[:envelope][:windows_average_conductance_w_per_m2_k] = BTAP::Geometry::Surfaces.get_weighted_average_surface_conductance(windows).round(4) if !windows.empty?
488
+ qaqc[:envelope][:skylights_average_conductance_w_per_m2_k] = BTAP::Geometry::Surfaces.get_weighted_average_surface_conductance(skylights).round(4) if !skylights.empty?
489
+ qaqc[:envelope][:doors_average_conductance_w_per_m2_k] = BTAP::Geometry::Surfaces.get_weighted_average_surface_conductance(doors).round(4) if !doors.empty?
490
+ qaqc[:envelope][:overhead_doors_average_conductance_w_per_m2_k] = BTAP::Geometry::Surfaces.get_weighted_average_surface_conductance(overhead_doors).round(4) if !overhead_doors.empty?
498
491
 
499
492
  # #Average Conductances for building whole weight factors
500
- outdoor_walls.size > 0 ? o_wall_cond_weight = qaqc[:envelope][:outdoor_walls_average_conductance_w_per_m2_k] * qaqc[:envelope][:outdoor_walls_area_m2] : o_wall_cond_weight = 0
501
- outdoor_roofs.size > 0 ? o_roof_cond_weight = qaqc[:envelope][:outdoor_roofs_average_conductance_w_per_m2_k] * qaqc[:envelope][:outdoor_roofs_area_m2] : o_roof_cond_weight = 0
502
- outdoor_floors.size > 0 ? o_floor_cond_weight = qaqc[:envelope][:outdoor_floors_average_conductance_w_per_m2_k] * qaqc[:envelope][:outdoor_floors_area_m2]: o_floor_cond_weight = 0
503
- ground_walls.size > 0 ? g_wall_cond_weight = qaqc[:envelope][:ground_walls_average_conductance_w_per_m2_k] * qaqc[:envelope][:ground_walls_area_m2] : g_wall_cond_weight = 0
504
- ground_roofs.size > 0 ? g_roof_cond_weight = qaqc[:envelope][:ground_roofs_average_conductance_w_per_m2_k] * qaqc[:envelope][:ground_roofs_area_m2] : g_roof_cond_weight = 0
505
- ground_floors.size > 0 ? g_floor_cond_weight = qaqc[:envelope][:ground_floors_average_conductance_w_per_m2_k] * qaqc[:envelope][:ground_floors_area_m2] : g_floor_cond_weight = 0
506
- windows.size > 0 ? win_cond_weight = qaqc[:envelope][:windows_average_conductance_w_per_m2_k] * qaqc[:envelope][:windows_area_m2] : win_cond_weight = 0
493
+ !outdoor_walls.empty? ? o_wall_cond_weight = qaqc[:envelope][:outdoor_walls_average_conductance_w_per_m2_k] * qaqc[:envelope][:outdoor_walls_area_m2] : o_wall_cond_weight = 0
494
+ !outdoor_roofs.empty? ? o_roof_cond_weight = qaqc[:envelope][:outdoor_roofs_average_conductance_w_per_m2_k] * qaqc[:envelope][:outdoor_roofs_area_m2] : o_roof_cond_weight = 0
495
+ !outdoor_floors.empty? ? o_floor_cond_weight = qaqc[:envelope][:outdoor_floors_average_conductance_w_per_m2_k] * qaqc[:envelope][:outdoor_floors_area_m2] : o_floor_cond_weight = 0
496
+ !ground_walls.empty? ? g_wall_cond_weight = qaqc[:envelope][:ground_walls_average_conductance_w_per_m2_k] * qaqc[:envelope][:ground_walls_area_m2] : g_wall_cond_weight = 0
497
+ !ground_roofs.empty? ? g_roof_cond_weight = qaqc[:envelope][:ground_roofs_average_conductance_w_per_m2_k] * qaqc[:envelope][:ground_roofs_area_m2] : g_roof_cond_weight = 0
498
+ !ground_floors.empty? ? g_floor_cond_weight = qaqc[:envelope][:ground_floors_average_conductance_w_per_m2_k] * qaqc[:envelope][:ground_floors_area_m2] : g_floor_cond_weight = 0
499
+ !windows.empty? ? win_cond_weight = qaqc[:envelope][:windows_average_conductance_w_per_m2_k] * qaqc[:envelope][:windows_area_m2] : win_cond_weight = 0
507
500
  # doors.size > 0 ? sky_cond_weight = qaqc[:envelope][:skylights_average_conductance_w_per_m2_k] * qaqc[:envelope][:skylights_area_m2] : sky_cond_weight = 0
508
- if doors.size > 0 && !qaqc[:envelope][:skylights_average_conductance_w_per_m2_k].nil? && !qaqc[:envelope][:skylights_area_m2].nil?
501
+ if !doors.empty? && !qaqc[:envelope][:skylights_average_conductance_w_per_m2_k].nil? && !qaqc[:envelope][:skylights_area_m2].nil?
509
502
  sky_cond_weight = qaqc[:envelope][:skylights_average_conductance_w_per_m2_k] * qaqc[:envelope][:skylights_area_m2]
510
503
  else
511
504
  sky_cond_weight = 0
512
505
  end
513
- overhead_doors.size > 0 ? door_cond_weight = qaqc[:envelope][:doors_average_conductance_w_per_m2_k] * qaqc[:envelope][:doors_area_m2] : door_cond_weight = 0
514
- overhead_doors.size > 0 ?overhead_door_cond_weight = qaqc[:envelope][:overhead_doors_average_conductance_w_per_m2_k] * qaqc[:envelope][:overhead_doors_area_m2] : overhead_door_cond_weight = 0
515
-
506
+ !overhead_doors.empty? ? door_cond_weight = qaqc[:envelope][:doors_average_conductance_w_per_m2_k] * qaqc[:envelope][:doors_area_m2] : door_cond_weight = 0
507
+ !overhead_doors.empty? ? overhead_door_cond_weight = qaqc[:envelope][:overhead_doors_average_conductance_w_per_m2_k] * qaqc[:envelope][:overhead_doors_area_m2] : overhead_door_cond_weight = 0
516
508
 
517
509
  # Building Average Conductance
518
510
  qaqc[:envelope][:building_outdoor_average_conductance_w_per_m2_k] = (
@@ -534,38 +526,36 @@ class NECB2011
534
526
  qaqc[:envelope][:building_average_conductance_w_per_m2_k] = (
535
527
  (qaqc[:envelope][:building_ground_average_conductance_w_per_m2_k] * qaqc[:envelope][:total_ground_area_m2]) +
536
528
  (qaqc[:envelope][:building_outdoor_average_conductance_w_per_m2_k] * qaqc[:envelope][:total_outdoor_area_m2])
537
- ) /
538
- (qaqc[:envelope][:total_ground_area_m2] + qaqc[:envelope][:total_outdoor_area_m2])
539
-
540
-
541
- qaqc[:envelope][:fdwr] = (BTAP::Geometry::get_fwdr(model) * 100.0).round(1)
542
- qaqc[:envelope][:srr] = (BTAP::Geometry::get_srr(model) * 100.0).round(1)
529
+ ) /
530
+ (qaqc[:envelope][:total_ground_area_m2] + qaqc[:envelope][:total_outdoor_area_m2])
543
531
 
532
+ qaqc[:envelope][:fdwr] = (BTAP::Geometry.get_fwdr(model) * 100.0).round(1)
533
+ qaqc[:envelope][:srr] = (BTAP::Geometry.get_srr(model) * 100.0).round(1)
544
534
 
545
535
  qaqc[:envelope][:constructions] = {}
546
536
  qaqc[:envelope][:constructions][:exterior_fenestration] = []
547
537
  constructions = []
548
- outdoor_subsurfaces.each {|surface| constructions << surface.construction.get}
538
+ outdoor_subsurfaces.each { |surface| constructions << surface.construction.get }
549
539
  ext_const_base = Hash.new(0)
550
- constructions.each {|name| ext_const_base[name] += 1}
551
- #iterate thought each construction and get store data
540
+ constructions.each { |name| ext_const_base[name] += 1 }
541
+ # iterate thought each construction and get store data
552
542
  ext_const_base.sort.each do |construction, count|
553
543
  construction_info = {}
554
544
  qaqc[:envelope][:constructions][:exterior_fenestration] << construction_info
555
545
  construction_info[:name] = construction.name.get
556
546
  construction_info[:net_area_m2] = construction.getNetArea.round(2)
557
- construction_info[:thermal_conductance_m2_w_per_k] = BTAP::Resources::Envelope::Constructions::get_conductance(construction).round(3)
558
- construction_info[:solar_transmittance] = BTAP::Resources::Envelope::Constructions::get_shgc(model, construction).round(3)
559
- construction_info[:visible_tranmittance] = BTAP::Resources::Envelope::Constructions::get_tvis(model, construction).round(3)
547
+ construction_info[:thermal_conductance_m2_w_per_k] = BTAP::Resources::Envelope::Constructions.get_conductance(construction).round(3)
548
+ construction_info[:solar_transmittance] = BTAP::Resources::Envelope::Constructions.get_shgc(model, construction).round(3)
549
+ construction_info[:visible_tranmittance] = BTAP::Resources::Envelope::Constructions.get_tvis(model, construction).round(3)
560
550
  end
561
551
 
562
- #Exterior
552
+ # Exterior
563
553
  qaqc[:envelope][:constructions][:exterior_opaque] = []
564
554
  constructions = []
565
- outdoor_surfaces.each {|surface| constructions << surface.construction.get}
555
+ outdoor_surfaces.each { |surface| constructions << surface.construction.get }
566
556
  ext_const_base = Hash.new(0)
567
- constructions.each {|name| ext_const_base[name] += 1}
568
- #iterate thought each construction and get store data
557
+ constructions.each { |name| ext_const_base[name] += 1 }
558
+ # iterate thought each construction and get store data
569
559
  ext_const_base.sort.each do |construction, count|
570
560
  construction_info = {}
571
561
  qaqc[:envelope][:constructions][:exterior_opaque] << construction_info
@@ -576,13 +566,13 @@ class NECB2011
576
566
  construction_info[:solar_absorptance] = construction.to_Construction.get.layers[0].exteriorVisibleAbsorptance.get
577
567
  end
578
568
 
579
- #Ground
569
+ # Ground
580
570
  qaqc[:envelope][:constructions][:ground] = []
581
571
  constructions = []
582
- ground_surfaces.each {|surface| constructions << surface.construction.get}
572
+ ground_surfaces.each { |surface| constructions << surface.construction.get }
583
573
  ext_const_base = Hash.new(0)
584
- constructions.each {|name| ext_const_base[name] += 1}
585
- #iterate thought each construction and get store data
574
+ constructions.each { |name| ext_const_base[name] += 1 }
575
+ # iterate thought each construction and get store data
586
576
  ext_const_base.sort.each do |construction, count|
587
577
  construction_info = {}
588
578
  qaqc[:envelope][:constructions][:ground] << construction_info
@@ -593,62 +583,61 @@ class NECB2011
593
583
  construction_info[:solar_absorptance] = construction.to_Construction.get.layers[0].exteriorVisibleAbsorptance.get
594
584
  end
595
585
 
596
-
597
586
  qaqc[:envelope][:average_thermal_conductance_m2_w_per_k] =
598
-
599
-
600
- # Store Space data.
601
- qaqc[:spaces] =[]
587
+ # Store Space data.
588
+ qaqc[:spaces] = []
602
589
  model.getSpaces.sort.each do |space|
603
590
  spaceinfo = {}
604
591
  qaqc[:spaces] << spaceinfo
605
- spaceinfo[:name] = space.name.get #name should be defined test
592
+ spaceinfo[:name] = space.name.get # name should be defined test
606
593
  spaceinfo[:multiplier] = space.multiplier
607
594
  spaceinfo[:volume] = space.volume # should be greater than zero
608
595
  spaceinfo[:exterior_wall_area] = space.exteriorWallArea # just for information.
609
- spaceinfo[:space_type_name] = space.spaceType.get.name.get unless space.spaceType.empty? #should have a space types name defined.
596
+ spaceinfo[:space_type_name] = space.spaceType.get.name.get unless space.spaceType.empty? # should have a space types name defined.
610
597
  spaceinfo[:thermal_zone] = space.thermalZone.get.name.get unless space.thermalZone.empty? # should be assigned a thermalzone name.
611
- #puts space.name.get
612
- #puts space.thermalZone.empty?
613
- spaceinfo[:breathing_zone_outdoor_airflow_vbz] =-1
614
- breathing_zone_outdoor_airflow_vbz= model.sqlFile().get().execAndReturnFirstDouble("SELECT Value FROM TabularDataWithStrings WHERE ReportName='Standard62.1Summary' AND ReportForString='Entire Facility' AND TableName='Zone Ventilation Parameters' AND ColumnName='Breathing Zone Outdoor Airflow - Vbz' AND Units='m3/s' AND RowName='#{spaceinfo[:thermal_zone].to_s.upcase}' ")
615
- spaceinfo[:breathing_zone_outdoor_airflow_vbz] =breathing_zone_outdoor_airflow_vbz.get unless breathing_zone_outdoor_airflow_vbz.empty?
598
+ # puts space.name.get
599
+ # puts space.thermalZone.empty?
600
+ spaceinfo[:breathing_zone_outdoor_airflow_vbz] = -1
601
+ breathing_zone_outdoor_airflow_vbz = model.sqlFile.get.execAndReturnFirstDouble("SELECT Value FROM TabularDataWithStrings WHERE ReportName='Standard62.1Summary' AND ReportForString='Entire Facility' AND TableName='Zone Ventilation Parameters' AND ColumnName='Breathing Zone Outdoor Airflow - Vbz' AND Units='m3/s' AND RowName='#{spaceinfo[:thermal_zone].to_s.upcase}' ")
602
+ spaceinfo[:breathing_zone_outdoor_airflow_vbz] = breathing_zone_outdoor_airflow_vbz.get unless breathing_zone_outdoor_airflow_vbz.empty?
616
603
  spaceinfo[:infiltration_method] = 'N/A'
617
- spaceinfo[:infiltration_flow_per_m2] =-1.0
618
- unless space.spaceInfiltrationDesignFlowRates[0].nil?
619
- spaceinfo[:infiltration_method] = space.spaceInfiltrationDesignFlowRates[0].designFlowRateCalculationMethod
620
- spaceinfo[:infiltration_flow_per_m2] = "N/A"
621
- spaceinfo[:infiltration_flow_per_m2] = space.spaceInfiltrationDesignFlowRates[0].flowperExteriorSurfaceArea.get.round(5) unless space.spaceInfiltrationDesignFlowRates[0].flowperExteriorSurfaceArea.empty?
622
- else
604
+ spaceinfo[:infiltration_flow_per_m2] = -1.0
605
+ if space.spaceInfiltrationDesignFlowRates[0].nil?
623
606
  error_warning << "space.spaceInfiltrationDesignFlowRates[0] is empty for #{spaceinfo[:name]}"
624
607
  error_warning << "space.spaceInfiltrationDesignFlowRates[0].designFlowRateCalculationMethod is empty for #{spaceinfo[:name]}"
625
608
  error_warning << "space.spaceInfiltrationDesignFlowRates[0].flowperExteriorSurfaceArea is empty for #{spaceinfo[:name]}"
609
+ else
610
+ spaceinfo[:infiltration_method] = space.spaceInfiltrationDesignFlowRates[0].designFlowRateCalculationMethod
611
+ spaceinfo[:infiltration_flow_per_m2] = 'N/A'
612
+ spaceinfo[:infiltration_flow_per_m2] = space.spaceInfiltrationDesignFlowRates[0].flowperExteriorSurfaceArea.get.round(5) unless space.spaceInfiltrationDesignFlowRates[0].flowperExteriorSurfaceArea.empty?
626
613
  end
627
614
 
628
- #the following should have values unless the spacetype is "undefined" other they should be set to the correct NECB values.
629
- unless space.spaceType.empty?
615
+ # the following should have values unless the spacetype is "undefined" other they should be set to the correct NECB values.
616
+ if space.spaceType.empty?
617
+ error_warning << "space.spaceType is empty for #{space.name.get}"
618
+ else
630
619
  spaceinfo[:occupancy_schedule] = nil
631
- unless (space.spaceType.get.defaultScheduleSet.empty?)
632
- unless space.spaceType.get.defaultScheduleSet.get.numberofPeopleSchedule.empty?
633
- spaceinfo[:occupancy_schedule] = space.spaceType.get.defaultScheduleSet.get.numberofPeopleSchedule.get.name.get #should not empty.
620
+ if space.spaceType.get.defaultScheduleSet.empty?
621
+ error_warning << "space.spaceType.get.defaultScheduleSet is empty for #{space.name.get}"
622
+ else
623
+ if space.spaceType.get.defaultScheduleSet.get.numberofPeopleSchedule.empty?
624
+ error_warning << "space.spaceType.get.defaultScheduleSet.get.numberofPeopleSchedule is empty for #{space.name.get}"
634
625
  else
635
- error_warning << "space.spaceType.get.defaultScheduleSet.get.numberofPeopleSchedule is empty for #{space.name.get }"
626
+ spaceinfo[:occupancy_schedule] = space.spaceType.get.defaultScheduleSet.get.numberofPeopleSchedule.get.name.get # should not empty.
636
627
  end
637
- else
638
- error_warning << "space.spaceType.get.defaultScheduleSet is empty for #{space.name.get }"
639
628
  end
640
629
 
641
- spaceinfo[:occ_per_m2] = space.spaceType.get.people[0].peopleDefinition.peopleperSpaceFloorArea.get.round(3) unless space.spaceType.get.people[0].nil?
642
- unless space.spaceType.get.lights[0].nil?
643
- spaceinfo[:lighting_w_per_m2] = space.spaceType.get.lights[0].lightsDefinition.wattsperSpaceFloorArea #.get.round(3) unless space.spaceType.get.lights[0].nil?
630
+ spaceinfo[:occ_per_m2] = space.spaceType.get.people[0].peopleDefinition.peopleperSpaceFloorArea.get.round(3) unless space.spaceType.get.people[0].nil? || space.spaceType.get.people[0].peopleDefinition.peopleperSpaceFloorArea.empty?
631
+ if space.spaceType.get.lights[0].nil?
632
+ error_warning << "space.spaceType.get.lights[0] is nil for Space:[#{space.name.get}] Space Type:[#{spaceinfo[:space_type_name]}]"
633
+ else
634
+ spaceinfo[:lighting_w_per_m2] = space.spaceType.get.lights[0].lightsDefinition.wattsperSpaceFloorArea # .get.round(3) unless space.spaceType.get.lights[0].nil?
644
635
  spaceinfo[:lighting_w_per_m2] = validate_optional(spaceinfo[:lighting_w_per_m2], model, -1.0)
645
636
  unless spaceinfo[:lighting_w_per_m2].nil?
646
637
  spaceinfo[:lighting_w_per_m2] = spaceinfo[:lighting_w_per_m2].round(3)
647
638
  end
648
- else
649
- error_warning << "space.spaceType.get.lights[0] is nil for Space:[#{space.name.get}] Space Type:[#{spaceinfo[:space_type_name]}]"
650
639
  end
651
- #spaceinfo[:electric_w_per_m2] = space.spaceType.get.electricEquipment[0].electricEquipmentDefinition.wattsperSpaceFloorArea.get.round(3) unless space.spaceType.get.electricEquipment[0].nil?
640
+ # spaceinfo[:electric_w_per_m2] = space.spaceType.get.electricEquipment[0].electricEquipmentDefinition.wattsperSpaceFloorArea.get.round(3) unless space.spaceType.get.electricEquipment[0].nil?
652
641
 
653
642
  unless space.spaceType.get.electricEquipment[0].nil?
654
643
  unless space.spaceType.get.electricEquipment[0].electricEquipmentDefinition.wattsperSpaceFloorArea.empty?
@@ -658,19 +647,16 @@ class NECB2011
658
647
  spaceinfo[:shw_m3_per_s] = space.waterUseEquipment[0].waterUseEquipmentDefinition.peakFlowRate.round(3) unless space.waterUseEquipment[0].nil?
659
648
  spaceinfo[:waterUseEquipment] = []
660
649
  if !space.waterUseEquipment.empty?
661
- waterUseEquipment_info={}
650
+ waterUseEquipment_info = {}
662
651
  spaceinfo[:waterUseEquipment] << waterUseEquipment_info
663
- waterUseEquipment_info[:peak_flow_rate]= space.waterUseEquipment[0].waterUseEquipmentDefinition.peakFlowRate
652
+ waterUseEquipment_info[:peak_flow_rate] = space.waterUseEquipment[0].waterUseEquipmentDefinition.peakFlowRate
664
653
  waterUseEquipment_info[:peak_flow_rate_per_area] = waterUseEquipment_info[:peak_flow_rate] / space.floorArea
665
- area_per_occ = space.spaceType.get.people[0].spaceFloorAreaPerPerson
666
- area_per_occ = validate_optional(area_per_occ, model, -1.0)
654
+ area_per_occ = space.spaceType.get.people[0].nil? ? 0.0 : validate_optional(space.spaceType.get.people[0].spaceFloorAreaPerPerson, model, -1.0)
667
655
  # Watt per person = m3/s/m3 * 1000W/kW * (specific heat * dT) * m2/person
668
656
  waterUseEquipment_info[:shw_watts_per_person] = waterUseEquipment_info[:peak_flow_rate_per_area] * 1000 * (4.19 * 44.4) * 1000 * area_per_occ
669
- #puts waterUseEquipment_info[:shw_watts_per_ponce the erson]
670
- #puts "\n\n\n"
657
+ # puts waterUseEquipment_info[:shw_watts_per_ponce the erson]
658
+ # puts "\n\n\n"
671
659
  end
672
- else
673
- error_warning << "space.spaceType is empty for #{space.name.get }"
674
660
  end
675
661
  end
676
662
 
@@ -682,33 +668,33 @@ class NECB2011
682
668
  zoneinfo[:name] = zone.name.get
683
669
  zoneinfo[:floor_area] = zone.floorArea
684
670
  zoneinfo[:multiplier] = zone.multiplier
685
- zoneinfo[:is_conditioned] = "N/A"
686
- unless zone.isConditioned.empty?
687
- zoneinfo[:is_conditioned] = zone.isConditioned.get
688
- else
671
+ zoneinfo[:is_conditioned] = 'N/A'
672
+ if zone.isConditioned.empty?
689
673
  error_warning << "zone.isConditioned is empty for #{zone.name.get}"
674
+ else
675
+ zoneinfo[:is_conditioned] = zone.isConditioned.get
690
676
  end
691
677
 
692
678
  zoneinfo[:is_ideal_air_loads] = zone.useIdealAirLoads
693
679
  zoneinfo[:heating_sizing_factor] = -1.0
694
- unless zone.sizingZone.zoneHeatingSizingFactor.empty?
695
- zoneinfo[:heating_sizing_factor] = zone.sizingZone.zoneHeatingSizingFactor.get
696
- else
680
+ if zone.sizingZone.zoneHeatingSizingFactor.empty?
697
681
  error_warning << "zone.sizingZone.zoneHeatingSizingFactor is empty for #{zone.name.get}"
682
+ else
683
+ zoneinfo[:heating_sizing_factor] = zone.sizingZone.zoneHeatingSizingFactor.get
698
684
  end
699
685
 
700
- zoneinfo[:cooling_sizing_factor] = -1.0 #zone.sizingZone.zoneCoolingSizingFactor.get
701
- unless zone.sizingZone.zoneCoolingSizingFactor.empty?
702
- zoneinfo[:cooling_sizing_factor] = zone.sizingZone.zoneCoolingSizingFactor.get
703
- else
686
+ zoneinfo[:cooling_sizing_factor] = -1.0 # zone.sizingZone.zoneCoolingSizingFactor.get
687
+ if zone.sizingZone.zoneCoolingSizingFactor.empty?
704
688
  error_warning << "zone.sizingZone.zoneCoolingSizingFactor is empty for #{zone.name.get}"
689
+ else
690
+ zoneinfo[:cooling_sizing_factor] = zone.sizingZone.zoneCoolingSizingFactor.get
705
691
  end
706
692
 
707
693
  zoneinfo[:zone_heating_design_supply_air_temperature] = zone.sizingZone.zoneHeatingDesignSupplyAirTemperature
708
694
  zoneinfo[:zone_cooling_design_supply_air_temperature] = zone.sizingZone.zoneCoolingDesignSupplyAirTemperature
709
695
  zoneinfo[:spaces] = []
710
696
  zone.spaces.sort.each do |space|
711
- spaceinfo ={}
697
+ spaceinfo = {}
712
698
  zoneinfo[:spaces] << spaceinfo
713
699
  spaceinfo[:name] = space.name.get
714
700
  spaceinfo[:type] = space.spaceType.get.name.get unless space.spaceType.empty?
@@ -724,7 +710,8 @@ class NECB2011
724
710
  item[:type] = 'StraightComponent'
725
711
  end
726
712
  end
727
- end #zone
713
+ # zone
714
+ end
728
715
  # Store Air Loop Information
729
716
  qaqc[:air_loops] = []
730
717
  model.getAirLoopHVACs.sort.each do |air_loop|
@@ -735,19 +722,19 @@ class NECB2011
735
722
  air_loop_info[:total_breathing_zone_outdoor_airflow_vbz] = 0.0
736
723
  air_loop.thermalZones.sort.each do |zone|
737
724
  air_loop_info[:thermal_zones] << zone.name.get
738
- vbz = model.sqlFile().get().execAndReturnFirstDouble("SELECT Value FROM TabularDataWithStrings WHERE ReportName='Standard62.1Summary' AND ReportForString='Entire Facility' AND TableName='Zone Ventilation Parameters' AND ColumnName='Breathing Zone Outdoor Airflow - Vbz' AND Units='m3/s' AND RowName='#{zone.name.get.to_s.upcase}' ")
725
+ vbz = model.sqlFile.get.execAndReturnFirstDouble("SELECT Value FROM TabularDataWithStrings WHERE ReportName='Standard62.1Summary' AND ReportForString='Entire Facility' AND TableName='Zone Ventilation Parameters' AND ColumnName='Breathing Zone Outdoor Airflow - Vbz' AND Units='m3/s' AND RowName='#{zone.name.get.to_s.upcase}' ")
739
726
  vbz = validate_optional(vbz, model, 0)
740
727
  air_loop_info[:total_breathing_zone_outdoor_airflow_vbz] += vbz
741
- air_loop_info[:total_floor_area_served] += zone.floorArea*zone.multiplier.to_f
728
+ air_loop_info[:total_floor_area_served] += zone.floorArea * zone.multiplier.to_f
742
729
  end
743
- air_loop_info[:area_outdoor_air_rate_m3_per_s_m2] = model.sqlFile().get().execAndReturnFirstDouble("SELECT Value FROM TabularDataWithStrings WHERE ReportName='Standard62.1Summary' AND ReportForString='Entire Facility' AND TableName='System Ventilation Parameters' AND ColumnName='Area Outdoor Air Rate - Ra' AND Units='m3/s-m2' AND RowName='#{air_loop_info[:name].to_s.upcase}' ")
730
+ air_loop_info[:area_outdoor_air_rate_m3_per_s_m2] = model.sqlFile.get.execAndReturnFirstDouble("SELECT Value FROM TabularDataWithStrings WHERE ReportName='Standard62.1Summary' AND ReportForString='Entire Facility' AND TableName='System Ventilation Parameters' AND ColumnName='Area Outdoor Air Rate - Ra' AND Units='m3/s-m2' AND RowName='#{air_loop_info[:name].to_s.upcase}' ")
744
731
  air_loop_info[:area_outdoor_air_rate_m3_per_s_m2] = validate_optional(air_loop_info[:area_outdoor_air_rate_m3_per_s_m2], model, -1.0)
745
732
 
746
733
  air_loop_info[:outdoor_air_L_per_s] = -1.0
747
- unless air_loop_info[:area_outdoor_air_rate_m3_per_s_m2] ==-1.0
748
- air_loop_info[:outdoor_air_L_per_s] = air_loop_info[:area_outdoor_air_rate_m3_per_s_m2]*air_loop_info[:total_floor_area_served]*1000
734
+ unless air_loop_info[:area_outdoor_air_rate_m3_per_s_m2] == -1.0
735
+ air_loop_info[:outdoor_air_L_per_s] = air_loop_info[:area_outdoor_air_rate_m3_per_s_m2] * air_loop_info[:total_floor_area_served] * 1000
749
736
  end
750
- #Fan
737
+ # Fan
751
738
 
752
739
  unless air_loop.supplyFan.empty?
753
740
  air_loop_info[:supply_fan] = {}
@@ -759,87 +746,89 @@ class NECB2011
759
746
  fan = air_loop.supplyFan.get.to_FanVariableVolume.get
760
747
  end
761
748
  air_loop_info[:supply_fan][:name] = fan.name.get
762
- #puts "\n\n\n\n#{fan.name.get}\n\n\n\n"
749
+ # puts "\n\n\n\n#{fan.name.get}\n\n\n\n"
763
750
  air_loop_info[:supply_fan][:fan_efficiency] = fan.fanEfficiency
764
751
  air_loop_info[:supply_fan][:motor_efficiency] = fan.motorEfficiency
765
752
  air_loop_info[:supply_fan][:pressure_rise] = fan.pressureRise
766
753
  air_loop_info[:supply_fan][:max_air_flow_rate_m3_per_s] = -1.0
767
754
 
768
- max_air_flow_info = model.sqlFile().get().execAndReturnVectorOfString("SELECT RowName FROM TabularDataWithStrings WHERE ReportName='EquipmentSummary' AND ReportForString='Entire Facility' AND TableName='Fans' AND ColumnName='Max Air Flow Rate' AND Units='m3/s' ")
769
- max_air_flow_info = validate_optional(max_air_flow_info, model, "N/A")
770
- unless max_air_flow_info == "N/A"
771
- if max_air_flow_info.include? "#{air_loop_info[:supply_fan][:name].to_s.upcase}"
772
- air_loop_info[:supply_fan][:max_air_flow_rate_m3_per_s] = model.sqlFile().get().execAndReturnFirstDouble("SELECT Value FROM TabularDataWithStrings WHERE ReportName='EquipmentSummary' AND ReportForString='Entire Facility' AND TableName='Fans' AND ColumnName='Max Air Flow Rate' AND Units='m3/s' AND RowName='#{air_loop_info[:supply_fan][:name].upcase}' ").get
773
- air_loop_info[:supply_fan][:rated_electric_power_w] = model.sqlFile().get().execAndReturnFirstDouble("SELECT Value FROM TabularDataWithStrings WHERE ReportName='EquipmentSummary' AND ReportForString='Entire Facility' AND TableName='Fans' AND ColumnName='Rated Electric Power' AND Units='W' AND RowName='#{air_loop_info[:supply_fan][:name].upcase}' ").get
774
- else
755
+ max_air_flow_info = model.sqlFile.get.execAndReturnVectorOfString("SELECT RowName FROM TabularDataWithStrings WHERE ReportName='EquipmentSummary' AND ReportForString='Entire Facility' AND TableName='Fans' AND ColumnName='Max Air Flow Rate' AND Units='m3/s' ")
756
+ max_air_flow_info = validate_optional(max_air_flow_info, model, 'N/A')
757
+ if max_air_flow_info == 'N/A'
758
+ error_warning << "max_air_flow_info is nil because the following sql statement returned nil: RowName FROM TabularDataWithStrings WHERE ReportName='EquipmentSummary' AND ReportForString='Entire Facility' AND TableName='Fans' AND ColumnName='Max Air Flow Rate' AND Units='m3/s' "
759
+ else
760
+ if max_air_flow_info.include? air_loop_info[:supply_fan][:name].to_s.upcase.to_s
761
+ air_loop_info[:supply_fan][:max_air_flow_rate_m3_per_s] = model.sqlFile.get.execAndReturnFirstDouble("SELECT Value FROM TabularDataWithStrings WHERE ReportName='EquipmentSummary' AND ReportForString='Entire Facility' AND TableName='Fans' AND ColumnName='Max Air Flow Rate' AND Units='m3/s' AND RowName='#{air_loop_info[:supply_fan][:name].upcase}' ").get
762
+ air_loop_info[:supply_fan][:rated_electric_power_w] = model.sqlFile.get.execAndReturnFirstDouble("SELECT Value FROM TabularDataWithStrings WHERE ReportName='EquipmentSummary' AND ReportForString='Entire Facility' AND TableName='Fans' AND ColumnName='Rated Electric Power' AND Units='W' AND RowName='#{air_loop_info[:supply_fan][:name].upcase}' ")
763
+ # Version 3.2.0 has renamed rated electric_power to rated electricity rate
764
+ if air_loop_info[:supply_fan][:rated_electric_power_w].empty?
765
+ air_loop_info[:supply_fan][:rated_electric_power_w] = model.sqlFile.get.execAndReturnFirstDouble("SELECT Value FROM TabularDataWithStrings WHERE ReportName='EquipmentSummary' AND ReportForString='Entire Facility' AND TableName='Fans' AND ColumnName='Rated Electricity Rate' AND Units='W' AND RowName='#{air_loop_info[:supply_fan][:name].upcase}' ")
766
+ end
767
+ air_loop_info[:supply_fan][:rated_electric_power_w] = air_loop_info[:supply_fan][:rated_electric_power_w].get
768
+ else
775
769
  error_warning << "#{air_loop_info[:supply_fan][:name]} does not exist in sql file WHERE ReportName='EquipmentSummary' AND ReportForString='Entire Facility' AND TableName='Fans' AND ColumnName='Max Air Flow Rate' AND Units='m3/s'"
776
770
  end
777
- else
778
- error_warning << "max_air_flow_info is nil because the following sql statement returned nil: RowName FROM TabularDataWithStrings WHERE ReportName='EquipmentSummary' AND ReportForString='Entire Facility' AND TableName='Fans' AND ColumnName='Max Air Flow Rate' AND Units='m3/s' "
779
771
  end
780
772
  end
781
773
 
782
- #economizer
774
+ # economizer
783
775
  air_loop_info[:economizer] = {}
784
- air_loop_info[:economizer][:name] = air_loop.airLoopHVACOutdoorAirSystem.get.getControllerOutdoorAir.name.get
785
- air_loop_info[:economizer][:control_type] = air_loop.airLoopHVACOutdoorAirSystem.get.getControllerOutdoorAir.getEconomizerControlType
786
-
787
- #DX cooling coils
788
- air_loop_info[:cooling_coils] ={}
789
- air_loop_info[:cooling_coils][:dx_single_speed]=[]
790
- air_loop_info[:cooling_coils][:dx_two_speed]=[]
791
- air_loop_info[:cooling_coils][:coil_cooling_water]=[]
792
-
793
- #Heating Coil
776
+ air_loop_info[:economizer][:name] = air_loop.airLoopHVACOutdoorAirSystem.get.getControllerOutdoorAir.name.get unless air_loop.airLoopHVACOutdoorAirSystem.empty? or air_loop.airLoopHVACOutdoorAirSystem.get.getControllerOutdoorAir.name.empty?
777
+ air_loop_info[:economizer][:control_type] = air_loop.airLoopHVACOutdoorAirSystem.get.getControllerOutdoorAir.getEconomizerControlType unless air_loop.airLoopHVACOutdoorAirSystem.empty?
778
+ # DX cooling coils
779
+ air_loop_info[:cooling_coils] = {}
780
+ air_loop_info[:cooling_coils][:dx_single_speed] = []
781
+ air_loop_info[:cooling_coils][:dx_two_speed] = []
782
+ air_loop_info[:cooling_coils][:coil_cooling_water] = []
783
+
784
+ # Heating Coil
794
785
  air_loop_info[:heating_coils] = {}
795
786
  air_loop_info[:heating_coils][:coil_heating_gas] = []
796
- air_loop_info[:heating_coils][:coil_heating_electric]= []
797
- air_loop_info[:heating_coils][:coil_heating_water]= []
787
+ air_loop_info[:heating_coils][:coil_heating_electric] = []
788
+ air_loop_info[:heating_coils][:coil_heating_water] = []
798
789
 
799
- #Heat Excahnger
790
+ # Heat Excahnger
800
791
  air_loop_info[:heat_exchanger] = {}
801
792
 
802
793
  air_loop.supplyComponents.each do |supply_comp|
803
794
  if supply_comp.to_CoilHeatingGas.is_initialized
804
- coil={}
795
+ coil = {}
805
796
  air_loop_info[:heating_coils][:coil_heating_gas] << coil
806
797
  gas = supply_comp.to_CoilHeatingGas.get
807
- coil[:name]=gas.name.get
808
- coil[:type]="Gas"
798
+ coil[:name] = gas.name.get
799
+ coil[:type] = 'Gas'
809
800
  coil[:efficency] = gas.gasBurnerEfficiency
810
- #coil[:nominal_capacity]= gas.nominalCapacity()
811
- coil[:nominal_capacity]= model.sqlFile().get().execAndReturnFirstDouble("SELECT Value FROM TabularDataWithStrings WHERE ReportName='EquipmentSummary' AND ReportForString='Entire Facility' AND TableName='Heating Coils' AND ColumnName='Nominal Total Capacity' AND RowName='#{coil[:name].to_s.upcase}'")
812
- coil[:nominal_capacity]=validate_optional(coil[:nominal_capacity], model, -1.0)
801
+ # coil[:nominal_capacity]= gas.nominalCapacity()
802
+ coil[:nominal_capacity] = model.sqlFile.get.execAndReturnFirstDouble("SELECT Value FROM TabularDataWithStrings WHERE ReportName='EquipmentSummary' AND ReportForString='Entire Facility' AND TableName='Heating Coils' AND ColumnName='Nominal Total Capacity' AND RowName='#{coil[:name].to_s.upcase}'")
803
+ coil[:nominal_capacity] = validate_optional(coil[:nominal_capacity], model, -1.0)
813
804
  end
814
805
  if supply_comp.to_CoilHeatingElectric.is_initialized
815
- coil={}
806
+ coil = {}
816
807
  air_loop_info[:heating_coils][:coil_heating_electric] << coil
817
808
  electric = supply_comp.to_CoilHeatingElectric.get
818
- coil[:name]= electric.name.get
819
- coil[:type]= "Electric"
820
- coil[:nominal_capacity]= model.sqlFile().get().execAndReturnFirstDouble("SELECT Value FROM TabularDataWithStrings WHERE ReportName='EquipmentSummary' AND ReportForString='Entire Facility' AND TableName='Heating Coils' AND ColumnName='Nominal Total Capacity' AND RowName='#{coil[:name].to_s.upcase}'")
821
- coil[:nominal_capacity]=validate_optional(coil[:nominal_capacity], model, -1.0)
809
+ coil[:name] = electric.name.get
810
+ coil[:type] = 'Electric'
811
+ coil[:nominal_capacity] = model.sqlFile.get.execAndReturnFirstDouble("SELECT Value FROM TabularDataWithStrings WHERE ReportName='EquipmentSummary' AND ReportForString='Entire Facility' AND TableName='Heating Coils' AND ColumnName='Nominal Total Capacity' AND RowName='#{coil[:name].to_s.upcase}'")
812
+ coil[:nominal_capacity] = validate_optional(coil[:nominal_capacity], model, -1.0)
822
813
  end
823
814
  if supply_comp.to_CoilHeatingWater.is_initialized
824
- coil={}
815
+ coil = {}
825
816
  air_loop_info[:heating_coils][:coil_heating_water] << coil
826
817
  water = supply_comp.to_CoilHeatingWater.get
827
- coil[:name]= water.name.get
828
- coil[:type]= "Water"
829
- coil[:nominal_capacity]= model.sqlFile().get().execAndReturnFirstDouble("SELECT Value FROM TabularDataWithStrings WHERE ReportName='EquipmentSummary' AND ReportForString='Entire Facility' AND TableName='Heating Coils' AND ColumnName='Nominal Total Capacity' AND RowName='#{coil[:name].to_s.upcase}'")
830
- coil[:nominal_capacity]=validate_optional(coil[:nominal_capacity], model, -1.0)
818
+ coil[:name] = water.name.get
819
+ coil[:type] = 'Water'
820
+ coil[:nominal_capacity] = model.sqlFile.get.execAndReturnFirstDouble("SELECT Value FROM TabularDataWithStrings WHERE ReportName='EquipmentSummary' AND ReportForString='Entire Facility' AND TableName='Heating Coils' AND ColumnName='Nominal Total Capacity' AND RowName='#{coil[:name].to_s.upcase}'")
821
+ coil[:nominal_capacity] = validate_optional(coil[:nominal_capacity], model, -1.0)
831
822
  end
832
823
  if supply_comp.to_HeatExchangerAirToAirSensibleAndLatent.is_initialized
833
824
  heatExchanger = supply_comp.to_HeatExchangerAirToAirSensibleAndLatent.get
834
825
  air_loop_info[:heat_exchanger][:name] = heatExchanger.name.get
835
826
  end
836
827
  end
828
+ # I dont think i need to get the type of heating coil from the sql file, because the coils are differentiated by class, and I have hard coded the information
829
+ # model.sqlFile().get().execAndReturnFirstDouble("SELECT Value FROM TabularDataWithStrings WHERE ReportName='EquipmentSummary' AND ReportForString='Entire Facility' AND TableName= 'Heating Coils' AND ColumnName='Type' ").get #padmussen to complete #AND RowName='#{air_loop_info[:heating_coils][:name].upcase}'
837
830
 
838
- #I dont think i need to get the type of heating coil from the sql file, because the coils are differentiated by class, and I have hard coded the information
839
- #model.sqlFile().get().execAndReturnFirstDouble("SELECT Value FROM TabularDataWithStrings WHERE ReportName='EquipmentSummary' AND ReportForString='Entire Facility' AND TableName= 'Heating Coils' AND ColumnName='Type' ").get #padmussen to complete #AND RowName='#{air_loop_info[:heating_coils][:name].upcase}'
840
-
841
-
842
- #Collect all the fans into the the array.
831
+ # Collect all the fans into the the array.
843
832
  air_loop.supplyComponents.each do |supply_comp|
844
833
  if supply_comp.to_CoilCoolingDXSingleSpeed.is_initialized
845
834
  coil = {}
@@ -874,7 +863,6 @@ class NECB2011
874
863
  qaqc[:air_loops] << air_loop_info
875
864
  end
876
865
 
877
-
878
866
  qaqc[:plant_loops] = []
879
867
  model.getPlantLoops.sort.each do |plant_loop|
880
868
  plant_loop_info = {}
@@ -885,42 +873,41 @@ class NECB2011
885
873
  plant_loop_info[:design_loop_exit_temperature] = sizing.designLoopExitTemperature
886
874
  plant_loop_info[:loop_design_temperature_difference] = sizing.loopDesignTemperatureDifference
887
875
 
888
- #Create Container for plant equipment arrays.
876
+ # Create Container for plant equipment arrays.
889
877
  plant_loop_info[:pumps] = []
890
878
  plant_loop_info[:boilers] = []
891
879
  plant_loop_info[:chiller_electric_eir] = []
892
880
  plant_loop_info[:cooling_tower_single_speed] = []
893
- plant_loop_info[:water_heater_mixed] =[]
881
+ plant_loop_info[:water_heater_mixed] = []
894
882
  plant_loop.supplyComponents.each do |supply_comp|
895
-
896
- #Collect Constant Speed
883
+ # Collect Constant Speed
897
884
  if supply_comp.to_PumpConstantSpeed.is_initialized
898
885
  pump = supply_comp.to_PumpConstantSpeed.get
899
886
  pump_info = {}
900
887
  plant_loop_info[:pumps] << pump_info
901
888
  pump_info[:name] = pump.name.get
902
- pump_info[:type] = "Pump:ConstantSpeed"
903
- pump_info[:head_pa] = model.sqlFile().get().execAndReturnFirstDouble("SELECT Value FROM TabularDataWithStrings WHERE ReportName='EquipmentSummary' AND ReportForString='Entire Facility' AND TableName='Pumps' AND ColumnName='Head' AND RowName='#{pump_info[:name].upcase}' ")
889
+ pump_info[:type] = 'Pump:ConstantSpeed'
890
+ pump_info[:head_pa] = model.sqlFile.get.execAndReturnFirstDouble("SELECT Value FROM TabularDataWithStrings WHERE ReportName='EquipmentSummary' AND ReportForString='Entire Facility' AND TableName='Pumps' AND ColumnName='Head' AND RowName='#{pump_info[:name].upcase}' ")
904
891
  pump_info[:head_pa] = validate_optional(pump_info[:head_pa], model, -1.0)
905
- pump_info[:water_flow_m3_per_s] = model.sqlFile().get().execAndReturnFirstDouble("SELECT Value FROM TabularDataWithStrings WHERE ReportName='EquipmentSummary' AND ReportForString='Entire Facility' AND TableName='Pumps' AND ColumnName='Water Flow' AND RowName='#{pump_info[:name].upcase}' ")
892
+ pump_info[:water_flow_m3_per_s] = model.sqlFile.get.execAndReturnFirstDouble("SELECT Value FROM TabularDataWithStrings WHERE ReportName='EquipmentSummary' AND ReportForString='Entire Facility' AND TableName='Pumps' AND ColumnName='Water Flow' AND RowName='#{pump_info[:name].upcase}' ")
906
893
  pump_info[:water_flow_m3_per_s] = validate_optional(pump_info[:water_flow_m3_per_s], model, -1.0)
907
- pump_info[:electric_power_w] = model.sqlFile().get().execAndReturnFirstDouble("SELECT Value FROM TabularDataWithStrings WHERE ReportName='EquipmentSummary' AND ReportForString='Entire Facility' AND TableName='Pumps' AND ColumnName='Electric Power' AND RowName='#{pump_info[:name].upcase}' ")
894
+ pump_info[:electric_power_w] = model.sqlFile.get.execAndReturnFirstDouble("SELECT Value FROM TabularDataWithStrings WHERE ReportName='EquipmentSummary' AND ReportForString='Entire Facility' AND TableName='Pumps' AND ColumnName='Electric Power' AND RowName='#{pump_info[:name].upcase}' ")
908
895
  pump_info[:electric_power_w] = validate_optional(pump_info[:electric_power_w], model, -1.0)
909
896
  pump_info[:motor_efficency] = pump.motorEfficiency
910
897
  end
911
898
 
912
- #Collect Variable Speed
899
+ # Collect Variable Speed
913
900
  if supply_comp.to_PumpVariableSpeed.is_initialized
914
901
  pump = supply_comp.to_PumpVariableSpeed.get
915
902
  pump_info = {}
916
903
  plant_loop_info[:pumps] << pump_info
917
904
  pump_info[:name] = pump.name.get
918
- pump_info[:type] = "Pump:VariableSpeed"
919
- pump_info[:head_pa] = model.sqlFile().get().execAndReturnFirstDouble("SELECT Value FROM TabularDataWithStrings WHERE ReportName='EquipmentSummary' AND ReportForString='Entire Facility' AND TableName='Pumps' AND ColumnName='Head' AND RowName='#{pump_info[:name].upcase}' ")
905
+ pump_info[:type] = 'Pump:VariableSpeed'
906
+ pump_info[:head_pa] = model.sqlFile.get.execAndReturnFirstDouble("SELECT Value FROM TabularDataWithStrings WHERE ReportName='EquipmentSummary' AND ReportForString='Entire Facility' AND TableName='Pumps' AND ColumnName='Head' AND RowName='#{pump_info[:name].upcase}' ")
920
907
  pump_info[:head_pa] = validate_optional(pump_info[:head_pa], model, -1.0)
921
- pump_info[:water_flow_m3_per_s] = model.sqlFile().get().execAndReturnFirstDouble("SELECT Value FROM TabularDataWithStrings WHERE ReportName='EquipmentSummary' AND ReportForString='Entire Facility' AND TableName='Pumps' AND ColumnName='Water Flow' AND RowName='#{pump_info[:name].upcase}' ")
908
+ pump_info[:water_flow_m3_per_s] = model.sqlFile.get.execAndReturnFirstDouble("SELECT Value FROM TabularDataWithStrings WHERE ReportName='EquipmentSummary' AND ReportForString='Entire Facility' AND TableName='Pumps' AND ColumnName='Water Flow' AND RowName='#{pump_info[:name].upcase}' ")
922
909
  pump_info[:water_flow_m3_per_s] = validate_optional(pump_info[:water_flow_m3_per_s], model, -1.0)
923
- pump_info[:electric_power_w] = model.sqlFile().get().execAndReturnFirstDouble("SELECT Value FROM TabularDataWithStrings WHERE ReportName='EquipmentSummary' AND ReportForString='Entire Facility' AND TableName='Pumps' AND ColumnName='Electric Power' AND RowName='#{pump_info[:name].upcase}' ")
910
+ pump_info[:electric_power_w] = model.sqlFile.get.execAndReturnFirstDouble("SELECT Value FROM TabularDataWithStrings WHERE ReportName='EquipmentSummary' AND ReportForString='Entire Facility' AND TableName='Pumps' AND ColumnName='Electric Power' AND RowName='#{pump_info[:name].upcase}' ")
924
911
  pump_info[:electric_power_w] = validate_optional(pump_info[:electric_power_w], model, -1.0)
925
912
  pump_info[:motor_efficency] = pump.motorEfficiency
926
913
  end
@@ -931,7 +918,7 @@ class NECB2011
931
918
  boiler_info = {}
932
919
  plant_loop_info[:boilers] << boiler_info
933
920
  boiler_info[:name] = boiler.name.get
934
- boiler_info[:type] = "Boiler:HotWater"
921
+ boiler_info[:type] = 'Boiler:HotWater'
935
922
  boiler_info[:fueltype] = boiler.fuelType
936
923
  boiler_info[:nominal_capacity] = boiler.nominalCapacity
937
924
  boiler_info[:nominal_capacity] = validate_optional(boiler_info[:nominal_capacity], model, -1.0)
@@ -943,9 +930,9 @@ class NECB2011
943
930
  chiller_info = {}
944
931
  plant_loop_info[:chiller_electric_eir] << chiller_info
945
932
  chiller_info[:name] = chiller.name.get
946
- chiller_info[:type] = "Chiller:Electric:EIR"
933
+ chiller_info[:type] = 'Chiller:Electric:EIR'
947
934
  chiller_info[:reference_capacity] = validate_optional(chiller.referenceCapacity, model, -1.0)
948
- chiller_info[:reference_leaving_chilled_water_temperature] =chiller.referenceLeavingChilledWaterTemperature
935
+ chiller_info[:reference_leaving_chilled_water_temperature] = chiller.referenceLeavingChilledWaterTemperature
949
936
  end
950
937
 
951
938
  # Collect CoolingTowerSingleSpeed
@@ -954,7 +941,7 @@ class NECB2011
954
941
  coolingTower_info = {}
955
942
  plant_loop_info[:cooling_tower_single_speed] << coolingTower_info
956
943
  coolingTower_info[:name] = coolingTower.name.get
957
- coolingTower_info[:type] = "CoolingTower:SingleSpeed"
944
+ coolingTower_info[:type] = 'CoolingTower:SingleSpeed'
958
945
  coolingTower_info[:fan_power_at_design_air_flow_rate] = validate_optional(coolingTower.fanPoweratDesignAirFlowRate, model, -1.0)
959
946
 
960
947
  end
@@ -965,19 +952,19 @@ class NECB2011
965
952
  waterHeaterMixed_info = {}
966
953
  plant_loop_info[:water_heater_mixed] << waterHeaterMixed_info
967
954
  waterHeaterMixed_info[:name] = waterHeaterMixed.name.get
968
- waterHeaterMixed_info[:type] = "WaterHeater:Mixed"
955
+ waterHeaterMixed_info[:type] = 'WaterHeater:Mixed'
969
956
  waterHeaterMixed_info[:heater_thermal_efficiency] = waterHeaterMixed.heaterThermalEfficiency.get unless waterHeaterMixed.heaterThermalEfficiency.empty?
970
957
  waterHeaterMixed_info[:heater_fuel_type] = waterHeaterMixed.heaterFuelType
971
958
  end
972
959
  end
973
960
 
974
- qaqc[:eplusout_err] ={}
975
- warnings = model.sqlFile().get().execAndReturnVectorOfString("SELECT ErrorMessage FROM Errors WHERE ErrorType='0' ")
976
- warnings = validate_optional(warnings, model, "N/A")
977
- unless warnings == "N/A"
978
- qaqc[:eplusout_err][:warnings] = model.sqlFile().get().execAndReturnVectorOfString("SELECT ErrorMessage FROM Errors WHERE ErrorType='0' ").get
979
- qaqc[:eplusout_err][:fatal] =model.sqlFile().get().execAndReturnVectorOfString("SELECT ErrorMessage FROM Errors WHERE ErrorType='2' ").get
980
- qaqc[:eplusout_err][:severe] =model.sqlFile().get().execAndReturnVectorOfString("SELECT ErrorMessage FROM Errors WHERE ErrorType='1' ").get
961
+ qaqc[:eplusout_err] = {}
962
+ warnings = model.sqlFile.get.execAndReturnVectorOfString("SELECT ErrorMessage FROM Errors WHERE ErrorType='0' ")
963
+ warnings = validate_optional(warnings, model, 'N/A')
964
+ unless warnings == 'N/A'
965
+ qaqc[:eplusout_err][:warnings] = model.sqlFile.get.execAndReturnVectorOfString("SELECT ErrorMessage FROM Errors WHERE ErrorType='0' ").get
966
+ qaqc[:eplusout_err][:fatal] = model.sqlFile.get.execAndReturnVectorOfString("SELECT ErrorMessage FROM Errors WHERE ErrorType='2' ").get
967
+ qaqc[:eplusout_err][:severe] = model.sqlFile.get.execAndReturnVectorOfString("SELECT ErrorMessage FROM Errors WHERE ErrorType='1' ").get
981
968
  end
982
969
 
983
970
  qaqc[:ruby_warnings] = error_warning
@@ -988,18 +975,21 @@ class NECB2011
988
975
  qaqc[:code_metrics]['cooling_gj'] = qaqc[:end_uses]['cooling_gj']
989
976
  qaqc[:code_metrics][:ep_conditioned_floor_area_m2] = qaqc[:building][:conditioned_floor_area_m2]
990
977
  qaqc[:code_metrics][:os_conditioned_floor_area_m2] = qaqc[:envelope][:interior_floors_area_m2] +
991
- qaqc[:envelope][:outdoor_floors_area_m2] +
992
- qaqc[:envelope][:ground_floors_area_m2]
993
- #TEDI
994
- qaqc[:code_metrics][:building_tedi_gj_per_m2] = ( qaqc[:end_uses]['heating_gj'] + qaqc[:end_uses]['cooling_gj']
995
- ) / qaqc[:building][:conditioned_floor_area_m2]
996
- #Mech TEDI?
997
- qaqc[:code_metrics][:building_medi_gj_per_m2] = (qaqc[:end_uses]['fans_gj'] +
998
- qaqc[:end_uses]['pumps_gj'] +
999
- qaqc[:end_uses]['heat_rejection_gj'] +
1000
- qaqc[:end_uses]['humidification_gj'] +
1001
- qaqc[:end_uses]['heat_recovery_gj']
1002
- ) / qaqc[:building][:conditioned_floor_area_m2]
978
+ qaqc[:envelope][:outdoor_floors_area_m2] +
979
+ qaqc[:envelope][:ground_floors_area_m2]
980
+ # TEDI
981
+ unless qaqc[:building][:conditioned_floor_area_m2].nil?
982
+ qaqc[:code_metrics][:building_tedi_gj_per_m2] = (qaqc[:end_uses]['heating_gj'] + qaqc[:end_uses]['cooling_gj']
983
+ ) / qaqc[:building][:conditioned_floor_area_m2]
984
+ # Mech TEDI?
985
+ qaqc[:code_metrics][:building_medi_gj_per_m2] = (qaqc[:end_uses]['fans_gj'] +
986
+ qaqc[:end_uses]['pumps_gj'] +
987
+ qaqc[:end_uses]['heat_rejection_gj'] +
988
+ qaqc[:end_uses]['humidification_gj'] +
989
+ qaqc[:end_uses]['heat_recovery_gj']
990
+ ) / qaqc[:building][:conditioned_floor_area_m2]
991
+ end
992
+
1003
993
 
1004
994
  return qaqc
1005
995
  end
@@ -1009,47 +999,48 @@ class NECB2011
1009
999
  qaqc[:sanity_check] = {}
1010
1000
  qaqc[:sanity_check][:fail] = []
1011
1001
  qaqc[:sanity_check][:pass] = []
1012
- #Padmassun's code for isConditioned start
1002
+ # Padmassun's code for isConditioned start
1013
1003
  qaqc[:thermal_zones].each do |zoneinfo|
1014
1004
  zoneinfo[:spaces].each do |space|
1015
- #skip plenums and undefined spaces/zones
1016
- if zoneinfo[:name].to_s.include? "- undefined -"
1005
+ # skip plenums and undefined spaces/zones
1006
+ if zoneinfo[:name].to_s.include? '- undefined -'
1017
1007
  next
1018
1008
  end
1019
- if zoneinfo[:space_type_name].to_s.include? "Space Function - undefined -"
1020
- if zoneinfo[:is_conditioned].to_s == "No"
1021
- qaqc[:sanity_check][:pass] << "[TEST-PASS][SANITY_CHECK-PASS] for [SPACE][#{space[:name]}] and [THERMAL ZONE] [#{zoneinfo[:name]}] where isConditioned is supposed to be [" "No" "] and found as #{zoneinfo[:is_conditioned]}"
1009
+
1010
+ if zoneinfo[:space_type_name].to_s.include? 'Space Function - undefined -'
1011
+ if zoneinfo[:is_conditioned].to_s == 'No'
1012
+ qaqc[:sanity_check][:pass] << "[TEST-PASS][SANITY_CHECK-PASS] for [SPACE][#{space[:name]}] and [THERMAL ZONE] [#{zoneinfo[:name]}] where isConditioned is supposed to be [" 'No' "] and found as #{zoneinfo[:is_conditioned]}"
1022
1013
  else
1023
- qaqc[:sanity_check][:fail] << "[ERROR][SANITY_CHECK-FAIL] for [SPACE][#{space[:name]}] and [THERMAL ZONE] [#{zoneinfo[:name]}] where isConditioned is supposed to be [" "No" "] but found as #{zoneinfo[:is_conditioned]}"
1014
+ qaqc[:sanity_check][:fail] << "[ERROR][SANITY_CHECK-FAIL] for [SPACE][#{space[:name]}] and [THERMAL ZONE] [#{zoneinfo[:name]}] where isConditioned is supposed to be [" 'No' "] but found as #{zoneinfo[:is_conditioned]}"
1024
1015
  end
1025
1016
  else
1026
- if zoneinfo[:is_conditioned].to_s == "Yes"
1027
- qaqc[:sanity_check][:pass] << "[TEST-PASS][SANITY_CHECK-PASS] for [SPACE][#{space[:name]}] and [THERMAL ZONE] [#{zoneinfo[:name]}] where isConditioned is supposed to be [" "Yes" "] and found as #{zoneinfo[:is_conditioned]}"
1017
+ if zoneinfo[:is_conditioned].to_s == 'Yes'
1018
+ qaqc[:sanity_check][:pass] << "[TEST-PASS][SANITY_CHECK-PASS] for [SPACE][#{space[:name]}] and [THERMAL ZONE] [#{zoneinfo[:name]}] where isConditioned is supposed to be [" 'Yes' "] and found as #{zoneinfo[:is_conditioned]}"
1028
1019
  elsif zoneinfo[:name]
1029
- qaqc[:sanity_check][:fail] << "[ERROR][SANITY_CHECK-FAIL] for [SPACE][#{space[:name]}] and [THERMAL ZONE] [#{zoneinfo[:name]}] where isConditioned is supposed to be [" "Yes" "] but found as #{zoneinfo[:is_conditioned]}"
1020
+ qaqc[:sanity_check][:fail] << "[ERROR][SANITY_CHECK-FAIL] for [SPACE][#{space[:name]}] and [THERMAL ZONE] [#{zoneinfo[:name]}] where isConditioned is supposed to be [" 'Yes' "] but found as #{zoneinfo[:is_conditioned]}"
1030
1021
  end
1031
1022
  end
1032
1023
  end
1033
1024
  end
1034
1025
  qaqc[:sanity_check][:fail] = qaqc[:sanity_check][:fail].sort
1035
1026
  qaqc[:sanity_check][:pass] = qaqc[:sanity_check][:pass].sort
1036
- #Padmassun's code for isConditioned end
1027
+ # Padmassun's code for isConditioned end
1037
1028
  end
1038
1029
 
1039
1030
  # checks the pump power using pressure, and flowrate
1040
1031
  def necb_plantloop_sanity(qaqc)
1041
- necb_section_name = "SANITY-??"
1032
+ necb_section_name = 'SANITY-??'
1042
1033
  qaqc[:plant_loops].each do |plant_loop_info|
1043
1034
  pump_head = plant_loop_info[:pumps][0][:head_pa]
1044
- flow_rate = plant_loop_info[:pumps][0][:water_flow_m3_per_s]*1000
1045
- hp_check = ((flow_rate*60*60)/1000*1000*9.81*pump_head*0.000101997)/3600000
1035
+ flow_rate = plant_loop_info[:pumps][0][:water_flow_m3_per_s] * 1000
1036
+ hp_check = ((flow_rate * 60 * 60) / 1000 * 1000 * 9.81 * pump_head * 0.000101997) / 3600000
1046
1037
  puts "\npump_head #{pump_head}"
1047
1038
  puts "name: #{qaqc[:building][:name]}"
1048
1039
  puts "name: #{plant_loop_info[:name]}"
1049
1040
  puts "flow_rate #{flow_rate}"
1050
1041
  puts "hp_check #{hp_check}\n"
1051
- pump_power_hp = plant_loop_info[:pumps][0][:electric_power_w]/1000*0.746
1052
- percent_diff = (hp_check - pump_power_hp).to_f.abs/hp_check * 100
1042
+ pump_power_hp = plant_loop_info[:pumps][0][:electric_power_w] / 1000 * 0.746
1043
+ percent_diff = (hp_check - pump_power_hp).to_f.abs / hp_check * 100
1053
1044
 
1054
1045
  if percent_diff.nan?
1055
1046
  qaqc[:ruby_warnings] << "(hp_check - pump_power_hp).to_f.abs/hp_check * 100 for #{plant_loop_info[:name]} is NaN"
@@ -1062,12 +1053,12 @@ class NECB2011
1062
1053
  end
1063
1054
 
1064
1055
  necb_section_test(
1065
- qaqc,
1066
- percent_diff,
1067
- '<=',
1068
- 20, #diff of 20%
1069
- necb_section_name,
1070
- "[PLANT LOOP][#{plant_loop_info[:name]}][:pumps][0][:electric_power_hp] [#{pump_power_hp}]; NECB value [#{hp_check}]; Percent Diff"
1056
+ qaqc,
1057
+ percent_diff,
1058
+ '<=',
1059
+ 20, # diff of 20%
1060
+ necb_section_name,
1061
+ "[PLANT LOOP][#{plant_loop_info[:name]}][:pumps][0][:electric_power_hp] [#{pump_power_hp}]; NECB value [#{hp_check}]; Percent Diff"
1071
1062
  )
1072
1063
  end
1073
1064
  end
@@ -1077,50 +1068,51 @@ class NECB2011
1077
1068
 
1078
1069
  def necb_space_compliance(qaqc)
1079
1070
  # #Padmassun's Code Start
1080
- #csv_file_name ="#{File.dirname(__FILE__)}/necb_2011_spacetype_info.csv"
1071
+ # csv_file_name ="#{File.dirname(__FILE__)}/necb_2011_spacetype_info.csv"
1081
1072
  qaqc[:spaces].each do |space|
1082
- building_type =""
1083
- space_type =""
1073
+ building_type = ''
1074
+ space_type = ''
1084
1075
  if space[:space_type_name].include? 'Space Function '
1085
- space_type = (space[:space_type_name].to_s.rpartition('Space Function '))[2].strip
1076
+ space_type = space[:space_type_name].to_s.rpartition('Space Function ')[2].strip
1086
1077
  building_type = 'Space Function'
1087
1078
  elsif space[:space_type_name].include? ' WholeBuilding'
1088
- space_type = (space[:space_type_name].to_s.rpartition(' WholeBuilding'))[0].strip
1079
+ space_type = space[:space_type_name].to_s.rpartition(' WholeBuilding')[0].strip
1089
1080
  building_type = 'WholeBuilding'
1090
1081
  end
1091
1082
 
1092
- ["lighting_per_area_w_per_m2", "occupancy_per_area_people_per_m2", "occupancy_schedule", "electric_equipment_per_area_w_per_m2"].each {|compliance_var|
1093
- qaqc_table = get_qaqc_table(table_name: "space_compliance", search_criteria: {"building_type" => building_type, "space_type" => space_type}).first
1083
+ ['lighting_per_area_w_per_m2', 'occupancy_per_area_people_per_m2', 'occupancy_schedule', 'electric_equipment_per_area_w_per_m2'].each do |compliance_var|
1084
+ qaqc_table = get_qaqc_table(table_name: 'space_compliance', search_criteria: { 'building_type' => building_type, 'space_type' => space_type }).first
1094
1085
  puts "\n#{qaqc_table}\n"
1095
- necb_section_name = get_qaqc_table(table_name: "space_compliance")['refs'][compliance_var]
1096
- tolerance = get_qaqc_table(table_name: "space_compliance")['tolerance'][compliance_var]
1086
+ necb_section_name = get_qaqc_table(table_name: 'space_compliance')['refs'][compliance_var]
1087
+ tolerance = get_qaqc_table(table_name: 'space_compliance')['tolerance'][compliance_var]
1097
1088
  # puts "\ncompliance_var:#{compliance_var}\n\tnecb_section_name:#{necb_section_name}\n\texp Value:#{qaqc_table[compliance_var]}\n"
1098
- if compliance_var =="lighting_per_area_w_per_m2"
1099
- unless space[:lighting_w_per_m2].nil?
1100
- result_value = space[:lighting_w_per_m2] * qaqc_table['lpd_ratio']
1101
- else
1089
+ if compliance_var == 'lighting_per_area_w_per_m2'
1090
+ if space[:lighting_w_per_m2].nil?
1102
1091
  result_value = 0
1092
+ else
1093
+ result_value = space[:lighting_w_per_m2] * qaqc_table['lpd_ratio']
1103
1094
  end
1104
- elsif compliance_var =="occupancy_per_area_people_per_m2"
1095
+ elsif compliance_var == 'occupancy_per_area_people_per_m2'
1105
1096
  result_value = space[:occ_per_m2]
1106
- elsif compliance_var =="occupancy_schedule"
1097
+ elsif compliance_var == 'occupancy_schedule'
1107
1098
  result_value = space[:occupancy_schedule]
1108
- elsif compliance_var =="electric_equipment_per_area_w_per_m2"
1099
+ elsif compliance_var == 'electric_equipment_per_area_w_per_m2'
1109
1100
  result_value = space[:electric_w_per_m2]
1110
1101
  end
1111
1102
 
1112
1103
  test_text = "[SPACE][#{space[:name]}]-[TYPE:][#{space_type}]-#{compliance_var}"
1113
1104
  next if result_value.nil?
1105
+
1114
1106
  necb_section_test(
1115
- qaqc,
1116
- result_value,
1117
- '==',
1118
- qaqc_table[compliance_var],
1119
- necb_section_name,
1120
- test_text,
1121
- tolerance
1107
+ qaqc,
1108
+ result_value,
1109
+ '==',
1110
+ qaqc_table[compliance_var],
1111
+ necb_section_name,
1112
+ test_text,
1113
+ tolerance
1122
1114
  )
1123
- }
1115
+ end
1124
1116
 
1125
1117
  # row = look_up_csv_data(csv_file_name,{2 => space_type, 1 => building_type})
1126
1118
  # if row.nil?
@@ -1129,20 +1121,20 @@ class NECB2011
1129
1121
  # puts "space type of [#{space_type}] and/or building type of [#{building_type}] was not found in the excel sheet for space: [#{space[:name]}]"
1130
1122
  # else
1131
1123
  # #correct the data from the csv file to include a multiplier of 0.9 for specific space types.
1132
-
1124
+
1133
1125
  # reduceLPDSpaces = ["Classroom/lecture/training", "Conf./meet./multi-purpose", "Lounge/recreation",
1134
- # "Washroom-sch-A", "Washroom-sch-B", "Washroom-sch-C", "Washroom-sch-D", "Washroom-sch-E",
1135
- # "Washroom-sch-F", "Washroom-sch-G", "Washroom-sch-H", "Washroom-sch-I", "Dress./fitt. - performance arts",
1126
+ # "Washroom-sch-A", "Washroom-sch-B", "Washroom-sch-C", "Washroom-sch-D", "Washroom-sch-E",
1127
+ # "Washroom-sch-F", "Washroom-sch-G", "Washroom-sch-H", "Washroom-sch-I", "Dress./fitt. - performance arts",
1136
1128
  # "Locker room", "Retail - dressing/fitting","Locker room-sch-A","Locker room-sch-B","Locker room-sch-C",
1137
1129
  # "Locker room-sch-D","Locker room-sch-E","Locker room-sch-F","Locker room-sch-G","Locker room-sch-H",
1138
1130
  # "Locker room-sch-I", "Office - open plan - occsens", "Office - enclosed - occsens", "Storage area - occsens",
1139
1131
  # "Hospital - medical supply - occsens", "Storage area - refrigerated - occsens"]
1140
-
1132
+
1141
1133
  # if reduceLPDSpaces.include?(space_type)
1142
1134
  # row[3] = row[3]*0.9
1143
1135
  # puts "\n============================\nspace_type: #{space_type}\n============================\n"
1144
1136
  # end
1145
-
1137
+
1146
1138
  # # Start of Space Compliance
1147
1139
  # necb_section_name = "NECB2011-Section 8.4.3.6"
1148
1140
  # data = {}
@@ -1164,46 +1156,47 @@ class NECB2011
1164
1156
  # end
1165
1157
  # end#space Compliance
1166
1158
  end
1167
- #Padmassun's Code End
1159
+ # Padmassun's Code End
1168
1160
  end
1169
1161
 
1170
1162
  # checks envelope compliance
1171
1163
  # fenestration_to_door_and_window_percentage, skylight_to_roof_percentage
1172
1164
  def necb_envelope_compliance(qaqc)
1173
1165
  # Envelope
1174
- necb_section_name = "NECB2011-Section 3.2.1.4"
1175
- #store hdd in short form
1166
+ necb_section_name = 'NECB2011-Section 3.2.1.4'
1167
+ # store hdd in short form
1176
1168
  hdd = qaqc[:geography][:hdd]
1177
- #calculate fdwr based on hdd.
1169
+ # calculate fdwr based on hdd.
1178
1170
  fdwr = 0
1179
1171
  if hdd < 4000
1180
1172
  fdwr = 0.40
1181
- elsif hdd >= 4000 and hdd <=7000
1182
- fdwr = (2000-0.2 * hdd)/3000
1183
- elsif hdd >7000
1173
+ elsif (hdd >= 4000) && (hdd <= 7000)
1174
+ fdwr = (2000 - 0.2 * hdd) / 3000
1175
+ elsif hdd > 7000
1184
1176
  fdwr = 0.20
1185
1177
  end
1186
- #hardset srr to 0.05
1178
+ # hardset srr to 0.05
1187
1179
  srr = 0.05
1188
- #create table of expected values and results.
1180
+ # create table of expected values and results.
1189
1181
  data = {}
1190
1182
  data[:fenestration_to_door_and_window_percentage] = [fdwr * 100, qaqc[:envelope][:fdwr].round(3)]
1191
1183
  data[:skylight_to_roof_percentage] = [srr * 100, qaqc[:envelope][:srr].round(3)]
1192
- #perform test. result must be less than or equal to.
1193
- data.each {|key, value| necb_section_test(
1184
+ # perform test. result must be less than or equal to.
1185
+ data.each do |key, value|
1186
+ necb_section_test(
1194
1187
  qaqc,
1195
1188
  value[0],
1196
1189
  '>=',
1197
1190
  value[1],
1198
1191
  necb_section_name,
1199
1192
  "[ENVELOPE]#{key}",
1200
- 1 #padmassun added tollerance
1201
- )
1202
- }
1193
+ 1 # padmassun added tollerance
1194
+ )
1195
+ end
1203
1196
  end
1204
1197
 
1205
1198
  def necb_infiltration_compliance(qaqc, model)
1206
- #Infiltration
1199
+ # Infiltration
1207
1200
  # puts "\n"
1208
1201
  # puts get_qaqc_table("infiltration_compliance")
1209
1202
  # puts "\n"
@@ -1211,19 +1204,22 @@ class NECB2011
1211
1204
  # puts get_qaqc_table("infiltration_compliance", {"var" => ":infiltration_method"} )
1212
1205
  # puts "\n"
1213
1206
  # puts "\n"
1214
- infiltration_compliance = get_qaqc_table(table_name: "infiltration_compliance")['table']
1215
- necb_section_name = get_qaqc_table(table_name: "infiltration_compliance")['refs'].join(",")
1207
+ infiltration_compliance = get_qaqc_table(table_name: 'infiltration_compliance')['table']
1208
+ necb_section_name = get_qaqc_table(table_name: 'infiltration_compliance')['refs'].join(',')
1216
1209
  qaqc[:spaces].each do |spaceinfo|
1217
1210
  model.getSpaces.sort.each do |space|
1218
1211
  next unless space.name.get == spaceinfo[:name]
1212
+
1219
1213
  found = false
1220
- space.surfaces.each {|surface|
1214
+ space.surfaces.each do |surface|
1221
1215
  next unless surface.outsideBoundaryCondition == 'Outdoors'
1216
+
1222
1217
  found = true
1223
1218
  # peform this infiltration qaqc if and only if the space's surface is in contact with outdoors
1224
- infiltration_compliance.each {|compliance|
1219
+ infiltration_compliance.each do |compliance|
1225
1220
  # puts "\nspaceinfo[#{compliance['var']}]"
1226
- result_value = eval("spaceinfo[:#{compliance['var']}]")
1221
+ eval_string = "spaceinfo[:#{compliance['var']}]"
1222
+ result_value = eval(eval_string)
1227
1223
  # puts "#{compliance['test_text']}"
1228
1224
  test_text = "[SPACE][#{spaceinfo[:name]}]-#{compliance['var']}"
1229
1225
  # puts "result_value: #{result_value}"
@@ -1231,62 +1227,61 @@ class NECB2011
1231
1227
  # data[:infiltration_method] = [ "Flow/ExteriorArea", spaceinfo[:infiltration_method] , nil ]
1232
1228
  # data[:infiltration_flow_per_m2] = [ 0.00025, spaceinfo[:infiltration_flow_per_m2], 5 ]
1233
1229
  # data.each do |key,value|
1234
- #puts key
1230
+ # puts key
1235
1231
  necb_section_test(
1236
- qaqc,
1237
- result_value,
1238
- compliance["bool_operator"],
1239
- compliance["expected_value"],
1240
- necb_section_name,
1241
- test_text,
1242
- compliance["tolerance"]
1232
+ qaqc,
1233
+ result_value,
1234
+ compliance['bool_operator'],
1235
+ compliance['expected_value'],
1236
+ necb_section_name,
1237
+ test_text,
1238
+ compliance['tolerance']
1243
1239
  )
1244
- }
1240
+ end
1245
1241
  # peform qaqc only once per space
1246
1242
  break
1247
- }
1243
+ end
1248
1244
  if !found
1249
1245
  qaqc[:warnings] << "necb_infiltration_compliance for SPACE:[#{spaceinfo[:name]}] was skipped because it does not contain surfaces with 'Outside' boundary condition."
1250
1246
  end
1251
1247
  end
1252
-
1253
1248
  end
1254
1249
  end
1255
1250
 
1256
1251
  def necb_exterior_opaque_compliance(qaqc)
1257
1252
  # puts JSON.pretty_generate @qaqc_data
1258
1253
  # Exterior Opaque
1259
- necb_section_name = get_qaqc_table(table_name: "exterior_opaque_compliance")['refs'].join(",")
1260
- climate_index = NECB2011.new().get_climate_zone_index(qaqc[:geography][:hdd])
1254
+ necb_section_name = get_qaqc_table(table_name: 'exterior_opaque_compliance')['refs'].join(',')
1255
+ climate_index = NECB2011.new.get_climate_zone_index(qaqc[:geography][:hdd])
1261
1256
  puts "HDD #{qaqc[:geography][:hdd]}"
1262
1257
  tolerance = 3
1263
1258
  # puts "\n\n"
1264
1259
  # puts "climate_index: #{climate_index}"
1265
1260
  # puts get_qaqc_table("exterior_opaque_compliance", {"var" => "ext_wall_conductances", "climate_index" => 2})
1266
-
1267
- ["ext_wall_conductances", "ext_roof_conductances", "ext_floor_conductances"].each {|compliance_var|
1268
- qaqc_table = get_qaqc_table(table_name: "exterior_opaque_compliance",search_criteria: {"var" => compliance_var, "climate_index" => climate_index}).first
1269
- #puts "\n#{qaqc_table}\n"
1270
- if compliance_var =="ext_wall_conductances"
1261
+ ['ext_wall_conductances', 'ext_roof_conductances', 'ext_floor_conductances'].each do |compliance_var|
1262
+ qaqc_table = get_qaqc_table(table_name: 'exterior_opaque_compliance', search_criteria: { 'var' => compliance_var, 'climate_index' => climate_index }).first
1263
+ # puts "\n#{qaqc_table}\n"
1264
+ if compliance_var == 'ext_wall_conductances'
1271
1265
  result_value = qaqc[:envelope][:outdoor_walls_average_conductance_w_per_m2_k]
1272
- elsif compliance_var =="ext_roof_conductances"
1266
+ elsif compliance_var == 'ext_roof_conductances'
1273
1267
  result_value = qaqc[:envelope][:outdoor_floors_average_conductance_w_per_m2_k]
1274
- elsif compliance_var =="ext_floor_conductances"
1268
+ elsif compliance_var == 'ext_floor_conductances'
1275
1269
  result_value = qaqc[:envelope][:outdoor_roofs_average_conductance_w_per_m2_k]
1276
1270
  end
1277
1271
 
1278
1272
  test_text = "[ENVELOPE] #{compliance_var}"
1279
1273
  next if result_value.nil?
1274
+
1280
1275
  necb_section_test(
1281
- qaqc,
1282
- result_value,
1283
- qaqc_table["bool_operator"],
1284
- qaqc_table["expected_value"],
1285
- necb_section_name,
1286
- test_text,
1287
- tolerance
1276
+ qaqc,
1277
+ result_value,
1278
+ qaqc_table['bool_operator'],
1279
+ qaqc_table['expected_value'],
1280
+ necb_section_name,
1281
+ test_text,
1282
+ tolerance
1288
1283
  )
1289
- }
1284
+ end
1290
1285
  # result_value_index = 6
1291
1286
  # round_precision = 3
1292
1287
  # data = {}
@@ -1307,38 +1302,39 @@ class NECB2011
1307
1302
  end
1308
1303
 
1309
1304
  def necb_exterior_fenestration_compliance(qaqc)
1310
- #Exterior Fenestration
1311
- necb_section_name = get_qaqc_table(table_name: "exterior_fenestration_compliance")['refs'].join(",")
1312
- climate_index = NECB2011.new().get_climate_zone_index(qaqc[:geography][:hdd])
1305
+ # Exterior Fenestration
1306
+ necb_section_name = get_qaqc_table(table_name: 'exterior_fenestration_compliance')['refs'].join(',')
1307
+ climate_index = NECB2011.new.get_climate_zone_index(qaqc[:geography][:hdd])
1313
1308
  tolerance = 3
1314
1309
  # puts "\n\n"
1315
1310
  # puts "climate_index: #{climate_index}"
1316
1311
  # puts get_qaqc_table("exterior_fenestration_compliance", {"var" => "ext_window_conductances", "climate_index" => 2})
1317
1312
 
1318
- ["ext_window_conductances", "ext_door_conductances", "ext_overhead_door_conductances", "ext_skylight_conductances"].each {|compliance_var|
1319
- qaqc_table = get_qaqc_table(table_name: "exterior_fenestration_compliance",search_criteria: {"var" => compliance_var, "climate_index" => climate_index}).first
1320
- #puts "\n#{qaqc_table}\n"
1321
- if compliance_var =="ext_window_conductances"
1313
+ ['ext_window_conductances', 'ext_door_conductances', 'ext_overhead_door_conductances', 'ext_skylight_conductances'].each do |compliance_var|
1314
+ qaqc_table = get_qaqc_table(table_name: 'exterior_fenestration_compliance', search_criteria: { 'var' => compliance_var, 'climate_index' => climate_index }).first
1315
+ # puts "\n#{qaqc_table}\n"
1316
+ if compliance_var == 'ext_window_conductances'
1322
1317
  result_value = qaqc[:envelope][:windows_average_conductance_w_per_m2_k]
1323
- elsif compliance_var =="ext_door_conductances"
1318
+ elsif compliance_var == 'ext_door_conductances'
1324
1319
  result_value = qaqc[:envelope][:doors_average_conductance_w_per_m2_k]
1325
- elsif compliance_var =="ext_overhead_door_conductances"
1320
+ elsif compliance_var == 'ext_overhead_door_conductances'
1326
1321
  result_value = qaqc[:envelope][:overhead_doors_average_conductance_w_per_m2_k]
1327
- elsif compliance_var =="ext_skylight_conductances"
1322
+ elsif compliance_var == 'ext_skylight_conductances'
1328
1323
  result_value = qaqc[:envelope][:skylights_average_conductance_w_per_m2_k]
1329
1324
  end
1330
1325
  test_text = "[ENVELOPE] #{compliance_var}"
1331
1326
  next if result_value.nil?
1327
+
1332
1328
  necb_section_test(
1333
- qaqc,
1334
- result_value,
1335
- qaqc_table["bool_operator"],
1336
- qaqc_table["expected_value"],
1337
- necb_section_name,
1338
- test_text,
1339
- tolerance
1329
+ qaqc,
1330
+ result_value,
1331
+ qaqc_table['bool_operator'],
1332
+ qaqc_table['expected_value'],
1333
+ necb_section_name,
1334
+ test_text,
1335
+ tolerance
1340
1336
  )
1341
- }
1337
+ end
1342
1338
  # necb_section_name = "NECB2011-Section 3.2.2.3"
1343
1339
  # climate_index = BTAP::Compliance::NECB2011::get_climate_zone_index(qaqc[:geography][:hdd])
1344
1340
  # result_value_index = 6
@@ -1364,36 +1360,37 @@ class NECB2011
1364
1360
  end
1365
1361
 
1366
1362
  def necb_exterior_ground_surfaces_compliance(qaqc)
1367
- #Exterior Ground surfaces
1368
- necb_section_name = get_qaqc_table(table_name: "exterior_ground_surfaces_compliance")['refs'].join(",")
1369
- climate_index = NECB2011.new().get_climate_zone_index(qaqc[:geography][:hdd])
1363
+ # Exterior Ground surfaces
1364
+ necb_section_name = get_qaqc_table(table_name: 'exterior_ground_surfaces_compliance')['refs'].join(',')
1365
+ climate_index = NECB2011.new.get_climate_zone_index(qaqc[:geography][:hdd])
1370
1366
  tolerance = 3
1371
1367
  # puts "\n\n"
1372
1368
  # puts "climate_index: #{climate_index}"
1373
1369
  # puts get_qaqc_table("exterior_ground_surfaces_compliance", {"var" => "ground_wall_conductances", "climate_index" => 2})
1374
1370
 
1375
- ["ground_wall_conductances", "ground_roof_conductances", "ground_floor_conductances"].each {|compliance_var|
1376
- qaqc_table = get_qaqc_table(table_name: "exterior_ground_surfaces_compliance",search_criteria: {"var" => compliance_var, "climate_index" => climate_index}).first
1377
- #puts "\n#{qaqc_table}\n"
1378
- if compliance_var =="ground_wall_conductances"
1371
+ ['ground_wall_conductances', 'ground_roof_conductances', 'ground_floor_conductances'].each do |compliance_var|
1372
+ qaqc_table = get_qaqc_table(table_name: 'exterior_ground_surfaces_compliance', search_criteria: { 'var' => compliance_var, 'climate_index' => climate_index }).first
1373
+ # puts "\n#{qaqc_table}\n"
1374
+ if compliance_var == 'ground_wall_conductances'
1379
1375
  result_value = qaqc[:envelope][:ground_walls_average_conductance_w_per_m2_k]
1380
- elsif compliance_var =="ground_roof_conductances"
1376
+ elsif compliance_var == 'ground_roof_conductances'
1381
1377
  result_value = qaqc[:envelope][:ground_roofs_average_conductance_w_per_m2_k]
1382
- elsif compliance_var =="ground_floor_conductances"
1378
+ elsif compliance_var == 'ground_floor_conductances'
1383
1379
  result_value = qaqc[:envelope][:ground_floors_average_conductance_w_per_m2_k]
1384
1380
  end
1385
1381
  test_text = "[ENVELOPE] #{compliance_var}"
1386
1382
  next if result_value.nil?
1383
+
1387
1384
  necb_section_test(
1388
- qaqc,
1389
- result_value,
1390
- qaqc_table["bool_operator"],
1391
- qaqc_table["expected_value"],
1392
- necb_section_name,
1393
- test_text,
1394
- tolerance
1385
+ qaqc,
1386
+ result_value,
1387
+ qaqc_table['bool_operator'],
1388
+ qaqc_table['expected_value'],
1389
+ necb_section_name,
1390
+ test_text,
1391
+ tolerance
1395
1392
  )
1396
- }
1393
+ end
1397
1394
  # necb_section_name = "NECB2011-Section 3.2.3.1"
1398
1395
  # climate_index = BTAP::Compliance::NECB2011::get_climate_zone_index(qaqc[:geography][:hdd])
1399
1396
  # result_value_index = 6
@@ -1415,35 +1412,37 @@ class NECB2011
1415
1412
  end
1416
1413
 
1417
1414
  def necb_zone_sizing_compliance(qaqc)
1418
- #Zone Sizing test
1419
- necb_section_name = get_qaqc_table(table_name: "zone_sizing_compliance")['refs'].join(",")
1420
- qaqc_table = get_qaqc_table(table_name: "zone_sizing_compliance")
1415
+ # Zone Sizing test
1416
+ necb_section_name = get_qaqc_table(table_name: 'zone_sizing_compliance')['refs'].join(',')
1417
+ qaqc_table = get_qaqc_table(table_name: 'zone_sizing_compliance')
1421
1418
  tolerance = 3
1422
- #necb_section_name = "NECB2011-?"
1423
- #round_precision = 3
1419
+ # necb_section_name = "NECB2011-?"
1420
+ # round_precision = 3
1424
1421
  qaqc[:thermal_zones].each do |zoneinfo|
1425
1422
  # skipping undefined schedules
1426
- if (qaqc_table["exclude"]["exclude_string"].any? {|ex_string| zoneinfo[:name].to_s.include? ex_string}) && !qaqc_table["exclude"]["exclude_string"].empty?
1423
+ if (qaqc_table['exclude']['exclude_string'].any? { |ex_string| zoneinfo[:name].to_s.include? ex_string }) && !qaqc_table['exclude']['exclude_string'].empty?
1427
1424
  # if zoneinfo[:name].to_s.include?"- undefined -"
1428
- puts "#{zoneinfo[:name]} was skipped in necb_zone_sizing_compliance because it contains #{qaqc_table["exclude"]["exclude_string"].join(',')}"
1425
+ puts "#{zoneinfo[:name]} was skipped in necb_zone_sizing_compliance because it contains #{qaqc_table['exclude']['exclude_string'].join(',')}"
1429
1426
  next
1430
1427
  end
1431
- zone_sizing_compliance = qaqc_table["table"]
1432
- zone_sizing_compliance.each {|compliance|
1433
- result_value = eval("zoneinfo[:#{compliance['var']}]")
1428
+ zone_sizing_compliance = qaqc_table['table']
1429
+ zone_sizing_compliance.each do |compliance|
1430
+ eval_string = "zoneinfo[:#{compliance['var']}]"
1431
+ result_value = eval(eval_string)
1434
1432
  next if result_value.nil?
1433
+
1435
1434
  test_text = "[ZONE][#{zoneinfo[:name]}] #{compliance['var']}"
1436
- #puts key
1435
+ # puts key
1437
1436
  necb_section_test(
1438
- qaqc,
1439
- result_value,
1440
- compliance["bool_operator"],
1441
- compliance["expected_value"],
1442
- necb_section_name,
1443
- test_text,
1444
- tolerance
1437
+ qaqc,
1438
+ result_value,
1439
+ compliance['bool_operator'],
1440
+ compliance['expected_value'],
1441
+ necb_section_name,
1442
+ test_text,
1443
+ tolerance
1445
1444
  )
1446
- }
1445
+ end
1447
1446
  # data = {}
1448
1447
  # data[:heating_sizing_factor] = [1.3 , zoneinfo[:heating_sizing_factor]]
1449
1448
  # data[:cooling_sizing_factor] = [1.1 ,zoneinfo[:cooling_sizing_factor]]
@@ -1465,37 +1464,38 @@ class NECB2011
1465
1464
  end
1466
1465
 
1467
1466
  def necb_design_supply_temp_compliance(qaqc)
1468
- necb_section_name = get_qaqc_table(table_name: "design_supply_temp_compliance")['refs'].join(",")
1469
- qaqc_table = get_qaqc_table(table_name: "design_supply_temp_compliance")
1467
+ necb_section_name = get_qaqc_table(table_name: 'design_supply_temp_compliance')['refs'].join(',')
1468
+ qaqc_table = get_qaqc_table(table_name: 'design_supply_temp_compliance')
1470
1469
  tolerance = 3
1471
1470
  qaqc[:thermal_zones].each do |zoneinfo|
1472
1471
  # skipping undefined schedules
1473
- if (qaqc_table["exclude"]["exclude_string"].any? {|ex_string| zoneinfo[:name].to_s.include? ex_string}) && !qaqc_table["exclude"]["exclude_string"].empty?
1474
- puts "#{zoneinfo[:name]} was skipped in necb_zone_sizing_compliance because it contains #{qaqc_table["exclude"]["exclude_string"].join(',')}"
1472
+ if (qaqc_table['exclude']['exclude_string'].any? { |ex_string| zoneinfo[:name].to_s.include? ex_string }) && !qaqc_table['exclude']['exclude_string'].empty?
1473
+ puts "#{zoneinfo[:name]} was skipped in necb_zone_sizing_compliance because it contains #{qaqc_table['exclude']['exclude_string'].join(',')}"
1475
1474
  next
1476
1475
  end
1477
- design_supply_temp_compliance = qaqc_table["table"]
1476
+ design_supply_temp_compliance = qaqc_table['table']
1478
1477
 
1479
- design_supply_temp_compliance.each {|compliance|
1480
- if compliance['var'] == "heating_design_supply_air_temp"
1478
+ design_supply_temp_compliance.each do |compliance|
1479
+ if compliance['var'] == 'heating_design_supply_air_temp'
1481
1480
  result_value = zoneinfo[:zone_heating_design_supply_air_temperature]
1482
- elsif compliance['var'] == "cooling_design_supply_temp"
1481
+ elsif compliance['var'] == 'cooling_design_supply_temp'
1483
1482
  result_value = zoneinfo[:zone_cooling_design_supply_air_temperature]
1484
1483
  end
1485
1484
 
1486
1485
  next if result_value.nil?
1486
+
1487
1487
  test_text = "[ZONE][#{zoneinfo[:name]}] #{compliance['var']}"
1488
- #puts key
1488
+ # puts key
1489
1489
  necb_section_test(
1490
- qaqc,
1491
- result_value,
1492
- compliance["bool_operator"],
1493
- compliance["expected_value"],
1494
- necb_section_name,
1495
- test_text,
1496
- tolerance
1490
+ qaqc,
1491
+ result_value,
1492
+ compliance['bool_operator'],
1493
+ compliance['expected_value'],
1494
+ necb_section_name,
1495
+ test_text,
1496
+ tolerance
1497
1497
  )
1498
- }
1498
+ end
1499
1499
  end
1500
1500
  # Design supply temp test
1501
1501
  # necb_section_name = "NECB2011-?"
@@ -1526,40 +1526,40 @@ class NECB2011
1526
1526
  end
1527
1527
 
1528
1528
  def necb_economizer_compliance(qaqc)
1529
- #determine correct economizer usage according to section 5.2.2.7 of NECB2011
1530
- necb_section_name = get_qaqc_table(table_name: "economizer_compliance")['refs'].join(",")
1531
- qaqc_table = get_qaqc_table(table_name: "economizer_compliance") # stores the full hash of qaqc for economizer_compliance
1529
+ # determine correct economizer usage according to section 5.2.2.7 of NECB2011
1530
+ necb_section_name = get_qaqc_table(table_name: 'economizer_compliance')['refs'].join(',')
1531
+ qaqc_table = get_qaqc_table(table_name: 'economizer_compliance') # stores the full hash of qaqc for economizer_compliance
1532
1532
  # necb_section_name = "NECB2011-5.2.2.7"
1533
1533
 
1534
1534
  qaqc[:air_loops].each do |air_loop_info|
1535
1535
  capacity = -1.0
1536
1536
  if !air_loop_info[:cooling_coils][:dx_single_speed][0].nil?
1537
- puts "capacity = air_loop_info[:cooling_coils][:dx_single_speed][0][:nominal_total_capacity_w]"
1537
+ puts 'capacity = air_loop_info[:cooling_coils][:dx_single_speed][0][:nominal_total_capacity_w]'
1538
1538
  capacity = air_loop_info[:cooling_coils][:dx_single_speed][0][:nominal_total_capacity_w]
1539
1539
  elsif !air_loop_info[:cooling_coils][:dx_two_speed][0].nil?
1540
- puts "capacity = air_loop_info[:cooling_coils][:dx_two_speed][0][:cop_high]"
1540
+ puts 'capacity = air_loop_info[:cooling_coils][:dx_two_speed][0][:cop_high]'
1541
1541
  capacity = air_loop_info[:cooling_coils][:dx_two_speed][0][:cop_high]
1542
1542
  elsif !air_loop_info[:cooling_coils][:coil_cooling_water][0].nil?
1543
- puts "capacity = air_loop_info[:cooling_coils][:coil_cooling_water][0][:nominal_total_capacity_w]"
1543
+ puts 'capacity = air_loop_info[:cooling_coils][:coil_cooling_water][0][:nominal_total_capacity_w]'
1544
1544
  capacity = air_loop_info[:cooling_coils][:coil_cooling_water][0][:nominal_total_capacity_w]
1545
1545
  end
1546
1546
  puts capacity
1547
1547
  if capacity == -1.0
1548
- #This should not happen
1548
+ # This should not happen
1549
1549
  qaqc[:errors] << "[necb_economizer_compliance] air_loop_info[:cooling_coils] for #{air_loop_info[:name]} does not have a capacity "
1550
1550
  else
1551
- #check for correct economizer usage
1552
- #puts "air_loop_info[:supply_fan][:max_air_flow_rate]: #{air_loop_info[:supply_fan][:max_air_flow_rate]}"
1551
+ # check for correct economizer usage
1552
+ # puts "air_loop_info[:supply_fan][:max_air_flow_rate]: #{air_loop_info[:supply_fan][:max_air_flow_rate]}"
1553
1553
  unless air_loop_info[:supply_fan][:max_air_flow_rate_m3_per_s] == -1.0
1554
- #capacity should be in kW
1554
+ # capacity should be in kW
1555
1555
  max_air_flow_rate_m3_per_s = air_loop_info[:supply_fan][:max_air_flow_rate_m3_per_s]
1556
1556
  necb_section_test(
1557
- qaqc,
1558
- eval(qaqc_table["table"][0]["expected_value"]),
1559
- '==',
1560
- air_loop_info[:economizer][:control_type],
1561
- necb_section_name,
1562
- "[AIR LOOP][#{air_loop_info[:name]}][:economizer][:control_type]"
1557
+ qaqc,
1558
+ eval(qaqc_table['table'][0]['expected_value']),
1559
+ '==',
1560
+ air_loop_info[:economizer][:control_type],
1561
+ necb_section_name,
1562
+ "[AIR LOOP][#{air_loop_info[:name]}][:economizer][:control_type]"
1563
1563
  )
1564
1564
  end
1565
1565
  end
@@ -1568,10 +1568,10 @@ class NECB2011
1568
1568
 
1569
1569
  def necb_hrv_compliance(qaqc, model)
1570
1570
  # HRV check
1571
- hrv_compliance = get_qaqc_table(table_name: "hrv_compliance")['table']
1572
- necb_section_name = get_qaqc_table(table_name: "hrv_compliance")['refs'].join(",")
1571
+ hrv_compliance = get_qaqc_table(table_name: 'hrv_compliance')['table']
1572
+ necb_section_name = get_qaqc_table(table_name: 'hrv_compliance')['refs'].join(',')
1573
1573
  qaqc[:air_loops].each do |air_loop_info|
1574
- hrv_compliance.each {|compliance|
1574
+ hrv_compliance.each do |compliance|
1575
1575
  data = {}
1576
1576
 
1577
1577
  # puts "\nspaceinfo[#{compliance['var']}]"
@@ -1583,19 +1583,19 @@ class NECB2011
1583
1583
  # data[:infiltration_method] = [ "Flow/ExteriorArea", spaceinfo[:infiltration_method] , nil ]
1584
1584
  # data[:infiltration_flow_per_m2] = [ 0.00025, spaceinfo[:infiltration_flow_per_m2], 5 ]
1585
1585
  # data.each do |key,value|
1586
- #puts key
1586
+ # puts key
1587
1587
  outdoor_air_L_per_s = air_loop_info[:outdoor_air_L_per_s]
1588
1588
  db990 = BTAP::Environment::WeatherFile.new(model.getWeatherFile.path.get.to_s).db990
1589
1589
  necb_section_test(
1590
- qaqc,
1591
- result_value,
1592
- "==",
1593
- eval(compliance["expected_value"]),
1594
- necb_section_name,
1595
- test_text,
1596
- compliance["tolerance"]
1590
+ qaqc,
1591
+ result_value,
1592
+ '==',
1593
+ eval(compliance['expected_value']),
1594
+ necb_section_name,
1595
+ test_text,
1596
+ compliance['tolerance']
1597
1597
  )
1598
- }
1598
+ end
1599
1599
  end
1600
1600
  # necb_section_name = "NECB2011-5.2.10.1"
1601
1601
  # qaqc[:air_loops].each do |air_loop_info|
@@ -1625,21 +1625,22 @@ class NECB2011
1625
1625
  # because support for MURBS has not been implemented for HRV
1626
1626
  # in NECB 2011 and 2015
1627
1627
  def necb_hrv_compliance_inc_murb(qaqc, model)
1628
- murb_hrv_compliance = get_qaqc_table("murb_hrv_compliance")
1628
+ murb_hrv_compliance = get_qaqc_table('murb_hrv_compliance')
1629
1629
  hrv_spacetpye_ignore_regex = murb_hrv_compliance['ignored_spacetypes_regex']
1630
1630
  hrv_dwelling_unit_spacetpye_regex = murb_hrv_compliance['dwelling_unit_spacetype_regex']
1631
- necb_section_name = murb_hrv_compliance['refs'].join(",")
1631
+ necb_section_name = murb_hrv_compliance['refs'].join(',')
1632
1632
 
1633
1633
  model.getAirLoopHVACs.sort.each do |air_loop|
1634
1634
  air_loop_info = {}
1635
1635
 
1636
1636
  qaqc[:air_loops].each do |air_loop_i|
1637
1637
  next unless air_loop_i[:name] == air_loop.name.get
1638
+
1638
1639
  air_loop_info = air_loop_i
1639
1640
  end
1640
1641
 
1641
- zones = air_loop.thermalZones()
1642
- if zones.length ==1
1642
+ zones = air_loop.thermalZones
1643
+ if zones.length == 1
1643
1644
  # here the Airloop is serving only one zone
1644
1645
 
1645
1646
  # So, next we need to determine if the zone has only
@@ -1647,17 +1648,17 @@ class NECB2011
1647
1648
 
1648
1649
  zone = zones.first
1649
1650
  # get the spaces and keep track of the number of spaces and dewlling units
1650
- num_of_served_spaces = zone.spaces().length
1651
+ num_of_served_spaces = zone.spaces.length
1651
1652
  contains_dwelling_unit = false
1652
1653
  if num_of_served_spaces == 0
1653
- qaqc[:warnings] << "[necb_murb_hrv_compliance] Thermal Zone [#{zone.name.to_s}] does not serve any Spaces"
1654
+ qaqc[:warnings] << "[necb_murb_hrv_compliance] Thermal Zone [#{zone.name}] does not serve any Spaces"
1654
1655
  else
1655
1656
  spaces = zone.spaces()
1656
- spaces.each {|z_space|
1657
- spacetype = z_space.spaceType()
1657
+ spaces.each do |z_space|
1658
+ spacetype = z_space.spaceType
1658
1659
  spacetype = validate_optional(spacetype, model, nil)
1659
1660
  if spacetype.nil?
1660
- qaqc[:warnings] << "[necb_murb_hrv_compliance] Space [#{z_space.name.to_s}] does not have a SpaceType"
1661
+ qaqc[:warnings] << "[necb_murb_hrv_compliance] Space [#{z_space.name}] does not have a SpaceType"
1661
1662
  else
1662
1663
  # reduce the number of spaces if the space served by the thermal zone is a
1663
1664
  # stairwell/staircase/lobby/corridor
@@ -1672,33 +1673,33 @@ class NECB2011
1672
1673
  contains_dwelling_unit = true
1673
1674
  end
1674
1675
  end
1675
- }
1676
- if num_of_served_spaces == 1 and contains_dwelling_unit
1676
+ end
1677
+ if (num_of_served_spaces == 1) && contains_dwelling_unit
1677
1678
  # here the Thermal zone serves one space that is a dwelling unit
1678
1679
  # and other space types such as lobby, stairs, or corridors are ignored
1679
1680
  # So in this case, an HRV is required
1680
1681
  test_text = "[AIR LOOP][:heat_exchanger] (murb) for [#{air_loop_info[:name]}] is present?"
1681
1682
  result_value = murb_hrv_compliance['table']['expected_value']
1682
1683
  necb_section_test(
1683
- qaqc,
1684
- result_value,
1685
- "==",
1686
- true,
1687
- necb_section_name,
1688
- test_text,
1689
- nil
1684
+ qaqc,
1685
+ result_value,
1686
+ '==',
1687
+ true,
1688
+ necb_section_name,
1689
+ test_text,
1690
+ nil
1690
1691
  )
1691
1692
  else
1692
1693
  # Here either the number of served spaces exceed 1 or
1693
1694
  # does not contain a dwelling unit, So a regular HRV check has to be done for this air loop
1694
- qaqc[:warnings] << "[necb_murb_hrv_compliance] Regular HRV compliance check for airloop: [#{air_loop.name.to_s}], because (it does not serve a single dwelling unit) OR (serves multiple spacetypes)"
1695
+ qaqc[:warnings] << "[necb_murb_hrv_compliance] Regular HRV compliance check for airloop: [#{air_loop.name}], because (it does not serve a single dwelling unit) OR (serves multiple spacetypes)"
1695
1696
  necb_hrv_compliance_for_single_airloop(qaqc, model, air_loop_info)
1696
1697
  end
1697
1698
  end
1698
1699
  else
1699
1700
  # here the Airloop does not serve any zones, or it serves more than one zone
1700
1701
  # So, a regular hrv compliance must be done for this air loop
1701
- qaqc[:warnings] << "[necb_murb_hrv_compliance] Regular HRV compliance check for airloop: [#{air_loop.name.to_s}], because it serves multiple Thermal zones"
1702
+ qaqc[:warnings] << "[necb_murb_hrv_compliance] Regular HRV compliance check for airloop: [#{air_loop.name}], because it serves multiple Thermal zones"
1702
1703
  necb_hrv_compliance_for_single_airloop(qaqc, model, air_loop_info)
1703
1704
  end
1704
1705
  end
@@ -1715,9 +1716,9 @@ class NECB2011
1715
1716
  # @param air_loop_info [:hash] single air_loop object from the qaqc hash
1716
1717
  def necb_hrv_compliance_for_single_airloop(qaqc, model, air_loop_info)
1717
1718
  # HRV check
1718
- hrv_compliance = get_qaqc_table("hrv_compliance")['table']
1719
- necb_section_name = get_qaqc_table("hrv_compliance")['refs'].join(",")
1720
- hrv_compliance.each {|compliance|
1719
+ hrv_compliance = get_qaqc_table('hrv_compliance')['table']
1720
+ necb_section_name = get_qaqc_table('hrv_compliance')['refs'].join(',')
1721
+ hrv_compliance.each do |compliance|
1721
1722
  data = {}
1722
1723
 
1723
1724
  # puts "\nspaceinfo[#{compliance['var']}]"
@@ -1729,19 +1730,19 @@ class NECB2011
1729
1730
  # data[:infiltration_method] = [ "Flow/ExteriorArea", spaceinfo[:infiltration_method] , nil ]
1730
1731
  # data[:infiltration_flow_per_m2] = [ 0.00025, spaceinfo[:infiltration_flow_per_m2], 5 ]
1731
1732
  # data.each do |key,value|
1732
- #puts key
1733
+ # puts key
1733
1734
  outdoor_air_L_per_s = air_loop_info[:outdoor_air_L_per_s]
1734
1735
  db990 = BTAP::Environment::WeatherFile.new(model.getWeatherFile.path.get.to_s).db990
1735
1736
  necb_section_test(
1736
- qaqc,
1737
- result_value,
1738
- "==",
1739
- eval(compliance["expected_value"]),
1740
- necb_section_name,
1741
- test_text,
1742
- compliance["tolerance"]
1737
+ qaqc,
1738
+ result_value,
1739
+ '==',
1740
+ eval(compliance['expected_value']),
1741
+ necb_section_name,
1742
+ test_text,
1743
+ compliance['tolerance']
1743
1744
  )
1744
- }
1745
+ end
1745
1746
  # necb_section_name = "NECB2011-5.2.10.1"
1746
1747
  # qaqc[:air_loops].each do |air_loop_info|
1747
1748
  # unless air_loop_info[:supply_fan][:max_air_flow_rate_m3_per_s] == -1.0
@@ -1767,53 +1768,53 @@ class NECB2011
1767
1768
  end
1768
1769
 
1769
1770
  def necb_vav_fan_power_compliance(qaqc)
1770
- necb_section_name = get_qaqc_table(table_name: "vav_fan_power_compliance")['refs'].join(",")
1771
- qaqc_table = get_qaqc_table(table_name: "vav_fan_power_compliance")
1772
- #necb_section_name = "NECB2011-5.2.3.3"
1771
+ necb_section_name = get_qaqc_table(table_name: 'vav_fan_power_compliance')['refs'].join(',')
1772
+ qaqc_table = get_qaqc_table(table_name: 'vav_fan_power_compliance')
1773
+ # necb_section_name = "NECB2011-5.2.3.3"
1773
1774
  qaqc[:air_loops].each do |air_loop_info|
1774
- #necb_clg_cop = air_loop_info[:cooling_coils][:dx_single_speed][:cop] #*assuming that the cop is defined correctly*
1775
+ # necb_clg_cop = air_loop_info[:cooling_coils][:dx_single_speed][:cop] #*assuming that the cop is defined correctly*
1775
1776
  if air_loop_info[:supply_fan][:max_air_flow_rate_m3_per_s].nil?
1776
- qaqc[:warnings] << "[vav_fan_power_compliance] air_loop_info[:supply_fan][:max_air_flow_rate_m3_per_s] is nil"
1777
+ qaqc[:warnings] << '[vav_fan_power_compliance] air_loop_info[:supply_fan][:max_air_flow_rate_m3_per_s] is nil'
1777
1778
  next
1778
1779
  end
1779
1780
 
1780
1781
  max_air_flow_rate_m3_per_s = air_loop_info[:supply_fan][:max_air_flow_rate_m3_per_s]
1781
1782
  necb_supply_fan_w = -1
1782
1783
 
1783
- if air_loop_info[:name].include? "PSZ"
1784
+ if air_loop_info[:name].include? 'PSZ'
1784
1785
  necb_supply_fan_w = eval(qaqc_table['formulas']['NECB PSZ fan power (W)']).round(2)
1785
- elsif air_loop_info[:name].include? "VAV"
1786
+ elsif air_loop_info[:name].include? 'VAV'
1786
1787
  necb_supply_fan_w = eval(qaqc_table['formulas']['NECB VAV fan power (W)']).round(2)
1787
1788
  end
1788
1789
 
1789
1790
  if air_loop_info[:supply_fan][:rated_electric_power_w].nil?
1790
- qaqc[:warnings] << "[vav_fan_power_compliance] air_loop_info[:supply_fan][:rated_electric_power_w] is nil"
1791
+ qaqc[:warnings] << '[vav_fan_power_compliance] air_loop_info[:supply_fan][:rated_electric_power_w] is nil'
1791
1792
  next
1792
1793
  end
1793
1794
 
1794
1795
  supply_fan_w = (air_loop_info[:supply_fan][:rated_electric_power_w]).round(3)
1795
1796
  absolute_diff = (necb_supply_fan_w - supply_fan_w).to_f.abs
1796
1797
  if absolute_diff < 10
1797
- #This case should ALWAYS PASS
1798
+ # This case should ALWAYS PASS
1798
1799
  necb_section_test(
1799
- qaqc,
1800
- 10,
1801
- '>=',
1802
- absolute_diff,
1803
- necb_section_name,
1804
- "[AIR LOOP][#{air_loop_info[:name]}][:supply_fan][:rated_electric_power_w] [#{supply_fan_w}] Absolute Difference from NECB value [#{necb_supply_fan_w}]"
1800
+ qaqc,
1801
+ 10,
1802
+ '>=',
1803
+ absolute_diff,
1804
+ necb_section_name,
1805
+ "[AIR LOOP][#{air_loop_info[:name]}][:supply_fan][:rated_electric_power_w] [#{supply_fan_w}] Absolute Difference from NECB value [#{necb_supply_fan_w}]"
1805
1806
  )
1806
1807
  next
1807
1808
  else
1808
- #The test should pass if and only if the percent difference is less than 10%
1809
- percent_diff = ((necb_supply_fan_w - supply_fan_w).to_f.abs/necb_supply_fan_w * 100).round(3)
1809
+ # The test should pass if and only if the percent difference is less than 10%
1810
+ percent_diff = ((necb_supply_fan_w - supply_fan_w).to_f.abs / necb_supply_fan_w * 100).round(3)
1810
1811
  necb_section_test(
1811
- qaqc,
1812
- 10,
1813
- '>=',
1814
- percent_diff,
1815
- necb_section_name,
1816
- "[AIR LOOP][#{air_loop_info[:name]}][:supply_fan][:rated_electric_power_w] [#{supply_fan_w}] Percent Diff from NECB value [#{necb_supply_fan_w}]"
1812
+ qaqc,
1813
+ 10,
1814
+ '>=',
1815
+ percent_diff,
1816
+ necb_section_name,
1817
+ "[AIR LOOP][#{air_loop_info[:name]}][:supply_fan][:rated_electric_power_w] [#{supply_fan_w}] Percent Diff from NECB value [#{necb_supply_fan_w}]"
1817
1818
  )
1818
1819
  end
1819
1820
  end
@@ -1821,12 +1822,11 @@ class NECB2011
1821
1822
 
1822
1823
  def necb_qaqc(qaqc, model)
1823
1824
  puts "\n\nin necb_qaqc 2011 now\n\n"
1824
- #Now perform basic QA/QC on items for NECB2011
1825
+ # Now perform basic QA/QC on items for NECB2011
1825
1826
  qaqc[:information] = []
1826
- qaqc[:warnings] =[]
1827
+ qaqc[:warnings] = []
1827
1828
  qaqc[:errors] = []
1828
- qaqc[:unique_errors]=[]
1829
-
1829
+ qaqc[:unique_errors] = []
1830
1830
 
1831
1831
  necb_space_compliance(qaqc)
1832
1832
 
@@ -1857,52 +1857,55 @@ class NECB2011
1857
1857
  qaqc[:information] = qaqc[:information].sort
1858
1858
  qaqc[:warnings] = qaqc[:warnings].sort
1859
1859
  qaqc[:errors] = qaqc[:errors].sort
1860
- qaqc[:unique_errors]= qaqc[:unique_errors].sort
1860
+ qaqc[:unique_errors] = qaqc[:unique_errors].sort
1861
1861
  return qaqc
1862
1862
  end
1863
1863
 
1864
1864
  def necb_section_test(qaqc, result_value, bool_operator, expected_value, necb_section_name, test_text, tolerance = nil)
1865
- test = "eval_failed"
1865
+ test = 'eval_failed'
1866
1866
  command = ''
1867
1867
  if tolerance.is_a?(Integer)
1868
1868
  command = "#{result_value}.round(#{tolerance}) #{bool_operator} #{expected_value}.round(#{tolerance})"
1869
- elsif expected_value.is_a?(String) and result_value.is_a?(String)
1869
+ elsif expected_value.is_a?(String) && result_value.is_a?(String)
1870
1870
  command = "'#{result_value}' #{bool_operator} '#{expected_value}'"
1871
1871
  else
1872
1872
  command = "#{result_value} #{bool_operator} #{expected_value}"
1873
1873
  end
1874
1874
  test = eval(command)
1875
- test == 'true' ? true : false
1876
- raise ("Eval command failed #{test}") if !!test != test
1877
- if test
1875
+ test_res = nil
1876
+ test_res = true if test.to_s.downcase == 'true'
1877
+ test_res = false if test.to_s.downcase == 'false'
1878
+ raise "Eval command failed #{test}" if test_res.nil?
1879
+
1880
+ if test_res
1878
1881
  qaqc[:information] << "[Info][TEST-PASS][#{necb_section_name}]:#{test_text} result value:#{result_value} #{bool_operator} expected value:#{expected_value}"
1879
1882
  else
1880
1883
  qaqc[:errors] << "[ERROR][TEST-FAIL][#{necb_section_name}]:#{test_text} expected value:#{expected_value} #{bool_operator} result value:#{result_value}"
1881
- unless (expected_value == -1.0 or expected_value == 'N/A')
1884
+ unless (expected_value == -1.0) || (expected_value == 'N/A')
1882
1885
  qaqc[:unique_errors] << "[ERROR][TEST-FAIL][#{necb_section_name}]:#{test_text} expected value:#{expected_value} #{bool_operator} result value:#{result_value}"
1883
1886
  end
1884
1887
  end
1885
1888
  end
1886
1889
 
1887
- def check_boolean_value (value, varname)
1888
- return true if value =~ (/^(true|t|yes|y|1)$/i)
1889
- return false if value.empty? || value =~ (/^(false|f|no|n|0)$/i)
1890
+ def check_boolean_value(value, varname)
1891
+ return true if value =~ /^(true|t|yes|y|1)$/i
1892
+ return false if value.empty? || value =~ /^(false|f|no|n|0)$/i
1890
1893
 
1891
- raise ArgumentError.new "invalid value for #{varname}: #{value}"
1894
+ raise ArgumentError, "invalid value for #{varname}: #{value}"
1892
1895
  end
1893
1896
 
1894
1897
  def look_up_csv_data(csv_fname, search_criteria)
1895
- options = {:headers => :first_row,
1896
- :converters => [:numeric]}
1898
+ options = { headers: :first_row,
1899
+ converters: [:numeric] }
1897
1900
  unless File.exist?(csv_fname)
1898
- raise ("File: [#{csv_fname}] Does not exist")
1901
+ raise "File: [#{csv_fname}] Does not exist"
1899
1902
  end
1903
+
1900
1904
  # we'll save the matches here
1901
1905
  matches = nil
1902
1906
  # save a copy of the headers
1903
1907
  headers = nil
1904
- CSV.open(csv_fname, "r", options) do |csv|
1905
-
1908
+ CSV.open(csv_fname, 'r', options) do |csv|
1906
1909
  # Since CSV includes Enumerable we can use 'find_all'
1907
1910
  # which will return all the elements of the Enumerble for
1908
1911
  # which the block returns true
@@ -1910,17 +1913,17 @@ class NECB2011
1910
1913
  matches = csv.find_all do |row|
1911
1914
  match = true
1912
1915
  search_criteria.keys.each do |key|
1913
- match = match && (row[key].strip == search_criteria[key].strip)
1916
+ match &&= (row[key].strip == search_criteria[key].strip)
1914
1917
  end
1915
1918
  match
1916
1919
  end
1917
1920
  headers = csv.headers
1918
1921
  end
1919
- #puts matches
1920
- raise("More than one match") if matches.size > 1
1921
- puts "Zero matches found for [#{search_criteria}]" if matches.size == 0
1922
- #return matches[0]
1922
+ # puts matches
1923
+ raise('More than one match') if matches.size > 1
1924
+
1925
+ puts "Zero matches found for [#{search_criteria}]" if matches.empty?
1926
+ # return matches[0]
1923
1927
  return matches[0]
1924
1928
  end
1925
-
1926
1929
  end