openstudio-standards 0.2.14 → 0.2.15.pre.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (642) hide show
  1. checksums.yaml +4 -4
  2. data/data/geometry/ASHRAECollege.json +0 -19
  3. data/data/geometry/ASHRAEMidriseApartment.json +47 -47
  4. data/data/geometry/ASHRAESecondarySchool.osm +2 -2
  5. data/data/standards/OpenStudio_Standards-ashrae_90_1.xlsx +0 -0
  6. data/data/standards/export_OpenStudio_libraries.rb +1 -1
  7. data/data/standards/manage_OpenStudio_Standards.rb +43 -87
  8. data/data/standards/metadata_units_OpenStudio_Standards-ashrae_90_1.csv +9 -0
  9. data/data/standards/openstudio_standards_duplicates_log.csv +142 -27
  10. data/data/standards/test_performance_expected_dd_results.csv +2016 -2016
  11. data/data/weather/CAN_NU_Iqaluit.AP.719090_CWEC2016.ddy +2316 -0
  12. data/data/weather/CAN_NU_Iqaluit.AP.719090_CWEC2016.epw +8768 -0
  13. data/data/weather/CAN_NU_Iqaluit.AP.719090_CWEC2016.stat +697 -0
  14. data/lib/openstudio-standards/btap/WeatherData1.json +54 -0
  15. data/lib/openstudio-standards/btap/WeatherData1.xlsx +0 -0
  16. data/lib/openstudio-standards/btap/btap_result.rb +12 -10
  17. data/lib/openstudio-standards/btap/envelope.rb +2 -2
  18. data/lib/openstudio-standards/btap/geometry.rb +96 -49
  19. data/lib/openstudio-standards/{utilities → btap/utilities}/Add_template_field_to_json.rb +0 -0
  20. data/lib/openstudio-standards/{utilities → btap/utilities}/convert_surfaces_to_adiabatic_necb_8426.rb +0 -0
  21. data/lib/openstudio-standards/{utilities → btap/utilities}/generate_space_types.rb +0 -0
  22. data/lib/openstudio-standards/{utilities → btap/utilities}/necb_to_epw_map.rb +0 -0
  23. data/lib/openstudio-standards/{utilities → btap/utilities}/os_sim_extract.rb +0 -0
  24. data/lib/openstudio-standards/{utilities → btap/utilities}/rename_surfaces.rb +0 -0
  25. data/lib/openstudio-standards/{utilities → btap/utilities}/round_surf_coords.rb +0 -0
  26. data/lib/openstudio-standards/{utilities → btap/utilities}/sched_create.rb +0 -0
  27. data/lib/openstudio-standards/{utilities → btap/utilities}/set_mult_to_adiabatic.rb +0 -0
  28. data/lib/openstudio-standards/btap/utilities/space_type.rb +78 -0
  29. data/lib/openstudio-standards/{utilities → btap/utilities}/weatherData1_xlsx_to_json.rb +0 -0
  30. data/lib/openstudio-standards/hvac_sizing/Siz.AirConditionerVariableRefrigerantFlow.rb +1 -1
  31. data/lib/openstudio-standards/hvac_sizing/Siz.HVACComponent.rb +1 -1
  32. data/lib/openstudio-standards/hvac_sizing/Siz.HeatingCoolingFuels.rb +20 -6
  33. data/lib/openstudio-standards/hvac_sizing/Siz.Model.rb +6 -6
  34. data/lib/openstudio-standards/hvac_sizing/Siz.WaterHeaterMixed.rb +2 -2
  35. data/lib/openstudio-standards/hvac_sizing/Siz.ZoneHVACTerminalUnitVariableRefrigerantFlow.rb +1 -1
  36. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.AirTerminalSingleDuctVAVReheat.rb +2 -1
  37. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.PumpVariableSpeed.rb +6 -7
  38. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.AirTerminalSingleDuctVAVReheat.rb +2 -1
  39. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.FanConstantVolume.rb +5 -4
  40. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.FanOnOff.rb +5 -5
  41. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.FanVariableVolume.rb +5 -4
  42. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.PumpVariableSpeed.rb +6 -7
  43. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.AirTerminalSingleDuctVAVReheat.rb +2 -1
  44. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.FanConstantVolume.rb +5 -4
  45. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.FanOnOff.rb +5 -5
  46. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.FanVariableVolume.rb +5 -4
  47. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.Model.elevators.rb +6 -4
  48. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.Model.rb +10 -9
  49. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.PumpVariableSpeed.rb +9 -11
  50. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirTerminalSingleDuctVAVReheat.rb +2 -1
  51. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.FanConstantVolume.rb +5 -4
  52. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.FanOnOff.rb +5 -5
  53. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.FanVariableVolume.rb +5 -4
  54. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.Model.elevators.rb +11 -7
  55. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.Model.rb +17 -16
  56. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.PumpVariableSpeed.rb +9 -11
  57. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.hvac_systems.rb +4 -2
  58. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.AirTerminalSingleDuctVAVReheat.rb +2 -1
  59. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.FanConstantVolume.rb +5 -4
  60. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.FanOnOff.rb +5 -5
  61. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.FanVariableVolume.rb +5 -4
  62. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.Model.elevators.rb +11 -7
  63. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.Model.rb +23 -22
  64. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.PumpVariableSpeed.rb +9 -10
  65. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.hvac_systems.rb +4 -2
  66. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirTerminalSingleDuctVAVReheat.rb +2 -1
  67. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.FanConstantVolume.rb +5 -4
  68. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.FanOnOff.rb +5 -5
  69. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.FanVariableVolume.rb +5 -4
  70. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Model.elevators.rb +11 -7
  71. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Model.rb +23 -22
  72. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Pump.rb +89 -0
  73. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.PumpVariableSpeed.rb +9 -10
  74. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Space.rb +76 -0
  75. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.hvac_systems.rb +22 -2
  76. data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.AirTerminalSingleDuctVAVReheat.rb +2 -1
  77. data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.Model.elevators.rb +11 -11
  78. data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.refrigeration.rb +5 -4
  79. data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.AirTerminalSingleDuctVAVReheat.rb +2 -1
  80. data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.CoilHeatingGas.rb +5 -4
  81. data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.Model.elevators.rb +11 -11
  82. data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.refrigeration.rb +5 -4
  83. data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.AirTerminalSingleDuctVAVReheat.rb +2 -1
  84. data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.FanConstantVolume.rb +5 -4
  85. data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.FanOnOff.rb +5 -5
  86. data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.FanVariableVolume.rb +5 -4
  87. data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.HeatExchangerAirToAirSensibleAndLatent.rb +2 -0
  88. data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.Model.elevators.rb +11 -7
  89. data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.Model.rb +10 -10
  90. data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.hvac_systems.rb +4 -2
  91. data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirTerminalSingleDuctVAVReheat.rb +2 -1
  92. data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.FanConstantVolume.rb +5 -4
  93. data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.FanOnOff.rb +5 -5
  94. data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.FanVariableVolume.rb +5 -4
  95. data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.HeatExchangerAirToAirSensibleAndLatent.rb +2 -0
  96. data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.Model.elevators.rb +11 -7
  97. data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.Model.rb +10 -10
  98. data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.hvac_systems.rb +4 -2
  99. data/lib/openstudio-standards/prototypes/cbes/cbes.Model.elevators.rb +3 -6
  100. data/lib/openstudio-standards/prototypes/cbes/cbes.refrigeration.rb +5 -4
  101. data/lib/openstudio-standards/prototypes/cbes/cbes_t24_2008/cbes_t24_2008.FanConstantVolume.rb +5 -3
  102. data/lib/openstudio-standards/prototypes/cbes/cbes_t24_2008/cbes_t24_2008.FanOnOff.rb +5 -4
  103. data/lib/openstudio-standards/prototypes/cbes/cbes_t24_2008/cbes_t24_2008.FanVariableVolume.rb +5 -3
  104. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.College.rb +65 -30
  105. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Courthouse.rb +54 -23
  106. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.FullServiceRestaurant.rb +135 -147
  107. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.HighRiseApartment.rb +42 -7
  108. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Hospital.rb +85 -12
  109. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Laboratory.rb +42 -30
  110. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeDataCenterHighITE.rb +39 -8
  111. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeDataCenterLowITE.rb +39 -8
  112. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeHotel.rb +60 -12
  113. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeOffice.rb +33 -265
  114. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeOfficeDetailed.rb +41 -3
  115. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.MediumOffice.rb +69 -297
  116. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.MediumOfficeDetailed.rb +68 -25
  117. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.MidriseApartment.rb +88 -59
  118. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Outpatient.rb +88 -9
  119. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.PrimarySchool.rb +48 -10
  120. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.QuickServiceRestaurant.rb +130 -145
  121. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.RetailStandalone.rb +29 -101
  122. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.RetailStripmall.rb +24 -7
  123. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SecondarySchool.rb +48 -589
  124. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallDataCenterHighITE.rb +38 -7
  125. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallDataCenterLowITE.rb +38 -8
  126. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallHotel.rb +40 -7
  127. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallOffice.rb +85 -171
  128. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallOfficeDetailed.rb +87 -44
  129. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SuperMarket.rb +46 -5
  130. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SuperTallBuilding.rb +105 -17
  131. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.TallBuilding.rb +97 -15
  132. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Warehouse.rb +26 -167
  133. data/lib/openstudio-standards/prototypes/common/do_not_edit_metaclasses.rb +3828 -1131
  134. data/lib/openstudio-standards/prototypes/common/objects/Prototype.AirConditionerVariableRefrigerantFlow.rb +3 -0
  135. data/lib/openstudio-standards/prototypes/common/objects/Prototype.AirTerminalSingleDuctVAVReheat.rb +2 -1
  136. data/lib/openstudio-standards/prototypes/common/objects/Prototype.BoilerHotWater.rb +2 -0
  137. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CentralAirSourceHeatPump.rb +2 -0
  138. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingDXSingleSpeed.rb +4 -1
  139. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingDXTwoSpeed.rb +3 -0
  140. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingWater.rb +4 -1
  141. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingWaterToAirHeatPumpEquationFit.rb +3 -0
  142. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingDXSingleSpeed.rb +9 -0
  143. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingElectric.rb +3 -0
  144. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingGas.rb +9 -4
  145. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingWater.rb +4 -1
  146. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingWaterToAirHeatPumpEquationFit.rb +3 -0
  147. data/lib/openstudio-standards/prototypes/common/objects/Prototype.ControllerWaterCoil.rb +2 -2
  148. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoolingTower.rb +4 -1
  149. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Fan.rb +23 -2
  150. data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanConstantVolume.rb +29 -4
  151. data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanOnOff.rb +29 -5
  152. data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanVariableVolume.rb +43 -4
  153. data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanZoneExhaust.rb +22 -0
  154. data/lib/openstudio-standards/prototypes/common/objects/Prototype.HeatExchangerAirToAirSensibleAndLatent.rb +46 -3
  155. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.elevators.rb +27 -22
  156. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.exterior_lights.rb +15 -8
  157. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.hvac.rb +22 -4
  158. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.rb +429 -59
  159. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.swh.rb +18 -11
  160. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.transformers.rb +11 -2
  161. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Pump.rb +1 -0
  162. data/lib/openstudio-standards/prototypes/common/objects/Prototype.PumpVariableSpeed.rb +8 -10
  163. data/lib/openstudio-standards/prototypes/common/objects/Prototype.ServiceWaterHeating.rb +37 -28
  164. data/lib/openstudio-standards/prototypes/common/objects/Prototype.SizingSystem.rb +24 -6
  165. data/lib/openstudio-standards/prototypes/common/objects/Prototype.hvac_systems.rb +251 -65
  166. data/lib/openstudio-standards/prototypes/common/objects/Prototype.radiant_system_controls.rb +1 -1
  167. data/lib/openstudio-standards/prototypes/common/objects/Prototype.refrigeration.rb +46 -31
  168. data/lib/openstudio-standards/prototypes/common/objects/Prototype.utilities.rb +62 -10
  169. data/lib/openstudio-standards/prototypes/common/prototype_metaprogramming.rb +76 -33
  170. data/lib/openstudio-standards/prototypes/deer/deer.Model.rb +1 -1
  171. data/lib/openstudio-standards/standards/Standards.AirLoopHVAC.rb +445 -275
  172. data/lib/openstudio-standards/standards/Standards.AirTerminalSingleDuctParallelPIUReheat.rb +3 -3
  173. data/lib/openstudio-standards/standards/Standards.AirTerminalSingleDuctVAVReheat.rb +26 -21
  174. data/lib/openstudio-standards/standards/Standards.BoilerHotWater.rb +5 -2
  175. data/lib/openstudio-standards/standards/Standards.BuildingStory.rb +7 -9
  176. data/lib/openstudio-standards/standards/Standards.ChillerElectricEIR.rb +8 -2
  177. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXMultiSpeed.rb +10 -6
  178. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXSingleSpeed.rb +5 -1
  179. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXTwoSpeed.rb +6 -1
  180. data/lib/openstudio-standards/standards/Standards.CoilCoolingWaterToAirHeatPumpEquationFit.rb +45 -4
  181. data/lib/openstudio-standards/standards/Standards.CoilDX.rb +18 -8
  182. data/lib/openstudio-standards/standards/Standards.CoilHeatingDXMultiSpeed.rb +9 -7
  183. data/lib/openstudio-standards/standards/Standards.CoilHeatingDXSingleSpeed.rb +8 -4
  184. data/lib/openstudio-standards/standards/Standards.CoilHeatingGas.rb +86 -3
  185. data/lib/openstudio-standards/standards/Standards.CoilHeatingGasMultiStage.rb +5 -2
  186. data/lib/openstudio-standards/standards/Standards.CoilHeatingWaterToAirHeatPumpEquationFit.rb +6 -2
  187. data/lib/openstudio-standards/standards/Standards.Construction.rb +66 -35
  188. data/lib/openstudio-standards/standards/Standards.CoolingTower.rb +7 -7
  189. data/lib/openstudio-standards/standards/Standards.CoolingTowerSingleSpeed.rb +2 -2
  190. data/lib/openstudio-standards/standards/Standards.CoolingTowerTwoSpeed.rb +2 -1
  191. data/lib/openstudio-standards/standards/Standards.CoolingTowerVariableSpeed.rb +2 -1
  192. data/lib/openstudio-standards/standards/Standards.Fan.rb +53 -35
  193. data/lib/openstudio-standards/standards/Standards.FanVariableVolume.rb +22 -16
  194. data/lib/openstudio-standards/standards/Standards.FluidCooler.rb +2 -2
  195. data/lib/openstudio-standards/standards/Standards.HeaderedPumpsVariableSpeed.rb +4 -4
  196. data/lib/openstudio-standards/standards/Standards.HeatExchangerSensLat.rb +77 -19
  197. data/lib/openstudio-standards/standards/Standards.Model.rb +387 -245
  198. data/lib/openstudio-standards/standards/Standards.PlanarSurface.rb +13 -15
  199. data/lib/openstudio-standards/standards/Standards.PlantLoop.rb +94 -48
  200. data/lib/openstudio-standards/standards/Standards.Pump.rb +28 -20
  201. data/lib/openstudio-standards/standards/Standards.PumpVariableSpeed.rb +3 -4
  202. data/lib/openstudio-standards/standards/Standards.ScheduleCompact.rb +2 -1
  203. data/lib/openstudio-standards/standards/Standards.ScheduleConstant.rb +2 -0
  204. data/lib/openstudio-standards/standards/Standards.ScheduleRuleset.rb +34 -24
  205. data/lib/openstudio-standards/standards/Standards.Space.rb +179 -116
  206. data/lib/openstudio-standards/standards/Standards.SpaceType.rb +23 -12
  207. data/lib/openstudio-standards/standards/Standards.SubSurface.rb +55 -25
  208. data/lib/openstudio-standards/standards/Standards.Surface.rb +57 -32
  209. data/lib/openstudio-standards/standards/Standards.ThermalZone.rb +157 -107
  210. data/lib/openstudio-standards/standards/Standards.WaterHeaterMixed.rb +9 -6
  211. data/lib/openstudio-standards/standards/Standards.ZoneHVACComponent.rb +52 -1
  212. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1.Standards.FanVariableVolume.rb +2 -2
  213. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1.rb +4 -0
  214. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.AirLoopHVAC.rb +28 -18
  215. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.FanVariableVolume.rb +1 -1
  216. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.PlantLoop.rb +4 -2
  217. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.rb +4 -0
  218. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/comstock_ashrae_90_1_2004/comstock_ashrae_90_1_2004.rb +4 -0
  219. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/comstock_ashrae_90_1_2004/data/ashrae_90_1.schedules.json +696 -2938
  220. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/comstock_ashrae_90_1_2004/data/comstock_ashrae_90_1_2004.ext_ltg.json +1 -1
  221. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/comstock_ashrae_90_1_2004/data/comstock_ashrae_90_1_2004.spc_typ.json +123 -123
  222. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.furnaces.json +26 -0
  223. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.prototype_inputs.json +11 -11
  224. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.refrigeration_system.json +0 -8
  225. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.spc_typ.json +395 -384
  226. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.unitary_acs.json +69 -0
  227. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.AirLoopHVAC.rb +20 -13
  228. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.FanVariableVolume.rb +1 -1
  229. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.Model.rb +1 -1
  230. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.rb +4 -0
  231. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/comstock_ashrae_90_1_2007/comstock_ashrae_90_1_2007.rb +4 -0
  232. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/comstock_ashrae_90_1_2007/data/ashrae_90_1.schedules.json +696 -2938
  233. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/comstock_ashrae_90_1_2007/data/comstock_ashrae_90_1_2007.ext_ltg.json +1 -1
  234. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/comstock_ashrae_90_1_2007/data/comstock_ashrae_90_1_2007.spc_typ.json +122 -122
  235. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.furnaces.json +26 -0
  236. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.prototype_inputs.json +11 -11
  237. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.refrigeration_system.json +0 -8
  238. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.spc_typ.json +413 -401
  239. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.unitary_acs.json +69 -0
  240. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.AirLoopHVAC.rb +42 -53
  241. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.AirTerminalSingleDuctVAVReheat.rb +3 -2
  242. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.CoolingTower.rb +5 -8
  243. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.FanVariableVolume.rb +1 -1
  244. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.Space.rb +6 -4
  245. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.rb +4 -0
  246. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/comstock_ashrae_90_1_2010/comstock_ashrae_90_1_2010.rb +4 -0
  247. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/comstock_ashrae_90_1_2010/data/ashrae_90_1.schedules.json +696 -2938
  248. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/comstock_ashrae_90_1_2010/data/comstock_ashrae_90_1_2010.ext_ltg.json +1 -1
  249. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/comstock_ashrae_90_1_2010/data/comstock_ashrae_90_1_2010.spc_typ.json +129 -129
  250. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.energy_recovery.json +210 -42
  251. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.furnaces.json +26 -0
  252. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.prototype_inputs.json +11 -11
  253. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.refrigeration_system.json +0 -8
  254. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.spc_typ.json +460 -320
  255. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.unitary_acs.json +69 -0
  256. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirLoopHVAC.rb +45 -51
  257. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirTerminalSingleDuctVAVReheat.rb +3 -2
  258. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.CoolingTower.rb +5 -8
  259. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.CoolingTowerVariableSpeed.rb +2 -3
  260. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.FanVariableVolume.rb +2 -2
  261. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.Space.rb +8 -5
  262. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.ThermalZone.rb +2 -1
  263. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.WaterHeaterMixed.rb +1 -1
  264. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.ZoneHVACComponent.rb +1 -0
  265. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.rb +4 -0
  266. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/comstock_ashrae_90_1_2013/comstock_ashrae_90_1_2013.rb +4 -0
  267. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/comstock_ashrae_90_1_2013/data/ashrae_90_1.schedules.json +696 -2938
  268. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/comstock_ashrae_90_1_2013/data/comstock_ashrae_90_1_2013.ext_ltg.json +1 -1
  269. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/comstock_ashrae_90_1_2013/data/comstock_ashrae_90_1_2013.spc_typ.json +121 -121
  270. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.energy_recovery.json +420 -84
  271. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.furnaces.json +26 -0
  272. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.prototype_inputs.json +12 -12
  273. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.refrigeration_system.json +0 -8
  274. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.spc_typ.json +475 -335
  275. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.unitary_acs.json +69 -0
  276. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.AirLoopHVAC.rb +40 -50
  277. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.AirTerminalSingleDuctVAVReheat.rb +3 -2
  278. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.CoolingTower.rb +5 -8
  279. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.CoolingTowerVariableSpeed.rb +2 -3
  280. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.FanVariableVolume.rb +2 -2
  281. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.Space.rb +8 -5
  282. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.ThermalZone.rb +2 -1
  283. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.ZoneHVACComponent.rb +1 -0
  284. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.rb +4 -0
  285. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/comstock_ashrae_90_1_2016/comstock_ashrae_90_1_2016.rb +4 -0
  286. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/comstock_ashrae_90_1_2016/data/ashrae_90_1.schedules.json +696 -2938
  287. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/comstock_ashrae_90_1_2016/data/comstock_ashrae_90_1_2016.ext_ltg.json +1 -1
  288. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/comstock_ashrae_90_1_2016/data/comstock_ashrae_90_1_2016.spc_typ.json +152 -128
  289. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.energy_recovery.json +488 -84
  290. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.furnaces.json +26 -0
  291. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.spc_typ.json +47 -47
  292. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.unitary_acs.json +69 -0
  293. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirLoopHVAC.rb +342 -56
  294. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirTerminalSingleDuctVAVReheat.rb +3 -2
  295. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.CoolingTower.rb +5 -8
  296. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.CoolingTowerVariableSpeed.rb +2 -3
  297. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.FanVariableVolume.rb +2 -2
  298. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Space.rb +25 -5
  299. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.ThermalZone.rb +2 -1
  300. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.ZoneHVACComponent.rb +30 -0
  301. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.rb +4 -0
  302. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/comstock_ashrae_90_1_2019/comstock_ashrae_90_1_2019.rb +4 -0
  303. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/comstock_ashrae_90_1_2019/data/ashrae_90_1.schedules.json +696 -2938
  304. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/comstock_ashrae_90_1_2019/data/comstock_ashrae_90_1_2019.ext_ltg.json +1 -1
  305. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/comstock_ashrae_90_1_2019/data/comstock_ashrae_90_1_2019.spc_typ.json +151 -127
  306. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.boilers.json +1 -1
  307. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.energy_recovery.json +2307 -101
  308. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.furnaces.json +26 -0
  309. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.refrigeration_compressors.json +1 -1
  310. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.spc_typ.json +47 -47
  311. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.unitary_acs.json +69 -0
  312. data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.curves.json +25 -0
  313. data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.schedules.json +286 -224
  314. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/comstock_doe_ref_1980_2004/comstock_doe_ref_1980_2004.rb +4 -0
  315. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/comstock_doe_ref_1980_2004/data/ashrae_90_1.schedules.json +696 -2938
  316. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/comstock_doe_ref_1980_2004/data/comstock_doe_ref_1980_2004.ext_ltg.json +1 -1
  317. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/comstock_doe_ref_1980_2004/data/comstock_doe_ref_1980_2004.spc_typ.json +126 -126
  318. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.furnaces.json +26 -0
  319. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.prototype_inputs.json +11 -11
  320. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.refrigeration_system.json +0 -8
  321. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.spc_typ.json +405 -393
  322. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.AirLoopHVAC.rb +15 -11
  323. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.Model.rb +1 -1
  324. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.PlantLoop.rb +3 -0
  325. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.rb +4 -0
  326. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/comstock_doe_ref_pre_1980/comstock_doe_ref_pre_1980.rb +4 -0
  327. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/comstock_doe_ref_pre_1980/data/ashrae_90_1.schedules.json +696 -2938
  328. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/comstock_doe_ref_pre_1980/data/comstock_doe_ref_pre_1980.spc_typ.json +121 -121
  329. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.furnaces.json +37 -0
  330. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.prototype_inputs.json +11 -11
  331. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.refrigeration_system.json +0 -8
  332. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.spc_typ.json +403 -391
  333. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.AirLoopHVAC.rb +15 -11
  334. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.Model.rb +1 -1
  335. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.PlantLoop.rb +3 -0
  336. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.rb +4 -0
  337. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/data/nrel_zne_ready_2017.furnaces.json +15 -0
  338. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.AirLoopHVAC.rb +64 -42
  339. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.AirTerminalSingleDuctVAVReheat.rb +3 -2
  340. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.CoolingTower.rb +5 -8
  341. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.CoolingTowerVariableSpeed.rb +2 -3
  342. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.FanVariableVolume.rb +2 -2
  343. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.HeatExchangerSensLat.rb +1 -1
  344. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.Model.rb +1 -1
  345. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.PlantLoop.rb +4 -1
  346. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.Space.rb +5 -3
  347. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.ZoneHVACComponent.rb +3 -0
  348. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.rb +4 -0
  349. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.furnaces.json +15 -0
  350. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirLoopHVAC.rb +61 -36
  351. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirTerminalSingleDuctVAVReheat.rb +3 -2
  352. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.CoolingTower.rb +5 -8
  353. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.CoolingTowerVariableSpeed.rb +2 -3
  354. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.FanVariableVolume.rb +2 -2
  355. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.HeatExchangerSensLat.rb +1 -1
  356. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.Model.rb +1 -1
  357. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.PlantLoop.rb +4 -1
  358. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.Space.rb +6 -4
  359. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.ZoneHVACComponent.rb +3 -0
  360. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.rb +4 -0
  361. data/lib/openstudio-standards/standards/cbes/cbes.AirLoopHVAC.rb +20 -14
  362. data/lib/openstudio-standards/standards/cbes/cbes.PlantLoop.rb +3 -0
  363. data/lib/openstudio-standards/standards/cbes/cbes.rb +4 -0
  364. data/lib/openstudio-standards/standards/cbes/cbes_pre_1978/cbes_pre_1978.rb +4 -0
  365. data/lib/openstudio-standards/standards/cbes/cbes_t24_1978/cbes_t24_1978.rb +4 -0
  366. data/lib/openstudio-standards/standards/cbes/cbes_t24_1992/cbes_t24_1992.rb +4 -0
  367. data/lib/openstudio-standards/standards/cbes/cbes_t24_2001/cbes_t24_2001.rb +4 -0
  368. data/lib/openstudio-standards/standards/cbes/cbes_t24_2005/cbes_t24_2005.rb +4 -0
  369. data/lib/openstudio-standards/standards/cbes/cbes_t24_2008/cbes_t24_2008.rb +4 -0
  370. data/lib/openstudio-standards/standards/deer/deer.AirLoopHVAC.rb +10 -5
  371. data/lib/openstudio-standards/standards/deer/deer.PlanarSurface.rb +1 -1
  372. data/lib/openstudio-standards/standards/deer/deer.rb +4 -0
  373. data/lib/openstudio-standards/standards/deer/deer_1985/comstock_deer_1985/comstock_deer_1985.rb +4 -0
  374. data/lib/openstudio-standards/standards/deer/deer_1985/comstock_deer_1985/data/comstock_deer_1985.ext_ltg.json +2 -2
  375. data/lib/openstudio-standards/standards/deer/deer_1985/deer_1985.rb +4 -0
  376. data/lib/openstudio-standards/standards/deer/deer_1996/comstock_deer_1996/comstock_deer_1996.rb +4 -0
  377. data/lib/openstudio-standards/standards/deer/deer_1996/comstock_deer_1996/data/comstock_deer_1996.ext_ltg.json +2 -2
  378. data/lib/openstudio-standards/standards/deer/deer_1996/deer_1996.rb +4 -0
  379. data/lib/openstudio-standards/standards/deer/deer_2003/comstock_deer_2003/comstock_deer_2003.rb +4 -0
  380. data/lib/openstudio-standards/standards/deer/deer_2003/comstock_deer_2003/data/comstock_deer_2003.ext_ltg.json +2 -2
  381. data/lib/openstudio-standards/standards/deer/deer_2003/deer_2003.rb +4 -0
  382. data/lib/openstudio-standards/standards/deer/deer_2007/comstock_deer_2007/comstock_deer_2007.rb +4 -0
  383. data/lib/openstudio-standards/standards/deer/deer_2007/comstock_deer_2007/data/comstock_deer_2007.ext_ltg.json +2 -2
  384. data/lib/openstudio-standards/standards/deer/deer_2007/deer_2007.rb +4 -0
  385. data/lib/openstudio-standards/standards/deer/deer_2011/comstock_deer_2011/comstock_deer_2011.rb +4 -0
  386. data/lib/openstudio-standards/standards/deer/deer_2011/comstock_deer_2011/data/comstock_deer_2011.ext_ltg.json +2 -2
  387. data/lib/openstudio-standards/standards/deer/deer_2011/deer_2011.rb +4 -0
  388. data/lib/openstudio-standards/standards/deer/deer_2014/comstock_deer_2014/comstock_deer_2014.rb +4 -0
  389. data/lib/openstudio-standards/standards/deer/deer_2014/comstock_deer_2014/data/comstock_deer_2014.ext_ltg.json +2 -2
  390. data/lib/openstudio-standards/standards/deer/deer_2014/deer_2014.Space.rb +5 -3
  391. data/lib/openstudio-standards/standards/deer/deer_2014/deer_2014.rb +4 -0
  392. data/lib/openstudio-standards/standards/deer/deer_2015/comstock_deer_2015/comstock_deer_2015.rb +4 -0
  393. data/lib/openstudio-standards/standards/deer/deer_2015/comstock_deer_2015/data/comstock_deer_2015.ext_ltg.json +2 -2
  394. data/lib/openstudio-standards/standards/deer/deer_2015/deer_2015.Space.rb +5 -3
  395. data/lib/openstudio-standards/standards/deer/deer_2015/deer_2015.rb +4 -0
  396. data/lib/openstudio-standards/standards/deer/deer_2017/comstock_deer_2017/comstock_deer_2017.rb +4 -0
  397. data/lib/openstudio-standards/standards/deer/deer_2017/comstock_deer_2017/data/comstock_deer_2017.ext_ltg.json +2 -2
  398. data/lib/openstudio-standards/standards/deer/deer_2017/deer_2017.Space.rb +5 -3
  399. data/lib/openstudio-standards/standards/deer/deer_2017/deer_2017.rb +4 -0
  400. data/lib/openstudio-standards/standards/deer/deer_2020/comstock_deer_2020/comstock_deer_2020.rb +4 -0
  401. data/lib/openstudio-standards/standards/deer/deer_2020/deer_2020.AirLoopHVAC.rb +9 -5
  402. data/lib/openstudio-standards/standards/deer/deer_2020/deer_2020.FanVariableVolume.rb +3 -0
  403. data/lib/openstudio-standards/standards/deer/deer_2020/deer_2020.Space.rb +5 -3
  404. data/lib/openstudio-standards/standards/deer/deer_2020/deer_2020.rb +4 -0
  405. data/lib/openstudio-standards/standards/deer/deer_2025/comstock_deer_2025/comstock_deer_2025.rb +4 -0
  406. data/lib/openstudio-standards/standards/deer/deer_2025/deer_2025.AirLoopHVAC.rb +9 -5
  407. data/lib/openstudio-standards/standards/deer/deer_2025/deer_2025.FanVariableVolume.rb +3 -0
  408. data/lib/openstudio-standards/standards/deer/deer_2025/deer_2025.Space.rb +5 -3
  409. data/lib/openstudio-standards/standards/deer/deer_2025/deer_2025.rb +4 -0
  410. data/lib/openstudio-standards/standards/deer/deer_2030/comstock_deer_2030/comstock_deer_2030.rb +4 -0
  411. data/lib/openstudio-standards/standards/deer/deer_2030/deer_2030.AirLoopHVAC.rb +9 -5
  412. data/lib/openstudio-standards/standards/deer/deer_2030/deer_2030.FanVariableVolume.rb +3 -0
  413. data/lib/openstudio-standards/standards/deer/deer_2030/deer_2030.Space.rb +5 -3
  414. data/lib/openstudio-standards/standards/deer/deer_2030/deer_2030.rb +4 -0
  415. data/lib/openstudio-standards/standards/deer/deer_2035/comstock_deer_2035/comstock_deer_2035.rb +4 -0
  416. data/lib/openstudio-standards/standards/deer/deer_2035/deer_2035.AirLoopHVAC.rb +9 -5
  417. data/lib/openstudio-standards/standards/deer/deer_2035/deer_2035.FanVariableVolume.rb +3 -0
  418. data/lib/openstudio-standards/standards/deer/deer_2035/deer_2035.Space.rb +5 -3
  419. data/lib/openstudio-standards/standards/deer/deer_2035/deer_2035.rb +4 -0
  420. data/lib/openstudio-standards/standards/deer/deer_2040/comstock_deer_2040/comstock_deer_2040.rb +4 -0
  421. data/lib/openstudio-standards/standards/deer/deer_2040/deer_2040.AirLoopHVAC.rb +9 -5
  422. data/lib/openstudio-standards/standards/deer/deer_2040/deer_2040.FanVariableVolume.rb +3 -0
  423. data/lib/openstudio-standards/standards/deer/deer_2040/deer_2040.Space.rb +5 -3
  424. data/lib/openstudio-standards/standards/deer/deer_2040/deer_2040.rb +4 -0
  425. data/lib/openstudio-standards/standards/deer/deer_2045/comstock_deer_2045/comstock_deer_2045.rb +4 -0
  426. data/lib/openstudio-standards/standards/deer/deer_2045/deer_2045.AirLoopHVAC.rb +9 -5
  427. data/lib/openstudio-standards/standards/deer/deer_2045/deer_2045.FanVariableVolume.rb +3 -0
  428. data/lib/openstudio-standards/standards/deer/deer_2045/deer_2045.Space.rb +5 -3
  429. data/lib/openstudio-standards/standards/deer/deer_2045/deer_2045.rb +4 -0
  430. data/lib/openstudio-standards/standards/deer/deer_2050/comstock_deer_2050/comstock_deer_2050.rb +4 -0
  431. data/lib/openstudio-standards/standards/deer/deer_2050/deer_2050.AirLoopHVAC.rb +9 -5
  432. data/lib/openstudio-standards/standards/deer/deer_2050/deer_2050.FanVariableVolume.rb +3 -0
  433. data/lib/openstudio-standards/standards/deer/deer_2050/deer_2050.Space.rb +5 -3
  434. data/lib/openstudio-standards/standards/deer/deer_2050/deer_2050.rb +4 -0
  435. data/lib/openstudio-standards/standards/deer/deer_2055/comstock_deer_2055/comstock_deer_2055.rb +4 -0
  436. data/lib/openstudio-standards/standards/deer/deer_2055/deer_2055.AirLoopHVAC.rb +9 -5
  437. data/lib/openstudio-standards/standards/deer/deer_2055/deer_2055.FanVariableVolume.rb +3 -0
  438. data/lib/openstudio-standards/standards/deer/deer_2055/deer_2055.Space.rb +5 -3
  439. data/lib/openstudio-standards/standards/deer/deer_2055/deer_2055.rb +4 -0
  440. data/lib/openstudio-standards/standards/deer/deer_2060/comstock_deer_2060/comstock_deer_2060.rb +4 -0
  441. data/lib/openstudio-standards/standards/deer/deer_2060/deer_2060.AirLoopHVAC.rb +9 -5
  442. data/lib/openstudio-standards/standards/deer/deer_2060/deer_2060.FanVariableVolume.rb +3 -0
  443. data/lib/openstudio-standards/standards/deer/deer_2060/deer_2060.Space.rb +5 -3
  444. data/lib/openstudio-standards/standards/deer/deer_2060/deer_2060.rb +4 -0
  445. data/lib/openstudio-standards/standards/deer/deer_2065/comstock_deer_2065/comstock_deer_2065.rb +4 -0
  446. data/lib/openstudio-standards/standards/deer/deer_2065/deer_2065.AirLoopHVAC.rb +9 -5
  447. data/lib/openstudio-standards/standards/deer/deer_2065/deer_2065.FanVariableVolume.rb +3 -0
  448. data/lib/openstudio-standards/standards/deer/deer_2065/deer_2065.Space.rb +5 -3
  449. data/lib/openstudio-standards/standards/deer/deer_2065/deer_2065.rb +4 -0
  450. data/lib/openstudio-standards/standards/deer/deer_2070/comstock_deer_2070/comstock_deer_2070.rb +4 -0
  451. data/lib/openstudio-standards/standards/deer/deer_2070/deer_2070.AirLoopHVAC.rb +9 -5
  452. data/lib/openstudio-standards/standards/deer/deer_2070/deer_2070.FanVariableVolume.rb +3 -0
  453. data/lib/openstudio-standards/standards/deer/deer_2070/deer_2070.Space.rb +5 -3
  454. data/lib/openstudio-standards/standards/deer/deer_2070/deer_2070.rb +4 -0
  455. data/lib/openstudio-standards/standards/deer/deer_2075/comstock_deer_2075/comstock_deer_2075.rb +4 -0
  456. data/lib/openstudio-standards/standards/deer/deer_2075/deer_2075.AirLoopHVAC.rb +9 -5
  457. data/lib/openstudio-standards/standards/deer/deer_2075/deer_2075.FanVariableVolume.rb +3 -0
  458. data/lib/openstudio-standards/standards/deer/deer_2075/deer_2075.Space.rb +5 -3
  459. data/lib/openstudio-standards/standards/deer/deer_2075/deer_2075.rb +4 -0
  460. data/lib/openstudio-standards/standards/deer/deer_pre_1975/comstock_deer_pre_1975/comstock_deer_pre_1975.rb +4 -0
  461. data/lib/openstudio-standards/standards/deer/deer_pre_1975/comstock_deer_pre_1975/data/comstock_deer_pre_1975.ext_ltg.json +2 -2
  462. data/lib/openstudio-standards/standards/deer/deer_pre_1975/deer_pre_1975.rb +4 -0
  463. data/lib/openstudio-standards/standards/icc_iecc/icc_iecc_2015/icc_iecc_2015.rb +4 -0
  464. data/lib/openstudio-standards/standards/necb/BTAP1980TO2010/btap_1980to2010.rb +6 -28
  465. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/btap_pre1980.rb +25 -110
  466. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/building_envelope.rb +45 -60
  467. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_3_and_8_single_speed.rb +19 -23
  468. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_4.rb +84 -83
  469. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_6.rb +52 -47
  470. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_systems.rb +43 -40
  471. data/lib/openstudio-standards/standards/necb/ECMS/data/boiler_set.json +18 -0
  472. data/lib/openstudio-standards/standards/necb/ECMS/data/chiller_set.json +211 -0
  473. data/lib/openstudio-standards/standards/necb/ECMS/data/curves.json +1195 -20
  474. data/lib/openstudio-standards/standards/necb/ECMS/data/furnace_set.json +18 -0
  475. data/lib/openstudio-standards/standards/necb/ECMS/data/heat_pumps.json +244 -182
  476. data/lib/openstudio-standards/standards/necb/ECMS/data/heat_pumps_heating.json +232 -185
  477. data/lib/openstudio-standards/standards/necb/ECMS/data/shw_set.json +20 -2
  478. data/lib/openstudio-standards/standards/necb/ECMS/ecms.rb +18 -25
  479. data/lib/openstudio-standards/standards/necb/ECMS/erv.rb +12 -13
  480. data/lib/openstudio-standards/standards/necb/ECMS/hvac_systems.rb +1647 -466
  481. data/lib/openstudio-standards/standards/necb/ECMS/loads.rb +93 -0
  482. data/lib/openstudio-standards/standards/necb/ECMS/nv.rb +40 -47
  483. data/lib/openstudio-standards/standards/necb/ECMS/pv_ground.rb +26 -25
  484. data/lib/openstudio-standards/standards/necb/NECB2011/autozone.rb +303 -305
  485. data/lib/openstudio-standards/standards/necb/NECB2011/beps_compliance_path.rb +45 -45
  486. data/lib/openstudio-standards/standards/necb/NECB2011/building_envelope.rb +90 -120
  487. data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/Hospital.osm +1176 -1115
  488. data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/LowriseApartment.osm +8279 -28923
  489. data/lib/openstudio-standards/standards/necb/NECB2011/data/space_types.json +1173 -1173
  490. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_1_multi_speed.rb +15 -13
  491. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_1_single_speed.rb +32 -29
  492. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_2_and_5.rb +25 -26
  493. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_3_and_8_multi_speed.rb +14 -14
  494. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_3_and_8_single_speed.rb +24 -29
  495. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_4.rb +85 -84
  496. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_6.rb +41 -42
  497. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_systems.rb +209 -197
  498. data/lib/openstudio-standards/standards/necb/NECB2011/lighting.rb +87 -82
  499. data/lib/openstudio-standards/standards/necb/NECB2011/necb_2011.rb +510 -406
  500. data/lib/openstudio-standards/standards/necb/NECB2011/nv.md +3 -3
  501. data/lib/openstudio-standards/standards/necb/NECB2011/qaqc/necb_qaqc.rb +686 -683
  502. data/lib/openstudio-standards/standards/necb/NECB2011/service_water_heating.rb +129 -82
  503. data/lib/openstudio-standards/standards/necb/NECB2015/data/space_types.json +1608 -1608
  504. data/lib/openstudio-standards/standards/necb/NECB2015/hvac_systems.rb +25 -18
  505. data/lib/openstudio-standards/standards/necb/NECB2015/lighting.rb +73 -67
  506. data/lib/openstudio-standards/standards/necb/NECB2015/necb_2015.rb +18 -22
  507. data/lib/openstudio-standards/standards/necb/NECB2015/qaqc/necb_2015_qaqc.rb +59 -63
  508. data/lib/openstudio-standards/standards/necb/NECB2017/data/space_types.json +1608 -1608
  509. data/lib/openstudio-standards/standards/necb/NECB2017/hvac_systems.rb +1 -4
  510. data/lib/openstudio-standards/standards/necb/NECB2017/necb_2017.rb +10 -14
  511. data/lib/openstudio-standards/standards/necb/NECB2020/building_envelope.rb +779 -0
  512. data/lib/openstudio-standards/standards/necb/NECB2020/data/boilers.json +122 -0
  513. data/lib/openstudio-standards/standards/necb/NECB2020/data/chillers.json +335 -0
  514. data/lib/openstudio-standards/standards/necb/NECB2020/data/constants.json +13 -0
  515. data/lib/openstudio-standards/standards/necb/NECB2020/data/furnaces.json +41 -0
  516. data/lib/openstudio-standards/standards/necb/NECB2020/data/heat_pumps.json +452 -0
  517. data/lib/openstudio-standards/standards/necb/NECB2020/data/heat_pumps_heating.json +164 -0
  518. data/lib/openstudio-standards/standards/necb/NECB2020/data/heat_rejection.json +228 -0
  519. data/lib/openstudio-standards/standards/necb/NECB2020/data/led_lighting_data.json +2883 -0
  520. data/lib/openstudio-standards/standards/necb/NECB2020/data/space_types.json +25851 -0
  521. data/lib/openstudio-standards/standards/necb/NECB2020/data/surface_thermal_transmittance.json +60 -0
  522. data/lib/openstudio-standards/standards/necb/NECB2020/data/unitary_acs.json +585 -0
  523. data/lib/openstudio-standards/standards/necb/NECB2020/necb_2020.rb +175 -0
  524. data/lib/openstudio-standards/standards/necb/common/bc_step_code_indicators.md +10 -0
  525. data/lib/openstudio-standards/standards/necb/common/btap_data.rb +1963 -0
  526. data/lib/openstudio-standards/standards/necb/common/btap_datapoint.rb +410 -0
  527. data/lib/openstudio-standards/standards/necb/common/neb_end_use_prices.csv +42 -0
  528. data/lib/openstudio-standards/standards/necb/common/necb_reference_runs.csv +28705 -0
  529. data/lib/openstudio-standards/standards/necb/common/phius.md +23 -0
  530. data/lib/openstudio-standards/standards/necb/common/space_type_upgrade_map.json +1158 -386
  531. data/lib/openstudio-standards/standards/oeesc/oeesc_2014/oeesc_2014.rb +4 -0
  532. data/lib/openstudio-standards/standards/standard.rb +2 -1
  533. data/lib/openstudio-standards/utilities/define_thermal_zone_and_mulitpliers.rb +1 -1
  534. data/lib/openstudio-standards/utilities/logging.rb +6 -0
  535. data/lib/openstudio-standards/utilities/simulation.rb +30 -14
  536. data/lib/openstudio-standards/utilities/{speacetype_map_converter.rb → spacetype_map_converter.rb} +0 -0
  537. data/lib/openstudio-standards/utilities/sqlfile.rb +112 -71
  538. data/lib/openstudio-standards/version.rb +2 -2
  539. data/lib/openstudio-standards/weather/Weather.Model.rb +209 -9
  540. data/lib/openstudio-standards/weather/Weather.stat_file.rb +1 -1
  541. data/lib/openstudio-standards.rb +9 -0
  542. metadata +106 -205
  543. data/data/standards/OpenStudio_Standards-ashrae_90_1-ALL-comstock(space_types).xlsx +0 -0
  544. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.boilers.json +0 -49
  545. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.chillers.json +0 -293
  546. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.construction_properties.json +0 -25426
  547. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.construction_sets.json +0 -1600
  548. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.economizers.json +0 -564
  549. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.elevators.json +0 -349
  550. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.ext_ltg.json +0 -164
  551. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.ground_temperatures.json +0 -10663
  552. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.heat_pumps.json +0 -508
  553. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.heat_pumps_heating.json +0 -156
  554. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.heat_rejection.json +0 -44
  555. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.motors.json +0 -184
  556. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.prototype_inputs.json +0 -3094
  557. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.ref_cases.json +0 -829
  558. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.ref_lnup.json +0 -562
  559. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.refrigeration_compressors.json +0 -52
  560. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.refrigeration_condenser.json +0 -220
  561. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.refrigeration_system.json +0 -156
  562. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.refrigeration_walkins.json +0 -1316
  563. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.spc_typ.json +0 -21446
  564. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.unitary_acs.json +0 -554
  565. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.water_heaters.json +0 -68
  566. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.water_source_heat_pumps.json +0 -28
  567. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.water_source_heat_pumps_heating.json +0 -12
  568. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.boilers.json +0 -49
  569. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.chillers.json +0 -293
  570. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.construction_properties.json +0 -12487
  571. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.construction_sets.json +0 -1600
  572. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.economizers.json +0 -564
  573. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.elevators.json +0 -349
  574. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.ext_ltg.json +0 -164
  575. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.ground_temperatures.json +0 -10663
  576. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.heat_pumps.json +0 -466
  577. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.heat_pumps_heating.json +0 -137
  578. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.heat_rejection.json +0 -44
  579. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.motors.json +0 -184
  580. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.prototype_inputs.json +0 -3094
  581. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.ref_cases.json +0 -829
  582. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.ref_lnup.json +0 -562
  583. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.refrigeration_compressors.json +0 -52
  584. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.refrigeration_condenser.json +0 -220
  585. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.refrigeration_system.json +0 -156
  586. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.refrigeration_walkins.json +0 -1316
  587. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.spc_typ.json +0 -21380
  588. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.unitary_acs.json +0 -554
  589. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.water_heaters.json +0 -68
  590. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.water_source_heat_pumps.json +0 -28
  591. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.water_source_heat_pumps_heating.json +0 -12
  592. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.boilers.json +0 -49
  593. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.chillers.json +0 -395
  594. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.construction_properties.json +0 -12487
  595. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.construction_sets.json +0 -1600
  596. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.economizers.json +0 -592
  597. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.elevators.json +0 -349
  598. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.energy_recovery.json +0 -550
  599. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.ext_ltg.json +0 -164
  600. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.ground_temperatures.json +0 -10663
  601. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.heat_pumps.json +0 -466
  602. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.heat_pumps_heating.json +0 -137
  603. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.heat_rejection.json +0 -44
  604. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.motors.json +0 -238
  605. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.prototype_inputs.json +0 -3094
  606. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.ref_cases.json +0 -829
  607. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.ref_lnup.json +0 -562
  608. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.refrigeration_compressors.json +0 -52
  609. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.refrigeration_condenser.json +0 -220
  610. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.refrigeration_system.json +0 -156
  611. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.refrigeration_walkins.json +0 -1316
  612. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.spc_typ.json +0 -21548
  613. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.unitary_acs.json +0 -554
  614. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.water_heaters.json +0 -68
  615. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.water_source_heat_pumps.json +0 -28
  616. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.water_source_heat_pumps_heating.json +0 -12
  617. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.boilers.json +0 -64
  618. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.chillers.json +0 -871
  619. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.construction_properties.json +0 -12487
  620. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.construction_sets.json +0 -1600
  621. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.economizers.json +0 -592
  622. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.elevators.json +0 -349
  623. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.energy_recovery.json +0 -1096
  624. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.ext_ltg.json +0 -164
  625. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.ground_temperatures.json +0 -10663
  626. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.heat_pumps.json +0 -886
  627. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.heat_pumps_heating.json +0 -194
  628. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.heat_rejection.json +0 -44
  629. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.motors.json +0 -247
  630. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.prototype_inputs.json +0 -3094
  631. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.ref_cases.json +0 -829
  632. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.ref_lnup.json +0 -562
  633. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.refrigeration_compressors.json +0 -52
  634. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.refrigeration_condenser.json +0 -220
  635. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.refrigeration_system.json +0 -156
  636. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.refrigeration_walkins.json +0 -1316
  637. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.spc_typ.json +0 -22079
  638. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.unitary_acs.json +0 -994
  639. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.water_heaters.json +0 -68
  640. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.water_source_heat_pumps.json +0 -28
  641. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.water_source_heat_pumps_heating.json +0 -12
  642. data/lib/openstudio-standards/utilities/convert_costing_constructions.rb +0 -105
@@ -1,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