openstudio-standards 0.2.10 → 0.2.11.rc1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/data/geometry/ASHRAE90120042007LargeHotel.osm +101 -0
- data/data/geometry/ASHRAE90120042007RetailStandalone.osm +220 -0
- data/data/geometry/ASHRAE9012010LargeHotel.osm +101 -0
- data/data/geometry/ASHRAE9012010RetailStandalone.osm +218 -32
- data/data/geometry/ASHRAE9012013FullServiceRestaurant.osm +17 -0
- data/data/geometry/ASHRAE9012013Hospital.osm +288 -0
- data/data/geometry/ASHRAE9012013LargeHotel.osm +113 -12
- data/data/geometry/ASHRAE9012013LargeOffice.osm +205 -1
- data/data/geometry/ASHRAE9012013MediumOffice.osm +103 -1
- data/data/geometry/ASHRAE9012013Outpatient.osm +390 -102
- data/data/geometry/ASHRAE9012013PrimarySchool.osm +424 -0
- data/data/geometry/ASHRAE9012013QuickServiceRestaurant.osm +16 -0
- data/data/geometry/ASHRAE9012013RetailStandalone.osm +220 -0
- data/data/geometry/ASHRAE9012013SecondarySchool.osm +543 -0
- data/data/geometry/ASHRAE9012013SmallHotel.osm +50 -0
- data/data/geometry/ASHRAE9012013SmallOffice.osm +33 -0
- data/data/geometry/ASHRAE9012013Warehouse.osm +475 -238
- data/data/geometry/ASHRAEFullServiceRestaurant.osm +16 -0
- data/data/geometry/ASHRAEHospital.osm +288 -0
- data/data/geometry/ASHRAELargeOffice.osm +205 -1
- data/data/geometry/ASHRAELargeOfficeDetailed.osm +32 -32
- data/data/geometry/ASHRAEMediumOffice.osm +103 -1
- data/data/geometry/ASHRAEOutpatient.osm +390 -102
- data/data/geometry/ASHRAEPrimarySchool.osm +424 -0
- data/data/geometry/ASHRAEQuickServiceRestaurant.osm +16 -0
- data/data/geometry/ASHRAESecondarySchool.osm +1011 -162
- data/data/geometry/ASHRAESmallHotel.osm +50 -0
- data/data/geometry/ASHRAESmallOffice.osm +33 -0
- data/data/geometry/ASHRAEWarehouse.osm +476 -238
- data/data/standards/manage_OpenStudio_Standards.rb +1 -1
- data/data/standards/openstudio_standards_duplicates_log.csv +16 -0
- data/data/standards/test_performance_expected_dd_results.csv +1216 -1216
- data/data/weather/ARE_Abu.Dhabi.412170_IWEC.ddy +536 -0
- data/data/weather/ARE_Abu.Dhabi.412170_IWEC.epw +8768 -0
- data/data/weather/ARE_Abu.Dhabi.412170_IWEC.stat +544 -0
- data/data/weather/ARE_Dubai.Intl.AP.411940_IWEC2.ddy +533 -0
- data/data/weather/ARE_Dubai.Intl.AP.411940_IWEC2.epw +8768 -0
- data/data/weather/ARE_Dubai.Intl.AP.411940_IWEC2.stat +553 -0
- data/data/weather/VNM_Hanoi.488200_IWEC.ddy +533 -0
- data/data/weather/VNM_Hanoi.488200_IWEC.epw +8768 -0
- data/data/weather/VNM_Hanoi.488200_IWEC.stat +544 -0
- data/data/weather/VNM_Ho.Chi.Minh.City-Tan.Son.Nhat.AP.489000_IWEC2.ddy +533 -0
- data/data/weather/VNM_Ho.Chi.Minh.City-Tan.Son.Nhat.AP.489000_IWEC2.epw +8768 -0
- data/data/weather/VNM_Ho.Chi.Minh.City-Tan.Son.Nhat.AP.489000_IWEC2.stat +546 -0
- data/lib/openstudio-standards.rb +27 -0
- data/lib/openstudio-standards/btap/btap.model.rb +4 -4
- data/lib/openstudio-standards/btap/btap_result.rb +8 -8
- data/lib/openstudio-standards/btap/economics.rb +11 -11
- data/lib/openstudio-standards/btap/envelope.rb +5 -5
- data/lib/openstudio-standards/btap/hvac.rb +55 -11
- data/lib/openstudio-standards/btap/measures.rb +7 -7
- data/lib/openstudio-standards/btap/spaceloads.rb +4 -4
- data/lib/openstudio-standards/hvac_sizing/Siz.AirLoopHVAC.rb +105 -1
- data/lib/openstudio-standards/hvac_sizing/Siz.ControllerOutdoorAir.rb +2 -2
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.AirTerminalSingleDuctVAVReheat.rb +0 -8
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.AirTerminalSingleDuctVAVReheat.rb +0 -8
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.AirTerminalSingleDuctVAVReheat.rb +0 -8
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirTerminalSingleDuctVAVReheat.rb +0 -8
- data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.AirTerminalSingleDuctVAVReheat.rb +6 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.HeatExchangerAirToAirSensibleAndLatent.rb +9 -0
- data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.Model.rb +3 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirTerminalSingleDuctVAVReheat.rb +22 -0
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.FanConstantVolume.rb +32 -0
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.FanOnOff.rb +33 -0
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.FanVariableVolume.rb +32 -0
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.HeatExchangerAirToAirSensibleAndLatent.rb +9 -0
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.Model.elevators.rb +25 -0
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.Model.rb +35 -0
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.hvac_systems.rb +11 -0
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Hospital.rb +17 -3
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeHotel.rb +9 -0
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeOffice.rb +9 -0
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeOfficeDetailed.rb +22 -3
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.MediumOffice.rb +9 -0
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.MediumOfficeDetailed.rb +9 -0
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Outpatient.rb +107 -5
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.PrimarySchool.rb +9 -0
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.RetailStandalone.rb +3 -0
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SecondarySchool.rb +9 -0
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.AirTerminalSingleDuctVAVReheat.rb +0 -8
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingDXTwoSpeed.rb +2 -2
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingDXSingleSpeed.rb +2 -4
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.HeatExchangerAirToAirSensibleAndLatent.rb +15 -4
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.exterior_lights.rb +2 -2
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.rb +45 -5
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.ServiceWaterHeating.rb +1 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.SizingSystem.rb +21 -2
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.hvac_systems.rb +251 -364
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.radiant_system_controls.rb +4 -0
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.refrigeration.rb +4 -5
- data/lib/openstudio-standards/refs/references.rb +4 -0
- data/lib/openstudio-standards/standards/Standards.AirLoopHVAC.rb +283 -97
- data/lib/openstudio-standards/standards/Standards.AirTerminalSingleDuctParallelPIUReheat.rb +2 -2
- data/lib/openstudio-standards/standards/Standards.BuildingStory.rb +1 -1
- data/lib/openstudio-standards/standards/Standards.ChillerElectricEIR.rb +1 -1
- data/lib/openstudio-standards/standards/Standards.CoilCoolingDXSingleSpeed.rb +1 -1
- data/lib/openstudio-standards/standards/Standards.CoilCoolingDXTwoSpeed.rb +5 -5
- data/lib/openstudio-standards/standards/Standards.CoilDX.rb +3 -1
- data/lib/openstudio-standards/standards/Standards.CoilHeatingGasMultiStage.rb +1 -1
- data/lib/openstudio-standards/standards/Standards.Construction.rb +53 -45
- data/lib/openstudio-standards/standards/Standards.Fan.rb +10 -2
- data/lib/openstudio-standards/standards/Standards.FanVariableVolume.rb +4 -4
- data/lib/openstudio-standards/standards/Standards.HeatExchangerSensLat.rb +1 -1
- data/lib/openstudio-standards/standards/Standards.Model.rb +39 -18
- data/lib/openstudio-standards/standards/Standards.PlanarSurface.rb +8 -8
- data/lib/openstudio-standards/standards/Standards.PlantLoop.rb +12 -12
- data/lib/openstudio-standards/standards/Standards.ScheduleConstant.rb +1 -1
- data/lib/openstudio-standards/standards/Standards.ScheduleRuleset.rb +2 -2
- data/lib/openstudio-standards/standards/Standards.Space.rb +190 -181
- data/lib/openstudio-standards/standards/Standards.SpaceType.rb +36 -59
- data/lib/openstudio-standards/standards/Standards.SubSurface.rb +3 -3
- data/lib/openstudio-standards/standards/Standards.Surface.rb +1 -1
- data/lib/openstudio-standards/standards/Standards.ThermalZone.rb +16 -12
- data/lib/openstudio-standards/standards/Standards.WaterHeaterMixed.rb +1 -1
- data/lib/openstudio-standards/standards/Standards.ZoneHVACComponent.rb +16 -5
- 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/comstock_ashrae_90_1_2004/data/ashrae_90_1.schedules.json +159 -8
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/comstock_ashrae_90_1_2004/data/comstock_ashrae_90_1_2004.spc_typ.json +1354 -1075
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.construction_properties.json +557 -17
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.economizers.json +28 -28
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.ground_temperatures.json +36 -36
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.spc_typ.json +233 -6
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/comstock_ashrae_90_1_2007/data/ashrae_90_1.schedules.json +159 -8
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/comstock_ashrae_90_1_2007/data/comstock_ashrae_90_1_2007.spc_typ.json +1356 -1077
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.construction_properties.json +480 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.economizers.json +28 -28
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.ground_temperatures.json +36 -36
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.spc_typ.json +241 -14
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.AirLoopHVAC.rb +0 -8
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.Space.rb +12 -7
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/comstock_ashrae_90_1_2010/data/ashrae_90_1.schedules.json +159 -8
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/comstock_ashrae_90_1_2010/data/comstock_ashrae_90_1_2010.spc_typ.json +1367 -1087
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.construction_properties.json +480 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.ground_temperatures.json +36 -36
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.spc_typ.json +233 -5
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirLoopHVAC.rb +20 -27
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.Space.rb +8 -3
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/comstock_ashrae_90_1_2013/data/ashrae_90_1.schedules.json +159 -8
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/comstock_ashrae_90_1_2013/data/comstock_ashrae_90_1_2013.spc_typ.json +1432 -1138
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.construction_properties.json +480 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.ground_temperatures.json +36 -36
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.spc_typ.json +241 -5
- data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.climate_zone_sets.json +37 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.climate_zones.json +39 -15
- data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.constructions.json +489 -7
- data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.curves.json +250 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.fans.json +12 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.materials.json +1920 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.schedules.json +5265 -9
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/comstock_doe_ref_1980_2004/data/ashrae_90_1.schedules.json +159 -8
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/comstock_doe_ref_1980_2004/data/comstock_doe_ref_1980_2004.spc_typ.json +2441 -1925
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.construction_properties.json +16658 -2578
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.spc_typ.json +212 -8
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.Model.rb +11 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/comstock_doe_ref_pre_1980/data/ashrae_90_1.schedules.json +159 -8
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/comstock_doe_ref_pre_1980/data/comstock_doe_ref_pre_1980.spc_typ.json +2403 -1889
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.construction_properties.json +16664 -2584
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.spc_typ.json +209 -7
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.Model.rb +11 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/data/nrel_zne_ready_2017.construction_properties.json +4113 -513
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/data/nrel_zne_ready_2017.construction_sets.json +40 -40
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/data/nrel_zne_ready_2017.elevators.json +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/data/nrel_zne_ready_2017.ground_temperatures.json +650 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/data/nrel_zne_ready_2017.heat_pumps.json +90 -2
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/data/nrel_zne_ready_2017.heat_pumps_heating.json +25 -5
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/data/nrel_zne_ready_2017.spc_typ.json +1909 -32
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/data/nrel_zne_ready_2017.water_heaters.json +8 -8
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.AirLoopHVAC.rb +147 -155
- 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.HeatExchangerSensLat.rb +29 -10
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.Model.rb +4 -4
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.PlantLoop.rb +45 -73
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.ZoneHVACComponent.rb +4 -72
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.boilers.json +20 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.chillers.json +400 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.construction_properties.json +4444 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.construction_sets.json +391 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.economizers.json +536 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.elevators.json +36 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.ext_ltg.json +169 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.ground_temperatures.json +650 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.heat_pumps.json +290 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.heat_pumps_heating.json +164 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.heat_rejection.json +40 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.motors.json +274 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.prototype_inputs.json +704 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.refrigeration_compressors.json +22 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.spc_typ.json +6424 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.unitary_acs.json +142 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.water_heaters.json +72 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.water_source_heat_pumps.json +31 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.water_source_heat_pumps_heating.json +13 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirLoopHVAC.rb +829 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirTerminalSingleDuctVAVReheat.rb +24 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.CoolingTower.rb +19 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.CoolingTowerSingleSpeed.rb +5 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.CoolingTowerTwoSpeed.rb +5 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.CoolingTowerVariableSpeed.rb +16 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.FanVariableVolume.rb +37 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.HeatExchangerSensLat.rb +34 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.Model.rb +80 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.PlantLoop.rb +68 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.Space.rb +146 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.ThermalZone.rb +23 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.ZoneHVACComponent.rb +8 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.rb +16 -0
- data/lib/openstudio-standards/standards/deer/deer_1985/data/deer_1985.heat_pumps_heating.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_1996/data/deer_1996.economizers.json +18 -0
- data/lib/openstudio-standards/standards/deer/deer_1996/data/deer_1996.heat_pumps_heating.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2003/data/deer_2003.heat_pumps_heating.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2007/data/deer_2007.heat_pumps_heating.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2011/data/deer_2011.heat_pumps_heating.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2014/data/deer_2014.heat_pumps_heating.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2015/data/deer_2015.heat_pumps_heating.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2017/data/deer_2017.heat_pumps_heating.json +1 -1
- data/lib/openstudio-standards/standards/deer/deer_2020/data/deer_2020.heat_pumps_heating.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2025/data/deer_2025.heat_pumps_heating.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2030/data/deer_2030.heat_pumps_heating.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2035/data/deer_2035.heat_pumps_heating.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2040/data/deer_2040.heat_pumps_heating.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2045/data/deer_2045.heat_pumps_heating.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2050/data/deer_2050.heat_pumps_heating.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2055/data/deer_2055.heat_pumps_heating.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2060/data/deer_2060.heat_pumps_heating.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2065/data/deer_2065.heat_pumps_heating.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2070/data/deer_2070.heat_pumps_heating.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2075/data/deer_2075.heat_pumps_heating.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_pre_1975/data/deer_pre_1975.heat_pumps_heating.json +5 -5
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_1_multi_speed.rb +5 -1
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_3_and_8_multi_speed.rb +5 -1
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_6.rb +5 -2
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_systems.rb +8 -2
- data/lib/openstudio-standards/standards/necb/NECB2011/qaqc/necb_qaqc.rb +12 -12
- data/lib/openstudio-standards/version.rb +1 -1
- data/lib/openstudio-standards/weather/Weather.Model.rb +4 -0
- metadata +102 -18
- data/data/standards/OpenStudio_Standards-ashrae_90_1(space_types).xlsx +0 -0
- data/data/standards/OpenStudio_Standards-ashrae_90_1-ALL-comstock(space_types).xlsx +0 -0
- data/data/standards/OpenStudio_Standards-ashrae_90_1.xlsx +0 -0
- data/data/standards/OpenStudio_Standards-cbes(space_types).xlsx +0 -0
- data/data/standards/OpenStudio_Standards-cbes.xlsx +0 -0
- data/data/standards/OpenStudio_Standards-deer(space_types).xlsx +0 -0
- data/data/standards/OpenStudio_Standards-deer-ALL-comstock(space_types).xlsx +0 -0
- data/data/standards/OpenStudio_Standards-deer.xlsx +0 -0
- data/data/standards/OpenStudio_Standards_LA100.xlsx +0 -0
- data/data/standards/junk/legacy_dd_results - Copy.csv +0 -960
- data/data/standards/junk/legacy_dd_results.csv +0 -960
- data/data/standards/junk/legacy_dd_results_new - Copy.csv +0 -960
- data/data/standards/junk/legacy_dd_results_new.csv +0 -960
- data/data/standards/junk/legacy_dd_results_original.csv +0 -960
- data/lib/openstudio-standards/standards/necb/NECB2011/newway.json +0 -8102
data/lib/openstudio-standards/prototypes/common/objects/Prototype.radiant_system_controls.rb
CHANGED
@@ -307,6 +307,10 @@ class Standard
|
|
307
307
|
surfaces << surface if surface.surfaceType == surface_type
|
308
308
|
end
|
309
309
|
end
|
310
|
+
if surfaces.empty?
|
311
|
+
OpenStudio.logFree(OpenStudio::Error, 'openstudio.Model.Model', "Zone #{zone.name} does not have floor surfaces; cannot add radiant system.")
|
312
|
+
return false
|
313
|
+
end
|
310
314
|
zone_floor = surfaces.sort_by { |s| s.grossArea }[-1]
|
311
315
|
zone_srf_temp = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Surface Inside Face Temperature')
|
312
316
|
zone_srf_temp.setName("#{zone_name}_Srf_Temp")
|
@@ -524,19 +524,20 @@ class Standard
|
|
524
524
|
}
|
525
525
|
props_lineup = model_find_object(standards_data['refrigeration_system_lineup'], search_criteria)
|
526
526
|
if props_lineup.nil?
|
527
|
-
OpenStudio.logFree(OpenStudio::
|
527
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.Model.Model', "No refrigeration system lineup found for #{search_criteria}, no system will be added.")
|
528
528
|
next
|
529
529
|
end
|
530
530
|
number_of_display_cases = props_lineup['number_of_display_cases']
|
531
531
|
number_of_walkins = props_lineup['number_of_walkins']
|
532
532
|
compressor_name = props_lineup['compressor_name']
|
533
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.Model.Model', "Refrigeration system lineup found for #{search_criteria}: #{number_of_display_cases} display cases and #{number_of_walkins} walkins, with compressor '#{compressor_name}'.")
|
533
534
|
|
534
535
|
# Find the thermal zones most suited for holding the display cases
|
535
536
|
thermal_zone_case = nil
|
536
537
|
if number_of_display_cases > 0
|
537
538
|
thermal_zone_case = model_typical_display_case_zone(model)
|
538
539
|
if thermal_zone_case.nil?
|
539
|
-
OpenStudio.logFree(OpenStudio::Error, 'openstudio.model.Model',"Attempted to add #{number_of_display_cases} display cases to the model, but could find no thermal zone to put them into.")
|
540
|
+
OpenStudio.logFree(OpenStudio::Error, 'openstudio.model.Model', "Attempted to add #{number_of_display_cases} display cases to the model, but could find no thermal zone to put them into.")
|
540
541
|
return false
|
541
542
|
end
|
542
543
|
end
|
@@ -636,9 +637,7 @@ class Standard
|
|
636
637
|
walkin_floor_area_ft2 = OpenStudio.convert(ref_walkin.insulatedFloorSurfaceArea, 'm^2', 'ft^2').get.round
|
637
638
|
walkin_zone_floor_area_ft2 = OpenStudio.convert(thermal_zone_walkin.floorArea, 'm^2', 'ft^2').get.round
|
638
639
|
if walkin_floor_area_ft2 > walkin_zone_floor_area_ft2
|
639
|
-
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.Model.Model', "Walkin #{ref_walkin.name} has an area of #{walkin_floor_area_ft2} ft^2, which is larger than the #{walkin_zone_floor_area_ft2} ft^2 zone. Walkin will be
|
640
|
-
ref_walkin.remove
|
641
|
-
next
|
640
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.Model.Model', "Walkin #{ref_walkin.name} has an area of #{walkin_floor_area_ft2} ft^2, which is larger than the #{walkin_zone_floor_area_ft2} ft^2 zone. Walkin will be kept in the model, but considered re-sizing the zone '#{thermal_zone_walkin.name}'.")
|
642
641
|
end
|
643
642
|
|
644
643
|
# Find defrost and dripdown properties
|
@@ -36,6 +36,10 @@ module References
|
|
36
36
|
# as of 2017.
|
37
37
|
class NRELZNEReady2017; end
|
38
38
|
|
39
|
+
# ZE AEDG Multifamily
|
40
|
+
# This template contains values from the Zero Energy Advanced Energy Design Guide for Multifamily Buildings
|
41
|
+
class ZEAEDGMultifamily; end
|
42
|
+
|
39
43
|
# NECB2011
|
40
44
|
# @see https://www.nrc-cnrc.gc.ca/eng/publications/codes_centre/2011_national_energy_code_buildings.html Purchase in the NRC Virtual Store
|
41
45
|
class NECB2011; end
|
@@ -1,4 +1,3 @@
|
|
1
|
-
|
2
1
|
class Standard
|
3
2
|
# @!group AirLoopHVAC
|
4
3
|
|
@@ -34,7 +33,7 @@ class Standard
|
|
34
33
|
def air_loop_hvac_apply_standard_controls(air_loop_hvac, climate_zone)
|
35
34
|
# Energy Recovery Ventilation
|
36
35
|
if air_loop_hvac_energy_recovery_ventilator_required?(air_loop_hvac, climate_zone)
|
37
|
-
air_loop_hvac_apply_energy_recovery_ventilator(air_loop_hvac)
|
36
|
+
air_loop_hvac_apply_energy_recovery_ventilator(air_loop_hvac, climate_zone)
|
38
37
|
end
|
39
38
|
|
40
39
|
# Economizers
|
@@ -100,16 +99,6 @@ class Standard
|
|
100
99
|
## end
|
101
100
|
end
|
102
101
|
|
103
|
-
# Single zone systems
|
104
|
-
if air_loop_hvac.thermalZones.size == 1
|
105
|
-
air_loop_hvac_supply_return_exhaust_relief_fans(air_loop_hvac).each do |fan|
|
106
|
-
if fan.to_FanVariableVolume.is_initialized
|
107
|
-
fan_variable_volume_set_control_type(fan, 'Single Zone VAV Fan')
|
108
|
-
end
|
109
|
-
end
|
110
|
-
air_loop_hvac_apply_single_zone_controls(air_loop_hvac, climate_zone)
|
111
|
-
end
|
112
|
-
|
113
102
|
# DCV
|
114
103
|
if air_loop_hvac_demand_control_ventilation_required?(air_loop_hvac, climate_zone)
|
115
104
|
air_loop_hvac_enable_demand_control_ventilation(air_loop_hvac, climate_zone)
|
@@ -159,10 +148,8 @@ class Standard
|
|
159
148
|
air_loop_hvac_remove_motorized_oa_damper(air_loop_hvac)
|
160
149
|
end
|
161
150
|
|
162
|
-
# Zones that require DCV preserve
|
163
|
-
#
|
164
|
-
# Other zones have OA reqs converted
|
165
|
-
# to per-area values only so that DCV
|
151
|
+
# Zones that require DCV preserve both per-area and per-person OA reqs.
|
152
|
+
# Other zones have OA reqs converted to per-area values only so that DCV
|
166
153
|
air_loop_hvac.thermalZones.sort.each do |zone|
|
167
154
|
if thermal_zone_demand_control_ventilation_required?(zone, climate_zone)
|
168
155
|
thermal_zone_convert_oa_req_to_per_area(zone)
|
@@ -170,8 +157,16 @@ class Standard
|
|
170
157
|
end
|
171
158
|
|
172
159
|
# Optimum Start
|
173
|
-
if air_loop_hvac_optimum_start_required?(air_loop_hvac)
|
174
|
-
|
160
|
+
air_loop_hvac_enable_optimum_start(air_loop_hvac) if air_loop_hvac_optimum_start_required?(air_loop_hvac)
|
161
|
+
|
162
|
+
# Single zone systems
|
163
|
+
if air_loop_hvac.thermalZones.size == 1
|
164
|
+
air_loop_hvac_supply_return_exhaust_relief_fans(air_loop_hvac).each do |fan|
|
165
|
+
if fan.to_FanVariableVolume.is_initialized
|
166
|
+
fan_variable_volume_set_control_type(fan, 'Single Zone VAV Fan')
|
167
|
+
end
|
168
|
+
end
|
169
|
+
air_loop_hvac_apply_single_zone_controls(air_loop_hvac, climate_zone)
|
175
170
|
end
|
176
171
|
end
|
177
172
|
|
@@ -830,7 +825,13 @@ class Standard
|
|
830
825
|
def air_loop_hvac_economizer_required?(air_loop_hvac, climate_zone)
|
831
826
|
economizer_required = false
|
832
827
|
|
833
|
-
|
828
|
+
# skip systems without outdoor air
|
829
|
+
return economizer_required unless air_loop_hvac.airLoopHVACOutdoorAirSystem.is_initialized
|
830
|
+
# Determine if the system serves residential spaces
|
831
|
+
is_res = false
|
832
|
+
if air_loop_hvac_residential_area_served(air_loop_hvac) > 0
|
833
|
+
is_res = true
|
834
|
+
end
|
834
835
|
|
835
836
|
# Determine if the airloop serves any computer rooms
|
836
837
|
# / data centers, which changes the economizer.
|
@@ -858,6 +859,11 @@ class Standard
|
|
858
859
|
infinity_btu_per_hr = 999_999_999_999
|
859
860
|
minimum_capacity_btu_per_hr = infinity_btu_per_hr if minimum_capacity_btu_per_hr.nil?
|
860
861
|
|
862
|
+
# Exception valid for 90.1-2004 (6.5.1.(e)) through 90.1-2013 (6.5.1.5)
|
863
|
+
if is_res
|
864
|
+
minimum_capacity_btu_per_hr *= 5
|
865
|
+
end
|
866
|
+
|
861
867
|
# Check whether the system requires an economizer by comparing
|
862
868
|
# the system capacity to the minimum capacity.
|
863
869
|
total_cooling_capacity_w = air_loop_hvac_total_cooling_capacity(air_loop_hvac)
|
@@ -866,6 +872,8 @@ class Standard
|
|
866
872
|
if total_cooling_capacity_btu_per_hr >= minimum_capacity_btu_per_hr
|
867
873
|
if is_dc
|
868
874
|
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.AirLoopHVAC', "#{air_loop_hvac.name} requires an economizer because the total cooling capacity of #{total_cooling_capacity_btu_per_hr.round} Btu/hr exceeds the minimum capacity of #{minimum_capacity_btu_per_hr.round} Btu/hr for data centers.")
|
875
|
+
elsif is_res
|
876
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.AirLoopHVAC', "#{air_loop_hvac.name} requires an economizer because the total cooling capacity of #{total_cooling_capacity_btu_per_hr.round} Btu/hr exceeds the minimum capacity of #{minimum_capacity_btu_per_hr.round} Btu/hr for residential spaces.")
|
869
877
|
else
|
870
878
|
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.AirLoopHVAC', "#{air_loop_hvac.name} requires an economizer because the total cooling capacity of #{total_cooling_capacity_btu_per_hr.round} Btu/hr exceeds the minimum capacity of #{minimum_capacity_btu_per_hr.round} Btu/hr.")
|
871
879
|
end
|
@@ -873,6 +881,8 @@ class Standard
|
|
873
881
|
else
|
874
882
|
if is_dc
|
875
883
|
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.AirLoopHVAC', "#{air_loop_hvac.name} does not require an economizer because the total cooling capacity of #{total_cooling_capacity_btu_per_hr.round} Btu/hr is less than the minimum capacity of #{minimum_capacity_btu_per_hr.round} Btu/hr for data centers.")
|
884
|
+
elsif is_res
|
885
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.AirLoopHVAC', "#{air_loop_hvac.name} requires an economizer because the total cooling capacity of #{total_cooling_capacity_btu_per_hr.round} Btu/hr exceeds the minimum capacity of #{minimum_capacity_btu_per_hr.round} Btu/hr for residential spaces.")
|
876
886
|
else
|
877
887
|
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.AirLoopHVAC', "#{air_loop_hvac.name} does not require an economizer because the total cooling capacity of #{total_cooling_capacity_btu_per_hr.round} Btu/hr is less than the minimum capacity of #{minimum_capacity_btu_per_hr.round} Btu/hr.")
|
878
888
|
end
|
@@ -976,7 +986,8 @@ class Standard
|
|
976
986
|
return [nil, nil, nil]
|
977
987
|
when 'FixedDryBulb'
|
978
988
|
case climate_zone
|
979
|
-
when 'ASHRAE 169-2006-
|
989
|
+
when 'ASHRAE 169-2006-0B',
|
990
|
+
'ASHRAE 169-2006-1B',
|
980
991
|
'ASHRAE 169-2006-2B',
|
981
992
|
'ASHRAE 169-2006-3B',
|
982
993
|
'ASHRAE 169-2006-3C',
|
@@ -988,6 +999,7 @@ class Standard
|
|
988
999
|
'ASHRAE 169-2006-7B',
|
989
1000
|
'ASHRAE 169-2006-8A',
|
990
1001
|
'ASHRAE 169-2006-8B',
|
1002
|
+
'ASHRAE 169-2013-0B',
|
991
1003
|
'ASHRAE 169-2013-1B',
|
992
1004
|
'ASHRAE 169-2013-2B',
|
993
1005
|
'ASHRAE 169-2013-3B',
|
@@ -1008,10 +1020,12 @@ class Standard
|
|
1008
1020
|
'ASHRAE 169-2013-6A',
|
1009
1021
|
'ASHRAE 169-2013-7A'
|
1010
1022
|
drybulb_limit_f = 70
|
1011
|
-
when 'ASHRAE 169-2006-
|
1023
|
+
when 'ASHRAE 169-2006-0A',
|
1024
|
+
'ASHRAE 169-2006-1A',
|
1012
1025
|
'ASHRAE 169-2006-2A',
|
1013
1026
|
'ASHRAE 169-2006-3A',
|
1014
1027
|
'ASHRAE 169-2006-4A',
|
1028
|
+
'ASHRAE 169-2013-0A',
|
1015
1029
|
'ASHRAE 169-2013-1A',
|
1016
1030
|
'ASHRAE 169-2013-2A',
|
1017
1031
|
'ASHRAE 169-2013-3A',
|
@@ -1041,23 +1055,57 @@ class Standard
|
|
1041
1055
|
|
1042
1056
|
# Get the OA system and OA controller
|
1043
1057
|
oa_sys = air_loop_hvac.airLoopHVACOutdoorAirSystem
|
1044
|
-
if oa_sys.is_initialized
|
1045
|
-
oa_sys = oa_sys.get
|
1046
|
-
else
|
1047
|
-
return false # No OA system
|
1048
|
-
end
|
1049
|
-
oa_control = oa_sys.getControllerOutdoorAir
|
1050
1058
|
|
1059
|
+
return false unless oa_sys.is_initialized
|
1060
|
+
|
1061
|
+
oa_sys = oa_sys.get
|
1062
|
+
oa_control = oa_sys.getControllerOutdoorAir
|
1051
1063
|
# Apply integrated or non-integrated economizer
|
1052
1064
|
if integrated_economizer_required
|
1053
|
-
oa_control.setLockoutType('
|
1065
|
+
oa_control.setLockoutType('LockoutWithHeating')
|
1054
1066
|
else
|
1055
|
-
|
1067
|
+
# If the airloop include hyrdronic cooling coils,
|
1068
|
+
# prevent economizer from operating at and above SAT,
|
1069
|
+
# similar to a non-integrated economizer. This is done
|
1070
|
+
# because LockoutWithCompressor doesn't work with hydronic
|
1071
|
+
# coils
|
1072
|
+
if air_loop_hvac_include_hydronic_cooling_coil?(air_loop_hvac)
|
1073
|
+
oa_control.setLockoutType('LockoutWithHeating')
|
1074
|
+
oa_control.setEconomizerMaximumLimitDryBulbTemperature(standard_design_sizing_temperatures['clg_dsgn_sup_air_temp_c'])
|
1075
|
+
else
|
1076
|
+
oa_control.setLockoutType('LockoutWithCompressor')
|
1077
|
+
end
|
1056
1078
|
end
|
1057
1079
|
|
1058
1080
|
return true
|
1059
1081
|
end
|
1060
1082
|
|
1083
|
+
# Determine if the airloop includes hydronic cooling coils
|
1084
|
+
#
|
1085
|
+
# @return [Bool] returns true if hydronic coolings coils are included on the airloop
|
1086
|
+
def air_loop_hvac_include_hydronic_cooling_coil?(air_loop_hvac)
|
1087
|
+
air_loop_hvac.supplyComponents.each do |comp|
|
1088
|
+
return true if comp.to_CoilCoolingWater.is_initialized
|
1089
|
+
end
|
1090
|
+
return false
|
1091
|
+
end
|
1092
|
+
|
1093
|
+
# Determine if the airloop includes WSHP cooling coils
|
1094
|
+
#
|
1095
|
+
# @return [Bool] returns true if WSHP cooling coils are included on the airloop
|
1096
|
+
def air_loop_hvac_include_wshp?(air_loop_hvac)
|
1097
|
+
air_loop_hvac.supplyComponents.each do |comp|
|
1098
|
+
return true if comp.to_CoilCoolingWaterToAirHeatPumpEquationFit.is_initialized
|
1099
|
+
|
1100
|
+
if comp.to_AirLoopHVACUnitarySystem.is_initialized
|
1101
|
+
clg_coil = comp.to_AirLoopHVACUnitarySystem.get.coolingCoil.get
|
1102
|
+
return true if clg_coil.to_CoilCoolingWaterToAirHeatPumpEquationFit.is_initialized
|
1103
|
+
|
1104
|
+
end
|
1105
|
+
end
|
1106
|
+
return false
|
1107
|
+
end
|
1108
|
+
|
1061
1109
|
# Determine if the system economizer must be integrated or not.
|
1062
1110
|
# Default logic is from 90.1-2004.
|
1063
1111
|
def air_loop_hvac_integrated_economizer_required?(air_loop_hvac, climate_zone)
|
@@ -1081,7 +1129,9 @@ class Standard
|
|
1081
1129
|
else
|
1082
1130
|
# Exception c, Systems in climate zones 1,2,3a,4a,5a,5b,6,7,8
|
1083
1131
|
case climate_zone
|
1084
|
-
when 'ASHRAE 169-2006-
|
1132
|
+
when 'ASHRAE 169-2006-0A',
|
1133
|
+
'ASHRAE 169-2006-0B',
|
1134
|
+
'ASHRAE 169-2006-1A',
|
1085
1135
|
'ASHRAE 169-2006-1B',
|
1086
1136
|
'ASHRAE 169-2006-2A',
|
1087
1137
|
'ASHRAE 169-2006-2B',
|
@@ -1095,6 +1145,8 @@ class Standard
|
|
1095
1145
|
'ASHRAE 169-2006-7B',
|
1096
1146
|
'ASHRAE 169-2006-8A',
|
1097
1147
|
'ASHRAE 169-2006-8B',
|
1148
|
+
'ASHRAE 169-2013-0A',
|
1149
|
+
'ASHRAE 169-2013-0B',
|
1098
1150
|
'ASHRAE 169-2013-1A',
|
1099
1151
|
'ASHRAE 169-2013-1B',
|
1100
1152
|
'ASHRAE 169-2013-2A',
|
@@ -1143,11 +1195,15 @@ class Standard
|
|
1143
1195
|
|
1144
1196
|
# Determine the minimum capacity that requires an economizer
|
1145
1197
|
case climate_zone
|
1146
|
-
when 'ASHRAE 169-2006-
|
1198
|
+
when 'ASHRAE 169-2006-0A',
|
1199
|
+
'ASHRAE 169-2006-0B',
|
1200
|
+
'ASHRAE 169-2006-1A',
|
1147
1201
|
'ASHRAE 169-2006-1B',
|
1148
1202
|
'ASHRAE 169-2006-2A',
|
1149
1203
|
'ASHRAE 169-2006-3A',
|
1150
1204
|
'ASHRAE 169-2006-4A',
|
1205
|
+
'ASHRAE 169-2013-0A',
|
1206
|
+
'ASHRAE 169-2013-0B',
|
1151
1207
|
'ASHRAE 169-2013-1A',
|
1152
1208
|
'ASHRAE 169-2013-1B',
|
1153
1209
|
'ASHRAE 169-2013-2A',
|
@@ -1174,7 +1230,7 @@ class Standard
|
|
1174
1230
|
if min_int_area_served_ft2 == infinity_ft2 && min_ext_area_served_ft2 == infinity_ft2
|
1175
1231
|
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.AirLoopHVAC', "For #{air_loop_hvac.name}: Economizer not required for climate zone #{climate_zone}.")
|
1176
1232
|
else
|
1177
|
-
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.AirLoopHVAC', "For #{air_loop_hvac.name}: Economizer not required for because the interior area served of #{int_area_served_m2} ft2
|
1233
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.AirLoopHVAC', "For #{air_loop_hvac.name}: Economizer not required for because the interior area served of #{int_area_served_m2} ft2 is less than the minimum of #{min_int_area_served_m2} and the perimeter area served of #{ext_area_served_m2} ft2 is less than the minimum of #{min_ext_area_served_m2} for climate zone #{climate_zone}.")
|
1178
1234
|
end
|
1179
1235
|
return economizer_required
|
1180
1236
|
end
|
@@ -1259,7 +1315,8 @@ class Standard
|
|
1259
1315
|
dewpoint_limit_f = nil
|
1260
1316
|
|
1261
1317
|
case climate_zone
|
1262
|
-
when 'ASHRAE 169-2006-
|
1318
|
+
when 'ASHRAE 169-2006-0B',
|
1319
|
+
'ASHRAE 169-2006-1B',
|
1263
1320
|
'ASHRAE 169-2006-2B',
|
1264
1321
|
'ASHRAE 169-2006-3B',
|
1265
1322
|
'ASHRAE 169-2006-3C',
|
@@ -1271,6 +1328,7 @@ class Standard
|
|
1271
1328
|
'ASHRAE 169-2006-7B',
|
1272
1329
|
'ASHRAE 169-2006-8A',
|
1273
1330
|
'ASHRAE 169-2006-8B',
|
1331
|
+
'ASHRAE 169-2013-0B',
|
1274
1332
|
'ASHRAE 169-2013-1B',
|
1275
1333
|
'ASHRAE 169-2013-2B',
|
1276
1334
|
'ASHRAE 169-2013-3B',
|
@@ -1336,7 +1394,8 @@ class Standard
|
|
1336
1394
|
# Determine the prohibited types
|
1337
1395
|
prohibited_types = []
|
1338
1396
|
case climate_zone
|
1339
|
-
when 'ASHRAE 169-2006-
|
1397
|
+
when 'ASHRAE 169-2006-0B',
|
1398
|
+
'ASHRAE 169-2006-1B',
|
1340
1399
|
'ASHRAE 169-2006-2B',
|
1341
1400
|
'ASHRAE 169-2006-3B',
|
1342
1401
|
'ASHRAE 169-2006-3C',
|
@@ -1348,6 +1407,7 @@ class Standard
|
|
1348
1407
|
'ASHRAE 169-2006-7B',
|
1349
1408
|
'ASHRAE 169-2006-8A',
|
1350
1409
|
'ASHRAE 169-2006-8B',
|
1410
|
+
'ASHRAE 169-2013-0B',
|
1351
1411
|
'ASHRAE 169-2013-1B',
|
1352
1412
|
'ASHRAE 169-2013-2B',
|
1353
1413
|
'ASHRAE 169-2013-3B',
|
@@ -1361,10 +1421,12 @@ class Standard
|
|
1361
1421
|
'ASHRAE 169-2013-8A',
|
1362
1422
|
'ASHRAE 169-2013-8B'
|
1363
1423
|
prohibited_types = ['FixedEnthalpy']
|
1364
|
-
when 'ASHRAE 169-2006-
|
1424
|
+
when 'ASHRAE 169-2006-0A',
|
1425
|
+
'ASHRAE 169-2006-1A',
|
1365
1426
|
'ASHRAE 169-2006-2A',
|
1366
1427
|
'ASHRAE 169-2006-3A',
|
1367
1428
|
'ASHRAE 169-2006-4A',
|
1429
|
+
'ASHRAE 169-2013-0A',
|
1368
1430
|
'ASHRAE 169-2013-1A',
|
1369
1431
|
'ASHRAE 169-2013-2A',
|
1370
1432
|
'ASHRAE 169-2013-3A',
|
@@ -1374,7 +1436,7 @@ class Standard
|
|
1374
1436
|
'ASHRAE 169-2006-6A',
|
1375
1437
|
'ASHRAE 169-2013-5A',
|
1376
1438
|
'ASHRAE 169-2013-6A'
|
1377
|
-
|
1439
|
+
prohibited_types = []
|
1378
1440
|
end
|
1379
1441
|
|
1380
1442
|
# Check if the specified type is allowed
|
@@ -1429,11 +1491,7 @@ class Standard
|
|
1429
1491
|
end
|
1430
1492
|
end
|
1431
1493
|
|
1432
|
-
# ERV Not Applicable for AHUs that have DCV
|
1433
|
-
# or that have no OA intake.
|
1434
|
-
controller_oa = nil
|
1435
|
-
controller_mv = nil
|
1436
|
-
oa_system = nil
|
1494
|
+
# ERV Not Applicable for AHUs that have DCV or that have no OA intake.
|
1437
1495
|
if air_loop_hvac.airLoopHVACOutdoorAirSystem.is_initialized
|
1438
1496
|
oa_system = air_loop_hvac.airLoopHVACOutdoorAirSystem.get
|
1439
1497
|
controller_oa = oa_system.getControllerOutdoorAir
|
@@ -1502,14 +1560,29 @@ class Standard
|
|
1502
1560
|
return erv_cfm
|
1503
1561
|
end
|
1504
1562
|
|
1505
|
-
#
|
1506
|
-
#
|
1563
|
+
# Determine whether to apply an Energy Recovery Ventilator 'ERV' or a Heat Recovery Ventilator 'HRV' depending on the climate zone
|
1564
|
+
# Defaults to ERV.
|
1565
|
+
# @return [String] the ERV type
|
1566
|
+
def air_loop_hvac_energy_recovery_ventilator_type(air_loop_hvac, climate_zone)
|
1567
|
+
erv_type = 'ERV'
|
1568
|
+
return erv_type
|
1569
|
+
end
|
1570
|
+
|
1571
|
+
# Determine whether to use a Plate-Frame or Rotary Wheel style ERV depending on air loop outdoor air flow rate
|
1572
|
+
# Defaults to Rotary.
|
1573
|
+
# @return [String] the ERV type
|
1574
|
+
def air_loop_hvac_energy_recovery_ventilator_heat_exchanger_type(air_loop_hvac)
|
1575
|
+
heat_exchanger_type = 'Rotary'
|
1576
|
+
return heat_exchanger_type
|
1577
|
+
end
|
1578
|
+
|
1579
|
+
# Add an ERV to this airloop
|
1507
1580
|
#
|
1508
1581
|
# @param (see #economizer_required?)
|
1509
1582
|
# @return [Bool] Returns true if required, false if not.
|
1510
1583
|
# @todo Add exception logic for systems serving parking garage, warehouse, or multifamily
|
1511
|
-
def air_loop_hvac_apply_energy_recovery_ventilator(air_loop_hvac)
|
1512
|
-
# Get the
|
1584
|
+
def air_loop_hvac_apply_energy_recovery_ventilator(air_loop_hvac, climate_zone)
|
1585
|
+
# Get the OA system
|
1513
1586
|
oa_system = nil
|
1514
1587
|
if air_loop_hvac.airLoopHVACOutdoorAirSystem.is_initialized
|
1515
1588
|
oa_system = air_loop_hvac.airLoopHVACOutdoorAirSystem.get
|
@@ -1518,57 +1591,52 @@ class Standard
|
|
1518
1591
|
return false
|
1519
1592
|
end
|
1520
1593
|
|
1521
|
-
# Create an ERV
|
1594
|
+
# Create an ERV and add it to the OA system
|
1522
1595
|
erv = OpenStudio::Model::HeatExchangerAirToAirSensibleAndLatent.new(air_loop_hvac.model)
|
1523
|
-
erv.
|
1524
|
-
|
1525
|
-
|
1526
|
-
|
1527
|
-
|
1528
|
-
erv.
|
1529
|
-
erv.
|
1530
|
-
|
1531
|
-
|
1596
|
+
erv.addToNode(oa_system.outboardOANode.get)
|
1597
|
+
|
1598
|
+
# Determine whether to use an ERV and HRV and heat exchanger style
|
1599
|
+
erv_type = air_loop_hvac_energy_recovery_ventilator_type(air_loop_hvac, climate_zone)
|
1600
|
+
heat_exchanger_type = air_loop_hvac_energy_recovery_ventilator_heat_exchanger_type(air_loop_hvac)
|
1601
|
+
erv.setName("#{air_loop_hvac.name} #{erv_type}")
|
1602
|
+
erv.setHeatExchangerType(heat_exchanger_type)
|
1603
|
+
|
1604
|
+
# apply heat exchanger efficiencies
|
1605
|
+
air_loop_hvac_apply_energy_recovery_ventilator_efficiency(erv, erv_type: erv_type, heat_exchanger_type: heat_exchanger_type)
|
1606
|
+
|
1607
|
+
# Apply the prototype heat exchanger power assumptions for rotary style heat exchangers
|
1608
|
+
heat_exchanger_air_to_air_sensible_and_latent_apply_prototype_nominal_electric_power(erv)
|
1609
|
+
|
1610
|
+
# add economizer lockout
|
1532
1611
|
erv.setSupplyAirOutletTemperatureControl(false)
|
1533
|
-
erv.setHeatExchangerType('Rotary')
|
1534
|
-
erv.setFrostControlType('ExhaustOnly')
|
1535
1612
|
erv.setEconomizerLockout(true)
|
1613
|
+
|
1614
|
+
# add defrost
|
1615
|
+
erv.setFrostControlType('ExhaustOnly')
|
1536
1616
|
erv.setThresholdTemperature(-23.3) # -10F
|
1537
1617
|
erv.setInitialDefrostTimeFraction(0.167)
|
1538
1618
|
erv.setRateofDefrostTimeFractionIncrease(1.44)
|
1539
1619
|
|
1540
|
-
# Add
|
1541
|
-
erv.addToNode(oa_system.outboardOANode.get)
|
1542
|
-
|
1543
|
-
# Add a setpoint manager OA pretreat
|
1544
|
-
# to control the ERV
|
1620
|
+
# Add a setpoint manager OA pretreat to control the ERV
|
1545
1621
|
spm_oa_pretreat = OpenStudio::Model::SetpointManagerOutdoorAirPretreat.new(air_loop_hvac.model)
|
1546
1622
|
spm_oa_pretreat.setMinimumSetpointTemperature(-99.0)
|
1547
1623
|
spm_oa_pretreat.setMaximumSetpointTemperature(99.0)
|
1548
1624
|
spm_oa_pretreat.setMinimumSetpointHumidityRatio(0.00001)
|
1549
1625
|
spm_oa_pretreat.setMaximumSetpointHumidityRatio(1.0)
|
1550
|
-
# Reference setpoint node and
|
1551
|
-
# Mixed air stream node are outlet
|
1552
|
-
# node of the OA system
|
1626
|
+
# Reference setpoint node and mixed air stream node are outlet node of the OA system
|
1553
1627
|
mixed_air_node = oa_system.mixedAirModelObject.get.to_Node.get
|
1554
1628
|
spm_oa_pretreat.setReferenceSetpointNode(mixed_air_node)
|
1555
1629
|
spm_oa_pretreat.setMixedAirStreamNode(mixed_air_node)
|
1556
|
-
# Outdoor air node is
|
1557
|
-
# the outboard OA node of teh OA system
|
1630
|
+
# Outdoor air node is the outboard OA node of the OA system
|
1558
1631
|
spm_oa_pretreat.setOutdoorAirStreamNode(oa_system.outboardOANode.get)
|
1559
|
-
# Return air node is the inlet
|
1560
|
-
# node of the OA system
|
1632
|
+
# Return air node is the inlet node of the OA system
|
1561
1633
|
return_air_node = oa_system.returnAirModelObject.get.to_Node.get
|
1562
1634
|
spm_oa_pretreat.setReturnAirStreamNode(return_air_node)
|
1563
1635
|
# Attach to the outlet of the ERV
|
1564
1636
|
erv_outlet = erv.primaryAirOutletModelObject.get.to_Node.get
|
1565
1637
|
spm_oa_pretreat.addToNode(erv_outlet)
|
1566
1638
|
|
1567
|
-
#
|
1568
|
-
heat_exchanger_air_to_air_sensible_and_latent_apply_prototype_nominal_electric_power(erv)
|
1569
|
-
|
1570
|
-
# Determine if the system is a DOAS based on
|
1571
|
-
# whether there is 100% OA in heating and cooling sizing.
|
1639
|
+
# Determine if the system is a DOAS based on whether there is 100% OA in heating and cooling sizing.
|
1572
1640
|
is_doas = false
|
1573
1641
|
sizing_system = air_loop_hvac.sizingSystem
|
1574
1642
|
if sizing_system.allOutdoorAirinCooling && sizing_system.allOutdoorAirinHeating
|
@@ -1591,6 +1659,24 @@ class Standard
|
|
1591
1659
|
return true
|
1592
1660
|
end
|
1593
1661
|
|
1662
|
+
# Apply efficiency values to the erv
|
1663
|
+
#
|
1664
|
+
# @param erv [OpenStudio::Model::HeatExchangerAirToAirSensibleAndLatent] erv to apply efficiency values
|
1665
|
+
# @param erv_type [String] erv type ERV or HRV
|
1666
|
+
# @param heat_exchanger_type [String] heat exchanger type Rotary or Plate
|
1667
|
+
# @return erv [OpenStudio::Model::HeatExchangerAirToAirSensibleAndLatent] erv to apply efficiency values
|
1668
|
+
def air_loop_hvac_apply_energy_recovery_ventilator_efficiency(erv, erv_type: 'ERV', heat_exchanger_type: 'Rotary')
|
1669
|
+
erv.setSensibleEffectivenessat100HeatingAirFlow(0.7)
|
1670
|
+
erv.setLatentEffectivenessat100HeatingAirFlow(0.6)
|
1671
|
+
erv.setSensibleEffectivenessat75HeatingAirFlow(0.7)
|
1672
|
+
erv.setLatentEffectivenessat75HeatingAirFlow(0.6)
|
1673
|
+
erv.setSensibleEffectivenessat100CoolingAirFlow(0.75)
|
1674
|
+
erv.setLatentEffectivenessat100CoolingAirFlow(0.6)
|
1675
|
+
erv.setSensibleEffectivenessat75CoolingAirFlow(0.75)
|
1676
|
+
erv.setLatentEffectivenessat75CoolingAirFlow(0.6)
|
1677
|
+
return erv
|
1678
|
+
end
|
1679
|
+
|
1594
1680
|
# Determine if multizone vav optimization is required.
|
1595
1681
|
# Defaults to 90.1-2007 logic, where it is not required.
|
1596
1682
|
#
|
@@ -1668,10 +1754,24 @@ class Standard
|
|
1668
1754
|
# @return [Bool] Returns true if required, false if not.
|
1669
1755
|
# @todo Add exception logic for systems serving parking garage, warehouse, or multifamily
|
1670
1756
|
def air_loop_hvac_adjust_minimum_vav_damper_positions(air_loop_hvac)
|
1757
|
+
# Do not apply the adjustment to some of the system in
|
1758
|
+
# the hospital and outpatient which have their minimum
|
1759
|
+
# damper position determined based on AIA 2001 ventilation
|
1760
|
+
# requirements
|
1761
|
+
if (@instvarbuilding_type == 'Hospital' && (air_loop_hvac.name.to_s.include?('VAV_ER') || air_loop_hvac.name.to_s.include?('VAV_ICU') ||
|
1762
|
+
air_loop_hvac.name.to_s.include?('VAV_OR') || air_loop_hvac.name.to_s.include?('VAV_LABS') ||
|
1763
|
+
air_loop_hvac.name.to_s.include?('VAV_PATRMS'))) ||
|
1764
|
+
(@instvarbuilding_type == 'Outpatient' && air_loop_hvac.name.to_s.include?('Outpatient F1'))
|
1765
|
+
|
1766
|
+
return true
|
1767
|
+
end
|
1768
|
+
|
1671
1769
|
# Total uncorrected outdoor airflow rate
|
1672
1770
|
v_ou = 0.0
|
1673
1771
|
air_loop_hvac.thermalZones.each do |zone|
|
1674
|
-
|
1772
|
+
# Vou is the system uncorrected outdoor airflow:
|
1773
|
+
# Zone airflow is multiplied by the zone multiplier
|
1774
|
+
v_ou += thermal_zone_outdoor_airflow_rate(zone) * zone.multiplier.to_f
|
1675
1775
|
end
|
1676
1776
|
|
1677
1777
|
v_ou_cfm = OpenStudio.convert(v_ou, 'm^3/s', 'cfm').get
|
@@ -1698,6 +1798,10 @@ class Standard
|
|
1698
1798
|
e_vzs = []
|
1699
1799
|
e_vzs_adj = []
|
1700
1800
|
num_zones_adj = 0
|
1801
|
+
|
1802
|
+
# Retrieve the sum of the zone minimum primary airflow
|
1803
|
+
vpz_min_sum = air_loop_hvac.autosizeSumMinimumHeatingAirFlowRates
|
1804
|
+
|
1701
1805
|
air_loop_hvac.thermalZones.sort.each do |zone|
|
1702
1806
|
# Breathing zone airflow rate
|
1703
1807
|
v_bz = thermal_zone_outdoor_airflow_rate(zone)
|
@@ -1757,14 +1861,18 @@ class Standard
|
|
1757
1861
|
end
|
1758
1862
|
end
|
1759
1863
|
|
1864
|
+
# Zone ventilation efficiency calculation is computed
|
1865
|
+
# on a per zone basis, the zone primary airflow is
|
1866
|
+
# adjusted to removed the zone multiplier
|
1867
|
+
v_pz /= zone.multiplier.to_f
|
1868
|
+
|
1760
1869
|
# For VAV Reheat terminals, min flow is greater of mdp
|
1761
1870
|
# and min flow rate / design flow rate.
|
1762
1871
|
mdp = mdp_term
|
1763
|
-
mdp_oa = min_zn_flow /
|
1872
|
+
mdp_oa = min_zn_flow / v_pz
|
1764
1873
|
if min_zn_flow > 0.0
|
1765
1874
|
mdp = [mdp_term, mdp_oa].max.round(2)
|
1766
1875
|
end
|
1767
|
-
# OpenStudio::logFree(OpenStudio::Info, 'openstudio.standards.AirLoopHVAC', "For #{self.name}: Zone #{zone.name} mdp_term = #{mdp_term.round(2)}, mdp_oa = #{mdp_oa.round(2)}; mdp_final = #{mdp}")
|
1768
1876
|
|
1769
1877
|
# Zone minimum discharge airflow rate
|
1770
1878
|
v_dz = v_pz * mdp
|
@@ -1772,7 +1880,7 @@ class Standard
|
|
1772
1880
|
# Zone discharge air fraction
|
1773
1881
|
z_d = v_oz / v_dz
|
1774
1882
|
|
1775
|
-
# Zone ventilation effectiveness
|
1883
|
+
# Zone ventilation effectiveness
|
1776
1884
|
e_vz = 1.0 + x_s - z_d
|
1777
1885
|
|
1778
1886
|
# Store the ventilation effectiveness
|
@@ -1804,27 +1912,12 @@ class Standard
|
|
1804
1912
|
|
1805
1913
|
# Store the ventilation effectiveness
|
1806
1914
|
e_vzs_adj << e_vz_adj
|
1807
|
-
|
1808
1915
|
# Round the minimum damper position to avoid nondeterministic results
|
1809
1916
|
# at the ~13th decimal place, which can cause regression errors
|
1810
1917
|
mdp_adj = mdp_adj.round(11)
|
1811
1918
|
|
1812
1919
|
# Set the adjusted minimum damper position
|
1813
|
-
zone
|
1814
|
-
if equip.to_AirTerminalSingleDuctVAVHeatAndCoolNoReheat.is_initialized
|
1815
|
-
term = equip.to_AirTerminalSingleDuctVAVHeatAndCoolNoReheat.get
|
1816
|
-
term.setZoneMinimumAirFlowFraction(mdp_adj)
|
1817
|
-
elsif equip.to_AirTerminalSingleDuctVAVHeatAndCoolReheat.is_initialized
|
1818
|
-
term = equip.to_AirTerminalSingleDuctVAVHeatAndCoolReheat.get
|
1819
|
-
term.setZoneMinimumAirFlowFraction(mdp_adj)
|
1820
|
-
elsif equip.to_AirTerminalSingleDuctVAVNoReheat.is_initialized
|
1821
|
-
term = equip.to_AirTerminalSingleDuctVAVNoReheat.get
|
1822
|
-
term.setConstantMinimumAirFlowFraction(mdp_adj)
|
1823
|
-
elsif equip.to_AirTerminalSingleDuctVAVReheat.is_initialized
|
1824
|
-
term = equip.to_AirTerminalSingleDuctVAVReheat.get
|
1825
|
-
term.setConstantMinimumAirFlowFraction(mdp_adj)
|
1826
|
-
end
|
1827
|
-
end
|
1920
|
+
air_loop_hvac_set_minimum_damper_position(zone, mdp_adj)
|
1828
1921
|
|
1829
1922
|
num_zones_adj += 1
|
1830
1923
|
|
@@ -1850,6 +1943,16 @@ class Standard
|
|
1850
1943
|
v_ot_adj = v_ou / e_v_adj
|
1851
1944
|
v_ot_adj_cfm = OpenStudio.convert(v_ot_adj, 'm^3/s', 'cfm').get
|
1852
1945
|
|
1946
|
+
# Adjust minimum damper position if the sum of maximum
|
1947
|
+
# zone airflow are lower than the calculated system
|
1948
|
+
# outdoor air intake
|
1949
|
+
if v_ot_adj > vpz_min_sum && v_ot_adj > 0
|
1950
|
+
mdp_adj = [v_ot_adj / air_loop_hvac.autosizeSumAirTerminalMaxAirFlowRate, 1].min
|
1951
|
+
air_loop_hvac.thermalZones.sort.each do |zone|
|
1952
|
+
air_loop_hvac_set_minimum_damper_position(zone, mdp_adj)
|
1953
|
+
end
|
1954
|
+
end
|
1955
|
+
|
1853
1956
|
# Report out the results of the multizone calculations
|
1854
1957
|
if num_zones_adj > 0
|
1855
1958
|
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.AirLoopHVAC', "For #{air_loop_hvac.name}: the multizone outdoor air calculation method was applied. A simple summation of the zone outdoor air requirements gives a value of #{v_ou_cfm.round} cfm. Applying the multizone method gives a value of #{v_ot_cfm.round} cfm, with an original system ventilation effectiveness of #{e_v.round(2)}. After increasing the minimum damper position in #{num_zones_adj} critical zones, the resulting requirement is #{v_ot_adj_cfm.round} cfm with a system ventilation effectiveness of #{e_v_adj.round(2)}.")
|
@@ -1865,6 +1968,27 @@ class Standard
|
|
1865
1968
|
return true
|
1866
1969
|
end
|
1867
1970
|
|
1971
|
+
# Set an air terminal's minimum damper position
|
1972
|
+
def air_loop_hvac_set_minimum_damper_position(zone, mdp)
|
1973
|
+
zone.equipment.each do |equip|
|
1974
|
+
if equip.to_AirTerminalSingleDuctVAVHeatAndCoolNoReheat.is_initialized
|
1975
|
+
term = equip.to_AirTerminalSingleDuctVAVHeatAndCoolNoReheat.get
|
1976
|
+
term.setZoneMinimumAirFlowFraction(mdp)
|
1977
|
+
elsif equip.to_AirTerminalSingleDuctVAVHeatAndCoolReheat.is_initialized
|
1978
|
+
term = equip.to_AirTerminalSingleDuctVAVHeatAndCoolReheat.get
|
1979
|
+
term.setZoneMinimumAirFlowFraction(mdp)
|
1980
|
+
elsif equip.to_AirTerminalSingleDuctVAVNoReheat.is_initialized
|
1981
|
+
term = equip.to_AirTerminalSingleDuctVAVNoReheat.get
|
1982
|
+
term.setConstantMinimumAirFlowFraction(mdp)
|
1983
|
+
elsif equip.to_AirTerminalSingleDuctVAVReheat.is_initialized
|
1984
|
+
term = equip.to_AirTerminalSingleDuctVAVReheat.get
|
1985
|
+
term.setConstantMinimumAirFlowFraction(mdp)
|
1986
|
+
end
|
1987
|
+
end
|
1988
|
+
|
1989
|
+
return true
|
1990
|
+
end
|
1991
|
+
|
1868
1992
|
# For critical zones of Outpatient, if the minimum airflow rate required by the accreditation standard (AIA 2001) is significantly
|
1869
1993
|
# less than the autosized peak design airflow in any of the three climate zones (Houston, Baltimore and Burlington), the minimum
|
1870
1994
|
# airflow fraction of the terminal units is reduced to the value: "required minimum airflow rate / autosized peak design flow"
|
@@ -1888,6 +2012,10 @@ class Standard
|
|
1888
2012
|
rated_maximum_flow_rate = vav_terminal.autosizedMaximumAirFlowRate.get
|
1889
2013
|
# compare the VAV autosized maximum airflow with the minimum airflow rate required by the accreditation standard
|
1890
2014
|
ratio = minimum_airflow_per_zone / rated_maximum_flow_rate
|
2015
|
+
|
2016
|
+
# round to avoid results variances in sizing runs
|
2017
|
+
ratio = ratio.round(11)
|
2018
|
+
|
1891
2019
|
if ratio >= 0.95
|
1892
2020
|
vav_terminal.setConstantMinimumAirFlowFraction(1)
|
1893
2021
|
elsif ratio < 0.95
|
@@ -2130,7 +2258,7 @@ class Standard
|
|
2130
2258
|
# supply outlet node of the system.
|
2131
2259
|
sat_oa_reset.addToNode(supplyOutletNode)
|
2132
2260
|
|
2133
|
-
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.AirLoopHVAC', "For #{air_loop_hvac.name}: Supply air temperature reset was enabled. When OAT
|
2261
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.AirLoopHVAC', "For #{air_loop_hvac.name}: Supply air temperature reset was enabled. When OAT is greater than #{hi_oat_f.round}F, SAT is #{sat_at_hi_oat_f.round}F. When OAT is less than #{lo_oat_f.round}F, SAT is #{sat_at_lo_oat_f.round}F. It varies linearly in between these points.")
|
2134
2262
|
|
2135
2263
|
return true
|
2136
2264
|
end
|
@@ -2248,6 +2376,21 @@ class Standard
|
|
2248
2376
|
return has_erv
|
2249
2377
|
end
|
2250
2378
|
|
2379
|
+
# Determine if the air loop is a unitary system
|
2380
|
+
#
|
2381
|
+
# @return [Bool] Returns true if a unitary system is present, false if not.
|
2382
|
+
def air_loop_hvac_unitary_system?(air_loop_hvac)
|
2383
|
+
is_unitary_system = false
|
2384
|
+
air_loop_hvac.supplyComponents.each do |component|
|
2385
|
+
obj_type = component.iddObjectType.valueName.to_s
|
2386
|
+
case obj_type
|
2387
|
+
when 'OS_AirLoopHVAC_UnitarySystem', 'OS_AirLoopHVAC_UnitaryHeatPump_AirToAir', 'OS_AirLoopHVAC_UnitaryHeatPump_AirToAir_MultiSpeed', 'OS_AirLoopHVAC_UnitaryHeatCool_VAVChangeoverBypass'
|
2388
|
+
is_unitary_system = true
|
2389
|
+
end
|
2390
|
+
end
|
2391
|
+
return is_unitary_system
|
2392
|
+
end
|
2393
|
+
|
2251
2394
|
# Set the VAV damper control to single maximum or dual maximum control depending on the standard.
|
2252
2395
|
#
|
2253
2396
|
# @return [Bool] Returns true if successful, false if not
|
@@ -2370,7 +2513,7 @@ class Standard
|
|
2370
2513
|
end
|
2371
2514
|
|
2372
2515
|
# If here, motorized damper is required
|
2373
|
-
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.AirLoopHVAC', "For #{air_loop_hvac.name}: Motorized OA damper is required because the building has #{num_stories} stories
|
2516
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.AirLoopHVAC', "For #{air_loop_hvac.name}: Motorized OA damper is required because the building has #{num_stories} stories which is greater than or equal to the minimum of #{maximum_stories} stories for climate zone #{climate_zone}, and the system OA intake of #{oa_flow_cfm.round} cfm is greater than or equal to the minimum threshold of #{minimum_oa_flow_cfm} cfm. ")
|
2374
2517
|
motorized_oa_damper_required = true
|
2375
2518
|
|
2376
2519
|
return motorized_oa_damper_required
|
@@ -2993,12 +3136,38 @@ class Standard
|
|
2993
3136
|
elsif air_loop_hvac.autosizedDesignSupplyAirFlowRate.is_initialized
|
2994
3137
|
design_supply_air_flow_rate = air_loop_hvac.autosizedDesignSupplyAirFlowRate.get
|
2995
3138
|
else
|
2996
|
-
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.AirLoopHVAC', "For #{air_loop_hvac.name} design
|
3139
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.AirLoopHVAC', "For #{air_loop_hvac.name} design supply air flow rate is not available.")
|
2997
3140
|
end
|
2998
3141
|
|
2999
3142
|
return design_supply_air_flow_rate
|
3000
3143
|
end
|
3001
3144
|
|
3145
|
+
# Determine how much residential area the airloop serves
|
3146
|
+
#
|
3147
|
+
# @returns [Double] res_area m^2
|
3148
|
+
def air_loop_hvac_residential_area_served(air_loop_hvac)
|
3149
|
+
res_area = 0.0
|
3150
|
+
|
3151
|
+
air_loop_hvac.thermalZones.each do |zone|
|
3152
|
+
zone.spaces.each do |space|
|
3153
|
+
# Skip spaces with no space type
|
3154
|
+
next if space.spaceType.empty?
|
3155
|
+
|
3156
|
+
space_type = space.spaceType.get
|
3157
|
+
|
3158
|
+
# Skip spaces with no standards space type
|
3159
|
+
next if space_type.standardsSpaceType.empty?
|
3160
|
+
|
3161
|
+
standards_space_type = space_type.standardsSpaceType.get
|
3162
|
+
if standards_space_type.downcase.include?('apartment') || standards_space_type.downcase.include?('guestroom') || standards_space_type.downcase.include?('patroom')
|
3163
|
+
res_area += space.floorArea
|
3164
|
+
end
|
3165
|
+
end
|
3166
|
+
end
|
3167
|
+
|
3168
|
+
return res_area
|
3169
|
+
end
|
3170
|
+
|
3002
3171
|
# Determine how much data center
|
3003
3172
|
# area the airloop serves.
|
3004
3173
|
#
|
@@ -3015,8 +3184,12 @@ class Standard
|
|
3015
3184
|
zone.spaces.each do |space|
|
3016
3185
|
# Skip spaces with no space type
|
3017
3186
|
next if space.spaceType.empty?
|
3187
|
+
|
3018
3188
|
space_type = space.spaceType.get
|
3189
|
+
|
3190
|
+
# Skip spaces with no standards space type
|
3019
3191
|
next if space_type.standardsSpaceType.empty?
|
3192
|
+
|
3020
3193
|
standards_space_type = space_type.standardsSpaceType.get
|
3021
3194
|
# Counts as a data center if the name includes 'data'
|
3022
3195
|
if standards_space_type.downcase.include?('data center') || standards_space_type.downcase.include?('datacenter')
|
@@ -3032,6 +3205,19 @@ class Standard
|
|
3032
3205
|
return dc_area_m2
|
3033
3206
|
end
|
3034
3207
|
|
3208
|
+
# Determine how many humidifies are on the airloop
|
3209
|
+
#
|
3210
|
+
# @return [Integer] the number of humidifiers
|
3211
|
+
def air_loop_hvac_humidifier_count(air_loop_hvac)
|
3212
|
+
humidifiers = 0
|
3213
|
+
air_loop_hvac.supplyComponents.each do |cmp|
|
3214
|
+
if cmp.to_HumidifierSteamElectric.is_initialized
|
3215
|
+
humidifiers += 1
|
3216
|
+
end
|
3217
|
+
end
|
3218
|
+
return humidifiers
|
3219
|
+
end
|
3220
|
+
|
3035
3221
|
# Sets the maximum reheat temperature to the specified
|
3036
3222
|
# value for all reheat terminals (of any type) on the loop.
|
3037
3223
|
#
|