openstudio-standards 0.3.0 → 0.3.1.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (226) hide show
  1. checksums.yaml +4 -4
  2. data/data/geometry/ASHRAESuperMarket.json +29 -38
  3. data/data/standards/OpenStudio_Standards-deer-ALL-comstock(space_types).xlsx +0 -0
  4. data/data/standards/metadata_units_OpenStudio_Standards-deer-ALL-comstockspace_types.csv +172 -0
  5. data/data/standards/test_performance_expected_dd_results.csv +12 -12
  6. data/lib/openstudio-standards/btap/analysis.rb +389 -389
  7. data/lib/openstudio-standards/btap/bridging.rb +2099 -0
  8. data/lib/openstudio-standards/btap/btap.model.rb +717 -717
  9. data/lib/openstudio-standards/btap/btap.rb +33 -30
  10. data/lib/openstudio-standards/btap/economics.rb +1163 -1163
  11. data/lib/openstudio-standards/btap/envelope.rb +4 -4
  12. data/lib/openstudio-standards/btap/equest.rb +2524 -2524
  13. data/lib/openstudio-standards/btap/fileio.rb +9 -0
  14. data/lib/openstudio-standards/btap/measures.rb +1515 -1515
  15. data/lib/openstudio-standards/btap/mpc.rb +554 -554
  16. data/lib/openstudio-standards/btap/reporting.rb +287 -287
  17. data/lib/openstudio-standards/btap/simmanager.rb +759 -759
  18. data/lib/openstudio-standards/btap/spaceloads.rb +439 -439
  19. data/lib/openstudio-standards/btap/spacetypes.rb +113 -113
  20. data/lib/openstudio-standards/btap/utilities.rb +134 -134
  21. data/lib/openstudio-standards/hvac_sizing/Siz.AirLoopHVAC.rb +8 -83
  22. data/lib/openstudio-standards/hvac_sizing/Siz.CoilCoolingWater.rb +3 -99
  23. data/lib/openstudio-standards/hvac_sizing/Siz.HeatingCoolingFuels.rb +81 -75
  24. data/lib/openstudio-standards/hvac_sizing/Siz.Model.rb +7 -306
  25. data/lib/openstudio-standards/hvac_sizing/Siz.ThermalZone.rb +70 -98
  26. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.Model.rb +41 -14
  27. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Model.rb +40 -14
  28. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SuperMarket.rb +1 -23
  29. data/lib/openstudio-standards/prototypes/common/objects/Prototype.ServiceWaterHeating.rb +93 -4
  30. data/lib/openstudio-standards/prototypes/common/objects/Prototype.hvac_systems.rb +13 -0
  31. data/lib/openstudio-standards/prototypes/common/objects/Prototype.refrigeration.rb +5 -4
  32. data/lib/openstudio-standards/prototypes/common/objects/Prototype.utilities.rb +24 -4
  33. data/lib/openstudio-standards/standards/Standards.AirLoopHVAC.rb +18 -2
  34. data/lib/openstudio-standards/standards/Standards.BoilerHotWater.rb +18 -0
  35. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXSingleSpeed.rb +13 -10
  36. data/lib/openstudio-standards/standards/Standards.CoilDX.rb +5 -3
  37. data/lib/openstudio-standards/standards/Standards.CoilHeatingDXSingleSpeed.rb +11 -8
  38. data/lib/openstudio-standards/standards/Standards.Construction.rb +1 -1
  39. data/lib/openstudio-standards/standards/Standards.Model.rb +68 -52
  40. data/lib/openstudio-standards/standards/Standards.PlantLoop.rb +2 -2
  41. data/lib/openstudio-standards/standards/Standards.Space.rb +16 -18
  42. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.ref_cases.json +510 -0
  43. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.refrigeration_compressors.json +18 -0
  44. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.refrigeration_walkins.json +410 -0
  45. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.spc_typ.json +2 -2
  46. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.ref_cases.json +510 -0
  47. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.refrigeration_compressors.json +18 -0
  48. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.refrigeration_walkins.json +410 -0
  49. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.spc_typ.json +2 -2
  50. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.ref_cases.json +510 -0
  51. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.refrigeration_compressors.json +18 -0
  52. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.refrigeration_walkins.json +410 -0
  53. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.spc_typ.json +2 -2
  54. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.ref_cases.json +510 -0
  55. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.refrigeration_compressors.json +18 -0
  56. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.refrigeration_walkins.json +410 -0
  57. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.spc_typ.json +2 -2
  58. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.spc_typ.json +2 -2
  59. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.spc_typ.json +2 -2
  60. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.AirLoopHVAC.rb +9 -0
  61. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.Model.rb +2 -0
  62. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.rb +4 -3
  63. data/lib/openstudio-standards/standards/deer/deer_1985/comstock_deer_1985/data/comstock_deer_1985.spc_typ.json +405 -405
  64. data/lib/openstudio-standards/standards/deer/deer_1996/comstock_deer_1996/data/comstock_deer_1996.spc_typ.json +405 -405
  65. data/lib/openstudio-standards/standards/deer/deer_2003/comstock_deer_2003/data/comstock_deer_2003.spc_typ.json +405 -405
  66. data/lib/openstudio-standards/standards/deer/deer_2003/deer_2003.ThermalZone.rb +21 -0
  67. data/lib/openstudio-standards/standards/deer/deer_2007/comstock_deer_2007/data/comstock_deer_2007.spc_typ.json +405 -405
  68. data/lib/openstudio-standards/standards/deer/deer_2007/deer_2007.ThermalZone.rb +21 -0
  69. data/lib/openstudio-standards/standards/deer/deer_2011/comstock_deer_2011/data/comstock_deer_2011.spc_typ.json +405 -405
  70. data/lib/openstudio-standards/standards/deer/deer_2011/deer_2011.ThermalZone.rb +21 -0
  71. data/lib/openstudio-standards/standards/deer/deer_2014/comstock_deer_2014/data/comstock_deer_2014.spc_typ.json +405 -405
  72. data/lib/openstudio-standards/standards/deer/deer_2014/deer_2014.ThermalZone.rb +21 -0
  73. data/lib/openstudio-standards/standards/deer/deer_2015/comstock_deer_2015/data/comstock_deer_2015.spc_typ.json +405 -405
  74. data/lib/openstudio-standards/standards/deer/deer_2015/deer_2015.ThermalZone.rb +21 -0
  75. data/lib/openstudio-standards/standards/deer/deer_2017/comstock_deer_2017/data/comstock_deer_2017.spc_typ.json +405 -405
  76. data/lib/openstudio-standards/standards/deer/deer_2017/deer_2017.ThermalZone.rb +21 -0
  77. data/lib/openstudio-standards/standards/deer/deer_2020/comstock_deer_2020/data/comstock_deer_2020.spc_typ.json +405 -405
  78. data/lib/openstudio-standards/standards/deer/deer_2020/deer_2020.AirLoopHVAC.rb +8 -0
  79. data/lib/openstudio-standards/standards/deer/deer_2020/deer_2020.ThermalZone.rb +21 -0
  80. data/lib/openstudio-standards/standards/deer/deer_2025/comstock_deer_2025/data/comstock_deer_2025.spc_typ.json +405 -405
  81. data/lib/openstudio-standards/standards/deer/deer_2030/comstock_deer_2030/data/comstock_deer_2030.spc_typ.json +405 -405
  82. data/lib/openstudio-standards/standards/deer/deer_2035/comstock_deer_2035/data/comstock_deer_2035.spc_typ.json +405 -405
  83. data/lib/openstudio-standards/standards/deer/deer_2040/comstock_deer_2040/data/comstock_deer_2040.spc_typ.json +405 -405
  84. data/lib/openstudio-standards/standards/deer/deer_2045/comstock_deer_2045/data/comstock_deer_2045.spc_typ.json +405 -405
  85. data/lib/openstudio-standards/standards/deer/deer_2050/comstock_deer_2050/data/comstock_deer_2050.spc_typ.json +405 -405
  86. data/lib/openstudio-standards/standards/deer/deer_2055/comstock_deer_2055/data/comstock_deer_2055.spc_typ.json +405 -405
  87. data/lib/openstudio-standards/standards/deer/deer_2060/comstock_deer_2060/data/comstock_deer_2060.spc_typ.json +405 -405
  88. data/lib/openstudio-standards/standards/deer/deer_2065/comstock_deer_2065/data/comstock_deer_2065.spc_typ.json +405 -405
  89. data/lib/openstudio-standards/standards/deer/deer_2070/comstock_deer_2070/data/comstock_deer_2070.spc_typ.json +405 -405
  90. data/lib/openstudio-standards/standards/deer/deer_2075/comstock_deer_2075/data/comstock_deer_2075.spc_typ.json +405 -405
  91. data/lib/openstudio-standards/standards/deer/deer_pre_1975/comstock_deer_pre_1975/data/comstock_deer_pre_1975.spc_typ.json +405 -405
  92. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/btap_pre1980.rb +1 -1
  93. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_3_and_8_single_speed.rb +3 -1
  94. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_4.rb +3 -1
  95. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_6.rb +2 -2
  96. data/lib/openstudio-standards/standards/necb/ECMS/data/curves.json +233 -0
  97. data/lib/openstudio-standards/standards/necb/ECMS/data/unitary_acs.json +180 -0
  98. data/lib/openstudio-standards/standards/necb/ECMS/ecms.rb +6 -1
  99. data/lib/openstudio-standards/standards/necb/ECMS/hvac_systems.rb +807 -258
  100. data/lib/openstudio-standards/standards/necb/NECB2011/autozone.rb +102 -66
  101. data/lib/openstudio-standards/standards/necb/NECB2011/data/fuel_type_sets.json +85 -8
  102. data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/HighriseApartment.osm +2483 -992
  103. data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/LowriseApartment.osm +4 -336
  104. data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/MidriseApartment.osm +228 -231
  105. data/lib/openstudio-standards/standards/necb/NECB2011/data/heat_pumps_heating.json +12 -18
  106. data/lib/openstudio-standards/standards/necb/NECB2011/data/space_type_unit_definitions.txt +76 -0
  107. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_1_multi_speed.rb +6 -1
  108. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_1_single_speed.rb +111 -24
  109. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_2_and_5.rb +1 -0
  110. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_3_and_8_multi_speed.rb +3 -1
  111. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_3_and_8_single_speed.rb +64 -16
  112. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_4.rb +61 -17
  113. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_6.rb +128 -0
  114. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_systems.rb +252 -23
  115. data/lib/openstudio-standards/standards/necb/NECB2011/necb_2011.rb +316 -20
  116. data/lib/openstudio-standards/standards/necb/NECB2011/qaqc/necb_qaqc.rb +1 -1
  117. data/lib/openstudio-standards/standards/necb/NECB2011/service_water_heating.rb +3 -5
  118. data/lib/openstudio-standards/standards/necb/NECB2011/system_fuels.rb +38 -0
  119. data/lib/openstudio-standards/standards/necb/NECB2015/data/heat_pumps_heating.json +16 -24
  120. data/lib/openstudio-standards/standards/necb/NECB2015/hvac_systems.rb +48 -25
  121. data/lib/openstudio-standards/standards/necb/NECB2020/building_envelope.rb +3 -3
  122. data/lib/openstudio-standards/standards/necb/NECB2020/data/chillers.json +36 -19
  123. data/lib/openstudio-standards/standards/necb/NECB2020/data/furnaces.json +19 -4
  124. data/lib/openstudio-standards/standards/necb/NECB2020/data/heat_pumps.json +20 -40
  125. data/lib/openstudio-standards/standards/necb/NECB2020/data/heat_pumps_heating.json +74 -36
  126. data/lib/openstudio-standards/standards/necb/NECB2020/necb_2020.rb +0 -2
  127. data/lib/openstudio-standards/standards/necb/NECB2020/service_water_heating.rb +123 -56
  128. data/lib/openstudio-standards/standards/necb/common/btap_data.rb +124 -2
  129. data/lib/openstudio-standards/standards/necb/common/btap_datapoint.rb +15 -2
  130. data/lib/openstudio-standards/standards/necb/common/necb_reference_runs.csv +1 -1
  131. data/lib/openstudio-standards/utilities/simulation.rb +1 -1
  132. data/lib/openstudio-standards/version.rb +1 -1
  133. data/lib/openstudio-standards/weather/Weather.stat_file.rb +33 -1
  134. data/lib/openstudio-standards.rb +1 -0
  135. metadata +14 -121
  136. data/data/standards/OpenStudio_Standards-ashrae_90_1.xlsx +0 -0
  137. data/data/weather/CAN_ON_Kingston.AP.718200_TMYx.2004-2018.ddy +0 -2342
  138. data/data/weather/CAN_ON_Kingston.AP.718200_TMYx.2004-2018.epw +0 -8768
  139. data/data/weather/CAN_ON_Kingston.AP.718200_TMYx.2004-2018.stat +0 -700
  140. data/data/weather/CAN_ON_Region.of.Waterloo.Intl.AP.713680_TMYx.2004-2018.ddy +0 -2342
  141. data/data/weather/CAN_ON_Region.of.Waterloo.Intl.AP.713680_TMYx.2004-2018.epw +0 -8768
  142. data/data/weather/CAN_ON_Region.of.Waterloo.Intl.AP.713680_TMYx.2004-2018.stat +0 -700
  143. data/data/weather/CAN_ON_Sarnia-Hadfield.AP.717040_TMYx.2004-2018.ddy +0 -2342
  144. data/data/weather/CAN_ON_Sarnia-Hadfield.AP.717040_TMYx.2004-2018.epw +0 -8768
  145. data/data/weather/CAN_ON_Sarnia-Hadfield.AP.717040_TMYx.2004-2018.stat +0 -700
  146. data/data/weather/CAN_QC_Gatineau.AP.716279_TMYx.2004-2018.ddy +0 -276
  147. data/data/weather/CAN_QC_Gatineau.AP.716279_TMYx.2004-2018.epw +0 -8768
  148. data/data/weather/CAN_QC_Gatineau.AP.716279_TMYx.2004-2018.stat +0 -611
  149. data/data/weather/CAN_QC_Granby.710367_TMYx.2004-2018.ddy +0 -276
  150. data/data/weather/CAN_QC_Granby.710367_TMYx.2004-2018.epw +0 -8768
  151. data/data/weather/CAN_QC_Granby.710367_TMYx.2004-2018.stat +0 -610
  152. data/data/weather/CAN_QC_Sherbrooke.AP.716100_TMYx.2004-2018.ddy +0 -2342
  153. data/data/weather/CAN_QC_Sherbrooke.AP.716100_TMYx.2004-2018.epw +0 -8768
  154. data/data/weather/CAN_QC_Sherbrooke.AP.716100_TMYx.2004-2018.stat +0 -700
  155. data/data/weather/CAN_QC_Trois.Rivieres.717240_TMYx.2004-2018.ddy +0 -2342
  156. data/data/weather/CAN_QC_Trois.Rivieres.717240_TMYx.2004-2018.epw +0 -8768
  157. data/data/weather/CAN_QC_Trois.Rivieres.717240_TMYx.2004-2018.stat +0 -700
  158. data/lib/openstudio-standards/hvac_sizing/Siz.AirConditionerVariableRefrigerantFlow.rb +0 -81
  159. data/lib/openstudio-standards/hvac_sizing/Siz.AirLoopHVACUnitaryHeatCoolVAVChngByp.rb +0 -27
  160. data/lib/openstudio-standards/hvac_sizing/Siz.AirLoopHVACUnitaryHeatPumpAirToAir.rb +0 -69
  161. data/lib/openstudio-standards/hvac_sizing/Siz.AirLoopHVACUnitaryHeatPumpAirToAirMultiSpeed.rb +0 -178
  162. data/lib/openstudio-standards/hvac_sizing/Siz.AirLoopHVACUnitarySystem.rb +0 -27
  163. data/lib/openstudio-standards/hvac_sizing/Siz.AirTermSnglDuctConstVolCooledBeam.rb +0 -27
  164. data/lib/openstudio-standards/hvac_sizing/Siz.AirTermSnglDuctConstVolFourPipeInduction.rb +0 -27
  165. data/lib/openstudio-standards/hvac_sizing/Siz.AirTermSnglDuctConstVolReheat.rb +0 -27
  166. data/lib/openstudio-standards/hvac_sizing/Siz.AirTermSnglDuctParallelPIUReheat.rb +0 -67
  167. data/lib/openstudio-standards/hvac_sizing/Siz.AirTermSnglDuctSeriesPIUReheat.rb +0 -27
  168. data/lib/openstudio-standards/hvac_sizing/Siz.AirTermSnglDuctUncontrolled.rb +0 -30
  169. data/lib/openstudio-standards/hvac_sizing/Siz.AirTermSnglDuctVAVHeatAndCoolNoReheat.rb +0 -27
  170. data/lib/openstudio-standards/hvac_sizing/Siz.AirTermSnglDuctVAVHeatAndCoolReheat.rb +0 -27
  171. data/lib/openstudio-standards/hvac_sizing/Siz.AirTermSnglDuctVAVNoReheat.rb +0 -68
  172. data/lib/openstudio-standards/hvac_sizing/Siz.AirTermSnglDuctVAVReheat.rb +0 -68
  173. data/lib/openstudio-standards/hvac_sizing/Siz.BoilerHotWater.rb +0 -42
  174. data/lib/openstudio-standards/hvac_sizing/Siz.BoilerSteam.rb +0 -27
  175. data/lib/openstudio-standards/hvac_sizing/Siz.ChillerElectricEIR.rb +0 -58
  176. data/lib/openstudio-standards/hvac_sizing/Siz.CoilCoolingDXMultiSpeed.rb +0 -171
  177. data/lib/openstudio-standards/hvac_sizing/Siz.CoilCoolingDXSingleSpeed.rb +0 -56
  178. data/lib/openstudio-standards/hvac_sizing/Siz.CoilCoolingDXTwoSpeed.rb +0 -89
  179. data/lib/openstudio-standards/hvac_sizing/Siz.CoilCoolingDXVariableRefrigerantFlow.rb +0 -50
  180. data/lib/openstudio-standards/hvac_sizing/Siz.CoilCoolingWaterToAirHeatPumpEquationFit.rb +0 -69
  181. data/lib/openstudio-standards/hvac_sizing/Siz.CoilHeatingDXMultiSpeed.rb +0 -120
  182. data/lib/openstudio-standards/hvac_sizing/Siz.CoilHeatingDXSingleSpeed.rb +0 -56
  183. data/lib/openstudio-standards/hvac_sizing/Siz.CoilHeatingDXVariableRefrigerantFlow.rb +0 -41
  184. data/lib/openstudio-standards/hvac_sizing/Siz.CoilHeatingDesuperheater.rb +0 -27
  185. data/lib/openstudio-standards/hvac_sizing/Siz.CoilHeatingElectric.rb +0 -30
  186. data/lib/openstudio-standards/hvac_sizing/Siz.CoilHeatingGas.rb +0 -30
  187. data/lib/openstudio-standards/hvac_sizing/Siz.CoilHeatingGasMultiStage.rb +0 -68
  188. data/lib/openstudio-standards/hvac_sizing/Siz.CoilHeatingWater.rb +0 -61
  189. data/lib/openstudio-standards/hvac_sizing/Siz.CoilHeatingWaterToAirHeatPumpEquationFit.rb +0 -57
  190. data/lib/openstudio-standards/hvac_sizing/Siz.CoilWaterHeatingDesuperheater.rb +0 -27
  191. data/lib/openstudio-standards/hvac_sizing/Siz.ControllerOutdoorAir.rb +0 -59
  192. data/lib/openstudio-standards/hvac_sizing/Siz.ControllerWaterCoil.rb +0 -49
  193. data/lib/openstudio-standards/hvac_sizing/Siz.CoolingTowerSingleSpeed.rb +0 -90
  194. data/lib/openstudio-standards/hvac_sizing/Siz.CoolingTowerTwoSpeed.rb +0 -83
  195. data/lib/openstudio-standards/hvac_sizing/Siz.CoolingTowerVariableSpeed.rb +0 -57
  196. data/lib/openstudio-standards/hvac_sizing/Siz.DistrictCooling.rb +0 -27
  197. data/lib/openstudio-standards/hvac_sizing/Siz.DistrictHeating.rb +0 -27
  198. data/lib/openstudio-standards/hvac_sizing/Siz.EvaporativeCoolerDirectResearchSpecial.rb +0 -27
  199. data/lib/openstudio-standards/hvac_sizing/Siz.EvaporativeCoolerIndirectResearchSpecial.rb +0 -27
  200. data/lib/openstudio-standards/hvac_sizing/Siz.EvaporativeFluidCoolerSingleSpeed.rb +0 -27
  201. data/lib/openstudio-standards/hvac_sizing/Siz.FanConstantVolume.rb +0 -29
  202. data/lib/openstudio-standards/hvac_sizing/Siz.FanOnOff.rb +0 -27
  203. data/lib/openstudio-standards/hvac_sizing/Siz.FanVariableVolume.rb +0 -29
  204. data/lib/openstudio-standards/hvac_sizing/Siz.HeaderedPumpsConstantSpeed.rb +0 -55
  205. data/lib/openstudio-standards/hvac_sizing/Siz.HeaderedPumpsVariableSpeed.rb +0 -55
  206. data/lib/openstudio-standards/hvac_sizing/Siz.HeatExchangerAirToAirSensibleAndLatent.rb +0 -38
  207. data/lib/openstudio-standards/hvac_sizing/Siz.HeatExchangerFluidToFluid.rb +0 -27
  208. data/lib/openstudio-standards/hvac_sizing/Siz.HumidifierSteamElectric.rb +0 -27
  209. data/lib/openstudio-standards/hvac_sizing/Siz.PlantLoop.rb +0 -42
  210. data/lib/openstudio-standards/hvac_sizing/Siz.PumpConstantSpeed.rb +0 -59
  211. data/lib/openstudio-standards/hvac_sizing/Siz.PumpVariableSpeed.rb +0 -59
  212. data/lib/openstudio-standards/hvac_sizing/Siz.SizingSystem.rb +0 -48
  213. data/lib/openstudio-standards/hvac_sizing/Siz.WaterHeaterMixed.rb +0 -16
  214. data/lib/openstudio-standards/hvac_sizing/Siz.ZoneHVACBaseboardConvectiveElectric.rb +0 -27
  215. data/lib/openstudio-standards/hvac_sizing/Siz.ZoneHVACBaseboardConvectiveWater.rb +0 -27
  216. data/lib/openstudio-standards/hvac_sizing/Siz.ZoneHVACFourPipeFanCoil.rb +0 -27
  217. data/lib/openstudio-standards/hvac_sizing/Siz.ZoneHVACHighTemperatureRadiant.rb +0 -27
  218. data/lib/openstudio-standards/hvac_sizing/Siz.ZoneHVACIdealLoadsAirSystem.rb +0 -27
  219. data/lib/openstudio-standards/hvac_sizing/Siz.ZoneHVACLowTempRadiantConstFlow.rb +0 -27
  220. data/lib/openstudio-standards/hvac_sizing/Siz.ZoneHVACLowTempRadiantVarFlow.rb +0 -27
  221. data/lib/openstudio-standards/hvac_sizing/Siz.ZoneHVACLowTemperatureRadiantElectric.rb +0 -27
  222. data/lib/openstudio-standards/hvac_sizing/Siz.ZoneHVACPackagedTerminalAirConditioner.rb +0 -88
  223. data/lib/openstudio-standards/hvac_sizing/Siz.ZoneHVACPackagedTerminalHeatPump.rb +0 -88
  224. data/lib/openstudio-standards/hvac_sizing/Siz.ZoneHVACTerminalUnitVariableRefrigerantFlow.rb +0 -104
  225. data/lib/openstudio-standards/hvac_sizing/Siz.ZoneHVACUnitHeater.rb +0 -27
  226. data/lib/openstudio-standards/hvac_sizing/Siz.ZoneHVACWaterToAirHeatPump.rb +0 -27
