openstudio-standards 0.4.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (378) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.md +33 -0
  3. data/data/inventory/thermal_bridging.csv +90 -0
  4. data/data/standards/OpenStudio_Standards-deer-comstock.xlsx +0 -0
  5. data/data/standards/manage_OpenStudio_Standards.rb +1 -1
  6. data/data/standards/test_performance_expected_dd_results.csv +2014 -1891
  7. data/lib/openstudio-standards/btap/analysis.rb +8 -8
  8. data/lib/openstudio-standards/btap/bridging.rb +664 -645
  9. data/lib/openstudio-standards/btap/btap.model.rb +14 -14
  10. data/lib/openstudio-standards/btap/btap.rb +7 -7
  11. data/lib/openstudio-standards/btap/btap_result.rb +1 -1
  12. data/lib/openstudio-standards/btap/economics.rb +23 -23
  13. data/lib/openstudio-standards/btap/envelope.rb +8 -8
  14. data/lib/openstudio-standards/btap/equest.rb +1 -1
  15. data/lib/openstudio-standards/btap/geometry.rb +2 -2
  16. data/lib/openstudio-standards/btap/mpc.rb +7 -7
  17. data/lib/openstudio-standards/btap/schedules.rb +1 -1
  18. data/lib/openstudio-standards/btap/simmanager.rb +4 -4
  19. data/lib/openstudio-standards/btap/spaceloads.rb +26 -26
  20. data/lib/openstudio-standards/btap/utilities.rb +6 -6
  21. data/lib/openstudio-standards/btap/vintagizer.rb +1 -1
  22. data/lib/openstudio-standards/constructions/information.rb +83 -0
  23. data/lib/openstudio-standards/constructions/materials/modify.rb +72 -0
  24. data/lib/openstudio-standards/constructions/modify.rb +80 -0
  25. data/lib/openstudio-standards/create_typical/create_typical.rb +983 -0
  26. data/lib/openstudio-standards/create_typical/enumerations.rb +484 -0
  27. data/lib/openstudio-standards/create_typical/space_type_blend.rb +791 -0
  28. data/lib/openstudio-standards/create_typical/space_type_ratios.rb +494 -0
  29. data/lib/openstudio-standards/daylighting/space.rb +47 -0
  30. data/lib/openstudio-standards/geometry/create.rb +801 -0
  31. data/lib/openstudio-standards/geometry/create_bar.rb +2170 -0
  32. data/lib/openstudio-standards/geometry/information.rb +462 -0
  33. data/lib/openstudio-standards/geometry/modify.rb +48 -0
  34. data/lib/openstudio-standards/hvac/air_loop/information.rb +79 -0
  35. data/lib/openstudio-standards/hvac/cbecs_hvac.rb +616 -0
  36. data/lib/openstudio-standards/hvac/setpoint_managers/information.rb +91 -0
  37. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.AirTerminalSingleDuctVAVReheat.rb +1 -1
  38. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.AirTerminalSingleDuctVAVReheat.rb +1 -1
  39. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.AirTerminalSingleDuctVAVReheat.rb +1 -1
  40. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.Model.rb +1 -1
  41. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirTerminalSingleDuctVAVReheat.rb +1 -1
  42. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.Model.rb +2 -2
  43. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.hvac_systems.rb +1 -1
  44. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.AirTerminalSingleDuctVAVReheat.rb +1 -1
  45. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.Model.rb +4 -36
  46. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.hvac_systems.rb +1 -1
  47. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirTerminalSingleDuctVAVReheat.rb +1 -1
  48. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Model.rb +4 -36
  49. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Space.rb +3 -3
  50. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.hvac_systems.rb +1 -1
  51. data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.AirTerminalSingleDuctVAVReheat.rb +1 -1
  52. data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.Model.elevators.rb +1 -1
  53. data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.AirTerminalSingleDuctVAVReheat.rb +1 -1
  54. data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.CoilHeatingGas.rb +1 -1
  55. data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.Model.elevators.rb +1 -1
  56. data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.AirTerminalSingleDuctVAVReheat.rb +1 -1
  57. data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirTerminalSingleDuctVAVReheat.rb +1 -1
  58. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.College.rb +7 -7
  59. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Courthouse.rb +8 -8
  60. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.FullServiceRestaurant.rb +14 -14
  61. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.HighRiseApartment.rb +9 -9
  62. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Hospital.rb +16 -16
  63. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Laboratory.rb +7 -7
  64. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeDataCenterHighITE.rb +8 -8
  65. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeDataCenterLowITE.rb +8 -8
  66. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeHotel.rb +11 -11
  67. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeOffice.rb +7 -7
  68. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeOfficeDetailed.rb +9 -9
  69. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.MediumOffice.rb +8 -8
  70. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.MediumOfficeDetailed.rb +11 -11
  71. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.MidriseApartment.rb +9 -9
  72. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Outpatient.rb +19 -19
  73. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.PrimarySchool.rb +10 -10
  74. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.QuickServiceRestaurant.rb +13 -13
  75. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.RetailStandalone.rb +6 -6
  76. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.RetailStripmall.rb +6 -6
  77. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SecondarySchool.rb +9 -9
  78. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallDataCenterHighITE.rb +8 -8
  79. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallDataCenterLowITE.rb +8 -8
  80. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallHotel.rb +8 -8
  81. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallOffice.rb +8 -8
  82. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallOfficeDetailed.rb +11 -11
  83. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SuperMarket.rb +10 -10
  84. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SuperTallBuilding.rb +19 -19
  85. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.TallBuilding.rb +18 -18
  86. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Warehouse.rb +6 -6
  87. data/lib/openstudio-standards/prototypes/common/do_not_edit_metaclasses.rb +957 -957
  88. data/lib/openstudio-standards/prototypes/common/objects/Prototype.AirConditionerVariableRefrigerantFlow.rb +1 -1
  89. data/lib/openstudio-standards/prototypes/common/objects/Prototype.AirTerminalSingleDuctVAVReheat.rb +1 -1
  90. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingWaterToAirHeatPumpEquationFit.rb +84 -16
  91. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingDXSingleSpeed.rb +1 -1
  92. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingGas.rb +1 -1
  93. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingWaterToAirHeatPumpEquationFit.rb +61 -10
  94. data/lib/openstudio-standards/prototypes/common/objects/Prototype.ControllerWaterCoil.rb +1 -1
  95. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoolingTower.rb +1 -1
  96. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Fan.rb +1 -1
  97. data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanConstantVolume.rb +1 -1
  98. data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanOnOff.rb +1 -1
  99. data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanVariableVolume.rb +1 -1
  100. data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanZoneExhaust.rb +1 -1
  101. data/lib/openstudio-standards/prototypes/common/objects/Prototype.HeatExchangerAirToAirSensibleAndLatent.rb +2 -2
  102. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.exterior_lights.rb +4 -4
  103. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.hvac.rb +4 -4
  104. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.rb +43 -30
  105. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.swh.rb +1 -1
  106. data/lib/openstudio-standards/prototypes/common/objects/Prototype.ServiceWaterHeating.rb +18 -11
  107. data/lib/openstudio-standards/prototypes/common/objects/Prototype.SizingSystem.rb +1 -1
  108. data/lib/openstudio-standards/prototypes/common/objects/Prototype.hvac_systems.rb +774 -117
  109. data/lib/openstudio-standards/prototypes/common/objects/Prototype.radiant_system_controls.rb +340 -481
  110. data/lib/openstudio-standards/prototypes/common/objects/Prototype.refrigeration.rb +3 -3
  111. data/lib/openstudio-standards/prototypes/common/objects/Prototype.utilities.rb +3 -3
  112. data/lib/openstudio-standards/prototypes/common/prototype_metaprogramming.rb +22 -22
  113. data/lib/openstudio-standards/prototypes/deer/deer.Model.rb +1 -1
  114. data/lib/openstudio-standards/qaqc/calibration.rb +131 -0
  115. data/lib/openstudio-standards/qaqc/create_results.rb +983 -0
  116. data/lib/openstudio-standards/qaqc/envelope.rb +399 -0
  117. data/lib/openstudio-standards/qaqc/eui.rb +213 -0
  118. data/lib/openstudio-standards/qaqc/hvac.rb +1943 -0
  119. data/lib/openstudio-standards/qaqc/internal_loads.rb +568 -0
  120. data/lib/openstudio-standards/qaqc/reporting.rb +141 -0
  121. data/lib/openstudio-standards/qaqc/schedules.rb +129 -0
  122. data/lib/openstudio-standards/qaqc/service_water_heating.rb +273 -0
  123. data/lib/openstudio-standards/qaqc/weather_files.rb +497 -0
  124. data/lib/openstudio-standards/qaqc/zone_conditions.rb +278 -0
  125. data/lib/openstudio-standards/schedules/create.rb +364 -0
  126. data/lib/openstudio-standards/schedules/information.rb +169 -0
  127. data/lib/openstudio-standards/schedules/modify.rb +445 -0
  128. data/lib/openstudio-standards/standards/Standards.AirLoopHVAC.rb +110 -71
  129. data/lib/openstudio-standards/standards/Standards.AirTerminalSingleDuctParallelPIUReheat.rb +3 -3
  130. data/lib/openstudio-standards/standards/Standards.AirTerminalSingleDuctVAVReheat.rb +4 -4
  131. data/lib/openstudio-standards/standards/Standards.BoilerHotWater.rb +2 -1
  132. data/lib/openstudio-standards/standards/Standards.ChillerElectricEIR.rb +16 -10
  133. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXSingleSpeed.rb +4 -4
  134. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXTwoSpeed.rb +1 -1
  135. data/lib/openstudio-standards/standards/Standards.CoilCoolingWaterToAirHeatPumpEquationFit.rb +1 -1
  136. data/lib/openstudio-standards/standards/Standards.CoilDX.rb +4 -4
  137. data/lib/openstudio-standards/standards/Standards.CoilHeatingDXMultiSpeed.rb +1 -1
  138. data/lib/openstudio-standards/standards/Standards.CoilHeatingDXSingleSpeed.rb +5 -5
  139. data/lib/openstudio-standards/standards/Standards.CoilHeatingGas.rb +1 -1
  140. data/lib/openstudio-standards/standards/Standards.CoilHeatingGasMultiStage.rb +1 -1
  141. data/lib/openstudio-standards/standards/Standards.CoilHeatingWaterToAirHeatPumpEquationFit.rb +1 -1
  142. data/lib/openstudio-standards/standards/Standards.Construction.rb +17 -18
  143. data/lib/openstudio-standards/standards/Standards.CoolingTower.rb +6 -6
  144. data/lib/openstudio-standards/standards/Standards.CoolingTowerSingleSpeed.rb +1 -1
  145. data/lib/openstudio-standards/standards/Standards.CoolingTowerTwoSpeed.rb +1 -1
  146. data/lib/openstudio-standards/standards/Standards.CoolingTowerVariableSpeed.rb +1 -1
  147. data/lib/openstudio-standards/standards/Standards.Fan.rb +6 -12
  148. data/lib/openstudio-standards/standards/Standards.FanVariableVolume.rb +2 -2
  149. data/lib/openstudio-standards/standards/Standards.FluidCooler.rb +1 -1
  150. data/lib/openstudio-standards/standards/Standards.HeaderedPumpsVariableSpeed.rb +1 -1
  151. data/lib/openstudio-standards/standards/Standards.HeatExchangerSensLat.rb +3 -3
  152. data/lib/openstudio-standards/standards/Standards.Model.rb +411 -261
  153. data/lib/openstudio-standards/standards/Standards.PlanarSurface.rb +2 -2
  154. data/lib/openstudio-standards/standards/Standards.PlantLoop.rb +94 -29
  155. data/lib/openstudio-standards/standards/Standards.Pump.rb +2 -2
  156. data/lib/openstudio-standards/standards/Standards.ScheduleConstant.rb +2 -2
  157. data/lib/openstudio-standards/standards/Standards.ScheduleRuleset.rb +14 -14
  158. data/lib/openstudio-standards/standards/Standards.Space.rb +37 -30
  159. data/lib/openstudio-standards/standards/Standards.SpaceType.rb +38 -29
  160. data/lib/openstudio-standards/standards/Standards.SubSurface.rb +7 -7
  161. data/lib/openstudio-standards/standards/Standards.Surface.rb +13 -13
  162. data/lib/openstudio-standards/standards/Standards.ThermalZone.rb +109 -66
  163. data/lib/openstudio-standards/standards/Standards.WaterHeaterMixed.rb +11 -4
  164. data/lib/openstudio-standards/standards/Standards.ZoneHVACComponent.rb +6 -6
  165. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.AirLoopHVAC.rb +1 -1
  166. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.PlantLoop.rb +1 -1
  167. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.Space.rb +1 -1
  168. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.Space.rb +1 -1
  169. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.AirLoopHVAC.rb +4 -4
  170. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.AirTerminalSingleDuctVAVReheat.rb +1 -1
  171. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.Space.rb +4 -4
  172. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirLoopHVAC.rb +4 -4
  173. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirTerminalSingleDuctVAVReheat.rb +1 -1
  174. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.CoolingTowerVariableSpeed.rb +1 -1
  175. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.Model.rb +5 -21
  176. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.Space.rb +4 -4
  177. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.WaterHeaterMixed.rb +1 -1
  178. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.ZoneHVACComponent.rb +1 -1
  179. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.AirLoopHVAC.rb +36 -4
  180. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.AirTerminalSingleDuctVAVReheat.rb +1 -1
  181. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.CoolingTowerVariableSpeed.rb +1 -1
  182. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.Space.rb +4 -4
  183. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.ZoneHVACComponent.rb +1 -1
  184. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/comstock_ashrae_90_1_2016/comstock_ashrae_90_1_2016.AirLoopHVAC.rb +26 -0
  185. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirLoopHVAC.rb +53 -10
  186. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirTerminalSingleDuctVAVReheat.rb +1 -1
  187. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.CoolingTowerVariableSpeed.rb +1 -1
  188. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Space.rb +6 -6
  189. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.ZoneHVACComponent.rb +2 -2
  190. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/comstock_ashrae_90_1_2019/comstock_ashrae_90_1_2019.AirLoopHVAC.rb +26 -0
  191. data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.curves.json +211 -211
  192. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.economizers.json +14 -14
  193. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.AirLoopHVAC.rb +4 -4
  194. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.Model.rb +1 -1
  195. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.PlantLoop.rb +1 -1
  196. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.economizers.json +14 -14
  197. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.AirLoopHVAC.rb +4 -4
  198. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.Model.rb +1 -1
  199. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.PlantLoop.rb +1 -1
  200. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.AirLoopHVAC.rb +6 -6
  201. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.AirTerminalSingleDuctVAVReheat.rb +1 -1
  202. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.CoolingTowerVariableSpeed.rb +1 -1
  203. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.PlantLoop.rb +1 -1
  204. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.Space.rb +4 -4
  205. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirLoopHVAC.rb +6 -6
  206. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirTerminalSingleDuctVAVReheat.rb +1 -1
  207. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.CoolingTowerVariableSpeed.rb +1 -1
  208. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.PlantLoop.rb +1 -1
  209. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.Space.rb +4 -4
  210. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.AirLoopHVAC.rb +22 -28
  211. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.AirTerminalSingleDuctParallelPIUReheat.rb +1 -1
  212. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.AirTerminalSingleDuctVAVReheat.rb +2 -2
  213. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.BoilerHotWater.rb +1 -74
  214. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.ChillerElectricEIR.rb +7 -59
  215. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilCoolingDXSingleSpeed.rb +1 -1
  216. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilCoolingDXTwoSpeed.rb +1 -1
  217. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilDX.rb +1 -1
  218. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilHeatingDXSingleSpeed.rb +1 -1
  219. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilHeatingGas.rb +1 -21
  220. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.DesignSpecificationOutdoorAir.rb +101 -0
  221. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.FanConstantVolume.rb +1 -1
  222. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.FanOnOff.rb +1 -1
  223. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.FanVariableVolume.rb +1 -1
  224. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.HeatExchangerSensLat.rb +1 -1
  225. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.Model.rb +643 -526
  226. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.PlanarSurface.rb +8 -2
  227. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.PlantLoop.rb +17 -77
  228. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.Space.rb +74 -16
  229. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.SpaceType.rb +96 -44
  230. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.Surface.rb +6 -6
  231. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.ThermalZone.rb +18 -6
  232. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.ZoneHVACComponent.rb +1 -1
  233. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.rb +328 -74
  234. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/ashrae_90_1_prm_2019.Model.rb +0 -118
  235. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/ashrae_90_1_prm_2019.rb +2 -1
  236. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.heat_rejection.json +1 -1
  237. data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/baseline_outdoor_air.md +35 -0
  238. data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/set_plug_load_measures.md +1 -1
  239. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/ashrae_90_1_prm.UserData.rb +228 -0
  240. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_enums.rb +131 -0
  241. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_space.csv +1 -1
  242. data/lib/openstudio-standards/standards/cbes/cbes.AirLoopHVAC.rb +5 -5
  243. data/lib/openstudio-standards/standards/cbes/cbes.Model.rb +1 -1
  244. data/lib/openstudio-standards/standards/cbes/cbes.PlantLoop.rb +1 -1
  245. data/lib/openstudio-standards/standards/cbes/cbes.Space.rb +1 -1
  246. data/lib/openstudio-standards/standards/cbes/cbes_t24_2005/cbes_t24_2005.Space.rb +1 -1
  247. data/lib/openstudio-standards/standards/cbes/cbes_t24_2008/cbes_t24_2008.Space.rb +1 -1
  248. data/lib/openstudio-standards/standards/deer/deer.AirLoopHVAC.rb +109 -27
  249. data/lib/openstudio-standards/standards/deer/deer.Space.rb +1 -1
  250. data/lib/openstudio-standards/standards/deer/deer_1985/data/deer_1985.economizers.json +246 -4
  251. data/lib/openstudio-standards/standards/deer/deer_1996/data/deer_1996.economizers.json +246 -4
  252. data/lib/openstudio-standards/standards/deer/deer_2003/data/deer_2003.economizers.json +246 -4
  253. data/lib/openstudio-standards/standards/deer/deer_2003/deer_2003.ThermalZone.rb +18 -18
  254. data/lib/openstudio-standards/standards/deer/deer_2007/data/deer_2007.economizers.json +246 -4
  255. data/lib/openstudio-standards/standards/deer/deer_2007/deer_2007.ThermalZone.rb +18 -18
  256. data/lib/openstudio-standards/standards/deer/deer_2011/data/deer_2011.economizers.json +246 -4
  257. data/lib/openstudio-standards/standards/deer/deer_2011/deer_2011.ThermalZone.rb +18 -18
  258. data/lib/openstudio-standards/standards/deer/deer_2014/data/deer_2014.economizers.json +248 -6
  259. data/lib/openstudio-standards/standards/deer/deer_2014/deer_2014.Space.rb +3 -3
  260. data/lib/openstudio-standards/standards/deer/deer_2014/deer_2014.ThermalZone.rb +18 -18
  261. data/lib/openstudio-standards/standards/deer/deer_2015/data/deer_2015.economizers.json +248 -6
  262. data/lib/openstudio-standards/standards/deer/deer_2015/deer_2015.Space.rb +3 -3
  263. data/lib/openstudio-standards/standards/deer/deer_2015/deer_2015.ThermalZone.rb +18 -18
  264. data/lib/openstudio-standards/standards/deer/deer_2017/data/deer_2017.economizers.json +248 -6
  265. data/lib/openstudio-standards/standards/deer/deer_2017/deer_2017.Space.rb +3 -3
  266. data/lib/openstudio-standards/standards/deer/deer_2017/deer_2017.ThermalZone.rb +18 -18
  267. data/lib/openstudio-standards/standards/deer/deer_2020/data/deer_2020.economizers.json +248 -6
  268. data/lib/openstudio-standards/standards/deer/deer_2020/deer_2020.AirLoopHVAC.rb +18 -5
  269. data/lib/openstudio-standards/standards/deer/deer_2020/deer_2020.FanVariableVolume.rb +1 -1
  270. data/lib/openstudio-standards/standards/deer/deer_2020/deer_2020.Space.rb +3 -3
  271. data/lib/openstudio-standards/standards/deer/deer_2020/deer_2020.ThermalZone.rb +18 -18
  272. data/lib/openstudio-standards/standards/deer/deer_2025/data/deer_2025.economizers.json +248 -6
  273. data/lib/openstudio-standards/standards/deer/deer_2025/deer_2025.AirLoopHVAC.rb +3 -3
  274. data/lib/openstudio-standards/standards/deer/deer_2025/deer_2025.FanVariableVolume.rb +1 -1
  275. data/lib/openstudio-standards/standards/deer/deer_2025/deer_2025.Space.rb +3 -3
  276. data/lib/openstudio-standards/standards/deer/deer_2030/data/deer_2030.economizers.json +248 -6
  277. data/lib/openstudio-standards/standards/deer/deer_2030/data/deer_2030.heat_pumps.json +2 -2
  278. data/lib/openstudio-standards/standards/deer/deer_2030/deer_2030.AirLoopHVAC.rb +3 -3
  279. data/lib/openstudio-standards/standards/deer/deer_2030/deer_2030.FanVariableVolume.rb +1 -1
  280. data/lib/openstudio-standards/standards/deer/deer_2030/deer_2030.Space.rb +3 -3
  281. data/lib/openstudio-standards/standards/deer/deer_2035/data/deer_2035.economizers.json +248 -6
  282. data/lib/openstudio-standards/standards/deer/deer_2035/deer_2035.AirLoopHVAC.rb +3 -3
  283. data/lib/openstudio-standards/standards/deer/deer_2035/deer_2035.FanVariableVolume.rb +1 -1
  284. data/lib/openstudio-standards/standards/deer/deer_2035/deer_2035.Space.rb +3 -3
  285. data/lib/openstudio-standards/standards/deer/deer_2040/data/deer_2040.economizers.json +248 -6
  286. data/lib/openstudio-standards/standards/deer/deer_2040/deer_2040.AirLoopHVAC.rb +3 -3
  287. data/lib/openstudio-standards/standards/deer/deer_2040/deer_2040.FanVariableVolume.rb +1 -1
  288. data/lib/openstudio-standards/standards/deer/deer_2040/deer_2040.Space.rb +3 -3
  289. data/lib/openstudio-standards/standards/deer/deer_2045/data/deer_2045.economizers.json +260 -0
  290. data/lib/openstudio-standards/standards/deer/deer_2045/deer_2045.AirLoopHVAC.rb +3 -3
  291. data/lib/openstudio-standards/standards/deer/deer_2045/deer_2045.FanVariableVolume.rb +1 -1
  292. data/lib/openstudio-standards/standards/deer/deer_2045/deer_2045.Space.rb +3 -3
  293. data/lib/openstudio-standards/standards/deer/deer_2050/data/deer_2050.economizers.json +248 -6
  294. data/lib/openstudio-standards/standards/deer/deer_2050/deer_2050.AirLoopHVAC.rb +3 -3
  295. data/lib/openstudio-standards/standards/deer/deer_2050/deer_2050.FanVariableVolume.rb +1 -1
  296. data/lib/openstudio-standards/standards/deer/deer_2050/deer_2050.Space.rb +3 -3
  297. data/lib/openstudio-standards/standards/deer/deer_2055/data/deer_2055.economizers.json +248 -6
  298. data/lib/openstudio-standards/standards/deer/deer_2055/deer_2055.AirLoopHVAC.rb +3 -3
  299. data/lib/openstudio-standards/standards/deer/deer_2055/deer_2055.FanVariableVolume.rb +1 -1
  300. data/lib/openstudio-standards/standards/deer/deer_2055/deer_2055.Space.rb +3 -3
  301. data/lib/openstudio-standards/standards/deer/deer_2060/data/deer_2060.economizers.json +248 -6
  302. data/lib/openstudio-standards/standards/deer/deer_2060/deer_2060.AirLoopHVAC.rb +3 -3
  303. data/lib/openstudio-standards/standards/deer/deer_2060/deer_2060.FanVariableVolume.rb +1 -1
  304. data/lib/openstudio-standards/standards/deer/deer_2060/deer_2060.Space.rb +3 -3
  305. data/lib/openstudio-standards/standards/deer/deer_2065/data/deer_2065.economizers.json +248 -6
  306. data/lib/openstudio-standards/standards/deer/deer_2065/deer_2065.AirLoopHVAC.rb +3 -3
  307. data/lib/openstudio-standards/standards/deer/deer_2065/deer_2065.FanVariableVolume.rb +1 -1
  308. data/lib/openstudio-standards/standards/deer/deer_2065/deer_2065.Space.rb +3 -3
  309. data/lib/openstudio-standards/standards/deer/deer_2070/data/deer_2070.economizers.json +248 -6
  310. data/lib/openstudio-standards/standards/deer/deer_2070/deer_2070.AirLoopHVAC.rb +3 -3
  311. data/lib/openstudio-standards/standards/deer/deer_2070/deer_2070.FanVariableVolume.rb +1 -1
  312. data/lib/openstudio-standards/standards/deer/deer_2070/deer_2070.Space.rb +3 -3
  313. data/lib/openstudio-standards/standards/deer/deer_2075/data/deer_2075.economizers.json +248 -6
  314. data/lib/openstudio-standards/standards/deer/deer_2075/deer_2075.AirLoopHVAC.rb +3 -3
  315. data/lib/openstudio-standards/standards/deer/deer_2075/deer_2075.FanVariableVolume.rb +1 -1
  316. data/lib/openstudio-standards/standards/deer/deer_2075/deer_2075.Space.rb +3 -3
  317. data/lib/openstudio-standards/standards/deer/deer_pre_1975/data/deer_pre_1975.economizers.json +246 -4
  318. data/lib/openstudio-standards/standards/necb/BTAP1980TO2010/data/space_types.json +447 -223
  319. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/building_envelope.rb +1 -1
  320. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/data/space_types.json +447 -223
  321. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_systems.rb +5 -2
  322. data/lib/openstudio-standards/standards/necb/ECMS/data/chiller_types.json +25 -0
  323. data/lib/openstudio-standards/standards/necb/ECMS/data/chillers.json +44 -0
  324. data/lib/openstudio-standards/standards/necb/ECMS/data/curves.json +225 -0
  325. data/lib/openstudio-standards/standards/necb/ECMS/ecms.rb +2 -2
  326. data/lib/openstudio-standards/standards/necb/ECMS/hvac_systems.rb +193 -73
  327. data/lib/openstudio-standards/standards/necb/ECMS/pv_ground.rb +1 -1
  328. data/lib/openstudio-standards/standards/necb/NECB2011/autozone.rb +10 -4
  329. data/lib/openstudio-standards/standards/necb/NECB2011/beps_compliance_path.rb +7 -7
  330. data/lib/openstudio-standards/standards/necb/NECB2011/building_envelope.rb +4 -5
  331. data/lib/openstudio-standards/standards/necb/NECB2011/data/chiller_types.json +32 -0
  332. data/lib/openstudio-standards/standards/necb/NECB2011/data/chillers.json +1 -1
  333. data/lib/openstudio-standards/standards/necb/NECB2011/data/constants.json +36 -0
  334. data/lib/openstudio-standards/standards/necb/NECB2011/data/fuel_type_sets.json +7 -7
  335. data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/NorthernEducation.osm +47587 -0
  336. data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/NorthernHealthCare.osm +49764 -0
  337. data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/Warehouse.osm +283 -297
  338. data/lib/openstudio-standards/standards/necb/NECB2011/data/space_type_unit_definitions.txt +2 -1
  339. data/lib/openstudio-standards/standards/necb/NECB2011/data/space_types.json +447 -223
  340. data/lib/openstudio-standards/standards/necb/NECB2011/data/standards_data.rb +3 -3
  341. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_1_multi_speed.rb +1 -1
  342. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_systems.rb +49 -27
  343. data/lib/openstudio-standards/standards/necb/NECB2011/necb_2011.rb +400 -202
  344. data/lib/openstudio-standards/standards/necb/NECB2011/service_water_heating.rb +4 -4
  345. data/lib/openstudio-standards/standards/necb/NECB2015/data/space_types.json +637 -318
  346. data/lib/openstudio-standards/standards/necb/NECB2015/hvac_systems.rb +18 -1
  347. data/lib/openstudio-standards/standards/necb/NECB2015/necb_2015.rb +3 -3
  348. data/lib/openstudio-standards/standards/necb/NECB2017/data/space_types.json +637 -318
  349. data/lib/openstudio-standards/standards/necb/NECB2017/hvac_systems.rb +1 -1
  350. data/lib/openstudio-standards/standards/necb/NECB2017/necb_2017.rb +3 -3
  351. data/lib/openstudio-standards/standards/necb/NECB2020/building_envelope.rb +1 -1
  352. data/lib/openstudio-standards/standards/necb/NECB2020/data/space_types.json +615 -307
  353. data/lib/openstudio-standards/standards/necb/NECB2020/service_water_heating.rb +4 -4
  354. data/lib/openstudio-standards/standards/necb/common/btap_data.rb +10 -5
  355. data/lib/openstudio-standards/standards/necb/common/btap_datapoint.rb +1 -1
  356. data/lib/openstudio-standards/utilities/assertion.rb +128 -0
  357. data/lib/openstudio-standards/utilities/logging.rb +2 -3
  358. data/lib/openstudio-standards/utilities/object_info.rb +39 -18
  359. data/lib/openstudio-standards/utilities/schedule_translator.rb +8 -6
  360. data/lib/openstudio-standards/utilities/simulation.rb +24 -11
  361. data/lib/openstudio-standards/utilities/sqlfile.rb +10 -5
  362. data/lib/openstudio-standards/version.rb +1 -1
  363. data/lib/openstudio-standards/weather/Weather.Model.rb +8 -9
  364. data/lib/openstudio-standards/weather/Weather.stat_file.rb +3 -3
  365. data/lib/openstudio-standards/weather/information.rb +35 -0
  366. data/lib/openstudio-standards.rb +69 -5
  367. metadata +54 -18
  368. data/License.txt +0 -65
  369. data/data/standards/OpenStudio_Standards-deer-ALL-comstock(space_types).xlsx +0 -0
  370. data/lib/openstudio-standards/hvac_sizing/Siz.AirLoopHVAC.rb +0 -59
  371. data/lib/openstudio-standards/hvac_sizing/Siz.CoilCoolingWater.rb +0 -13
  372. data/lib/openstudio-standards/hvac_sizing/Siz.HVACComponent.rb +0 -36
  373. data/lib/openstudio-standards/hvac_sizing/Siz.HeatingCoolingFuels.rb +0 -898
  374. data/lib/openstudio-standards/hvac_sizing/Siz.Model.rb +0 -126
  375. data/lib/openstudio-standards/hvac_sizing/Siz.ThermalZone.rb +0 -356
  376. data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.Model.rb +0 -35
  377. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoolingTower.rb +0 -110
  378. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoolingTowerVariableSpeed.rb +0 -5
