openstudio-standards 0.4.0 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/LICENSE.md +33 -0
- 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 +2170 -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 +54 -18
- data/License.txt +0 -65
- 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),
|