@@ -3,11 +3,13 @@
3
3
  class NECB2011 < Standard
4
4
  @template = new.class.name
5
5
  register_standard(@template)
6
+ attr_reader :tbd
6
7
  attr_reader :template
7
8
  attr_accessor :standards_data
8
9
  attr_accessor :space_type_map
9
10
  attr_accessor :space_multiplier_map
10
-
11
+ attr_accessor :fuel_type_set
12
+
11
13
  # This is a helper method to convert arguments that may support 'NECB_Default, and nils to convert to float'
12
14
  def convert_arg_to_f(variable:, default:)
13
15
  return variable if variable.kind_of?(Numeric)
@@ -119,6 +121,7 @@ class NECB2011 < Standard
119
121
  @template = self.class.name
120
122
  @standards_data = load_standards_database_new
121
123
  corrupt_standards_database
124
+ @tbd = nil
122
125
  # puts "loaded these tables..."
123
126
  # puts @standards_data.keys.size
124
127
  # raise("tables not all loaded in parent #{}") if @standards_data.keys.size < 24
@@ -166,7 +169,7 @@ class NECB2011 < Standard
166
169
  return epw.hdd18.to_f
167
170
  else
168
171
  dist_clause = "%.2f % #{(min_distance / 1000.0)}"
169
- puts "INFO:NECB HDD18 of #{necb_closest['degree_days_below_18_c'].to_f} at nearest city #{necb_closest['city']},#{necb_closest['province']}, at a distance of " + dist_clause + 'km from epw location. Ref:necb_2015_table_c1'
172
+ puts "INFO:NECB HDD18 of #{necb_closest['degree_days_below_18_c'].to_f} at nearest city #{necb_closest['city']},#{necb_closest['province']}, at a distance of " + dist_clause + 'km from epw location. Ref: nbc_2015_table_c1'
170
173
  return necb_closest['degree_days_below_18_c'].to_f
