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.
- checksums.yaml +4 -4
- data/data/inventory/thermal_bridging.csv +90 -0
- data/data/standards/OpenStudio_Standards-deer-comstock.xlsx +0 -0
- data/data/standards/manage_OpenStudio_Standards.rb +1 -1
- data/data/standards/test_performance_expected_dd_results.csv +2014 -1891
- data/lib/openstudio-standards/btap/analysis.rb +8 -8
- data/lib/openstudio-standards/btap/bridging.rb +664 -645
- data/lib/openstudio-standards/btap/btap.model.rb +14 -14
- data/lib/openstudio-standards/btap/btap.rb +7 -7
- data/lib/openstudio-standards/btap/btap_result.rb +1 -1
- data/lib/openstudio-standards/btap/economics.rb +23 -23
- data/lib/openstudio-standards/btap/envelope.rb +8 -8
- data/lib/openstudio-standards/btap/equest.rb +1 -1
- data/lib/openstudio-standards/btap/geometry.rb +2 -2
- data/lib/openstudio-standards/btap/mpc.rb +7 -7
- data/lib/openstudio-standards/btap/schedules.rb +1 -1
- data/lib/openstudio-standards/btap/simmanager.rb +4 -4
- data/lib/openstudio-standards/btap/spaceloads.rb +26 -26
- data/lib/openstudio-standards/btap/utilities.rb +6 -6
- data/lib/openstudio-standards/btap/vintagizer.rb +1 -1
- data/lib/openstudio-standards/constructions/information.rb +83 -0
- data/lib/openstudio-standards/constructions/materials/modify.rb +72 -0
- data/lib/openstudio-standards/constructions/modify.rb +80 -0
- data/lib/openstudio-standards/create_typical/create_typical.rb +983 -0
- data/lib/openstudio-standards/create_typical/enumerations.rb +484 -0
- data/lib/openstudio-standards/create_typical/space_type_blend.rb +791 -0
- data/lib/openstudio-standards/create_typical/space_type_ratios.rb +494 -0
- data/lib/openstudio-standards/daylighting/space.rb +47 -0
- data/lib/openstudio-standards/geometry/create.rb +801 -0
- data/lib/openstudio-standards/geometry/create_bar.rb +2171 -0
- data/lib/openstudio-standards/geometry/information.rb +462 -0
- data/lib/openstudio-standards/geometry/modify.rb +48 -0
- data/lib/openstudio-standards/hvac/air_loop/information.rb +79 -0
- data/lib/openstudio-standards/hvac/cbecs_hvac.rb +616 -0
- data/lib/openstudio-standards/hvac/setpoint_managers/information.rb +91 -0
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.Model.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.Model.rb +2 -2
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.hvac_systems.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.Model.rb +4 -36
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.hvac_systems.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Model.rb +4 -36
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Space.rb +3 -3
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.hvac_systems.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.Model.elevators.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.CoilHeatingGas.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.Model.elevators.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.College.rb +7 -7
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Courthouse.rb +8 -8
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.FullServiceRestaurant.rb +14 -14
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.HighRiseApartment.rb +9 -9
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Hospital.rb +16 -16
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Laboratory.rb +7 -7
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeDataCenterHighITE.rb +8 -8
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeDataCenterLowITE.rb +8 -8
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeHotel.rb +11 -11
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeOffice.rb +7 -7
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeOfficeDetailed.rb +9 -9
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.MediumOffice.rb +8 -8
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.MediumOfficeDetailed.rb +11 -11
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.MidriseApartment.rb +9 -9
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Outpatient.rb +19 -19
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.PrimarySchool.rb +10 -10
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.QuickServiceRestaurant.rb +13 -13
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.RetailStandalone.rb +6 -6
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.RetailStripmall.rb +6 -6
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SecondarySchool.rb +9 -9
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallDataCenterHighITE.rb +8 -8
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallDataCenterLowITE.rb +8 -8
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallHotel.rb +8 -8
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallOffice.rb +8 -8
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallOfficeDetailed.rb +11 -11
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SuperMarket.rb +10 -10
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SuperTallBuilding.rb +19 -19
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.TallBuilding.rb +18 -18
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Warehouse.rb +6 -6
- data/lib/openstudio-standards/prototypes/common/do_not_edit_metaclasses.rb +957 -957
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.AirConditionerVariableRefrigerantFlow.rb +1 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingWaterToAirHeatPumpEquationFit.rb +84 -16
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingDXSingleSpeed.rb +1 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingGas.rb +1 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingWaterToAirHeatPumpEquationFit.rb +61 -10
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.ControllerWaterCoil.rb +1 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoolingTower.rb +1 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.Fan.rb +1 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanConstantVolume.rb +1 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanOnOff.rb +1 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanVariableVolume.rb +1 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanZoneExhaust.rb +1 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.HeatExchangerAirToAirSensibleAndLatent.rb +2 -2
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.exterior_lights.rb +4 -4
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.hvac.rb +4 -4
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.rb +43 -30
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.swh.rb +1 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.ServiceWaterHeating.rb +18 -11
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.SizingSystem.rb +1 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.hvac_systems.rb +774 -117
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.radiant_system_controls.rb +340 -481
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.refrigeration.rb +3 -3
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.utilities.rb +3 -3
- data/lib/openstudio-standards/prototypes/common/prototype_metaprogramming.rb +22 -22
- data/lib/openstudio-standards/prototypes/deer/deer.Model.rb +1 -1
- data/lib/openstudio-standards/qaqc/calibration.rb +131 -0
- data/lib/openstudio-standards/qaqc/create_results.rb +983 -0
- data/lib/openstudio-standards/qaqc/envelope.rb +399 -0
- data/lib/openstudio-standards/qaqc/eui.rb +213 -0
- data/lib/openstudio-standards/qaqc/hvac.rb +1943 -0
- data/lib/openstudio-standards/qaqc/internal_loads.rb +568 -0
- data/lib/openstudio-standards/qaqc/reporting.rb +141 -0
- data/lib/openstudio-standards/qaqc/schedules.rb +129 -0
- data/lib/openstudio-standards/qaqc/service_water_heating.rb +273 -0
- data/lib/openstudio-standards/qaqc/weather_files.rb +497 -0
- data/lib/openstudio-standards/qaqc/zone_conditions.rb +278 -0
- data/lib/openstudio-standards/schedules/create.rb +364 -0
- data/lib/openstudio-standards/schedules/information.rb +169 -0
- data/lib/openstudio-standards/schedules/modify.rb +445 -0
- data/lib/openstudio-standards/standards/Standards.AirLoopHVAC.rb +110 -71
- data/lib/openstudio-standards/standards/Standards.AirTerminalSingleDuctParallelPIUReheat.rb +3 -3
- data/lib/openstudio-standards/standards/Standards.AirTerminalSingleDuctVAVReheat.rb +4 -4
- data/lib/openstudio-standards/standards/Standards.BoilerHotWater.rb +2 -1
- data/lib/openstudio-standards/standards/Standards.ChillerElectricEIR.rb +16 -10
- data/lib/openstudio-standards/standards/Standards.CoilCoolingDXSingleSpeed.rb +4 -4
- data/lib/openstudio-standards/standards/Standards.CoilCoolingDXTwoSpeed.rb +1 -1
- data/lib/openstudio-standards/standards/Standards.CoilCoolingWaterToAirHeatPumpEquationFit.rb +1 -1
- data/lib/openstudio-standards/standards/Standards.CoilDX.rb +4 -4
- data/lib/openstudio-standards/standards/Standards.CoilHeatingDXMultiSpeed.rb +1 -1
- data/lib/openstudio-standards/standards/Standards.CoilHeatingDXSingleSpeed.rb +5 -5
- data/lib/openstudio-standards/standards/Standards.CoilHeatingGas.rb +1 -1
- data/lib/openstudio-standards/standards/Standards.CoilHeatingGasMultiStage.rb +1 -1
- data/lib/openstudio-standards/standards/Standards.CoilHeatingWaterToAirHeatPumpEquationFit.rb +1 -1
- data/lib/openstudio-standards/standards/Standards.Construction.rb +17 -18
- data/lib/openstudio-standards/standards/Standards.CoolingTower.rb +6 -6
- data/lib/openstudio-standards/standards/Standards.CoolingTowerSingleSpeed.rb +1 -1
- data/lib/openstudio-standards/standards/Standards.CoolingTowerTwoSpeed.rb +1 -1
- data/lib/openstudio-standards/standards/Standards.CoolingTowerVariableSpeed.rb +1 -1
- data/lib/openstudio-standards/standards/Standards.Fan.rb +6 -12
- data/lib/openstudio-standards/standards/Standards.FanVariableVolume.rb +2 -2
- data/lib/openstudio-standards/standards/Standards.FluidCooler.rb +1 -1
- data/lib/openstudio-standards/standards/Standards.HeaderedPumpsVariableSpeed.rb +1 -1
- data/lib/openstudio-standards/standards/Standards.HeatExchangerSensLat.rb +3 -3
- data/lib/openstudio-standards/standards/Standards.Model.rb +411 -261
- data/lib/openstudio-standards/standards/Standards.PlanarSurface.rb +2 -2
- data/lib/openstudio-standards/standards/Standards.PlantLoop.rb +94 -29
- data/lib/openstudio-standards/standards/Standards.Pump.rb +2 -2
- data/lib/openstudio-standards/standards/Standards.ScheduleConstant.rb +2 -2
- data/lib/openstudio-standards/standards/Standards.ScheduleRuleset.rb +14 -14
- data/lib/openstudio-standards/standards/Standards.Space.rb +37 -30
- data/lib/openstudio-standards/standards/Standards.SpaceType.rb +38 -29
- data/lib/openstudio-standards/standards/Standards.SubSurface.rb +7 -7
- data/lib/openstudio-standards/standards/Standards.Surface.rb +13 -13
- data/lib/openstudio-standards/standards/Standards.ThermalZone.rb +109 -66
- data/lib/openstudio-standards/standards/Standards.WaterHeaterMixed.rb +11 -4
- data/lib/openstudio-standards/standards/Standards.ZoneHVACComponent.rb +6 -6
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.AirLoopHVAC.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.PlantLoop.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.Space.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.Space.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.AirLoopHVAC.rb +4 -4
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.Space.rb +4 -4
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirLoopHVAC.rb +4 -4
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.CoolingTowerVariableSpeed.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.Model.rb +5 -21
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.Space.rb +4 -4
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.WaterHeaterMixed.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.ZoneHVACComponent.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.AirLoopHVAC.rb +36 -4
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.CoolingTowerVariableSpeed.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.Space.rb +4 -4
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.ZoneHVACComponent.rb +1 -1
- 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
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirLoopHVAC.rb +53 -10
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.CoolingTowerVariableSpeed.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Space.rb +6 -6
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.ZoneHVACComponent.rb +2 -2
- 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
- data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.curves.json +211 -211
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.economizers.json +14 -14
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.AirLoopHVAC.rb +4 -4
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.Model.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.PlantLoop.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.economizers.json +14 -14
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.AirLoopHVAC.rb +4 -4
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.Model.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.PlantLoop.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.AirLoopHVAC.rb +6 -6
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.CoolingTowerVariableSpeed.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.PlantLoop.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.Space.rb +4 -4
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirLoopHVAC.rb +6 -6
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.CoolingTowerVariableSpeed.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.PlantLoop.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.Space.rb +4 -4
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.AirLoopHVAC.rb +22 -28
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.AirTerminalSingleDuctParallelPIUReheat.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.AirTerminalSingleDuctVAVReheat.rb +2 -2
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.BoilerHotWater.rb +1 -74
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.ChillerElectricEIR.rb +7 -59
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilCoolingDXSingleSpeed.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilCoolingDXTwoSpeed.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilDX.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilHeatingDXSingleSpeed.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilHeatingGas.rb +1 -21
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.DesignSpecificationOutdoorAir.rb +101 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.FanConstantVolume.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.FanOnOff.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.FanVariableVolume.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.HeatExchangerSensLat.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.Model.rb +643 -526
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.PlanarSurface.rb +8 -2
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.PlantLoop.rb +17 -77
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.Space.rb +74 -16
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.SpaceType.rb +96 -44
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.Surface.rb +6 -6
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.ThermalZone.rb +18 -6
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.ZoneHVACComponent.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.rb +328 -74
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/ashrae_90_1_prm_2019.Model.rb +0 -118
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/ashrae_90_1_prm_2019.rb +2 -1
- 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
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/baseline_outdoor_air.md +35 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/set_plug_load_measures.md +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/ashrae_90_1_prm.UserData.rb +228 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_enums.rb +131 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_space.csv +1 -1
- data/lib/openstudio-standards/standards/cbes/cbes.AirLoopHVAC.rb +5 -5
- data/lib/openstudio-standards/standards/cbes/cbes.Model.rb +1 -1
- data/lib/openstudio-standards/standards/cbes/cbes.PlantLoop.rb +1 -1
- data/lib/openstudio-standards/standards/cbes/cbes.Space.rb +1 -1
- data/lib/openstudio-standards/standards/cbes/cbes_t24_2005/cbes_t24_2005.Space.rb +1 -1
- data/lib/openstudio-standards/standards/cbes/cbes_t24_2008/cbes_t24_2008.Space.rb +1 -1
- data/lib/openstudio-standards/standards/deer/deer.AirLoopHVAC.rb +109 -27
- data/lib/openstudio-standards/standards/deer/deer.Space.rb +1 -1
- data/lib/openstudio-standards/standards/deer/deer_1985/data/deer_1985.economizers.json +246 -4
- data/lib/openstudio-standards/standards/deer/deer_1996/data/deer_1996.economizers.json +246 -4
- data/lib/openstudio-standards/standards/deer/deer_2003/data/deer_2003.economizers.json +246 -4
- data/lib/openstudio-standards/standards/deer/deer_2003/deer_2003.ThermalZone.rb +18 -18
- data/lib/openstudio-standards/standards/deer/deer_2007/data/deer_2007.economizers.json +246 -4
- data/lib/openstudio-standards/standards/deer/deer_2007/deer_2007.ThermalZone.rb +18 -18
- data/lib/openstudio-standards/standards/deer/deer_2011/data/deer_2011.economizers.json +246 -4
- data/lib/openstudio-standards/standards/deer/deer_2011/deer_2011.ThermalZone.rb +18 -18
- data/lib/openstudio-standards/standards/deer/deer_2014/data/deer_2014.economizers.json +248 -6
- data/lib/openstudio-standards/standards/deer/deer_2014/deer_2014.Space.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2014/deer_2014.ThermalZone.rb +18 -18
- data/lib/openstudio-standards/standards/deer/deer_2015/data/deer_2015.economizers.json +248 -6
- data/lib/openstudio-standards/standards/deer/deer_2015/deer_2015.Space.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2015/deer_2015.ThermalZone.rb +18 -18
- data/lib/openstudio-standards/standards/deer/deer_2017/data/deer_2017.economizers.json +248 -6
- data/lib/openstudio-standards/standards/deer/deer_2017/deer_2017.Space.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2017/deer_2017.ThermalZone.rb +18 -18
- data/lib/openstudio-standards/standards/deer/deer_2020/data/deer_2020.economizers.json +248 -6
- data/lib/openstudio-standards/standards/deer/deer_2020/deer_2020.AirLoopHVAC.rb +18 -5
- data/lib/openstudio-standards/standards/deer/deer_2020/deer_2020.FanVariableVolume.rb +1 -1
- data/lib/openstudio-standards/standards/deer/deer_2020/deer_2020.Space.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2020/deer_2020.ThermalZone.rb +18 -18
- data/lib/openstudio-standards/standards/deer/deer_2025/data/deer_2025.economizers.json +248 -6
- data/lib/openstudio-standards/standards/deer/deer_2025/deer_2025.AirLoopHVAC.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2025/deer_2025.FanVariableVolume.rb +1 -1
- data/lib/openstudio-standards/standards/deer/deer_2025/deer_2025.Space.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2030/data/deer_2030.economizers.json +248 -6
- data/lib/openstudio-standards/standards/deer/deer_2030/data/deer_2030.heat_pumps.json +2 -2
- data/lib/openstudio-standards/standards/deer/deer_2030/deer_2030.AirLoopHVAC.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2030/deer_2030.FanVariableVolume.rb +1 -1
- data/lib/openstudio-standards/standards/deer/deer_2030/deer_2030.Space.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2035/data/deer_2035.economizers.json +248 -6
- data/lib/openstudio-standards/standards/deer/deer_2035/deer_2035.AirLoopHVAC.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2035/deer_2035.FanVariableVolume.rb +1 -1
- data/lib/openstudio-standards/standards/deer/deer_2035/deer_2035.Space.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2040/data/deer_2040.economizers.json +248 -6
- data/lib/openstudio-standards/standards/deer/deer_2040/deer_2040.AirLoopHVAC.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2040/deer_2040.FanVariableVolume.rb +1 -1
- data/lib/openstudio-standards/standards/deer/deer_2040/deer_2040.Space.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2045/data/deer_2045.economizers.json +260 -0
- data/lib/openstudio-standards/standards/deer/deer_2045/deer_2045.AirLoopHVAC.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2045/deer_2045.FanVariableVolume.rb +1 -1
- data/lib/openstudio-standards/standards/deer/deer_2045/deer_2045.Space.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2050/data/deer_2050.economizers.json +248 -6
- data/lib/openstudio-standards/standards/deer/deer_2050/deer_2050.AirLoopHVAC.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2050/deer_2050.FanVariableVolume.rb +1 -1
- data/lib/openstudio-standards/standards/deer/deer_2050/deer_2050.Space.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2055/data/deer_2055.economizers.json +248 -6
- data/lib/openstudio-standards/standards/deer/deer_2055/deer_2055.AirLoopHVAC.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2055/deer_2055.FanVariableVolume.rb +1 -1
- data/lib/openstudio-standards/standards/deer/deer_2055/deer_2055.Space.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2060/data/deer_2060.economizers.json +248 -6
- data/lib/openstudio-standards/standards/deer/deer_2060/deer_2060.AirLoopHVAC.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2060/deer_2060.FanVariableVolume.rb +1 -1
- data/lib/openstudio-standards/standards/deer/deer_2060/deer_2060.Space.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2065/data/deer_2065.economizers.json +248 -6
- data/lib/openstudio-standards/standards/deer/deer_2065/deer_2065.AirLoopHVAC.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2065/deer_2065.FanVariableVolume.rb +1 -1
- data/lib/openstudio-standards/standards/deer/deer_2065/deer_2065.Space.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2070/data/deer_2070.economizers.json +248 -6
- data/lib/openstudio-standards/standards/deer/deer_2070/deer_2070.AirLoopHVAC.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2070/deer_2070.FanVariableVolume.rb +1 -1
- data/lib/openstudio-standards/standards/deer/deer_2070/deer_2070.Space.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2075/data/deer_2075.economizers.json +248 -6
- data/lib/openstudio-standards/standards/deer/deer_2075/deer_2075.AirLoopHVAC.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2075/deer_2075.FanVariableVolume.rb +1 -1
- data/lib/openstudio-standards/standards/deer/deer_2075/deer_2075.Space.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_pre_1975/data/deer_pre_1975.economizers.json +246 -4
- data/lib/openstudio-standards/standards/necb/BTAP1980TO2010/data/space_types.json +447 -223
- data/lib/openstudio-standards/standards/necb/BTAPPRE1980/building_envelope.rb +1 -1
- data/lib/openstudio-standards/standards/necb/BTAPPRE1980/data/space_types.json +447 -223
- data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_systems.rb +5 -2
- data/lib/openstudio-standards/standards/necb/ECMS/data/chiller_types.json +25 -0
- data/lib/openstudio-standards/standards/necb/ECMS/data/chillers.json +44 -0
- data/lib/openstudio-standards/standards/necb/ECMS/data/curves.json +225 -0
- data/lib/openstudio-standards/standards/necb/ECMS/ecms.rb +2 -2
- data/lib/openstudio-standards/standards/necb/ECMS/hvac_systems.rb +193 -73
- data/lib/openstudio-standards/standards/necb/ECMS/pv_ground.rb +1 -1
- data/lib/openstudio-standards/standards/necb/NECB2011/autozone.rb +10 -4
- data/lib/openstudio-standards/standards/necb/NECB2011/beps_compliance_path.rb +7 -7
- data/lib/openstudio-standards/standards/necb/NECB2011/building_envelope.rb +4 -5
- data/lib/openstudio-standards/standards/necb/NECB2011/data/chiller_types.json +32 -0
- data/lib/openstudio-standards/standards/necb/NECB2011/data/chillers.json +1 -1
- data/lib/openstudio-standards/standards/necb/NECB2011/data/constants.json +36 -0
- data/lib/openstudio-standards/standards/necb/NECB2011/data/fuel_type_sets.json +7 -7
- data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/NorthernEducation.osm +47587 -0
- data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/NorthernHealthCare.osm +49764 -0
- data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/Warehouse.osm +283 -297
- data/lib/openstudio-standards/standards/necb/NECB2011/data/space_type_unit_definitions.txt +2 -1
- data/lib/openstudio-standards/standards/necb/NECB2011/data/space_types.json +447 -223
- data/lib/openstudio-standards/standards/necb/NECB2011/data/standards_data.rb +3 -3
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_1_multi_speed.rb +1 -1
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_systems.rb +49 -27
- data/lib/openstudio-standards/standards/necb/NECB2011/necb_2011.rb +400 -202
- data/lib/openstudio-standards/standards/necb/NECB2011/service_water_heating.rb +4 -4
- data/lib/openstudio-standards/standards/necb/NECB2015/data/space_types.json +637 -318
- data/lib/openstudio-standards/standards/necb/NECB2015/hvac_systems.rb +18 -1
- data/lib/openstudio-standards/standards/necb/NECB2015/necb_2015.rb +3 -3
- data/lib/openstudio-standards/standards/necb/NECB2017/data/space_types.json +637 -318
- data/lib/openstudio-standards/standards/necb/NECB2017/hvac_systems.rb +1 -1
- data/lib/openstudio-standards/standards/necb/NECB2017/necb_2017.rb +3 -3
- data/lib/openstudio-standards/standards/necb/NECB2020/building_envelope.rb +1 -1
- data/lib/openstudio-standards/standards/necb/NECB2020/data/space_types.json +615 -307
- data/lib/openstudio-standards/standards/necb/NECB2020/service_water_heating.rb +4 -4
- data/lib/openstudio-standards/standards/necb/common/btap_data.rb +10 -5
- data/lib/openstudio-standards/standards/necb/common/btap_datapoint.rb +1 -1
- data/lib/openstudio-standards/utilities/assertion.rb +128 -0
- data/lib/openstudio-standards/utilities/logging.rb +2 -3
- data/lib/openstudio-standards/utilities/object_info.rb +39 -18
- data/lib/openstudio-standards/utilities/schedule_translator.rb +8 -6
- data/lib/openstudio-standards/utilities/simulation.rb +24 -11
- data/lib/openstudio-standards/utilities/sqlfile.rb +10 -5
- data/lib/openstudio-standards/version.rb +1 -1
- data/lib/openstudio-standards/weather/Weather.Model.rb +8 -9
- data/lib/openstudio-standards/weather/Weather.stat_file.rb +3 -3
- data/lib/openstudio-standards/weather/information.rb +35 -0
- data/lib/openstudio-standards.rb +69 -5
- metadata +52 -16
- data/data/standards/OpenStudio_Standards-deer-ALL-comstock(space_types).xlsx +0 -0
- data/lib/openstudio-standards/hvac_sizing/Siz.AirLoopHVAC.rb +0 -59
- data/lib/openstudio-standards/hvac_sizing/Siz.CoilCoolingWater.rb +0 -13
- data/lib/openstudio-standards/hvac_sizing/Siz.HVACComponent.rb +0 -36
- data/lib/openstudio-standards/hvac_sizing/Siz.HeatingCoolingFuels.rb +0 -898
- data/lib/openstudio-standards/hvac_sizing/Siz.Model.rb +0 -126
- data/lib/openstudio-standards/hvac_sizing/Siz.ThermalZone.rb +0 -356
- data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.Model.rb +0 -35
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoolingTower.rb +0 -110
- 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
|
|
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
|
|
197
|
-
# - TBD red-flags a failed attempt at NECB2017 or NECB2020 compliance
|
|
198
|
-
# - TBD keeps iteration #4 Uo + PSI combo, then derates
|
|
199
|
-
#
|
|
200
|
-
|
|
201
|
-
#
|
|
202
|
-
#
|
|
203
|
-
#
|
|
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.
|
|
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
|
|
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.
|
|
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
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
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
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
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
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
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
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
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
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
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
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
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
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
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
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
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
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
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
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
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
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
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
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
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
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
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
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
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
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
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
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
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
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
|
|
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
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
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
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
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
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
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
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
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
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
|
|
1064
|
-
|
|
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
|
-
|
|
1068
|
-
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
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
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
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
|
|
1101
|
-
tp =
|
|
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
|
|
1176
|
-
# @param
|
|
1177
|
-
# @param
|
|
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(
|
|
1181
|
-
return FLOOR if
|
|
1182
|
-
return ROOFS if
|
|
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?(
|
|
1186
|
-
return id if construction[:sptypes].key?(
|
|
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
|
-
#
|
|
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
|
|
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
|
|
1293
|
-
initial
|
|
1294
|
-
|
|
1295
|
-
|
|
1296
|
-
perform
|
|
1297
|
-
quality
|
|
1298
|
-
quality
|
|
1299
|
-
combo
|
|
1300
|
-
args
|
|
1301
|
-
|
|
1302
|
-
#
|
|
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
|
|
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
|
|
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
|
|
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.
|
|
1351
|
-
|
|
1352
|
-
|
|
1353
|
-
|
|
1354
|
-
|
|
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
|
-
|
|
1388
|
-
|
|
1389
|
-
|
|
1390
|
-
|
|
1391
|
-
|
|
1392
|
-
|
|
1393
|
-
|
|
1394
|
-
|
|
1395
|
-
|
|
1396
|
-
|
|
1397
|
-
|
|
1398
|
-
|
|
1399
|
-
|
|
1400
|
-
|
|
1401
|
-
|
|
1402
|
-
|
|
1403
|
-
|
|
1404
|
-
|
|
1405
|
-
|
|
1406
|
-
|
|
1407
|
-
|
|
1408
|
-
|
|
1409
|
-
|
|
1410
|
-
|
|
1411
|
-
|
|
1412
|
-
|
|
1413
|
-
|
|
1414
|
-
|
|
1415
|
-
|
|
1416
|
-
|
|
1417
|
-
|
|
1418
|
-
|
|
1419
|
-
|
|
1420
|
-
|
|
1421
|
-
|
|
1422
|
-
|
|
1423
|
-
|
|
1424
|
-
|
|
1425
|
-
|
|
1426
|
-
|
|
1427
|
-
|
|
1428
|
-
|
|
1429
|
-
|
|
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
|
-
|
|
1453
|
-
|
|
1454
|
-
|
|
1455
|
-
|
|
1456
|
-
|
|
1457
|
-
|
|
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
|
-
|
|
1463
|
-
|
|
1464
|
-
|
|
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
|
-
|
|
1508
|
-
|
|
1509
|
-
|
|
1510
|
-
|
|
1511
|
-
|
|
1512
|
-
|
|
1513
|
-
|
|
1514
|
-
|
|
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
|
-
|
|
1526
|
-
|
|
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
|
|
1531
|
-
@model[:
|
|
1532
|
-
@model[:
|
|
1533
|
-
@model[:
|
|
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
|
-
|
|
1544
|
-
|
|
1545
|
-
|
|
1515
|
+
# Run "process" TBD one last time, on "model" (not cloned "mdl").
|
|
1516
|
+
TBD.clean!
|
|
1517
|
+
res = TBD.process(model, args)
|
|
1546
1518
|
|
|
1547
|
-
|
|
1548
|
-
|
|
1549
|
-
|
|
1550
|
-
|
|
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
|
-
|
|
1553
|
-
|
|
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 [
|
|
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 [
|
|
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
|
|
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
|
|
1758
|
-
|
|
1759
|
-
|
|
1760
|
-
typ
|
|
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] = {}
|
|
1770
|
-
@model[:spaces][space][:sptype] = typ
|
|
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 ] = {}
|
|
1774
|
-
@model[:sptypes][typ ][:sptype] =
|
|
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
|
-
#
|
|
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 =
|
|
1763
|
+
uo = argh[stypes][:uo]
|
|
1801
1764
|
ok = uo.is_a?(Numeric) && uo.between?(UMIN, UMAX)
|
|
1802
|
-
|
|
1803
|
-
next if ok
|
|
1765
|
+
next if ok
|
|
1804
1766
|
|
|
1805
|
-
|
|
1806
|
-
|
|
1807
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 |
|
|
1866
|
-
next unless
|
|
1821
|
+
@model[:sptypes].values.each do |sptype|
|
|
1822
|
+
next unless sptype.key?(combo)
|
|
1867
1823
|
|
|
1868
|
-
psi =
|
|
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 |
|
|
1882
|
-
next unless
|
|
1883
|
-
next unless
|
|
1884
|
-
next if
|
|
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
|
-
|
|
1842
|
+
sptypes[ sptype[:sptype] ] = { psi: sptype[combo][:id] }
|
|
1887
1843
|
end
|
|
1888
1844
|
|
|
1889
|
-
|
|
1845
|
+
sptypes.each do |id, sptype|
|
|
1890
1846
|
input[:spacetypes] = [] unless input.key?(:spacetypes)
|
|
1891
|
-
input[:spacetypes] << { id: id, 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 [
|
|
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 [
|
|
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?(:
|
|
1938
|
-
return false unless @model.key?(:
|
|
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
|
-
|
|
1897
|
+
argh = @model[:argh]
|
|
1941
1898
|
|
|
1942
|
-
#
|
|
1899
|
+
# Uprating. Report first on surface types (compliant or not).
|
|
1943
1900
|
[:walls, :floors, :roofs].each do |stypes|
|
|
1944
|
-
|
|
1901
|
+
next unless @model[:comply].key?(stypes)
|
|
1945
1902
|
|
|
1946
|
-
|
|
1947
|
-
|
|
1948
|
-
|
|
1949
|
-
|
|
1950
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1967
|
-
|
|
1968
|
-
|
|
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
|
-
|
|
1932
|
+
id = lc.nameString
|
|
1933
|
+
next unless id.include?(" c tbd")
|
|
1979
1934
|
|
|
1980
|
-
rsi
|
|
1981
|
-
|
|
1982
|
-
|
|
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
|
|
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
|
-
#
|
|
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
|
|
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
|
|
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
|
|
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
|
|
2083
|
-
# should be limited to
|
|
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),
|