@@ -20,6 +20,7 @@
20
20
  require 'tbd'
21
21
 
22
22
  module BTAP
23
+ # ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- #
23
24
  module BridgingData
24
25
  ##
25
26
  # BTAP module/class for Thermal Bridging & Derating (TBD) functionality
@@ -27,19 +28,21 @@ module BTAP
27
28
  #
28
29
  # @author: Denis Bourgeois
29
30
 
31
+ # --- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- --- #
30
32
  # BTAP/TBD data extracted from the BTAP costing spreadsheet:
31
33
  #
32
34
  # - range of clear-field Uo factors
33
35
  # - range of PSI factors (i.e. MAJOR thermal bridging), e.g. corners
34
36
  # - costing parameters
35
37
  #
36
- # NOTE: This module is be replaced with roo-based spreadsheet parsing,
38
+ # NOTE: This module is to be replaced with roo-based spreadsheet parsing,
37
39
  # generating a BTAP costing JSON file. TO DO.
38
40
  #
39
41
  # Ref: EVOKE BTAP costing spreadsheet modifications (2022), synced with:
40
42
  # - Building Envelope Thermal Bridging Guide (BETBG)
41
43
  # - ASHRAE RP-1365, ISO-12011, etc.
42
44
 
45
+ # --- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- --- #
43
46
  # BTAP costing data (both original BTAP constructions and EVOKE's
44
47
  # additions) hold sub-variants based on cladding/veneer, e.g.:
45
48
  #
@@ -65,14 +68,14 @@ module BTAP
65
68
  #
66
69
  # ID : (layers)
67
70
  # ----- ------------------------------------------
68
- # STEL2 : cladding | board | wool | frame | gypsum
69
- # WOOD7 : brick | mineral | wool | frame | gypsum
70
- # MTALD : panel | polyiso | foam | frame | gypsum
71
- # MASSB : brick | mineral | cmu | foam | gypsum
72
- # MASS8 : precast | xps | wool | frame | gypsum
73
- # MASSC : cladding | mineral | cmu | foam | gypsum
71
+ # STEL2 : cladding | board | wool | frame | gypsum ... switch from STEL1
72
+ # WOOD7 : brick | mineral | wool | frame | gypsum ... switch from WOOD5
73
+ # MTALD : panel | polyiso | foam | frame | gypsum ... switch from MTAL1
74
+ # MASSB : brick | mineral | cmu | foam | gypsum ... switch from MASS2
75
+ # MASS8 : precast | xps | wool | frame | gypsum ... switch from MASS4
76
+ # MASSC : cladding | mineral | cmu | foam | gypsum ... switch from MASS6
74
77
  #
75
- # Paired LPs vs HPs vall variants are critical for 'uprating' cases, e.g.
78
+ # Paired LPs & HPs vall variants are critical for 'uprating' cases, e.g.
76
79
  # NECB2017. See below, and end of this document for additional NOTES.
77
80
 
78
81
  MASS2 = "BTAP-ExteriorWall-Mass-2" # LP wall
@@ -123,6 +126,7 @@ module BTAP
123
126
  UMIN = 0.010
124
127
  UMAX = 5.678
125
128
 
129
+ # --- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- --- #
126
130
  # There are 3 distinct BTAP "building_envelope" classes to enrich with
127
131
  # TBD functionality (whether BTAP users choose to activate TBD or not):
128
132
  #
@@ -145,7 +149,7 @@ module BTAP
145
149
  # instead assess prescriptive Ut compliance for vintages NECB2017 and
146
150
  # NECB2020, the BTAP/TBD must be set to "uprate" so it can iteratively reset
147
151
  # combined Uo & PSI factors towards finding the least expensive, yet
148
- # compliant combination. Why? Improved Uo construction variants are
152
+ # compliant, combination. Why? Improved Uo construction variants are
149
153
  # necessarily required, given:
150
154
  #
151
155
  # Ut = Uo + ( ∑psi L )/A + ( ∑khi n )/A (ref: rd2.github.io/tbd)
@@ -193,16 +197,14 @@ module BTAP
193
197
  #
194
198
  # 4. A final switch to "good" (HP) details is available (last resort).
195
199
  #
196
- # If none of the available combinations are sufficient:
197
- # - TBD red-flags a failed attempt at NECB2017 or NECB2020 compliance
198
- # - TBD keeps iteration #4 Uo + PSI combo, then derates
199
- # - BTAP runs the simulation (giving some performance gap indication)
200
-
201
- # Hash of admissible Uo factors. If initial BTAP constructions fail to
202
- # comply when uprating, jump to subsequent high-performance variant,
203
- # e.g. "STEL1" switches to "STEL2". In most cases, the solution
204
- # prioritizes basic solutions (less $), only opting for HP variants as a
205
- # last recourse. There are 3x exceptions:
200
+ # If NONE of the available combinations are sufficient:
201
+ # - TBD red-flags a failed attempt at e.g. NECB2017 or NECB2020 compliance
202
+ # - TBD keeps iteration #4 Uo + PSI combo, then derates before a
203
+ # BTAP simulation run (giving some performance gap indication)
204
+
205
+ # --- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- --- #
206
+ # There are 3x exceptions to the aforementioned iterative solution,
207
+ # hopefully to correct (TO-DO):
206
208
  #