171
174
  end
172
175
  end
@@ -177,7 +180,7 @@ class NECB2011 < Standard
177
180
  epw_file:,
178
181
  debug: false,
179
182
  sizing_run_dir: Dir.pwd,
180
- primary_heating_fuel: 'DefaultFuel',
183
+ primary_heating_fuel: 'Electricity',
181
184
  dcv_type: 'NECB_Default',
182
185
  lights_type: 'NECB_Default',
183
186
  lights_scale: 1.0,
@@ -227,10 +230,11 @@ class NECB2011 < Standard
227
230
  shw_scale: nil,
228
231
  output_meters: nil,
229
232
  airloop_economizer_type: nil,
230
- baseline_system_zones_map_option: nil)
231
-
233
+ baseline_system_zones_map_option: nil,
234
+ tbd_option: nil)
232
235
  model = load_building_type_from_library(building_type: building_type)
233
236
  return model_apply_standard(model: model,
237
+ tbd_option: tbd_option,
234
238
  epw_file: epw_file,
235
239
  sizing_run_dir: sizing_run_dir,
236
240
  primary_heating_fuel: primary_heating_fuel,
@@ -301,8 +305,11 @@ class NECB2011 < Standard
301
305
  # Created this method so that additional methods can be addded for bulding the prototype model in later
302
306
  # code versions without modifying the build_protoype_model method or copying it wholesale for a few changes.
303
307
  def model_apply_standard(model:,
308
+ tbd_option: nil,
304
309
  epw_file:,
305
310
  sizing_run_dir: Dir.pwd,
311
+ necb_reference_hp: false,
312
+ necb_reference_hp_supp_fuel: 'DefaultFuel',
306
313
  primary_heating_fuel: 'DefaultFuel',
307
314
  dcv_type: 'NECB_Default',
308
315
  lights_type: 'NECB_Default',
@@ -353,9 +360,9 @@ class NECB2011 < Standard
353
360
  shw_scale: nil,
354
361
  output_meters: nil,
355
362
  airloop_economizer_type: nil,
356
- baseline_system_zones_map_option: nil
357
- )
358
-
363
+ baseline_system_zones_map_option: nil)
364
+ self.fuel_type_set = SystemFuels.new()
365
+ self.fuel_type_set.set_defaults(standards_data: @standards_data, primary_heating_fuel: primary_heating_fuel)
359
366
  clean_and_scale_model(model: model, rotation_degrees: rotation_degrees, scale_x: scale_x, scale_y: scale_y, scale_z: scale_z)
