openstudio-standards 0.4.0 → 0.5.0.rc1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/data/inventory/thermal_bridging.csv +90 -0
- data/data/standards/OpenStudio_Standards-deer-comstock.xlsx +0 -0
- data/data/standards/manage_OpenStudio_Standards.rb +1 -1
- data/data/standards/test_performance_expected_dd_results.csv +2014 -1891
- data/lib/openstudio-standards/btap/analysis.rb +8 -8
- data/lib/openstudio-standards/btap/bridging.rb +664 -645
- data/lib/openstudio-standards/btap/btap.model.rb +14 -14
- data/lib/openstudio-standards/btap/btap.rb +7 -7
- data/lib/openstudio-standards/btap/btap_result.rb +1 -1
- data/lib/openstudio-standards/btap/economics.rb +23 -23
- data/lib/openstudio-standards/btap/envelope.rb +8 -8
- data/lib/openstudio-standards/btap/equest.rb +1 -1
- data/lib/openstudio-standards/btap/geometry.rb +2 -2
- data/lib/openstudio-standards/btap/mpc.rb +7 -7
- data/lib/openstudio-standards/btap/schedules.rb +1 -1
- data/lib/openstudio-standards/btap/simmanager.rb +4 -4
- data/lib/openstudio-standards/btap/spaceloads.rb +26 -26
- data/lib/openstudio-standards/btap/utilities.rb +6 -6
- data/lib/openstudio-standards/btap/vintagizer.rb +1 -1
- data/lib/openstudio-standards/constructions/information.rb +83 -0
- data/lib/openstudio-standards/constructions/materials/modify.rb +72 -0
- data/lib/openstudio-standards/constructions/modify.rb +80 -0
- data/lib/openstudio-standards/create_typical/create_typical.rb +983 -0
- data/lib/openstudio-standards/create_typical/enumerations.rb +484 -0
- data/lib/openstudio-standards/create_typical/space_type_blend.rb +791 -0
- data/lib/openstudio-standards/create_typical/space_type_ratios.rb +494 -0
- data/lib/openstudio-standards/daylighting/space.rb +47 -0
- data/lib/openstudio-standards/geometry/create.rb +801 -0
- data/lib/openstudio-standards/geometry/create_bar.rb +2171 -0
- data/lib/openstudio-standards/geometry/information.rb +462 -0
- data/lib/openstudio-standards/geometry/modify.rb +48 -0
- data/lib/openstudio-standards/hvac/air_loop/information.rb +79 -0
- data/lib/openstudio-standards/hvac/cbecs_hvac.rb +616 -0
- data/lib/openstudio-standards/hvac/setpoint_managers/information.rb +91 -0
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.Model.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.Model.rb +2 -2
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.hvac_systems.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.Model.rb +4 -36
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.hvac_systems.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Model.rb +4 -36
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Space.rb +3 -3
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.hvac_systems.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.Model.elevators.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.CoilHeatingGas.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.Model.elevators.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.College.rb +7 -7
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Courthouse.rb +8 -8
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.FullServiceRestaurant.rb +14 -14
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.HighRiseApartment.rb +9 -9
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Hospital.rb +16 -16
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Laboratory.rb +7 -7
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeDataCenterHighITE.rb +8 -8
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeDataCenterLowITE.rb +8 -8
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeHotel.rb +11 -11
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeOffice.rb +7 -7
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeOfficeDetailed.rb +9 -9
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.MediumOffice.rb +8 -8
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.MediumOfficeDetailed.rb +11 -11
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.MidriseApartment.rb +9 -9
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Outpatient.rb +19 -19
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.PrimarySchool.rb +10 -10
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.QuickServiceRestaurant.rb +13 -13
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.RetailStandalone.rb +6 -6
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.RetailStripmall.rb +6 -6
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SecondarySchool.rb +9 -9
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallDataCenterHighITE.rb +8 -8
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallDataCenterLowITE.rb +8 -8
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallHotel.rb +8 -8
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallOffice.rb +8 -8
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallOfficeDetailed.rb +11 -11
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SuperMarket.rb +10 -10
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SuperTallBuilding.rb +19 -19
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.TallBuilding.rb +18 -18
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Warehouse.rb +6 -6
- data/lib/openstudio-standards/prototypes/common/do_not_edit_metaclasses.rb +957 -957
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.AirConditionerVariableRefrigerantFlow.rb +1 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingWaterToAirHeatPumpEquationFit.rb +84 -16
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingDXSingleSpeed.rb +1 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingGas.rb +1 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingWaterToAirHeatPumpEquationFit.rb +61 -10
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.ControllerWaterCoil.rb +1 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoolingTower.rb +1 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.Fan.rb +1 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanConstantVolume.rb +1 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanOnOff.rb +1 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanVariableVolume.rb +1 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanZoneExhaust.rb +1 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.HeatExchangerAirToAirSensibleAndLatent.rb +2 -2
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.exterior_lights.rb +4 -4
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.hvac.rb +4 -4
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.rb +43 -30
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.swh.rb +1 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.ServiceWaterHeating.rb +18 -11
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.SizingSystem.rb +1 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.hvac_systems.rb +774 -117
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.radiant_system_controls.rb +340 -481
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.refrigeration.rb +3 -3
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.utilities.rb +3 -3
- data/lib/openstudio-standards/prototypes/common/prototype_metaprogramming.rb +22 -22
- data/lib/openstudio-standards/prototypes/deer/deer.Model.rb +1 -1
- data/lib/openstudio-standards/qaqc/calibration.rb +131 -0
- data/lib/openstudio-standards/qaqc/create_results.rb +983 -0
- data/lib/openstudio-standards/qaqc/envelope.rb +399 -0
- data/lib/openstudio-standards/qaqc/eui.rb +213 -0
- data/lib/openstudio-standards/qaqc/hvac.rb +1943 -0
- data/lib/openstudio-standards/qaqc/internal_loads.rb +568 -0
- data/lib/openstudio-standards/qaqc/reporting.rb +141 -0
- data/lib/openstudio-standards/qaqc/schedules.rb +129 -0
- data/lib/openstudio-standards/qaqc/service_water_heating.rb +273 -0
- data/lib/openstudio-standards/qaqc/weather_files.rb +497 -0
- data/lib/openstudio-standards/qaqc/zone_conditions.rb +278 -0
- data/lib/openstudio-standards/schedules/create.rb +364 -0
- data/lib/openstudio-standards/schedules/information.rb +169 -0
- data/lib/openstudio-standards/schedules/modify.rb +445 -0
- data/lib/openstudio-standards/standards/Standards.AirLoopHVAC.rb +110 -71
- data/lib/openstudio-standards/standards/Standards.AirTerminalSingleDuctParallelPIUReheat.rb +3 -3
- data/lib/openstudio-standards/standards/Standards.AirTerminalSingleDuctVAVReheat.rb +4 -4
- data/lib/openstudio-standards/standards/Standards.BoilerHotWater.rb +2 -1
- data/lib/openstudio-standards/standards/Standards.ChillerElectricEIR.rb +16 -10
- data/lib/openstudio-standards/standards/Standards.CoilCoolingDXSingleSpeed.rb +4 -4
- data/lib/openstudio-standards/standards/Standards.CoilCoolingDXTwoSpeed.rb +1 -1
- data/lib/openstudio-standards/standards/Standards.CoilCoolingWaterToAirHeatPumpEquationFit.rb +1 -1
- data/lib/openstudio-standards/standards/Standards.CoilDX.rb +4 -4
- data/lib/openstudio-standards/standards/Standards.CoilHeatingDXMultiSpeed.rb +1 -1
- data/lib/openstudio-standards/standards/Standards.CoilHeatingDXSingleSpeed.rb +5 -5
- data/lib/openstudio-standards/standards/Standards.CoilHeatingGas.rb +1 -1
- data/lib/openstudio-standards/standards/Standards.CoilHeatingGasMultiStage.rb +1 -1
- data/lib/openstudio-standards/standards/Standards.CoilHeatingWaterToAirHeatPumpEquationFit.rb +1 -1
- data/lib/openstudio-standards/standards/Standards.Construction.rb +17 -18
- data/lib/openstudio-standards/standards/Standards.CoolingTower.rb +6 -6
- data/lib/openstudio-standards/standards/Standards.CoolingTowerSingleSpeed.rb +1 -1
- data/lib/openstudio-standards/standards/Standards.CoolingTowerTwoSpeed.rb +1 -1
- data/lib/openstudio-standards/standards/Standards.CoolingTowerVariableSpeed.rb +1 -1
- data/lib/openstudio-standards/standards/Standards.Fan.rb +6 -12
- data/lib/openstudio-standards/standards/Standards.FanVariableVolume.rb +2 -2
- data/lib/openstudio-standards/standards/Standards.FluidCooler.rb +1 -1
- data/lib/openstudio-standards/standards/Standards.HeaderedPumpsVariableSpeed.rb +1 -1
- data/lib/openstudio-standards/standards/Standards.HeatExchangerSensLat.rb +3 -3
- data/lib/openstudio-standards/standards/Standards.Model.rb +411 -261
- data/lib/openstudio-standards/standards/Standards.PlanarSurface.rb +2 -2
- data/lib/openstudio-standards/standards/Standards.PlantLoop.rb +94 -29
- data/lib/openstudio-standards/standards/Standards.Pump.rb +2 -2
- data/lib/openstudio-standards/standards/Standards.ScheduleConstant.rb +2 -2
- data/lib/openstudio-standards/standards/Standards.ScheduleRuleset.rb +14 -14
- data/lib/openstudio-standards/standards/Standards.Space.rb +37 -30
- data/lib/openstudio-standards/standards/Standards.SpaceType.rb +38 -29
- data/lib/openstudio-standards/standards/Standards.SubSurface.rb +7 -7
- data/lib/openstudio-standards/standards/Standards.Surface.rb +13 -13
- data/lib/openstudio-standards/standards/Standards.ThermalZone.rb +109 -66
- data/lib/openstudio-standards/standards/Standards.WaterHeaterMixed.rb +11 -4
- data/lib/openstudio-standards/standards/Standards.ZoneHVACComponent.rb +6 -6
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.AirLoopHVAC.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.PlantLoop.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.Space.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.Space.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.AirLoopHVAC.rb +4 -4
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.Space.rb +4 -4
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirLoopHVAC.rb +4 -4
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.CoolingTowerVariableSpeed.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.Model.rb +5 -21
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.Space.rb +4 -4
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.WaterHeaterMixed.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.ZoneHVACComponent.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.AirLoopHVAC.rb +36 -4
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.CoolingTowerVariableSpeed.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.Space.rb +4 -4
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.ZoneHVACComponent.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/comstock_ashrae_90_1_2016/comstock_ashrae_90_1_2016.AirLoopHVAC.rb +26 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirLoopHVAC.rb +53 -10
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.CoolingTowerVariableSpeed.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Space.rb +6 -6
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.ZoneHVACComponent.rb +2 -2
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/comstock_ashrae_90_1_2019/comstock_ashrae_90_1_2019.AirLoopHVAC.rb +26 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.curves.json +211 -211
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.economizers.json +14 -14
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.AirLoopHVAC.rb +4 -4
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.Model.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.PlantLoop.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.economizers.json +14 -14
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.AirLoopHVAC.rb +4 -4
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.Model.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.PlantLoop.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.AirLoopHVAC.rb +6 -6
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.CoolingTowerVariableSpeed.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.PlantLoop.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.Space.rb +4 -4
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirLoopHVAC.rb +6 -6
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.CoolingTowerVariableSpeed.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.PlantLoop.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.Space.rb +4 -4
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.AirLoopHVAC.rb +22 -28
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.AirTerminalSingleDuctParallelPIUReheat.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.AirTerminalSingleDuctVAVReheat.rb +2 -2
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.BoilerHotWater.rb +1 -74
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.ChillerElectricEIR.rb +7 -59
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilCoolingDXSingleSpeed.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilCoolingDXTwoSpeed.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilDX.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilHeatingDXSingleSpeed.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilHeatingGas.rb +1 -21
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.DesignSpecificationOutdoorAir.rb +101 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.FanConstantVolume.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.FanOnOff.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.FanVariableVolume.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.HeatExchangerSensLat.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.Model.rb +643 -526
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.PlanarSurface.rb +8 -2
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.PlantLoop.rb +17 -77
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.Space.rb +74 -16
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.SpaceType.rb +96 -44
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.Surface.rb +6 -6
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.ThermalZone.rb +18 -6
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.ZoneHVACComponent.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.rb +328 -74
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/ashrae_90_1_prm_2019.Model.rb +0 -118
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/ashrae_90_1_prm_2019.rb +2 -1
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.heat_rejection.json +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/baseline_outdoor_air.md +35 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/set_plug_load_measures.md +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/ashrae_90_1_prm.UserData.rb +228 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_enums.rb +131 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_space.csv +1 -1
- data/lib/openstudio-standards/standards/cbes/cbes.AirLoopHVAC.rb +5 -5
- data/lib/openstudio-standards/standards/cbes/cbes.Model.rb +1 -1
- data/lib/openstudio-standards/standards/cbes/cbes.PlantLoop.rb +1 -1
- data/lib/openstudio-standards/standards/cbes/cbes.Space.rb +1 -1
- data/lib/openstudio-standards/standards/cbes/cbes_t24_2005/cbes_t24_2005.Space.rb +1 -1
- data/lib/openstudio-standards/standards/cbes/cbes_t24_2008/cbes_t24_2008.Space.rb +1 -1
- data/lib/openstudio-standards/standards/deer/deer.AirLoopHVAC.rb +109 -27
- data/lib/openstudio-standards/standards/deer/deer.Space.rb +1 -1
- data/lib/openstudio-standards/standards/deer/deer_1985/data/deer_1985.economizers.json +246 -4
- data/lib/openstudio-standards/standards/deer/deer_1996/data/deer_1996.economizers.json +246 -4
- data/lib/openstudio-standards/standards/deer/deer_2003/data/deer_2003.economizers.json +246 -4
- data/lib/openstudio-standards/standards/deer/deer_2003/deer_2003.ThermalZone.rb +18 -18
- data/lib/openstudio-standards/standards/deer/deer_2007/data/deer_2007.economizers.json +246 -4
- data/lib/openstudio-standards/standards/deer/deer_2007/deer_2007.ThermalZone.rb +18 -18
- data/lib/openstudio-standards/standards/deer/deer_2011/data/deer_2011.economizers.json +246 -4
- data/lib/openstudio-standards/standards/deer/deer_2011/deer_2011.ThermalZone.rb +18 -18
- data/lib/openstudio-standards/standards/deer/deer_2014/data/deer_2014.economizers.json +248 -6
- data/lib/openstudio-standards/standards/deer/deer_2014/deer_2014.Space.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2014/deer_2014.ThermalZone.rb +18 -18
- data/lib/openstudio-standards/standards/deer/deer_2015/data/deer_2015.economizers.json +248 -6
- data/lib/openstudio-standards/standards/deer/deer_2015/deer_2015.Space.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2015/deer_2015.ThermalZone.rb +18 -18
- data/lib/openstudio-standards/standards/deer/deer_2017/data/deer_2017.economizers.json +248 -6
- data/lib/openstudio-standards/standards/deer/deer_2017/deer_2017.Space.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2017/deer_2017.ThermalZone.rb +18 -18
- data/lib/openstudio-standards/standards/deer/deer_2020/data/deer_2020.economizers.json +248 -6
- data/lib/openstudio-standards/standards/deer/deer_2020/deer_2020.AirLoopHVAC.rb +18 -5
- data/lib/openstudio-standards/standards/deer/deer_2020/deer_2020.FanVariableVolume.rb +1 -1
- data/lib/openstudio-standards/standards/deer/deer_2020/deer_2020.Space.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2020/deer_2020.ThermalZone.rb +18 -18
- data/lib/openstudio-standards/standards/deer/deer_2025/data/deer_2025.economizers.json +248 -6
- data/lib/openstudio-standards/standards/deer/deer_2025/deer_2025.AirLoopHVAC.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2025/deer_2025.FanVariableVolume.rb +1 -1
- data/lib/openstudio-standards/standards/deer/deer_2025/deer_2025.Space.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2030/data/deer_2030.economizers.json +248 -6
- data/lib/openstudio-standards/standards/deer/deer_2030/data/deer_2030.heat_pumps.json +2 -2
- data/lib/openstudio-standards/standards/deer/deer_2030/deer_2030.AirLoopHVAC.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2030/deer_2030.FanVariableVolume.rb +1 -1
- data/lib/openstudio-standards/standards/deer/deer_2030/deer_2030.Space.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2035/data/deer_2035.economizers.json +248 -6
- data/lib/openstudio-standards/standards/deer/deer_2035/deer_2035.AirLoopHVAC.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2035/deer_2035.FanVariableVolume.rb +1 -1
- data/lib/openstudio-standards/standards/deer/deer_2035/deer_2035.Space.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2040/data/deer_2040.economizers.json +248 -6
- data/lib/openstudio-standards/standards/deer/deer_2040/deer_2040.AirLoopHVAC.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2040/deer_2040.FanVariableVolume.rb +1 -1
- data/lib/openstudio-standards/standards/deer/deer_2040/deer_2040.Space.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2045/data/deer_2045.economizers.json +260 -0
- data/lib/openstudio-standards/standards/deer/deer_2045/deer_2045.AirLoopHVAC.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2045/deer_2045.FanVariableVolume.rb +1 -1
- data/lib/openstudio-standards/standards/deer/deer_2045/deer_2045.Space.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2050/data/deer_2050.economizers.json +248 -6
- data/lib/openstudio-standards/standards/deer/deer_2050/deer_2050.AirLoopHVAC.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2050/deer_2050.FanVariableVolume.rb +1 -1
- data/lib/openstudio-standards/standards/deer/deer_2050/deer_2050.Space.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2055/data/deer_2055.economizers.json +248 -6
- data/lib/openstudio-standards/standards/deer/deer_2055/deer_2055.AirLoopHVAC.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2055/deer_2055.FanVariableVolume.rb +1 -1
- data/lib/openstudio-standards/standards/deer/deer_2055/deer_2055.Space.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2060/data/deer_2060.economizers.json +248 -6
- data/lib/openstudio-standards/standards/deer/deer_2060/deer_2060.AirLoopHVAC.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2060/deer_2060.FanVariableVolume.rb +1 -1
- data/lib/openstudio-standards/standards/deer/deer_2060/deer_2060.Space.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2065/data/deer_2065.economizers.json +248 -6
- data/lib/openstudio-standards/standards/deer/deer_2065/deer_2065.AirLoopHVAC.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2065/deer_2065.FanVariableVolume.rb +1 -1
- data/lib/openstudio-standards/standards/deer/deer_2065/deer_2065.Space.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2070/data/deer_2070.economizers.json +248 -6
- data/lib/openstudio-standards/standards/deer/deer_2070/deer_2070.AirLoopHVAC.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2070/deer_2070.FanVariableVolume.rb +1 -1
- data/lib/openstudio-standards/standards/deer/deer_2070/deer_2070.Space.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2075/data/deer_2075.economizers.json +248 -6
- data/lib/openstudio-standards/standards/deer/deer_2075/deer_2075.AirLoopHVAC.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2075/deer_2075.FanVariableVolume.rb +1 -1
- data/lib/openstudio-standards/standards/deer/deer_2075/deer_2075.Space.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_pre_1975/data/deer_pre_1975.economizers.json +246 -4
- data/lib/openstudio-standards/standards/necb/BTAP1980TO2010/data/space_types.json +447 -223
- data/lib/openstudio-standards/standards/necb/BTAPPRE1980/building_envelope.rb +1 -1
- data/lib/openstudio-standards/standards/necb/BTAPPRE1980/data/space_types.json +447 -223
- data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_systems.rb +5 -2
- data/lib/openstudio-standards/standards/necb/ECMS/data/chiller_types.json +25 -0
- data/lib/openstudio-standards/standards/necb/ECMS/data/chillers.json +44 -0
- data/lib/openstudio-standards/standards/necb/ECMS/data/curves.json +225 -0
- data/lib/openstudio-standards/standards/necb/ECMS/ecms.rb +2 -2
- data/lib/openstudio-standards/standards/necb/ECMS/hvac_systems.rb +193 -73
- data/lib/openstudio-standards/standards/necb/ECMS/pv_ground.rb +1 -1
- data/lib/openstudio-standards/standards/necb/NECB2011/autozone.rb +10 -4
- data/lib/openstudio-standards/standards/necb/NECB2011/beps_compliance_path.rb +7 -7
- data/lib/openstudio-standards/standards/necb/NECB2011/building_envelope.rb +4 -5
- data/lib/openstudio-standards/standards/necb/NECB2011/data/chiller_types.json +32 -0
- data/lib/openstudio-standards/standards/necb/NECB2011/data/chillers.json +1 -1
- data/lib/openstudio-standards/standards/necb/NECB2011/data/constants.json +36 -0
- data/lib/openstudio-standards/standards/necb/NECB2011/data/fuel_type_sets.json +7 -7
- data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/NorthernEducation.osm +47587 -0
- data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/NorthernHealthCare.osm +49764 -0
- data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/Warehouse.osm +283 -297
- data/lib/openstudio-standards/standards/necb/NECB2011/data/space_type_unit_definitions.txt +2 -1
- data/lib/openstudio-standards/standards/necb/NECB2011/data/space_types.json +447 -223
- data/lib/openstudio-standards/standards/necb/NECB2011/data/standards_data.rb +3 -3
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_1_multi_speed.rb +1 -1
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_systems.rb +49 -27
- data/lib/openstudio-standards/standards/necb/NECB2011/necb_2011.rb +400 -202
- data/lib/openstudio-standards/standards/necb/NECB2011/service_water_heating.rb +4 -4
- data/lib/openstudio-standards/standards/necb/NECB2015/data/space_types.json +637 -318
- data/lib/openstudio-standards/standards/necb/NECB2015/hvac_systems.rb +18 -1
- data/lib/openstudio-standards/standards/necb/NECB2015/necb_2015.rb +3 -3
- data/lib/openstudio-standards/standards/necb/NECB2017/data/space_types.json +637 -318
- data/lib/openstudio-standards/standards/necb/NECB2017/hvac_systems.rb +1 -1
- data/lib/openstudio-standards/standards/necb/NECB2017/necb_2017.rb +3 -3
- data/lib/openstudio-standards/standards/necb/NECB2020/building_envelope.rb +1 -1
- data/lib/openstudio-standards/standards/necb/NECB2020/data/space_types.json +615 -307
- data/lib/openstudio-standards/standards/necb/NECB2020/service_water_heating.rb +4 -4
- data/lib/openstudio-standards/standards/necb/common/btap_data.rb +10 -5
- data/lib/openstudio-standards/standards/necb/common/btap_datapoint.rb +1 -1
- data/lib/openstudio-standards/utilities/assertion.rb +128 -0
- data/lib/openstudio-standards/utilities/logging.rb +2 -3
- data/lib/openstudio-standards/utilities/object_info.rb +39 -18
- data/lib/openstudio-standards/utilities/schedule_translator.rb +8 -6
- data/lib/openstudio-standards/utilities/simulation.rb +24 -11
- data/lib/openstudio-standards/utilities/sqlfile.rb +10 -5
- data/lib/openstudio-standards/version.rb +1 -1
- data/lib/openstudio-standards/weather/Weather.Model.rb +8 -9
- data/lib/openstudio-standards/weather/Weather.stat_file.rb +3 -3
- data/lib/openstudio-standards/weather/information.rb +35 -0
- data/lib/openstudio-standards.rb +69 -5
- metadata +52 -16
- data/data/standards/OpenStudio_Standards-deer-ALL-comstock(space_types).xlsx +0 -0
- data/lib/openstudio-standards/hvac_sizing/Siz.AirLoopHVAC.rb +0 -59
- data/lib/openstudio-standards/hvac_sizing/Siz.CoilCoolingWater.rb +0 -13
- data/lib/openstudio-standards/hvac_sizing/Siz.HVACComponent.rb +0 -36
- data/lib/openstudio-standards/hvac_sizing/Siz.HeatingCoolingFuels.rb +0 -898
- data/lib/openstudio-standards/hvac_sizing/Siz.Model.rb +0 -126
- data/lib/openstudio-standards/hvac_sizing/Siz.ThermalZone.rb +0 -356
- data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.Model.rb +0 -35
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoolingTower.rb +0 -110
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoolingTowerVariableSpeed.rb +0 -5
|
@@ -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
|