207
209
  # - Steel-framed construction: the selected HP variant has metal
208
210
  # cladding. The only LP steel-framed BTAP option is wood-clad -
@@ -222,6 +224,7 @@ module BTAP
222
224
  # - ROOF and (exposed) FLOOR surfaces refer to a single LP/HP selection
223
225
  # respectively. This is expected to change in the future ...
224
226
 
227
+ # --- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- --- #
225
228
  # Preset BTAP/TBD wall construction parameters.
226
229
  # :sptypes : BTAP/TBD Hash of linked NECB SpaceTypes (symbols)
227
230
  # :uos : BTAP/TBD Hash of associated of Uo sub-variants
@@ -243,13 +246,14 @@ module BTAP
243
246
  @@data[FLOOR] = { sptypes: {}, uos: {} }
244
247
  @@data[ROOFS] = { sptypes: {}, uos: {} }
245
248
 
249
+ # --- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- --- #
246
250
  # A construction sub-variant is identified strictly by its Uo factor:
247
251
  #
248
- # e.g. :314 describes a Uo factor of 0.314 W/m2.K
252
+ # e.g. "314" describes a Uo factor of 0.314 W/m2.K
249
253
  #
250
254
  # Listed items for each sub-variant are layer identifiers (for BTAP
251
255
  # costing only). For the moment, they are listed integers (but should
252
- # be expanded (e.g. as Hash keys) to hold additional costing metadata,
256
+ # be expanded - e.g. as Hash keys - to hold additional costing metadata,
253
257
  # e.g. $/m2). This should be (soon) removed from BTAP/TBD data.
254
258
  #
255
259
  # NOTE: Missing gypsum finish for WOOD7 Uo 0.130?
@@ -320,6 +324,7 @@ module BTAP
320
324
  @@data[ROOFS][:uos]["121"] = [ 94, 97,106,150, 93]
321
325
  @@data[ROOFS][:uos]["100"] = [ 94, 97,106,106, 93]
322
326
 
327
+ # --- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- --- #
323
328
  # In BTAP costing, each NECB building/space type is linked to a default
324
329
  # construction set, which holds one of the preceding wall options. This
325
330
  # linkage is now extended to OpenStudio models (not just costing),
@@ -333,8 +338,8 @@ module BTAP
333
338
  #
334
339
  # ... is implemented elsewhere in the BTAP/TBD class. The default BTAP
335
340
  # wall construction for :office (fall back) is STEL1. Subsequent PSI
336
- # factor selection is based strictly on selected wall construction, e.g.
337
- # regardless of selected roof, fenestration. The linkage remains valid
341
+ # factor selection is based strictly on selected wall construction, i.e.
342
+ # regardless of selected roof, fenestration, etc. The linkage remains valid
338
343
  # for both building and space types (regardless of NECB vintage).
339
344
  #
340
345
  # The implementation is likely to be revised in the future, yet would
@@ -416,6 +421,7 @@ module BTAP
416
421
  @@data[STEL2][:sptypes][:town ] = {}
417
422
  @@data[STEL2][:sptypes][:office ] = {}
418
423
 
424
+ # --- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- --- #
419
425
  # Initialize PSI factor qualities per wall construction.
420
426
  @@data.values.each do |construction|
421
427
  construction[:bad ] = {}
@@ -721,6 +727,7 @@ module BTAP
721
727
  @@data[STEL2][:good][:joint ] = { psi: 0.100 }
722
728
  @@data[STEL2][:good][:transition ] = { psi: 0.000 }
723
729
 
730
+ # --- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- --- #
724
731
  # Extend for BTAP costing.
725
732
  @@data.values.each do |construction|
726
733
  construction[:good].values.each { |bridge| bridge[:mat] = {} }
@@ -732,363 +739,364 @@ module BTAP
732
739
  #
733
740
  # NOTE: "0" as a NIL placeholder (no cost associated to thermal bridge).
734
741
  @@data[MASS2][ :bad][:id ] = MASS2_BAD
735
- # @@data[MASS2][ :bad][:rimjoist ][:mat][ "21"] = 1.000
736
- # @@data[MASS2][ :bad][:rimjoist ][:mat]["172"] = 0.250
737
- # @@data[MASS2][ :bad][:parapet ][:mat][ "0"] = 1.000
738
- # @@data[MASS2][ :bad][:head ][:mat]["139"] = 0.750
739
- # @@data[MASS2][ :bad][:jamb ][:mat]["139"] = 0.750
740
- # @@data[MASS2][ :bad][:sill ][:mat]["139"] = 0.750
741
- # @@data[MASS2][ :bad][:corner ][:mat][ "0"] = 1.000
742
- # @@data[MASS2][ :bad][:balcony ][:mat][ ""] = 1.000
743
- # @@data[MASS2][ :bad][:party ][:mat][ ""] = 1.000
744
- # @@data[MASS2][ :bad][:grade ][:mat][ "21"] = 1.000
745
- # @@data[MASS2][ :bad][:grade ][:mat]["139"] = 0.500
746
- # @@data[MASS2][ :bad][:joint ][:mat][ ""] = 1.000
747
- # @@data[MASS2][ :bad][:transition ][:mat][ ""] = 1.000
742
+ @@data[MASS2][ :bad][:rimjoist ][:mat][ "21"] = 1.000
743
+ @@data[MASS2][ :bad][:rimjoist ][:mat]["172"] = 0.250
744
+ @@data[MASS2][ :bad][:parapet ][:mat][ "0"] = 1.000
745
+ @@data[MASS2][ :bad][:head ][:mat]["139"] = 0.750
746
+ @@data[MASS2][ :bad][:jamb ][:mat]["139"] = 0.750
747
+ @@data[MASS2][ :bad][:sill ][:mat]["139"] = 0.750
748
+ @@data[MASS2][ :bad][:corner ][:mat][ "0"] = 1.000
749
+ @@data[MASS2][ :bad][:balcony ][:mat][ ""] = 1.000
750
+ @@data[MASS2][ :bad][:party ][:mat][ ""] = 1.000
751
+ @@data[MASS2][ :bad][:grade ][:mat][ "21"] = 1.000
752
+ @@data[MASS2][ :bad][:grade ][:mat]["139"] = 0.500
753
+ @@data[MASS2][ :bad][:joint ][:mat][ ""] = 1.000
754
+ @@data[MASS2][ :bad][:transition ][:mat][ ""] = 1.000
748
755
 
749
756
  @@data[MASS2][:good][:id ] = MASS2_GOOD
750
- # @@data[MASS2][:good][:rimjoist ][:mat]["189"] = 1.000
751
- # @@data[MASS2][:good][:rimjoist ][:mat]["172"] = 0.500
752
- # @@data[MASS2][:good][:parapet ][:mat][ "57"] = 3.300
753
- # @@data[MASS2][:good][:parapet ][:mat]["139"] = 1.000
754
- # @@data[MASS2][:good][:head ][:mat]["139"] = 0.500
755
- # @@data[MASS2][:good][:jamb ][:mat]["139"] = 0.500
756
- # @@data[MASS2][:good][:sill ][:mat]["139"] = 0.500
757
- # @@data[MASS2][:good][:corner ][:mat][ "0"] = 1.000
758
- # @@data[MASS2][:good][:balcony ][:mat][ ""] = 1.000
759
- # @@data[MASS2][:good][:party ][:mat][ ""] = 1.000
760
- # @@data[MASS2][:good][:grade ][:mat]["189"] = 1.000
761
- # @@data[MASS2][:good][:grade ][:mat]["139"] = 0.500
762
- # @@data[MASS2][:good][:grade ][:mat]["192"] = 0.500
763
- # @@data[MASS2][:good][:joint ][:mat][ ""] = 1.000
764
- # @@data[MASS2][:good][:transition ][:mat][ ""] = 1.000
757
+ @@data[MASS2][:good][:rimjoist ][:mat]["189"] = 1.000
758
+ @@data[MASS2][:good][:rimjoist ][:mat]["172"] = 0.500
759
+ @@data[MASS2][:good][:parapet ][:mat][ "57"] = 3.300
760
+ @@data[MASS2][:good][:parapet ][:mat]["139"] = 1.000
761
+ @@data[MASS2][:good][:head ][:mat]["139"] = 0.500
762
+ @@data[MASS2][:good][:jamb ][:mat]["139"] = 0.500
763
+ @@data[MASS2][:good][:sill ][:mat]["139"] = 0.500
764
+ @@data[MASS2][:good][:corner ][:mat][ "0"] = 1.000
765
+ @@data[MASS2][:good][:balcony ][:mat][ ""] = 1.000
766
+ @@data[MASS2][:good][:party ][:mat][ ""] = 1.000
767
+ @@data[MASS2][:good][:grade ][:mat]["189"] = 1.000
768
+ @@data[MASS2][:good][:grade ][:mat]["139"] = 0.500
769
+ @@data[MASS2][:good][:grade ][:mat]["192"] = 0.500
770
+ @@data[MASS2][:good][:joint ][:mat][ ""] = 1.000
771
+ @@data[MASS2][:good][:transition ][:mat][ ""] = 1.000
765
772
 
766
773
  @@data[MASSB][ :bad][:id ] = MASSB_BAD
767
- # @@data[MASSB][ :bad][:rimjoist ][:mat][ "21"] = 1.000
768
- # @@data[MASSB][ :bad][:rimjoist ][:mat]["172"] = 0.250
769
- # @@data[MASSB][ :bad][:parapet ][:mat][ "0"] = 1.000
770
- # @@data[MASSB][ :bad][:head ][:mat]["139"] = 0.750
771
- # @@data[MASSB][ :bad][:jamb ][:mat]["139"] = 0.750
772
- # @@data[MASSB][ :bad][:sill ][:mat]["139"] = 0.750
773
- # @@data[MASSB][ :bad][:corner ][:mat][ "0"] = 1.000
774
- # @@data[MASSB][ :bad][:balcony ][:mat][ ""] = 1.000
775
- # @@data[MASSB][ :bad][:party ][:mat][ ""] = 1.000
776
- # @@data[MASSB][ :bad][:grade ][:mat][ "21"] = 1.000
777
- # @@data[MASSB][ :bad][:grade ][:mat]["139"] = 0.500
778
- # @@data[MASSB][ :bad][:joint ][:mat][ ""] = 1.000
779
- # @@data[MASSB][ :bad][:transition ][:mat][ ""] = 1.000
774
+ @@data[MASSB][ :bad][:rimjoist ][:mat][ "21"] = 1.000
775
+ @@data[MASSB][ :bad][:rimjoist ][:mat]["172"] = 0.250
776
+ @@data[MASSB][ :bad][:parapet ][:mat][ "0"] = 1.000
777
+ @@data[MASSB][ :bad][:head ][:mat]["139"] = 0.750
778
+ @@data[MASSB][ :bad][:jamb ][:mat]["139"] = 0.750
779
+ @@data[MASSB][ :bad][:sill ][:mat]["139"] = 0.750
780
+ @@data[MASSB][ :bad][:corner ][:mat][ "0"] = 1.000
781
+ @@data[MASSB][ :bad][:balcony ][:mat][ ""] = 1.000
782
+ @@data[MASSB][ :bad][:party ][:mat][ ""] = 1.000
783
+ @@data[MASSB][ :bad][:grade ][:mat][ "21"] = 1.000
784
+ @@data[MASSB][ :bad][:grade ][:mat]["139"] = 0.500
785
+ @@data[MASSB][ :bad][:joint ][:mat][ ""] = 1.000
786
+ @@data[MASSB][ :bad][:transition ][:mat][ ""] = 1.000
780
787
 
781
788
  @@data[MASSB][:good][:id ] = MASSB_GOOD
782
- # @@data[MASSB][:good][:rimjoist ][:mat]["189"] = 1.000
783
- # @@data[MASSB][:good][:rimjoist ][:mat]["172"] = 0.500
784
- # @@data[MASSB][:good][:parapet ][:mat][ "57"] = 3.300
785
- # @@data[MASSB][:good][:parapet ][:mat]["139"] = 1.000
786
- # @@data[MASSB][:good][:head ][:mat]["139"] = 0.500
787
- # @@data[MASSB][:good][:jamb ][:mat]["139"] = 0.500
788
- # @@data[MASSB][:good][:sill ][:mat]["139"] = 0.500
789
- # @@data[MASSB][:good][:corner ][:mat][ "0"] = 1.000
790
- # @@data[MASSB][:good][:balcony ][:mat][ ""] = 1.000
791
- # @@data[MASSB][:good][:party ][:mat][ ""] = 1.000
792
- # @@data[MASSB][:good][:grade ][:mat]["189"] = 1.000
793
- # @@data[MASSB][:good][:grade ][:mat]["139"] = 0.500
794
- # @@data[MASSB][:good][:grade ][:mat]["192"] = 0.500
795
- # @@data[MASSB][:good][:joint ][:mat][ ""] = 1.000
796
- # @@data[MASSB][:good][:transition ][:mat][ ""] = 1.000
789
+ @@data[MASSB][:good][:rimjoist ][:mat]["189"] = 1.000
790
+ @@data[MASSB][:good][:rimjoist ][:mat]["172"] = 0.500
791
+ @@data[MASSB][:good][:parapet ][:mat][ "57"] = 3.300
792
+ @@data[MASSB][:good][:parapet ][:mat]["139"] = 1.000
793
+ @@data[MASSB][:good][:head ][:mat]["139"] = 0.500
794
+ @@data[MASSB][:good][:jamb ][:mat]["139"] = 0.500
795
+ @@data[MASSB][:good][:sill ][:mat]["139"] = 0.500
796
+ @@data[MASSB][:good][:corner ][:mat][ "0"] = 1.000
797
+ @@data[MASSB][:good][:balcony ][:mat][ ""] = 1.000
798
+ @@data[MASSB][:good][:party ][:mat][ ""] = 1.000
799
+ @@data[MASSB][:good][:grade ][:mat]["189"] = 1.000
800
+ @@data[MASSB][:good][:grade ][:mat]["139"] = 0.500
801
+ @@data[MASSB][:good][:grade ][:mat]["192"] = 0.500
802
+ @@data[MASSB][:good][:joint ][:mat][ ""] = 1.000
803
+ @@data[MASSB][:good][:transition ][:mat][ ""] = 1.000
797
804
 
798
805
  @@data[MASS4][ :bad][:id ] = MASS4_BAD
799
- # @@data[MASS4][ :bad][:rimjoist ][:mat][ "0"] = 1.000
800
- # @@data[MASS4][ :bad][:parapet ][:mat][ "0"] = 1.000
801
- # @@data[MASS4][ :bad][:head ][:mat]["139"] = 0.250
802
- # @@data[MASS4][ :bad][:jamb ][:mat]["139"] = 0.250
803
- # @@data[MASS4][ :bad][:sill ][:mat]["139"] = 0.250
804
- # @@data[MASS4][ :bad][:corner ][:mat]["141"] = 1.000
805
- # @@data[MASS4][ :bad][:balcony ][:mat][ ""] = 1.000
806
- # @@data[MASS4][ :bad][:party ][:mat][ ""] = 1.000
807
- # @@data[MASS4][ :bad][:grade ][:mat]["139"] = 0.500
808
- # @@data[MASS4][ :bad][:joint ][:mat][ ""] = 1.000
809
- # @@data[MASS4][ :bad][:transition ][:mat][ ""] = 1.000
806
+ @@data[MASS4][ :bad][:rimjoist ][:mat][ "0"] = 1.000
807
+ @@data[MASS4][ :bad][:parapet ][:mat][ "0"] = 1.000
808
+ @@data[MASS4][ :bad][:head ][:mat]["139"] = 0.250
809
+ @@data[MASS4][ :bad][:jamb ][:mat]["139"] = 0.250
810
+ @@data[MASS4][ :bad][:sill ][:mat]["139"] = 0.250
811
+ @@data[MASS4][ :bad][:corner ][:mat]["141"] = 1.000
812
+ @@data[MASS4][ :bad][:balcony ][:mat][ ""] = 1.000
813
+ @@data[MASS4][ :bad][:party ][:mat][ ""] = 1.000
814
+ @@data[MASS4][ :bad][:grade ][:mat]["139"] = 0.500
815
+ @@data[MASS4][ :bad][:joint ][:mat][ ""] = 1.000
816
+ @@data[MASS4][ :bad][:transition ][:mat][ ""] = 1.000
810
817
 
811
818
  @@data[MASS4][:good][:id ] = MASS4_GOOD
812
- # @@data[MASS4][:good][:rimjoist ][:mat][ "0"] = 1.000
813
- # @@data[MASS4][:good][:parapet ][:mat][ "57"] = 3.300
814
- # @@data[MASS4][:good][:parapet ][:mat]["139"] = 1.000
815
- # @@data[MASS4][:good][:head ][:mat]["139"] = 0.250
816
- # @@data[MASS4][:good][:head ][:mat]["150"] = 0.083
817
- # @@data[MASS4][:good][:jamb ][:mat]["139"] = 0.250
818
- # @@data[MASS4][:good][:jamb ][:mat]["150"] = 0.083
819
- # @@data[MASS4][:good][:sill ][:mat]["139"] = 0.250
820
- # @@data[MASS4][:good][:sill ][:mat]["150"] = 0.083
821
- # @@data[MASS4][:good][:corner ][:mat]["141"] = 1.250
822
- # @@data[MASS4][:good][:balcony ][:mat][ "0"] = 1.000
823
- # @@data[MASS4][:good][:party ][:mat][ ""] = 1.000
824
- # @@data[MASS4][:good][:grade ][:mat]["192"] = 0.500
825
- # @@data[MASS4][:good][:grade ][:mat]["139"] = 0.500
826
- # @@data[MASS4][:good][:joint ][:mat][ ""] = 1.000
827
- # @@data[MASS4][:good][:transition ][:mat][ ""] = 1.000
819
+ @@data[MASS4][:good][:rimjoist ][:mat][ "0"] = 1.000
820
+ @@data[MASS4][:good][:parapet ][:mat][ "57"] = 3.300
821
+ @@data[MASS4][:good][:parapet ][:mat]["139"] = 1.000
822
+ @@data[MASS4][:good][:head ][:mat]["139"] = 0.250
823
+ @@data[MASS4][:good][:head ][:mat]["150"] = 0.083
824
+ @@data[MASS4][:good][:jamb ][:mat]["139"] = 0.250
825
+ @@data[MASS4][:good][:jamb ][:mat]["150"] = 0.083
826
+ @@data[MASS4][:good][:sill ][:mat]["139"] = 0.250
827
+ @@data[MASS4][:good][:sill ][:mat]["150"] = 0.083
828
+ @@data[MASS4][:good][:corner ][:mat]["141"] = 1.250
829
+ @@data[MASS4][:good][:balcony ][:mat][ "0"] = 1.000
830
+ @@data[MASS4][:good][:party ][:mat][ ""] = 1.000
831
+ @@data[MASS4][:good][:grade ][:mat]["192"] = 0.500
832
+ @@data[MASS4][:good][:grade ][:mat]["139"] = 0.500
833
+ @@data[MASS4][:good][:joint ][:mat][ ""] = 1.000
834
+ @@data[MASS4][:good][:transition ][:mat][ ""] = 1.000
828
835
 