360
367
  fdwr_set = convert_arg_to_f(variable: fdwr_set, default: -1)
361
368
  srr_set = convert_arg_to_f(variable: srr_set, default: -1)
@@ -386,13 +393,15 @@ class NECB2011 < Standard
386
393
  apply_fdwr_srr_daylighting(model: model,
387
394
  fdwr_set: fdwr_set,
388
395
  srr_set: srr_set)
396
+ apply_thermal_bridging(model: model, tbd_option: tbd_option)
389
397
  apply_auto_zoning(model: model,
390
398
  sizing_run_dir: sizing_run_dir,
391
399
  lights_type: lights_type,
392
400
  lights_scale: lights_scale)
401
+ apply_kiva_foundation(model)
393
402
  apply_systems_and_efficiencies(model: model,
394
- primary_heating_fuel: primary_heating_fuel,
395
403
  sizing_run_dir: sizing_run_dir,
404
+ primary_heating_fuel: primary_heating_fuel,
396
405
  dcv_type: dcv_type,
397
406
  ecm_system_name: ecm_system_name,
398
407
  ecm_system_zones_map_option: ecm_system_zones_map_option,
@@ -463,8 +472,8 @@ class NECB2011 < Standard
463
472
  end
464
473
 
465
474
  def apply_systems_and_efficiencies(model:,
466
- primary_heating_fuel:,
467
475
  sizing_run_dir:,
476
+ primary_heating_fuel:,
468
477
  dcv_type: 'NECB_Default',
469
478
  ecm_system_name: 'NECB_Default',
470
479
  ecm_system_zones_map_option: 'NECB_Default',
@@ -494,17 +503,25 @@ class NECB2011 < Standard
494
503
  # -------- Systems Layout-----------
495
504
 
496
505
  # Create Default Systems.
497
- apply_systems(model: model, primary_heating_fuel: primary_heating_fuel, sizing_run_dir: sizing_run_dir, shw_scale: shw_scale,
506
+ apply_systems(model: model,
507
+ primary_heating_fuel: primary_heating_fuel,
508
+ sizing_run_dir: sizing_run_dir,
509
+ shw_scale: shw_scale,
498
510
  baseline_system_zones_map_option: baseline_system_zones_map_option)
499
511
 
500
512
  # Apply new ECM system. Overwrite standard as required.
501
- ecm.apply_system_ecm(model: model, ecm_system_name: ecm_system_name, template_standard: self, primary_heating_fuel: primary_heating_fuel,
513
+ ecm.apply_system_ecm(model: model,
514
+ ecm_system_name: ecm_system_name,
515
+ template_standard: self,
516
+ primary_heating_fuel: self.fuel_type_set.ecm_fueltype,
502
517
  ecm_system_zones_map_option: ecm_system_zones_map_option)
503
518
 
504
519
  # -------- Performace, Efficiencies, Controls and Sensors ------------
505
520
  #
506
521
  # Set code standard equipment charecteristics.
507
- sql_db_vars_map = apply_standard_efficiencies(model: model, sizing_run_dir: sizing_run_dir)
522
+ sql_db_vars_map = apply_standard_efficiencies(model: model,
523
+ sizing_run_dir: sizing_run_dir,
524
+ necb_reference_hp: self.fuel_type_set.necb_reference_hp)
508
525
  # Apply System
509
526
  ecm.apply_system_efficiencies_ecm(model: model, ecm_system_name: ecm_system_name)
510
527
  # Apply ECM ERV charecteristics as required. Part 2 of above ECM.
@@ -515,8 +532,8 @@ class NECB2011 < Standard
515
532
  ecm.modify_boiler_efficiency(model: model, boiler_eff: boiler_eff)
516
533
  # Apply Furnace Efficiency
517
534
  ecm.modify_furnace_efficiency(model: model, furnace_eff: furnace_eff)
518
- # Apply Unitary efficiency
519
- ecm.modify_unitary_cop(model: model, unitary_cop: unitary_cop, sql_db_vars_map: sql_db_vars_map)
535
+ # Apply Unitary curves
536
+ ecm.modify_unitary_cop(model: model, unitary_cop: unitary_cop, sizing_done: false, sql_db_vars_map: sql_db_vars_map)
520
537
  # Apply SHW Efficiency
521
538
  ecm.modify_shw_efficiency(model: model, shw_eff: shw_eff)
522
539
  # Apply daylight controls.
@@ -525,6 +542,16 @@ class NECB2011 < Standard
525
542
  ecm.modify_chiller_efficiency(model: model, chiller_type: chiller_type)
526
543
  # Apply airloop economizer
527
544
  ecm.add_airloop_economizer(model: model, airloop_economizer_type: airloop_economizer_type)
545
+ # Perform a second sizing run if needed
546
+ if (!unitary_cop.nil? && unitary_cop != 'NECB_Default') || !model.getPlantLoops.empty?
547
+ if model_run_sizing_run(model, "#{sizing_run_dir}/SR2") == false
548
+ raise('sizing run 2 failed!')
549
+ end
550
+ end
551
+ # apply unitary cop
552
+ ecm.modify_unitary_cop(model: model, unitary_cop: unitary_cop, sizing_done: true, sql_db_vars_map: sql_db_vars_map)
553
+ # set capacities of district heating and cooling equipment for ground-source heat pump ecm
554
+ ecm.set_ghx_loop_district_cap(model) if (!model.getDistrictHeatings.empty? && !model.getDistrictCoolings.empty?)
528
555
 
529
556
  # -------Pump sizing required by some vintages----------------
530
557
  # Apply Pump power as required.
@@ -628,6 +655,224 @@ class NECB2011 < Standard
628
655
  model_create_thermal_zones(model, @space_multiplier_map)
629
656
  end
630
657
 
658
+ # apply the Kiva foundation model to floors and walls with ground boundary condition
659
+ # created by: Kamel Haddad (kamel.haddad@nrcan-rncan.gc.ca)
660
+ def apply_kiva_foundation(model)
661
+ # define a Kiva model for the whole bldg that's used for the first floor in contact with ground in each zone
662
+ bldg_kiva_model = OpenStudio::Model::FoundationKiva.new(model)
663
+ bldg_kiva_model.setName("Bldg Kiva Foundation")
664
+ bldg_kiva_model.setWallHeightAboveGrade(0.0)
665
+ bldg_kiva_model.setWallDepthBelowSlab(0.0)
666
+ model.getThermalZones.sort.each do |zone|
667
+ zone_kiva_models = [bldg_kiva_model]
668
+ zone_grd_flr_counter = 0
669
+ zone.spaces.sort.each do |space|
670
+ # store space floors and walls in contact with ground and exterior walls
671
+ space_ground_floors = []
672
+ space_ground_walls = []
673
+ space_ext_walls = []
674
+ space_ground_floors += space.surfaces.select {|surf| surf.surfaceType.downcase == 'floor' && surf.isGroundSurface }
675
+ space_ground_walls += space.surfaces.select {|surf| surf.surfaceType.downcase == 'wall' && surf.isGroundSurface }
676
+ space_ext_walls += space.surfaces.select {|surf| surf.surfaceType.downcase == 'wall' && surf.outsideBoundaryCondition.downcase == 'outdoors'}
677
+ # loop through space floors in contact with ground and assing a Kiva model for each
678
+ space_ground_floors.each do |gfloor|
679
+ zone_grd_flr_counter += 1
680
+ if zone_grd_flr_counter > 1
681
+ # a new Kiva model is needed for each additional floor in contact with the ground in the zone
682
+ kiva_model = OpenStudio::Model::FoundationKiva.new(model)
683
+ kiva_model.setName("#{gfloor.name.to_s} Kiva Foundation")
684
+ kiva_model.setWallHeightAboveGrade(0.0)
685
+ kiva_model.setWallDepthBelowSlab(0.0)
686
+ zone_kiva_models << kiva_model
687
+ end
688
+ # Kiva model only works with standard materials. Replace constructions massless materials with standard ones.
689
+ replace_massless_material_with_std_material(model,gfloor)
690
+ gfloor.setOutsideBoundaryCondition('Foundation')
691
+ gfloor.setAdjacentFoundation(zone_kiva_models.last)
692
+ # Set the exposed perimeter for space floors in contact with the ground.
693
+ floor_exp_per = 0.0
694
+ if !space_ground_walls.empty?
695
+ floor_exp_per += get_surface_exp_per(gfloor,space_ground_walls)
696
+ elsif !space_ext_walls.empty?
697
+ floor_exp_per += get_surface_exp_per(gfloor,space_ext_walls)
698
+ end
699
+ gfloor.createSurfacePropertyExposedFoundationPerimeter('TotalExposedPerimeter',floor_exp_per)
700
+ # specify a foundation boundary condition for space walls in contact with the ground and in
701
+ # contact with the space floor in contact with ground 'gfloor'
702
+ space_ground_walls.each do |gwall|
703
+ if surfaces_are_in_contact?(gfloor,gwall)
704
+ replace_massless_material_with_std_material(model,gwall)
705
+ gwall.setOutsideBoundaryCondition('Foundation')
706
+ gwall.setAdjacentFoundation(zone_kiva_models.last)
707
+ end
708
+ end
709
+ end
710
+ end
711
+ end
712
+ kiva_settings = model.getFoundationKivaSettings if !model.getFoundationKivas.empty?
713
+ end
714
+
715
+ # check if two surfaces are in contact. For every two consecutive vertices on surface 1,
716
+ # loop through two consecutive vertices of surface two. Then check whether the vertices
717
+ # of surfaces 2 are on the same line as the vertices from surface 1. If the two vectors
718
+ # defined by the two vertices on surface 1 and those on surface 2 overlap, then the two
719
+ # surfaces are in contact. If a side from surface 2 is in contact with a side from surface 1,
720
+ # the length of the side from surface 2 is limited to the length of the side from surface 1.
721
+ # created by: Kamel Haddad (kamel.haddad@nrcan-rncan.gc.ca)
722
+ def surfaces_are_in_contact?(surf1,surf2)
723
+ surfaces_in_contact = false
724
+ vert1 = surf1.vertices[0]
725
+ for index1 in 1..surf1.vertices.size
726
+ if index1 < surf1.vertices.size
727
+ vert2 = surf1.vertices[index1]
728
+ else
729
+ vert2 = surf1.vertices[0]
730
+ end
731
+ seg12_length = ((vert2.x-vert1.x)**2+(vert2.y-vert1.y)**2+(vert2.z-vert1.z)**2)**0.5
732
+ surf2_seg_length = 0.0
733
+ vert3 = surf2.vertices[0]
734
+ for index2 in 1..surf2.vertices.size
735
+ if index2 < surf2.vertices.size
736
+ vert4 = surf2.vertices[index2]
737
+ else
738
+ vert4 = surf2.vertices[0]
739
+ end
740
+ vert1_2_3_same_line_and_dir = three_vertices_same_line_and_dir?(vert1,vert2,vert3)
741
+ if vert1_2_3_same_line_and_dir
742
+ vert1_2_4_same_line_and_dir = three_vertices_same_line_and_dir?(vert1,vert2,vert4)
743
+ if vert1_2_4_same_line_and_dir
744
+ surfaces_in_contact = true
745
+ seg34_length = ((vert4.x-vert3.x)**2+(vert4.y-vert3.y)**2+(vert4.z-vert3.z)**2)**0.5
746
+ surf2_seg_length += seg34_length
747
+ raise("Surface #{surf2.name.to_s} has sides in contact with surface #{surf1.name.to_s} but with a length greater than the max.") if surf2_seg_length > seg12_length
748
+ end
749
+ end
750
+ vert3 = vert4
751
+ end
752
+ vert1 = vert2
753
+ end
754
+
755
+ return surfaces_in_contact
756
+ end
757
+
758
+ # Loop through the layers of the construction of the surface and replace any massless material with
759
+ # a standard one. The material used instead is from the EnergyPlus dataset file 'ASHRAE_2005_HOF_Materials.idf'
760
+ # with the name: 'Insulation: Expanded polystyrene - extruded (smooth skin surface) (HCFC-142b exp.)'.
761
+ # The thickness of the new material is based on the thermal resistance of the massless material it replaces.
762
+ # created by: Kamel Haddad (kamel.haddad@nrcan-rncan.gc.ca)
763
+ def replace_massless_material_with_std_material(model,surf)
764
+ std_const_name = "#{surf.construction.get.name.to_s}_std"
765
+ std_const = model.getLayeredConstructions.select {|const| const.name.to_s == std_const_name}
766
+ new_const = nil
767
+ if !std_const.empty?
768
+ new_const = std_const[0]
769
+ else
770
+ new_layers = {}
771
+ has_massless_mat = false
772
+ layer_index = 0
773
+ surf.construction.get.to_LayeredConstruction.get.layers.each do |layer|
774
+ if layer.to_MasslessOpaqueMaterial.is_initialized then
775
+ has_massless_mat = true
776
+ new_mat = OpenStudio::Model::StandardOpaqueMaterial.new(model)
777
+ new_mat.setName("Expanded Polystyrene")
778
+ new_mat.setThermalConductivity(0.029)
779
+ new_mat.setDensity(29.0)
780
+ new_mat.setSpecificHeat(1210.0)
781
+ new_mat.setRoughness('MediumSmooth')
782
+ new_mat.setThickness(layer.to_MasslessOpaqueMaterial.get.thermalResistance.to_f * new_mat.thermalConductivity.to_f)
783
+ else
784
+ new_mat = layer
785
+ end
786
+ new_layers[layer_index] = new_mat
787
+ layer_index += 1
788
+ end
789
+ if has_massless_mat
790
+ new_const = OpenStudio::Model::Construction.new(model)
791
+ new_layers.keys.sort.each {|layer_index| new_const.to_LayeredConstruction.get.insertLayer(layer_index,new_layers[layer_index])}
792
+ new_const.setName("#{surf.construction.get.name.to_s}_std")
793
+ end
794
+ end
795
+ surf.setConstruction(new_const) if !new_const.nil?
796
+
797
+ end
798
+
799
+ # Find the exposed perimeter of a floor surface. For each side of the floor loop through
800
+ # the walls and find the walls that share sides with the floor. Then sum the lengths of
801
+ # the sides of the walls that come in contact with sides of the floor.
802
+ # created by: Kamel Haddad (kamel.haddad@nrcan-rncan.gc.ca)
803
+ def get_surface_exp_per(floor,walls)
804
+ floor_exp_per = 0.0
805
+ vert1 = floor.vertices[0]
806
+ # loop through the indices of the floor surface
807
+ for index in 1..floor.vertices.size
808
+ if index < floor.vertices.size
809
+ vert2 = floor.vertices[index]
810
+ else
811
+ vert2 = floor.vertices[0]
812
+ end
813
+ side_length = ((vert2.x-vert1.x)**2+(vert2.y-vert1.y)**2+(vert2.z-vert1.z)**2)**0.5
814
+ walls_exp_per = 0.0
815
+ walls.each do |wall|
816
+ vert3 = wall.vertices[0]
817
+ # loop through the indices of the wall surface
818
+ for index2 in 1..wall.vertices.size-1
819
+ if index2 < wall.vertices.size
820
+ vert4 = wall.vertices[index2]
821
+ else
822
+ vert4 = wall.vertices[0]
823
+ end
824
+ vert1_2_3_on_same_line = three_vertices_same_line_and_dir?(vert1,vert2,vert3)
825
+ if vert1_2_3_on_same_line
826
+ vert1_2_4_on_same_line = three_vertices_same_line_and_dir?(vert1,vert2,vert4)
827
+ if vert1_2_4_on_same_line
828
+ wall_width = ((vert4.x-vert3.x)**2+(vert4.y-vert3.y)**2+(vert4.z-vert3.z)**2)**0.5
829
+ walls_exp_per += wall_width
830
+ end
831
+ end
832
+ vert3 = vert4
833
+ end
834
+ end
835
+ # increment the exposed perimeter of the floor. Limit the length of the walls in contact with the
836
+ # side of the floor to the length of the side of the floor.
837
+ floor_exp_per += [walls_exp_per,side_length].min
838
+ vert1 = vert2
839
+ end
840
+
841
+ return floor_exp_per
842
+ end
843
+
844
+ # check that three vertices are on the same line. Also check that the vectors
845
+ # from vert1 and vert2 and from vert1 and vert3 are in the same direction.
846
+ # created by: Kamel Haddad (kamel.haddad@nrcan-rncan.gc.ca)
847
+ def three_vertices_same_line_and_dir?(vert1,vert2,vert3)
848
+ tol = 1.0e-5
849
+ vec12x,vec12y,vec12z = -vert1.x+vert2.x,-vert1.y+vert2.y,-vert1.z+vert2.z # x,y,z of vector 12
850
+ vec12x = 0.0 if vec12x.abs < tol
851
+ vec12y = 0.0 if vec12y.abs < tol
852
+ vec12z = 0.0 if vec12z.abs < tol
853
+ vec13x,vec13y,vec13z = -vert1.x+vert3.x,-vert1.y+vert3.y,-vert1.z+vert3.z # x,y,z of vector 13
854
+ vec13x = 0.0 if vec13x.abs < tol
855
+ vec13y = 0.0 if vec13y.abs < tol
856
+ vec13z = 0.0 if vec13z.abs < tol
857
+ # x,y,z of the cross product of the vectors 12 and 13
858
+ cross_12_13_x = vec12y*vec13z-vec12z*vec13y
859
+ cross_12_13_y = vec12z*vec13x-vec12x*vec13z
860
+ cross_12_13_z = vec12x*vec13y-vec12y*vec13x
861
+ # vectors are in parallel when x,y,z of cross product are 0.0
862
+ vertices_on_same_line = false
863
+ vertices_on_same_line = true if (cross_12_13_x == 0.0) && (cross_12_13_y == 0.0) && (cross_12_13_z == 0.0)
864
+ vectors_same_direction = false
865
+ if vertices_on_same_line
866
+ vec12_13_x_factor = vec13x*vec12x
867
+ vec12_13_y_factor = vec13y*vec12y
868
+ vec12_13_z_factor = vec13z*vec12z
869
+ vectors_same_direction = true if (vec12_13_x_factor >= 0.0) && (vec12_13_y_factor >= 0.0) && (vec12_13_z_factor >= 0.0)
870
+ end
871
+ same_line_same_dir = vertices_on_same_line && vectors_same_direction
872
+
873
+ return same_line_same_dir
874
+ end
875
+
631
876
  # Thermal zones need to be set to determine conditioned spaces when applying fdwr and srr limits.
632
877
  # # fdwr_set/srr_set settings:
633
878
  # # 0-1: Remove all windows/skylights and add windows/skylights to match this fdwr/srr
@@ -647,19 +892,66 @@ class NECB2011 < Standard
647
892
  # model_add_daylighting_controls(model) # to be removed after refactor.
648
893
  end
649
894
 
650
- def apply_standard_efficiencies(model:, sizing_run_dir:, dcv_type: 'NECB_Default')
895
+ ##
896
+ # Optionally uprates, then derates, envelope surfaces due to MAJOR thermal
897
+ # bridges (e.g. roof parapets, corners, fenestration perimeters). See
898
+ # lib/openstudio-standards/btap/bridging.rb, which relies on the Thermal
899
+ # Bridging & Derating (TBD) gem.
900
+ #
901
+ # @param model [OpenStudio::Model::Model] an OpenStudio model
902
+ # @param tbd_option [String] BTAP/TBD option
903
+ #
904
+ # @return [Bool] true if successful, e.g. no errors, compliant if uprated
905
+ def apply_thermal_bridging(model: nil, tbd_option: nil)
906
+ return false unless model.is_a?(OpenStudio::Model::Model)
907
+ return false unless tbd_option.respond_to?(:to_s)
908
+
909
+ tbd_option = tbd_option.to_s
910
+ # 4x options:
911
+ # - nil or 'none'(TBD is ignored)
912
+ # - derate using 'bad' PSI factors (BTAP-costed)
913
+ # - derate using 'good' PSI factors (BTAP-costed)
914
+ # - 'uprate' (then derate), i.e. iterative process (BTAP-costed)
915
+
916
+ # Do nothing if nil or none or NECB_Default.
917
+ return true if tbd_option.nil? || tbd_option == 'none' || tbd_option =='NECB_Default'
918
+ unless tbd_option == 'bad' || tbd_option == 'good' || tbd_option == 'uprate'
919
+ puts("invalid input for thermal bridging. Must be good, bad, uprate or nil")
920
+ return false
921
+ end
922
+
923
+ argh = {} # BTAP/TBD arguments
924
+ argh[:walls ] = { uo: nil }
925
+ argh[:floors] = { uo: nil }
926
+ argh[:roofs ] = { uo: nil }
927
+
928
+ if tbd_option == 'uprate'
929
+ argh[:walls ][:ut] = nil
930
+ argh[:floors ][:ut] = nil
931
+ argh[:roofs ][:ut] = nil
932
+ elsif tbd_option == 'good'
933
+ argh[:quality] = :good
934
+ end # default == :bad
935
+
936
+ @tbd = BTAP::Bridging.new(model, argh)
937
+ true
938
+ end
939
+
940
+ # @param necb_ref_hp [Bool] if true, NECB reference model rules for heat pumps will be used.
941
+ def apply_standard_efficiencies(model:, sizing_run_dir:, dcv_type: 'NECB_Default', necb_reference_hp: false)
651
942
  raise('validation of model failed.') unless validate_initial_model(model)
652
943
 
653
944
  climate_zone = 'NECB HDD Method'
654
945
  raise("sizing run 1 failed! check #{sizing_run_dir}") if model_run_sizing_run(model, "#{sizing_run_dir}/plant_loops") == false
655
946
 
656
- # This is needed for NECB2011 as a workaround for sizing the reheat boxes
947
+ # This is needed for NECB2011 as a workaround for sizing the reheat boxes.
657
948
  model.getAirTerminalSingleDuctVAVReheats.each { |iobj| air_terminal_single_duct_vav_reheat_set_heating_cap(iobj) }
658
949
  # Apply the prototype HVAC assumptions
659
950
  model_apply_prototype_hvac_assumptions(model, nil, climate_zone)
660
951
  # Apply the HVAC efficiency standard
661
952
  sql_db_vars_map = {}
662
- model_apply_hvac_efficiency_standard(model, climate_zone, sql_db_vars_map: sql_db_vars_map)
953
+ model_apply_hvac_efficiency_standard(model, climate_zone, sql_db_vars_map: sql_db_vars_map, necb_ref_hp: necb_reference_hp)
954
+
663
955
  model_enable_demand_controlled_ventilation(model, dcv_type)
664
956
  return sql_db_vars_map
665
957
  end
@@ -699,8 +991,12 @@ class NECB2011 < Standard
699
991
 
700
992
  # Set HVAC availability schedule to follow occupancy
701
993
  air_loop_hvac.setAvailabilitySchedule(loop_occ_sch)
702
- air_loop_hvac.supplyComponents('OS:AirLoopHVAC:UnitaryHeatPump:AirToAir:MultiSpeed'.to_IddObjectType).each do |comp|
703
- comp.to_AirLoopHVACUnitaryHeatPumpAirToAirMultiSpeed.get.setAvailabilitySchedule(loop_occ_sch)
994
+ air_loop_hvac.supplyComponents.each do |comp|
995
+ if comp.to_AirLoopHVACUnitaryHeatPumpAirToAir.is_initialized
996
+ comp.to_AirLoopHVACUnitaryHeatPumpAirToAir.get.setSupplyAirFanOperatingModeSchedule(loop_occ_sch)
997
+ elsif comp.to_AirLoopHVACUnitaryHeatPumpAirToAirMultiSpeed.is_initialized
998
+ comp.to_AirLoopHVACUnitaryHeatPumpAirToAirMultiSpeed.get.setAvailabilitySchedule(loop_occ_sch)
999
+ end
704
1000
  end
705
1001
 
706
1002
  return true
@@ -200,7 +200,7 @@ class NECB2011
200
200
  outdoor_floors = BTAP::Geometry::Surfaces.filter_by_surface_types(outdoor_surfaces, 'Floor')
201
201
  outdoor_subsurfaces = BTAP::Geometry::Surfaces.get_subsurfaces_from_surfaces(outdoor_surfaces)
202
202
 
203
- ground_surfaces = BTAP::Geometry::Surfaces.filter_by_boundary_condition(surfaces, 'Ground')
203
+ ground_surfaces = BTAP::Geometry::Surfaces.filter_by_boundary_condition(surfaces, ['Ground', 'Foundation'])
204
204
  ground_walls = BTAP::Geometry::Surfaces.filter_by_surface_types(ground_surfaces, 'Wall')
205
205
  ground_roofs = BTAP::Geometry::Surfaces.filter_by_surface_types(ground_surfaces, 'RoofCeiling')
206
206
  ground_floors = BTAP::Geometry::Surfaces.filter_by_surface_types(ground_surfaces, 'Floor')
@@ -197,7 +197,6 @@ class NECB2011
197
197
 
198
198
  # Convert to SI
199
199
  ua_btu_per_hr_per_c = OpenStudio.convert(ua_btu_per_hr_per_f, 'Btu/hr*R', 'W/K').get
200
-
201
200
  # Set the water heater properties
202
201
  # Efficiency
203
202
  water_heater_mixed.setHeaterThermalEfficiency(water_heater_eff)
@@ -263,14 +262,14 @@ class NECB2011
263
262
  model.getSpaces.sort.each do |space|
264
263
  space_peak_flow = 0
265
264
  data = nil
266
- space_type_name = space.spaceType.get.nameString
265
+ space_type_name = space.spaceType.get.standardsSpaceType.get.to_s
267
266
  tank_temperature = 60
268
267
  # find the specific space_type properties from standard.json
269
268
  space_types_table.each do |space_type|
270
- if space_type_name == (space_type['building_type'] + ' ' + space_type['space_type'])
269
+ if (space_type['building_type'] + ' ' + space_type_name) == (space_type['building_type'] + ' ' + space_type['space_type'])
271
270
  break if space_type['necb_hvac_system_selection_type'] == '- undefined -'
272
271
  # If there is no service hot water load.. Don't bother adding anything.
273
- break if space_type['service_water_heating_peak_flow_per_area'].to_f == 0.0 && space_type['service_water_heating_peak_flow_rate'].to_f == 0.0 || space_type['service_water_heating_schedule'].nil?
272
+ break if (space_type['service_water_heating_peak_flow_per_area'].to_f == 0.0 && space_type['service_water_heating_peak_flow_rate'].to_f == 0.0) || space_type['service_water_heating_schedule'].nil?
274
273
 
275
274
  # If there is a service hot water load collect the space information
276
275
  data = space_type
@@ -280,7 +279,6 @@ class NECB2011
280
279
  # If there is no service hot water load.. Don't bother adding anything.
281
280
  # Skip space types with no data
282
281
  next if data.nil?
283
-
284
282
  space_area = OpenStudio.convert(space.floorArea, 'm^2', 'ft^2').get # ft2
285
283
  # Calculate the peak shw flow rate for the space. Peak flow from JSON file is in US Gal/hr/ft^2
286
284
  # space_peak_flow_ind is the peak flow rate for the space while space_peak_flow is the peak flow
@@ -0,0 +1,38 @@
1
+ class SystemFuels
2
+ attr_accessor :name
3
+ attr_accessor :boiler_fueltype
4
+ attr_accessor :baseboard_type
5
+ attr_accessor :mau_type
6
+ attr_accessor :mau_heating_coil_type
7
+ attr_accessor :mau_cooling_type
8
+ attr_accessor :chiller_type
9
+ attr_accessor :heating_coil_type_sys3
10
+ attr_accessor :heating_coil_type_sys4
11
+ attr_accessor :heating_coil_type_sys6
12
+ attr_accessor :necb_reference_hp
13
+ attr_accessor :necb_reference_hp_supp_fuel
14
+ attr_accessor :fan_type
15
+ attr_accessor :swh_fueltype
16
+ attr_accessor :ecm_fueltype
17
+ def set_defaults(standards_data:, primary_heating_fuel:)
18
+ # Get fuelset.
19
+ system_fuel_defaults = standards_data['fuel_type_sets'].detect { |fuel_type_set| fuel_type_set['name'] == primary_heating_fuel }
20
+ raise("fuel_type_sets named #{primary_heating_fuel} not found in fuel_type_sets table.") if system_fuel_defaults.nil?
21
+ # Assign fuel sources.
22
+ @name = system_fuel_defaults['name']
23
+ @boiler_fueltype = system_fuel_defaults['boiler_fueltype']
24
+ @baseboard_type = system_fuel_defaults['baseboard_type']
25
+ @mau_type = system_fuel_defaults['mau_type']
26
+ @mau_cooling_type = system_fuel_defaults['mau_cooling_type']
27
+ @chiller_type = system_fuel_defaults['chiller_type']
28
+ @mau_heating_coil_type = system_fuel_defaults['mau_heating_coil_type']
29
+ @heating_coil_type_sys3 = system_fuel_defaults['heating_coil_type_sys3']
30
+ @heating_coil_type_sys4 = system_fuel_defaults['heating_coil_type_sys4']
31
+ @heating_coil_type_sys6 = system_fuel_defaults['heating_coil_type_sys6']
32
+ @necb_reference_hp = system_fuel_defaults['necb_reference_hp']
33
+ @necb_reference_hp_supp_fuel = system_fuel_defaults['necb_reference_hp_supp_fuel']
34
+ @fan_type = system_fuel_defaults['fan_type']
35
+ @swh_fueltype = system_fuel_defaults['swh_fueltype']
36
+ @ecm_fueltype = system_fuel_defaults['ecm_fueltype']
37
+ end
38
+ end