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
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'csv'
|
2
|
+
require 'date'
|
2
3
|
|
3
4
|
class Standard
|
4
5
|
attr_accessor :space_multiplier_map
|
@@ -18,40 +19,37 @@ class Standard
|
|
18
19
|
#
|
19
20
|
# @note Per 90.1, the Performance Rating Method "does NOT offer an alternative compliance path for minimum standard compliance."
|
20
21
|
# This means you can't use this method for code compliance to get a permit.
|
21
|
-
# @param
|
22
|
+
# @param model [OpenStudio::Model::Model] User specified OpenStudio model
|
22
23
|
# @param climate_zone [String] the climate zone
|
23
24
|
# @param hvac_building_type [String] the building type for baseline HVAC system determination (90.1-2016 and onward)
|
24
25
|
# @param wwr_building_type [String] the building type for baseline WWR determination (90.1-2016 and onward)
|
25
26
|
# @param swh_building_type [String] the building type for baseline SWH determination (90.1-2016 and onward)
|
26
27
|
# @param output_dir [String] the directory where the PRM generations will be performed
|
27
|
-
# @param run_all_orients [Boolean] indicate weather a baseline model should be created for all 4 orientations: same as user model, +90 deg, +180 deg, +270 deg
|
28
28
|
# @param debug [Boolean] If true, will report out more detailed debugging output
|
29
|
-
# @return [
|
30
|
-
|
31
|
-
# Method used for 90.1-2016 and onward
|
29
|
+
# @return [Boolean] returns true if successful, false if not
|
32
30
|
def model_create_prm_stable_baseline_building(model, climate_zone, hvac_building_type, wwr_building_type, swh_building_type, output_dir = Dir.pwd, unmet_load_hours_check = true, debug = false)
|
33
|
-
model_create_prm_any_baseline_building(model, '', climate_zone, hvac_building_type, wwr_building_type, swh_building_type, true, false, output_dir, true, unmet_load_hours_check, debug)
|
31
|
+
model_create_prm_any_baseline_building(model, '', climate_zone, hvac_building_type, wwr_building_type, swh_building_type, true, true, false, output_dir, true, unmet_load_hours_check, debug)
|
34
32
|
end
|
35
33
|
|
36
34
|
# Creates a Performance Rating Method (aka Appendix G aka LEED) baseline building model
|
37
35
|
# Method used for 90.1-2013 and prior
|
38
|
-
# @param
|
36
|
+
# @param model [OpenStudio::Model::Model] User specified OpenStudio model
|
39
37
|
# @param building_type [String] the building type
|
40
38
|
# @param climate_zone [String] the climate zone
|
41
39
|
# @param custom [String] the custom logic that will be applied during baseline creation. Valid choices are 'Xcel Energy CO EDA' or '90.1-2007 with addenda dn'.
|
42
40
|
# If nothing is specified, no custom logic will be applied; the process will follow the template logic explicitly.
|
43
41
|
# @param sizing_run_dir [String] the directory where the sizing runs will be performed
|
44
|
-
# @param debug [Boolean]
|
42
|
+
# @param debug [Boolean] if true, will report out more detailed debugging output
|
45
43
|
def model_create_prm_baseline_building(model, building_type, climate_zone, custom = nil, sizing_run_dir = Dir.pwd, debug = false)
|
46
|
-
model_create_prm_any_baseline_building(model, building_type, climate_zone, 'All others', 'All others', 'All others', false, custom, sizing_run_dir, false, false, debug)
|
44
|
+
model_create_prm_any_baseline_building(model, building_type, climate_zone, 'All others', 'All others', 'All others', false, false, custom, sizing_run_dir, false, false, debug)
|
47
45
|
end
|
48
46
|
|
49
|
-
# Creates a Performance Rating Method (aka Appendix G
|
50
|
-
# based on the inputs currently in the model.
|
47
|
+
# Creates a Performance Rating Method (aka 90.1-Appendix G) baseline building model
|
48
|
+
# based on the inputs currently in the user model.
|
51
49
|
#
|
52
50
|
# @note Per 90.1, the Performance Rating Method "does NOT offer an alternative compliance path for minimum standard compliance."
|
53
51
|
# This means you can't use this method for code compliance to get a permit.
|
54
|
-
# @param user_model [OpenStudio::
|
52
|
+
# @param user_model [OpenStudio::Model::Model] User specified OpenStudio model
|
55
53
|
# @param building_type [String] the building type
|
56
54
|
# @param climate_zone [String] the climate zone
|
57
55
|
# @param hvac_building_type [String] the building type for baseline HVAC system determination (90.1-2016 and onward)
|
@@ -63,27 +61,69 @@ class Standard
|
|
63
61
|
# @param sizing_run_dir [String] the directory where the sizing runs will be performed
|
64
62
|
# @param run_all_orients [Boolean] indicate weather a baseline model should be created for all 4 orientations: same as user model, +90 deg, +180 deg, +270 deg
|
65
63
|
# @param debug [Boolean] If true, will report out more detailed debugging output
|
66
|
-
# @return [
|
67
|
-
def model_create_prm_any_baseline_building(user_model, building_type, climate_zone, hvac_building_type = 'All others', wwr_building_type = 'All others', swh_building_type = 'All others', model_deep_copy = false, custom = nil, sizing_run_dir = Dir.pwd, run_all_orients = false, unmet_load_hours_check = true, debug = false)
|
64
|
+
# @return [Boolean] returns true if successful, false if not
|
65
|
+
def model_create_prm_any_baseline_building(user_model, building_type, climate_zone, hvac_building_type = 'All others', wwr_building_type = 'All others', swh_building_type = 'All others', model_deep_copy = false, create_proposed_model = false, custom = nil, sizing_run_dir = Dir.pwd, run_all_orients = false, unmet_load_hours_check = true, debug = false)
|
66
|
+
if create_proposed_model
|
67
|
+
# Perform a user model design day run only to make sure
|
68
|
+
# that the user model is valid, i.e. can run without major
|
69
|
+
# errors
|
70
|
+
if !model_run_sizing_run(user_model, "#{sizing_run_dir}/USER-SR")
|
71
|
+
OpenStudio.logFree(OpenStudio::Warn, 'prm.log',
|
72
|
+
"The user model is not a valid OpenStudio model. Baseline and proposed model(s) won't be created.")
|
73
|
+
prm_raise(false,
|
74
|
+
sizing_run_dir,
|
75
|
+
"The user model is not a valid OpenStudio model. Baseline and proposed model(s) won't be created.")
|
76
|
+
end
|
77
|
+
|
78
|
+
# Check if proposed HVAC system is autosized
|
79
|
+
if model_is_hvac_autosized(user_model)
|
80
|
+
OpenStudio.logFree(OpenStudio::Warn, 'prm.log',
|
81
|
+
"The user model's HVAC system is partly autosized.")
|
82
|
+
end
|
83
|
+
|
84
|
+
# Generate proposed model from the user-provided model
|
85
|
+
proposed_model = model_create_prm_proposed_building(user_model)
|
86
|
+
end
|
87
|
+
|
68
88
|
# Check proposed model unmet load hours
|
69
89
|
if unmet_load_hours_check
|
70
|
-
# Run
|
71
|
-
if model_run_simulation_and_log_errors(
|
72
|
-
umlh = model_get_unmet_load_hours(
|
90
|
+
# Run user model; need annual simulation to get unmet load hours
|
91
|
+
if model_run_simulation_and_log_errors(proposed_model, run_dir = "#{sizing_run_dir}/PROP")
|
92
|
+
umlh = model_get_unmet_load_hours(proposed_model)
|
73
93
|
if umlh > 300
|
74
|
-
OpenStudio.logFree(OpenStudio::
|
75
|
-
|
94
|
+
OpenStudio.logFree(OpenStudio::Warn, 'prm.log',
|
95
|
+
"Proposed model unmet load hours (#{umlh}) exceed 300. Baseline model(s) won't be created.")
|
96
|
+
prm_raise(false,
|
97
|
+
sizing_run_dir,
|
98
|
+
"Proposed model unmet load hours exceed 300. Baseline model(s) won't be created.")
|
76
99
|
end
|
77
100
|
else
|
78
|
-
OpenStudio.logFree(OpenStudio::Error, 'prm.log',
|
79
|
-
|
101
|
+
OpenStudio.logFree(OpenStudio::Error, 'prm.log',
|
102
|
+
'Simulation failed. Check the model to make sure no severe errors.')
|
103
|
+
prm_raise(false,
|
104
|
+
sizing_run_dir,
|
105
|
+
'Simulation on proposed model failed. Baseline generation is stopped.')
|
80
106
|
end
|
81
107
|
end
|
108
|
+
if create_proposed_model
|
109
|
+
# Make the run directory if it doesn't exist
|
110
|
+
unless Dir.exist?(sizing_run_dir)
|
111
|
+
FileUtils.mkdir_p(sizing_run_dir)
|
112
|
+
end
|
113
|
+
# Save proposed model
|
114
|
+
proposed_model.save(OpenStudio::Path.new("#{sizing_run_dir}/proposed_final.osm"), true)
|
115
|
+
forward_translator = OpenStudio::EnergyPlus::ForwardTranslator.new
|
116
|
+
idf = forward_translator.translateModel(proposed_model)
|
117
|
+
idf_path = OpenStudio::Path.new("#{sizing_run_dir}/proposed_final.idf")
|
118
|
+
idf.save(idf_path, true)
|
119
|
+
end
|
82
120
|
|
83
121
|
# User data process
|
84
122
|
# bldg_type_hvac_zone_hash could be an empty hash if all zones in the models are unconditioned
|
123
|
+
# TODO - move this portion to the top of the function
|
85
124
|
bldg_type_hvac_zone_hash = {}
|
86
|
-
handle_user_input_data(user_model, climate_zone, hvac_building_type, wwr_building_type, swh_building_type, bldg_type_hvac_zone_hash)
|
125
|
+
handle_user_input_data(user_model, climate_zone, sizing_run_dir, hvac_building_type, wwr_building_type, swh_building_type, bldg_type_hvac_zone_hash)
|
126
|
+
|
87
127
|
# Define different orientation from original orientation
|
88
128
|
# for each individual baseline models
|
89
129
|
# Need to run proposed model sizing simulation if no sql data is available
|
@@ -175,17 +215,26 @@ class Standard
|
|
175
215
|
# For PRM, it only applies lights for now.
|
176
216
|
space_type_apply_internal_loads(space_type, set_people, set_lights, set_electric_equipment, set_gas_equipment, set_ventilation, set_infiltration)
|
177
217
|
end
|
218
|
+
|
178
219
|
# Modify the lighting schedule to handle lighting occupancy sensors
|
179
220
|
# Modify the upper limit value of fractional schedule to avoid the fatal error caused by schedule value higher than 1
|
180
221
|
space_type_light_sch_change(model)
|
181
222
|
|
223
|
+
# Modify electric equipment computer room schedule
|
224
|
+
model.getSpaces.sort.each do |space|
|
225
|
+
space_add_prm_computer_room_equipment_schedule(space)
|
226
|
+
end
|
227
|
+
|
182
228
|
model_apply_baseline_exterior_lighting(model)
|
183
229
|
|
184
230
|
# Modify the elevator motor peak power
|
185
231
|
model_add_prm_elevators(model)
|
186
232
|
|
187
233
|
# Calculate infiltration as per 90.1 PRM rules
|
188
|
-
|
234
|
+
model_apply_standard_infiltration(model)
|
235
|
+
|
236
|
+
# Apply user outdoor air specs as per 90.1 PRM rules exceptions
|
237
|
+
model_apply_userdata_outdoor_air(model)
|
189
238
|
|
190
239
|
# If any of the lights are missing schedules, assign an always-off schedule to those lights.
|
191
240
|
# This is assumed to be the user's intent in the proposed model.
|
@@ -256,11 +305,7 @@ class Standard
|
|
256
305
|
end
|
257
306
|
|
258
307
|
# Compute and marke DCV related information before deleting proposed model HVAC systems
|
259
|
-
|
260
|
-
model_add_dcv_user_exception_properties(model)
|
261
|
-
model_add_dcv_requirement_properties(model)
|
262
|
-
model_add_apxg_dcv_properties(model)
|
263
|
-
model_raise_user_model_dcv_errors(model)
|
308
|
+
model_evaluate_dcv_requirements(model)
|
264
309
|
|
265
310
|
# Remove all HVAC from model, excluding service water heating
|
266
311
|
model_remove_prm_hvac(model)
|
@@ -442,7 +487,7 @@ class Standard
|
|
442
487
|
# Set Solar Distribution to MinimalShadowing... problem is when you also have detached shading such as surrounding buildings etc
|
443
488
|
# It won't be taken into account, while it should: only self shading from the building itself should be turned off but to my knowledge there isn't a way to do this in E+
|
444
489
|
|
445
|
-
model_status = degs > 0 ? "
|
490
|
+
model_status = degs > 0 ? "baseline_final_#{degs}" : 'baseline_final'
|
446
491
|
model.save(OpenStudio::Path.new("#{sizing_run_dir}/#{model_status}.osm"), true)
|
447
492
|
|
448
493
|
# Translate to IDF and save for debugging
|
@@ -521,12 +566,138 @@ class Standard
|
|
521
566
|
return true
|
522
567
|
end
|
523
568
|
|
569
|
+
# Creates a Performance Rating Method (aka 90.1-Appendix G) proposed building model
|
570
|
+
# based on the inputs currently in the user model.
|
571
|
+
#
|
572
|
+
# @param user_model [OpenStudio::model::Model] User specified OpenStudio model
|
573
|
+
# @return [OpenStudio::model::Model] returns the proposed building model corresponding to a user model
|
574
|
+
def model_create_prm_proposed_building(user_model)
|
575
|
+
# Create copy of the user model
|
576
|
+
proposed_model = BTAP::FileIO.deep_copy(user_model)
|
577
|
+
|
578
|
+
# Get user building level data
|
579
|
+
building_name = proposed_model.building.get.name.get
|
580
|
+
user_buildings = @standards_data.key?('userdata_building') ? @standards_data['userdata_building'] : nil
|
581
|
+
|
582
|
+
# If needed, modify user model infiltration
|
583
|
+
if user_buildings
|
584
|
+
user_building_index = user_buildings.index { |user_building| building_name.include? user_building['name'] }
|
585
|
+
# TODO: Move the user data processing section
|
586
|
+
infiltration_modeled_from_field_verification_results = 'false'
|
587
|
+
if user_building_index && user_buildings[user_building_index]['infiltration_modeled_from_field_verification_results']
|
588
|
+
infiltration_modeled_from_field_verification_results = user_buildings[user_building_index]['infiltration_modeled_from_field_verification_results'].to_s.downcase
|
589
|
+
end
|
590
|
+
|
591
|
+
# Calculate total infiltration flow rate per envelope area
|
592
|
+
building_envelope_area_m2 = model_building_envelope_area(proposed_model)
|
593
|
+
curr_tot_infil_m3_per_s_per_envelope_area = model_current_building_envelope_infiltration_at_75pa(proposed_model, building_envelope_area_m2)
|
594
|
+
curr_tot_infil_cfm_per_envelope_area = OpenStudio.convert(curr_tot_infil_m3_per_s_per_envelope_area, 'm^3/s*m^2', 'cfm/ft^2').get
|
595
|
+
|
596
|
+
# Warn users if the infiltration modeling in the user/proposed model is not based on field verification
|
597
|
+
# If not modeled based on field verification, it should be modeled as 0.6 cfm/ft2
|
598
|
+
unless infiltration_modeled_from_field_verification_results.casecmp('true')
|
599
|
+
if curr_tot_infil_cfm_per_envelope_area < 0.6
|
600
|
+
OpenStudio.logFree(OpenStudio::Info, 'prm.log', "The user model's I_75Pa is estimated to be #{curr_tot_infil_cfm_per_envelope_area} m3/s per m2 of total building envelope")
|
601
|
+
end
|
602
|
+
end
|
603
|
+
|
604
|
+
# Modify model to follow the PRM infiltration modeling method
|
605
|
+
model_apply_standard_infiltration(proposed_model, curr_tot_infil_cfm_per_envelope_area)
|
606
|
+
end
|
607
|
+
|
608
|
+
# If needed, remove all non-adiabatic pipes of SWH loops
|
609
|
+
proposed_model.getPlantLoops.sort.each do |plant_loop|
|
610
|
+
# Skip non service water heating loops
|
611
|
+
next unless plant_loop_swh_loop?(plant_loop)
|
612
|
+
|
613
|
+
plant_loop_adiabatic_pipes_only(plant_loop)
|
614
|
+
end
|
615
|
+
|
616
|
+
# TODO: Once data refactoring has been completed lookup values from the database;
|
617
|
+
# For now, hard-code LPD for selected spaces. Current Standards Space Type
|
618
|
+
# of OS:SpaceType is the PRM interior lighting space type. These values are
|
619
|
+
# from Table 9.6.1 as required by Section G3.1.6.e.
|
620
|
+
proposed_lpd_residential_spaces = {
|
621
|
+
'dormitory - living quarters' => 0.5, # "primary_space_type": "Dormitory—Living Quarters",
|
622
|
+
'apartment - hardwired' => 0.6, # "primary_space_type": "Dwelling Unit"
|
623
|
+
'guest room' => 0.41 # "primary_space_type": "Guest Room",
|
624
|
+
}
|
625
|
+
|
626
|
+
# Make proposed model space related adjustments
|
627
|
+
proposed_model.getSpaces.each do |space|
|
628
|
+
# If needed, modify computer equipment schedule
|
629
|
+
# Section G3.1.3.16
|
630
|
+
space_add_prm_computer_room_equipment_schedule(space)
|
631
|
+
|
632
|
+
# If needed, modify lighting power denstities in residential spaces/zones
|
633
|
+
# Section G3.1.6.e
|
634
|
+
standard_space_type = prm_get_optional_handler(space, @sizing_run_dir, 'spaceType', 'standardsSpaceType').downcase
|
635
|
+
user_spaces = @standards_data.key?('userdata_space') ? @standards_data['userdata_space'] : nil
|
636
|
+
if ['dormitory - living quarters', 'apartment - hardwired', 'guest room'].include?(standard_space_type)
|
637
|
+
user_spaces.each do |user_data|
|
638
|
+
if user_data['name'].to_s == space.name.to_s && user_data['has_residential_exception'].to_s.downcase != 'yes'
|
639
|
+
# Get LPDs
|
640
|
+
lpd_w_per_m2 = space.lightingPowerPerFloorArea
|
641
|
+
ref_space_lpd_per_ft2 = proposed_lpd_residential_spaces[standard_space_type]
|
642
|
+
ref_space_lpd_per_m2 = OpenStudio.convert(ref_space_lpd_per_ft2, 'W/ft^2', 'W/m^2').get
|
643
|
+
# Set new LPD
|
644
|
+
space.setLightingPowerPerFloorArea([lpd_w_per_m2, ref_space_lpd_per_m2].max)
|
645
|
+
end
|
646
|
+
end
|
647
|
+
end
|
648
|
+
end
|
649
|
+
|
650
|
+
return proposed_model
|
651
|
+
end
|
652
|
+
|
653
|
+
# Determine whether or not the HVAC system in a model is autosized
|
654
|
+
#
|
655
|
+
# As it is not realistic expectation to have all autosizable
|
656
|
+
# fields hard input, the method relies on autosizable field
|
657
|
+
# of prime movers (fans, pumps) and heating/cooling devices
|
658
|
+
# in the models (boilers, chillers, coils)
|
659
|
+
#
|
660
|
+
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
661
|
+
# @return [Boolean] returns true if the HVAC system is likely autosized, false otherwise
|
662
|
+
def model_is_hvac_autosized(model)
|
663
|
+
is_hvac_autosized = false
|
664
|
+
model.modelObjects.each do |obj|
|
665
|
+
obj_type = obj.iddObjectType.valueName.to_s.downcase
|
666
|
+
|
667
|
+
# Check if the object needs to be checked for autosizing
|
668
|
+
obj_to_be_checked_for_autosizing = false
|
669
|
+
if obj_type.include?('chiller') || obj_type.include?('boiler') || obj_type.include?('coil') || obj_type.include?('fan') || obj_type.include?('pump') || obj_type.include?('waterheater')
|
670
|
+
if !obj_type.include?('controller')
|
671
|
+
obj_to_be_checked_for_autosizing = true
|
672
|
+
end
|
673
|
+
end
|
674
|
+
|
675
|
+
# Check for autosizing
|
676
|
+
if obj_to_be_checked_for_autosizing
|
677
|
+
casted_obj = model_cast_model_object(obj)
|
678
|
+
|
679
|
+
next if casted_obj.nil?
|
680
|
+
|
681
|
+
casted_obj.methods.each do |method|
|
682
|
+
if method.to_s.include?('is') && method.to_s.include?('Autosized')
|
683
|
+
if casted_obj.public_send(method) == true
|
684
|
+
is_hvac_autosized = true
|
685
|
+
OpenStudio.logFree(OpenStudio::Info, 'prm.log', "The #{method.to_s.sub('is', '').sub('Autosized', '').sub(':', '')} field of the #{obj_type} named #{casted_obj.name} is autosized. It should be hard sized.")
|
686
|
+
end
|
687
|
+
end
|
688
|
+
end
|
689
|
+
end
|
690
|
+
end
|
691
|
+
|
692
|
+
return is_hvac_autosized
|
693
|
+
end
|
694
|
+
|
524
695
|
# Determine if there needs to be a sizing run after constructions are added
|
525
696
|
# so that EnergyPlus can calculate the VLTs of layer-by-layer glazing constructions.
|
526
697
|
# These VLT values are needed for the daylighting controls logic for some templates.
|
527
698
|
#
|
528
699
|
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
529
|
-
# @return [
|
700
|
+
# @return [Boolean] returns true if required, false if not
|
530
701
|
def model_create_prm_baseline_building_requires_vlt_sizing_run(model)
|
531
702
|
return false # Not required for most templates
|
532
703
|
end
|
@@ -596,7 +767,7 @@ class Standard
|
|
596
767
|
# Add design day schedule objects for space loads,
|
597
768
|
# not used for 2013 and earlier
|
598
769
|
# @author Xuechen (Jerry) Lei, PNNL
|
599
|
-
# @param model [OpenStudio::
|
770
|
+
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
600
771
|
#
|
601
772
|
def model_apply_prm_baseline_sizing_schedule(model)
|
602
773
|
return true
|
@@ -670,8 +841,14 @@ class Standard
|
|
670
841
|
# Define the minimum area for the
|
671
842
|
# exception that allows a different
|
672
843
|
# system type in part of the building.
|
673
|
-
|
674
|
-
|
844
|
+
if custom == 'Xcel Energy CO EDA'
|
845
|
+
# Customization - Xcel EDA Program Manual 2014
|
846
|
+
# 3.2.1 Mechanical System Selection ii
|
847
|
+
exception_min_area_ft2 = 5000
|
848
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.Standards.Model', "Customization; per Xcel EDA Program Manual 2014 3.2.1 Mechanical System Selection ii, minimum area for non-predominant conditions reduced to #{exception_min_area_ft2} ft2.")
|
849
|
+
else
|
850
|
+
exception_min_area_ft2 = 20_000
|
851
|
+
end
|
675
852
|
|
676
853
|
# Get occupancy type, fuel type, and area information for all zones,
|
677
854
|
# excluding unconditioned zones.
|
@@ -865,16 +1042,22 @@ class Standard
|
|
865
1042
|
# fuels in the entire baseline building are changed for the purposes of HVAC system assignment
|
866
1043
|
all_htg_fuels = []
|
867
1044
|
all_clg_fuels = []
|
1045
|
+
|
1046
|
+
# error if HVACComponent heating fuels method is not available
|
1047
|
+
if model.version < OpenStudio::VersionString.new('3.6.0')
|
1048
|
+
OpenStudio.logFree(OpenStudio::Error, 'openstudio.Standards.Model', 'Required HVACComponent methods .heatingFuelTypes and .coolingFuelTypes are not available in pre-OpenStudio 3.6.0 versions. Use a more recent version of OpenStudio.')
|
1049
|
+
end
|
1050
|
+
|
868
1051
|
model.getThermalZones.sort.each do |zone|
|
869
|
-
all_htg_fuels += zone.
|
870
|
-
all_clg_fuels += zone.
|
1052
|
+
all_htg_fuels += zone.heatingFuelTypes.map(&:valueName)
|
1053
|
+
all_clg_fuels += zone.coolingFuelTypes.map(&:valueName)
|
871
1054
|
end
|
872
1055
|
|
873
1056
|
purchased_heating = false
|
874
1057
|
purchased_cooling = false
|
875
1058
|
|
876
1059
|
# Purchased heating
|
877
|
-
if all_htg_fuels.include?('DistrictHeating')
|
1060
|
+
if all_htg_fuels.include?('DistrictHeating') || all_htg_fuels.include?('DistrictHeatingWater') || all_htg_fuels.include?('DistrictHeatingSteam')
|
878
1061
|
purchased_heating = true
|
879
1062
|
end
|
880
1063
|
|
@@ -923,13 +1106,19 @@ class Standard
|
|
923
1106
|
end
|
924
1107
|
|
925
1108
|
# Before deleting proposed HVAC components, determine for each zone if it has district heating
|
926
|
-
# @return [Hash] of boolean with zone name as key
|
1109
|
+
# @return [Hash] Hash of boolean with zone name as key
|
927
1110
|
def model_get_district_heating_zones(model)
|
928
1111
|
has_district_hash = {}
|
929
1112
|
model.getThermalZones.sort.each do |zone|
|
930
1113
|
has_district_hash['building'] = false
|
931
|
-
|
932
|
-
if
|
1114
|
+
|
1115
|
+
# error if HVACComponent heating fuels method is not available
|
1116
|
+
if model.version < OpenStudio::VersionString.new('3.6.0')
|
1117
|
+
OpenStudio.logFree(OpenStudio::Error, 'openstudio.Standards.Model', 'Required HVACComponent method .heatingFuelTypes is not available in pre-OpenStudio 3.6.0 versions. Use a more recent version of OpenStudio.')
|
1118
|
+
end
|
1119
|
+
|
1120
|
+
htg_fuels = zone.heatingFuelTypes.map(&:valueName)
|
1121
|
+
if htg_fuels.include?('DistrictHeating') || htg_fuels.include?('DistrictHeatingWater') || htg_fuels.include?('DistrictHeatingSteam')
|
933
1122
|
has_district_hash[zone.name] = true
|
934
1123
|
has_district_hash['building'] = true
|
935
1124
|
else
|
@@ -941,14 +1130,21 @@ class Standard
|
|
941
1130
|
|
942
1131
|
# Get list of heat types across a list of zones
|
943
1132
|
# @param zones [array of objects] array of zone objects
|
944
|
-
# @return [
|
1133
|
+
# @return [String concatenated string showing different fuel types in a group of zones
|
945
1134
|
def get_group_heat_types(model, zones)
|
946
1135
|
heat_list = ''
|
947
1136
|
has_district_heat = false
|
948
1137
|
has_fuel_heat = false
|
949
1138
|
has_elec_heat = false
|
1139
|
+
|
1140
|
+
# error if HVACComponent heating fuels method is not available
|
1141
|
+
if model.version < OpenStudio::VersionString.new('3.6.0')
|
1142
|
+
OpenStudio.logFree(OpenStudio::Error, 'openstudio.Standards.Model', 'Required HVACComponent method .heatingFuelTypes is not available in pre-OpenStudio 3.6.0 versions. Use a more recent version of OpenStudio.')
|
1143
|
+
end
|
1144
|
+
|
950
1145
|
zones.each do |zone|
|
951
|
-
|
1146
|
+
htg_fuels = zone.heatingFuelTypes.map(&:valueName)
|
1147
|
+
if htg_fuels.include?('DistrictHeating') || htg_fuels.include?('DistrictHeatingWater') || htg_fuels.include?('DistrictHeatingSteam')
|
952
1148
|
has_district_heat = true
|
953
1149
|
end
|
954
1150
|
other_heat = thermal_zone_fossil_or_electric_type(zone, '')
|
@@ -973,7 +1169,7 @@ class Standard
|
|
973
1169
|
# Store fan operation schedule for each zone before deleting HVAC objects
|
974
1170
|
# @author Doug Maddox, PNNL
|
975
1171
|
# @param model [object]
|
976
|
-
# @return [
|
1172
|
+
# @return [Hash] of zoneName:fan_schedule_8760
|
977
1173
|
def get_fan_schedule_for_each_zone(model)
|
978
1174
|
fan_sch_names = {}
|
979
1175
|
|
@@ -982,7 +1178,7 @@ class Standard
|
|
982
1178
|
fan_schedule_8760 = []
|
983
1179
|
# Check for availability managers
|
984
1180
|
# Assume only AvailabilityManagerScheduled will control fan schedule
|
985
|
-
#
|
1181
|
+
# @todo also check AvailabilityManagerScheduledOn
|
986
1182
|
avail_mgrs = air_loop_hvac.availabilityManagers
|
987
1183
|
# if avail_mgrs.is_initialized
|
988
1184
|
if !avail_mgrs.nil?
|
@@ -1099,7 +1295,7 @@ class Standard
|
|
1099
1295
|
# Array will include extra 24 values for leap year
|
1100
1296
|
# Array will also include extra 24 values at end for holiday day type
|
1101
1297
|
# @author: Doug Maddox, PNNL
|
1102
|
-
# @
|
1298
|
+
# @todo consider moving this to Standards.Schedule.rb
|
1103
1299
|
# @param: model [Object]
|
1104
1300
|
# @param: fan_schedule [Object]
|
1105
1301
|
# @return: [Array<String>] annual hourly values from schedule
|
@@ -1118,32 +1314,20 @@ class Standard
|
|
1118
1314
|
fan_schedule_ruleset = sch_translator.convert_schedule_compact_to_schedule_ruleset
|
1119
1315
|
fan_8760 = get_8760_values_from_schedule_ruleset(model, fan_schedule_ruleset)
|
1120
1316
|
when 'OS_Schedule_Year'
|
1121
|
-
#
|
1317
|
+
# @todo add function for ScheduleYear
|
1122
1318
|
# fan_8760 = get_8760_values_from_schedule_year(model, fan_schedule)
|
1123
1319
|
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.Model', 'Automated baseline measure does not support use of Schedule Year')
|
1124
1320
|
end
|
1125
1321
|
return fan_8760
|
1126
1322
|
end
|
1127
1323
|
|
1128
|
-
# Determines the area of the building above which point
|
1129
|
-
# the non-dominant area type gets it's own HVAC system type.
|
1130
|
-
#
|
1131
|
-
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
1132
|
-
# @param custom [String] custom fuel type
|
1133
|
-
# @return [Double] the minimum area (m^2)
|
1134
|
-
def model_prm_baseline_system_group_minimum_area(model, custom)
|
1135
|
-
exception_min_area_ft2 = 20_000
|
1136
|
-
exception_min_area_m2 = OpenStudio.convert(exception_min_area_ft2, 'ft^2', 'm^2').get
|
1137
|
-
return exception_min_area_m2
|
1138
|
-
end
|
1139
|
-
|
1140
1324
|
# Determine the baseline system type given the inputs. Logic is different for different standards.
|
1141
1325
|
#
|
1142
1326
|
# 90.1-2007, 90.1-2010, 90.1-2013
|
1143
1327
|
#
|
1144
1328
|
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
1145
1329
|
# @param climate_zone [String] ASHRAE climate zone, e.g. 'ASHRAE 169-2013-4A'
|
1146
|
-
# @param sys_group [
|
1330
|
+
# @param sys_group [Hash] Hash defining a group of zones that have the same Appendix G system type
|
1147
1331
|
# @param custom [String] custom fuel type
|
1148
1332
|
# @return [String] The system type. Possibilities are PTHP, PTAC, PSZ_AC, PSZ_HP, PVAV_Reheat, PVAV_PFP_Boxes,
|
1149
1333
|
# VAV_Reheat, VAV_PFP_Boxes, Gas_Furnace, Electric_Furnace
|
@@ -1154,14 +1338,19 @@ class Standard
|
|
1154
1338
|
area_ft2 = sys_group['area_ft2']
|
1155
1339
|
num_stories = sys_group['stories']
|
1156
1340
|
|
1157
|
-
#
|
1341
|
+
# [type, central_heating_fuel, zone_heating_fuel, cooling_fuel]
|
1158
1342
|
system_type = [nil, nil, nil, nil]
|
1159
1343
|
|
1160
1344
|
# Get the row from TableG3.1.1A
|
1161
1345
|
sys_num = model_prm_baseline_system_number(model, climate_zone, area_type, fuel_type, area_ft2, num_stories, custom)
|
1162
1346
|
|
1163
1347
|
# Modify the fuel type if called for by the standard
|
1164
|
-
|
1348
|
+
if custom == 'Xcel Energy CO EDA'
|
1349
|
+
# fuel type remains unchanged
|
1350
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.Model', 'Custom; per Xcel EDA Program Manual 2014 Table 3.2.2 Baseline HVAC System Types, the 90.1-2010 rules for heating fuel type (based on proposed model) rules apply.')
|
1351
|
+
else
|
1352
|
+
fuel_type = model_prm_baseline_system_change_fuel_type(model, fuel_type, climate_zone)
|
1353
|
+
end
|
1165
1354
|
|
1166
1355
|
# Define the lookup by row and by fuel type
|
1167
1356
|
sys_lookup = Hash.new { |h, k| h[k] = Hash.new(&h.default_proc) }
|
@@ -1261,41 +1450,10 @@ class Standard
|
|
1261
1450
|
# @param fuel_type [String] Valid choices are electric, fossil, fossilandelectric,
|
1262
1451
|
# purchasedheat, purchasedcooling, purchasedheatandcooling
|
1263
1452
|
# @param climate_zone [String] ASHRAE climate zone, e.g. 'ASHRAE 169-2013-4A'
|
1264
|
-
# @param custom [String] custom fuel type
|
1265
1453
|
# @return [String] the revised fuel type
|
1266
|
-
def model_prm_baseline_system_change_fuel_type(model, fuel_type, climate_zone
|
1267
|
-
|
1268
|
-
|
1269
|
-
|
1270
|
-
# Determine whether heating type is fuel or electric
|
1271
|
-
# @param hvac_building_type [String] Key for lookup of baseline system type
|
1272
|
-
# @param climate_zone [String] full name of climate zone
|
1273
|
-
# @return [String] fuel or electric
|
1274
|
-
def find_prm_heat_type(hvac_building_type, climate_zone)
|
1275
|
-
climate_code = get_climate_zone_code(climate_zone)
|
1276
|
-
heat_type_props = model_find_object(standards_data['prm_heat_type'],
|
1277
|
-
'template' => template,
|
1278
|
-
'hvac_building_type' => hvac_building_type,
|
1279
|
-
'climate_zone' => climate_code)
|
1280
|
-
if !heat_type_props
|
1281
|
-
# try again with wild card for climate
|
1282
|
-
heat_type_props = model_find_object(standards_data['prm_heat_type'],
|
1283
|
-
'template' => template,
|
1284
|
-
'hvac_building_type' => hvac_building_type,
|
1285
|
-
'climate_zone' => 'any')
|
1286
|
-
end
|
1287
|
-
if !heat_type_props
|
1288
|
-
# try again with wild card for building type
|
1289
|
-
heat_type_props = model_find_object(standards_data['prm_heat_type'],
|
1290
|
-
'template' => template,
|
1291
|
-
'hvac_building_type' => 'all others',
|
1292
|
-
'climate_zone' => climate_code)
|
1293
|
-
end
|
1294
|
-
if !heat_type_props
|
1295
|
-
OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.Model', "Could not find baseline heat type for: #{template}-#{hvac_building_type}-#{climate_zone}.")
|
1296
|
-
else
|
1297
|
-
return heat_type_props['heat_type']
|
1298
|
-
end
|
1454
|
+
def model_prm_baseline_system_change_fuel_type(model, fuel_type, climate_zone)
|
1455
|
+
# Don't change fuel type for most templates
|
1456
|
+
return fuel_type
|
1299
1457
|
end
|
1300
1458
|
|
1301
1459
|
# Get ASHRAE ID code for climate zone
|
@@ -1341,11 +1499,11 @@ class Standard
|
|
1341
1499
|
# @param system_type [String] The system type. Valid choices are PTHP, PTAC, PSZ_AC, PSZ_HP, PVAV_Reheat,
|
1342
1500
|
# PVAV_PFP_Boxes, VAV_Reheat, VAV_PFP_Boxes, Gas_Furnace, Electric_Furnace,
|
1343
1501
|
# which are also returned by the method OpenStudio::Model::Model.prm_baseline_system_type.
|
1344
|
-
# @param main_heat_fuel [String] main heating fuel. Valid choices are Electricity, NaturalGas, DistrictHeating
|
1345
|
-
# @param zone_heat_fuel [String] zone heating/reheat fuel. Valid choices are Electricity, NaturalGas, DistrictHeating
|
1502
|
+
# @param main_heat_fuel [String] main heating fuel. Valid choices are Electricity, NaturalGas, DistrictHeating, DistrictHeatingWater, DistrictHeatingSteam
|
1503
|
+
# @param zone_heat_fuel [String] zone heating/reheat fuel. Valid choices are Electricity, NaturalGas, DistrictHeating, DistrictHeatingWater, DistrictHeatingSteam
|
1346
1504
|
# @param cool_fuel [String] cooling fuel. Valid choices are Electricity, DistrictCooling
|
1347
1505
|
# @param zones [Array<OpenStudio::Model::ThermalZone>] an array of zones
|
1348
|
-
# @return [
|
1506
|
+
# @return [Boolean] returns true if successful, false if not
|
1349
1507
|
# @todo Add 90.1-2013 systems 11-13
|
1350
1508
|
def model_add_prm_baseline_system(model, system_type, main_heat_fuel, zone_heat_fuel, cool_fuel, zones, zone_fan_scheds)
|
1351
1509
|
case system_type
|
@@ -1381,7 +1539,7 @@ class Standard
|
|
1381
1539
|
heating_type = 'Gas'
|
1382
1540
|
# if district heating
|
1383
1541
|
hot_water_loop = nil
|
1384
|
-
if main_heat_fuel
|
1542
|
+
if main_heat_fuel.include?('DistrictHeating')
|
1385
1543
|
heating_type = 'Water'
|
1386
1544
|
hot_water_loop = if model.getPlantLoopByName('Hot Water Loop').is_initialized
|
1387
1545
|
model.getPlantLoopByName('Hot Water Loop').get
|
@@ -1481,12 +1639,14 @@ class Standard
|
|
1481
1639
|
# If and only if there are primary zones to attach to the loop
|
1482
1640
|
# counter example: floor with only one elevator machine room that get classified as sec_zones
|
1483
1641
|
unless pri_zones.empty?
|
1484
|
-
model_add_pvav(model,
|
1485
|
-
|
1486
|
-
|
1487
|
-
|
1488
|
-
|
1489
|
-
|
1642
|
+
air_loop = model_add_pvav(model,
|
1643
|
+
pri_zones,
|
1644
|
+
system_name: system_name,
|
1645
|
+
hot_water_loop: hot_water_loop,
|
1646
|
+
chilled_water_loop: chilled_water_loop,
|
1647
|
+
electric_reheat: electric_reheat)
|
1648
|
+
model_system_outdoor_air_sizing_vrp_method(air_loop)
|
1649
|
+
air_loop_hvac_apply_vav_damper_action(air_loop)
|
1490
1650
|
model_create_multizone_fan_schedule(model, zone_op_hrs, pri_zones, system_name)
|
1491
1651
|
end
|
1492
1652
|
|
@@ -1618,15 +1778,17 @@ class Standard
|
|
1618
1778
|
if chilled_water_loop.additionalProperties.hasFeature('secondary_loop_name')
|
1619
1779
|
chilled_water_loop = model.getPlantLoopByName(chilled_water_loop.additionalProperties.getFeatureAsString('secondary_loop_name').get).get
|
1620
1780
|
end
|
1621
|
-
model_add_vav_reheat(model,
|
1622
|
-
|
1623
|
-
|
1624
|
-
|
1625
|
-
|
1626
|
-
|
1627
|
-
|
1628
|
-
|
1629
|
-
|
1781
|
+
air_loop = model_add_vav_reheat(model,
|
1782
|
+
pri_zones,
|
1783
|
+
system_name: system_name,
|
1784
|
+
reheat_type: reheat_type,
|
1785
|
+
hot_water_loop: hot_water_loop,
|
1786
|
+
chilled_water_loop: chilled_water_loop,
|
1787
|
+
fan_efficiency: 0.62,
|
1788
|
+
fan_motor_efficiency: 0.9,
|
1789
|
+
fan_pressure_rise: 4.0)
|
1790
|
+
model_system_outdoor_air_sizing_vrp_method(air_loop)
|
1791
|
+
air_loop_hvac_apply_vav_damper_action(air_loop)
|
1630
1792
|
model_create_multizone_fan_schedule(model, zone_op_hrs, pri_zones, system_name)
|
1631
1793
|
end
|
1632
1794
|
|
@@ -1708,7 +1870,7 @@ class Standard
|
|
1708
1870
|
unless zones.empty?
|
1709
1871
|
# If district heating
|
1710
1872
|
hot_water_loop = nil
|
1711
|
-
if main_heat_fuel
|
1873
|
+
if main_heat_fuel.include?('DistrictHeating')
|
1712
1874
|
hot_water_loop = if model.getPlantLoopByName('Hot Water Loop').is_initialized
|
1713
1875
|
model.getPlantLoopByName('Hot Water Loop').get
|
1714
1876
|
else
|
@@ -1737,7 +1899,7 @@ class Standard
|
|
1737
1899
|
when 'SZ_CV' # System 12 (gas or district heat) or System 13 (electric resistance heat)
|
1738
1900
|
unless zones.empty?
|
1739
1901
|
hot_water_loop = nil
|
1740
|
-
if zone_heat_fuel
|
1902
|
+
if zone_heat_fuel.include?('DistrictHeating') || zone_heat_fuel == 'NaturalGas'
|
1741
1903
|
heating_type = 'Water'
|
1742
1904
|
hot_water_loop = if model.getPlantLoopByName('Hot Water Loop').is_initialized
|
1743
1905
|
model.getPlantLoopByName('Hot Water Loop').get
|
@@ -2144,8 +2306,8 @@ class Standard
|
|
2144
2306
|
|
2145
2307
|
# For a multizone system, create the fan schedule based on zone occupancy/fan schedules
|
2146
2308
|
# @author Doug Maddox, PNNL
|
2147
|
-
# @param model
|
2148
|
-
# @param
|
2309
|
+
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
2310
|
+
# @param zone_op_hrs [Hash] hash of zoneName zone_op_hrs
|
2149
2311
|
# @param pri_zones [Array<String>] names of zones served by the multizone system
|
2150
2312
|
# @param system_name [String] name of air loop
|
2151
2313
|
def model_create_multizone_fan_schedule(model, zone_op_hrs, pri_zones, system_name)
|
@@ -2204,7 +2366,7 @@ class Standard
|
|
2204
2366
|
# Does not assign a story to plenum spaces.
|
2205
2367
|
#
|
2206
2368
|
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
2207
|
-
# @return [
|
2369
|
+
# @return [Boolean] returns true if successful, false if not
|
2208
2370
|
def model_assign_spaces_to_stories(model)
|
2209
2371
|
# Make hash of spaces and minz values
|
2210
2372
|
sorted_spaces = {}
|
@@ -2244,7 +2406,7 @@ class Standard
|
|
2244
2406
|
# @note This must be performed before the sizing run because it impacts component sizes, which in turn impact efficiencies.
|
2245
2407
|
#
|
2246
2408
|
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
2247
|
-
# @return [
|
2409
|
+
# @return [Boolean] returns true if successful, false if not
|
2248
2410
|
def model_apply_multizone_vav_outdoor_air_sizing(model)
|
2249
2411
|
OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.Model', 'Started applying multizone vav OA sizing.')
|
2250
2412
|
|
@@ -2258,10 +2420,10 @@ class Standard
|
|
2258
2420
|
#
|
2259
2421
|
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
2260
2422
|
# @param climate_zone [String] ASHRAE climate zone, e.g. 'ASHRAE 169-2013-4A'
|
2261
|
-
# @param apply_controls [
|
2423
|
+
# @param apply_controls [Boolean] toggle whether to apply air loop and plant loop controls
|
2262
2424
|
# @param sql_db_vars_map [Hash] hash map
|
2263
|
-
# @param necb_ref_hp [
|
2264
|
-
# @return [
|
2425
|
+
# @param necb_ref_hp [Boolean] for compatability with NECB ruleset only.
|
2426
|
+
# @return [Boolean] returns true if successful, false if not
|
2265
2427
|
def model_apply_hvac_efficiency_standard(model, climate_zone, apply_controls: true, sql_db_vars_map: nil, necb_ref_hp: false)
|
2266
2428
|
sql_db_vars_map = {} if sql_db_vars_map.nil?
|
2267
2429
|
|
@@ -2345,7 +2507,7 @@ class Standard
|
|
2345
2507
|
# Applies daylighting controls to each space in the model per the standard.
|
2346
2508
|
#
|
2347
2509
|
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
2348
|
-
# @return [
|
2510
|
+
# @return [Boolean] returns true if successful, false if not
|
2349
2511
|
def model_add_daylighting_controls(model)
|
2350
2512
|
OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.Model', 'Started adding daylighting controls.')
|
2351
2513
|
|
@@ -2359,8 +2521,9 @@ class Standard
|
|
2359
2521
|
end
|
2360
2522
|
|
2361
2523
|
# For backward compatibility, infiltration standard not used for 2013 and earlier
|
2362
|
-
#
|
2363
|
-
|
2524
|
+
#
|
2525
|
+
# @return [Boolean] true if successful, false if not
|
2526
|
+
def model_apply_standard_infiltration(model, specific_space_infiltration_rate_75_pa = nil)
|
2364
2527
|
return true
|
2365
2528
|
end
|
2366
2529
|
|
@@ -2369,7 +2532,7 @@ class Standard
|
|
2369
2532
|
# and removes the SpaceType-level infiltration objects.
|
2370
2533
|
#
|
2371
2534
|
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
2372
|
-
# @return [
|
2535
|
+
# @return [Boolean] returns true if successful, false if not
|
2373
2536
|
# @todo This infiltration method is not used by the Reference buildings, fix this inconsistency.
|
2374
2537
|
def model_apply_infiltration_standard(model)
|
2375
2538
|
# Set the infiltration rate at each space
|
@@ -2785,7 +2948,7 @@ class Standard
|
|
2785
2948
|
#
|
2786
2949
|
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
2787
2950
|
# @param standard_sch_type_limit [String] the name of a standard schedule type limit with predefined limits
|
2788
|
-
# options are Temperature, Humidity Ratio, Fractional, OnOff, and Activity
|
2951
|
+
# options are Dimensionless, Temperature, Humidity Ratio, Fractional, OnOff, and Activity
|
2789
2952
|
# @param name [String] the name of the schedule type limits
|
2790
2953
|
# @param lower_limit_value [double] the lower limit value for the schedule type
|
2791
2954
|
# @param upper_limit_value [double] the upper limit value for the schedule type
|
@@ -2823,6 +2986,14 @@ class Standard
|
|
2823
2986
|
end
|
2824
2987
|
else
|
2825
2988
|
case standard_sch_type_limit.downcase
|
2989
|
+
when 'dimensionless'
|
2990
|
+
schedule_type_limits = OpenStudio::Model::ScheduleTypeLimits.new(model)
|
2991
|
+
schedule_type_limits.setName('Dimensionless')
|
2992
|
+
schedule_type_limits.setLowerLimitValue(0.0)
|
2993
|
+
schedule_type_limits.setUpperLimitValue(1000.0)
|
2994
|
+
schedule_type_limits.setNumericType('Continuous')
|
2995
|
+
schedule_type_limits.setUnitType('Dimensionless')
|
2996
|
+
|
2826
2997
|
when 'temperature'
|
2827
2998
|
schedule_type_limits = OpenStudio::Model::ScheduleTypeLimits.new(model)
|
2828
2999
|
schedule_type_limits.setName('Temperature')
|
@@ -3237,7 +3408,7 @@ class Standard
|
|
3237
3408
|
skylights_frame_added = 0
|
3238
3409
|
model.getSubSurfaces.each do |sub_surface|
|
3239
3410
|
next unless sub_surface.outsideBoundaryCondition == 'Outdoors' && sub_surface.subSurfaceType == 'Skylight'
|
3240
|
-
|
3411
|
+
|
3241
3412
|
if model.version < OpenStudio::VersionString.new('3.1.0')
|
3242
3413
|
# window frame setting before https://github.com/NREL/OpenStudio/issues/2895 was fixed
|
3243
3414
|
sub_surface.setString(8, frame.name.get.to_s)
|
@@ -3366,7 +3537,7 @@ class Standard
|
|
3366
3537
|
# @param climate_zone [String] ASHRAE climate zone, e.g. 'ASHRAE 169-2013-4A'
|
3367
3538
|
# @param building_type [String] the building type
|
3368
3539
|
# @param spc_type [String] the space type
|
3369
|
-
# @param is_residential [
|
3540
|
+
# @param is_residential [Boolean] true if the building is residential
|
3370
3541
|
# @return [OpenStudio::Model::OptionalDefaultConstructionSet] an optional default construction set
|
3371
3542
|
def model_add_construction_set(model, climate_zone, building_type, spc_type, is_residential)
|
3372
3543
|
construction_set = OpenStudio::Model::OptionalDefaultConstructionSet.new
|
@@ -3970,8 +4141,8 @@ class Standard
|
|
3970
4141
|
# medium or large based on building area that can be turned off
|
3971
4142
|
#
|
3972
4143
|
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
3973
|
-
# @param remap_office [
|
3974
|
-
# @return [
|
4144
|
+
# @param remap_office [Boolean] re-map small office or leave it alone
|
4145
|
+
# @return [Hash] key for climate zone, building type, and standards template. All values are strings.
|
3975
4146
|
def model_get_building_properties(model, remap_office = true)
|
3976
4147
|
# get climate zone from model
|
3977
4148
|
climate_zone = model_standards_climate_zone(model)
|
@@ -4253,7 +4424,7 @@ class Standard
|
|
4253
4424
|
#
|
4254
4425
|
# 90.1-2007, 90.1-2010, 90.1-2013
|
4255
4426
|
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
4256
|
-
# @return [
|
4427
|
+
# @return [Boolean] returns true if successful, false if not
|
4257
4428
|
def model_apply_prm_construction_types(model)
|
4258
4429
|
types_to_modify = []
|
4259
4430
|
|
@@ -4339,7 +4510,7 @@ class Standard
|
|
4339
4510
|
#
|
4340
4511
|
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
4341
4512
|
# @param climate_zone [String] ASHRAE climate zone, e.g. 'ASHRAE 169-2013-4A'
|
4342
|
-
# @return [
|
4513
|
+
# @return [Boolean] returns true if successful, false if not
|
4343
4514
|
def model_apply_standard_constructions(model, climate_zone, wwr_building_type: nil, wwr_info: {})
|
4344
4515
|
types_to_modify = []
|
4345
4516
|
|
@@ -4481,7 +4652,7 @@ class Standard
|
|
4481
4652
|
#
|
4482
4653
|
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
4483
4654
|
# @param climate_zone [String] ASHRAE climate zone, e.g. 'ASHRAE 169-2013-4A'
|
4484
|
-
# @return [
|
4655
|
+
# @return [Boolean] returns true if successful, false if not
|
4485
4656
|
# @todo add proper support for 90.1-2013 with all those building type specific values
|
4486
4657
|
# @todo support 90.1-2004 requirement that windows be modeled as horizontal bands.
|
4487
4658
|
# Currently just using existing window geometry, and shrinking as necessary if WWR is above limit.
|
@@ -4584,7 +4755,7 @@ class Standard
|
|
4584
4755
|
# based on sizing run results
|
4585
4756
|
cat = space_conditioning_category(space)
|
4586
4757
|
else
|
4587
|
-
#
|
4758
|
+
# @todo This should really use the heating/cooling loads from the proposed building.
|
4588
4759
|
# However, in an attempt to avoid another sizing run just for this purpose,
|
4589
4760
|
# conditioned status is based on heating/cooling setpoints.
|
4590
4761
|
# If heated-only, will be assumed Semiheated.
|
@@ -4735,21 +4906,20 @@ class Standard
|
|
4735
4906
|
# reduce toward centroid.
|
4736
4907
|
#
|
4737
4908
|
# daylighting control isn't modeled
|
4738
|
-
|
4739
|
-
|
4740
|
-
|
4741
|
-
|
4742
|
-
|
4743
|
-
|
4744
|
-
|
4745
|
-
|
4746
|
-
total_fene_m2: total_fene_area,
|
4747
|
-
total_plenum_wall_m2: total_plenum_wall_area)
|
4909
|
+
red = surface_get_wwr_reduction_ratio(mult,
|
4910
|
+
surface,
|
4911
|
+
wwr_building_type: bat,
|
4912
|
+
wwr_target: wwr_lim / 100, # divide by 100 to revise it to decimals
|
4913
|
+
total_wall_m2: total_wall_area,
|
4914
|
+
total_wall_with_fene_m2: total_wall_with_fene_area,
|
4915
|
+
total_fene_m2: total_fene_area,
|
4916
|
+
total_plenum_wall_m2: total_plenum_wall_area)
|
4748
4917
|
|
4749
4918
|
if red < 0.0
|
4750
4919
|
# surface with fenestration to its maximum but adjusted by door areas when need to add windows in surfaces no fenestration
|
4751
4920
|
# turn negative to positive to get the correct adjustment factor.
|
4752
4921
|
red = -red
|
4922
|
+
surface_wwr = surface_get_wwr(surface)
|
4753
4923
|
residual_fene += (0.9 - red * surface_wwr) * surface.grossArea
|
4754
4924
|
end
|
4755
4925
|
surface_adjust_fenestration_in_a_surface(surface, red, model)
|
@@ -4768,7 +4938,7 @@ class Standard
|
|
4768
4938
|
# Reduces the SRR to the values specified by the PRM. SRR reduction will be done by shrinking vertices toward the centroid.
|
4769
4939
|
#
|
4770
4940
|
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
4771
|
-
# @return [
|
4941
|
+
# @return [Boolean] returns true if successful, false if not
|
4772
4942
|
# @todo support semiheated spaces as a separate SRR category
|
4773
4943
|
# @todo add skylight frame area to calculation of SRR
|
4774
4944
|
def model_apply_prm_baseline_skylight_to_roof_ratio(model)
|
@@ -4913,7 +5083,7 @@ class Standard
|
|
4913
5083
|
# Apply baseline values to exterior lights objects
|
4914
5084
|
# Only implemented for stable baseline
|
4915
5085
|
#
|
4916
|
-
# @param model [OpenStudio::
|
5086
|
+
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
4917
5087
|
def model_apply_baseline_exterior_lighting(model)
|
4918
5088
|
return false
|
4919
5089
|
end
|
@@ -4929,7 +5099,7 @@ class Standard
|
|
4929
5099
|
# This does not include plant loops that serve WaterUse:Equipment or Fan:ZoneExhaust
|
4930
5100
|
#
|
4931
5101
|
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
4932
|
-
# @return [
|
5102
|
+
# @return [Boolean] returns true if successful, false if not
|
4933
5103
|
def model_remove_prm_hvac(model)
|
4934
5104
|
# Plant loops
|
4935
5105
|
model.getPlantLoops.sort.each do |loop|
|
@@ -4985,7 +5155,7 @@ class Standard
|
|
4985
5155
|
# Remove EMS objects that may be orphaned from removing HVAC
|
4986
5156
|
#
|
4987
5157
|
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
4988
|
-
# @return [
|
5158
|
+
# @return [Boolean] returns true if successful, false if not
|
4989
5159
|
def model_remove_prm_ems_objects(model)
|
4990
5160
|
model.getEnergyManagementSystemActuators.each(&:remove)
|
4991
5161
|
model.getEnergyManagementSystemConstructionIndexVariables.each(&:remove)
|
@@ -5006,7 +5176,7 @@ class Standard
|
|
5006
5176
|
# Remove external shading devices. Site shading will not be impacted.
|
5007
5177
|
#
|
5008
5178
|
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
5009
|
-
# @return [
|
5179
|
+
# @return [Boolean] returns true if successful, false if not
|
5010
5180
|
def model_remove_external_shading_devices(model)
|
5011
5181
|
shading_surfaces_removed = 0
|
5012
5182
|
model.getShadingSurfaceGroups.sort.each do |shade_group|
|
@@ -5026,7 +5196,7 @@ class Standard
|
|
5026
5196
|
# Changes the sizing parameters to the PRM specifications.
|
5027
5197
|
#
|
5028
5198
|
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
5029
|
-
# @return [
|
5199
|
+
# @return [Boolean] returns true if successful, false if not
|
5030
5200
|
def model_apply_prm_sizing_parameters(model)
|
5031
5201
|
clg = 1.15
|
5032
5202
|
htg = 1.25
|
@@ -5303,7 +5473,7 @@ class Standard
|
|
5303
5473
|
# with information that the spacetype needs to be defined.
|
5304
5474
|
#
|
5305
5475
|
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
5306
|
-
# @return [
|
5476
|
+
# @return [Boolean] returns true if successful, false if not
|
5307
5477
|
def model_validate_standards_spacetypes_in_model(model)
|
5308
5478
|
error_string = ''
|
5309
5479
|
# populate search hash
|
@@ -5456,7 +5626,7 @@ class Standard
|
|
5456
5626
|
# create space_type_hash with info such as effective_num_spaces, num_units, num_meds, num_meals
|
5457
5627
|
#
|
5458
5628
|
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
5459
|
-
# @param trust_effective_num_spaces [
|
5629
|
+
# @param trust_effective_num_spaces [Boolean] defaults to false - set to true if modeled every space as a real rpp, vs. space as collection of rooms
|
5460
5630
|
# @return [Hash] hash of space types with misc information
|
5461
5631
|
# @todo - add code when determining number of units to makeuse of trust_effective_num_spaces arg
|
5462
5632
|
def model_create_space_type_hash(model, trust_effective_num_spaces = false)
|
@@ -5567,7 +5737,7 @@ class Standard
|
|
5567
5737
|
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
5568
5738
|
# @param ratio [Double] ratio
|
5569
5739
|
# @param surface_type [String] surface type
|
5570
|
-
# @return [
|
5740
|
+
# @return [Boolean] returns true if successful, false if not
|
5571
5741
|
def apply_limit_to_subsurface_ratio(model, ratio, surface_type = 'Wall')
|
5572
5742
|
fdwr = get_outdoor_subsurface_ratio(model, surface_type)
|
5573
5743
|
if fdwr <= ratio
|
@@ -5602,7 +5772,7 @@ class Standard
|
|
5602
5772
|
# institution: ASHRAE, value: 6A becomes: ASHRAE 169-2013-6A.
|
5603
5773
|
# institution: CEC, value: 3 becomes: CEC T24-CEC3.
|
5604
5774
|
#
|
5605
|
-
# @param model [OpenStudio::Model::Model]
|
5775
|
+
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
5606
5776
|
# @return [String] the string representation of the climate zone,
|
5607
5777
|
# empty string if no climate zone is present in the model.
|
5608
5778
|
def model_standards_climate_zone(model)
|
@@ -5630,9 +5800,9 @@ class Standard
|
|
5630
5800
|
# in the format used by the openstudio-standards lookups.
|
5631
5801
|
# Clears out any climate zones previously added to the model.
|
5632
5802
|
#
|
5633
|
-
# @param model [OpenStudio::Model::Model]
|
5803
|
+
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
5634
5804
|
# @param climate_zone [String] ASHRAE climate zone, e.g. 'ASHRAE 169-2013-4A'
|
5635
|
-
# @return [
|
5805
|
+
# @return [Boolean] returns true if successful, false if not
|
5636
5806
|
def model_set_climate_zone(model, climate_zone)
|
5637
5807
|
# Remove previous climate zones from the model
|
5638
5808
|
model.getClimateZones.clear
|
@@ -5651,7 +5821,7 @@ class Standard
|
|
5651
5821
|
# This method return the building ratio of subsurface_area / surface_type_area
|
5652
5822
|
# where surface_type can be "Wall" or "RoofCeiling"
|
5653
5823
|
#
|
5654
|
-
# @param model [OpenStudio::Model::Model]
|
5824
|
+
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
5655
5825
|
# @param surface_type [String] surface type
|
5656
5826
|
# @return [Double] surface ratio
|
5657
5827
|
def get_outdoor_subsurface_ratio(model, surface_type = 'Wall')
|
@@ -5680,7 +5850,7 @@ class Standard
|
|
5680
5850
|
# Loads a osm as a starting point.
|
5681
5851
|
#
|
5682
5852
|
# @param osm_file [String] path to the .osm file, relative to the /data folder
|
5683
|
-
# @return [
|
5853
|
+
# @return [Boolean] returns true if successful, false if not
|
5684
5854
|
def load_initial_osm(osm_file)
|
5685
5855
|
# Load the geometry .osm
|
5686
5856
|
unless File.exist?(osm_file)
|
@@ -5697,8 +5867,8 @@ class Standard
|
|
5697
5867
|
|
5698
5868
|
# validate that model contains objects
|
5699
5869
|
#
|
5700
|
-
# @param model [OpenStudio::Model::Model]
|
5701
|
-
# @return [
|
5870
|
+
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
5871
|
+
# @return [Boolean] returns true if valid, false if not
|
5702
5872
|
def validate_initial_model(model)
|
5703
5873
|
is_valid = true
|
5704
5874
|
if model.getBuildingStorys.empty?
|
@@ -5747,7 +5917,7 @@ class Standard
|
|
5747
5917
|
# When 'Sum', all min OA flow rates are added up. Commonly used by 90.1.
|
5748
5918
|
# When 'Maximum', only the biggest OA flow rate. Used by T24.
|
5749
5919
|
#
|
5750
|
-
# @param model [OpenStudio::Model::Model]
|
5920
|
+
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
5751
5921
|
# @return [String] the ventilation method, either Sum or Maximum
|
5752
5922
|
def model_ventilation_method(model)
|
5753
5923
|
building_data = model_get_building_properties(model)
|
@@ -5764,8 +5934,8 @@ class Standard
|
|
5764
5934
|
# Removes all of the unused ResourceObjects
|
5765
5935
|
# (Curves, ScheduleDay, Material, etc.) from the model.
|
5766
5936
|
#
|
5767
|
-
# @param model [OpenStudio::Model::Model]
|
5768
|
-
# @return [
|
5937
|
+
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
5938
|
+
# @return [Boolean] returns true if successful, false if not
|
5769
5939
|
def model_remove_unused_resource_objects(model)
|
5770
5940
|
start_size = model.objects.size
|
5771
5941
|
model.getResourceObjects.sort.each do |obj|
|
@@ -5789,10 +5959,10 @@ class Standard
|
|
5789
5959
|
# Future new schedules should be designed as paramtric from the start and would not need to run through this inference process
|
5790
5960
|
#
|
5791
5961
|
# @author David Goldwasser
|
5792
|
-
# @param model [OpenStudio::Model::Model]
|
5962
|
+
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
5793
5963
|
# @param fraction_of_daily_occ_range [Double] fraction above/below daily min range required to start and end hours of operation
|
5794
|
-
# @param invert_res [
|
5795
|
-
# @param gen_occ_profile [
|
5964
|
+
# @param invert_res [Boolean] if true will reverse hours of operation for residential space types
|
5965
|
+
# @param gen_occ_profile [Boolean] if true creates a merged occupancy schedule for diagnostic purposes. This schedule is added to the model but no specifically returned by this method
|
5796
5966
|
# @return [ScheduleRuleset] schedule that is assigned to the building as default hours of operation
|
5797
5967
|
def model_infer_hours_of_operation_building(model, fraction_of_daily_occ_range: 0.25, invert_res: true, gen_occ_profile: false)
|
5798
5968
|
# create an array of non-residential and residential spaces
|
@@ -5943,10 +6113,10 @@ class Standard
|
|
5943
6113
|
# should be traced back to a space or spaces.
|
5944
6114
|
#
|
5945
6115
|
# @author David Goldwasser
|
5946
|
-
# @param model [OpenStudio::Model::Model]
|
6116
|
+
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
5947
6117
|
# @param step_ramp_logic [String] type of step logic to use
|
5948
|
-
# @param infer_hoo_for_non_assigned_objects [
|
5949
|
-
# @param gather_data_only [
|
6118
|
+
# @param infer_hoo_for_non_assigned_objects [Boolean] attempt to get hoo for objects like swh with and exterior lighting
|
6119
|
+
# @param gather_data_only [Boolean] false (stops method before changes made if true)
|
5950
6120
|
# @param hoo_var_method [String] accepts hours and fractional. Any other value value will result in hoo variables not being applied
|
5951
6121
|
# @return [Hash] schedule is key, value is hash of number of objects
|
5952
6122
|
def model_setup_parametric_schedules(model, step_ramp_logic: nil, infer_hoo_for_non_assigned_objects: true, gather_data_only: false, hoo_var_method: 'hours')
|
@@ -6106,10 +6276,10 @@ class Standard
|
|
6106
6276
|
# @note This measure will replace any prior chagnes made to ScheduleRule objects with new ScheduleRule values from
|
6107
6277
|
# profile formulas
|
6108
6278
|
# @author David Goldwasser
|
6109
|
-
# @param model [OpenStudio::Model::Model]
|
6279
|
+
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
6110
6280
|
# @param ramp_frequency [Double] ramp frequency in minutes. If nil method will match simulation timestep
|
6111
|
-
# @param infer_hoo_for_non_assigned_objects [
|
6112
|
-
# @param error_on_out_of_order [
|
6281
|
+
# @param infer_hoo_for_non_assigned_objects [Boolean] # attempt to get hoo for objects like swh with and exterior lighting
|
6282
|
+
# @param error_on_out_of_order [Boolean] true will error if applying formula creates out of order values
|
6113
6283
|
# @return [Array] of modified ScheduleRuleset objects
|
6114
6284
|
def model_apply_parametric_schedules(model, ramp_frequency: nil, infer_hoo_for_non_assigned_objects: true, error_on_out_of_order: true)
|
6115
6285
|
# get ramp frequency (fractional hour) from timestep
|
@@ -6148,10 +6318,14 @@ class Standard
|
|
6148
6318
|
|
6149
6319
|
private
|
6150
6320
|
|
6321
|
+
def model_apply_userdata_outdoor_air(model)
|
6322
|
+
return true
|
6323
|
+
end
|
6324
|
+
|
6151
6325
|
# This function checks whether it is required to adjust the window to wall ratio based on the model WWR and wwr limit.
|
6152
|
-
# @param wwr_limit [
|
6326
|
+
# @param wwr_limit [Double] window to wall ratio limit
|
6153
6327
|
# @param wwr_list [Array] list of wwr of zone conditioning category in a building area type category - residential, nonresidential and semiheated
|
6154
|
-
# @return
|
6328
|
+
# @return [Boolean] True, require adjustment, false not require adjustment.
|
6155
6329
|
def model_does_require_wwr_adjustment?(wwr_limit, wwr_list)
|
6156
6330
|
require_adjustment = false
|
6157
6331
|
wwr_list.each do |wwr|
|
@@ -6164,7 +6338,7 @@ class Standard
|
|
6164
6338
|
#
|
6165
6339
|
# @param bat [String] building area type category
|
6166
6340
|
# @param wwr_list [Array] list of wwr of zone conditioning category in a building area type category - residential, nonresidential and semiheated
|
6167
|
-
# @return
|
6341
|
+
# @return [Double] return adjusted wwr_limit
|
6168
6342
|
def model_get_bat_wwr_target(bat, wwr_list)
|
6169
6343
|
return 40.0
|
6170
6344
|
end
|
@@ -6174,21 +6348,21 @@ class Standard
|
|
6174
6348
|
# This function shall only be called if the maximum WWR value for surfaces with fenestration is lower than 90% due to
|
6175
6349
|
# accommodating the total door surface areas
|
6176
6350
|
#
|
6177
|
-
# @param residual_ratio
|
6351
|
+
# @param residual_ratio [Double] the ratio of residual surfaces among the total wall surface area with no fenestrations
|
6178
6352
|
# @param space [OpenStudio::Model:Space] a space
|
6179
6353
|
# @param model [OpenStudio::Model::Model] openstudio model
|
6180
|
-
# @return [
|
6354
|
+
# @return [Boolean] returns true if successful, false if not
|
6181
6355
|
def model_readjust_surface_wwr(residual_ratio, space, model)
|
6182
6356
|
return true
|
6183
6357
|
end
|
6184
6358
|
|
6185
6359
|
# Helper method to fill in hourly values
|
6186
6360
|
#
|
6187
|
-
# @param model [OpenStudio::Model::Model]
|
6361
|
+
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
6188
6362
|
# @param day_sch [OpenStudio::Model::ScheduleDay] schedule day object
|
6189
6363
|
# @param sch_type [String] Constant or Hourly
|
6190
6364
|
# @param values [Array<Double>]
|
6191
|
-
# @return [
|
6365
|
+
# @return [Boolean] returns true if successful, false if not
|
6192
6366
|
def model_add_vals_to_sch(model, day_sch, sch_type, values)
|
6193
6367
|
if sch_type == 'Constant'
|
6194
6368
|
day_sch.addValue(OpenStudio::Time.new(0, 24, 0, 0), values[0])
|
@@ -6205,9 +6379,9 @@ class Standard
|
|
6205
6379
|
|
6206
6380
|
# Modify the existing service water heating loops to match the baseline required heating type.
|
6207
6381
|
#
|
6208
|
-
# @param model [OpenStudio::Model::Model]
|
6382
|
+
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
6209
6383
|
# @param building_type [String] the building type
|
6210
|
-
# @return [
|
6384
|
+
# @return [Boolean] returns true if successful, false if not
|
6211
6385
|
# @author Julien Marrec
|
6212
6386
|
def model_apply_baseline_swh_loops(model, building_type)
|
6213
6387
|
model.getPlantLoops.sort.each do |plant_loop|
|
@@ -6293,8 +6467,8 @@ class Standard
|
|
6293
6467
|
# This should be done by the forward translator, and this code should be removed after this bug is fixed:
|
6294
6468
|
# https://github.com/NREL/OpenStudio/issues/2598
|
6295
6469
|
#
|
6296
|
-
# @param model [OpenStudio::Model::Model]
|
6297
|
-
# @return [
|
6470
|
+
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
6471
|
+
# @return [Boolean] returns true if successful, false if not
|
6298
6472
|
# @todo remove this method after OpenStudio issue #2598 is fixed.
|
6299
6473
|
def model_temp_fix_ems_references(model)
|
6300
6474
|
# Internal Variables
|
@@ -6436,7 +6610,7 @@ class Standard
|
|
6436
6610
|
# @author David Goldwasser
|
6437
6611
|
# @param space_space_types [Array] array of spaces or space types
|
6438
6612
|
# @param parametric_inputs [Hash]
|
6439
|
-
# @param gather_data_only [
|
6613
|
+
# @param gather_data_only [Boolean]
|
6440
6614
|
# @return [Hash]
|
6441
6615
|
def gather_inputs_parametric_space_space_type_schedules(space_space_types, parametric_inputs, gather_data_only)
|
6442
6616
|
space_space_types.each do |space_type|
|
@@ -6495,7 +6669,7 @@ class Standard
|
|
6495
6669
|
# @param load_inst [OpenStudio::Model::SpaceLoadInstance]
|
6496
6670
|
# @param parametric_inputs [Hash]
|
6497
6671
|
# @param hours_of_operation [Hash]
|
6498
|
-
# @param gather_data_only [
|
6672
|
+
# @param gather_data_only [Boolean]
|
6499
6673
|
# @return [Hash]
|
6500
6674
|
def gather_inputs_parametric_load_inst_schedules(load_inst, parametric_inputs, hours_of_operation, gather_data_only)
|
6501
6675
|
if load_inst.class.to_s == 'OpenStudio::Model::People'
|
@@ -6521,9 +6695,9 @@ class Standard
|
|
6521
6695
|
# @param load_inst [OpenStudio::Model::SpaceLoadInstance]
|
6522
6696
|
# @param parametric_inputs [Hash]
|
6523
6697
|
# @param hours_of_operation [Hash]
|
6524
|
-
# @param ramp [
|
6698
|
+
# @param ramp [Boolean]
|
6525
6699
|
# @param min_ramp_dur_hr [Double]
|
6526
|
-
# @param gather_data_only [
|
6700
|
+
# @param gather_data_only [Boolean]
|
6527
6701
|
# @param hoo_var_method [String] accepts hours and fractional. Any other value value will result in hoo variables not being applied
|
6528
6702
|
# @return [Hash]
|
6529
6703
|
def gather_inputs_parametric_schedules(sch, load_inst, parametric_inputs, hours_of_operation, ramp: true, min_ramp_dur_hr: 2.0, gather_data_only: false, hoo_var_method: 'hours')
|
@@ -6843,8 +7017,8 @@ class Standard
|
|
6843
7017
|
|
6844
7018
|
# Retrieves the lowest story in a model
|
6845
7019
|
#
|
6846
|
-
# @param model [OpenStudio::
|
6847
|
-
# @return [OpenStudio::
|
7020
|
+
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
7021
|
+
# @return [OpenStudio::Model::BuildingStory] Lowest story included in the model
|
6848
7022
|
def find_lowest_story(model)
|
6849
7023
|
min_z_story = 1E+10
|
6850
7024
|
lowest_story = nil
|
@@ -6862,7 +7036,7 @@ class Standard
|
|
6862
7036
|
|
6863
7037
|
# Utility function that returns the min and max value in a design day schedule.
|
6864
7038
|
#
|
6865
|
-
#
|
7039
|
+
# @todo move this to Standards.Schedule.rb
|
6866
7040
|
# @param schedule [OpenStudio::Model::Schedule] can be ScheduleCompact, ScheduleRuleset, ScheduleConstant
|
6867
7041
|
# @param type [String] 'heating' for winter design day, 'cooling' for summer design day
|
6868
7042
|
# @return [Hash] Hash has two keys, min and max. if failed, return 999.9 for min and max.
|
@@ -6888,8 +7062,8 @@ class Standard
|
|
6888
7062
|
|
6889
7063
|
# Identifies non mechanically cooled ("nmc") systems, if applicable
|
6890
7064
|
#
|
6891
|
-
# @param model [OpenStudio::
|
6892
|
-
# @return
|
7065
|
+
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
7066
|
+
# @return [Hash] Zone to nmc system type mapping
|
6893
7067
|
def model_identify_non_mechanically_cooled_systems(model)
|
6894
7068
|
return true
|
6895
7069
|
end
|
@@ -6908,6 +7082,7 @@ class Standard
|
|
6908
7082
|
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
6909
7083
|
# @param wwr_parameter [Hash] parameters to choose min and max percent of surfaces,
|
6910
7084
|
# could be different set in different standard
|
7085
|
+
# @return [Hash] Hash of minimum_percent_of_surface and maximum_percent_of_surface
|
6911
7086
|
def model_get_percent_of_surface_range(model, wwr_parameter = {})
|
6912
7087
|
return { 'minimum_percent_of_surface' => nil, 'maximum_percent_of_surface' => nil }
|
6913
7088
|
end
|
@@ -6922,25 +7097,22 @@ class Standard
|
|
6922
7097
|
|
6923
7098
|
# Calculate the window to wall ratio reduction factor
|
6924
7099
|
#
|
6925
|
-
# @param multiplier [
|
6926
|
-
# @param
|
6927
|
-
# @param
|
6928
|
-
# @param
|
6929
|
-
# @param
|
6930
|
-
# @param
|
6931
|
-
# @param
|
6932
|
-
# @
|
6933
|
-
|
6934
|
-
|
6935
|
-
|
6936
|
-
|
6937
|
-
|
6938
|
-
|
6939
|
-
|
6940
|
-
|
6941
|
-
total_wall_with_fene_m2: 0.0,
|
6942
|
-
total_fene_m2: 0.0,
|
6943
|
-
total_plenum_wall_m2: 0.0)
|
7100
|
+
# @param multiplier [Double] multiplier of the wwr
|
7101
|
+
# @param surface [OpenStudio::Model:Surface] OpenStudio Surface object
|
7102
|
+
# @param wwr_target [Double] target window to wall ratio
|
7103
|
+
# @param total_wall_m2 [Double] total wall area of the category in m2.
|
7104
|
+
# @param total_wall_with_fene_m2 [Double] total wall area of the category with fenestrations in m2.
|
7105
|
+
# @param total_fene_m2 [Double] total fenestration area
|
7106
|
+
# @param total_plenum_wall_m2 [Double] total sqaure meter of a plenum
|
7107
|
+
# @return [Double] reduction factor
|
7108
|
+
def surface_get_wwr_reduction_ratio(multiplier,
|
7109
|
+
surface,
|
7110
|
+
wwr_building_type: 'All others',
|
7111
|
+
wwr_target: 0.0,
|
7112
|
+
total_wall_m2: 0.0,
|
7113
|
+
total_wall_with_fene_m2: 0.0,
|
7114
|
+
total_fene_m2: 0.0,
|
7115
|
+
total_plenum_wall_m2: 0.0)
|
6944
7116
|
return 1.0 - multiplier
|
6945
7117
|
end
|
6946
7118
|
|
@@ -6950,12 +7122,13 @@ class Standard
|
|
6950
7122
|
# 2. data from measure and OpenStudio interface
|
6951
7123
|
# @param [OpenStudio:model:Model] model
|
6952
7124
|
# @param [String] climate_zone
|
7125
|
+
# @param [String] sizing_run_dir
|
6953
7126
|
# @param [String] default_hvac_building_type
|
6954
7127
|
# @param [String] default_wwr_building_type
|
6955
7128
|
# @param [String] default_swh_building_type
|
6956
7129
|
# @param [Hash] bldg_type_hvac_zone_hash A hash maps building type for hvac to a list of thermal zones
|
6957
|
-
# @return
|
6958
|
-
def handle_user_input_data(model, climate_zone, default_hvac_building_type, default_wwr_building_type, default_swh_building_type, bldg_type_hvac_zone_hash)
|
7130
|
+
# @return [Boolean] returns true
|
7131
|
+
def handle_user_input_data(model, climate_zone, sizing_run_dir, default_hvac_building_type, default_wwr_building_type, default_swh_building_type, bldg_type_hvac_zone_hash)
|
6959
7132
|
return true
|
6960
7133
|
end
|
6961
7134
|
|
@@ -6963,67 +7136,36 @@ class Standard
|
|
6963
7136
|
# ASHRAE 90.1-2019 Appendix G.
|
6964
7137
|
#
|
6965
7138
|
# @param model [OpenStudio::Model::Model] OpenStudio model
|
6966
|
-
# @param
|
6967
|
-
# @param coil
|
6968
|
-
# @return [Boolean] true
|
7139
|
+
# @param thermal_zones [Array<OpenStudio::Model::ThermalZone>] thermal zone array
|
7140
|
+
# @param coil [OpenStudio::Model::StraightComponent] heating coil
|
7141
|
+
# @return [Boolean] returns true if successful, false if not
|
6969
7142
|
def model_set_central_preheat_coil_spm(model, thermal_zones, coil)
|
6970
7143
|
return true
|
6971
7144
|
end
|
6972
7145
|
|
6973
|
-
# Template method for
|
7146
|
+
# Template method for evaluate DCV requirements in the user model
|
6974
7147
|
#
|
6975
|
-
# @author Xuechen (Jerry) Lei, PNNL
|
6976
7148
|
# @param model [OpenStudio::Model::Model] OpenStudio model
|
6977
|
-
|
7149
|
+
# @return [Boolean] returns true if successful, false if not
|
7150
|
+
def model_evaluate_dcv_requirements(model)
|
6978
7151
|
return true
|
6979
7152
|
end
|
6980
7153
|
|
6981
7154
|
# Check whether the baseline model generation needs to run all four orientations
|
6982
7155
|
# The default shall be true
|
6983
7156
|
#
|
6984
|
-
# @param [Boolean]
|
6985
|
-
# @param [OpenStudio::Model::Model] OpenStudio model
|
7157
|
+
# @param run_all_orients [Boolean] user inputs to indicate whether it is required to run all orientations
|
7158
|
+
# @param user_model [OpenStudio::Model::Model] OpenStudio model
|
7159
|
+
# @return [Boolean] return True if all orientation need to be run, False if not
|
6986
7160
|
def run_all_orientations(run_all_orients, user_model)
|
6987
7161
|
return run_all_orients
|
6988
7162
|
end
|
6989
7163
|
|
6990
|
-
# Template method for reading user data and adding to zone additional properties
|
6991
|
-
#
|
6992
|
-
# @author Xuechen (Jerry) Lei, PNNL
|
6993
|
-
# @param model [OpenStudio::Model::Model] OpenStudio model
|
6994
|
-
def model_add_dcv_user_exception_properties(model)
|
6995
|
-
return true
|
6996
|
-
end
|
6997
|
-
|
6998
|
-
# Template method for raising user model DCV warning and errors
|
6999
|
-
#
|
7000
|
-
# @author Xuechen (Jerry) Lei, PNNL
|
7001
|
-
# @param model [OpenStudio::Model::Model] OpenStudio model
|
7002
|
-
def model_raise_user_model_dcv_errors(model)
|
7003
|
-
return true
|
7004
|
-
end
|
7005
|
-
|
7006
|
-
# Template method for adding zone additional property "airloop dcv required by 901" and "zone dcv required by 901"
|
7007
|
-
#
|
7008
|
-
# @author Xuechen (Jerry) Lei, PNNL
|
7009
|
-
# @param model [OpenStudio::Model::Model] OpenStudio model
|
7010
|
-
def model_add_dcv_requirement_properties(model)
|
7011
|
-
return true
|
7012
|
-
end
|
7013
|
-
|
7014
|
-
# Template method for checking if zones in the baseline model should have DCV based on 90.1 2019 G3.1.2.5.
|
7015
|
-
# Zone additional property 'apxg no need to have DCV' added
|
7016
|
-
#
|
7017
|
-
# @author Xuechen (Jerry) Lei, PNNL
|
7018
|
-
# @param model [OpenStudio::Model::Model] OpenStudio model
|
7019
|
-
def model_add_apxg_dcv_properties(model)
|
7020
|
-
return true
|
7021
|
-
end
|
7022
|
-
|
7023
7164
|
# Template method for setting DCV in baseline HVAC system if required
|
7024
7165
|
#
|
7025
7166
|
# @author Xuechen (Jerry) Lei, PNNL
|
7026
7167
|
# @param model [OpenStudio::Model::Model] OpenStudio model
|
7168
|
+
# @return [Boolean] returns true if successful, false if not
|
7027
7169
|
def model_set_baseline_demand_control_ventilation(model, climate_zone)
|
7028
7170
|
return true
|
7029
7171
|
end
|
@@ -7031,6 +7173,7 @@ class Standard
|
|
7031
7173
|
# Identify the return air type associated with each thermal zone
|
7032
7174
|
#
|
7033
7175
|
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
7176
|
+
# @return [Boolean] returns true if successful, false if not
|
7034
7177
|
def model_identify_return_air_type(model)
|
7035
7178
|
# air-loop based system
|
7036
7179
|
model.getThermalZones.each do |zone|
|
@@ -7100,10 +7243,16 @@ class Standard
|
|
7100
7243
|
return_air_type = 'ducted_return_or_direct_to_unit'
|
7101
7244
|
end
|
7102
7245
|
|
7246
|
+
# error if zone design air flow rate is not available
|
7247
|
+
if zone.model.version < OpenStudio::VersionString.new('3.6.0')
|
7248
|
+
OpenStudio.logFree(OpenStudio::Error, 'openstudio.Standards.Model', 'Required ThermalZone method .autosizedDesignAirFlowRate is not available in pre-OpenStudio 3.6.0 versions. Use a more recent version of OpenStudio.')
|
7249
|
+
end
|
7250
|
+
|
7103
7251
|
zone.additionalProperties.setFeature('return_air_type', return_air_type)
|
7104
7252
|
zone.additionalProperties.setFeature('plenum', return_plenum) unless return_plenum.nil?
|
7105
|
-
zone.additionalProperties.setFeature('proposed_model_zone_design_air_flow', zone.
|
7253
|
+
zone.additionalProperties.setFeature('proposed_model_zone_design_air_flow', zone.autosizedDesignAirFlowRate.to_f)
|
7106
7254
|
end
|
7255
|
+
return true
|
7107
7256
|
end
|
7108
7257
|
|
7109
7258
|
# Determine the baseline return air type associated with each zone
|
@@ -7173,8 +7322,9 @@ class Standard
|
|
7173
7322
|
# Add reporting tolerances. Default values are based on the suggestions from the PRM-RM.
|
7174
7323
|
#
|
7175
7324
|
# @param model [OpenStudio::Model::Model] OpenStudio Model
|
7176
|
-
# @param heating_tolerance_deg_f [
|
7177
|
-
# @param cooling_tolerance_deg_f [
|
7325
|
+
# @param heating_tolerance_deg_f [Double] Tolerance for time heating setpoint not met in degree F
|
7326
|
+
# @param cooling_tolerance_deg_f [Double] Tolerance for time cooling setpoint not met in degree F
|
7327
|
+
# @return [Boolean] returns true if successful, false if not
|
7178
7328
|
def model_add_reporting_tolerances(model, heating_tolerance_deg_f: 1.0, cooling_tolerance_deg_f: 1.0)
|
7179
7329
|
reporting_tolerances = model.getOutputControlReportingTolerances
|
7180
7330
|
heating_tolerance_deg_c = OpenStudio.convert(heating_tolerance_deg_f, 'R', 'K').get
|
@@ -7187,10 +7337,9 @@ class Standard
|
|
7187
7337
|
|
7188
7338
|
# Apply the standard construction to each surface in the model, based on the construction type currently assigned.
|
7189
7339
|
#
|
7190
|
-
# @return [Bool] true if successful, false if not
|
7191
7340
|
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
7192
7341
|
# @param climate_zone [String] ASHRAE climate zone, e.g. 'ASHRAE 169-2013-4A'
|
7193
|
-
# @return [
|
7342
|
+
# @return [Boolean] returns true if successful, false if not
|
7194
7343
|
def model_apply_constructions(model, climate_zone, wwr_building_type, wwr_info)
|
7195
7344
|
model_apply_standard_constructions(model, climate_zone, wwr_building_type: nil, wwr_info: {})
|
7196
7345
|
|
@@ -7199,6 +7348,7 @@ class Standard
|
|
7199
7348
|
|
7200
7349
|
# Generate baseline log to a specific file directory
|
7201
7350
|
# @param file_directory [String] file directory
|
7351
|
+
# @return [Boolean] returns true if successful, false if not
|
7202
7352
|
def generate_baseline_log(file_directory)
|
7203
7353
|
return true
|
7204
7354
|
end
|
@@ -7207,7 +7357,7 @@ class Standard
|
|
7207
7357
|
#
|
7208
7358
|
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
7209
7359
|
# @param climate_zone [String] ASHRAE climate zone, e.g. 'ASHRAE 169-2013-4A'
|
7210
|
-
# @return [
|
7360
|
+
# @return [Boolean] returns true if successful, false if not
|
7211
7361
|
def model_update_ground_temperature_profile(model, climate_zone)
|
7212
7362
|
return true
|
7213
7363
|
end
|