829
836
  @@data[MASS8][ :bad][:id ] = MASS8_BAD
830
- # @@data[MASS8][ :bad][:rimjoist ][:mat][ "0"] = 1.000
831
- # @@data[MASS8][ :bad][:parapet ][:mat][ "0"] = 1.000
832
- # @@data[MASS8][ :bad][:head ][:mat]["139"] = 0.250
833
- # @@data[MASS8][ :bad][:jamb ][:mat]["139"] = 0.250
834
- # @@data[MASS8][ :bad][:sill ][:mat]["139"] = 0.250
835
- # @@data[MASS8][ :bad][:corner ][:mat]["141"] = 1.000
836
- # @@data[MASS8][ :bad][:balcony ][:mat][ ""] = 1.000
837
- # @@data[MASS8][ :bad][:party ][:mat][ ""] = 1.000
838
- # @@data[MASS8][ :bad][:grade ][:mat]["139"] = 0.500
839
- # @@data[MASS8][ :bad][:joint ][:mat][ ""] = 1.000
840
- # @@data[MASS8][ :bad][:transition ][:mat][ ""] = 1.000
837
+ @@data[MASS8][ :bad][:rimjoist ][:mat][ "0"] = 1.000
838
+ @@data[MASS8][ :bad][:parapet ][:mat][ "0"] = 1.000
839
+ @@data[MASS8][ :bad][:head ][:mat]["139"] = 0.250
840
+ @@data[MASS8][ :bad][:jamb ][:mat]["139"] = 0.250
841
+ @@data[MASS8][ :bad][:sill ][:mat]["139"] = 0.250
842
+ @@data[MASS8][ :bad][:corner ][:mat]["141"] = 1.000
843
+ @@data[MASS8][ :bad][:balcony ][:mat][ ""] = 1.000
844
+ @@data[MASS8][ :bad][:party ][:mat][ ""] = 1.000
845
+ @@data[MASS8][ :bad][:grade ][:mat]["139"] = 0.500
846
+ @@data[MASS8][ :bad][:joint ][:mat][ ""] = 1.000
847
+ @@data[MASS8][ :bad][:transition ][:mat][ ""] = 1.000
841
848
 
842
849
  @@data[MASS8][:good][:id ] = MASS8_GOOD
843
- # @@data[MASS8][:good][:rimjoist ][:mat][ "0"] = 1.000
844
- # @@data[MASS8][:good][:parapet ][:mat][ "57"] = 3.300
845
- # @@data[MASS8][:good][:parapet ][:mat]["139"] = 1.000
846
- # @@data[MASS8][:good][:head ][:mat]["139"] = 0.250
847
- # @@data[MASS8][:good][:head ][:mat]["150"] = 0.083
848
- # @@data[MASS8][:good][:jamb ][:mat]["139"] = 0.250
849
- # @@data[MASS8][:good][:jamb ][:mat]["150"] = 0.083
850
- # @@data[MASS8][:good][:sill ][:mat]["139"] = 0.250
851
- # @@data[MASS8][:good][:sill ][:mat]["150"] = 0.083
852
- # @@data[MASS8][:good][:corner ][:mat]["141"] = 1.250
853
- # @@data[MASS8][:good][:balcony ][:mat][ "0"] = 1.000
854
- # @@data[MASS8][:good][:party ][:mat][ ""] = 1.000
855
- # @@data[MASS8][:good][:grade ][:mat]["192"] = 0.500
856
- # @@data[MASS8][:good][:grade ][:mat]["139"] = 0.500
857
- # @@data[MASS8][:good][:joint ][:mat][ ""] = 1.000
858
- # @@data[MASS8][:good][:transition ][:mat][ ""] = 1.000
850
+ @@data[MASS8][:good][:rimjoist ][:mat][ "0"] = 1.000
851
+ @@data[MASS8][:good][:parapet ][:mat][ "57"] = 3.300
852
+ @@data[MASS8][:good][:parapet ][:mat]["139"] = 1.000
853
+ @@data[MASS8][:good][:head ][:mat]["139"] = 0.250
854
+ @@data[MASS8][:good][:head ][:mat]["150"] = 0.083
855
+ @@data[MASS8][:good][:jamb ][:mat]["139"] = 0.250
856
+ @@data[MASS8][:good][:jamb ][:mat]["150"] = 0.083
857
+ @@data[MASS8][:good][:sill ][:mat]["139"] = 0.250
858
+ @@data[MASS8][:good][:sill ][:mat]["150"] = 0.083
859
+ @@data[MASS8][:good][:corner ][:mat]["141"] = 1.250
860
+ @@data[MASS8][:good][:balcony ][:mat][ "0"] = 1.000
861
+ @@data[MASS8][:good][:party ][:mat][ ""] = 1.000
862
+ @@data[MASS8][:good][:grade ][:mat]["192"] = 0.500
863
+ @@data[MASS8][:good][:grade ][:mat]["139"] = 0.500
864
+ @@data[MASS8][:good][:joint ][:mat][ ""] = 1.000
865
+ @@data[MASS8][:good][:transition ][:mat][ ""] = 1.000
859
866
 
860
867
  @@data[MASS6][ :bad][:id ] = MASS6_BAD
861
- # @@data[MASS6][ :bad][:rimjoist ][:mat][ "21"] = 1.000
862
- # @@data[MASS6][ :bad][:rimjoist ][:mat]["172"] = 0.250
863
- # @@data[MASS6][ :bad][:parapet ][:mat][ "0"] = 1.000
864
- # @@data[MASS6][ :bad][:head ][:mat]["139"] = 0.750
865
- # @@data[MASS6][ :bad][:jamb ][:mat]["139"] = 0.750
866
- # @@data[MASS6][ :bad][:sill ][:mat]["139"] = 0.750
867
- # @@data[MASS6][ :bad][:corner ][:mat][ "0"] = 1.000
868
- # @@data[MASS6][ :bad][:balcony ][:mat][ ""] = 1.000
869
- # @@data[MASS6][ :bad][:party ][:mat][ ""] = 1.000
870
- # @@data[MASS6][ :bad][:grade ][:mat][ "21"] = 1.000
871
- # @@data[MASS6][ :bad][:grade ][:mat]["139"] = 0.500
872
- # @@data[MASS6][ :bad][:joint ][:mat][ ""] = 1.000
873
- # @@data[MASS6][ :bad][:transition ][:mat][ ""] = 1.000
868
+ @@data[MASS6][ :bad][:rimjoist ][:mat][ "21"] = 1.000
869
+ @@data[MASS6][ :bad][:rimjoist ][:mat]["172"] = 0.250
870
+ @@data[MASS6][ :bad][:parapet ][:mat][ "0"] = 1.000
871
+ @@data[MASS6][ :bad][:head ][:mat]["139"] = 0.750
872
+ @@data[MASS6][ :bad][:jamb ][:mat]["139"] = 0.750
873
+ @@data[MASS6][ :bad][:sill ][:mat]["139"] = 0.750
874
+ @@data[MASS6][ :bad][:corner ][:mat][ "0"] = 1.000
875
+ @@data[MASS6][ :bad][:balcony ][:mat][ ""] = 1.000
876
+ @@data[MASS6][ :bad][:party ][:mat][ ""] = 1.000
877
+ @@data[MASS6][ :bad][:grade ][:mat][ "21"] = 1.000
878
+ @@data[MASS6][ :bad][:grade ][:mat]["139"] = 0.500
879
+ @@data[MASS6][ :bad][:joint ][:mat][ ""] = 1.000
880
+ @@data[MASS6][ :bad][:transition ][:mat][ ""] = 1.000
874
881
 
875
882
  @@data[MASS6][:good][:id ] = MASS6_GOOD
876
- # @@data[MASS6][:good][:rimjoist ][:mat]["189"] = 1.000
877
- # @@data[MASS6][:good][:rimjoist ][:mat]["172"] = 0.500
878
- # @@data[MASS6][:good][:parapet ][:mat][ "57"] = 3.300
879
- # @@data[MASS6][:good][:parapet ][:mat]["139"] = 1.000
880
- # @@data[MASS6][:good][:head ][:mat]["139"] = 0.500
881
- # @@data[MASS6][:good][:jamb ][:mat]["139"] = 0.500
882
- # @@data[MASS6][:good][:sill ][:mat]["139"] = 0.500
883
- # @@data[MASS6][:good][:corner ][:mat][ "0"] = 1.000
884
- # @@data[MASS6][:good][:balcony ][:mat][ ""] = 1.000
885
- # @@data[MASS6][:good][:party ][:mat][ ""] = 1.000
886
- # @@data[MASS6][:good][:grade ][:mat]["189"] = 1.000
887
- # @@data[MASS6][:good][:grade ][:mat]["139"] = 0.500
888
- # @@data[MASS6][:good][:grade ][:mat]["192"] = 0.500
889
- # @@data[MASS6][:good][:joint ][:mat][ ""] = 1.000
890
- # @@data[MASS6][:good][:transition ][:mat][ ""] = 1.000
883
+ @@data[MASS6][:good][:rimjoist ][:mat]["189"] = 1.000
884
+ @@data[MASS6][:good][:rimjoist ][:mat]["172"] = 0.500
885
+ @@data[MASS6][:good][:parapet ][:mat][ "57"] = 3.300
886
+ @@data[MASS6][:good][:parapet ][:mat]["139"] = 1.000
887
+ @@data[MASS6][:good][:head ][:mat]["139"] = 0.500
888
+ @@data[MASS6][:good][:jamb ][:mat]["139"] = 0.500
889
+ @@data[MASS6][:good][:sill ][:mat]["139"] = 0.500
890
+ @@data[MASS6][:good][:corner ][:mat][ "0"] = 1.000
891
+ @@data[MASS6][:good][:balcony ][:mat][ ""] = 1.000
892
+ @@data[MASS6][:good][:party ][:mat][ ""] = 1.000
893
+ @@data[MASS6][:good][:grade ][:mat]["189"] = 1.000
894
+ @@data[MASS6][:good][:grade ][:mat]["139"] = 0.500
895
+ @@data[MASS6][:good][:grade ][:mat]["192"] = 0.500
896
+ @@data[MASS6][:good][:joint ][:mat][ ""] = 1.000
897
+ @@data[MASS6][:good][:transition ][:mat][ ""] = 1.000
891
898
 
892
899
  @@data[MASSC][ :bad][:id ] = MASSC_BAD
893
- # @@data[MASSC][ :bad][:rimjoist ][:mat]["139"] = 10.000
894
- # @@data[MASSC][ :bad][:parapet ][:mat][ "0"] = 1.000
895
- # @@data[MASSC][ :bad][:head ][:mat]["139"] = 0.750
896
- # @@data[MASSC][ :bad][:jamb ][:mat]["139"] = 0.750
897
- # @@data[MASSC][ :bad][:sill ][:mat]["139"] = 0.750
898
- # @@data[MASSC][ :bad][:corner ][:mat][ "0"] = 1.000
899
- # @@data[MASSC][ :bad][:balcony ][:mat][ ""] = 1.000
900
- # @@data[MASSC][ :bad][:party ][:mat][ ""] = 1.000
901
- # @@data[MASSC][ :bad][:grade ][:mat]["139"] = 0.000
902
- # @@data[MASSC][ :bad][:joint ][:mat][ ""] = 1.000
903
- # @@data[MASSC][ :bad][:transition ][:mat][ ""] = 1.000
900
+ @@data[MASSC][ :bad][:rimjoist ][:mat]["139"] = 10.000
901
+ @@data[MASSC][ :bad][:parapet ][:mat][ "0"] = 1.000
902
+ @@data[MASSC][ :bad][:head ][:mat]["139"] = 0.750
903
+ @@data[MASSC][ :bad][:jamb ][:mat]["139"] = 0.750
904
+ @@data[MASSC][ :bad][:sill ][:mat]["139"] = 0.750
905
+ @@data[MASSC][ :bad][:corner ][:mat][ "0"] = 1.000
906
+ @@data[MASSC][ :bad][:balcony ][:mat][ ""] = 1.000
907
+ @@data[MASSC][ :bad][:party ][:mat][ ""] = 1.000
908
+ @@data[MASSC][ :bad][:grade ][:mat]["139"] = 0.000
909
+ @@data[MASSC][ :bad][:joint ][:mat][ ""] = 1.000
910
+ @@data[MASSC][ :bad][:transition ][:mat][ ""] = 1.000
904
911
 
905
912
  @@data[MASSC][:good][:id ] = MASSC_GOOD
906
- # @@data[MASSC][:good][:rimjoist ][:mat]["172"] = 0.500
907
- # @@data[MASSC][:good][:parapet ][:mat][ "57"] = 3.300
908
- # @@data[MASSC][:good][:parapet ][:mat]["139"] = 1.000
909
- # @@data[MASSC][:good][:head ][:mat]["139"] = 0.500
910
- # @@data[MASSC][:good][:jamb ][:mat]["139"] = 0.500
911
- # @@data[MASSC][:good][:sill ][:mat]["139"] = 0.500
912
- # @@data[MASSC][:good][:corner ][:mat][ "0"] = 1.000
913
- # @@data[MASSC][:good][:balcony ][:mat][ ""] = 1.000
914
- # @@data[MASSC][:good][:party ][:mat][ ""] = 1.000
915
- # @@data[MASSC][:good][:grade ][:mat]["192"] = 1.000
916
- # @@data[MASSC][:good][:grade ][:mat]["139"] = 1.000
917
- # @@data[MASSC][:good][:joint ][:mat][ ""] = 1.000
918
- # @@data[MASSC][:good][:transition ][:mat][ ""] = 1.000
913
+ @@data[MASSC][:good][:rimjoist ][:mat]["172"] = 0.500
914
+ @@data[MASSC][:good][:parapet ][:mat][ "57"] = 3.300
915
+ @@data[MASSC][:good][:parapet ][:mat]["139"] = 1.000
916
+ @@data[MASSC][:good][:head ][:mat]["139"] = 0.500
917
+ @@data[MASSC][:good][:jamb ][:mat]["139"] = 0.500
918
+ @@data[MASSC][:good][:sill ][:mat]["139"] = 0.500
919
+ @@data[MASSC][:good][:corner ][:mat][ "0"] = 1.000
920
+ @@data[MASSC][:good][:balcony ][:mat][ ""] = 1.000
921
+ @@data[MASSC][:good][:party ][:mat][ ""] = 1.000
922
+ @@data[MASSC][:good][:grade ][:mat]["192"] = 1.000
923
+ @@data[MASSC][:good][:grade ][:mat]["139"] = 1.000
924
+ @@data[MASSC][:good][:joint ][:mat][ ""] = 1.000
925
+ @@data[MASSC][:good][:transition ][:mat][ ""] = 1.000
919
926
 
920
927
  @@data[MTAL1][ :bad][:id ] = MTAL1_BAD
921
- # @@data[MTAL1][ :bad][:rimjoist ][:mat][ "0"] = 1.000
922
- # @@data[MTAL1][ :bad][:parapet ][:mat][ "0"] = 1.000
923
- # @@data[MTAL1][ :bad][:head ][:mat]["139"] = 1.000
924
- # @@data[MTAL1][ :bad][:jamb ][:mat]["139"] = 1.000
925
- # @@data[MTAL1][ :bad][:sill ][:mat]["139"] = 1.000
926
- # @@data[MTAL1][ :bad][:corner ][:mat]["191"] = 1.000
927
- # @@data[MTAL1][ :bad][:balcony ][:mat][ ""] = 1.000
928
- # @@data[MTAL1][ :bad][:party ][:mat][ ""] = 1.000
929
- # @@data[MTAL1][ :bad][:grade ][:mat]["139"] = 0.500
930
- # @@data[MTAL1][ :bad][:joint ][:mat][ ""] = 1.000
931
- # @@data[MTAL1][ :bad][:transition ][:mat][ ""] = 1.000
928
+ @@data[MTAL1][ :bad][:rimjoist ][:mat][ "0"] = 1.000
929
+ @@data[MTAL1][ :bad][:parapet ][:mat][ "0"] = 1.000
930
+ @@data[MTAL1][ :bad][:head ][:mat]["139"] = 1.000
931
+ @@data[MTAL1][ :bad][:jamb ][:mat]["139"] = 1.000
932
+ @@data[MTAL1][ :bad][:sill ][:mat]["139"] = 1.000
933
+ @@data[MTAL1][ :bad][:corner ][:mat]["191"] = 1.000
934
+ @@data[MTAL1][ :bad][:balcony ][:mat][ ""] = 1.000
935
+ @@data[MTAL1][ :bad][:party ][:mat][ ""] = 1.000
936
+ @@data[MTAL1][ :bad][:grade ][:mat]["139"] = 0.500
937
+ @@data[MTAL1][ :bad][:joint ][:mat][ ""] = 1.000
938
+ @@data[MTAL1][ :bad][:transition ][:mat][ ""] = 1.000
932
939
 
