openstudio-standards 0.4.0 → 0.5.0.rc1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (376) hide show
  1. checksums.yaml +4 -4
  2. data/data/inventory/thermal_bridging.csv +90 -0
  3. data/data/standards/OpenStudio_Standards-deer-comstock.xlsx +0 -0
  4. data/data/standards/manage_OpenStudio_Standards.rb +1 -1
  5. data/data/standards/test_performance_expected_dd_results.csv +2014 -1891
  6. data/lib/openstudio-standards/btap/analysis.rb +8 -8
  7. data/lib/openstudio-standards/btap/bridging.rb +664 -645
  8. data/lib/openstudio-standards/btap/btap.model.rb +14 -14
  9. data/lib/openstudio-standards/btap/btap.rb +7 -7
  10. data/lib/openstudio-standards/btap/btap_result.rb +1 -1
  11. data/lib/openstudio-standards/btap/economics.rb +23 -23
  12. data/lib/openstudio-standards/btap/envelope.rb +8 -8
  13. data/lib/openstudio-standards/btap/equest.rb +1 -1
  14. data/lib/openstudio-standards/btap/geometry.rb +2 -2
  15. data/lib/openstudio-standards/btap/mpc.rb +7 -7
  16. data/lib/openstudio-standards/btap/schedules.rb +1 -1
  17. data/lib/openstudio-standards/btap/simmanager.rb +4 -4
  18. data/lib/openstudio-standards/btap/spaceloads.rb +26 -26
  19. data/lib/openstudio-standards/btap/utilities.rb +6 -6
  20. data/lib/openstudio-standards/btap/vintagizer.rb +1 -1
  21. data/lib/openstudio-standards/constructions/information.rb +83 -0
  22. data/lib/openstudio-standards/constructions/materials/modify.rb +72 -0
  23. data/lib/openstudio-standards/constructions/modify.rb +80 -0
  24. data/lib/openstudio-standards/create_typical/create_typical.rb +983 -0
  25. data/lib/openstudio-standards/create_typical/enumerations.rb +484 -0
  26. data/lib/openstudio-standards/create_typical/space_type_blend.rb +791 -0
  27. data/lib/openstudio-standards/create_typical/space_type_ratios.rb +494 -0
  28. data/lib/openstudio-standards/daylighting/space.rb +47 -0
  29. data/lib/openstudio-standards/geometry/create.rb +801 -0
  30. data/lib/openstudio-standards/geometry/create_bar.rb +2171 -0
  31. data/lib/openstudio-standards/geometry/information.rb +462 -0
  32. data/lib/openstudio-standards/geometry/modify.rb +48 -0
  33. data/lib/openstudio-standards/hvac/air_loop/information.rb +79 -0
  34. data/lib/openstudio-standards/hvac/cbecs_hvac.rb +616 -0
  35. data/lib/openstudio-standards/hvac/setpoint_managers/information.rb +91 -0
  36. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.AirTerminalSingleDuctVAVReheat.rb +1 -1
  37. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.AirTerminalSingleDuctVAVReheat.rb +1 -1
  38. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.AirTerminalSingleDuctVAVReheat.rb +1 -1
  39. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.Model.rb +1 -1
  40. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirTerminalSingleDuctVAVReheat.rb +1 -1
  41. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.Model.rb +2 -2
  42. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.hvac_systems.rb +1 -1
  43. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.AirTerminalSingleDuctVAVReheat.rb +1 -1
  44. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.Model.rb +4 -36
  45. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.hvac_systems.rb +1 -1
  46. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirTerminalSingleDuctVAVReheat.rb +1 -1
  47. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Model.rb +4 -36
  48. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Space.rb +3 -3
  49. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.hvac_systems.rb +1 -1
  50. data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.AirTerminalSingleDuctVAVReheat.rb +1 -1
  51. data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.Model.elevators.rb +1 -1
  52. data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.AirTerminalSingleDuctVAVReheat.rb +1 -1
  53. data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.CoilHeatingGas.rb +1 -1
  54. data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.Model.elevators.rb +1 -1
  55. data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.AirTerminalSingleDuctVAVReheat.rb +1 -1
  56. data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirTerminalSingleDuctVAVReheat.rb +1 -1
  57. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.College.rb +7 -7
  58. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Courthouse.rb +8 -8
  59. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.FullServiceRestaurant.rb +14 -14
  60. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.HighRiseApartment.rb +9 -9
  61. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Hospital.rb +16 -16
  62. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Laboratory.rb +7 -7
  63. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeDataCenterHighITE.rb +8 -8
  64. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeDataCenterLowITE.rb +8 -8
  65. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeHotel.rb +11 -11
  66. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeOffice.rb +7 -7
  67. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeOfficeDetailed.rb +9 -9
  68. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.MediumOffice.rb +8 -8
  69. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.MediumOfficeDetailed.rb +11 -11
  70. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.MidriseApartment.rb +9 -9
  71. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Outpatient.rb +19 -19
  72. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.PrimarySchool.rb +10 -10
  73. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.QuickServiceRestaurant.rb +13 -13
  74. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.RetailStandalone.rb +6 -6
  75. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.RetailStripmall.rb +6 -6
  76. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SecondarySchool.rb +9 -9
  77. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallDataCenterHighITE.rb +8 -8
  78. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallDataCenterLowITE.rb +8 -8
  79. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallHotel.rb +8 -8
  80. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallOffice.rb +8 -8
  81. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallOfficeDetailed.rb +11 -11
  82. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SuperMarket.rb +10 -10
  83. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SuperTallBuilding.rb +19 -19
  84. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.TallBuilding.rb +18 -18
  85. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Warehouse.rb +6 -6
  86. data/lib/openstudio-standards/prototypes/common/do_not_edit_metaclasses.rb +957 -957
  87. data/lib/openstudio-standards/prototypes/common/objects/Prototype.AirConditionerVariableRefrigerantFlow.rb +1 -1
  88. data/lib/openstudio-standards/prototypes/common/objects/Prototype.AirTerminalSingleDuctVAVReheat.rb +1 -1
  89. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingWaterToAirHeatPumpEquationFit.rb +84 -16
  90. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingDXSingleSpeed.rb +1 -1
  91. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingGas.rb +1 -1
  92. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingWaterToAirHeatPumpEquationFit.rb +61 -10
  93. data/lib/openstudio-standards/prototypes/common/objects/Prototype.ControllerWaterCoil.rb +1 -1
  94. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoolingTower.rb +1 -1
  95. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Fan.rb +1 -1
  96. data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanConstantVolume.rb +1 -1
  97. data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanOnOff.rb +1 -1
  98. data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanVariableVolume.rb +1 -1
  99. data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanZoneExhaust.rb +1 -1
  100. data/lib/openstudio-standards/prototypes/common/objects/Prototype.HeatExchangerAirToAirSensibleAndLatent.rb +2 -2
  101. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.exterior_lights.rb +4 -4
  102. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.hvac.rb +4 -4
  103. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.rb +43 -30
  104. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.swh.rb +1 -1
  105. data/lib/openstudio-standards/prototypes/common/objects/Prototype.ServiceWaterHeating.rb +18 -11
  106. data/lib/openstudio-standards/prototypes/common/objects/Prototype.SizingSystem.rb +1 -1
  107. data/lib/openstudio-standards/prototypes/common/objects/Prototype.hvac_systems.rb +774 -117
  108. data/lib/openstudio-standards/prototypes/common/objects/Prototype.radiant_system_controls.rb +340 -481
  109. data/lib/openstudio-standards/prototypes/common/objects/Prototype.refrigeration.rb +3 -3
  110. data/lib/openstudio-standards/prototypes/common/objects/Prototype.utilities.rb +3 -3
  111. data/lib/openstudio-standards/prototypes/common/prototype_metaprogramming.rb +22 -22
  112. data/lib/openstudio-standards/prototypes/deer/deer.Model.rb +1 -1
  113. data/lib/openstudio-standards/qaqc/calibration.rb +131 -0
  114. data/lib/openstudio-standards/qaqc/create_results.rb +983 -0
  115. data/lib/openstudio-standards/qaqc/envelope.rb +399 -0
  116. data/lib/openstudio-standards/qaqc/eui.rb +213 -0
  117. data/lib/openstudio-standards/qaqc/hvac.rb +1943 -0
  118. data/lib/openstudio-standards/qaqc/internal_loads.rb +568 -0
  119. data/lib/openstudio-standards/qaqc/reporting.rb +141 -0
  120. data/lib/openstudio-standards/qaqc/schedules.rb +129 -0
  121. data/lib/openstudio-standards/qaqc/service_water_heating.rb +273 -0
  122. data/lib/openstudio-standards/qaqc/weather_files.rb +497 -0
  123. data/lib/openstudio-standards/qaqc/zone_conditions.rb +278 -0
  124. data/lib/openstudio-standards/schedules/create.rb +364 -0
  125. data/lib/openstudio-standards/schedules/information.rb +169 -0
  126. data/lib/openstudio-standards/schedules/modify.rb +445 -0
  127. data/lib/openstudio-standards/standards/Standards.AirLoopHVAC.rb +110 -71
  128. data/lib/openstudio-standards/standards/Standards.AirTerminalSingleDuctParallelPIUReheat.rb +3 -3
  129. data/lib/openstudio-standards/standards/Standards.AirTerminalSingleDuctVAVReheat.rb +4 -4
  130. data/lib/openstudio-standards/standards/Standards.BoilerHotWater.rb +2 -1
  131. data/lib/openstudio-standards/standards/Standards.ChillerElectricEIR.rb +16 -10
  132. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXSingleSpeed.rb +4 -4
  133. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXTwoSpeed.rb +1 -1
  134. data/lib/openstudio-standards/standards/Standards.CoilCoolingWaterToAirHeatPumpEquationFit.rb +1 -1
  135. data/lib/openstudio-standards/standards/Standards.CoilDX.rb +4 -4
  136. data/lib/openstudio-standards/standards/Standards.CoilHeatingDXMultiSpeed.rb +1 -1
  137. data/lib/openstudio-standards/standards/Standards.CoilHeatingDXSingleSpeed.rb +5 -5
  138. data/lib/openstudio-standards/standards/Standards.CoilHeatingGas.rb +1 -1
  139. data/lib/openstudio-standards/standards/Standards.CoilHeatingGasMultiStage.rb +1 -1
  140. data/lib/openstudio-standards/standards/Standards.CoilHeatingWaterToAirHeatPumpEquationFit.rb +1 -1
  141. data/lib/openstudio-standards/standards/Standards.Construction.rb +17 -18
  142. data/lib/openstudio-standards/standards/Standards.CoolingTower.rb +6 -6
  143. data/lib/openstudio-standards/standards/Standards.CoolingTowerSingleSpeed.rb +1 -1
  144. data/lib/openstudio-standards/standards/Standards.CoolingTowerTwoSpeed.rb +1 -1
  145. data/lib/openstudio-standards/standards/Standards.CoolingTowerVariableSpeed.rb +1 -1
  146. data/lib/openstudio-standards/standards/Standards.Fan.rb +6 -12
  147. data/lib/openstudio-standards/standards/Standards.FanVariableVolume.rb +2 -2
  148. data/lib/openstudio-standards/standards/Standards.FluidCooler.rb +1 -1
  149. data/lib/openstudio-standards/standards/Standards.HeaderedPumpsVariableSpeed.rb +1 -1
  150. data/lib/openstudio-standards/standards/Standards.HeatExchangerSensLat.rb +3 -3
  151. data/lib/openstudio-standards/standards/Standards.Model.rb +411 -261
  152. data/lib/openstudio-standards/standards/Standards.PlanarSurface.rb +2 -2
  153. data/lib/openstudio-standards/standards/Standards.PlantLoop.rb +94 -29
  154. data/lib/openstudio-standards/standards/Standards.Pump.rb +2 -2
  155. data/lib/openstudio-standards/standards/Standards.ScheduleConstant.rb +2 -2
  156. data/lib/openstudio-standards/standards/Standards.ScheduleRuleset.rb +14 -14
  157. data/lib/openstudio-standards/standards/Standards.Space.rb +37 -30
  158. data/lib/openstudio-standards/standards/Standards.SpaceType.rb +38 -29
  159. data/lib/openstudio-standards/standards/Standards.SubSurface.rb +7 -7
  160. data/lib/openstudio-standards/standards/Standards.Surface.rb +13 -13
  161. data/lib/openstudio-standards/standards/Standards.ThermalZone.rb +109 -66
  162. data/lib/openstudio-standards/standards/Standards.WaterHeaterMixed.rb +11 -4
  163. data/lib/openstudio-standards/standards/Standards.ZoneHVACComponent.rb +6 -6
  164. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.AirLoopHVAC.rb +1 -1
  165. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.PlantLoop.rb +1 -1
  166. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.Space.rb +1 -1
  167. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.Space.rb +1 -1
  168. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.AirLoopHVAC.rb +4 -4
  169. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.AirTerminalSingleDuctVAVReheat.rb +1 -1
  170. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.Space.rb +4 -4
  171. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirLoopHVAC.rb +4 -4
  172. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirTerminalSingleDuctVAVReheat.rb +1 -1
  173. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.CoolingTowerVariableSpeed.rb +1 -1
  174. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.Model.rb +5 -21
  175. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.Space.rb +4 -4
  176. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.WaterHeaterMixed.rb +1 -1
  177. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.ZoneHVACComponent.rb +1 -1
  178. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.AirLoopHVAC.rb +36 -4
  179. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.AirTerminalSingleDuctVAVReheat.rb +1 -1
  180. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.CoolingTowerVariableSpeed.rb +1 -1
  181. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.Space.rb +4 -4
  182. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.ZoneHVACComponent.rb +1 -1
  183. 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
  184. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirLoopHVAC.rb +53 -10
  185. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirTerminalSingleDuctVAVReheat.rb +1 -1
  186. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.CoolingTowerVariableSpeed.rb +1 -1
  187. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Space.rb +6 -6
  188. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.ZoneHVACComponent.rb +2 -2
  189. 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
  190. data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.curves.json +211 -211
  191. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.economizers.json +14 -14
  192. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.AirLoopHVAC.rb +4 -4
  193. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.Model.rb +1 -1
  194. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.PlantLoop.rb +1 -1
  195. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.economizers.json +14 -14
  196. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.AirLoopHVAC.rb +4 -4
  197. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.Model.rb +1 -1
  198. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.PlantLoop.rb +1 -1
  199. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.AirLoopHVAC.rb +6 -6
  200. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.AirTerminalSingleDuctVAVReheat.rb +1 -1
  201. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.CoolingTowerVariableSpeed.rb +1 -1
  202. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.PlantLoop.rb +1 -1
  203. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.Space.rb +4 -4
  204. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirLoopHVAC.rb +6 -6
  205. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirTerminalSingleDuctVAVReheat.rb +1 -1
  206. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.CoolingTowerVariableSpeed.rb +1 -1
  207. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.PlantLoop.rb +1 -1
  208. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.Space.rb +4 -4
  209. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.AirLoopHVAC.rb +22 -28
  210. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.AirTerminalSingleDuctParallelPIUReheat.rb +1 -1
  211. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.AirTerminalSingleDuctVAVReheat.rb +2 -2
  212. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.BoilerHotWater.rb +1 -74
  213. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.ChillerElectricEIR.rb +7 -59
  214. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilCoolingDXSingleSpeed.rb +1 -1
  215. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilCoolingDXTwoSpeed.rb +1 -1
  216. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilDX.rb +1 -1
  217. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilHeatingDXSingleSpeed.rb +1 -1
  218. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilHeatingGas.rb +1 -21
  219. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.DesignSpecificationOutdoorAir.rb +101 -0
  220. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.FanConstantVolume.rb +1 -1
  221. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.FanOnOff.rb +1 -1
  222. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.FanVariableVolume.rb +1 -1
  223. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.HeatExchangerSensLat.rb +1 -1
  224. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.Model.rb +643 -526
  225. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.PlanarSurface.rb +8 -2
  226. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.PlantLoop.rb +17 -77
  227. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.Space.rb +74 -16
  228. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.SpaceType.rb +96 -44
  229. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.Surface.rb +6 -6
  230. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.ThermalZone.rb +18 -6
  231. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.ZoneHVACComponent.rb +1 -1
  232. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.rb +328 -74
  233. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/ashrae_90_1_prm_2019.Model.rb +0 -118
  234. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/ashrae_90_1_prm_2019.rb +2 -1
  235. 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
  236. data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/baseline_outdoor_air.md +35 -0
  237. data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/set_plug_load_measures.md +1 -1
  238. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/ashrae_90_1_prm.UserData.rb +228 -0
  239. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_enums.rb +131 -0
  240. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_space.csv +1 -1
  241. data/lib/openstudio-standards/standards/cbes/cbes.AirLoopHVAC.rb +5 -5
  242. data/lib/openstudio-standards/standards/cbes/cbes.Model.rb +1 -1
  243. data/lib/openstudio-standards/standards/cbes/cbes.PlantLoop.rb +1 -1
  244. data/lib/openstudio-standards/standards/cbes/cbes.Space.rb +1 -1
  245. data/lib/openstudio-standards/standards/cbes/cbes_t24_2005/cbes_t24_2005.Space.rb +1 -1
  246. data/lib/openstudio-standards/standards/cbes/cbes_t24_2008/cbes_t24_2008.Space.rb +1 -1
  247. data/lib/openstudio-standards/standards/deer/deer.AirLoopHVAC.rb +109 -27
  248. data/lib/openstudio-standards/standards/deer/deer.Space.rb +1 -1
  249. data/lib/openstudio-standards/standards/deer/deer_1985/data/deer_1985.economizers.json +246 -4
  250. data/lib/openstudio-standards/standards/deer/deer_1996/data/deer_1996.economizers.json +246 -4
  251. data/lib/openstudio-standards/standards/deer/deer_2003/data/deer_2003.economizers.json +246 -4
  252. data/lib/openstudio-standards/standards/deer/deer_2003/deer_2003.ThermalZone.rb +18 -18
  253. data/lib/openstudio-standards/standards/deer/deer_2007/data/deer_2007.economizers.json +246 -4
  254. data/lib/openstudio-standards/standards/deer/deer_2007/deer_2007.ThermalZone.rb +18 -18
  255. data/lib/openstudio-standards/standards/deer/deer_2011/data/deer_2011.economizers.json +246 -4
  256. data/lib/openstudio-standards/standards/deer/deer_2011/deer_2011.ThermalZone.rb +18 -18
  257. data/lib/openstudio-standards/standards/deer/deer_2014/data/deer_2014.economizers.json +248 -6
  258. data/lib/openstudio-standards/standards/deer/deer_2014/deer_2014.Space.rb +3 -3
  259. data/lib/openstudio-standards/standards/deer/deer_2014/deer_2014.ThermalZone.rb +18 -18
  260. data/lib/openstudio-standards/standards/deer/deer_2015/data/deer_2015.economizers.json +248 -6
  261. data/lib/openstudio-standards/standards/deer/deer_2015/deer_2015.Space.rb +3 -3
  262. data/lib/openstudio-standards/standards/deer/deer_2015/deer_2015.ThermalZone.rb +18 -18
  263. data/lib/openstudio-standards/standards/deer/deer_2017/data/deer_2017.economizers.json +248 -6
  264. data/lib/openstudio-standards/standards/deer/deer_2017/deer_2017.Space.rb +3 -3
  265. data/lib/openstudio-standards/standards/deer/deer_2017/deer_2017.ThermalZone.rb +18 -18
  266. data/lib/openstudio-standards/standards/deer/deer_2020/data/deer_2020.economizers.json +248 -6
  267. data/lib/openstudio-standards/standards/deer/deer_2020/deer_2020.AirLoopHVAC.rb +18 -5
  268. data/lib/openstudio-standards/standards/deer/deer_2020/deer_2020.FanVariableVolume.rb +1 -1
  269. data/lib/openstudio-standards/standards/deer/deer_2020/deer_2020.Space.rb +3 -3
  270. data/lib/openstudio-standards/standards/deer/deer_2020/deer_2020.ThermalZone.rb +18 -18
  271. data/lib/openstudio-standards/standards/deer/deer_2025/data/deer_2025.economizers.json +248 -6
  272. data/lib/openstudio-standards/standards/deer/deer_2025/deer_2025.AirLoopHVAC.rb +3 -3
  273. data/lib/openstudio-standards/standards/deer/deer_2025/deer_2025.FanVariableVolume.rb +1 -1
  274. data/lib/openstudio-standards/standards/deer/deer_2025/deer_2025.Space.rb +3 -3
  275. data/lib/openstudio-standards/standards/deer/deer_2030/data/deer_2030.economizers.json +248 -6
  276. data/lib/openstudio-standards/standards/deer/deer_2030/data/deer_2030.heat_pumps.json +2 -2
  277. data/lib/openstudio-standards/standards/deer/deer_2030/deer_2030.AirLoopHVAC.rb +3 -3
  278. data/lib/openstudio-standards/standards/deer/deer_2030/deer_2030.FanVariableVolume.rb +1 -1
  279. data/lib/openstudio-standards/standards/deer/deer_2030/deer_2030.Space.rb +3 -3
  280. data/lib/openstudio-standards/standards/deer/deer_2035/data/deer_2035.economizers.json +248 -6
  281. data/lib/openstudio-standards/standards/deer/deer_2035/deer_2035.AirLoopHVAC.rb +3 -3
  282. data/lib/openstudio-standards/standards/deer/deer_2035/deer_2035.FanVariableVolume.rb +1 -1
  283. data/lib/openstudio-standards/standards/deer/deer_2035/deer_2035.Space.rb +3 -3
  284. data/lib/openstudio-standards/standards/deer/deer_2040/data/deer_2040.economizers.json +248 -6
  285. data/lib/openstudio-standards/standards/deer/deer_2040/deer_2040.AirLoopHVAC.rb +3 -3
  286. data/lib/openstudio-standards/standards/deer/deer_2040/deer_2040.FanVariableVolume.rb +1 -1
  287. data/lib/openstudio-standards/standards/deer/deer_2040/deer_2040.Space.rb +3 -3
  288. data/lib/openstudio-standards/standards/deer/deer_2045/data/deer_2045.economizers.json +260 -0
  289. data/lib/openstudio-standards/standards/deer/deer_2045/deer_2045.AirLoopHVAC.rb +3 -3
  290. data/lib/openstudio-standards/standards/deer/deer_2045/deer_2045.FanVariableVolume.rb +1 -1
  291. data/lib/openstudio-standards/standards/deer/deer_2045/deer_2045.Space.rb +3 -3
  292. data/lib/openstudio-standards/standards/deer/deer_2050/data/deer_2050.economizers.json +248 -6
  293. data/lib/openstudio-standards/standards/deer/deer_2050/deer_2050.AirLoopHVAC.rb +3 -3
  294. data/lib/openstudio-standards/standards/deer/deer_2050/deer_2050.FanVariableVolume.rb +1 -1
  295. data/lib/openstudio-standards/standards/deer/deer_2050/deer_2050.Space.rb +3 -3
  296. data/lib/openstudio-standards/standards/deer/deer_2055/data/deer_2055.economizers.json +248 -6
  297. data/lib/openstudio-standards/standards/deer/deer_2055/deer_2055.AirLoopHVAC.rb +3 -3
  298. data/lib/openstudio-standards/standards/deer/deer_2055/deer_2055.FanVariableVolume.rb +1 -1
  299. data/lib/openstudio-standards/standards/deer/deer_2055/deer_2055.Space.rb +3 -3
  300. data/lib/openstudio-standards/standards/deer/deer_2060/data/deer_2060.economizers.json +248 -6
  301. data/lib/openstudio-standards/standards/deer/deer_2060/deer_2060.AirLoopHVAC.rb +3 -3
  302. data/lib/openstudio-standards/standards/deer/deer_2060/deer_2060.FanVariableVolume.rb +1 -1
  303. data/lib/openstudio-standards/standards/deer/deer_2060/deer_2060.Space.rb +3 -3
  304. data/lib/openstudio-standards/standards/deer/deer_2065/data/deer_2065.economizers.json +248 -6
  305. data/lib/openstudio-standards/standards/deer/deer_2065/deer_2065.AirLoopHVAC.rb +3 -3
  306. data/lib/openstudio-standards/standards/deer/deer_2065/deer_2065.FanVariableVolume.rb +1 -1
  307. data/lib/openstudio-standards/standards/deer/deer_2065/deer_2065.Space.rb +3 -3
  308. data/lib/openstudio-standards/standards/deer/deer_2070/data/deer_2070.economizers.json +248 -6
  309. data/lib/openstudio-standards/standards/deer/deer_2070/deer_2070.AirLoopHVAC.rb +3 -3
  310. data/lib/openstudio-standards/standards/deer/deer_2070/deer_2070.FanVariableVolume.rb +1 -1
  311. data/lib/openstudio-standards/standards/deer/deer_2070/deer_2070.Space.rb +3 -3
  312. data/lib/openstudio-standards/standards/deer/deer_2075/data/deer_2075.economizers.json +248 -6
  313. data/lib/openstudio-standards/standards/deer/deer_2075/deer_2075.AirLoopHVAC.rb +3 -3
  314. data/lib/openstudio-standards/standards/deer/deer_2075/deer_2075.FanVariableVolume.rb +1 -1
  315. data/lib/openstudio-standards/standards/deer/deer_2075/deer_2075.Space.rb +3 -3
  316. data/lib/openstudio-standards/standards/deer/deer_pre_1975/data/deer_pre_1975.economizers.json +246 -4
  317. data/lib/openstudio-standards/standards/necb/BTAP1980TO2010/data/space_types.json +447 -223
  318. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/building_envelope.rb +1 -1
  319. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/data/space_types.json +447 -223
  320. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_systems.rb +5 -2
  321. data/lib/openstudio-standards/standards/necb/ECMS/data/chiller_types.json +25 -0
  322. data/lib/openstudio-standards/standards/necb/ECMS/data/chillers.json +44 -0
  323. data/lib/openstudio-standards/standards/necb/ECMS/data/curves.json +225 -0
  324. data/lib/openstudio-standards/standards/necb/ECMS/ecms.rb +2 -2
  325. data/lib/openstudio-standards/standards/necb/ECMS/hvac_systems.rb +193 -73
  326. data/lib/openstudio-standards/standards/necb/ECMS/pv_ground.rb +1 -1
  327. data/lib/openstudio-standards/standards/necb/NECB2011/autozone.rb +10 -4
  328. data/lib/openstudio-standards/standards/necb/NECB2011/beps_compliance_path.rb +7 -7
  329. data/lib/openstudio-standards/standards/necb/NECB2011/building_envelope.rb +4 -5
  330. data/lib/openstudio-standards/standards/necb/NECB2011/data/chiller_types.json +32 -0
  331. data/lib/openstudio-standards/standards/necb/NECB2011/data/chillers.json +1 -1
  332. data/lib/openstudio-standards/standards/necb/NECB2011/data/constants.json +36 -0
  333. data/lib/openstudio-standards/standards/necb/NECB2011/data/fuel_type_sets.json +7 -7
  334. data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/NorthernEducation.osm +47587 -0
  335. data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/NorthernHealthCare.osm +49764 -0
  336. data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/Warehouse.osm +283 -297
  337. data/lib/openstudio-standards/standards/necb/NECB2011/data/space_type_unit_definitions.txt +2 -1
  338. data/lib/openstudio-standards/standards/necb/NECB2011/data/space_types.json +447 -223
  339. data/lib/openstudio-standards/standards/necb/NECB2011/data/standards_data.rb +3 -3
  340. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_1_multi_speed.rb +1 -1
  341. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_systems.rb +49 -27
  342. data/lib/openstudio-standards/standards/necb/NECB2011/necb_2011.rb +400 -202
  343. data/lib/openstudio-standards/standards/necb/NECB2011/service_water_heating.rb +4 -4
  344. data/lib/openstudio-standards/standards/necb/NECB2015/data/space_types.json +637 -318
  345. data/lib/openstudio-standards/standards/necb/NECB2015/hvac_systems.rb +18 -1
  346. data/lib/openstudio-standards/standards/necb/NECB2015/necb_2015.rb +3 -3
  347. data/lib/openstudio-standards/standards/necb/NECB2017/data/space_types.json +637 -318
  348. data/lib/openstudio-standards/standards/necb/NECB2017/hvac_systems.rb +1 -1
  349. data/lib/openstudio-standards/standards/necb/NECB2017/necb_2017.rb +3 -3
  350. data/lib/openstudio-standards/standards/necb/NECB2020/building_envelope.rb +1 -1
  351. data/lib/openstudio-standards/standards/necb/NECB2020/data/space_types.json +615 -307
  352. data/lib/openstudio-standards/standards/necb/NECB2020/service_water_heating.rb +4 -4
  353. data/lib/openstudio-standards/standards/necb/common/btap_data.rb +10 -5
  354. data/lib/openstudio-standards/standards/necb/common/btap_datapoint.rb +1 -1
  355. data/lib/openstudio-standards/utilities/assertion.rb +128 -0
  356. data/lib/openstudio-standards/utilities/logging.rb +2 -3
  357. data/lib/openstudio-standards/utilities/object_info.rb +39 -18
  358. data/lib/openstudio-standards/utilities/schedule_translator.rb +8 -6
  359. data/lib/openstudio-standards/utilities/simulation.rb +24 -11
  360. data/lib/openstudio-standards/utilities/sqlfile.rb +10 -5
  361. data/lib/openstudio-standards/version.rb +1 -1
  362. data/lib/openstudio-standards/weather/Weather.Model.rb +8 -9
  363. data/lib/openstudio-standards/weather/Weather.stat_file.rb +3 -3
  364. data/lib/openstudio-standards/weather/information.rb +35 -0
  365. data/lib/openstudio-standards.rb +69 -5
  366. metadata +52 -16
  367. data/data/standards/OpenStudio_Standards-deer-ALL-comstock(space_types).xlsx +0 -0
  368. data/lib/openstudio-standards/hvac_sizing/Siz.AirLoopHVAC.rb +0 -59
  369. data/lib/openstudio-standards/hvac_sizing/Siz.CoilCoolingWater.rb +0 -13
  370. data/lib/openstudio-standards/hvac_sizing/Siz.HVACComponent.rb +0 -36
  371. data/lib/openstudio-standards/hvac_sizing/Siz.HeatingCoolingFuels.rb +0 -898
  372. data/lib/openstudio-standards/hvac_sizing/Siz.Model.rb +0 -126
  373. data/lib/openstudio-standards/hvac_sizing/Siz.ThermalZone.rb +0 -356
  374. data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.Model.rb +0 -35
  375. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoolingTower.rb +0 -110
  376. 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),