933
940
  @@data[MTAL1][:good][:id ] = MTAL1_GOOD
934
- # @@data[MTAL1][:good][:rimjoist ][:mat][ "0"] = 1.000
935
- # @@data[MTAL1][:good][:parapet ][:mat][ "57"] = 3.300
936
- # @@data[MTAL1][:good][:parapet ][:mat]["139"] = 1.000
937
- # @@data[MTAL1][:good][:head ][:mat]["139"] = 0.500
938
- # @@data[MTAL1][:good][:jamb ][:mat]["139"] = 0.500
939
- # @@data[MTAL1][:good][:sill ][:mat]["139"] = 0.500
940
- # @@data[MTAL1][:good][:corner ][:mat]["191"] = 1.000
941
- # @@data[MTAL1][:good][:balcony ][:mat][ ""] = 1.000
942
- # @@data[MTAL1][:good][:party ][:mat][ ""] = 1.000
943
- # @@data[MTAL1][:good][:grade ][:mat]["192"] = 0.500
944
- # @@data[MTAL1][:good][:grade ][:mat]["139"] = 0.500
945
- # @@data[MTAL1][:good][:joint ][:mat][ ""] = 1.000
946
- # @@data[MTAL1][:good][:transition ][:mat][ ""] = 1.000
941
+ @@data[MTAL1][:good][:rimjoist ][:mat][ "0"] = 1.000
942
+ @@data[MTAL1][:good][:parapet ][:mat][ "57"] = 3.300
943
+ @@data[MTAL1][:good][:parapet ][:mat]["139"] = 1.000
944
+ @@data[MTAL1][:good][:head ][:mat]["139"] = 0.500
945
+ @@data[MTAL1][:good][:jamb ][:mat]["139"] = 0.500
946
+ @@data[MTAL1][:good][:sill ][:mat]["139"] = 0.500
947
+ @@data[MTAL1][:good][:corner ][:mat]["191"] = 1.000
948
+ @@data[MTAL1][:good][:balcony ][:mat][ ""] = 1.000
949
+ @@data[MTAL1][:good][:party ][:mat][ ""] = 1.000
950
+ @@data[MTAL1][:good][:grade ][:mat]["192"] = 0.500
951
+ @@data[MTAL1][:good][:grade ][:mat]["139"] = 0.500
952
+ @@data[MTAL1][:good][:joint ][:mat][ ""] = 1.000
953
+ @@data[MTAL1][:good][:transition ][:mat][ ""] = 1.000
947
954
 
948
955
  @@data[MTALD][ :bad][:id ] = MTALD_BAD
949
- # @@data[MTALD][ :bad][:rimjoist ][:mat][ "0"] = 1.000
950
- # @@data[MTALD][ :bad][:parapet ][:mat][ "0"] = 1.000
951
- # @@data[MTALD][ :bad][:head ][:mat]["139"] = 1.000
952
- # @@data[MTALD][ :bad][:jamb ][:mat]["139"] = 1.000
953
- # @@data[MTALD][ :bad][:sill ][:mat]["139"] = 1.000
954
- # @@data[MTALD][ :bad][:corner ][:mat]["191"] = 1.000
955
- # @@data[MTALD][ :bad][:balcony ][:mat][ ""] = 1.000
956
- # @@data[MTALD][ :bad][:party ][:mat][ ""] = 1.000
957
- # @@data[MTALD][ :bad][:grade ][:mat]["139"] = 0.500
958
- # @@data[MTALD][ :bad][:joint ][:mat][ ""] = 1.000
959
- # @@data[MTALD][ :bad][:transition ][:mat][ ""] = 1.000
956
+ @@data[MTALD][ :bad][:rimjoist ][:mat][ "0"] = 1.000
957
+ @@data[MTALD][ :bad][:parapet ][:mat][ "0"] = 1.000
958
+ @@data[MTALD][ :bad][:head ][:mat]["139"] = 1.000
959
+ @@data[MTALD][ :bad][:jamb ][:mat]["139"] = 1.000
960
+ @@data[MTALD][ :bad][:sill ][:mat]["139"] = 1.000
961
+ @@data[MTALD][ :bad][:corner ][:mat]["191"] = 1.000
962
+ @@data[MTALD][ :bad][:balcony ][:mat][ ""] = 1.000
963
+ @@data[MTALD][ :bad][:party ][:mat][ ""] = 1.000
964
+ @@data[MTALD][ :bad][:grade ][:mat]["139"] = 0.500
965
+ @@data[MTALD][ :bad][:joint ][:mat][ ""] = 1.000
966
+ @@data[MTALD][ :bad][:transition ][:mat][ ""] = 1.000
960
967
 
961
968
  @@data[MTALD][:good][:id ] = MTALD_GOOD
962
- # @@data[MTALD][:good][:rimjoist ][:mat][ "0"] = 1.000
963
- # @@data[MTALD][:good][:parapet ][:mat][ "57"] = 3.300
964
- # @@data[MTALD][:good][:parapet ][:mat]["139"] = 1.000
965
- # @@data[MTALD][:good][:head ][:mat]["139"] = 0.500
966
- # @@data[MTALD][:good][:jamb ][:mat]["139"] = 0.500
967
- # @@data[MTALD][:good][:sill ][:mat]["139"] = 0.500
968
- # @@data[MTALD][:good][:corner ][:mat]["191"] = 1.000
969
- # @@data[MTALD][:good][:balcony ][:mat][ ""] = 1.000
970
- # @@data[MTALD][:good][:party ][:mat][ ""] = 1.000
971
- # @@data[MTALD][:good][:grade ][:mat]["192"] = 0.500
972
- # @@data[MTALD][:good][:grade ][:mat]["139"] = 0.500
973
- # @@data[MTALD][:good][:joint ][:mat][ ""] = 1.000
974
- # @@data[MTALD][:good][:transition ][:mat][ ""] = 1.000
969
+ @@data[MTALD][:good][:rimjoist ][:mat][ "0"] = 1.000
970
+ @@data[MTALD][:good][:parapet ][:mat][ "57"] = 3.300
971
+ @@data[MTALD][:good][:parapet ][:mat]["139"] = 1.000
972
+ @@data[MTALD][:good][:head ][:mat]["139"] = 0.500
973
+ @@data[MTALD][:good][:jamb ][:mat]["139"] = 0.500
974
+ @@data[MTALD][:good][:sill ][:mat]["139"] = 0.500
975
+ @@data[MTALD][:good][:corner ][:mat]["191"] = 1.000
976
+ @@data[MTALD][:good][:balcony ][:mat][ ""] = 1.000
977
+ @@data[MTALD][:good][:party ][:mat][ ""] = 1.000
978
+ @@data[MTALD][:good][:grade ][:mat]["192"] = 0.500
979
+ @@data[MTALD][:good][:grade ][:mat]["139"] = 0.500
980
+ @@data[MTALD][:good][:joint ][:mat][ ""] = 1.000
981
+ @@data[MTALD][:good][:transition ][:mat][ ""] = 1.000
975
982
 
976
983
  @@data[WOOD5][ :bad][:id ] = WOOD5_BAD
977
- # @@data[WOOD5][ :bad][:rimjoist ][:mat][ "21"] = 1.000
978
- # @@data[WOOD5][ :bad][:rimjoist ][:mat]["172"] = 0.250
979
- # @@data[WOOD5][ :bad][:parapet ][:mat][ "0"] = 1.000
980
- # @@data[WOOD5][ :bad][:head ][:mat][ "0"] = 1.000
981
- # @@data[WOOD5][ :bad][:jamb ][:mat][ "0"] = 1.000
982
- # @@data[WOOD5][ :bad][:sill ][:mat][ "0"] = 1.000
983
- # @@data[WOOD5][ :bad][:corner ][:mat][ "0"] = 1.000
984
- # @@data[WOOD5][ :bad][:balcony ][:mat][ ""] = 1.000
985
- # @@data[WOOD5][ :bad][:party ][:mat][ ""] = 1.000
986
- # @@data[WOOD5][ :bad][:grade ][:mat][ "21"] = 1.000
987
- # @@data[WOOD5][ :bad][:grade ][:mat]["139"] = 0.500
988
- # @@data[WOOD5][ :bad][:joint ][:mat][ ""] = 1.000
989
- # @@data[WOOD5][ :bad][:transition ][:mat][ ""] = 1.000
984
+ @@data[WOOD5][ :bad][:rimjoist ][:mat][ "21"] = 1.000
985
+ @@data[WOOD5][ :bad][:rimjoist ][:mat]["172"] = 0.250
986
+ @@data[WOOD5][ :bad][:parapet ][:mat][ "0"] = 1.000
987
+ @@data[WOOD5][ :bad][:head ][:mat][ "0"] = 1.000
988
+ @@data[WOOD5][ :bad][:jamb ][:mat][ "0"] = 1.000
989
+ @@data[WOOD5][ :bad][:sill ][:mat][ "0"] = 1.000
990
+ @@data[WOOD5][ :bad][:corner ][:mat][ "0"] = 1.000
991
+ @@data[WOOD5][ :bad][:balcony ][:mat][ ""] = 1.000
992
+ @@data[WOOD5][ :bad][:party ][:mat][ ""] = 1.000
993
+ @@data[WOOD5][ :bad][:grade ][:mat][ "21"] = 1.000
994
+ @@data[WOOD5][ :bad][:grade ][:mat]["139"] = 0.500
995
+ @@data[WOOD5][ :bad][:joint ][:mat][ ""] = 1.000
996
+ @@data[WOOD5][ :bad][:transition ][:mat][ ""] = 1.000
990
997
 
991
998
  @@data[WOOD5][:good][:id ] = WOOD5_GOOD
992
- # @@data[WOOD5][:good][:rimjoist ][:mat]["189"] = 1.000
993
- # @@data[WOOD5][:good][:rimjoist ][:mat]["172"] = 0.500
994
- # @@data[WOOD5][:good][:parapet ][:mat]["190"] = 0.500
995
- # @@data[WOOD5][:good][:head ][:mat][ "0"] = 1.000
996
- # @@data[WOOD5][:good][:jamb ][:mat][ "0"] = 1.000
997
- # @@data[WOOD5][:good][:sill ][:mat][ "0"] = 1.000
998
- # @@data[WOOD5][:good][:corner ][:mat][ "0"] = 1.000
999
- # @@data[WOOD5][:good][:balcony ][:mat][ ""] = 1.000
1000
- # @@data[WOOD5][:good][:party ][:mat][ ""] = 1.000
1001
- # @@data[WOOD5][:good][:grade ][:mat]["189"] = 1.000
1002
- # @@data[WOOD5][:good][:grade ][:mat]["139"] = 0.500
1003
- # @@data[WOOD5][:good][:grade ][:mat]["192"] = 0.500
1004
- # @@data[WOOD5][:good][:joint ][:mat][ ""] = 1.000
1005
- # @@data[WOOD5][:good][:transition ][:mat][ ""] = 1.000
999
+ @@data[WOOD5][:good][:rimjoist ][:mat]["189"] = 1.000
1000
+ @@data[WOOD5][:good][:rimjoist ][:mat]["172"] = 0.500
1001
+ @@data[WOOD5][:good][:parapet ][:mat]["190"] = 0.500
1002
+ @@data[WOOD5][:good][:head ][:mat][ "0"] = 1.000
1003
+ @@data[WOOD5][:good][:jamb ][:mat][ "0"] = 1.000
1004
+ @@data[WOOD5][:good][:sill ][:mat][ "0"] = 1.000
1005
+ @@data[WOOD5][:good][:corner ][:mat][ "0"] = 1.000
1006
+ @@data[WOOD5][:good][:balcony ][:mat][ ""] = 1.000
1007
+ @@data[WOOD5][:good][:party ][:mat][ ""] = 1.000
1008
+ @@data[WOOD5][:good][:grade ][:mat]["189"] = 1.000
1009
+ @@data[WOOD5][:good][:grade ][:mat]["139"] = 0.500
1010
+ @@data[WOOD5][:good][:grade ][:mat]["192"] = 0.500
1011
+ @@data[WOOD5][:good][:joint ][:mat][ ""] = 1.000
1012
+ @@data[WOOD5][:good][:transition ][:mat][ ""] = 1.000
1006
1013
 
1007
1014
  @@data[WOOD7][ :bad][:id ] = WOOD7_BAD
1008
- # @@data[WOOD7][ :bad][:rimjoist ][:mat][ "21"] = 1.000
1009
- # @@data[WOOD7][ :bad][:rimjoist ][:mat]["172"] = 0.250
1010
- # @@data[WOOD7][ :bad][:parapet ][:mat][ "0"] = 1.000
1011
- # @@data[WOOD7][ :bad][:head ][:mat][ "0"] = 1.000
1012
- # @@data[WOOD7][ :bad][:jamb ][:mat][ "0"] = 1.000
1013
- # @@data[WOOD7][ :bad][:sill ][:mat][ "0"] = 1.000
1014
- # @@data[WOOD7][ :bad][:corner ][:mat][ "0"] = 1.000
1015
- # @@data[WOOD7][ :bad][:balcony ][:mat][ ""] = 1.000
1016
- # @@data[WOOD7][ :bad][:party ][:mat][ ""] = 1.000
1017
- # @@data[WOOD7][ :bad][:grade ][:mat][ "21"] = 1.000
1018
- # @@data[WOOD7][ :bad][:grade ][:mat]["139"] = 0.500
1019
- # @@data[WOOD7][ :bad][:joint ][:mat][ ""] = 1.000
1020
- # @@data[WOOD7][ :bad][:transition ][:mat][ ""] = 1.000
1015
+ @@data[WOOD7][ :bad][:rimjoist ][:mat][ "21"] = 1.000
1016
+ @@data[WOOD7][ :bad][:rimjoist ][:mat]["172"] = 0.250
1017
+ @@data[WOOD7][ :bad][:parapet ][:mat][ "0"] = 1.000
1018
+ @@data[WOOD7][ :bad][:head ][:mat][ "0"] = 1.000
1019
+ @@data[WOOD7][ :bad][:jamb ][:mat][ "0"] = 1.000
1020
+ @@data[WOOD7][ :bad][:sill ][:mat][ "0"] = 1.000
1021
+ @@data[WOOD7][ :bad][:corner ][:mat][ "0"] = 1.000
1022
+ @@data[WOOD7][ :bad][:balcony ][:mat][ ""] = 1.000
1023
+ @@data[WOOD7][ :bad][:party ][:mat][ ""] = 1.000
1024
+ @@data[WOOD7][ :bad][:grade ][:mat][ "21"] = 1.000
1025
+ @@data[WOOD7][ :bad][:grade ][:mat]["139"] = 0.500
1026
+ @@data[WOOD7][ :bad][:joint ][:mat][ ""] = 1.000
1027
+ @@data[WOOD7][ :bad][:transition ][:mat][ ""] = 1.000
1021
1028
 
1022
1029
  @@data[WOOD7][:good][:id ] = WOOD7_GOOD
1023
- # @@data[WOOD7][:good][:rimjoist ][:mat]["189"] = 1.000
1024
- # @@data[WOOD7][:good][:rimjoist ][:mat]["172"] = 0.500
1025
- # @@data[WOOD7][:good][:parapet ][:mat]["190"] = 0.500
1026
- # @@data[WOOD7][:good][:head ][:mat][ "0"] = 1.000
1027
- # @@data[WOOD7][:good][:jamb ][:mat][ "0"] = 1.000
1028
- # @@data[WOOD7][:good][:sill ][:mat][ "0"] = 1.000
1029
- # @@data[WOOD7][:good][:corner ][:mat][ "0"] = 1.000
1030
- # @@data[WOOD7][:good][:balcony ][:mat][ ""] = 1.000
1031
- # @@data[WOOD7][:good][:party ][:mat][ ""] = 1.000
1032
- # @@data[WOOD7][:good][:grade ][:mat]["189"] = 1.000
1033
- # @@data[WOOD7][:good][:grade ][:mat]["139"] = 0.500
1034
- # @@data[WOOD7][:good][:grade ][:mat]["192"] = 0.500
1035
- # @@data[WOOD7][:good][:joint ][:mat][ ""] = 1.000
1036
- # @@data[WOOD7][:good][:transition ][:mat][ ""] = 1.000
1030
+ @@data[WOOD7][:good][:rimjoist ][:mat]["189"] = 1.000
1031
+ @@data[WOOD7][:good][:rimjoist ][:mat]["172"] = 0.500
1032
+ @@data[WOOD7][:good][:parapet ][:mat]["190"] = 0.500
1033
+ @@data[WOOD7][:good][:head ][:mat][ "0"] = 1.000
1034
+ @@data[WOOD7][:good][:jamb ][:mat][ "0"] = 1.000
1035
+ @@data[WOOD7][:good][:sill ][:mat][ "0"] = 1.000
1036
+ @@data[WOOD7][:good][:corner ][:mat][ "0"] = 1.000
1037
+ @@data[WOOD7][:good][:balcony ][:mat][ ""] = 1.000
1038
+ @@data[WOOD7][:good][:party ][:mat][ ""] = 1.000
1039
+ @@data[WOOD7][:good][:grade ][:mat]["189"] = 1.000
1040
+ @@data[WOOD7][:good][:grade ][:mat]["139"] = 0.500
1041
+ @@data[WOOD7][:good][:grade ][:mat]["192"] = 0.500
1042
+ @@data[WOOD7][:good][:joint ][:mat][ ""] = 1.000
1043
+ @@data[WOOD7][:good][:transition ][:mat][ ""] = 1.000
1037
1044
 
1038
1045
  @@data[STEL1][ :bad][:id ] = STEL1_BAD
1039
- # @@data[STEL1][ :bad][:rimjoist ][:mat]["139"] = 10.000
1040
- # @@data[STEL1][ :bad][:parapet ][:mat][ "0"] = 1.000
1041
- # @@data[STEL1][ :bad][:head ][:mat]["139"] = 0.750
1042
- # @@data[STEL1][ :bad][:jamb ][:mat]["139"] = 0.750
1043
- # @@data[STEL1][ :bad][:sill ][:mat]["139"] = 0.750
1044
- # @@data[STEL1][ :bad][:corner ][:mat][ "0"] = 1.000
1045
- # @@data[STEL1][ :bad][:balcony ][:mat][ ""] = 1.000
1046
- # @@data[STEL1][ :bad][:party ][:mat][ ""] = 1.000
1047
- # @@data[STEL1][ :bad][:grade ][:mat]["139"] = 1.000
1048
- # @@data[STEL1][ :bad][:joint ][:mat][ ""] = 1.000
1049
- # @@data[STEL1][ :bad][:transition ][:mat][ ""] = 1.000
1046
+ @@data[STEL1][ :bad][:rimjoist ][:mat]["139"] = 10.000
1047
+ @@data[STEL1][ :bad][:parapet ][:mat][ "0"] = 1.000
1048
+ @@data[STEL1][ :bad][:head ][:mat]["139"] = 0.750
1049
+ @@data[STEL1][ :bad][:jamb ][:mat]["139"] = 0.750
1050
+ @@data[STEL1][ :bad][:sill ][:mat]["139"] = 0.750
1051
+ @@data[STEL1][ :bad][:corner ][:mat][ "0"] = 1.000
1052
+ @@data[STEL1][ :bad][:balcony ][:mat][ ""] = 1.000
1053
+ @@data[STEL1][ :bad][:party ][:mat][ ""] = 1.000
1054
+ @@data[STEL1][ :bad][:grade ][:mat]["139"] = 1.000
1055
+ @@data[STEL1][ :bad][:joint ][:mat][ ""] = 1.000
1056
+ @@data[STEL1][ :bad][:transition ][:mat][ ""] = 1.000
1050
1057
 
1051
1058
  @@data[STEL1][:good][:id ] = STEL1_GOOD
1052
- # @@data[STEL1][:good][:rimjoist ][:mat]["172"] = 0.500
1053
- # @@data[STEL1][:good][:parapet ][:mat][ "57"] = 3.300
1054
- # @@data[STEL1][:good][:parapet ][:mat]["139"] = 1.000
1055
- # @@data[STEL1][:good][:head ][:mat]["139"] = 0.500
1056
- # @@data[STEL1][:good][:jamb ][:mat]["139"] = 0.500
1057
- # @@data[STEL1][:good][:sill ][:mat]["139"] = 0.500
1058
- # @@data[STEL1][:good][:corner ][:mat][ "0"] = 1.000
1059
- # @@data[STEL1][:good][:balcony ][:mat][ ""] = 1.000
1060
- # @@data[STEL1][:good][:party ][:mat][ ""] = 1.000
1061
- # @@data[STEL1][:good][:grade ][:mat]["192"] = 1.000
1062
- # @@data[STEL1][:good][:grade ][:mat]["139"] = 1.000
1063
- # @@data[STEL1][:good][:joint ][:mat][ ""] = 1.000
1064
- # @@data[STEL1][:good][:transition ][:mat][ ""] = 1.000
1059
+ @@data[STEL1][:good][:rimjoist ][:mat]["172"] = 0.500
1060
+ @@data[STEL1][:good][:parapet ][:mat][ "57"] = 3.300
1061
+ @@data[STEL1][:good][:parapet ][:mat]["139"] = 1.000
1062
+ @@data[STEL1][:good][:head ][:mat]["139"] = 0.500
1063
+ @@data[STEL1][:good][:jamb ][:mat]["139"] = 0.500
1064
+ @@data[STEL1][:good][:sill ][:mat]["139"] = 0.500
1065
+ @@data[STEL1][:good][:corner ][:mat][ "0"] = 1.000
1066
+ @@data[STEL1][:good][:balcony ][:mat][ ""] = 1.000
1067
+ @@data[STEL1][:good][:party ][:mat][ ""] = 1.000
1068
+ @@data[STEL1][:good][:grade ][:mat]["192"] = 1.000
1069
+ @@data[STEL1][:good][:grade ][:mat]["139"] = 1.000
1070
+ @@data[STEL1][:good][:joint ][:mat][ ""] = 1.000
1071
+ @@data[STEL1][:good][:transition ][:mat][ ""] = 1.000
1065
1072
 
1066
1073
  @@data[STEL2][ :bad][:id ] = STEL2_BAD
1067
- # @@data[STEL2][ :bad][:rimjoist ][:mat]["139"] = 10.000
1068
- # @@data[STEL2][ :bad][:parapet ][:mat][ "0"] = 1.000
1069
- # @@data[STEL2][ :bad][:head ][:mat]["139"] = 0.750
1070
- # @@data[STEL2][ :bad][:jamb ][:mat]["139"] = 0.750
1071
- # @@data[STEL2][ :bad][:sill ][:mat]["139"] = 0.750
1072
- # @@data[STEL2][ :bad][:corner ][:mat][ "0"] = 1.000
1073
- # @@data[STEL2][ :bad][:balcony ][:mat][ ""] = 1.000
1074
- # @@data[STEL2][ :bad][:party ][:mat][ ""] = 1.000
1075
- # @@data[STEL2][ :bad][:grade ][:mat]["139"] = 1.000
1076
- # @@data[STEL2][ :bad][:joint ][:mat][ ""] = 1.000
1077
- # @@data[STEL2][ :bad][:transition ][:mat][ ""] = 1.000
1074
+ @@data[STEL2][ :bad][:rimjoist ][:mat]["139"] = 10.000
1075
+ @@data[STEL2][ :bad][:parapet ][:mat][ "0"] = 1.000
1076
+ @@data[STEL2][ :bad][:head ][:mat]["139"] = 0.750
1077
+ @@data[STEL2][ :bad][:jamb ][:mat]["139"] = 0.750
1078
+ @@data[STEL2][ :bad][:sill ][:mat]["139"] = 0.750
1079
+ @@data[STEL2][ :bad][:corner ][:mat][ "0"] = 1.000
1080
+ @@data[STEL2][ :bad][:balcony ][:mat][ ""] = 1.000
1081
+ @@data[STEL2][ :bad][:party ][:mat][ ""] = 1.000
1082
+ @@data[STEL2][ :bad][:grade ][:mat]["139"] = 1.000
1083
+ @@data[STEL2][ :bad][:joint ][:mat][ ""] = 1.000
1084
+ @@data[STEL2][ :bad][:transition ][:mat][ ""] = 1.000
1078
1085
 
1079
1086
  @@data[STEL2][:good][:id ] = STEL2_GOOD
1080
- # @@data[STEL2][:good][:rimjoist ][:mat]["172"] = 0.500
1081
- # @@data[STEL2][:good][:parapet ][:mat]["206"] = 1.000
1082
- # @@data[STEL2][:good][:head ][:mat]["139"] = 0.500
1083
- # @@data[STEL2][:good][:jamb ][:mat]["139"] = 0.500
1084
- # @@data[STEL2][:good][:sill ][:mat]["139"] = 0.500
1085
- # @@data[STEL2][:good][:corner ][:mat][ "0"] = 1.000
1086
- # @@data[STEL2][:good][:balcony ][:mat][ ""] = 1.000
1087
- # @@data[STEL2][:good][:party ][:mat][ ""] = 1.000
1088
- # @@data[STEL2][:good][:grade ][:mat]["192"] = 1.000
1089
- # @@data[STEL2][:good][:grade ][:mat]["139"] = 1.000
1090
- # @@data[STEL2][:good][:joint ][:mat][ ""] = 1.000
1091
- # @@data[STEL2][:good][:transition ][:mat][ ""] = 1.000
1087
+ @@data[STEL2][:good][:rimjoist ][:mat]["172"] = 0.500
1088
+ @@data[STEL2][:good][:parapet ][:mat]["206"] = 1.000
1089
+ @@data[STEL2][:good][:head ][:mat]["139"] = 0.500
1090
+ @@data[STEL2][:good][:jamb ][:mat]["139"] = 0.500
1091
+ @@data[STEL2][:good][:sill ][:mat]["139"] = 0.500
1092
+ @@data[STEL2][:good][:corner ][:mat][ "0"] = 1.000
1093
+ @@data[STEL2][:good][:balcony ][:mat][ ""] = 1.000
1094
+ @@data[STEL2][:good][:party ][:mat][ ""] = 1.000
1095
+ @@data[STEL2][:good][:grade ][:mat]["192"] = 1.000
1096
+ @@data[STEL2][:good][:grade ][:mat]["139"] = 1.000
1097
+ @@data[STEL2][:good][:joint ][:mat][ ""] = 1.000
1098
+ @@data[STEL2][:good][:transition ][:mat][ ""] = 1.000
1099
+ # --- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- --- #
1092
1100
 
1093
1101
  ##
1094
1102
  # Retrieve TBD building/space type keyword.
@@ -1097,8 +1105,8 @@ module BTAP
1097
1105
  # @param stories [Integer] number of building stories
1098
1106
  #
1099
1107
  # @return [Symbol] matching TBD keyword (:office if failure)
1100
- def sptype(spacetype = "", stories = 999)
1101
- tp = spacetype.downcase
1108
+ def spacetype(sptype = "", stories = 999)
1109
+ tp = sptype.downcase
1102
1110
  typ = :office
1103
1111
 
1104
1112
  return typ unless stories.is_a?(Integer) && stories.between?(1,999)
@@ -1172,23 +1180,65 @@ module BTAP
1172
1180
  ##
1173
1181
  # Retrieve building/space type-specific assembly/construction.
1174
1182
  #
1175
- # @param spacetype [Symbol] BTAP/TBD spacetype
1176
- # @param stype [Symbol] :walls, :floors or :roofs
1177
- # @param performance [Symbol] :lp (low-) or :hp (high-performance)
1183
+ # @param sptype [Symbol] BTAP/TBD spacetype
1184
+ # @param stypes [Symbol] :walls, :floors or :roofs
1185
+ # @param perform [Symbol] :lp (low-) or :hp (high-performance)
1178
1186
  #
1179
1187
  # @return [String] corresponding BTAP construction (STEL2 if fail)
1180
- def assembly(spacetype = :office, stype = :walls, performance = :hp)
1181
- return FLOOR if stype == :floors
1182
- return ROOFS if stype == :roofs
1188
+ def assembly(sptype = :office, stypes = :walls, perform = :hp)
1189
+ return FLOOR if stypes == :floors
1190
+ return ROOFS if stypes == :roofs
1183
1191
 
1184
1192
  @@data.each do |id, construction|
1185
- next unless construction.key?(performance)
1186
- return id if construction[:sptypes].key?(spacetype)
1193
+ next unless construction.key?(perform)
1194
+ return id if construction[:sptypes].key?(sptype)
1187
1195
  end
1188
1196
 
1189
1197
  STEL2
1190
1198
  end
1191
1199
 
1200
+ ##
1201
+ # Retrieve nearest building/space type-specific assembly Uo factor.
1202
+ #
1203
+ # @param construction [String] BTAP construction identifier
1204
+ # @param uo [Double] target Uo in W/m2.K
1205
+ #
1206
+ # @return [Double] costed BTAP construction Uo factor (nil if fail)
1207
+ def costed_uo(construction = STEL2, uo = UMAX)
1208
+ construction = STEL2 unless @@data.key?(construction)
1209
+ uo = UMAX unless uo.is_a?(Numeric) && uo.between?(UMIN, UMAX)
1210
+
1211
+ @@data[construction][:uos].keys.each do |u|
1212
+ val = u.to_f / 1000
1213
+ return nil unless val.is_a?(Numeric) && val.between?(UMIN, UMAX)
1214
+ return val if val < uo || (val - uo).abs < 0.001
1215
+ end
1216
+
1217
+ nil
1218
+ end
1219
+
1220
+ ##
1221
+ # Retrieve lowest building/space type-specific assembly Uo factor.
1222
+ #
1223
+ # @param construction [String] BTAP construction identifier
1224
+ #
1225
+ # @return [Double] lowest costed BTAP construction Uo factor (nil if fail)
1226
+ def lowest_uo(construction = STEL2)
1227
+ uos = []
1228
+ construction = STEL2 unless @@data.key?(construction)
1229
+
1230
+ @@data[construction][:uos].keys.each do |u|
1231
+ val = u.to_f / 1000
1232
+ return nil unless val.is_a?(Numeric) && val.between?(UMIN, UMAX)
1233
+
1234
+ uos << val
1235
+ end
1236
+
1237
+ return uos.min unless uos.empty?
1238
+
1239
+ nil
1240
+ end
1241
+
1192
1242
  ##
1193
1243
  # Retrieve assembly-specific PSI factor set.
1194
1244
  #
@@ -1235,6 +1285,7 @@ module BTAP
1235
1285
  end
1236
1286
  end
1237
1287
 
1288
+ # ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- #
1238
1289
  class BTAP::Bridging
1239
1290
  extend BridgingData
1240
1291
 
@@ -1266,16 +1317,18 @@ module BTAP
1266
1317
  @feedback = { logs: [] }
1267
1318
  lgs = @feedback[:logs]
1268
1319
 
1320
+ argh[:interpolate] = false unless argh.key?(:interpolate)
1321
+
1269
1322
  # BTAP generates free-floating, unoccupied spaces (e.g. attics) as
1270
1323
  # 'indirectly conditioned', rather than 'unconditioned' (e.g. vented
1271
1324
  # attics). For instance, all outdoor-facing sloped roof surfaces of an
1272
1325
  # attic in BTAP are insulated, while attic floors remain uninsulated. BTAP
1273
1326
  # adds to the thermal zone of each unoccupied space a thermostat without
1274
- # referecing heating and/or cooling setpoint schedule objects. These
1327
+ # referencing heating and/or cooling setpoint schedule objects. These
1275
1328
  # conditions do not meet TBD's internal 'plenum' logic/check (which is
1276
1329
  # based on OpenStudio-Standards), and so TBD ends up tagging such spaces
1277
1330
  # as unconditioned. Consequently, TBD attempts to up/de-rate attic floors
1278
- # - not sloped roof surfaces. The original BTAP solution will undoubtedly
1331
+ # - not sloped roof surfaces. The upstream BTAP solution will undoubtedly
1279
1332
  # need revision. In the meantime, and in an effort to harmonize TBD with
1280
1333
  # BTAP's current approach, an OpenStudio model may be temporarily
1281
1334
  # modified prior to TBD processes, ensuring that each attic space is
@@ -1289,35 +1342,34 @@ module BTAP
1289
1342
  # populate (e.g. invalid argument hash, invalid OpenStudio model).
1290
1343
  return unless self.populate(model, argh)
1291
1344
 
1292
- # Initialize loop counters, controls and flags.
1293
- initial = true
1294
- comply = false
1295
- redflag = false
1296
- perform = :lp # Low-performance wall constructions
1297
- quality = :bad # default PSI factors - BTAP users can reset to :good
1298
- quality = :good if argh.key?(:quality) && argh[:quality] == :good
1299
- combo = "#{perform.to_s}_#{quality.to_s}".to_sym # e.g. :lp_bad
1300
- args = {} # initialize native TBD arguments
1301
-
1302
- # If uprating, initialize native TBD args.
1345
+ # Initialize loop controls and flags.
1346
+ initial = true
1347
+ complies = false
1348
+ comply = {} # specific to :walls, :floors & :roofs
1349
+ perform = :lp # Low-performance wall constructions (revise, TO-DO ...)
1350
+ quality = :bad # default PSI factors - BTAP users can reset to :good
1351
+ quality = :good if argh.key?(:quality) && argh[:quality] == :good
1352
+ combo = "#{perform.to_s}_#{quality.to_s}".to_sym # e.g. :lp_bad
1353
+ args = {} # initialize native TBD arguments
1354
+
1355
+ # Initialize surface types & native TBD args (if uprating).
1303
1356
  [:walls, :floors, :roofs].each do |stypes|
1304
- next if @model[stypes].empty?
1357
+ next if @model[stypes].empty?
1305
1358
  next unless argh.key?(stypes)
1306
1359
  next unless argh[stypes].key?(:ut)
1307
1360
 
1308
- ut = argh[stypes][:ut]
1309
- ok = ut.is_a?(Numeric) && ut.between?(UMIN, UMAX)
1310
- lgs << "Invalid BTAP/TBD #{stypes} Ut" unless ok
1311
- next unless ok
1312
-
1313
1361
  stype = stypes.to_s.chop
1314
1362
  uprate = "uprate_#{stypes.to_s}".to_sym
1315
1363
  option = "#{stype}_option".to_sym
1316
1364
  ut = "#{stype}_ut".to_sym
1317
1365
 
1318
- args[uprate] = true
1319
- args[option] = "ALL #{stype} constructions"
1320
- args[ut ] = ut
1366
+ args[uprate ] = true
1367
+ args[option ] = "ALL #{stype} constructions"
1368
+ args[ut ] = argh[stypes][:ut]
1369
+
1370
+ comply[stypes] = false
1371
+
1372
+ @model[:constructions] = {} unless @model.key?(:constructions)
1321
1373
  end
1322
1374
 
1323
1375
  args[:io_path] = @model[combo] # contents of a "tbd.json" file
@@ -1339,219 +1391,138 @@ module BTAP
1339
1391
  combo = "#{perform.to_s}_#{quality.to_s}".to_sym
1340
1392
  args[:io_path] = @model[combo]
1341
1393
  end
1394
+
1395
+ # Delete previously-generated TBD args Uo key/value pairs.
1396
+ [:walls, :floors, :roofs].each do |stypes|
1397
+ next unless comply.key?(stypes)
1398
+
1399
+ uo = "#{stypes.to_s.chop}_uo".to_sym
1400
+ args.delete(uo) if args.key?(uo)
1401
+ end
1402
+
1403
+ # Reset previous @model constructions.
1404
+ @model.delete(:constructions) if @model.key?(:constructions)
1405
+ @model[:constructions] = {}
1342
1406
  end
1343
1407
 
1344
- # Run TBD on cloned OpenStudio models until compliant.
1408
+ # Run TBD on cloned OpenStudio model - compliant combo?
1345
1409
  mdl = OpenStudio::Model::Model.new
1346
1410
  mdl.addObjects(model.toIdfFile.objects)
1347
1411
  TBD.clean!
1348
1412
  res = TBD.process(mdl, args)
1349
1413
 
1350
- if TBD.status.zero?
1351
- comply = true
1352
- else
1353
- # TBD logs warnings and non/fatal errors when 'processing'
1354
- # OpenStudio models, often when faced with invalid OpenStudio
1355
- # objects that may not be necessarily flagged by OpenStudio
1356
- # Standards and/or by BTAP. Examples could include subsurfaces not
1357
- # fitting neatly within a host surface, (slight) overlaps between
1358
- # subsurfaces, 5-sided windows, and so on. TBD typically logs such
1359
- # non-fatal errors, ignores the faulty object, and otherwise pursues
1360
- # its calculations. It would usually be up to BTAP users to decide
1361
- # how to proceed when faced with most non-fatal errors. However,
1362
- # when it comes ultimately to failed attempts by TBD to 'uprate'
1363
- # constructions of an OpenStudio model for NECB compliance, BTAP
1364
- # should definitely skip to the next loop iteration.
1365
- unable = false
1366
-
1367
- TBD.logs.each do |log|
1368
- break if unable
1369
-
1370
- unable = log[:message].include?("Unable to uprate ")
1371
- break if unable
1372
-
1373
- unable = log[:message].include?("Can't uprate " )
1374
- end
1375
-
1376
- if unable
1377
- # puts # TEMPORARY for debugging
1378
- # puts "¨¨¨ combo : #{combo}"
1379
- # puts args[:io_path][:psis]
1380
- # TBD.logs.each { |lg| puts lg }
1381
- # puts
1382
- else
1383
- comply = true
1384
- end
1414
+ # Halt all processes if fatal errors raised by TBD (e.g. badly formatted
1415
+ # TBD arguments, poorly-structured OpenStudio models).
1416
+ if TBD.fatal?
1417
+ TBD.logs.each { |lg| lgs << lg[:message] if lg[:level] == TBD::FTL }
1418
+ break
1385
1419
  end
1386
1420
 
1387
- if comply
1388
- # Not completely out of the woods yet for uprated cases. Despite
1389
- # having TBD identify a winning combination, determine if BTAP holds
1390
- # admissible Uo values (see lines ~245, :uos key). If TBD-estimated
1391
- # Uo is lower than any of these admissible BTAP Uo factors, then no
1392
- # commercially available solution has been identified. Reset "comply"
1393
- # to "false", and loop again (until TBD-reported Uo is above or equal
1394
- # to any of the BTAP Uo factors). This needs revisiting once BTAP
1395
- # enables building-type construction selection.
1396
- [:walls, :floors, :roofs].each do |stypes|
1397
- break unless comply
1398
- next if @model[stypes].empty?
1399
- next unless argh.key?(stypes)
1400
- next unless argh[stypes].key?(:ut)
1401
-
1402
- ut = argh[stypes][:ut]
1403
- stype_uo = "#{stypes.to_s.chop}_uo".to_sym
1404
-
1405
- # If successul, TBD adds a building-wide uprated Uo factor to its
1406
- # native input arguments, e.g. "walls_uo". Reject if missing.
1407
- comply = false unless args.key?(stype_uo)
1408
- break unless args.key?(stype_uo)
1409
-
1410
- # Safeguard. TBD should never generate uprated Uo > required Ut.
1411
- ok = args[stype_uo] < ut || (args[stype_uo] - ut).abs < 0.001
1412
- comply = false unless ok
1413
- break unless ok
1414
-
1415
- # Check if within range of BTAP commercially-available options, for:
1416
- # - walls, floors & roofs
1417
- # - specific to each space type
1418
- @model[:sptypes].each do |id, spacetype|
1419
- uo_sptype = nil
1420
- break unless comply
1421
- next unless spacetype.key?(stypes)
1422
- next unless spacetype[stypes].key?(perform) # :lp or :hp
1423
-
1424
- construction = spacetype[stypes][perform]
1425
- next unless @@data.key?(construction)
1426
- next unless @@data[construction].key?(:uos)
1427
-
1428
- # puts
1429
- # puts "required Uo for #{id} #{stypes}: #{args[stype_uo]}"
1430
- # puts
1431
-
1432
- @@data[construction][:uos].keys.each do |u|
1433
- uo = u.to_f / 1000
1434
- ok = uo < args[stype_uo] || (uo - args[stype_uo]).abs < 0.001
1435
- next unless ok
1436
-
1437
- uo_sptype = uo # winning combo?
1438
- @model[:constructions] = {} unless @model.key?(:constructions)
1439
- @model[:constructions][construction] = { uo: uo }
1440
- break
1441
- end
1442
-
1443
- next unless uo_sptype.nil?
1444
-
1445
- comply = false
1446
- val = format("%.3f", args[stype_uo])
1447
- lgs << "... required Uo for #{stypes}: #{val}"
1421
+ complies = true
1422
+ # Check if TBD-uprated Uo factors are valid: TBD args Hash holds (new)
1423
+ # uprated Uo keys/values for :walls, :floors AND/OR :roofs if uprating
1424
+ # is successful. In most cases, uprating tends to fail for wall
1425
+ # constructions rather than roof or floor constructions, due to the
1426
+ # typically larger density of linear thermal bridging per surface type
1427
+ # area. Yet even if all constructions were successfully uprated by TBD,
1428
+ # one must then determine if BTAP holds admissible (i.e. costed)
1429
+ # assembly variants with corresponding Uo factors (see :uos key). If
1430
+ # TBD-uprated Uo factors are lower than any of these admissible BTAP Uo
1431
+ # factors, then no commercially available solution can been identified.
1432
+ [:walls, :floors, :roofs].each do |stypes|
1433
+ next unless comply.key?(stypes) # true only if uprating
1434
+
1435
+ stype_uo = "#{stypes.to_s.chop}_uo".to_sym
1436
+ target = nil # uprated Uo (if successful)
1437
+ target = args[stype_uo] if args.key?(stype_uo) # ... may be nil
1438
+
1439
+ comply[stypes] = true
1440
+
1441
+ @model[stypes].each do |id, surface|
1442
+ next unless surface.key?(:sptype)
1443
+
1444
+ sptype = surface[:sptype] # e.g. :office
1445
+ next unless @model[:sptypes].key?(sptype)
1446
+ next unless @model[:sptypes][sptype].key?(stypes)
1447
+ next unless @model[:sptypes][sptype][stypes].key?(perform)
1448
+
1449
+ construction = @model[:sptypes][sptype][stypes][perform]
1450
+ uo = nil
1451
+ ok = true
1452
+ uo = self.costed_uo(construction, target) if target
1453
+ ok = false if uo.nil?
1454
+ uo = target if ok && argh[:interpolate]
1455
+ uo = self.lowest_uo(construction) unless ok # fallback
1456
+ comply[stypes] = false unless ok
1457
+
1458
+ unless @model[:constructions].key?(construction)
1459
+ @model[:constructions][construction] = {}
1460
+ @model[:constructions][construction][:stypes ] = stypes
1461
+ @model[:constructions][construction][:uo ] = uo
1462
+ @model[:constructions][construction][:compliant] = ok
1463
+ @model[:constructions][construction][:surfaces ] = {}
1448
1464
  end
1465
+
1466
+ face = model.getSurfaceByName(id)
1467
+ next if face.empty?
1468
+
1469
+ face = face.get
1470
+ @model[:constructions][construction][:surfaces][id] = face
1449
1471
  end
1472
+
1473
+ complies = false unless comply[stypes]
1450
1474
  end
1451
1475
 
1452
- # Conditional break from the 'loop'.
1453
- if comply
1454
- break
1455
- elsif combo == :hp_good
1456
- # i.e. TBD's uprating features are requested, yet unable to locate
1457
- # either a physically- or economically-plausible Uo + PSI combo.
1458
- redflag = true
1459
- comply = true # (temporarily) signal compliance
1460
- lgs << "REDFLAG: no Ut-compliant TBD combo"
1476
+ break if complies
1477
+ # Final BTAP uprating option, yet non-compliant: TBD's uprating
1478
+ # features are requested, yet unable to locate either a physically- or
1479
+ # economically-plausible Uo + PSI combo for 1x or more surface types.
1480
+ break if combo == :hp_good
1481
+ end # of loop
1461
1482
 
1462
- [:walls, :floors, :roofs].each do |stypes|
1463
- next unless argh.key?(stypes)
1464
- next unless argh[stypes].key?(:ut)
1465
-
1466
- groups = {}
1467
- stype = stypes.to_s.chop
1468
- uprate = "uprate_#{stypes.to_s}".to_sym
1469
- option = "#{stype}_option".to_sym
1470
- ut = "#{stype}_ut".to_sym
1471
-
1472
- # Cancel uprating request before derating.
1473
- args.delete(uprate)
1474
- args.delete(option)
1475
- args.delete(ut )
1476
-
1477
- # Group BTAP constructions based on lowest Uo factors e.g.:
1478
- # - 0.130 for WOOD7
1479
- # - 0.080 for STEL2
1480
- # - 0.100 for all ROOFS
1481
- @model[stypes].each do |id, type|
1482
- next unless type.key?(:sptype)
1483
-
1484
- spacetype = type[:sptype] # e.g. :office
1485
- next unless @model[:sptypes].key?(spacetype)
1486
- next unless @model[:sptypes][spacetype].key?(stypes)
1487
- next unless @model[:sptypes][spacetype][stypes].key?(perform)
1488
-
1489
- construction = @model[:sptypes][spacetype][stypes][perform]
1490
- next unless @@data.key?(construction)
1491
- next unless @@data[construction].key?(:uos)
1492
-
1493
- uos = []
1494
- @@data[construction][:uos].keys.each { |u| uos << u.to_f / 1000 }
1495
- uo = uos.min
1496
- @model[:constructions] = {} unless @model.key?(:constructions)
1497
- @model[:constructions][construction] = { uo: uo }
1498
-
1499
- exists = groups.key?(construction)
1500
- groups[construction] = { uo: uo, faces: [] } unless exists
1501
- surface = model.getSurfaceByName(id)
1502
- next if surface.empty?
1503
-
1504
- groups[construction][:faces] << surface.get
1505
- end
1483
+ # Post-loop steps (if uprating).
1484
+ [:walls, :floors, :roofs].each do |stypes|
1485
+ next unless comply.key?(stypes) # true only if uprating
1506
1486
 
1507
- groups.each do |id, group|
1508
- # puts
1509
- # puts "#{id} : #{stypes} : #{group[:uo]}: #{group[:faces].size}x"
1510
- # group[:faces].each { |s| puts s.nameString }
1511
- sss = BTAP::Geometry::Surfaces.set_surfaces_construction_conductance(group[:faces], group[:uo])
1512
- # puts
1513
- #
1514
- # sss.each do |ssss|
1515
- # lc = ssss.construction.get.to_LayeredConstruction.get
1516
- # usi = 1 / TBD.rsi(lc, ssss.filmResistance)
1517
- # puts "#{ssss.construction.get.nameString} : #{usi}"
1518
- # end
1519
- #
1520
- # puts "~~~~~~~~~~"
1521
- # puts
1522
- end
1523
- end
1487
+ # Cancel uprating request before final derating.
1488
+ stype = stypes.to_s.chop
1489
+ uprate = "uprate_#{stypes.to_s}".to_sym
1490
+ option = "#{stype}_option".to_sym
1491
+ ut = "#{stype}_ut".to_sym
1492
+ args.delete(uprate)
1493
+ args.delete(option)
1494
+ args.delete(ut )
1524
1495
 
1525
- comply = true # temporary
1526
- break
1496
+ # Set uprated Uo factor for each BTAP 'deratable' construction.
1497
+ @model[:constructions].each do |id, construction|
1498
+ next unless construction.key?(:stypes )
1499
+ next unless construction.key?(:uo )
1500
+ next unless construction.key?(:compliant)
1501
+ next unless construction.key?(:surfaces )
1502
+ next unless construction[:stypes ] == stypes
1503
+ next if construction[:surfaces].empty?
1504
+
1505
+ BTAP::Geometry::Surfaces.set_surfaces_construction_conductance(construction[:surfaces].values, construction[:uo])
1527
1506
  end
1528
1507
  end
1529
1508
 
1530
- @model[:comply ] = comply
1531
- @model[:perform] = perform
1532
- @model[:quality] = quality
1533
- @model[:combo ] = combo
1534
-
1535
- if comply
1536
- # Run "process" TBD (with last generated args Hash) one last time on
1537
- # "model" (not cloned "mdl"). This may uprate (if applicable ... unless
1538
- # redflagged), then derate BTAP above-grade surface constructions before
1539
- # simulation.
1540
- TBD.clean!
1541
- res = TBD.process(model, args)
1509
+ @model[:comply ] = comply
1510
+ @model[:complies] = complies
1511
+ @model[:perform ] = perform
1512
+ @model[:quality ] = quality
1513
+ @model[:combo ] = combo
1542
1514
 
1543
- # puts # TEMPORARY
1544
- # puts args[:io_path][:psis]
1545
- # puts
1515
+ # Run "process" TBD one last time, on "model" (not cloned "mdl").
1516
+ TBD.clean!
1517
+ res = TBD.process(model, args)
1546
1518
 
1547
- @model[:comply ] = false if redflag
1548
- @model[:io ] = res[:io ] # TBD outputs (i.e. "tbd.out.json")
1549
- @model[:surfaces] = res[:surfaces] # TBD derated surface data
1550
- @model[:args ] = args # last TBD inputs (i.e. "tbd.json")
1519
+ @model[:io ] = res[:io ] # TBD outputs (i.e. "tbd.out.json")
1520
+ @model[:surfaces] = res[:surfaces] # TBD derated surface data
1521
+ @model[:argh ] = argh # method argument Hash
1522
+ @model[:args ] = args # last TBD inputs (i.e. "tbd.json")
1551
1523
 
1552
- self.gen_tallies # tallies for BTAP costing
1553
- self.gen_feedback # log success messages for BTAP
1554
- end
1524
+ self.gen_tallies # tallies for BTAP costing
1525
+ self.gen_feedback # log success messages for BTAP
1555
1526
 
1556
1527
  self.purge_buffer_schedules(model, buffers)
1557
1528
  end
@@ -1607,7 +1578,7 @@ module BTAP
1607
1578
  # @param model [OpenStudio::Model::Model] a model
1608
1579
  # @param buffers [Array] identifiers of modified buffer spaces in model
1609
1580
  #
1610
- # @return [Bool] true if successful
1581
+ # @return [Boolean] true if successful
1611
1582
  def purge_buffer_schedules(model = nil, buffers = [])
1612
1583
  scheds = []
1613
1584
  lgs = @feedback[:logs]
@@ -1692,19 +1663,11 @@ module BTAP
1692
1663
  # @param model [OpenStudio::Model::Model] a model
1693
1664
  # @param argh [Hash] BTAP/TBD argument hash
1694
1665
  #
1695
- # @return [Bool] true if valid (check @feedback logs if false)
1666
+ # @return [Boolean] true if valid (check @feedback logs if false)
1696
1667
  def populate(model = nil, argh = {})
1697
- lgs = @feedback[:logs]
1698
1668
  cl = OpenStudio::Model::Model
1699
1669
  args = { option: "(non thermal bridging)" } # for initial TBD dry run
1700
-
1701
- # Pre-TBD BTAP validatation.
1702
- lgs << "Invalid BTAP/TBD feedback" unless @feedback.is_a?(Hash)
1703
- lgs << "Missing BTAP/TBD logs" unless @feedback.key?(:logs)
1704
- lgs << "Invalid BTAP/TBD logs" unless @feedback[:logs].is_a?(Array)
1705
- return false unless @feedback.is_a?(Hash)
1706
- return false unless @feedback.key?(:logs)
1707
- return false unless @feedback[:logs].is_a?(Array)
1670
+ lgs = @feedback[:logs]
1708
1671
 
1709
1672
  lgs << "Invalid OpenStudio model to de/up-rate" unless model.is_a?(cl)
1710
1673
  lgs << "Invalid BTAP/TBD argument Hash" unless argh.is_a?(Hash)
@@ -1724,7 +1687,7 @@ module BTAP
1724
1687
  @model[:spaces ] = {}
1725
1688
  @model[:sptypes] = {}
1726
1689
 
1727
- # Run TBD on cloned OpenStudio models (dry run).
1690
+ # Run TBD on a cloned OpenStudio model (dry run).
1728
1691
  mdl = OpenStudio::Model::Model.new
1729
1692
  mdl.addObjects(model.toIdfFile.objects)
1730
1693
  TBD.clean!
@@ -1754,10 +1717,10 @@ module BTAP
1754
1717
  stypes = :roofs if surface[:type] == :ceiling
1755
1718
  next unless stypes == :walls || stypes == :floors || stypes == :roofs
1756
1719
 
1757
- space = surface[:space].nameString
1758
- spacetype = surface[:stype].nameString if surface.key?(:stype)
1759
- spacetype = "" unless surface.key?(:stype)
1760
- typ = self.sptype(spacetype, @model[:stories]) # e.g. :office
1720
+ space = surface[:space].nameString
1721
+ sptype = surface[:stype].nameString if surface.key?(:stype)
1722
+ sptype = "" unless surface.key?(:stype)
1723
+ typ = self.spacetype(sptype, @model[:stories]) # e.g. :office
1761
1724
 
1762
1725
  # Keep track of individual surface's space and spacetype keyword.
1763
1726
  @model[stypes][id] = {}
@@ -1766,12 +1729,12 @@ module BTAP
1766
1729
 
1767
1730
  # Keep track of individual spaces and spacetypes.
1768
1731
  exists = @model[:spaces].key?(space)
1769
- @model[:spaces][space] = {} unless exists
1770
- @model[:spaces][space][:sptype] = typ unless exists
1732
+ @model[:spaces][space] = {} unless exists
1733
+ @model[:spaces][space][:sptype] = typ unless exists
1771
1734
 
1772
1735
  exists = @model[:sptypes].key?(typ)
1773
- @model[:sptypes][typ ] = {} unless exists
1774
- @model[:sptypes][typ ][:sptype] = spacetype unless exists
1736
+ @model[:sptypes][typ ] = {} unless exists
1737
+ @model[:sptypes][typ ][:sptype] = sptype unless exists
1775
1738
  next if @model[:sptypes][typ].key?(stypes)
1776
1739
 
1777
1740
  # Low- vs Hi-Performance BTAP assemblies.
@@ -1789,7 +1752,7 @@ module BTAP
1789
1752
  @model[:sptypes][typ][:hp_good] = self.set(hi, :good)
1790
1753
  end
1791
1754
 
1792
- # Post-TBD validation: BTAP-fed Uo factors, then Ut factors (optional).
1755
+ # BTAP-fed Uo (+ optional Ut) factors.
1793
1756
  [:walls, :floors, :roofs].each do |stypes|
1794
1757
  lgs << "Missing BTAP/TBD #{stypes}" unless argh.key?(stypes)
1795
1758
  lgs << "Missing BTAP/TBD #{stypes} Uo" unless argh[stypes].key?(:uo)
@@ -1797,26 +1760,19 @@ module BTAP
1797
1760
  return false unless argh[stypes].key?(:uo)
1798
1761
  next if @model[stypes].empty?
1799
1762
 
1800
- uo = self.minU(model, stypes)
1763
+ uo = argh[stypes][:uo]
1801
1764
  ok = uo.is_a?(Numeric) && uo.between?(UMIN, UMAX)
1802
- argh[stypes][:uo] = uo if ok
1803
- next if ok
1765
+ next if ok
1804
1766
 
1805
- lgs << "Invalid BTAP/TBD #{stypes} Uo"
1806
- return false
1807
- end
1767
+ uo = self.minU(model, stypes)
1768
+ ok = uo.is_a?(Numeric) && uo.between?(UMIN, UMAX)
1769
+ lgs << "Invalid BTAP/TBD #{stypes} Uo" unless ok
1770
+ return false unless ok
1808
1771
 
1809
- [:walls, :floors, :roofs].each do |stypes| # Ut optional
1772
+ argh[stypes][:uo] = uo
1810
1773
  next unless argh[stypes].key?(:ut)
1811
- next if @model[stypes].empty?
1812
-
1813
- ut = self.minU(model, stypes)
1814
- ok = ut.is_a?(Numeric) && ut.between?(UMIN, UMAX)
1815
- argh[stypes][:ut] = ut if ok
1816
- next if ok
1817
1774
 
1818
- lgs << "Invalid BTAP #{stypes} Ut"
1819
- return false
1775
+ argh[stypes][:ut] = uo
1820
1776
  end
1821
1777
 
1822
1778
  # Generate native TBD input Hashes for the model, for both :good & :bad
@@ -1832,7 +1788,7 @@ module BTAP
1832
1788
  @model[:hp_bad ] = self.inputs(:hp, :bad )
1833
1789
  @model[:hp_good] = self.inputs(:hp, :good)
1834
1790
 
1835
- @model[:osm] = model
1791
+ @model[:osm ] = model
1836
1792
 
1837
1793
  true
1838
1794
  end
@@ -1847,7 +1803,7 @@ module BTAP
1847
1803
  def inputs(perform = :hp, quality = :good)
1848
1804
  input = {}
1849
1805
  psis = {} # construction-specific PSI sets
1850
- types = {} # space type-specific references to previous PSI sets
1806
+ sptypes = {} # space type-specific references to previous PSI sets
1851
1807
  perform = :hp unless perform == :lp || perform == :hp
1852
1808
  quality = :good unless quality == :bad || quality == :good
1853
1809
 
@@ -1862,10 +1818,10 @@ module BTAP
1862
1818
  # Collect unique BTAP/TBD instances.
1863
1819
  combo = "#{perform.to_s}_#{quality.to_s}".to_sym
1864
1820
 
1865
- @model[:sptypes].values.each do |type|
1866
- next unless type.key?(combo)
1821
+ @model[:sptypes].values.each do |sptype|
1822
+ next unless sptype.key?(combo)
1867
1823
 
1868
- psi = type[combo]
1824
+ psi = sptype[combo]
1869
1825
  next if psis.key?(psi[:id])
1870
1826
 
1871
1827
  psis[ psi[:id] ] = psi
@@ -1878,17 +1834,17 @@ module BTAP
1878
1834
  input[:description] = "TBD input for BTAP" # append run # ?
1879
1835
  input[:psis ] = psis.values
1880
1836
 
1881
- @model[:sptypes].values.each do |type|
1882
- next unless type.key?(:sptype)
1883
- next unless type.key?(combo)
1884
- next if types.key?(type[:sptype])
1837
+ @model[:sptypes].values.each do |sptype|
1838
+ next unless sptype.key?(combo)
1839
+ next unless sptype.key?(:sptype)
1840
+ next if sptypes.key?(sptype[:sptype])
1885
1841
 
1886
- types[ type[:sptype] ] = { psi: type[combo][:id] }
1842
+ sptypes[ sptype[:sptype] ] = { psi: sptype[combo][:id] }
1887
1843
  end
1888
1844
 
1889
- types.each do |id, type|
1845
+ sptypes.each do |id, sptype|
1890
1846
  input[:spacetypes] = [] unless input.key?(:spacetypes)
1891
- input[:spacetypes] << { id: id, psi: type[:psi] }
1847
+ input[:spacetypes] << { id: id, psi: sptype[:psi] }
1892
1848
  end
1893
1849
 
1894
1850
  input[:building] = { psi: building[:id] }
@@ -1899,7 +1855,7 @@ module BTAP
1899
1855
  ##
1900
1856
  # Generate BTAP/TBD tallies
1901
1857
  #
1902
- # @return [Bool] true if BTAP/TBD tally is successful
1858
+ # @return [Boolean] true if BTAP/TBD tally is successful
1903
1859
  def gen_tallies
1904
1860
  edges = {}
1905
1861
  return false unless @model.key?(:io)
@@ -1931,41 +1887,39 @@ module BTAP
1931
1887
  ##
1932
1888
  # Generate BTAP/TBD post-processing feedback.
1933
1889
  #
1934
- # @return [Bool] true if valid BTAP/TBD model
1890
+ # @return [Boolean] true if valid BTAP/TBD model
1935
1891
  def gen_feedback
1936
1892
  lgs = @feedback[:logs]
1937
- return false unless @model.key?(:comply)
1938
- return false unless @model.key?(:args )
1893
+ return false unless @model.key?(:complies) # all model constructions
1894
+ return false unless @model.key?(:comply ) # surface type specific ...
1895
+ return false unless @model.key?(:argh ) # BTAP/TBD inputs + ouputs
1939
1896
 
1940
- args = @model[:args]
1897
+ argh = @model[:argh]
1941
1898
 
1942
- # Successfully uprated Uo (if requested).
1899
+ # Uprating. Report first on surface types (compliant or not).
1943
1900
  [:walls, :floors, :roofs].each do |stypes|
1944
- break unless @model[:comply]
1901
+ next unless @model[:comply].key?(stypes)
1945
1902
 
1946
- stype_ut = "#{stypes.to_s.chop}_ut".to_sym
1947
- stype_uo = "#{stypes.to_s.chop}_uo".to_sym
1948
- next unless args.key?(stype_ut)
1949
- next unless args.key?(stype_uo)
1950
- next unless @model.key?(stypes)
1951
- next if @model[stypes].empty?
1952
-
1953
- ut = args[stype_ut]
1954
- uo = args[stype_uo]
1955
- next unless ut.is_a?(Numeric)
1956
- next unless uo.is_a?(Numeric)
1903
+ ut = format("%.3f", argh[stypes][:ut])
1904
+ lg = "Compliant " if @model[:comply][stypes]
1905
+ lg = "Non-compliant " unless @model[:comply][stypes]
1906
+ lg += "#{stypes}: Ut #{ut} W/m2.K"
1907
+ lgs << lg
1957
1908
 
1958
- ut = format("%.3f", ut)
1959
- uo = format("%.3f", uo)
1960
- lgs << "Compliant #{stypes}: Uo #{uo} vs Ut #{ut} W/m2.K"
1961
- end
1962
-
1963
- # Uprating unsuccessful: report min Uo factor per construction.
1964
- if @model.key?(:constructions)
1909
+ # Report then on required Uo factor per construction (compliant or not).
1965
1910
  @model[:constructions].each do |id, construction|
1966
- break if @model[:comply]
1967
-
1968
- lgs << "Non-compliant #{id} Uo factor #{construction[:uo]} (W/K.m^2)"
1911
+ next unless construction.key?(:stypes )
1912
+ next unless construction.key?(:uo )
1913
+ next unless construction.key?(:compliant)
1914
+ next unless construction.key?(:surfaces )
1915
+ next unless construction[:stypes ] == stypes
1916
+ next if construction[:surfaces].empty?
1917
+
1918
+ uo = format("%.3f", construction[:uo])
1919
+ lg = " Compliant " if construction[:compliant]
1920
+ lg = " Non-compliant " unless construction[:compliant]
1921
+ lg += "#{id} Uo #{uo} (W/K.m2)"
1922
+ lgs << lg
1969
1923
  end
1970
1924
  end
1971
1925
 
@@ -1975,11 +1929,15 @@ module BTAP
1975
1929
  next if s.construction.get.to_LayeredConstruction.empty?
1976
1930
 
1977
1931
  lc = s.construction.get.to_LayeredConstruction.get
1978
- next unless lc.nameString.include?(" c tbd")
1932
+ id = lc.nameString
1933
+ next unless id.include?(" c tbd")
1979
1934
 
1980
- rsi = TBD.rsi(lc, s.filmResistance)
1981
- rsi = format("%.1f", rsi)
1982
- lgs << "~~ '#{lc.nameString}' derated Rsi: #{rsi} (m^2.K/W)"
1935
+ rsi = TBD.rsi(lc, s.filmResistance)
1936
+ usi = format("%.3f", 1/rsi)
1937
+ rsi = format("%.1f", rsi)
1938
+ area = format("%.1f", lc.getNetArea) + " m2"
1939
+
1940
+ lgs << "~ '#{id}' derated Rsi: #{rsi} [Usi #{usi} x #{area}]"
1983
1941
  end
1984
1942
 
1985
1943
  # Log PSI factor tallies (per thermal bridge type).
@@ -1998,9 +1956,66 @@ module BTAP
1998
1956
 
1999
1957
  true
2000
1958
  end
1959
+
1960
+ def get_material_quantities()
1961
+ material_quantities = {}
1962
+ csv = CSV.read("#{File.dirname(__FILE__)}/../../../data/inventory/thermal_bridging.csv", headers: true)
1963
+ tally_edges = @tally[:edges].transform_keys(&:to_s)
1964
+
1965
+ #tally_edges = JSON.parse('{"edges":{"jamb":{"BTAP-ExteriorWall-SteelFramed-1 good":13.708557548340757},"sill":{"BTAP-ExteriorWall-SteelFramed-1 good":90.13000000000001},"head":{"BTAP-ExteriorWall-SteelFramed-1 good":90.13000000000001},"gradeconvex":{"BTAP-ExteriorWall-SteelFramed-1 good":90.4348},"parapetconvex":{"BTAP-ExteriorWall-SteelFramed-1 good":45.2174},"parapet":{"BTAP-ExteriorWall-SteelFramed-1 good":45.2174},"transition":{"BTAP-ExteriorWall-SteelFramed-1 good":71.16038874419307},"cornerconvex":{"BTAP-ExteriorWall-SteelFramed-1 good":12.1952}}}')['edges']
1966
+ tally_edges.each do |edge_type_full, value|
1967
+ edge_type = edge_type_full.delete_suffix('convex')
1968
+ if ['head', 'jamb', 'sill'].include?(edge_type)
1969
+ edge_type = 'fenestration'
1970
+ end
1971
+ value.each do |wall_ref_and_quality, quantity|
1972
+ /(.*)\s(.*)/ =~ wall_ref_and_quality
1973
+ wall_reference = $1
1974
+ quality = $2
1975
+
1976
+ if wall_reference =='BTAP-ExteriorWall-SteelFramed-1'
1977
+ wall_reference = 'BTAP-ExteriorWall-SteelFramed-2'
1978
+ end
1979
+
1980
+ if edge_type == 'transition'
1981
+ next
1982
+ end
1983
+
1984
+ result = csv.find { |row| row['edge_type'] == edge_type &&
1985
+ row['quality'] == quality &&
1986
+ row['wall_reference'] == wall_reference
1987
+ }
1988
+ if result.nil?
1989
+ puts ("#{edge_type}-#{wall_reference}-#{quality}")
1990
+ puts "not found in tb database"
1991
+ next
1992
+ end
1993
+
1994
+ # Split
1995
+ material_opaque_id_layers = result['material_opaque_id_layers'].split(",")
1996
+ id_layers_quantity_multipliers = result['id_layers_quantity_multipliers'].split(",")
1997
+
1998
+ material_opaque_id_layers.zip(id_layers_quantity_multipliers).each do |id, scale|
1999
+ if material_quantities[id].nil? then material_quantities[id] = 0.0 end
2000
+ material_quantities[id] = material_quantities[id] + scale.to_f * quantity.to_f
2001
+ end
2002
+ end
2003
+ end
2004
+ material_opaque_id_quantities = []
2005
+ material_quantities.each do |id,quantity|
2006
+ material_opaque_id_quantities << { 'materials_opaque_id' => id, 'quantity' => quantity, 'domain'=> 'thermal_bridging' }
2007
+ end
2008
+
2009
+ return material_opaque_id_quantities
2010
+ end
2011
+
2012
+
2001
2013
  end
2014
+
2015
+
2002
2016
  end
2003
2017
 
2018
+ # ----- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----- #
2004
2019
  # NOTE: BTAP supports Uo variants for each of the aforementioned wall
2005
2020
  # constructions, e.g. meeting NECB2011 and NECB2015 prescriptive "Uo"
2006
2021
  # requirements for each NECB climate zone. By definition, these Uo
@@ -2010,7 +2025,7 @@ end
2010
2025
  # are indeed a handful of general, qualitative requirements (those of the
2011
2026
  # MNECB1997) that would make NECB2011- and NECB2015-compliant buildings
2012
2027
  # slightly better than BTAPPRE1980 "bottom-of-the-barrel" construction,
2013
- # but lilely not any better than circa 1990s "run-of-the-mill" commercial
2028
+ # but likely not any better than circa 1990s "run-of-the-mill" commercial
2014
2029
  # construction. Currently, BTAP does not assess the impact of MAJOR
2015
2030
  # thermal bridging for vintages < NECB2017. But ideally it SHOULD, if the
2016
2031
  # goal remains a fair assessment of the (relative) contribution of more
@@ -2028,7 +2043,7 @@ end
2028
2043
  # Large Buildings. The original intention was to rely on BTAP variants
2029
2044
  # "Metal-2" and "Metal-3" as HP CW spandrels ACTUALLY achieving NECB
2030
2045
  # prescriptive targets, which could only be possible in practice at
2031
- # tremendous cost and effort.
2046
+ # great cost and effort (e.g. a 2nd insulated wall behind the spandrel).
2032
2047
  #
2033
2048
  # If TBD's uprating calculations (e.g. NECB 2017) were in theory no longer
2034
2049
  # required, BTAP's treatment of HP CW spandrels could be implemented
@@ -2058,7 +2073,7 @@ end
2058
2073
  #
2059
2074
  # These added features would simplify the process tremendously. Yet
2060
2075
  # without admissible CW spandrel U factors down to 0.130 or 0.100 W/m2.K,
2061
- # TBD's uprating features would necessarily push other wall constructions
2076
+ # TBD's uprating features would necessarily push OTHER wall constructions
2062
2077
  # to compensate - noticeably for climate zone 7 (or colder). This would
2063
2078
  # make it MUCH MORE difficult to identify NECB2017 or NECB2020 compliant
2064
2079
  # combinations of Uo+PSI factors if ever HP CW spandrels were integrated
@@ -2066,21 +2081,25 @@ end
2066
2081
 
2067
2082
  # NOTE: Some of the aforementioned constructions have exterior brick veneer.
2068
2083
  # For 2-story OpenStudio models with punch windows (i.e. not strip
2069
- # windows), one would NOT expect a continuous shelf angle along the
2084
+ # windows), one would NOT expect a continuous steel shelf angle along the
2070
2085
  # intermediate floor slab edge (typically a MAJOR thermal bridge). One
2071
2086
  # would instead expect loose lintels above punch windows, just as with
2072
- # doors. Loose lintels usually do not constitute MAJOR thermal bridges.
2087
+ # doors. Loose lintels usually compound heat loss along window head edges,
2088
+ # but are currently considered as factored in the retained PSI factors for
2089
+ # window and door head details (a postulate that likely needs revision).
2073
2090
  # For taller builings, shelf angles are indeed expected. And if windows
2074
2091
  # are instead strip windows (not punch windows), then loose lintels would
2075
2092
  # typically be cast aside in favour of an offset shelf angle (even for
2076
2093
  # 1-story buildings).
2077
2094
  #
2078
2095
  # Many of the US DOE Commercial Benchmark Building and BTAP models are
2079
- # 1-story or 2-stories in height, yet they all have strip windows as their
2096
+ # 1-story or 2-stories in height, yet they ALL have strip windows as their
2080
2097
  # default fenestration layout. As a result, BTAP/TBD presumes continuous
2081
2098
  # shelf angles, offset by the height difference between slab edge and
2082
- # window head. Loose lintels (included in the clear field costing, $/m2)
2083
- # should be limited to those above doors (TO-DO).
2099
+ # window head. Loose lintels are however included in the clear field
2100
+ # costing ($/m2), yet should be limited to doors (TO-DO). A more flexible,
2101
+ # general solution would be required for 3rd-party OpenStudio models
2102
+ # (without strip windows as a basic fenestration layout).
2084
2103
  #
2085
2104
  # NOTE: BTAP costing: In addition to the listed items for parapets as MAJOR
2086
2105
  # thermal bridges (eventually generating an overall $ per linear meter),