openstudio-standards 0.2.14 → 0.2.15.pre.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/geometry/ASHRAECollege.json +0 -19
- data/data/geometry/ASHRAEMidriseApartment.json +47 -47
- data/data/geometry/ASHRAESecondarySchool.osm +2 -2
- data/data/standards/OpenStudio_Standards-ashrae_90_1.xlsx +0 -0
- data/data/standards/export_OpenStudio_libraries.rb +1 -1
- data/data/standards/manage_OpenStudio_Standards.rb +43 -87
- data/data/standards/metadata_units_OpenStudio_Standards-ashrae_90_1.csv +9 -0
- data/data/standards/openstudio_standards_duplicates_log.csv +142 -27
- data/data/standards/test_performance_expected_dd_results.csv +2016 -2016
- data/data/weather/CAN_NU_Iqaluit.AP.719090_CWEC2016.ddy +2316 -0
- data/data/weather/CAN_NU_Iqaluit.AP.719090_CWEC2016.epw +8768 -0
- data/data/weather/CAN_NU_Iqaluit.AP.719090_CWEC2016.stat +697 -0
- data/lib/openstudio-standards/btap/WeatherData1.json +54 -0
- data/lib/openstudio-standards/btap/WeatherData1.xlsx +0 -0
- data/lib/openstudio-standards/btap/btap_result.rb +12 -10
- data/lib/openstudio-standards/btap/envelope.rb +2 -2
- data/lib/openstudio-standards/btap/geometry.rb +96 -49
- data/lib/openstudio-standards/{utilities → btap/utilities}/Add_template_field_to_json.rb +0 -0
- data/lib/openstudio-standards/{utilities → btap/utilities}/convert_surfaces_to_adiabatic_necb_8426.rb +0 -0
- data/lib/openstudio-standards/{utilities → btap/utilities}/generate_space_types.rb +0 -0
- data/lib/openstudio-standards/{utilities → btap/utilities}/necb_to_epw_map.rb +0 -0
- data/lib/openstudio-standards/{utilities → btap/utilities}/os_sim_extract.rb +0 -0
- data/lib/openstudio-standards/{utilities → btap/utilities}/rename_surfaces.rb +0 -0
- data/lib/openstudio-standards/{utilities → btap/utilities}/round_surf_coords.rb +0 -0
- data/lib/openstudio-standards/{utilities → btap/utilities}/sched_create.rb +0 -0
- data/lib/openstudio-standards/{utilities → btap/utilities}/set_mult_to_adiabatic.rb +0 -0
- data/lib/openstudio-standards/btap/utilities/space_type.rb +78 -0
- data/lib/openstudio-standards/{utilities → btap/utilities}/weatherData1_xlsx_to_json.rb +0 -0
- data/lib/openstudio-standards/hvac_sizing/Siz.AirConditionerVariableRefrigerantFlow.rb +1 -1
- data/lib/openstudio-standards/hvac_sizing/Siz.HVACComponent.rb +1 -1
- data/lib/openstudio-standards/hvac_sizing/Siz.HeatingCoolingFuels.rb +20 -6
- data/lib/openstudio-standards/hvac_sizing/Siz.Model.rb +6 -6
- data/lib/openstudio-standards/hvac_sizing/Siz.WaterHeaterMixed.rb +2 -2
- data/lib/openstudio-standards/hvac_sizing/Siz.ZoneHVACTerminalUnitVariableRefrigerantFlow.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.AirTerminalSingleDuctVAVReheat.rb +2 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.PumpVariableSpeed.rb +6 -7
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.AirTerminalSingleDuctVAVReheat.rb +2 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.FanConstantVolume.rb +5 -4
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.FanOnOff.rb +5 -5
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.FanVariableVolume.rb +5 -4
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.PumpVariableSpeed.rb +6 -7
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.AirTerminalSingleDuctVAVReheat.rb +2 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.FanConstantVolume.rb +5 -4
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.FanOnOff.rb +5 -5
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.FanVariableVolume.rb +5 -4
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.Model.elevators.rb +6 -4
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.Model.rb +10 -9
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.PumpVariableSpeed.rb +9 -11
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirTerminalSingleDuctVAVReheat.rb +2 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.FanConstantVolume.rb +5 -4
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.FanOnOff.rb +5 -5
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.FanVariableVolume.rb +5 -4
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.Model.elevators.rb +11 -7
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.Model.rb +17 -16
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.PumpVariableSpeed.rb +9 -11
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.hvac_systems.rb +4 -2
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.AirTerminalSingleDuctVAVReheat.rb +2 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.FanConstantVolume.rb +5 -4
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.FanOnOff.rb +5 -5
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.FanVariableVolume.rb +5 -4
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.Model.elevators.rb +11 -7
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.Model.rb +23 -22
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.PumpVariableSpeed.rb +9 -10
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.hvac_systems.rb +4 -2
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirTerminalSingleDuctVAVReheat.rb +2 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.FanConstantVolume.rb +5 -4
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.FanOnOff.rb +5 -5
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.FanVariableVolume.rb +5 -4
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Model.elevators.rb +11 -7
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Model.rb +23 -22
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Pump.rb +89 -0
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.PumpVariableSpeed.rb +9 -10
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Space.rb +76 -0
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.hvac_systems.rb +22 -2
- data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.AirTerminalSingleDuctVAVReheat.rb +2 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.Model.elevators.rb +11 -11
- data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.refrigeration.rb +5 -4
- data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.AirTerminalSingleDuctVAVReheat.rb +2 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.CoilHeatingGas.rb +5 -4
- data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.Model.elevators.rb +11 -11
- data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.refrigeration.rb +5 -4
- data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.AirTerminalSingleDuctVAVReheat.rb +2 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.FanConstantVolume.rb +5 -4
- data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.FanOnOff.rb +5 -5
- data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.FanVariableVolume.rb +5 -4
- data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.HeatExchangerAirToAirSensibleAndLatent.rb +2 -0
- data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.Model.elevators.rb +11 -7
- data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.Model.rb +10 -10
- data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.hvac_systems.rb +4 -2
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirTerminalSingleDuctVAVReheat.rb +2 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.FanConstantVolume.rb +5 -4
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.FanOnOff.rb +5 -5
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.FanVariableVolume.rb +5 -4
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.HeatExchangerAirToAirSensibleAndLatent.rb +2 -0
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.Model.elevators.rb +11 -7
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.Model.rb +10 -10
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.hvac_systems.rb +4 -2
- data/lib/openstudio-standards/prototypes/cbes/cbes.Model.elevators.rb +3 -6
- data/lib/openstudio-standards/prototypes/cbes/cbes.refrigeration.rb +5 -4
- data/lib/openstudio-standards/prototypes/cbes/cbes_t24_2008/cbes_t24_2008.FanConstantVolume.rb +5 -3
- data/lib/openstudio-standards/prototypes/cbes/cbes_t24_2008/cbes_t24_2008.FanOnOff.rb +5 -4
- data/lib/openstudio-standards/prototypes/cbes/cbes_t24_2008/cbes_t24_2008.FanVariableVolume.rb +5 -3
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.College.rb +65 -30
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Courthouse.rb +54 -23
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.FullServiceRestaurant.rb +135 -147
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.HighRiseApartment.rb +42 -7
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Hospital.rb +85 -12
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Laboratory.rb +42 -30
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeDataCenterHighITE.rb +39 -8
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeDataCenterLowITE.rb +39 -8
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeHotel.rb +60 -12
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeOffice.rb +33 -265
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeOfficeDetailed.rb +41 -3
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.MediumOffice.rb +69 -297
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.MediumOfficeDetailed.rb +68 -25
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.MidriseApartment.rb +88 -59
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Outpatient.rb +88 -9
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.PrimarySchool.rb +48 -10
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.QuickServiceRestaurant.rb +130 -145
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.RetailStandalone.rb +29 -101
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.RetailStripmall.rb +24 -7
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SecondarySchool.rb +48 -589
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallDataCenterHighITE.rb +38 -7
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallDataCenterLowITE.rb +38 -8
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallHotel.rb +40 -7
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallOffice.rb +85 -171
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallOfficeDetailed.rb +87 -44
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SuperMarket.rb +46 -5
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SuperTallBuilding.rb +105 -17
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.TallBuilding.rb +97 -15
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Warehouse.rb +26 -167
- data/lib/openstudio-standards/prototypes/common/do_not_edit_metaclasses.rb +3828 -1131
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.AirConditionerVariableRefrigerantFlow.rb +3 -0
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.AirTerminalSingleDuctVAVReheat.rb +2 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.BoilerHotWater.rb +2 -0
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CentralAirSourceHeatPump.rb +2 -0
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingDXSingleSpeed.rb +4 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingDXTwoSpeed.rb +3 -0
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingWater.rb +4 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingWaterToAirHeatPumpEquationFit.rb +3 -0
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingDXSingleSpeed.rb +9 -0
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingElectric.rb +3 -0
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingGas.rb +9 -4
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingWater.rb +4 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingWaterToAirHeatPumpEquationFit.rb +3 -0
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.ControllerWaterCoil.rb +2 -2
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoolingTower.rb +4 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.Fan.rb +23 -2
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanConstantVolume.rb +29 -4
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanOnOff.rb +29 -5
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanVariableVolume.rb +43 -4
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanZoneExhaust.rb +22 -0
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.HeatExchangerAirToAirSensibleAndLatent.rb +46 -3
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.elevators.rb +27 -22
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.exterior_lights.rb +15 -8
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.hvac.rb +22 -4
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.rb +429 -59
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.swh.rb +18 -11
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.transformers.rb +11 -2
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.Pump.rb +1 -0
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.PumpVariableSpeed.rb +8 -10
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.ServiceWaterHeating.rb +37 -28
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.SizingSystem.rb +24 -6
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.hvac_systems.rb +251 -65
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.radiant_system_controls.rb +1 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.refrigeration.rb +46 -31
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.utilities.rb +62 -10
- data/lib/openstudio-standards/prototypes/common/prototype_metaprogramming.rb +76 -33
- data/lib/openstudio-standards/prototypes/deer/deer.Model.rb +1 -1
- data/lib/openstudio-standards/standards/Standards.AirLoopHVAC.rb +445 -275
- data/lib/openstudio-standards/standards/Standards.AirTerminalSingleDuctParallelPIUReheat.rb +3 -3
- data/lib/openstudio-standards/standards/Standards.AirTerminalSingleDuctVAVReheat.rb +26 -21
- data/lib/openstudio-standards/standards/Standards.BoilerHotWater.rb +5 -2
- data/lib/openstudio-standards/standards/Standards.BuildingStory.rb +7 -9
- data/lib/openstudio-standards/standards/Standards.ChillerElectricEIR.rb +8 -2
- data/lib/openstudio-standards/standards/Standards.CoilCoolingDXMultiSpeed.rb +10 -6
- data/lib/openstudio-standards/standards/Standards.CoilCoolingDXSingleSpeed.rb +5 -1
- data/lib/openstudio-standards/standards/Standards.CoilCoolingDXTwoSpeed.rb +6 -1
- data/lib/openstudio-standards/standards/Standards.CoilCoolingWaterToAirHeatPumpEquationFit.rb +45 -4
- data/lib/openstudio-standards/standards/Standards.CoilDX.rb +18 -8
- data/lib/openstudio-standards/standards/Standards.CoilHeatingDXMultiSpeed.rb +9 -7
- data/lib/openstudio-standards/standards/Standards.CoilHeatingDXSingleSpeed.rb +8 -4
- data/lib/openstudio-standards/standards/Standards.CoilHeatingGas.rb +86 -3
- data/lib/openstudio-standards/standards/Standards.CoilHeatingGasMultiStage.rb +5 -2
- data/lib/openstudio-standards/standards/Standards.CoilHeatingWaterToAirHeatPumpEquationFit.rb +6 -2
- data/lib/openstudio-standards/standards/Standards.Construction.rb +66 -35
- data/lib/openstudio-standards/standards/Standards.CoolingTower.rb +7 -7
- data/lib/openstudio-standards/standards/Standards.CoolingTowerSingleSpeed.rb +2 -2
- data/lib/openstudio-standards/standards/Standards.CoolingTowerTwoSpeed.rb +2 -1
- data/lib/openstudio-standards/standards/Standards.CoolingTowerVariableSpeed.rb +2 -1
- data/lib/openstudio-standards/standards/Standards.Fan.rb +53 -35
- data/lib/openstudio-standards/standards/Standards.FanVariableVolume.rb +22 -16
- data/lib/openstudio-standards/standards/Standards.FluidCooler.rb +2 -2
- data/lib/openstudio-standards/standards/Standards.HeaderedPumpsVariableSpeed.rb +4 -4
- data/lib/openstudio-standards/standards/Standards.HeatExchangerSensLat.rb +77 -19
- data/lib/openstudio-standards/standards/Standards.Model.rb +387 -245
- data/lib/openstudio-standards/standards/Standards.PlanarSurface.rb +13 -15
- data/lib/openstudio-standards/standards/Standards.PlantLoop.rb +94 -48
- data/lib/openstudio-standards/standards/Standards.Pump.rb +28 -20
- data/lib/openstudio-standards/standards/Standards.PumpVariableSpeed.rb +3 -4
- data/lib/openstudio-standards/standards/Standards.ScheduleCompact.rb +2 -1
- data/lib/openstudio-standards/standards/Standards.ScheduleConstant.rb +2 -0
- data/lib/openstudio-standards/standards/Standards.ScheduleRuleset.rb +34 -24
- data/lib/openstudio-standards/standards/Standards.Space.rb +179 -116
- data/lib/openstudio-standards/standards/Standards.SpaceType.rb +23 -12
- data/lib/openstudio-standards/standards/Standards.SubSurface.rb +55 -25
- data/lib/openstudio-standards/standards/Standards.Surface.rb +57 -32
- data/lib/openstudio-standards/standards/Standards.ThermalZone.rb +157 -107
- data/lib/openstudio-standards/standards/Standards.WaterHeaterMixed.rb +9 -6
- data/lib/openstudio-standards/standards/Standards.ZoneHVACComponent.rb +52 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1.Standards.FanVariableVolume.rb +2 -2
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1.rb +4 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.AirLoopHVAC.rb +28 -18
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.FanVariableVolume.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.PlantLoop.rb +4 -2
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.rb +4 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/comstock_ashrae_90_1_2004/comstock_ashrae_90_1_2004.rb +4 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/comstock_ashrae_90_1_2004/data/ashrae_90_1.schedules.json +696 -2938
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/comstock_ashrae_90_1_2004/data/comstock_ashrae_90_1_2004.ext_ltg.json +1 -1
- 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 +123 -123
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.furnaces.json +26 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.prototype_inputs.json +11 -11
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.refrigeration_system.json +0 -8
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.spc_typ.json +395 -384
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.unitary_acs.json +69 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.AirLoopHVAC.rb +20 -13
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.FanVariableVolume.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.Model.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.rb +4 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/comstock_ashrae_90_1_2007/comstock_ashrae_90_1_2007.rb +4 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/comstock_ashrae_90_1_2007/data/ashrae_90_1.schedules.json +696 -2938
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/comstock_ashrae_90_1_2007/data/comstock_ashrae_90_1_2007.ext_ltg.json +1 -1
- 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 +122 -122
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.furnaces.json +26 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.prototype_inputs.json +11 -11
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.refrigeration_system.json +0 -8
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.spc_typ.json +413 -401
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.unitary_acs.json +69 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.AirLoopHVAC.rb +42 -53
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.AirTerminalSingleDuctVAVReheat.rb +3 -2
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.CoolingTower.rb +5 -8
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.FanVariableVolume.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.Space.rb +6 -4
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.rb +4 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/comstock_ashrae_90_1_2010/comstock_ashrae_90_1_2010.rb +4 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/comstock_ashrae_90_1_2010/data/ashrae_90_1.schedules.json +696 -2938
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/comstock_ashrae_90_1_2010/data/comstock_ashrae_90_1_2010.ext_ltg.json +1 -1
- 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 +129 -129
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.energy_recovery.json +210 -42
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.furnaces.json +26 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.prototype_inputs.json +11 -11
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.refrigeration_system.json +0 -8
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.spc_typ.json +460 -320
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.unitary_acs.json +69 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirLoopHVAC.rb +45 -51
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirTerminalSingleDuctVAVReheat.rb +3 -2
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.CoolingTower.rb +5 -8
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.CoolingTowerVariableSpeed.rb +2 -3
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.FanVariableVolume.rb +2 -2
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.Space.rb +8 -5
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.ThermalZone.rb +2 -1
- 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 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.rb +4 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/comstock_ashrae_90_1_2013/comstock_ashrae_90_1_2013.rb +4 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/comstock_ashrae_90_1_2013/data/ashrae_90_1.schedules.json +696 -2938
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/comstock_ashrae_90_1_2013/data/comstock_ashrae_90_1_2013.ext_ltg.json +1 -1
- 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 +121 -121
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.energy_recovery.json +420 -84
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.furnaces.json +26 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.prototype_inputs.json +12 -12
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.refrigeration_system.json +0 -8
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.spc_typ.json +475 -335
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.unitary_acs.json +69 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.AirLoopHVAC.rb +40 -50
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.AirTerminalSingleDuctVAVReheat.rb +3 -2
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.CoolingTower.rb +5 -8
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.CoolingTowerVariableSpeed.rb +2 -3
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.FanVariableVolume.rb +2 -2
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.Space.rb +8 -5
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.ThermalZone.rb +2 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.ZoneHVACComponent.rb +1 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.rb +4 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/comstock_ashrae_90_1_2016/comstock_ashrae_90_1_2016.rb +4 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/comstock_ashrae_90_1_2016/data/ashrae_90_1.schedules.json +696 -2938
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/comstock_ashrae_90_1_2016/data/comstock_ashrae_90_1_2016.ext_ltg.json +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/comstock_ashrae_90_1_2016/data/comstock_ashrae_90_1_2016.spc_typ.json +152 -128
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.energy_recovery.json +488 -84
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.furnaces.json +26 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.spc_typ.json +47 -47
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.unitary_acs.json +69 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirLoopHVAC.rb +342 -56
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirTerminalSingleDuctVAVReheat.rb +3 -2
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.CoolingTower.rb +5 -8
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.CoolingTowerVariableSpeed.rb +2 -3
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.FanVariableVolume.rb +2 -2
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Space.rb +25 -5
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.ThermalZone.rb +2 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.ZoneHVACComponent.rb +30 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.rb +4 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/comstock_ashrae_90_1_2019/comstock_ashrae_90_1_2019.rb +4 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/comstock_ashrae_90_1_2019/data/ashrae_90_1.schedules.json +696 -2938
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/comstock_ashrae_90_1_2019/data/comstock_ashrae_90_1_2019.ext_ltg.json +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/comstock_ashrae_90_1_2019/data/comstock_ashrae_90_1_2019.spc_typ.json +151 -127
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.boilers.json +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.energy_recovery.json +2307 -101
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.furnaces.json +26 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.refrigeration_compressors.json +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.spc_typ.json +47 -47
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.unitary_acs.json +69 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.curves.json +25 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.schedules.json +286 -224
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/comstock_doe_ref_1980_2004/comstock_doe_ref_1980_2004.rb +4 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/comstock_doe_ref_1980_2004/data/ashrae_90_1.schedules.json +696 -2938
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/comstock_doe_ref_1980_2004/data/comstock_doe_ref_1980_2004.ext_ltg.json +1 -1
- 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 +126 -126
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.furnaces.json +26 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.prototype_inputs.json +11 -11
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.refrigeration_system.json +0 -8
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.spc_typ.json +405 -393
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.AirLoopHVAC.rb +15 -11
- 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 +3 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.rb +4 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/comstock_doe_ref_pre_1980/comstock_doe_ref_pre_1980.rb +4 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/comstock_doe_ref_pre_1980/data/ashrae_90_1.schedules.json +696 -2938
- 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 +121 -121
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.furnaces.json +37 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.prototype_inputs.json +11 -11
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.refrigeration_system.json +0 -8
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.spc_typ.json +403 -391
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.AirLoopHVAC.rb +15 -11
- 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 +3 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.rb +4 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/data/nrel_zne_ready_2017.furnaces.json +15 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.AirLoopHVAC.rb +64 -42
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.AirTerminalSingleDuctVAVReheat.rb +3 -2
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.CoolingTower.rb +5 -8
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.CoolingTowerVariableSpeed.rb +2 -3
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.FanVariableVolume.rb +2 -2
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.HeatExchangerSensLat.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.Model.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.PlantLoop.rb +4 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.Space.rb +5 -3
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.ZoneHVACComponent.rb +3 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.rb +4 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.furnaces.json +15 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirLoopHVAC.rb +61 -36
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirTerminalSingleDuctVAVReheat.rb +3 -2
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.CoolingTower.rb +5 -8
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.CoolingTowerVariableSpeed.rb +2 -3
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.FanVariableVolume.rb +2 -2
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.HeatExchangerSensLat.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.Model.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.PlantLoop.rb +4 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.Space.rb +6 -4
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.ZoneHVACComponent.rb +3 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.rb +4 -0
- data/lib/openstudio-standards/standards/cbes/cbes.AirLoopHVAC.rb +20 -14
- data/lib/openstudio-standards/standards/cbes/cbes.PlantLoop.rb +3 -0
- data/lib/openstudio-standards/standards/cbes/cbes.rb +4 -0
- data/lib/openstudio-standards/standards/cbes/cbes_pre_1978/cbes_pre_1978.rb +4 -0
- data/lib/openstudio-standards/standards/cbes/cbes_t24_1978/cbes_t24_1978.rb +4 -0
- data/lib/openstudio-standards/standards/cbes/cbes_t24_1992/cbes_t24_1992.rb +4 -0
- data/lib/openstudio-standards/standards/cbes/cbes_t24_2001/cbes_t24_2001.rb +4 -0
- data/lib/openstudio-standards/standards/cbes/cbes_t24_2005/cbes_t24_2005.rb +4 -0
- data/lib/openstudio-standards/standards/cbes/cbes_t24_2008/cbes_t24_2008.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer.AirLoopHVAC.rb +10 -5
- data/lib/openstudio-standards/standards/deer/deer.PlanarSurface.rb +1 -1
- data/lib/openstudio-standards/standards/deer/deer.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_1985/comstock_deer_1985/comstock_deer_1985.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_1985/comstock_deer_1985/data/comstock_deer_1985.ext_ltg.json +2 -2
- data/lib/openstudio-standards/standards/deer/deer_1985/deer_1985.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_1996/comstock_deer_1996/comstock_deer_1996.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_1996/comstock_deer_1996/data/comstock_deer_1996.ext_ltg.json +2 -2
- data/lib/openstudio-standards/standards/deer/deer_1996/deer_1996.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_2003/comstock_deer_2003/comstock_deer_2003.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_2003/comstock_deer_2003/data/comstock_deer_2003.ext_ltg.json +2 -2
- data/lib/openstudio-standards/standards/deer/deer_2003/deer_2003.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_2007/comstock_deer_2007/comstock_deer_2007.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_2007/comstock_deer_2007/data/comstock_deer_2007.ext_ltg.json +2 -2
- data/lib/openstudio-standards/standards/deer/deer_2007/deer_2007.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_2011/comstock_deer_2011/comstock_deer_2011.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_2011/comstock_deer_2011/data/comstock_deer_2011.ext_ltg.json +2 -2
- data/lib/openstudio-standards/standards/deer/deer_2011/deer_2011.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_2014/comstock_deer_2014/comstock_deer_2014.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_2014/comstock_deer_2014/data/comstock_deer_2014.ext_ltg.json +2 -2
- data/lib/openstudio-standards/standards/deer/deer_2014/deer_2014.Space.rb +5 -3
- data/lib/openstudio-standards/standards/deer/deer_2014/deer_2014.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_2015/comstock_deer_2015/comstock_deer_2015.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_2015/comstock_deer_2015/data/comstock_deer_2015.ext_ltg.json +2 -2
- data/lib/openstudio-standards/standards/deer/deer_2015/deer_2015.Space.rb +5 -3
- data/lib/openstudio-standards/standards/deer/deer_2015/deer_2015.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_2017/comstock_deer_2017/comstock_deer_2017.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_2017/comstock_deer_2017/data/comstock_deer_2017.ext_ltg.json +2 -2
- data/lib/openstudio-standards/standards/deer/deer_2017/deer_2017.Space.rb +5 -3
- data/lib/openstudio-standards/standards/deer/deer_2017/deer_2017.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_2020/comstock_deer_2020/comstock_deer_2020.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_2020/deer_2020.AirLoopHVAC.rb +9 -5
- data/lib/openstudio-standards/standards/deer/deer_2020/deer_2020.FanVariableVolume.rb +3 -0
- data/lib/openstudio-standards/standards/deer/deer_2020/deer_2020.Space.rb +5 -3
- data/lib/openstudio-standards/standards/deer/deer_2020/deer_2020.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_2025/comstock_deer_2025/comstock_deer_2025.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_2025/deer_2025.AirLoopHVAC.rb +9 -5
- data/lib/openstudio-standards/standards/deer/deer_2025/deer_2025.FanVariableVolume.rb +3 -0
- data/lib/openstudio-standards/standards/deer/deer_2025/deer_2025.Space.rb +5 -3
- data/lib/openstudio-standards/standards/deer/deer_2025/deer_2025.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_2030/comstock_deer_2030/comstock_deer_2030.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_2030/deer_2030.AirLoopHVAC.rb +9 -5
- data/lib/openstudio-standards/standards/deer/deer_2030/deer_2030.FanVariableVolume.rb +3 -0
- data/lib/openstudio-standards/standards/deer/deer_2030/deer_2030.Space.rb +5 -3
- data/lib/openstudio-standards/standards/deer/deer_2030/deer_2030.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_2035/comstock_deer_2035/comstock_deer_2035.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_2035/deer_2035.AirLoopHVAC.rb +9 -5
- data/lib/openstudio-standards/standards/deer/deer_2035/deer_2035.FanVariableVolume.rb +3 -0
- data/lib/openstudio-standards/standards/deer/deer_2035/deer_2035.Space.rb +5 -3
- data/lib/openstudio-standards/standards/deer/deer_2035/deer_2035.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_2040/comstock_deer_2040/comstock_deer_2040.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_2040/deer_2040.AirLoopHVAC.rb +9 -5
- data/lib/openstudio-standards/standards/deer/deer_2040/deer_2040.FanVariableVolume.rb +3 -0
- data/lib/openstudio-standards/standards/deer/deer_2040/deer_2040.Space.rb +5 -3
- data/lib/openstudio-standards/standards/deer/deer_2040/deer_2040.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_2045/comstock_deer_2045/comstock_deer_2045.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_2045/deer_2045.AirLoopHVAC.rb +9 -5
- data/lib/openstudio-standards/standards/deer/deer_2045/deer_2045.FanVariableVolume.rb +3 -0
- data/lib/openstudio-standards/standards/deer/deer_2045/deer_2045.Space.rb +5 -3
- data/lib/openstudio-standards/standards/deer/deer_2045/deer_2045.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_2050/comstock_deer_2050/comstock_deer_2050.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_2050/deer_2050.AirLoopHVAC.rb +9 -5
- data/lib/openstudio-standards/standards/deer/deer_2050/deer_2050.FanVariableVolume.rb +3 -0
- data/lib/openstudio-standards/standards/deer/deer_2050/deer_2050.Space.rb +5 -3
- data/lib/openstudio-standards/standards/deer/deer_2050/deer_2050.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_2055/comstock_deer_2055/comstock_deer_2055.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_2055/deer_2055.AirLoopHVAC.rb +9 -5
- data/lib/openstudio-standards/standards/deer/deer_2055/deer_2055.FanVariableVolume.rb +3 -0
- data/lib/openstudio-standards/standards/deer/deer_2055/deer_2055.Space.rb +5 -3
- data/lib/openstudio-standards/standards/deer/deer_2055/deer_2055.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_2060/comstock_deer_2060/comstock_deer_2060.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_2060/deer_2060.AirLoopHVAC.rb +9 -5
- data/lib/openstudio-standards/standards/deer/deer_2060/deer_2060.FanVariableVolume.rb +3 -0
- data/lib/openstudio-standards/standards/deer/deer_2060/deer_2060.Space.rb +5 -3
- data/lib/openstudio-standards/standards/deer/deer_2060/deer_2060.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_2065/comstock_deer_2065/comstock_deer_2065.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_2065/deer_2065.AirLoopHVAC.rb +9 -5
- data/lib/openstudio-standards/standards/deer/deer_2065/deer_2065.FanVariableVolume.rb +3 -0
- data/lib/openstudio-standards/standards/deer/deer_2065/deer_2065.Space.rb +5 -3
- data/lib/openstudio-standards/standards/deer/deer_2065/deer_2065.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_2070/comstock_deer_2070/comstock_deer_2070.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_2070/deer_2070.AirLoopHVAC.rb +9 -5
- data/lib/openstudio-standards/standards/deer/deer_2070/deer_2070.FanVariableVolume.rb +3 -0
- data/lib/openstudio-standards/standards/deer/deer_2070/deer_2070.Space.rb +5 -3
- data/lib/openstudio-standards/standards/deer/deer_2070/deer_2070.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_2075/comstock_deer_2075/comstock_deer_2075.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_2075/deer_2075.AirLoopHVAC.rb +9 -5
- data/lib/openstudio-standards/standards/deer/deer_2075/deer_2075.FanVariableVolume.rb +3 -0
- data/lib/openstudio-standards/standards/deer/deer_2075/deer_2075.Space.rb +5 -3
- data/lib/openstudio-standards/standards/deer/deer_2075/deer_2075.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_pre_1975/comstock_deer_pre_1975/comstock_deer_pre_1975.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_pre_1975/comstock_deer_pre_1975/data/comstock_deer_pre_1975.ext_ltg.json +2 -2
- data/lib/openstudio-standards/standards/deer/deer_pre_1975/deer_pre_1975.rb +4 -0
- data/lib/openstudio-standards/standards/icc_iecc/icc_iecc_2015/icc_iecc_2015.rb +4 -0
- data/lib/openstudio-standards/standards/necb/BTAP1980TO2010/btap_1980to2010.rb +6 -28
- data/lib/openstudio-standards/standards/necb/BTAPPRE1980/btap_pre1980.rb +25 -110
- data/lib/openstudio-standards/standards/necb/BTAPPRE1980/building_envelope.rb +45 -60
- data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_3_and_8_single_speed.rb +19 -23
- data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_4.rb +84 -83
- data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_6.rb +52 -47
- data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_systems.rb +43 -40
- data/lib/openstudio-standards/standards/necb/ECMS/data/boiler_set.json +18 -0
- data/lib/openstudio-standards/standards/necb/ECMS/data/chiller_set.json +211 -0
- data/lib/openstudio-standards/standards/necb/ECMS/data/curves.json +1195 -20
- data/lib/openstudio-standards/standards/necb/ECMS/data/furnace_set.json +18 -0
- data/lib/openstudio-standards/standards/necb/ECMS/data/heat_pumps.json +244 -182
- data/lib/openstudio-standards/standards/necb/ECMS/data/heat_pumps_heating.json +232 -185
- data/lib/openstudio-standards/standards/necb/ECMS/data/shw_set.json +20 -2
- data/lib/openstudio-standards/standards/necb/ECMS/ecms.rb +18 -25
- data/lib/openstudio-standards/standards/necb/ECMS/erv.rb +12 -13
- data/lib/openstudio-standards/standards/necb/ECMS/hvac_systems.rb +1647 -466
- data/lib/openstudio-standards/standards/necb/ECMS/loads.rb +93 -0
- data/lib/openstudio-standards/standards/necb/ECMS/nv.rb +40 -47
- data/lib/openstudio-standards/standards/necb/ECMS/pv_ground.rb +26 -25
- data/lib/openstudio-standards/standards/necb/NECB2011/autozone.rb +303 -305
- data/lib/openstudio-standards/standards/necb/NECB2011/beps_compliance_path.rb +45 -45
- data/lib/openstudio-standards/standards/necb/NECB2011/building_envelope.rb +90 -120
- data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/Hospital.osm +1176 -1115
- data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/LowriseApartment.osm +8279 -28923
- data/lib/openstudio-standards/standards/necb/NECB2011/data/space_types.json +1173 -1173
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_1_multi_speed.rb +15 -13
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_1_single_speed.rb +32 -29
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_2_and_5.rb +25 -26
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_3_and_8_multi_speed.rb +14 -14
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_3_and_8_single_speed.rb +24 -29
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_4.rb +85 -84
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_6.rb +41 -42
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_systems.rb +209 -197
- data/lib/openstudio-standards/standards/necb/NECB2011/lighting.rb +87 -82
- data/lib/openstudio-standards/standards/necb/NECB2011/necb_2011.rb +510 -406
- data/lib/openstudio-standards/standards/necb/NECB2011/nv.md +3 -3
- data/lib/openstudio-standards/standards/necb/NECB2011/qaqc/necb_qaqc.rb +686 -683
- data/lib/openstudio-standards/standards/necb/NECB2011/service_water_heating.rb +129 -82
- data/lib/openstudio-standards/standards/necb/NECB2015/data/space_types.json +1608 -1608
- data/lib/openstudio-standards/standards/necb/NECB2015/hvac_systems.rb +25 -18
- data/lib/openstudio-standards/standards/necb/NECB2015/lighting.rb +73 -67
- data/lib/openstudio-standards/standards/necb/NECB2015/necb_2015.rb +18 -22
- data/lib/openstudio-standards/standards/necb/NECB2015/qaqc/necb_2015_qaqc.rb +59 -63
- data/lib/openstudio-standards/standards/necb/NECB2017/data/space_types.json +1608 -1608
- data/lib/openstudio-standards/standards/necb/NECB2017/hvac_systems.rb +1 -4
- data/lib/openstudio-standards/standards/necb/NECB2017/necb_2017.rb +10 -14
- data/lib/openstudio-standards/standards/necb/NECB2020/building_envelope.rb +779 -0
- data/lib/openstudio-standards/standards/necb/NECB2020/data/boilers.json +122 -0
- data/lib/openstudio-standards/standards/necb/NECB2020/data/chillers.json +335 -0
- data/lib/openstudio-standards/standards/necb/NECB2020/data/constants.json +13 -0
- data/lib/openstudio-standards/standards/necb/NECB2020/data/furnaces.json +41 -0
- data/lib/openstudio-standards/standards/necb/NECB2020/data/heat_pumps.json +452 -0
- data/lib/openstudio-standards/standards/necb/NECB2020/data/heat_pumps_heating.json +164 -0
- data/lib/openstudio-standards/standards/necb/NECB2020/data/heat_rejection.json +228 -0
- data/lib/openstudio-standards/standards/necb/NECB2020/data/led_lighting_data.json +2883 -0
- data/lib/openstudio-standards/standards/necb/NECB2020/data/space_types.json +25851 -0
- data/lib/openstudio-standards/standards/necb/NECB2020/data/surface_thermal_transmittance.json +60 -0
- data/lib/openstudio-standards/standards/necb/NECB2020/data/unitary_acs.json +585 -0
- data/lib/openstudio-standards/standards/necb/NECB2020/necb_2020.rb +175 -0
- data/lib/openstudio-standards/standards/necb/common/bc_step_code_indicators.md +10 -0
- data/lib/openstudio-standards/standards/necb/common/btap_data.rb +1963 -0
- data/lib/openstudio-standards/standards/necb/common/btap_datapoint.rb +410 -0
- data/lib/openstudio-standards/standards/necb/common/neb_end_use_prices.csv +42 -0
- data/lib/openstudio-standards/standards/necb/common/necb_reference_runs.csv +28705 -0
- data/lib/openstudio-standards/standards/necb/common/phius.md +23 -0
- data/lib/openstudio-standards/standards/necb/common/space_type_upgrade_map.json +1158 -386
- data/lib/openstudio-standards/standards/oeesc/oeesc_2014/oeesc_2014.rb +4 -0
- data/lib/openstudio-standards/standards/standard.rb +2 -1
- data/lib/openstudio-standards/utilities/define_thermal_zone_and_mulitpliers.rb +1 -1
- data/lib/openstudio-standards/utilities/logging.rb +6 -0
- data/lib/openstudio-standards/utilities/simulation.rb +30 -14
- data/lib/openstudio-standards/utilities/{speacetype_map_converter.rb → spacetype_map_converter.rb} +0 -0
- data/lib/openstudio-standards/utilities/sqlfile.rb +112 -71
- data/lib/openstudio-standards/version.rb +2 -2
- data/lib/openstudio-standards/weather/Weather.Model.rb +209 -9
- data/lib/openstudio-standards/weather/Weather.stat_file.rb +1 -1
- data/lib/openstudio-standards.rb +9 -0
- metadata +106 -205
- data/data/standards/OpenStudio_Standards-ashrae_90_1-ALL-comstock(space_types).xlsx +0 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.boilers.json +0 -49
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.chillers.json +0 -293
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.construction_properties.json +0 -25426
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.construction_sets.json +0 -1600
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.economizers.json +0 -564
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.elevators.json +0 -349
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.ext_ltg.json +0 -164
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.ground_temperatures.json +0 -10663
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.heat_pumps.json +0 -508
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.heat_pumps_heating.json +0 -156
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.heat_rejection.json +0 -44
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.motors.json +0 -184
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.prototype_inputs.json +0 -3094
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.ref_cases.json +0 -829
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.ref_lnup.json +0 -562
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.refrigeration_compressors.json +0 -52
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.refrigeration_condenser.json +0 -220
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.refrigeration_system.json +0 -156
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.refrigeration_walkins.json +0 -1316
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.spc_typ.json +0 -21446
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.unitary_acs.json +0 -554
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.water_heaters.json +0 -68
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.water_source_heat_pumps.json +0 -28
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.water_source_heat_pumps_heating.json +0 -12
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.boilers.json +0 -49
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.chillers.json +0 -293
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.construction_properties.json +0 -12487
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.construction_sets.json +0 -1600
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.economizers.json +0 -564
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.elevators.json +0 -349
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.ext_ltg.json +0 -164
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.ground_temperatures.json +0 -10663
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.heat_pumps.json +0 -466
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.heat_pumps_heating.json +0 -137
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.heat_rejection.json +0 -44
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.motors.json +0 -184
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.prototype_inputs.json +0 -3094
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.ref_cases.json +0 -829
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.ref_lnup.json +0 -562
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.refrigeration_compressors.json +0 -52
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.refrigeration_condenser.json +0 -220
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.refrigeration_system.json +0 -156
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.refrigeration_walkins.json +0 -1316
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.spc_typ.json +0 -21380
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.unitary_acs.json +0 -554
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.water_heaters.json +0 -68
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.water_source_heat_pumps.json +0 -28
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.water_source_heat_pumps_heating.json +0 -12
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.boilers.json +0 -49
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.chillers.json +0 -395
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.construction_properties.json +0 -12487
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.construction_sets.json +0 -1600
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.economizers.json +0 -592
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.elevators.json +0 -349
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.energy_recovery.json +0 -550
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.ext_ltg.json +0 -164
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.ground_temperatures.json +0 -10663
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.heat_pumps.json +0 -466
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.heat_pumps_heating.json +0 -137
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.heat_rejection.json +0 -44
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.motors.json +0 -238
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.prototype_inputs.json +0 -3094
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.ref_cases.json +0 -829
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.ref_lnup.json +0 -562
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.refrigeration_compressors.json +0 -52
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.refrigeration_condenser.json +0 -220
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.refrigeration_system.json +0 -156
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.refrigeration_walkins.json +0 -1316
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.spc_typ.json +0 -21548
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.unitary_acs.json +0 -554
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.water_heaters.json +0 -68
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.water_source_heat_pumps.json +0 -28
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.water_source_heat_pumps_heating.json +0 -12
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.boilers.json +0 -64
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.chillers.json +0 -871
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.construction_properties.json +0 -12487
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.construction_sets.json +0 -1600
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.economizers.json +0 -592
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.elevators.json +0 -349
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.energy_recovery.json +0 -1096
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.ext_ltg.json +0 -164
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.ground_temperatures.json +0 -10663
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.heat_pumps.json +0 -886
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.heat_pumps_heating.json +0 -194
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.heat_rejection.json +0 -44
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.motors.json +0 -247
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.prototype_inputs.json +0 -3094
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.ref_cases.json +0 -829
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.ref_lnup.json +0 -562
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.refrigeration_compressors.json +0 -52
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.refrigeration_condenser.json +0 -220
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.refrigeration_system.json +0 -156
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.refrigeration_walkins.json +0 -1316
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.spc_typ.json +0 -22079
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.unitary_acs.json +0 -994
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.water_heaters.json +0 -68
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.water_source_heat_pumps.json +0 -28
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.water_source_heat_pumps_heating.json +0 -12
- data/lib/openstudio-standards/utilities/convert_costing_constructions.rb +0 -105
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
class ECMS
|
|
2
|
-
|
|
3
2
|
# =============================================================================================================================
|
|
4
3
|
# Remove existing zone equipment
|
|
5
4
|
def remove_all_zone_eqpt(sys_objs)
|
|
6
5
|
sys_objs.each do |isys|
|
|
7
6
|
isys.thermalZones.each do |izone|
|
|
8
|
-
if
|
|
9
|
-
|
|
7
|
+
if izone.equipment.empty? then next end
|
|
8
|
+
|
|
9
|
+
izone.equipment.each(&:remove)
|
|
10
10
|
end
|
|
11
11
|
end
|
|
12
12
|
end
|
|
@@ -17,7 +17,7 @@ class ECMS
|
|
|
17
17
|
model.getPlantLoops.each do |iloop|
|
|
18
18
|
hw_loop = false
|
|
19
19
|
iloop.supplyComponents.each do |icomp|
|
|
20
|
-
if
|
|
20
|
+
if icomp.to_BoilerHotWater.is_initialized
|
|
21
21
|
hw_loop = true
|
|
22
22
|
break
|
|
23
23
|
end
|
|
@@ -32,7 +32,7 @@ class ECMS
|
|
|
32
32
|
model.getPlantLoops.each do |iloop|
|
|
33
33
|
chw_loop = false
|
|
34
34
|
iloop.supplyComponents.each do |icomp|
|
|
35
|
-
if
|
|
35
|
+
if icomp.to_ChillerElectricEIR.is_initialized
|
|
36
36
|
chw_loop = true
|
|
37
37
|
break
|
|
38
38
|
end
|
|
@@ -47,7 +47,7 @@ class ECMS
|
|
|
47
47
|
model.getPlantLoops.each do |iloop|
|
|
48
48
|
cw_loop = false
|
|
49
49
|
iloop.supplyComponents.each do |icomp|
|
|
50
|
-
if
|
|
50
|
+
if icomp.to_CoolingTowerSingleSpeed.is_initialized
|
|
51
51
|
cw_loop = true
|
|
52
52
|
end
|
|
53
53
|
end
|
|
@@ -59,9 +59,7 @@ class ECMS
|
|
|
59
59
|
# Remove air loops
|
|
60
60
|
def remove_air_loops(model)
|
|
61
61
|
# remove air loops
|
|
62
|
-
model.getAirLoopHVACs.each
|
|
63
|
-
iloop.remove
|
|
64
|
-
end
|
|
62
|
+
model.getAirLoopHVACs.each(&:remove)
|
|
65
63
|
end
|
|
66
64
|
|
|
67
65
|
# =============================================================================================================================
|
|
@@ -72,13 +70,13 @@ class ECMS
|
|
|
72
70
|
systems.each do |system|
|
|
73
71
|
zones = system.thermalZones
|
|
74
72
|
map_systems_to_zones[system.name.to_s] = zones
|
|
75
|
-
if system.sizingSystem.typeofLoadtoSizeOn.to_s ==
|
|
73
|
+
if system.sizingSystem.typeofLoadtoSizeOn.to_s == 'VentilationRequirement'
|
|
76
74
|
system_doas_flags[system.name.to_s] = true
|
|
77
75
|
else
|
|
78
76
|
system_doas_flags[system.name.to_s] = false
|
|
79
77
|
end
|
|
80
78
|
end
|
|
81
|
-
return map_systems_to_zones,system_doas_flags
|
|
79
|
+
return map_systems_to_zones, system_doas_flags
|
|
82
80
|
end
|
|
83
81
|
|
|
84
82
|
# =============================================================================================================================
|
|
@@ -88,7 +86,7 @@ class ECMS
|
|
|
88
86
|
model.getThermalZones.each do |zone|
|
|
89
87
|
zone.equipment.each do |eqpt|
|
|
90
88
|
if eqpt.to_ZoneHVACPackagedTerminalAirConditioner.is_initialized
|
|
91
|
-
zone_clg_eqpt_type[zone.name.to_s] =
|
|
89
|
+
zone_clg_eqpt_type[zone.name.to_s] = 'ZoneHVACPackagedTerminalAirConditioner'
|
|
92
90
|
break
|
|
93
91
|
end
|
|
94
92
|
end
|
|
@@ -112,7 +110,7 @@ class ECMS
|
|
|
112
110
|
if zone.thermostat.is_initialized
|
|
113
111
|
if zone.thermostat.get.to_ThermostatSetpointDualSetpoint.is_initialized
|
|
114
112
|
if zone.thermostat.get.to_ThermostatSetpointDualSetpoint.get.heatingSetpointTemperatureSchedule.is_initialized ||
|
|
115
|
-
|
|
113
|
+
zone.thermostat.get.to_ThermostatSetpointDualSetpoint.get.coolingSetpointTemperatureSchedule.is_initialized
|
|
116
114
|
storey_cond = true
|
|
117
115
|
end
|
|
118
116
|
end
|
|
@@ -120,7 +118,7 @@ class ECMS
|
|
|
120
118
|
end
|
|
121
119
|
# Find average height of z-coordinates of ceiling/roof of floor
|
|
122
120
|
space.surfaces.each do |surf|
|
|
123
|
-
if
|
|
121
|
+
if surf.surfaceType.to_s.upcase == 'ROOFCEILING'
|
|
124
122
|
sum += (surf.centroid.z.to_f + space.zOrigin.to_f) * surf.grossArea.to_f
|
|
125
123
|
total_area += surf.grossArea.to_f
|
|
126
124
|
end
|
|
@@ -136,14 +134,17 @@ class ECMS
|
|
|
136
134
|
# =============================================================================================================================
|
|
137
135
|
# Return x,y,z coordinates of exterior wall with largest area on the lowest floor
|
|
138
136
|
def get_lowest_floor_ext_wall_centroid_coords(storeys_clg_zcoords)
|
|
139
|
-
ext_wall
|
|
137
|
+
ext_wall = nil
|
|
138
|
+
ext_wall_x = nil
|
|
139
|
+
ext_wall_y = nil
|
|
140
|
+
ext_wall_z = nil
|
|
140
141
|
storeys_clg_zcoords.keys.each do |storey|
|
|
141
142
|
max_area = 0.0
|
|
142
|
-
sorted_spaces = storey.spaces.sort_by {|space| space.name.to_s}
|
|
143
|
+
sorted_spaces = storey.spaces.sort_by { |space| space.name.to_s }
|
|
143
144
|
sorted_spaces.each do |space|
|
|
144
|
-
ext_walls = space.surfaces.select {|surf| (surf.surfaceType.to_s.upcase ==
|
|
145
|
-
ext_walls = ext_walls.sort_by {|wall| wall.grossArea.to_f}
|
|
146
|
-
if
|
|
145
|
+
ext_walls = space.surfaces.select { |surf| (surf.surfaceType.to_s.upcase == 'WALL') && (surf.outsideBoundaryCondition.to_s.upcase == 'OUTDOORS') }
|
|
146
|
+
ext_walls = ext_walls.sort_by { |wall| wall.grossArea.to_f }
|
|
147
|
+
if !ext_walls.empty?
|
|
147
148
|
if ext_walls.last.grossArea.to_f > max_area
|
|
148
149
|
max_area = ext_walls.last.grossArea.to_f
|
|
149
150
|
ext_wall_x = ext_walls.last.centroid.x.to_f + space.xOrigin.to_f
|
|
@@ -153,20 +154,22 @@ class ECMS
|
|
|
153
154
|
end
|
|
154
155
|
end
|
|
155
156
|
end
|
|
156
|
-
break unless
|
|
157
|
+
break unless !ext_wall
|
|
157
158
|
end
|
|
158
|
-
if
|
|
159
|
-
OpenStudio.logFree(OpenStudio::Info, 'openstudiostandards.get_lowest_floor_ext_wall_centroid_coords','Did not find an exteior wall in the building!')
|
|
159
|
+
if !ext_wall
|
|
160
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudiostandards.get_lowest_floor_ext_wall_centroid_coords', 'Did not find an exteior wall in the building!')
|
|
160
161
|
end
|
|
161
162
|
|
|
162
|
-
return ext_wall_x,ext_wall_y,ext_wall_z
|
|
163
|
+
return ext_wall_x, ext_wall_y, ext_wall_z
|
|
163
164
|
end
|
|
164
165
|
|
|
165
166
|
# =============================================================================================================================
|
|
166
167
|
# Return x,y,z coordinates of space centroid
|
|
167
168
|
def get_space_centroid_coords(space)
|
|
168
169
|
total_area = 0.0
|
|
169
|
-
sum_x
|
|
170
|
+
sum_x = 0.0
|
|
171
|
+
sum_y = 0.0
|
|
172
|
+
sum_z = 0.0
|
|
170
173
|
space.surfaces.each do |surf|
|
|
171
174
|
total_area += surf.grossArea.to_f
|
|
172
175
|
sum_x += (surf.centroid.x.to_f + space.xOrigin.to_f) * surf.grossArea.to_f
|
|
@@ -177,16 +180,21 @@ class ECMS
|
|
|
177
180
|
space_centroid_y = sum_y / total_area
|
|
178
181
|
space_centroid_z = sum_z / total_area
|
|
179
182
|
|
|
180
|
-
return space_centroid_x,space_centroid_y,space_centroid_z
|
|
183
|
+
return space_centroid_x, space_centroid_y, space_centroid_z
|
|
181
184
|
end
|
|
182
185
|
|
|
183
186
|
# =============================================================================================================================
|
|
184
187
|
# Return x,y,z coordinates of the centroid of the roof of the storey
|
|
185
188
|
def get_roof_centroid_coords(storey)
|
|
186
|
-
sum_x
|
|
187
|
-
|
|
189
|
+
sum_x = 0.0
|
|
190
|
+
sum_y = 0.0
|
|
191
|
+
sum_z = 0.0
|
|
192
|
+
total_area = 0.0
|
|
193
|
+
cent_x = nil
|
|
194
|
+
cent_y = nil
|
|
195
|
+
cent_z = nil
|
|
188
196
|
storey.spaces.each do |space|
|
|
189
|
-
roof_surfaces = space.surfaces.select {|surf| (surf.surfaceType.to_s.upcase ==
|
|
197
|
+
roof_surfaces = space.surfaces.select { |surf| (surf.surfaceType.to_s.upcase == 'ROOFCEILING') && (surf.outsideBoundaryCondition.to_s.upcase == 'OUTDOORS') }
|
|
190
198
|
roof_surfaces.each do |surf|
|
|
191
199
|
sum_x += (surf.centroid.x.to_f + space.xOrigin.to_f) * surf.grossArea.to_f
|
|
192
200
|
sum_y += (surf.centroid.y.to_f + space.yOrigin.to_f) * surf.grossArea.to_f
|
|
@@ -199,10 +207,10 @@ class ECMS
|
|
|
199
207
|
cent_y = sum_y / total_area
|
|
200
208
|
cent_z = sum_z / total_area
|
|
201
209
|
else
|
|
202
|
-
OpenStudio.logFree(OpenStudio::Info, 'openstudiostandards.get_roof_centroid_coords','Did not find a roof on the top floor!')
|
|
210
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudiostandards.get_roof_centroid_coords', 'Did not find a roof on the top floor!')
|
|
203
211
|
end
|
|
204
212
|
|
|
205
|
-
return cent_x,cent_y,cent_z
|
|
213
|
+
return cent_x, cent_y, cent_z
|
|
206
214
|
end
|
|
207
215
|
|
|
208
216
|
# =============================================================================================================================
|
|
@@ -210,14 +218,14 @@ class ECMS
|
|
|
210
218
|
def get_max_vrf_pipe_lengths(model)
|
|
211
219
|
# Get and sort floors average ceilings z-coordinates hash
|
|
212
220
|
storeys_clg_zcoords = get_storey_avg_clg_zcoords(model)
|
|
213
|
-
storeys_clg_zcoords = storeys_clg_zcoords.sort_by {|key,value| value[1]}.to_h
|
|
221
|
+
storeys_clg_zcoords = storeys_clg_zcoords.sort_by { |key, value| value[1] }.to_h # sort storeys hash based on ceiling/roof z-coordinate
|
|
214
222
|
if storeys_clg_zcoords.values.last[0]
|
|
215
223
|
# If the top floor is conditioned, then assume the top floor is not an attic floor and place the VRF outdoor unit at the roof centroid
|
|
216
|
-
location_cent_x,location_cent_y,location_cent_z = get_roof_centroid_coords(storeys_clg_zcoords.keys.last)
|
|
224
|
+
location_cent_x, location_cent_y, location_cent_z = get_roof_centroid_coords(storeys_clg_zcoords.keys.last)
|
|
217
225
|
else
|
|
218
226
|
# If the top floor is not conditioned, then assume it's an attic floor. In this case place the VRF outdoor unit next to the centroid
|
|
219
227
|
# of the exterior wall with the largest area on the lowest floor.
|
|
220
|
-
location_cent_x,location_cent_y,location_cent_z = get_lowest_floor_ext_wall_centroid_coords(storeys_clg_zcoords)
|
|
228
|
+
location_cent_x, location_cent_y, location_cent_z = get_lowest_floor_ext_wall_centroid_coords(storeys_clg_zcoords)
|
|
221
229
|
end
|
|
222
230
|
# Initialize distances
|
|
223
231
|
max_equiv_distance = 0.0
|
|
@@ -225,42 +233,46 @@ class ECMS
|
|
|
225
233
|
min_vert_distance = 0.0
|
|
226
234
|
storeys_clg_zcoords.keys.each do |storey|
|
|
227
235
|
next unless storeys_clg_zcoords[storey][0]
|
|
236
|
+
|
|
228
237
|
storey.spaces.each do |space|
|
|
229
238
|
# Is there a VRF terminal unit in the space/zone?
|
|
230
239
|
vrf_term_units = []
|
|
231
240
|
if space.thermalZone.is_initialized
|
|
232
|
-
vrf_term_units = space.thermalZone.get.equipment.select {|eqpt| eqpt.to_ZoneHVACTerminalUnitVariableRefrigerantFlow.is_initialized}
|
|
241
|
+
vrf_term_units = space.thermalZone.get.equipment.select { |eqpt| eqpt.to_ZoneHVACTerminalUnitVariableRefrigerantFlow.is_initialized }
|
|
233
242
|
end
|
|
234
|
-
next
|
|
235
|
-
|
|
243
|
+
next if vrf_term_units.empty?
|
|
244
|
+
|
|
245
|
+
space_centroid_x, space_centroid_y, space_centroid_z = get_space_centroid_coords(space)
|
|
236
246
|
# Update max horizontal and vertical distances if needed
|
|
237
247
|
equiv_distance = (location_cent_x.to_f - space_centroid_x.to_f).abs +
|
|
238
|
-
|
|
239
|
-
|
|
248
|
+
(location_cent_y.to_f - space_centroid_y.to_f).abs +
|
|
249
|
+
(location_cent_z.to_f - space_centroid_z.to_f).abs
|
|
240
250
|
if equiv_distance > max_equiv_distance then max_equiv_distance = equiv_distance end
|
|
241
|
-
pos_vert_distance = [space_centroid_z.to_f-location_cent_z.to_f,0.0].max
|
|
251
|
+
pos_vert_distance = [space_centroid_z.to_f - location_cent_z.to_f, 0.0].max
|
|
242
252
|
if pos_vert_distance > max_vert_distance then max_vert_distance = pos_vert_distance end
|
|
243
|
-
neg_vert_distance = [space_centroid_z.to_f-location_cent_z.to_f,0.0].min
|
|
253
|
+
neg_vert_distance = [space_centroid_z.to_f - location_cent_z.to_f, 0.0].min
|
|
244
254
|
if neg_vert_distance < min_vert_distance then min_vert_distance = neg_vert_distance end
|
|
245
255
|
end
|
|
246
256
|
end
|
|
247
257
|
max_net_vert_distance = max_vert_distance + min_vert_distance
|
|
248
|
-
max_net_vert_distance = [max_net_vert_distance,0.000001].max
|
|
258
|
+
max_net_vert_distance = [max_net_vert_distance, 0.000001].max
|
|
249
259
|
|
|
250
|
-
return max_equiv_distance,max_net_vert_distance
|
|
260
|
+
return max_equiv_distance, max_net_vert_distance
|
|
251
261
|
end
|
|
252
262
|
|
|
253
263
|
# =============================================================================================================================
|
|
254
264
|
# Add an outdoor VRF unit
|
|
255
|
-
def add_outdoor_vrf_unit(model:,
|
|
265
|
+
def add_outdoor_vrf_unit(model:,
|
|
266
|
+
ecm_name: nil,
|
|
267
|
+
condenser_type: 'AirCooled')
|
|
256
268
|
outdoor_vrf_unit = OpenStudio::Model::AirConditionerVariableRefrigerantFlow.new(model)
|
|
257
|
-
outdoor_vrf_unit.setName(
|
|
269
|
+
outdoor_vrf_unit.setName('VRF Outdoor Unit')
|
|
258
270
|
outdoor_vrf_unit.setHeatPumpWasteHeatRecovery(true)
|
|
259
271
|
outdoor_vrf_unit.setRatedHeatingCOP(4.0)
|
|
260
272
|
outdoor_vrf_unit.setRatedCoolingCOP(4.0)
|
|
261
273
|
outdoor_vrf_unit.setMinimumOutdoorTemperatureinHeatingMode(-25.0)
|
|
262
|
-
outdoor_vrf_unit.setHeatingPerformanceCurveOutdoorTemperatureType(
|
|
263
|
-
outdoor_vrf_unit.setMasterThermostatPriorityControlType(
|
|
274
|
+
outdoor_vrf_unit.setHeatingPerformanceCurveOutdoorTemperatureType('WetBulbTemperature')
|
|
275
|
+
outdoor_vrf_unit.setMasterThermostatPriorityControlType('ThermostatOffsetPriority')
|
|
264
276
|
outdoor_vrf_unit.setDefrostControl('OnDemand')
|
|
265
277
|
outdoor_vrf_unit.setDefrostStrategy('ReverseCycle')
|
|
266
278
|
outdoor_vrf_unit.autosizeResistiveDefrostHeaterCapacity
|
|
@@ -278,11 +290,12 @@ class ECMS
|
|
|
278
290
|
outdoor_vrf_unit.setHeatRecoveryCoolingEnergyTimeConstant(0.0)
|
|
279
291
|
outdoor_vrf_unit.setMinimumHeatPumpPartLoadRatio(0.5)
|
|
280
292
|
outdoor_vrf_unit.setCondenserType(condenser_type)
|
|
281
|
-
outdoor_vrf_unit.setCrankcaseHeaterPowerperCompressor(
|
|
293
|
+
outdoor_vrf_unit.setCrankcaseHeaterPowerperCompressor(1.0e-6)
|
|
282
294
|
heat_defrost_eir_ft = nil
|
|
283
295
|
if ecm_name
|
|
284
|
-
search_criteria =
|
|
285
|
-
|
|
296
|
+
search_criteria = {}
|
|
297
|
+
search_criteria['name'] = 'Mitsubishi_Hyper_Heating_VRF_Outdoor_Unit'
|
|
298
|
+
props = model_find_object(standards_data['tables']['heat_pump_heating_ecm']['table'], search_criteria, 1.0)
|
|
286
299
|
heat_defrost_eir_ft = model_add_curve(model, props['heat_defrost_eir_ft'])
|
|
287
300
|
end
|
|
288
301
|
if heat_defrost_eir_ft
|
|
@@ -295,229 +308,690 @@ class ECMS
|
|
|
295
308
|
end
|
|
296
309
|
|
|
297
310
|
# =============================================================================================================================
|
|
298
|
-
#
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
311
|
+
# Method to determine whether zone can have terminal vrf equipment. Zones with no vrf terminal equipment are characterized by
|
|
312
|
+
# transient occupancy such is the case for corridors, stairwells, storage, etc ...
|
|
313
|
+
def zone_with_no_vrf_eqpt?(zone)
|
|
314
|
+
space_types_to_skip = {}
|
|
315
|
+
space_types_to_skip['NECB2011'] = ['Atrium - H < 13m',
|
|
316
|
+
'Atrium - H > 13m',
|
|
317
|
+
'Audience - auditorium',
|
|
318
|
+
'Corr. < 2.4m wide',
|
|
319
|
+
'Corr. >= 2.4m wide',
|
|
320
|
+
'Electrical/Mechanical',
|
|
321
|
+
'Hospital corr. < 2.4m',
|
|
322
|
+
'Hospital corr. >= 2.4m',
|
|
323
|
+
'Mfg - corr. < 2.4m',
|
|
324
|
+
'Mfg - corr. >= 2.4m',
|
|
325
|
+
'Lobby - elevator',
|
|
326
|
+
'Lobby - hotel',
|
|
327
|
+
'Lobby - motion picture',
|
|
328
|
+
'Lobby - other',
|
|
329
|
+
'Lobby - performance arts',
|
|
330
|
+
'Locker room',
|
|
331
|
+
'Parking garage space',
|
|
332
|
+
'Stairway',
|
|
333
|
+
'Storage area',
|
|
334
|
+
'Storage area - occsens',
|
|
335
|
+
'Storage area - refrigerated',
|
|
336
|
+
'Storage area - refrigerated - occsens',
|
|
337
|
+
'Washroom',
|
|
338
|
+
'Warehouse - fine',
|
|
339
|
+
'Warehouse - fine - refrigerated',
|
|
340
|
+
'Warehouse - med/blk',
|
|
341
|
+
'Warehouse - med/blk - refrigerated',
|
|
342
|
+
'Warehouse - med/blk2',
|
|
343
|
+
'Warehouse - med/blk2 - refrigerated',
|
|
344
|
+
'Hotel/Motel - lobby']
|
|
345
|
+
|
|
346
|
+
space_types_to_skip['NECB2015'] = ['Atrium (height < 6m)',
|
|
347
|
+
'Atrium (6 =< height <= 12m)',
|
|
348
|
+
'Atrium (height > 12m)',
|
|
349
|
+
'Computer/Server room-sch-A',
|
|
350
|
+
'Copy/Print room',
|
|
351
|
+
'Corridor/Transition area - hospital',
|
|
352
|
+
'Corridor/Transition area - manufacturing facility',
|
|
353
|
+
'Corridor/Transition area - space designed to ANSI/IES RP-28',
|
|
354
|
+
'Corridor/Transition area other',
|
|
355
|
+
'Electrical/Mechanical room',
|
|
356
|
+
'Emergency vehicle garage',
|
|
357
|
+
'Lobby - elevator',
|
|
358
|
+
'Lobby - hotel',
|
|
359
|
+
'Lobby - motion picture theatre',
|
|
360
|
+
'Lobby - performing arts theatre',
|
|
361
|
+
'Lobby - space designed to ANSI/IES RP-28',
|
|
362
|
+
'Lobby - other',
|
|
363
|
+
'Locker room',
|
|
364
|
+
'Storage garage interior',
|
|
365
|
+
'Storage room < 5 m2',
|
|
366
|
+
'Storage room <= 5 m2 <= 100 m2',
|
|
367
|
+
'Storage room > 100 m2',
|
|
368
|
+
'Washroom - space designed to ANSI/IES RP-28',
|
|
369
|
+
'Washroom - other',
|
|
370
|
+
'Warehouse storage area medium to bulky palletized items',
|
|
371
|
+
'Warehouse storage area small hand-carried items(4)']
|
|
372
|
+
|
|
373
|
+
space_types_to_skip['NECB2017'] = ['Atrium (height < 6m)',
|
|
374
|
+
'Atrium (6 =< height <= 12m)',
|
|
375
|
+
'Atrium (height > 12m)',
|
|
376
|
+
'Computer/Server room',
|
|
377
|
+
'Copy/Print room',
|
|
378
|
+
'Corridor/Transition area - hospital',
|
|
379
|
+
'Corridor/Transition area - manufacturing facility',
|
|
380
|
+
'Corridor/Transition area - space designed to ANSI/IES RP-28',
|
|
381
|
+
'Corridor/Transition area other',
|
|
382
|
+
'Electrical/Mechanical room',
|
|
383
|
+
'Emergency vehicle garage',
|
|
384
|
+
'Lobby - elevator',
|
|
385
|
+
'Lobby - hotel',
|
|
386
|
+
'Lobby - motion picture theatre',
|
|
387
|
+
'Lobby - performing arts theatre',
|
|
388
|
+
'Lobby - space designed to ANSI/IES RP-28',
|
|
389
|
+
'Lobby - other',
|
|
390
|
+
'Locker room',
|
|
391
|
+
'Stairway/Stairwell',
|
|
392
|
+
'Storage garage interior',
|
|
393
|
+
'Storage room < 5 m2',
|
|
394
|
+
'Storage room <= 5 m2 <= 100 m2',
|
|
395
|
+
'Storage room > 100 m2',
|
|
396
|
+
'Washroom - space designed to ANSI/IES RP-28',
|
|
397
|
+
'Washroom - other',
|
|
398
|
+
'Warehouse storage area medium to bulky palletized items',
|
|
399
|
+
'Warehouse storage area small hand-carried items(4)']
|
|
400
|
+
|
|
401
|
+
zone_does_not_have_vrf_eqpt = false
|
|
402
|
+
zone.spaces.each do |space|
|
|
403
|
+
space_types_to_skip.each do |std, spfs|
|
|
404
|
+
spfs.each do |spf|
|
|
405
|
+
if space.spaceType.get.name.to_s.downcase.include? spf.downcase
|
|
406
|
+
zone_does_not_have_vrf_eqpt = true
|
|
407
|
+
break
|
|
408
|
+
end
|
|
409
|
+
end
|
|
410
|
+
break if zone_does_not_have_vrf_eqpt
|
|
330
411
|
end
|
|
412
|
+
break if zone_does_not_have_vrf_eqpt
|
|
331
413
|
end
|
|
332
|
-
# Now we can find and apply maximum horizontal and vertical distances between outdoor vrf unit and zones with vrf terminal units
|
|
333
|
-
max_hor_pipe_length,max_vert_pipe_length = get_max_vrf_pipe_lengths(model)
|
|
334
|
-
#raise("test1:#{max_hor_pipe_length},#{max_vert_pipe_length}")
|
|
335
|
-
outdoor_vrf_unit.setEquivalentPipingLengthusedforPipingCorrectionFactorinCoolingMode(max_hor_pipe_length)
|
|
336
|
-
outdoor_vrf_unit.setEquivalentPipingLengthusedforPipingCorrectionFactorinHeatingMode(max_hor_pipe_length)
|
|
337
|
-
outdoor_vrf_unit.setVerticalHeightusedforPipingCorrectionFactor(max_vert_pipe_length)
|
|
338
414
|
end
|
|
339
415
|
|
|
340
416
|
# =============================================================================================================================
|
|
341
|
-
# Add
|
|
342
|
-
#
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
417
|
+
# Add equipment for ECM 'hs08_ccashp_vrf':
|
|
418
|
+
# -Constant-volume DOAS with air-source heat pump for heating and cooling and electric backup
|
|
419
|
+
# -Zonal terminal VRF units connected to an outdoor VRF condenser unit
|
|
420
|
+
# -Zonal electric backup
|
|
421
|
+
def add_ecm_hs08_ccashp_vrf(
|
|
422
|
+
model:,
|
|
423
|
+
system_zones_map:,
|
|
424
|
+
system_doas_flags:,
|
|
425
|
+
air_sys_eqpt_type: 'ccashp'
|
|
426
|
+
)
|
|
348
427
|
# Add outdoor VRF unit
|
|
349
|
-
outdoor_vrf_unit = add_outdoor_vrf_unit(model: model,ecm_name:
|
|
350
|
-
#
|
|
351
|
-
|
|
428
|
+
outdoor_vrf_unit = add_outdoor_vrf_unit(model: model, ecm_name: 'hs08_ccashp_vrf')
|
|
429
|
+
# Update system doas flags
|
|
430
|
+
system_doas_flags.keys.each { |sname| system_doas_flags[sname] = true }
|
|
431
|
+
# use system zones map and generate new air system and zonal equipment
|
|
432
|
+
system_zones_map.sort.each do |sys_name, zones|
|
|
433
|
+
sys_info = air_sys_comps_assumptions(sys_name: sys_name,
|
|
434
|
+
zones: zones,
|
|
435
|
+
system_doas_flags: system_doas_flags)
|
|
436
|
+
airloop, return_fan = add_air_system(model: model,
|
|
437
|
+
zones: zones,
|
|
438
|
+
sys_abbr: sys_info['sys_abbr'],
|
|
439
|
+
sys_vent_type: sys_info['sys_vent_type'],
|
|
440
|
+
sys_heat_rec_type: sys_info['sys_heat_rec_type'],
|
|
441
|
+
sys_htg_eqpt_type: air_sys_eqpt_type,
|
|
442
|
+
sys_supp_htg_eqpt_type: 'coil_electric',
|
|
443
|
+
sys_clg_eqpt_type: air_sys_eqpt_type,
|
|
444
|
+
sys_supp_fan_type: sys_info['sys_supp_fan_type'],
|
|
445
|
+
sys_ret_fan_type: sys_info['sys_ret_fan_type'],
|
|
446
|
+
sys_setpoint_mgr_type: sys_info['sys_setpoint_mgr_type'])
|
|
447
|
+
# get and assign defrost curve
|
|
448
|
+
dx_htg_coil = nil
|
|
449
|
+
airloop.supplyComponents.sort.each do |comp|
|
|
450
|
+
if comp.to_CoilHeatingDXSingleSpeed.is_initialized
|
|
451
|
+
dx_htg_coil = comp.to_CoilHeatingDXSingleSpeed.get
|
|
452
|
+
elsif comp.to_CoilHeatingDXVariableSpeed.is_initialized
|
|
453
|
+
dx_htg_coil = comp.to_CoilHeatingDXVariableSpeed.get
|
|
454
|
+
end
|
|
455
|
+
end
|
|
456
|
+
search_criteria = {}
|
|
457
|
+
if air_sys_eqpt_type == 'ccashp'
|
|
458
|
+
search_criteria['name'] = 'Mitsubishi_Hyper_Heating_VRF_Outdoor_Unit RTU'
|
|
459
|
+
elsif air_sys_eqpt_type == 'ashp'
|
|
460
|
+
search_criteria['name'] = 'NECB2015_ASHP'
|
|
461
|
+
end
|
|
462
|
+
props = model_find_object(standards_data['tables']['heat_pump_heating_ecm']['table'], search_criteria, 1.0)
|
|
463
|
+
heat_defrost_eir_ft = model_add_curve(model, props['heat_defrost_eir_ft'])
|
|
464
|
+
if heat_defrost_eir_ft
|
|
465
|
+
dx_htg_coil.setDefrostEnergyInputRatioFunctionofTemperatureCurve(heat_defrost_eir_ft)
|
|
466
|
+
else
|
|
467
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilHeatingDX', "For #{dx_htg_coil.name}, cannot find heat_defrost_eir_ft curve, will not be set.")
|
|
468
|
+
end
|
|
469
|
+
# add zone equipment and diffuser
|
|
470
|
+
# add terminal VRF units
|
|
471
|
+
add_zone_eqpt(model: model,
|
|
472
|
+
airloop: airloop,
|
|
473
|
+
zones: zones,
|
|
474
|
+
outdoor_unit: outdoor_vrf_unit,
|
|
475
|
+
zone_diffuser_type: sys_info['zone_diffuser_type'],
|
|
476
|
+
zone_htg_eqpt_type: 'vrf',
|
|
477
|
+
zone_supp_htg_eqpt_type: 'none',
|
|
478
|
+
zone_clg_eqpt_type: 'vrf',
|
|
479
|
+
zone_fan_type: 'On_Off')
|
|
480
|
+
# add electric unit heaters fpr backup
|
|
481
|
+
add_zone_eqpt(model: model,
|
|
482
|
+
airloop: airloop,
|
|
483
|
+
zones: zones,
|
|
484
|
+
outdoor_unit: nil,
|
|
485
|
+
zone_diffuser_type: nil,
|
|
486
|
+
zone_htg_eqpt_type: 'baseboard_electric',
|
|
487
|
+
zone_supp_htg_eqpt_type: 'none',
|
|
488
|
+
zone_clg_eqpt_type: 'none',
|
|
489
|
+
zone_fan_type: 'none') # OS doesn't support onoff fans for unit heaters
|
|
490
|
+
# Now we can find and apply maximum horizontal and vertical distances between outdoor vrf unit and zones with vrf terminal units
|
|
491
|
+
max_hor_pipe_length, max_vert_pipe_length = get_max_vrf_pipe_lengths(model)
|
|
492
|
+
outdoor_vrf_unit.setEquivalentPipingLengthusedforPipingCorrectionFactorinCoolingMode(max_hor_pipe_length)
|
|
493
|
+
outdoor_vrf_unit.setEquivalentPipingLengthusedforPipingCorrectionFactorinHeatingMode(max_hor_pipe_length)
|
|
494
|
+
outdoor_vrf_unit.setVerticalHeightusedforPipingCorrectionFactor(max_vert_pipe_length)
|
|
495
|
+
end
|
|
352
496
|
end
|
|
353
497
|
|
|
354
498
|
# =============================================================================================================================
|
|
355
|
-
# Apply efficiencies and performance curves for ECM '
|
|
356
|
-
def
|
|
357
|
-
# Use same performance data as ECM
|
|
358
|
-
|
|
499
|
+
# Apply efficiencies and performance curves for ECM 'hs08_ccashp_vrf'
|
|
500
|
+
def apply_efficiency_ecm_hs08_ccashp_vrf(model, air_sys_eqpt_type: 'ccashp')
|
|
501
|
+
# Use same performance data as ECM 'hs09_ccashpsys' for air system
|
|
502
|
+
if air_sys_eqpt_type == 'ccashp'
|
|
503
|
+
apply_efficiency_ecm_hs09_ccashp_baseboard(model)
|
|
504
|
+
elsif air_sys_eqpt_type == 'ashp'
|
|
505
|
+
apply_efficiency_ecm_hs12_ashp_baseboard(model)
|
|
506
|
+
end
|
|
359
507
|
# Apply efficiency and curves for VRF units
|
|
508
|
+
eqpt_name = 'Mitsubishi_Hyper_Heating_VRF_Outdoor_Unit'
|
|
360
509
|
model.getAirConditionerVariableRefrigerantFlows.sort.each do |vrf_unit|
|
|
361
|
-
airconditioner_variablerefrigerantflow_cooling_apply_efficiency_and_curves(vrf_unit,
|
|
362
|
-
airconditioner_variablerefrigerantflow_heating_apply_efficiency_and_curves(vrf_unit,
|
|
510
|
+
airconditioner_variablerefrigerantflow_cooling_apply_efficiency_and_curves(vrf_unit, eqpt_name)
|
|
511
|
+
airconditioner_variablerefrigerantflow_heating_apply_efficiency_and_curves(vrf_unit, eqpt_name)
|
|
363
512
|
end
|
|
364
513
|
# Set fan size of VRF terminal units
|
|
365
|
-
fan_power_per_flow_rate = 150.0
|
|
514
|
+
fan_power_per_flow_rate = 150.0 # based on Mitsubishi data: 100 low and 200 high (W-s/m3)
|
|
366
515
|
model.getZoneHVACTerminalUnitVariableRefrigerantFlows.each do |iunit|
|
|
367
516
|
fan = iunit.supplyAirFan.to_FanOnOff.get
|
|
368
|
-
fan_pr_rise = fan_power_per_flow_rate*(fan.fanEfficiency*fan.motorEfficiency)
|
|
517
|
+
fan_pr_rise = fan_power_per_flow_rate * (fan.fanEfficiency * fan.motorEfficiency)
|
|
369
518
|
fan.setPressureRise(fan_pr_rise)
|
|
370
519
|
end
|
|
371
520
|
# Set fan size of unit heaters
|
|
372
521
|
model.getZoneHVACUnitHeaters.each do |iunit|
|
|
373
522
|
fan = iunit.supplyAirFan.to_FanConstantVolume.get
|
|
374
|
-
fan_pr_rise = fan_power_per_flow_rate*(fan.fanEfficiency*fan.motorEfficiency)
|
|
523
|
+
fan_pr_rise = fan_power_per_flow_rate * (fan.fanEfficiency * fan.motorEfficiency)
|
|
375
524
|
fan.setPressureRise(fan_pr_rise)
|
|
376
525
|
end
|
|
377
526
|
end
|
|
378
527
|
|
|
379
528
|
# =============================================================================================================================
|
|
380
|
-
#
|
|
381
|
-
|
|
382
|
-
|
|
529
|
+
# create air loop
|
|
530
|
+
def create_airloop(model, sys_vent_type)
|
|
531
|
+
airloop = OpenStudio::Model::AirLoopHVAC.new(model)
|
|
532
|
+
airloop.sizingSystem.setPreheatDesignTemperature(7.0)
|
|
533
|
+
airloop.sizingSystem.setPreheatDesignHumidityRatio(0.008)
|
|
534
|
+
airloop.sizingSystem.setPrecoolDesignTemperature(13.0)
|
|
535
|
+
airloop.sizingSystem.setPrecoolDesignHumidityRatio(0.008)
|
|
536
|
+
airloop.sizingSystem.setSizingOption('NonCoincident')
|
|
537
|
+
airloop.sizingSystem.setCoolingDesignAirFlowMethod('DesignDay')
|
|
538
|
+
airloop.sizingSystem.setCoolingDesignAirFlowRate(0.0)
|
|
539
|
+
airloop.sizingSystem.setHeatingDesignAirFlowMethod('DesignDay')
|
|
540
|
+
airloop.sizingSystem.setHeatingDesignAirFlowRate(0.0)
|
|
541
|
+
airloop.sizingSystem.setSystemOutdoorAirMethod('ZoneSum')
|
|
542
|
+
airloop.sizingSystem.setCentralCoolingDesignSupplyAirHumidityRatio(0.0085)
|
|
543
|
+
airloop.sizingSystem.setCentralHeatingDesignSupplyAirHumidityRatio(0.0080)
|
|
544
|
+
airloop.sizingSystem.setMinimumSystemAirFlowRatio(1.0)
|
|
545
|
+
case sys_vent_type.downcase
|
|
546
|
+
when 'doas'
|
|
547
|
+
airloop.sizingSystem.setAllOutdoorAirinCooling(true)
|
|
548
|
+
airloop.sizingSystem.setAllOutdoorAirinHeating(true)
|
|
549
|
+
airloop.sizingSystem.setTypeofLoadtoSizeOn('VentilationRequirement')
|
|
550
|
+
airloop.sizingSystem.setCentralCoolingDesignSupplyAirTemperature(19.9)
|
|
551
|
+
airloop.sizingSystem.setCentralHeatingDesignSupplyAirTemperature(20.0)
|
|
552
|
+
when 'mixed'
|
|
553
|
+
airloop.sizingSystem.setAllOutdoorAirinCooling(false)
|
|
554
|
+
airloop.sizingSystem.setAllOutdoorAirinHeating(false)
|
|
555
|
+
airloop.sizingSystem.setTypeofLoadtoSizeOn('Sensible')
|
|
556
|
+
airloop.sizingSystem.setCentralCoolingDesignSupplyAirTemperature(13.0)
|
|
557
|
+
airloop.sizingSystem.setCentralHeatingDesignSupplyAirTemperature(43.0)
|
|
558
|
+
end
|
|
559
|
+
|
|
560
|
+
return airloop
|
|
561
|
+
end
|
|
562
|
+
|
|
563
|
+
# =============================================================================================================================
|
|
564
|
+
# create air system setpoint manager
|
|
565
|
+
def create_air_sys_spm(model, setpoint_mgr_type, zones)
|
|
566
|
+
spm = nil
|
|
567
|
+
case setpoint_mgr_type.downcase
|
|
568
|
+
when 'scheduled'
|
|
569
|
+
sat = 20.0
|
|
570
|
+
sat_sch = OpenStudio::Model::ScheduleRuleset.new(model)
|
|
571
|
+
sat_sch.defaultDaySchedule.addValue(OpenStudio::Time.new(0, 24, 0, 0), sat)
|
|
572
|
+
spm = OpenStudio::Model::SetpointManagerScheduled.new(model, sat_sch)
|
|
573
|
+
when 'single_zone_reheat'
|
|
574
|
+
spm = OpenStudio::Model::SetpointManagerSingleZoneReheat.new(model)
|
|
575
|
+
spm.setControlZone(zones[0])
|
|
576
|
+
spm.setMinimumSupplyAirTemperature(13.0)
|
|
577
|
+
spm.setMaximumSupplyAirTemperature(43.0)
|
|
578
|
+
when 'warmest'
|
|
579
|
+
spm = OpenStudio::Model::SetpointManagerWarmest.new(model)
|
|
580
|
+
spm.setMinimumSetpointTemperature(13.0)
|
|
581
|
+
spm.setMaximumSetpointTemperature(43.0)
|
|
582
|
+
end
|
|
583
|
+
|
|
584
|
+
return spm
|
|
585
|
+
end
|
|
586
|
+
|
|
587
|
+
# =============================================================================================================================
|
|
588
|
+
# create air system fan
|
|
589
|
+
def create_air_sys_fan(model, fan_type)
|
|
590
|
+
fan = nil
|
|
591
|
+
case fan_type.downcase
|
|
592
|
+
when 'constant_volume'
|
|
593
|
+
fan = OpenStudio::Model::FanConstantVolume.new(model)
|
|
594
|
+
fan.setName('FanConstantVolume')
|
|
595
|
+
when 'variable_volume'
|
|
596
|
+
fan = OpenStudio::Model::FanVariableVolume.new(model)
|
|
597
|
+
fan.setName('FanVariableVolume')
|
|
598
|
+
when 'on_off'
|
|
599
|
+
fan = OpenStudio::Model::FanOnOff.new(model)
|
|
600
|
+
fan.setName('FanOnOff')
|
|
601
|
+
end
|
|
602
|
+
|
|
603
|
+
return fan
|
|
604
|
+
end
|
|
605
|
+
|
|
606
|
+
# =============================================================================================================================
|
|
607
|
+
# create air system cooling equipment
|
|
608
|
+
def create_air_sys_clg_eqpt(model, clg_eqpt_type)
|
|
609
|
+
clg_eqpt = nil
|
|
610
|
+
case clg_eqpt_type.downcase
|
|
611
|
+
when 'ashp'
|
|
612
|
+
clg_eqpt = OpenStudio::Model::CoilCoolingDXSingleSpeed.new(model)
|
|
613
|
+
clg_eqpt.setName('CoilCoolingDxSingleSpeed_ASHP')
|
|
614
|
+
clg_eqpt.setCrankcaseHeaterCapacity(1.0e-6)
|
|
615
|
+
when 'ccashp'
|
|
616
|
+
clg_eqpt = OpenStudio::Model::CoilCoolingDXVariableSpeed.new(model)
|
|
617
|
+
clg_eqpt.setName('CoilCoolingDXVariableSpeed_CCASHP')
|
|
618
|
+
clg_eqpt_speed1 = OpenStudio::Model::CoilCoolingDXVariableSpeedSpeedData.new(model)
|
|
619
|
+
clg_eqpt.addSpeed(clg_eqpt_speed1)
|
|
620
|
+
clg_eqpt.setNominalSpeedLevel(1)
|
|
621
|
+
clg_eqpt.setCrankcaseHeaterCapacity(1.0e-6)
|
|
622
|
+
when 'vrf'
|
|
623
|
+
clg_eqpt = OpenStudio::Model::CoilCoolingDXVariableRefrigerantFlow.new(model)
|
|
624
|
+
clg_eqpt.setName('CoilCoolingDXVariableRefrigerantFlow')
|
|
625
|
+
end
|
|
626
|
+
|
|
627
|
+
return clg_eqpt
|
|
628
|
+
end
|
|
629
|
+
|
|
630
|
+
# =============================================================================================================================
|
|
631
|
+
# create air system heating equipment
|
|
632
|
+
def create_air_sys_htg_eqpt(model, htg_eqpt_type)
|
|
633
|
+
always_on = model.alwaysOnDiscreteSchedule
|
|
634
|
+
htg_eqpt = nil
|
|
635
|
+
case htg_eqpt_type.downcase
|
|
636
|
+
when 'coil_electric'
|
|
637
|
+
htg_eqpt = OpenStudio::Model::CoilHeatingElectric.new(model, always_on)
|
|
638
|
+
htg_eqpt.setName('CoilHeatingElectric')
|
|
639
|
+
when 'ashp'
|
|
640
|
+
htg_eqpt = OpenStudio::Model::CoilHeatingDXSingleSpeed.new(model)
|
|
641
|
+
htg_eqpt.setName('CoilHeatingDXSingleSpeed_ASHP')
|
|
642
|
+
htg_eqpt.setDefrostStrategy('ReverseCycle')
|
|
643
|
+
htg_eqpt.setDefrostControl('OnDemand')
|
|
644
|
+
htg_eqpt.setCrankcaseHeaterCapacity(1.0e-6)
|
|
645
|
+
when 'ccashp'
|
|
646
|
+
htg_eqpt = OpenStudio::Model::CoilHeatingDXVariableSpeed.new(model)
|
|
647
|
+
htg_eqpt.setName('CoilHeatingDXVariableSpeed_CCASHP')
|
|
648
|
+
htg_eqpt_speed1 = OpenStudio::Model::CoilHeatingDXVariableSpeedSpeedData.new(model)
|
|
649
|
+
htg_eqpt.addSpeed(htg_eqpt_speed1)
|
|
650
|
+
htg_eqpt.setNominalSpeedLevel(1)
|
|
651
|
+
htg_eqpt.setMinimumOutdoorDryBulbTemperatureforCompressorOperation(-25.0)
|
|
652
|
+
htg_eqpt.setDefrostStrategy('ReverseCycle')
|
|
653
|
+
htg_eqpt.setDefrostControl('OnDemand')
|
|
654
|
+
htg_eqpt.setCrankcaseHeaterCapacity(1.0e-6)
|
|
655
|
+
end
|
|
656
|
+
|
|
657
|
+
return htg_eqpt
|
|
658
|
+
end
|
|
659
|
+
|
|
660
|
+
# =============================================================================================================================
|
|
661
|
+
# add air system with all its components
|
|
662
|
+
def add_air_system(
|
|
663
|
+
model:,
|
|
664
|
+
zones:,
|
|
665
|
+
sys_abbr:,
|
|
666
|
+
sys_vent_type:,
|
|
667
|
+
sys_heat_rec_type:,
|
|
668
|
+
sys_htg_eqpt_type:,
|
|
669
|
+
sys_supp_htg_eqpt_type:,
|
|
670
|
+
sys_clg_eqpt_type:,
|
|
671
|
+
sys_supp_fan_type:,
|
|
672
|
+
sys_ret_fan_type:,
|
|
673
|
+
sys_setpoint_mgr_type:
|
|
674
|
+
)
|
|
675
|
+
|
|
676
|
+
# create all the needed components and the air loop
|
|
677
|
+
airloop = create_airloop(model, sys_vent_type)
|
|
678
|
+
setpoint_mgr = create_air_sys_spm(model, sys_setpoint_mgr_type, zones)
|
|
679
|
+
supply_fan = create_air_sys_fan(model, sys_supp_fan_type)
|
|
680
|
+
supply_fan.setName('Supply Fan') if supply_fan
|
|
681
|
+
return_fan = create_air_sys_fan(model, sys_ret_fan_type)
|
|
682
|
+
return_fan.setName('Return Fan') if return_fan
|
|
683
|
+
htg_eqpt = create_air_sys_htg_eqpt(model, sys_htg_eqpt_type)
|
|
684
|
+
supp_htg_eqpt = create_air_sys_htg_eqpt(model, sys_supp_htg_eqpt_type)
|
|
685
|
+
clg_eqpt = create_air_sys_clg_eqpt(model, sys_clg_eqpt_type)
|
|
686
|
+
# add components to the air loop
|
|
687
|
+
clg_eqpt.addToNode(airloop.supplyOutletNode) if clg_eqpt
|
|
688
|
+
htg_eqpt.addToNode(airloop.supplyOutletNode) if htg_eqpt
|
|
689
|
+
supp_htg_eqpt.addToNode(airloop.supplyOutletNode) if supp_htg_eqpt
|
|
690
|
+
supply_fan.addToNode(airloop.supplyOutletNode) if supply_fan
|
|
691
|
+
setpoint_mgr.addToNode(airloop.supplyOutletNode) if setpoint_mgr
|
|
692
|
+
|
|
693
|
+
# OA controller
|
|
694
|
+
oa_controller = OpenStudio::Model::ControllerOutdoorAir.new(model)
|
|
695
|
+
oa_controller.autosizeMinimumOutdoorAirFlowRate
|
|
696
|
+
oa_system = OpenStudio::Model::AirLoopHVACOutdoorAirSystem.new(model, oa_controller)
|
|
697
|
+
oa_system.addToNode(airloop.supplyInletNode)
|
|
698
|
+
|
|
699
|
+
# Set airloop name
|
|
700
|
+
sys_name_pars = {}
|
|
701
|
+
sys_name_pars['sys_hr'] = 'none'
|
|
702
|
+
sys_name_pars['sys_clg'] = sys_clg_eqpt_type
|
|
703
|
+
sys_name_pars['sys_htg'] = sys_htg_eqpt_type
|
|
704
|
+
sys_name_pars['sys_sf'] = 'cv' if sys_supp_fan_type == 'constant_volume'
|
|
705
|
+
sys_name_pars['sys_sf'] = 'vv' if sys_supp_fan_type == 'variable_volume'
|
|
706
|
+
sys_name_pars['zone_htg'] = 'none'
|
|
707
|
+
sys_name_pars['zone_clg'] = 'none'
|
|
708
|
+
sys_name_pars['sys_rf'] = 'none'
|
|
709
|
+
sys_name_pars['sys_rf'] = 'cv' if sys_ret_fan_type == 'constant_volume'
|
|
710
|
+
sys_name_pars['sys_rf'] = 'vv' if sys_ret_fan_type == 'variable_volume'
|
|
711
|
+
assign_base_sys_name(airloop, sys_abbr: sys_abbr, sys_oa: sys_vent_type, sys_name_pars: sys_name_pars)
|
|
712
|
+
return airloop, return_fan
|
|
713
|
+
end
|
|
714
|
+
|
|
715
|
+
# =============================================================================================================================
|
|
716
|
+
# create zone diffuser
|
|
717
|
+
def create_zone_diffuser(model, zone_diffuser_type, zone)
|
|
718
|
+
always_on = model.alwaysOnDiscreteSchedule
|
|
719
|
+
diffuser = nil
|
|
720
|
+
case zone_diffuser_type.downcase
|
|
721
|
+
when 'single_duct_uncontrolled'
|
|
722
|
+
diffuser = OpenStudio::Model::AirTerminalSingleDuctUncontrolled.new(model, always_on)
|
|
723
|
+
when 'single_duct_vav_reheat'
|
|
724
|
+
reheat_coil = OpenStudio::Model::CoilHeatingElectric.new(model, always_on)
|
|
725
|
+
diffuser = OpenStudio::Model::AirTerminalSingleDuctVAVReheat.new(model, always_on, reheat_coil)
|
|
726
|
+
# diffuser.setFixedMinimumAirFlowRate(0.002 * zone.floorArea )
|
|
727
|
+
diffuser.setMaximumReheatAirTemperature(43.0)
|
|
728
|
+
diffuser.setDamperHeatingAction('Normal')
|
|
729
|
+
end
|
|
730
|
+
|
|
731
|
+
return diffuser
|
|
732
|
+
end
|
|
733
|
+
|
|
734
|
+
# =============================================================================================================================
|
|
735
|
+
# create zonal heating equipment
|
|
736
|
+
def create_zone_htg_eqpt(model, zone_htg_eqpt_type)
|
|
383
737
|
always_on = model.alwaysOnDiscreteSchedule
|
|
384
738
|
always_off = model.alwaysOffDiscreteSchedule
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
739
|
+
htg_eqpt = nil
|
|
740
|
+
case zone_htg_eqpt_type.downcase
|
|
741
|
+
when 'baseboard_electric'
|
|
742
|
+
htg_eqpt = OpenStudio::Model::ZoneHVACBaseboardConvectiveElectric.new(model)
|
|
743
|
+
htg_eqpt.setName('Zone HVAC Baseboard Convective Electric')
|
|
744
|
+
when 'coil_electric', 'ptac_electric_off', 'unitheater_electric'
|
|
745
|
+
htg_eqpt = OpenStudio::Model::CoilHeatingElectric.new(model, always_on)
|
|
746
|
+
htg_eqpt.setName('CoilHeatingElectric')
|
|
747
|
+
htg_eqpt.setAvailabilitySchedule(always_off) if zone_htg_eqpt_type == 'ptac_electric_off'
|
|
748
|
+
when 'pthp'
|
|
749
|
+
htg_eqpt = OpenStudio::Model::CoilHeatingDXSingleSpeed.new(model)
|
|
750
|
+
htg_eqpt.setName('CoilHeatingDXSingleSpeed_PTHP')
|
|
751
|
+
htg_eqpt.setDefrostStrategy('ReverseCycle')
|
|
752
|
+
htg_eqpt.setDefrostControl('OnDemand')
|
|
753
|
+
htg_eqpt.setCrankcaseHeaterCapacity(1.0e-6)
|
|
754
|
+
when 'vrf'
|
|
755
|
+
htg_eqpt = OpenStudio::Model::CoilHeatingDXVariableRefrigerantFlow.new(model)
|
|
756
|
+
htg_eqpt.setName('CoilHeatingDXVariableRefrigerantFlow')
|
|
757
|
+
end
|
|
758
|
+
|
|
759
|
+
return htg_eqpt
|
|
760
|
+
end
|
|
761
|
+
|
|
762
|
+
# =============================================================================================================================
|
|
763
|
+
# create zonal cooling equipment
|
|
764
|
+
def create_zone_clg_eqpt(model, zone_clg_eqpt_type)
|
|
765
|
+
always_on = model.alwaysOnDiscreteSchedule
|
|
766
|
+
clg_eqpt = nil
|
|
767
|
+
case zone_clg_eqpt_type.downcase
|
|
768
|
+
when 'ptac_electric_off', 'pthp'
|
|
769
|
+
clg_eqpt = OpenStudio::Model::CoilCoolingDXSingleSpeed.new(model)
|
|
770
|
+
clg_eqpt.setName('CoilCoolingDXSingleSpeed_PTHP') if zone_clg_eqpt_type.downcase == 'pthp'
|
|
771
|
+
clg_eqpt.setName('CoilCoolingDXSingleSpeed_PTAC') if zone_clg_eqpt_type.downcase == 'ptac_electric_off'
|
|
772
|
+
clg_eqpt.setCrankcaseHeaterCapacity(1.0e-6)
|
|
773
|
+
when 'vrf'
|
|
774
|
+
clg_eqpt = OpenStudio::Model::CoilCoolingDXVariableRefrigerantFlow.new(model)
|
|
775
|
+
clg_eqpt.setName('CoilCoolingDXVariableRefrigerantFlow')
|
|
776
|
+
end
|
|
777
|
+
|
|
778
|
+
return clg_eqpt
|
|
779
|
+
end
|
|
780
|
+
|
|
781
|
+
# =============================================================================================================================
|
|
782
|
+
# create zpne container eqpt
|
|
783
|
+
def create_zone_container_eqpt(
|
|
784
|
+
model:,
|
|
785
|
+
zone_cont_eqpt_type:,
|
|
786
|
+
zone_htg_eqpt:,
|
|
787
|
+
zone_supp_htg_eqpt:,
|
|
788
|
+
zone_clg_eqpt:,
|
|
789
|
+
zone_fan:,
|
|
790
|
+
zone_vent_off: true
|
|
791
|
+
)
|
|
792
|
+
|
|
793
|
+
always_on = model.alwaysOnDiscreteSchedule
|
|
794
|
+
always_off = model.alwaysOffDiscreteSchedule
|
|
795
|
+
zone_eqpt = nil
|
|
796
|
+
case zone_cont_eqpt_type.downcase
|
|
797
|
+
when 'ptac_electric_off'
|
|
798
|
+
zone_eqpt = OpenStudio::Model::ZoneHVACPackagedTerminalAirConditioner.new(model, always_on, zone_fan, zone_htg_eqpt, zone_clg_eqpt)
|
|
799
|
+
zone_eqpt.setName('ZoneHVACPackagedTerminalAirConditioner')
|
|
800
|
+
if zone_vent_off
|
|
801
|
+
zone_eqpt.setOutdoorAirFlowRateDuringCoolingOperation(1.0e-6)
|
|
802
|
+
zone_eqpt.setOutdoorAirFlowRateDuringHeatingOperation(1.0e-6)
|
|
803
|
+
zone_eqpt.setOutdoorAirFlowRateWhenNoCoolingorHeatingisNeeded(1.0e-6)
|
|
435
804
|
end
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
805
|
+
when 'pthp'
|
|
806
|
+
zone_eqpt = OpenStudio::Model::ZoneHVACPackagedTerminalHeatPump.new(model, always_on, zone_fan, zone_htg_eqpt, zone_clg_eqpt, zone_supp_htg_eqpt)
|
|
807
|
+
zone_eqpt.setName('ZoneHVACPackagedTerminalHeatPump')
|
|
808
|
+
if zone_vent_off
|
|
809
|
+
zone_eqpt.setOutdoorAirFlowRateDuringCoolingOperation(1.0e-6)
|
|
810
|
+
zone_eqpt.setOutdoorAirFlowRateDuringHeatingOperation(1.0e-6)
|
|
811
|
+
zone_eqpt.setOutdoorAirFlowRateWhenNoCoolingorHeatingisNeeded(1.0e-6)
|
|
812
|
+
zone_eqpt.setSupplyAirFanOperatingModeSchedule(always_off)
|
|
444
813
|
end
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
sys_dx_htg_coil.addSpeed(sys_dx_htg_coil_speed1)
|
|
460
|
-
sys_dx_htg_coil.setNominalSpeedLevel(1)
|
|
461
|
-
sys_dx_htg_coil.setMinimumOutdoorDryBulbTemperatureforCompressorOperation(-25.0)
|
|
462
|
-
sys_dx_htg_coil.setDefrostStrategy("ReverseCycle")
|
|
463
|
-
#sys_dx_htg_coil.setDefrostStrategy("Resistive")
|
|
464
|
-
#sys_dx_htg_coil.setResistiveDefrostHeaterCapacity(0.001)
|
|
465
|
-
sys_dx_htg_coil.setDefrostControl("OnDemand")
|
|
466
|
-
sys_dx_htg_coil.setCrankcaseHeaterCapacity(0.001)
|
|
467
|
-
search_criteria = coil_dx_find_search_criteria(sys_dx_htg_coil)
|
|
468
|
-
props = model_find_object(standards_data['tables']["heat_pumps_heating_ecm_hs09_ccashpsys"]['table'], search_criteria, 1.0, Date.today)
|
|
469
|
-
heat_defrost_eir_ft = model_add_curve(model, props['heat_defrost_eir_ft'])
|
|
470
|
-
# This defrost curve has to be assigned here before sizing
|
|
471
|
-
if heat_defrost_eir_ft
|
|
472
|
-
sys_dx_htg_coil.setDefrostEnergyInputRatioFunctionofTemperatureCurve(heat_defrost_eir_ft)
|
|
473
|
-
else
|
|
474
|
-
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilHeatingDXVariableSpeed', "For #{sys_dx_htg_coil.name}, cannot find heat_defrost_eir_ft curve, will not be set.")
|
|
814
|
+
when 'unitheater_electric'
|
|
815
|
+
zone_eqpt = OpenStudio::Model::ZoneHVACUnitHeater.new(model, always_on, zone_fan, zone_htg_eqpt)
|
|
816
|
+
zone_eqpt.setName('ZoneHVACUnitHeater')
|
|
817
|
+
zone_eqpt.setFanControlType('OnOff')
|
|
818
|
+
when 'vrf'
|
|
819
|
+
zone_eqpt = OpenStudio::Model::ZoneHVACTerminalUnitVariableRefrigerantFlow.new(model, zone_clg_eqpt, zone_htg_eqpt, zone_fan)
|
|
820
|
+
zone_eqpt.setName('ZoneHVACTerminalUnitVariableRefrigerantFlow')
|
|
821
|
+
zone_eqpt.setSupplyAirFanOperatingModeSchedule(always_off)
|
|
822
|
+
if zone_vent_off
|
|
823
|
+
zone_eqpt.setOutdoorAirFlowRateDuringCoolingOperation(1.0e-6)
|
|
824
|
+
zone_eqpt.setOutdoorAirFlowRateDuringHeatingOperation(1.0e-6)
|
|
825
|
+
zone_eqpt.setOutdoorAirFlowRateWhenNoCoolingorHeatingisNeeded(1.0e-6)
|
|
826
|
+
zone_eqpt.setZoneTerminalUnitOffParasiticElectricEnergyUse(1.0e-6)
|
|
827
|
+
zone_eqpt.setZoneTerminalUnitOnParasiticElectricEnergyUse(1.0e-6)
|
|
475
828
|
end
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
829
|
+
end
|
|
830
|
+
|
|
831
|
+
return zone_eqpt
|
|
832
|
+
end
|
|
833
|
+
|
|
834
|
+
# =============================================================================================================================
|
|
835
|
+
# add zonal heating and cooling equipment
|
|
836
|
+
def add_zone_eqpt(model:,
|
|
837
|
+
airloop:,
|
|
838
|
+
zones:,
|
|
839
|
+
outdoor_unit:,
|
|
840
|
+
zone_diffuser_type:,
|
|
841
|
+
zone_htg_eqpt_type:,
|
|
842
|
+
zone_supp_htg_eqpt_type:,
|
|
843
|
+
zone_clg_eqpt_type:,
|
|
844
|
+
zone_fan_type:)
|
|
845
|
+
|
|
846
|
+
always_on = model.alwaysOnDiscreteSchedule
|
|
847
|
+
zones.sort.each do |zone|
|
|
848
|
+
# during the first call to this method for a zone, the diffuser type has to be specified if there is an air loop serving the zone
|
|
849
|
+
if zone_diffuser_type
|
|
487
850
|
zone.sizingZone.setZoneCoolingDesignSupplyAirTemperature(13.0)
|
|
488
851
|
zone.sizingZone.setZoneHeatingDesignSupplyAirTemperature(43.0)
|
|
489
852
|
zone.sizingZone.setZoneCoolingSizingFactor(1.1)
|
|
490
853
|
zone.sizingZone.setZoneHeatingSizingFactor(1.3)
|
|
491
|
-
|
|
492
|
-
case zone_clg_eqpt_type[zone.name.to_s]
|
|
493
|
-
when "ZoneHVACPackagedTerminalAirConditioner"
|
|
494
|
-
standard.add_ptac_dx_cooling(model,zone,true)
|
|
495
|
-
end
|
|
496
|
-
end
|
|
497
|
-
if system_doas_flags[sys_name.to_s] || zones.size == 1
|
|
498
|
-
diffuser = OpenStudio::Model::AirTerminalSingleDuctUncontrolled.new(model, always_on)
|
|
499
|
-
else
|
|
500
|
-
reheat_coil = OpenStudio::Model::CoilHeatingElectric.new(model, always_on)
|
|
501
|
-
diffuser = OpenStudio::Model::AirTerminalSingleDuctVAVReheat.new(model, always_on, reheat_coil)
|
|
502
|
-
sys_return_fan.addToNode(airloop.returnAirNode.get)
|
|
503
|
-
diffuser.setFixedMinimumAirFlowRate(0.002 * zone.floorArea )
|
|
504
|
-
diffuser.setMaximumReheatAirTemperature(43.0)
|
|
505
|
-
diffuser.setDamperHeatingAction('Normal')
|
|
506
|
-
end
|
|
854
|
+
diffuser = create_zone_diffuser(model, zone_diffuser_type, zone)
|
|
507
855
|
airloop.removeBranchForZone(zone)
|
|
508
856
|
airloop.addBranchForZone(zone, diffuser.to_StraightComponent)
|
|
509
|
-
if baseboard_flag then standard.add_zone_baseboards(baseboard_type: 'Electric', hw_loop: nil, model: model, zone: zone) end
|
|
510
857
|
end
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
858
|
+
clg_eqpt = create_zone_clg_eqpt(model, zone_clg_eqpt_type)
|
|
859
|
+
htg_eqpt = create_zone_htg_eqpt(model, zone_htg_eqpt_type)
|
|
860
|
+
supp_htg_eqpt = create_zone_htg_eqpt(model, zone_supp_htg_eqpt_type)
|
|
861
|
+
fan = create_air_sys_fan(model, zone_fan_type)
|
|
862
|
+
# for container zonal equipment call method "create_zone_container_equipment"
|
|
863
|
+
this_is_container_comp = false
|
|
864
|
+
if (zone_htg_eqpt_type == 'pthp') || (zone_htg_eqpt_type == 'vrf') ||
|
|
865
|
+
(zone_htg_eqpt_type.include? 'unitheater') || (zone_htg_eqpt_type.include? 'ptac')
|
|
866
|
+
this_is_container_comp = true
|
|
867
|
+
zone_cont_eqpt = create_zone_container_eqpt(model: model,
|
|
868
|
+
zone_cont_eqpt_type: zone_htg_eqpt_type,
|
|
869
|
+
zone_htg_eqpt: htg_eqpt,
|
|
870
|
+
zone_supp_htg_eqpt: supp_htg_eqpt,
|
|
871
|
+
zone_clg_eqpt: clg_eqpt,
|
|
872
|
+
zone_fan: fan)
|
|
873
|
+
end
|
|
874
|
+
if zone_cont_eqpt
|
|
875
|
+
zone_cont_eqpt.addToThermalZone(zone)
|
|
876
|
+
outdoor_unit.addTerminal(zone_cont_eqpt) if outdoor_unit
|
|
877
|
+
elsif htg_eqpt && !this_is_container_comp
|
|
878
|
+
htg_eqpt.addToThermalZone(zone)
|
|
879
|
+
end
|
|
880
|
+
end
|
|
881
|
+
sys_name_zone_htg_eqpt_type = zone_htg_eqpt_type
|
|
882
|
+
sys_name_zone_htg_eqpt_type = 'b-e' if zone_htg_eqpt_type == 'baseboard_electric' || zone_htg_eqpt_type == 'ptac_electric_off'
|
|
883
|
+
sys_name_zone_clg_eqpt_type = zone_clg_eqpt_type
|
|
884
|
+
sys_name_zone_clg_eqpt_type = 'ptac' if zone_clg_eqpt_type == 'ptac_electric_off'
|
|
885
|
+
update_sys_name(airloop, zone_htg: sys_name_zone_htg_eqpt_type, zone_clg: sys_name_zone_clg_eqpt_type) if zone_diffuser_type
|
|
886
|
+
end
|
|
887
|
+
|
|
888
|
+
# =============================================================================================================================
|
|
889
|
+
# Set assumptions for type of components for air system based on the number of zones served by the system and whether it's
|
|
890
|
+
# a mixed or doas.
|
|
891
|
+
def air_sys_comps_assumptions(sys_name:,
|
|
892
|
+
zones:,
|
|
893
|
+
system_doas_flags:)
|
|
894
|
+
|
|
895
|
+
sys_info = {}
|
|
896
|
+
sys_info['sys_abbr'] = sys_name.split('|')[0]
|
|
897
|
+
sys_info['sys_vent_type'] = 'mixed'
|
|
898
|
+
sys_info['sys_vent_type'] = 'doas' if system_doas_flags[sys_name.to_s]
|
|
899
|
+
sys_info['sys_heat_rec_type'] = 'none'
|
|
900
|
+
sys_info['sys_htg_eqpt_type'] = 'coil_electric'
|
|
901
|
+
sys_info['sys_supp_htg_eqpt_type'] = 'none'
|
|
902
|
+
sys_info['sys_clg_eqpt_type'] = 'coil_dx'
|
|
903
|
+
if zones.size == 1
|
|
904
|
+
sys_info['sys_setpoint_mgr_type'] = 'single_zone_reheat'
|
|
905
|
+
sys_info['sys_setpoint_mgr_type'] = 'scheduled' if system_doas_flags[sys_name.to_s]
|
|
906
|
+
sys_info['sys_supp_fan_type'] = 'constant_volume'
|
|
907
|
+
sys_info['sys_ret_fan_type'] = 'none'
|
|
908
|
+
sys_info['zone_diffuser_type'] = 'single_duct_uncontrolled'
|
|
909
|
+
elsif zones.size > 1
|
|
910
|
+
if system_doas_flags[sys_name.to_s]
|
|
911
|
+
sys_info['sys_setpoint_mgr_type'] = 'scheduled'
|
|
912
|
+
sys_info['sys_supp_fan_type'] = 'constant_volume'
|
|
913
|
+
sys_info['sys_ret_fan_type'] = 'none'
|
|
914
|
+
sys_info['zone_diffuser_type'] = 'single_duct_uncontrolled'
|
|
915
|
+
else
|
|
916
|
+
sys_info['sys_setpoint_mgr_type'] = 'warmest'
|
|
917
|
+
sys_info['sys_supp_fan_type'] = 'variable_volume'
|
|
918
|
+
sys_info['sys_ret_fan_type'] = 'variable_volume'
|
|
919
|
+
sys_info['zone_diffuser_type'] = 'single_duct_vav_reheat'
|
|
920
|
+
end
|
|
921
|
+
end
|
|
922
|
+
|
|
923
|
+
return sys_info
|
|
924
|
+
end
|
|
925
|
+
|
|
926
|
+
# =============================================================================================================================
|
|
927
|
+
# Add equipment for ecm "hs09_ccashp_baseboard":
|
|
928
|
+
# -Constant-volume reheat system for single zone systems
|
|
929
|
+
# -VAV system with reheat for non DOAS multi-zone systems
|
|
930
|
+
# -Cold-climate air-source heat pump for heating and cooling with electric backup
|
|
931
|
+
# -Electric baseboards
|
|
932
|
+
def add_ecm_hs09_ccashp_baseboard(model:,
|
|
933
|
+
system_zones_map:, # hash of ailoop names as keys and array of zones as values
|
|
934
|
+
system_doas_flags:) # hash of system names as keys and flag for DOAS as values
|
|
935
|
+
|
|
936
|
+
systems = []
|
|
937
|
+
system_zones_map.sort.each do |sys_name, zones|
|
|
938
|
+
sys_info = air_sys_comps_assumptions(sys_name: sys_name,
|
|
939
|
+
zones: zones,
|
|
940
|
+
system_doas_flags: system_doas_flags)
|
|
941
|
+
# add air loop and its equipment
|
|
942
|
+
airloop, return_fan = add_air_system(
|
|
943
|
+
model: model,
|
|
944
|
+
zones: zones,
|
|
945
|
+
sys_abbr: sys_info['sys_abbr'],
|
|
946
|
+
sys_vent_type: sys_info['sys_vent_type'],
|
|
947
|
+
sys_heat_rec_type: sys_info['sys_heat_rec_type'],
|
|
948
|
+
sys_htg_eqpt_type: 'ccashp',
|
|
949
|
+
sys_supp_htg_eqpt_type: 'coil_electric',
|
|
950
|
+
sys_clg_eqpt_type: 'ccashp',
|
|
951
|
+
sys_supp_fan_type: sys_info['sys_supp_fan_type'],
|
|
952
|
+
sys_ret_fan_type: sys_info['sys_ret_fan_type'],
|
|
953
|
+
sys_setpoint_mgr_type: sys_info['sys_setpoint_mgr_type']
|
|
954
|
+
)
|
|
955
|
+
htg_dx_coils = model.getCoilHeatingDXVariableSpeeds
|
|
956
|
+
search_criteria = {}
|
|
957
|
+
search_criteria['name'] = 'Mitsubishi_Hyper_Heating_VRF_Outdoor_Unit RTU',
|
|
958
|
+
props = model_find_object(standards_data['tables']['heat_pump_heating_ecm']['table'], search_criteria, 1.0)
|
|
959
|
+
heat_defrost_eir_ft = model_add_curve(model, props['heat_defrost_eir_ft'])
|
|
960
|
+
# This defrost curve has to be assigned here before sizing
|
|
961
|
+
if heat_defrost_eir_ft
|
|
962
|
+
htg_dx_coils.sort.each { |dxcoil| dxcoil.setDefrostEnergyInputRatioFunctionofTemperatureCurve(heat_defrost_eir_ft) }
|
|
963
|
+
else
|
|
964
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilHeatingDXVariableSpeed', "For #{htg_dx_coils[0].name}, cannot find heat_defrost_eir_ft curve, will not be set.")
|
|
965
|
+
end
|
|
966
|
+
# add zone equipment and diffuser
|
|
967
|
+
zone_htg_eqpt_type = 'baseboard_electric'
|
|
968
|
+
zone_htg_eqpt_type = 'ptac_electric_off' if sys_info['sys_vent_type'] == 'doas'
|
|
969
|
+
zone_clg_eqpt_type = 'none'
|
|
970
|
+
zone_clg_eqpt_type = 'ptac_electric_off' if sys_info['sys_vent_type'] == 'doas'
|
|
971
|
+
zone_fan_type = 'none'
|
|
972
|
+
zone_fan_type = 'constant_volume' if sys_info['sys_vent_type'] == 'doas'
|
|
973
|
+
add_zone_eqpt(model: model,
|
|
974
|
+
airloop: airloop,
|
|
975
|
+
zones: zones,
|
|
976
|
+
outdoor_unit: nil,
|
|
977
|
+
zone_diffuser_type: sys_info['zone_diffuser_type'],
|
|
978
|
+
zone_htg_eqpt_type: zone_htg_eqpt_type,
|
|
979
|
+
zone_supp_htg_eqpt_type: 'none',
|
|
980
|
+
zone_clg_eqpt_type: zone_clg_eqpt_type,
|
|
981
|
+
zone_fan_type: zone_fan_type)
|
|
982
|
+
# for doas use baseboard electric as backup for PTAC units
|
|
983
|
+
if sys_info['sys_vent_type'] == 'doas'
|
|
984
|
+
add_zone_eqpt(model: model,
|
|
985
|
+
airloop: airloop,
|
|
986
|
+
zones: zones,
|
|
987
|
+
outdoor_unit: nil,
|
|
988
|
+
zone_diffuser_type: nil,
|
|
989
|
+
zone_htg_eqpt_type: 'baseboard_electric',
|
|
990
|
+
zone_supp_htg_eqpt_type: 'none',
|
|
991
|
+
zone_clg_eqpt_type: 'none',
|
|
992
|
+
zone_fan_type: 'none')
|
|
993
|
+
end
|
|
994
|
+
return_fan.addToNode(airloop.returnAirNode.get) if return_fan
|
|
521
995
|
systems << airloop
|
|
522
996
|
end
|
|
523
997
|
|
|
@@ -525,22 +999,22 @@ class ECMS
|
|
|
525
999
|
end
|
|
526
1000
|
|
|
527
1001
|
# =============================================================================================================================
|
|
528
|
-
# Apply efficiencies and performance curves for ECM
|
|
529
|
-
def
|
|
1002
|
+
# Apply efficiencies and performance curves for ECM "hs09_ccashp_baseboard"
|
|
1003
|
+
def apply_efficiency_ecm_hs09_ccashp_baseboard(model)
|
|
530
1004
|
# fraction of electric backup heating coil capacity assigned to dx heating coil
|
|
531
1005
|
fr_backup_coil_cap_as_dx_coil_cap = 0.5
|
|
532
|
-
model.getAirLoopHVACs.each do |isys|
|
|
1006
|
+
model.getAirLoopHVACs.sort.each do |isys|
|
|
533
1007
|
clg_dx_coil = nil
|
|
534
1008
|
htg_dx_coil = nil
|
|
535
1009
|
backup_coil = nil
|
|
536
1010
|
fans = []
|
|
537
1011
|
# Find the components on the air loop
|
|
538
|
-
isys.supplyComponents.each do |icomp|
|
|
1012
|
+
isys.supplyComponents.sort.each do |icomp|
|
|
539
1013
|
if icomp.to_CoilCoolingDXVariableSpeed.is_initialized
|
|
540
1014
|
clg_dx_coil = icomp.to_CoilCoolingDXVariableSpeed.get
|
|
541
1015
|
elsif icomp.to_CoilHeatingDXVariableSpeed.is_initialized
|
|
542
1016
|
htg_dx_coil = icomp.to_CoilHeatingDXVariableSpeed.get
|
|
543
|
-
elsif
|
|
1017
|
+
elsif icomp.to_CoilHeatingElectric.is_initialized
|
|
544
1018
|
backup_coil = icomp.to_CoilHeatingElectric.get
|
|
545
1019
|
elsif icomp.to_FanConstantVolume.is_initialized
|
|
546
1020
|
fans << icomp.to_FanConstantVolume.get
|
|
@@ -549,32 +1023,474 @@ class ECMS
|
|
|
549
1023
|
end
|
|
550
1024
|
end
|
|
551
1025
|
if clg_dx_coil && htg_dx_coil && backup_coil
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
1026
|
+
clg_dx_coil_init_name = get_hvac_comp_init_name(clg_dx_coil, false)
|
|
1027
|
+
clg_dx_coil.setName(clg_dx_coil_init_name)
|
|
1028
|
+
if clg_dx_coil.autosizedGrossRatedTotalCoolingCapacityAtSelectedNominalSpeedLevel.is_initialized
|
|
1029
|
+
max_pd = 0.0
|
|
1030
|
+
supply_fan = nil
|
|
1031
|
+
fans.each do |fan|
|
|
1032
|
+
if fan.pressureRise.to_f > max_pd
|
|
1033
|
+
max_pd = fan.pressureRise.to_f
|
|
1034
|
+
supply_fan = fan # assume supply fan has higher pressure drop
|
|
1035
|
+
end
|
|
1036
|
+
end
|
|
1037
|
+
fan_power = supply_fan.autosizedMaximumFlowRate.to_f * max_pd / supply_fan.fanTotalEfficiency.to_f
|
|
1038
|
+
clg_dx_coil_cap = clg_dx_coil.autosizedGrossRatedTotalCoolingCapacityAtSelectedNominalSpeedLevel.to_f *
|
|
1039
|
+
supply_fan.autosizedMaximumFlowRate.to_f / clg_dx_coil.autosizedRatedAirFlowRateAtSelectedNominalSpeedLevel.to_f +
|
|
1040
|
+
fan_power / clg_dx_coil.speeds.last.referenceUnitGrossRatedSensibleHeatRatio.to_f
|
|
1041
|
+
else
|
|
1042
|
+
clg_dx_coil_cap = clg_dx_coil.grossRatedTotalCoolingCapacityAtSelectedNominalSpeedLevel.to_f
|
|
558
1043
|
end
|
|
1044
|
+
htg_dx_coil_init_name = get_hvac_comp_init_name(htg_dx_coil, false)
|
|
1045
|
+
htg_dx_coil.setName(htg_dx_coil_init_name)
|
|
1046
|
+
backup_coil_cap = backup_coil.autosizedNominalCapacity.to_f
|
|
559
1047
|
# Set the DX capacities to the maximum of the fraction of the backup coil capacity or the cooling capacity needed
|
|
560
|
-
dx_cap = fr_backup_coil_cap_as_dx_coil_cap*backup_coil_cap
|
|
561
|
-
if dx_cap <
|
|
1048
|
+
dx_cap = fr_backup_coil_cap_as_dx_coil_cap * backup_coil_cap
|
|
1049
|
+
if dx_cap < clg_dx_coil_cap then dx_cap = clg_dx_coil_cap end
|
|
562
1050
|
clg_dx_coil.setGrossRatedTotalCoolingCapacityAtSelectedNominalSpeedLevel(dx_cap)
|
|
563
1051
|
htg_dx_coil.setRatedHeatingCapacityAtSelectedNominalSpeedLevel(dx_cap)
|
|
1052
|
+
# Assign performance curves and COPs
|
|
1053
|
+
eqpt_name = 'Mitsubishi_Hyper_Heating_VRF_Outdoor_Unit RTU'
|
|
1054
|
+
coil_cooling_dx_variable_speed_apply_efficiency_and_curves(clg_dx_coil, eqpt_name)
|
|
1055
|
+
coil_heating_dx_variable_speed_apply_efficiency_and_curves(htg_dx_coil, eqpt_name)
|
|
564
1056
|
end
|
|
565
1057
|
end
|
|
566
|
-
# Assign performance curves and COPs
|
|
567
|
-
model.getCoilCoolingDXVariableSpeeds.sort.each {|coil| coil_cooling_dx_variable_speed_apply_efficiency_and_curves(coil,ecm_name)}
|
|
568
|
-
model.getCoilHeatingDXVariableSpeeds.sort.each {|coil| coil_heating_dx_variable_speed_apply_efficiency_and_curves(coil,ecm_name)}
|
|
569
1058
|
end
|
|
570
1059
|
|
|
571
1060
|
# =============================================================================================================================
|
|
572
|
-
#
|
|
573
|
-
|
|
1061
|
+
# Add equipment for ECM "hs11_ashp_pthp"
|
|
1062
|
+
# -Constant volume DOAS with air-source heat pump for heating and cooling and electric backup
|
|
1063
|
+
# -Packaged-Terminal air-source heat pumps with electric backup
|
|
1064
|
+
def add_ecm_hs11_ashp_pthp(model:,
|
|
1065
|
+
system_zones_map:,
|
|
1066
|
+
system_doas_flags:)
|
|
1067
|
+
|
|
1068
|
+
# Update system doas flags
|
|
1069
|
+
system_doas_flags.keys.each { |sname| system_doas_flags[sname] = true }
|
|
1070
|
+
# use system zones map and generate new air system and zonal equipment
|
|
1071
|
+
systems = []
|
|
1072
|
+
system_zones_map.sort.each do |sys_name, zones|
|
|
1073
|
+
sys_info = air_sys_comps_assumptions(sys_name: sys_name,
|
|
1074
|
+
zones: zones,
|
|
1075
|
+
system_doas_flags: system_doas_flags)
|
|
1076
|
+
airloop, return_fan = add_air_system(model: model,
|
|
1077
|
+
zones: zones,
|
|
1078
|
+
sys_abbr: sys_info['sys_abbr'],
|
|
1079
|
+
sys_vent_type: sys_info['sys_vent_type'],
|
|
1080
|
+
sys_heat_rec_type: sys_info['sys_heat_rec_type'],
|
|
1081
|
+
sys_htg_eqpt_type: 'ashp',
|
|
1082
|
+
sys_supp_htg_eqpt_type: 'coil_electric',
|
|
1083
|
+
sys_clg_eqpt_type: 'ashp',
|
|
1084
|
+
sys_supp_fan_type: sys_info['sys_supp_fan_type'],
|
|
1085
|
+
sys_ret_fan_type: sys_info['sys_ret_fan_type'],
|
|
1086
|
+
sys_setpoint_mgr_type: sys_info['sys_setpoint_mgr_type'])
|
|
1087
|
+
# Get and assign defrost performance curve
|
|
1088
|
+
search_criteria = {}
|
|
1089
|
+
search_criteria['name'] = 'HS11_PTHP'
|
|
1090
|
+
props = model_find_object(standards_data['tables']['heat_pump_heating_ecm']['table'], search_criteria, 1.0)
|
|
1091
|
+
heat_defrost_eir_ft = model_add_curve(model, props['heat_defrost_eir_ft'])
|
|
1092
|
+
if !heat_defrost_eir_ft
|
|
1093
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilHeatingDXConstantSpeed', 'Cannot find heat_defrost_eir_ft curve, will not be set.')
|
|
1094
|
+
end
|
|
1095
|
+
airloop.supplyComponents.each do |comp|
|
|
1096
|
+
if comp.to_CoilHeatingDXSingleSpeed.is_initialized
|
|
1097
|
+
htg_coil = comp.to_CoilHeatingDXSingleSpeed.get
|
|
1098
|
+
htg_coil.setDefrostEnergyInputRatioFunctionofTemperatureCurve(heat_defrost_eir_ft)
|
|
1099
|
+
end
|
|
1100
|
+
end
|
|
1101
|
+
# add zone equipment and diffuser
|
|
1102
|
+
zone_htg_eqpt_type = 'pthp'
|
|
1103
|
+
zone_clg_eqpt_type = 'pthp'
|
|
1104
|
+
zone_supp_htg_eqpt_type = 'coil_electric'
|
|
1105
|
+
zone_fan_type = 'on_off'
|
|
1106
|
+
add_zone_eqpt(model: model,
|
|
1107
|
+
airloop: airloop,
|
|
1108
|
+
zones: zones,
|
|
1109
|
+
outdoor_unit: nil,
|
|
1110
|
+
zone_diffuser_type: sys_info['zone_diffuser_type'],
|
|
1111
|
+
zone_htg_eqpt_type: zone_htg_eqpt_type,
|
|
1112
|
+
zone_supp_htg_eqpt_type: zone_supp_htg_eqpt_type,
|
|
1113
|
+
zone_clg_eqpt_type: zone_clg_eqpt_type,
|
|
1114
|
+
zone_fan_type: zone_fan_type)
|
|
1115
|
+
zones.each do |zone|
|
|
1116
|
+
zone.equipment.each do |comp|
|
|
1117
|
+
if comp.to_ZoneHVACPackagedTerminalHeatPump.is_initialized
|
|
1118
|
+
if comp.to_ZoneHVACPackagedTerminalHeatPump.get.heatingCoil.to_CoilHeatingDXSingleSpeed.is_initialized
|
|
1119
|
+
htg_coil = comp.to_ZoneHVACPackagedTerminalHeatPump.get.heatingCoil.to_CoilHeatingDXSingleSpeed.get
|
|
1120
|
+
htg_coil.setDefrostEnergyInputRatioFunctionofTemperatureCurve(heat_defrost_eir_ft)
|
|
1121
|
+
end
|
|
1122
|
+
end
|
|
1123
|
+
end
|
|
1124
|
+
end
|
|
1125
|
+
return_fan.addToNode(airloop.returnAirNode.get) if return_fan
|
|
1126
|
+
systems << airloop
|
|
1127
|
+
end
|
|
1128
|
+
|
|
1129
|
+
return systems
|
|
1130
|
+
end
|
|
1131
|
+
|
|
1132
|
+
# =============================================================================================================================
|
|
1133
|
+
# Apply efficiencies and performance curves for ECM "hs11_ashp_pthp"
|
|
1134
|
+
def apply_efficiency_ecm_hs11_ashp_pthp(model)
|
|
1135
|
+
fr_backup_coil_cap_as_dx_coil_cap = 0.5 # fraction of electric backup heating coil capacity assigned to dx heating coil
|
|
1136
|
+
apply_efficiency_ecm_hs12_ashp_baseboard(model)
|
|
1137
|
+
pthp_eqpt_name = 'HS11_PTHP'
|
|
1138
|
+
model.getAirLoopHVACs.sort.each do |isys|
|
|
1139
|
+
isys.thermalZones.each do |zone|
|
|
1140
|
+
clg_dx_coil = nil
|
|
1141
|
+
htg_dx_coil = nil
|
|
1142
|
+
backup_coil = nil
|
|
1143
|
+
fan = nil
|
|
1144
|
+
zone.equipment.sort.each do |icomp|
|
|
1145
|
+
if icomp.to_ZoneHVACPackagedTerminalHeatPump.is_initialized
|
|
1146
|
+
if icomp.to_ZoneHVACPackagedTerminalHeatPump.get.coolingCoil.to_CoilCoolingDXSingleSpeed.is_initialized
|
|
1147
|
+
clg_dx_coil = icomp.to_ZoneHVACPackagedTerminalHeatPump.get.coolingCoil.to_CoilCoolingDXSingleSpeed.get
|
|
1148
|
+
end
|
|
1149
|
+
if icomp.to_ZoneHVACPackagedTerminalHeatPump.get.heatingCoil.to_CoilHeatingDXSingleSpeed.is_initialized
|
|
1150
|
+
htg_dx_coil = icomp.to_ZoneHVACPackagedTerminalHeatPump.get.heatingCoil.to_CoilHeatingDXSingleSpeed.get
|
|
1151
|
+
end
|
|
1152
|
+
if icomp.to_ZoneHVACPackagedTerminalHeatPump.get.supplementalHeatingCoil.to_CoilHeatingElectric.is_initialized
|
|
1153
|
+
backup_coil = icomp.to_ZoneHVACPackagedTerminalHeatPump.get.supplementalHeatingCoil.to_CoilHeatingElectric.get
|
|
1154
|
+
end
|
|
1155
|
+
if icomp.to_ZoneHVACPackagedTerminalHeatPump.get.supplyAirFan.to_FanOnOff.is_initialized
|
|
1156
|
+
fan = icomp.to_ZoneHVACPackagedTerminalHeatPump.get.supplyAirFan.to_FanOnOff.get
|
|
1157
|
+
end
|
|
1158
|
+
end
|
|
1159
|
+
if clg_dx_coil && htg_dx_coil && backup_coil && fan
|
|
1160
|
+
clg_dx_coil_init_name = get_hvac_comp_init_name(clg_dx_coil, false)
|
|
1161
|
+
clg_dx_coil.setName(clg_dx_coil_init_name)
|
|
1162
|
+
if clg_dx_coil.autosizedRatedTotalCoolingCapacity.is_initialized
|
|
1163
|
+
clg_dx_coil_cap = clg_dx_coil.autosizedRatedTotalCoolingCapacity.to_f
|
|
1164
|
+
else
|
|
1165
|
+
clg_dx_coil_cap = clg_dx_coil.ratedTotalCoolingCapacity.to_f
|
|
1166
|
+
end
|
|
1167
|
+
htg_dx_coil_init_name = get_hvac_comp_init_name(htg_dx_coil, true)
|
|
1168
|
+
htg_dx_coil.setName(htg_dx_coil_init_name)
|
|
1169
|
+
backup_coil_cap = backup_coil.autosizedNominalCapacity.to_f
|
|
1170
|
+
# Set the DX capacities to the maximum of the fraction of the backup coil capacity or the cooling capacity needed
|
|
1171
|
+
dx_cap = fr_backup_coil_cap_as_dx_coil_cap * backup_coil_cap
|
|
1172
|
+
if dx_cap < clg_dx_coil_cap then dx_cap = clg_dx_coil_cap end
|
|
1173
|
+
# clg_dx_coil.setRatedTotalCoolingCapacity(dx_cap)
|
|
1174
|
+
# htg_dx_coil.setRatedTotalHeatingCapacity(dx_cap)
|
|
1175
|
+
# assign performance curves and COPs
|
|
1176
|
+
coil_cooling_dx_single_speed_apply_efficiency_and_curves(clg_dx_coil, pthp_eqpt_name)
|
|
1177
|
+
coil_heating_dx_single_speed_apply_efficiency_and_curves(htg_dx_coil, pthp_eqpt_name)
|
|
1178
|
+
# Set fan power
|
|
1179
|
+
fan_power_per_flow_rate = 150.0 # based on Mitsubishi data: 100 low and 200 high (W-s/m3)
|
|
1180
|
+
fan_pr_rise = fan_power_per_flow_rate * (fan.fanEfficiency * fan.motorEfficiency)
|
|
1181
|
+
fan.setPressureRise(fan_pr_rise)
|
|
1182
|
+
end
|
|
1183
|
+
end
|
|
1184
|
+
end
|
|
1185
|
+
end
|
|
1186
|
+
end
|
|
1187
|
+
|
|
1188
|
+
# =============================================================================================================================
|
|
1189
|
+
# Add equipment for ecm "hs12_ashp_baseboard":
|
|
1190
|
+
# -Constant-volume reheat system for single zone systems
|
|
1191
|
+
# -VAV system with reheat for non DOAS multi-zone systems
|
|
1192
|
+
# -Air-source heat pump for heating and cooling with electric backup
|
|
1193
|
+
# -Electric baseboards
|
|
1194
|
+
def add_ecm_hs12_ashp_baseboard(model:,
|
|
1195
|
+
system_zones_map:,
|
|
1196
|
+
system_doas_flags:)
|
|
1197
|
+
|
|
1198
|
+
systems = []
|
|
1199
|
+
system_zones_map.sort.each do |sys_name, zones|
|
|
1200
|
+
sys_info = air_sys_comps_assumptions(sys_name: sys_name,
|
|
1201
|
+
zones: zones,
|
|
1202
|
+
system_doas_flags: system_doas_flags)
|
|
1203
|
+
# add air loop and its equipment
|
|
1204
|
+
airloop, return_fan = add_air_system(model: model,
|
|
1205
|
+
zones: zones,
|
|
1206
|
+
sys_abbr: sys_info['sys_abbr'],
|
|
1207
|
+
sys_vent_type: sys_info['sys_vent_type'],
|
|
1208
|
+
sys_heat_rec_type: sys_info['sys_heat_rec_type'],
|
|
1209
|
+
sys_htg_eqpt_type: 'ashp',
|
|
1210
|
+
sys_supp_htg_eqpt_type: 'coil_electric',
|
|
1211
|
+
sys_clg_eqpt_type: 'ashp',
|
|
1212
|
+
sys_supp_fan_type: sys_info['sys_supp_fan_type'],
|
|
1213
|
+
sys_ret_fan_type: sys_info['sys_ret_fan_type'],
|
|
1214
|
+
sys_setpoint_mgr_type: sys_info['sys_setpoint_mgr_type'])
|
|
1215
|
+
# get and assign defrost curve
|
|
1216
|
+
htg_dx_coils = model.getCoilHeatingDXSingleSpeeds
|
|
1217
|
+
search_criteria = {}
|
|
1218
|
+
search_criteria['name'] = 'NECB2015_ASHP'
|
|
1219
|
+
props = model_find_object(standards_data['tables']['heat_pump_heating_ecm']['table'], search_criteria, 1.0)
|
|
1220
|
+
heat_defrost_eir_ft = model_add_curve(model, props['heat_defrost_eir_ft'])
|
|
1221
|
+
if heat_defrost_eir_ft
|
|
1222
|
+
htg_dx_coils.sort.each { |dxcoil| dxcoil.setDefrostEnergyInputRatioFunctionofTemperatureCurve(heat_defrost_eir_ft) }
|
|
1223
|
+
else
|
|
1224
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilHeatingDXSingleSpeed', "For #{htg_dx_coils[0].name}, cannot find heat_defrost_eir_ft curve, will not be set.")
|
|
1225
|
+
end
|
|
1226
|
+
# add zone equipment and diffuser
|
|
1227
|
+
zone_htg_eqpt_type = 'baseboard_electric'
|
|
1228
|
+
zone_htg_eqpt_type = 'ptac_electric_off' if sys_info['sys_vent_type'] == 'doas'
|
|
1229
|
+
zone_clg_eqpt_type = 'none'
|
|
1230
|
+
zone_clg_eqpt_type = 'ptac_electric_off' if sys_info['sys_vent_type'] == 'doas'
|
|
1231
|
+
zone_fan_type = 'none'
|
|
1232
|
+
zone_fan_type = 'constant_volume' if sys_info['sys_vent_type'] == 'doas'
|
|
1233
|
+
add_zone_eqpt(model: model,
|
|
1234
|
+
airloop: airloop,
|
|
1235
|
+
zones: zones,
|
|
1236
|
+
outdoor_unit: nil,
|
|
1237
|
+
zone_diffuser_type: sys_info['zone_diffuser_type'],
|
|
1238
|
+
zone_htg_eqpt_type: zone_htg_eqpt_type,
|
|
1239
|
+
zone_supp_htg_eqpt_type: 'none',
|
|
1240
|
+
zone_clg_eqpt_type: zone_clg_eqpt_type,
|
|
1241
|
+
zone_fan_type: zone_fan_type)
|
|
1242
|
+
# for doas use baseboard electric as backup for PTAC units
|
|
1243
|
+
if sys_info['sys_vent_type'] == 'doas'
|
|
1244
|
+
add_zone_eqpt(model: model,
|
|
1245
|
+
airloop: airloop,
|
|
1246
|
+
zones: zones,
|
|
1247
|
+
outdoor_unit: nil,
|
|
1248
|
+
zone_diffuser_type: nil,
|
|
1249
|
+
zone_htg_eqpt_type: 'baseboard_electric',
|
|
1250
|
+
zone_supp_htg_eqpt_type: 'none',
|
|
1251
|
+
zone_clg_eqpt_type: 'none',
|
|
1252
|
+
zone_fan_type: 'none')
|
|
1253
|
+
end
|
|
1254
|
+
return_fan.addToNode(airloop.returnAirNode.get) if return_fan
|
|
1255
|
+
systems << airloop
|
|
1256
|
+
end
|
|
1257
|
+
|
|
1258
|
+
return systems
|
|
1259
|
+
end
|
|
1260
|
+
|
|
1261
|
+
# =============================================================================================================================
|
|
1262
|
+
# Name of HVAC component might have been updated by standards methods for setting efficiency. Here original name of the component
|
|
1263
|
+
# is restored.
|
|
1264
|
+
def get_hvac_comp_init_name(obj, htg_flag)
|
|
1265
|
+
return obj.name.to_s if obj.name.to_s.split.size <= 2
|
|
1266
|
+
|
|
1267
|
+
init_name = obj.name.to_s.split[0]
|
|
1268
|
+
range = obj.name.to_s.split.size - 3
|
|
1269
|
+
range = obj.name.to_s.split.size - 5 if htg_flag
|
|
1270
|
+
for i in 1..range
|
|
1271
|
+
init_name += " #{obj.name.to_s.split[i]}"
|
|
1272
|
+
end
|
|
1273
|
+
return init_name
|
|
1274
|
+
end
|
|
1275
|
+
|
|
1276
|
+
# =============================================================================================================================
|
|
1277
|
+
# Apply efficiencies and performance curves for ECM "hs12_ashp_baseboard"
|
|
1278
|
+
def apply_efficiency_ecm_hs12_ashp_baseboard(model)
|
|
1279
|
+
fr_backup_coil_cap_as_dx_coil_cap = 0.5 # fraction of electric backup heating coil capacity assigned to dx heating coil
|
|
1280
|
+
ashp_eqpt_name = 'NECB2015_ASHP'
|
|
1281
|
+
model.getAirLoopHVACs.sort.each do |isys|
|
|
1282
|
+
clg_dx_coil = nil
|
|
1283
|
+
htg_dx_coil = nil
|
|
1284
|
+
backup_coil = nil
|
|
1285
|
+
# Find the coils on the air loop
|
|
1286
|
+
isys.supplyComponents.sort.each do |icomp|
|
|
1287
|
+
if icomp.to_CoilCoolingDXSingleSpeed.is_initialized
|
|
1288
|
+
clg_dx_coil = icomp.to_CoilCoolingDXSingleSpeed.get
|
|
1289
|
+
elsif icomp.to_CoilHeatingDXSingleSpeed.is_initialized
|
|
1290
|
+
htg_dx_coil = icomp.to_CoilHeatingDXSingleSpeed.get
|
|
1291
|
+
elsif icomp.to_CoilHeatingElectric.is_initialized
|
|
1292
|
+
backup_coil = icomp.to_CoilHeatingElectric.get
|
|
1293
|
+
end
|
|
1294
|
+
end
|
|
1295
|
+
if clg_dx_coil && htg_dx_coil && backup_coil
|
|
1296
|
+
# update names of dx coils
|
|
1297
|
+
clg_dx_coil_init_name = get_hvac_comp_init_name(clg_dx_coil, false)
|
|
1298
|
+
clg_dx_coil.setName(clg_dx_coil_init_name)
|
|
1299
|
+
if clg_dx_coil.autosizedRatedTotalCoolingCapacity.is_initialized
|
|
1300
|
+
clg_dx_coil_cap = clg_dx_coil.autosizedRatedTotalCoolingCapacity.to_f
|
|
1301
|
+
else
|
|
1302
|
+
clg_dx_coil_cap = clg_dx_coil.ratedTotalCoolingCapacity.to_f
|
|
1303
|
+
end
|
|
1304
|
+
htg_dx_coil_init_name = get_hvac_comp_init_name(htg_dx_coil, true)
|
|
1305
|
+
htg_dx_coil.setName(htg_dx_coil_init_name)
|
|
1306
|
+
backup_coil_cap = backup_coil.autosizedNominalCapacity.to_f
|
|
1307
|
+
# set the DX capacities to the maximum of the fraction of the backup coil capacity or the cooling capacity needed
|
|
1308
|
+
dx_cap = fr_backup_coil_cap_as_dx_coil_cap * backup_coil_cap
|
|
1309
|
+
if dx_cap < clg_dx_coil_cap then dx_cap = clg_dx_coil_cap end
|
|
1310
|
+
clg_dx_coil.setRatedTotalCoolingCapacity(dx_cap)
|
|
1311
|
+
htg_dx_coil.setRatedTotalHeatingCapacity(dx_cap)
|
|
1312
|
+
# assign performance curves and COPs
|
|
1313
|
+
coil_cooling_dx_single_speed_apply_efficiency_and_curves(clg_dx_coil, ashp_eqpt_name)
|
|
1314
|
+
coil_heating_dx_single_speed_apply_efficiency_and_curves(htg_dx_coil, ashp_eqpt_name)
|
|
1315
|
+
end
|
|
1316
|
+
end
|
|
1317
|
+
end
|
|
1318
|
+
|
|
1319
|
+
# =============================================================================================================================
|
|
1320
|
+
# Add equipment for ecm "hs13_ashp_vrf":
|
|
1321
|
+
# -Constant-volume dedicated-outside air system
|
|
1322
|
+
# -Air-source heat pump for heating and cooling with electric backup
|
|
1323
|
+
# -Zonal VRF terminal units for heating and cooling with electric baseboards
|
|
1324
|
+
def add_ecm_hs13_ashp_vrf(model:,
|
|
1325
|
+
system_zones_map:,
|
|
1326
|
+
system_doas_flags:)
|
|
1327
|
+
# call method for ECM hs08 with ASHP in the air system
|
|
1328
|
+
add_ecm_hs08_ccashp_vrf(model: model,
|
|
1329
|
+
system_zones_map: system_zones_map,
|
|
1330
|
+
system_doas_flags: system_doas_flags,
|
|
1331
|
+
air_sys_eqpt_type: 'ashp')
|
|
1332
|
+
end
|
|
1333
|
+
|
|
1334
|
+
# =============================================================================================================================
|
|
1335
|
+
# Apply efficiencies and performance curves for ECM "hs12_ashp_vrf"
|
|
1336
|
+
def apply_efficiency_ecm_hs13_ashp_vrf(model)
|
|
1337
|
+
# call method for ECM hs08 with ASHP in air system
|
|
1338
|
+
apply_efficiency_ecm_hs08_ccashp_vrf(model, air_sys_eqpt_type: 'ashp')
|
|
1339
|
+
end
|
|
1340
|
+
|
|
1341
|
+
# =============================================================================================================================
|
|
1342
|
+
# Applies the standard efficiency ratings and typical performance curves "CoilCoolingDXSingleSpeed" object.
|
|
1343
|
+
def coil_cooling_dx_single_speed_apply_efficiency_and_curves(coil_cooling_dx_single_speed, eqpt_name)
|
|
1344
|
+
successfully_set_all_properties = true
|
|
1345
|
+
|
|
1346
|
+
search_criteria = {}
|
|
1347
|
+
search_criteria['name'] = eqpt_name
|
|
1348
|
+
|
|
1349
|
+
# Get the capacity
|
|
1350
|
+
capacity_w = coil_cooling_dx_single_speed_find_capacity(coil_cooling_dx_single_speed)
|
|
1351
|
+
capacity_btu_per_hr = OpenStudio.convert(capacity_w, 'W', 'Btu/hr').get
|
|
1352
|
+
|
|
1353
|
+
# Lookup efficiencies
|
|
1354
|
+
ac_props = model_find_object(standards_data['tables']['heat_pump_cooling_ecm']['table'], search_criteria, capacity_btu_per_hr)
|
|
1355
|
+
|
|
1356
|
+
# Check to make sure properties were found
|
|
1357
|
+
if ac_props.nil?
|
|
1358
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standard.CoilCoolingDXSingleSpeed', "For #{coil_cooling_dx_single_speed.name}, cannot find efficiency info using #{search_criteria}, cannot apply efficiency.")
|
|
1359
|
+
successfully_set_all_properties = false
|
|
1360
|
+
end
|
|
1361
|
+
|
|
1362
|
+
# Make the COOL-CAP-FT curve
|
|
1363
|
+
cool_cap_ft = model_add_curve(coil_cooling_dx_single_speed.model, ac_props['cool_cap_ft'])
|
|
1364
|
+
|
|
1365
|
+
if cool_cap_ft
|
|
1366
|
+
coil_cooling_dx_single_speed.setTotalCoolingCapacityFunctionOfTemperatureCurve(cool_cap_ft)
|
|
1367
|
+
else
|
|
1368
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standard.CoilCoolingDXSingleSpeed', "For #{coil_cooling_dx_single_speed.name}, cannot find cool_cap_ft curve, will not be set.")
|
|
1369
|
+
successfully_set_all_properties = false
|
|
1370
|
+
end
|
|
1371
|
+
|
|
1372
|
+
# Make the COOL-CAP-FFLOW curve
|
|
1373
|
+
cool_cap_fflow = model_add_curve(coil_cooling_dx_single_speed.model, ac_props['cool_cap_fflow'])
|
|
1374
|
+
if cool_cap_fflow
|
|
1375
|
+
coil_cooling_dx_single_speed.setTotalCoolingCapacityFunctionOfFlowFractionCurve(cool_cap_fflow)
|
|
1376
|
+
else
|
|
1377
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standard.CoilCoolingDXSingleSpeed', "For #{coil_cooling_dx_single_speed.name}, cannot find cool_cap_fflow curve, will not be set.")
|
|
1378
|
+
successfully_set_all_properties = false
|
|
1379
|
+
end
|
|
1380
|
+
|
|
1381
|
+
# Make the COOL-EIR-FT curve
|
|
1382
|
+
cool_eir_ft = model_add_curve(coil_cooling_dx_single_speed.model, ac_props['cool_eir_ft'])
|
|
1383
|
+
if cool_eir_ft
|
|
1384
|
+
coil_cooling_dx_single_speed.setEnergyInputRatioFunctionOfTemperatureCurve(cool_eir_ft)
|
|
1385
|
+
else
|
|
1386
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilCoolingDXSingleSpeed', "For #{coil_cooling_dx_single_speed.name}, cannot find cool_eir_ft curve, will not be set.")
|
|
1387
|
+
successfully_set_all_properties = false
|
|
1388
|
+
end
|
|
1389
|
+
|
|
1390
|
+
# Make the COOL-EIR-FFLOW curve
|
|
1391
|
+
cool_eir_fflow = model_add_curve(coil_cooling_dx_single_speed.model, ac_props['cool_eir_fflow'])
|
|
1392
|
+
if cool_eir_fflow
|
|
1393
|
+
coil_cooling_dx_single_speed.setEnergyInputRatioFunctionOfFlowFractionCurve(cool_eir_fflow)
|
|
1394
|
+
else
|
|
1395
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilCoolingDXSingleSpeed', "For #{coil_cooling_dx_single_speed.name}, cannot find cool_eir_fflow curve, will not be set.")
|
|
1396
|
+
successfully_set_all_properties = false
|
|
1397
|
+
end
|
|
1398
|
+
|
|
1399
|
+
# Make the COOL-PLF-FPLR curve
|
|
1400
|
+
cool_plf_fplr = model_add_curve(coil_cooling_dx_single_speed.model, ac_props['cool_plf_fplr'])
|
|
1401
|
+
if cool_plf_fplr
|
|
1402
|
+
coil_cooling_dx_single_speed.setPartLoadFractionCorrelationCurve(cool_plf_fplr)
|
|
1403
|
+
else
|
|
1404
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilCoolingDXSingleSpeed', "For #{coil_cooling_dx_Single_speed.name}, cannot find cool_plf_fplr curve, will not be set.")
|
|
1405
|
+
successfully_set_all_properties = false
|
|
1406
|
+
end
|
|
1407
|
+
|
|
1408
|
+
# Find the minimum COP and rename with efficiency rating
|
|
1409
|
+
cop = coil_cooling_dx_single_speed_standard_minimum_cop(coil_cooling_dx_single_speed, search_criteria, false)
|
|
1410
|
+
|
|
1411
|
+
# Set the efficiency values
|
|
1412
|
+
coil_cooling_dx_single_speed.setRatedCOP(cop.to_f) unless cop.nil?
|
|
1413
|
+
end
|
|
1414
|
+
|
|
1415
|
+
# =============================================================================================================================
|
|
1416
|
+
# Applies the standard efficiency ratings and typical performance curves to "CoilHeatingSingleSpeed" object.
|
|
1417
|
+
def coil_heating_dx_single_speed_apply_efficiency_and_curves(coil_heating_dx_single_speed, eqpt_name)
|
|
574
1418
|
successfully_set_all_properties = true
|
|
575
1419
|
|
|
576
1420
|
# Get the search criteria
|
|
577
|
-
search_criteria =
|
|
1421
|
+
search_criteria = {}
|
|
1422
|
+
search_criteria['name'] = eqpt_name
|
|
1423
|
+
|
|
1424
|
+
# Get the capacity
|
|
1425
|
+
capacity_w = coil_heating_dx_single_speed_find_capacity(coil_heating_dx_single_speed)
|
|
1426
|
+
capacity_btu_per_hr = OpenStudio.convert(capacity_w, 'W', 'Btu/hr').get
|
|
1427
|
+
capacity_kbtu_per_hr = OpenStudio.convert(capacity_w, 'W', 'kBtu/hr').get
|
|
1428
|
+
|
|
1429
|
+
# Lookup efficiencies
|
|
1430
|
+
props = model_find_object(standards_data['tables']['heat_pump_heating_ecm']['table'], search_criteria, capacity_btu_per_hr)
|
|
1431
|
+
|
|
1432
|
+
# Check to make sure properties were found
|
|
1433
|
+
if props.nil?
|
|
1434
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilHeatingDXSingleSpeed', "For #{coil_heating_dx_single_speed.name}, cannot find efficiency info using #{search_criteria}, cannot apply efficiency standard.")
|
|
1435
|
+
successfully_set_all_properties = false
|
|
1436
|
+
end
|
|
1437
|
+
|
|
1438
|
+
# Make the HEAT-CAP-FT curve
|
|
1439
|
+
heat_cap_ft = model_add_curve(coil_heating_dx_single_speed.model, props['heat_cap_ft'])
|
|
1440
|
+
if heat_cap_ft
|
|
1441
|
+
coil_heating_dx_single_speed.setTotalHeatingCapacityFunctionofTemperatureCurve(heat_cap_ft)
|
|
1442
|
+
else
|
|
1443
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilHeatingDXSingleSpeed', "For #{coil_heating_dx_single_speed.name}, cannot find heat_cap_ft curve, will not be set.")
|
|
1444
|
+
successfully_set_all_properties = false
|
|
1445
|
+
end
|
|
1446
|
+
|
|
1447
|
+
# Make the HEAT-CAP-FFLOW curve
|
|
1448
|
+
heat_cap_fflow = model_add_curve(coil_heating_dx_single_speed.model, props['heat_cap_fflow'])
|
|
1449
|
+
if heat_cap_fflow
|
|
1450
|
+
coil_heating_dx_single_speed.setTotalHeatingCapacityFunctionofFlowFractionCurve(heat_cap_fflow)
|
|
1451
|
+
else
|
|
1452
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilHeatingDXSingleSpeed', "For #{coil_heating_dx_single_speed.name}, cannot find heat_cap_fflow curve, will not be set.")
|
|
1453
|
+
successfully_set_all_properties = false
|
|
1454
|
+
end
|
|
1455
|
+
|
|
1456
|
+
# Make the HEAT-EIR-FT curve
|
|
1457
|
+
heat_eir_ft = model_add_curve(coil_heating_dx_single_speed.model, props['heat_eir_ft'])
|
|
1458
|
+
if heat_eir_ft
|
|
1459
|
+
coil_heating_dx_single_speed.setEnergyInputRatioFunctionofTemperatureCurve(heat_eir_ft)
|
|
1460
|
+
else
|
|
1461
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilHeatingDXSingleSpeed', "For #{coil_heating_dx_single_speed.name}, cannot find heat_eir_ft curve, will not be set.")
|
|
1462
|
+
successfully_set_all_properties = false
|
|
1463
|
+
end
|
|
1464
|
+
|
|
1465
|
+
# Make the HEAT-EIR-FFLOW curve
|
|
1466
|
+
heat_eir_fflow = model_add_curve(coil_heating_dx_single_speed.model, props['heat_eir_fflow'])
|
|
1467
|
+
if heat_eir_fflow
|
|
1468
|
+
coil_heating_dx_single_speed.setEnergyInputRatioFunctionofFlowFractionCurve(heat_eir_fflow)
|
|
1469
|
+
else
|
|
1470
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilHeatingDXSingleSpeed', "For #{coil_heating_dx_single_speed.name}, cannot find heat_eir_fflow curve, will not be set.")
|
|
1471
|
+
successfully_set_all_properties = false
|
|
1472
|
+
end
|
|
1473
|
+
|
|
1474
|
+
# Make the HEAT-PLF-FPLR curve
|
|
1475
|
+
heat_plf_fplr = model_add_curve(coil_heating_dx_single_speed.model, props['heat_plf_fplr'])
|
|
1476
|
+
if heat_plf_fplr
|
|
1477
|
+
coil_heating_dx_single_speed.setPartLoadFractionCorrelationCurve(heat_plf_fplr)
|
|
1478
|
+
else
|
|
1479
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilHeatingDXSingleSpeed', "For #{coil_heating_dx_single_speed.name}, cannot find heat_plf_fplr curve, will not be set.")
|
|
1480
|
+
successfully_set_all_properties = false
|
|
1481
|
+
end
|
|
1482
|
+
|
|
1483
|
+
# Find the minimum COP and rename with efficiency rating
|
|
1484
|
+
cop = coil_heating_dx_single_speed_standard_minimum_cop(coil_heating_dx_single_speed, search_criteria, false)
|
|
1485
|
+
|
|
1486
|
+
# Set the efficiency values
|
|
1487
|
+
coil_heating_dx_single_speed.setRatedCOP(cop.to_f) unless cop.nil?
|
|
1488
|
+
end
|
|
1489
|
+
|
|
1490
|
+
# =============================================================================================================================
|
|
1491
|
+
# Applies the standard efficiency ratings and typical performance curves "CoilCoolingDXVariableSpeed" object.
|
|
1492
|
+
def coil_cooling_dx_variable_speed_apply_efficiency_and_curves(coil_cooling_dx_variable_speed, eqpt_name)
|
|
1493
|
+
successfully_set_all_properties = true
|
|
578
1494
|
|
|
579
1495
|
# Get the capacity
|
|
580
1496
|
capacity_w = coil_cooling_dx_variable_speed_find_capacity(coil_cooling_dx_variable_speed)
|
|
@@ -582,11 +1498,9 @@ class ECMS
|
|
|
582
1498
|
capacity_kbtu_per_hr = OpenStudio.convert(capacity_w, 'W', 'kBtu/hr').get
|
|
583
1499
|
|
|
584
1500
|
# Lookup efficiencies depending on whether it is a unitary AC or a heat pump
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
model_find_object(standards_data['tables']["unitary_acs_ecm_#{ecm_name.downcase}"]['table'], search_criteria, capacity_btu_per_hr, Date.today)
|
|
589
|
-
end
|
|
1501
|
+
search_criteria = {}
|
|
1502
|
+
search_criteria['name'] = eqpt_name
|
|
1503
|
+
ac_props = model_find_object(standards_data['tables']['heat_pump_cooling_ecm']['table'], search_criteria, capacity_btu_per_hr)
|
|
590
1504
|
|
|
591
1505
|
# Check to make sure properties were found
|
|
592
1506
|
if ac_props.nil?
|
|
@@ -597,7 +1511,7 @@ class ECMS
|
|
|
597
1511
|
# Make the COOL-CAP-FT curve
|
|
598
1512
|
cool_cap_ft = model_add_curve(coil_cooling_dx_variable_speed.model, ac_props['cool_cap_ft'])
|
|
599
1513
|
if cool_cap_ft
|
|
600
|
-
coil_cooling_dx_variable_speed.speeds.each {|speed| speed.setTotalCoolingCapacityFunctionofTemperatureCurve(cool_cap_ft)}
|
|
1514
|
+
coil_cooling_dx_variable_speed.speeds.each { |speed| speed.setTotalCoolingCapacityFunctionofTemperatureCurve(cool_cap_ft) }
|
|
601
1515
|
else
|
|
602
1516
|
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standard.CoilCoolingDXVariableSpeed', "For #{coil_cooling_dx_variable_speed.name}, cannot find cool_cap_ft curve, will not be set.")
|
|
603
1517
|
successfully_set_all_properties = false
|
|
@@ -606,7 +1520,7 @@ class ECMS
|
|
|
606
1520
|
# Make the COOL-CAP-FFLOW curve
|
|
607
1521
|
cool_cap_fflow = model_add_curve(coil_cooling_dx_variable_speed.model, ac_props['cool_cap_fflow'])
|
|
608
1522
|
if cool_cap_fflow
|
|
609
|
-
coil_cooling_dx_variable_speed.speeds.each {|speed| speed.setTotalCoolingCapacityFunctionofAirFlowFractionCurve(cool_cap_fflow)}
|
|
1523
|
+
coil_cooling_dx_variable_speed.speeds.each { |speed| speed.setTotalCoolingCapacityFunctionofAirFlowFractionCurve(cool_cap_fflow) }
|
|
610
1524
|
else
|
|
611
1525
|
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standard.CoilCoolingDXVariableSpeed', "For #{coil_cooling_dx_variable_speed.name}, cannot find cool_cap_fflow curve, will not be set.")
|
|
612
1526
|
successfully_set_all_properties = false
|
|
@@ -615,7 +1529,7 @@ class ECMS
|
|
|
615
1529
|
# Make the COOL-EIR-FT curve
|
|
616
1530
|
cool_eir_ft = model_add_curve(coil_cooling_dx_variable_speed.model, ac_props['cool_eir_ft'])
|
|
617
1531
|
if cool_eir_ft
|
|
618
|
-
coil_cooling_dx_variable_speed.speeds.each {|speed| speed.setEnergyInputRatioFunctionofTemperatureCurve(cool_eir_ft)}
|
|
1532
|
+
coil_cooling_dx_variable_speed.speeds.each { |speed| speed.setEnergyInputRatioFunctionofTemperatureCurve(cool_eir_ft) }
|
|
619
1533
|
else
|
|
620
1534
|
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilCoolingDXVariableSpeed', "For #{coil_cooling_dx_variable_speed.name}, cannot find cool_eir_ft curve, will not be set.")
|
|
621
1535
|
successfully_set_all_properties = false
|
|
@@ -624,7 +1538,7 @@ class ECMS
|
|
|
624
1538
|
# Make the COOL-EIR-FFLOW curve
|
|
625
1539
|
cool_eir_fflow = model_add_curve(coil_cooling_dx_variable_speed.model, ac_props['cool_eir_fflow'])
|
|
626
1540
|
if cool_eir_fflow
|
|
627
|
-
coil_cooling_dx_variable_speed.speeds.each {|speed| speed.setEnergyInputRatioFunctionofAirFlowFractionCurve(cool_eir_fflow)}
|
|
1541
|
+
coil_cooling_dx_variable_speed.speeds.each { |speed| speed.setEnergyInputRatioFunctionofAirFlowFractionCurve(cool_eir_fflow) }
|
|
628
1542
|
else
|
|
629
1543
|
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilCoolingDXVariableSpeed', "For #{coil_cooling_dx_variable_speed.name}, cannot find cool_eir_fflow curve, will not be set.")
|
|
630
1544
|
successfully_set_all_properties = false
|
|
@@ -640,22 +1554,20 @@ class ECMS
|
|
|
640
1554
|
end
|
|
641
1555
|
|
|
642
1556
|
# Find the minimum COP and rename with efficiency rating
|
|
643
|
-
cop = coil_cooling_dx_variable_speed_standard_minimum_cop(coil_cooling_dx_variable_speed,
|
|
1557
|
+
cop = coil_cooling_dx_variable_speed_standard_minimum_cop(coil_cooling_dx_variable_speed, search_criteria, false)
|
|
644
1558
|
|
|
645
1559
|
# Set the efficiency values
|
|
646
|
-
unless cop.nil?
|
|
647
|
-
coil_cooling_dx_variable_speed.speeds.each {|speed| speed.setReferenceUnitGrossRatedCoolingCOP(cop.to_f)}
|
|
648
|
-
end
|
|
649
|
-
|
|
1560
|
+
coil_cooling_dx_variable_speed.speeds.each { |speed| speed.setReferenceUnitGrossRatedCoolingCOP(cop.to_f) } unless cop.nil?
|
|
650
1561
|
end
|
|
651
1562
|
|
|
652
1563
|
# =============================================================================================================================
|
|
653
1564
|
# Applies the standard efficiency ratings and typical performance curves to "CoilHeatingVariableSpeed" object.
|
|
654
|
-
def coil_heating_dx_variable_speed_apply_efficiency_and_curves(coil_heating_dx_variable_speed,
|
|
1565
|
+
def coil_heating_dx_variable_speed_apply_efficiency_and_curves(coil_heating_dx_variable_speed, eqpt_name)
|
|
655
1566
|
successfully_set_all_properties = true
|
|
656
1567
|
|
|
657
1568
|
# Get the search criteria
|
|
658
|
-
search_criteria =
|
|
1569
|
+
search_criteria = {}
|
|
1570
|
+
search_criteria['name'] = eqpt_name
|
|
659
1571
|
|
|
660
1572
|
# Get the capacity
|
|
661
1573
|
capacity_w = coil_heating_dx_variable_speed_find_capacity(coil_heating_dx_variable_speed)
|
|
@@ -663,18 +1575,18 @@ class ECMS
|
|
|
663
1575
|
capacity_kbtu_per_hr = OpenStudio.convert(capacity_w, 'W', 'kBtu/hr').get
|
|
664
1576
|
|
|
665
1577
|
# Lookup efficiencies
|
|
666
|
-
props =
|
|
1578
|
+
props = model_find_object(standards_data['tables']['heat_pump_heating_ecm']['table'], search_criteria, capacity_btu_per_hr)
|
|
667
1579
|
|
|
668
1580
|
# Check to make sure properties were found
|
|
669
1581
|
if props.nil?
|
|
670
|
-
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilHeatingDXVariableSpeed', "For #{
|
|
1582
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilHeatingDXVariableSpeed', "For #{coil_heating_dx_variable_speed.name}, cannot find efficiency info using #{search_criteria}, cannot apply efficiency standard.")
|
|
671
1583
|
successfully_set_all_properties = false
|
|
672
1584
|
end
|
|
673
1585
|
|
|
674
1586
|
# Make the HEAT-CAP-FT curve
|
|
675
1587
|
heat_cap_ft = model_add_curve(coil_heating_dx_variable_speed.model, props['heat_cap_ft'])
|
|
676
1588
|
if heat_cap_ft
|
|
677
|
-
coil_heating_dx_variable_speed.speeds.each {|speed| speed.setHeatingCapacityFunctionofTemperatureCurve(heat_cap_ft)}
|
|
1589
|
+
coil_heating_dx_variable_speed.speeds.each { |speed| speed.setHeatingCapacityFunctionofTemperatureCurve(heat_cap_ft) }
|
|
678
1590
|
else
|
|
679
1591
|
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilHeatingDXVariableSpeed', "For #{coil_heating_dx_variable_speed.name}, cannot find heat_cap_ft curve, will not be set.")
|
|
680
1592
|
successfully_set_all_properties = false
|
|
@@ -683,7 +1595,7 @@ class ECMS
|
|
|
683
1595
|
# Make the HEAT-CAP-FFLOW curve
|
|
684
1596
|
heat_cap_fflow = model_add_curve(coil_heating_dx_variable_speed.model, props['heat_cap_fflow'])
|
|
685
1597
|
if heat_cap_fflow
|
|
686
|
-
coil_heating_dx_variable_speed.speeds.each {|speed| speed.setTotalHeatingCapacityFunctionofAirFlowFractionCurve(heat_cap_fflow)}
|
|
1598
|
+
coil_heating_dx_variable_speed.speeds.each { |speed| speed.setTotalHeatingCapacityFunctionofAirFlowFractionCurve(heat_cap_fflow) }
|
|
687
1599
|
else
|
|
688
1600
|
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilHeatingDXVariableSpeed', "For #{coil_heating_dx_variable_speed.name}, cannot find heat_cap_fflow curve, will not be set.")
|
|
689
1601
|
successfully_set_all_properties = false
|
|
@@ -692,7 +1604,7 @@ class ECMS
|
|
|
692
1604
|
# Make the HEAT-EIR-FT curve
|
|
693
1605
|
heat_eir_ft = model_add_curve(coil_heating_dx_variable_speed.model, props['heat_eir_ft'])
|
|
694
1606
|
if heat_eir_ft
|
|
695
|
-
coil_heating_dx_variable_speed.speeds.each {|speed| speed.setEnergyInputRatioFunctionofTemperatureCurve(heat_eir_ft)}
|
|
1607
|
+
coil_heating_dx_variable_speed.speeds.each { |speed| speed.setEnergyInputRatioFunctionofTemperatureCurve(heat_eir_ft) }
|
|
696
1608
|
else
|
|
697
1609
|
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilHeatingDXVariableSingleSpeed', "For #{coil_heating_dx_variable_speed.name}, cannot find heat_eir_ft curve, will not be set.")
|
|
698
1610
|
successfully_set_all_properties = false
|
|
@@ -701,7 +1613,7 @@ class ECMS
|
|
|
701
1613
|
# Make the HEAT-EIR-FFLOW curve
|
|
702
1614
|
heat_eir_fflow = model_add_curve(coil_heating_dx_variable_speed.model, props['heat_eir_fflow'])
|
|
703
1615
|
if heat_eir_fflow
|
|
704
|
-
coil_heating_dx_variable_speed.speeds.each {|speed| speed.setEnergyInputRatioFunctionofAirFlowFractionCurve(heat_eir_fflow)}
|
|
1616
|
+
coil_heating_dx_variable_speed.speeds.each { |speed| speed.setEnergyInputRatioFunctionofAirFlowFractionCurve(heat_eir_fflow) }
|
|
705
1617
|
else
|
|
706
1618
|
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilHeatingDXVariableSpeed', "For #{coil_heating_dx_variable_speed.name}, cannot find heat_eir_fflow curve, will not be set.")
|
|
707
1619
|
successfully_set_all_properties = false
|
|
@@ -717,22 +1629,19 @@ class ECMS
|
|
|
717
1629
|
end
|
|
718
1630
|
|
|
719
1631
|
# Find the minimum COP and rename with efficiency rating
|
|
720
|
-
cop = coil_heating_dx_variable_speed_standard_minimum_cop(coil_heating_dx_variable_speed,
|
|
1632
|
+
cop = coil_heating_dx_variable_speed_standard_minimum_cop(coil_heating_dx_variable_speed, search_criteria, false)
|
|
721
1633
|
|
|
722
1634
|
# Set the efficiency values
|
|
723
|
-
unless cop.nil?
|
|
724
|
-
coil_heating_dx_variable_speed.speeds.each {|speed| speed.setReferenceUnitGrossRatedHeatingCOP(cop.to_f)}
|
|
725
|
-
end
|
|
726
|
-
|
|
1635
|
+
coil_heating_dx_variable_speed.speeds.each { |speed| speed.setReferenceUnitGrossRatedHeatingCOP(cop.to_f) } unless cop.nil?
|
|
727
1636
|
end
|
|
728
1637
|
|
|
729
1638
|
# =============================================================================================================================
|
|
730
1639
|
# Applies the standard cooling efficiency ratings and typical performance curves to "AirConditionerVariableRefrigerantFlow" object.
|
|
731
|
-
def airconditioner_variablerefrigerantflow_cooling_apply_efficiency_and_curves(airconditioner_variablerefrigerantflow,
|
|
1640
|
+
def airconditioner_variablerefrigerantflow_cooling_apply_efficiency_and_curves(airconditioner_variablerefrigerantflow, eqpt_name)
|
|
732
1641
|
successfully_set_all_properties = true
|
|
733
1642
|
|
|
734
|
-
|
|
735
|
-
search_criteria =
|
|
1643
|
+
search_criteria = {}
|
|
1644
|
+
search_criteria['name'] = eqpt_name
|
|
736
1645
|
|
|
737
1646
|
# Get the capacity
|
|
738
1647
|
capacity_w = airconditioner_variablerefrigerantflow_cooling_find_capacity(airconditioner_variablerefrigerantflow)
|
|
@@ -740,7 +1649,7 @@ class ECMS
|
|
|
740
1649
|
capacity_kbtu_per_hr = OpenStudio.convert(capacity_w, 'W', 'kBtu/hr').get
|
|
741
1650
|
|
|
742
1651
|
# Lookup efficiencies
|
|
743
|
-
props =
|
|
1652
|
+
props = model_find_object(standards_data['tables']['heat_pump_cooling_ecm']['table'], search_criteria, capacity_btu_per_hr)
|
|
744
1653
|
|
|
745
1654
|
# Check to make sure properties were found
|
|
746
1655
|
if props.nil?
|
|
@@ -857,22 +1766,19 @@ class ECMS
|
|
|
857
1766
|
end
|
|
858
1767
|
|
|
859
1768
|
# Find the minimum COP
|
|
860
|
-
cop = airconditioner_variablerefrigerantflow_cooling_standard_minimum_cop(airconditioner_variablerefrigerantflow,
|
|
1769
|
+
cop = airconditioner_variablerefrigerantflow_cooling_standard_minimum_cop(airconditioner_variablerefrigerantflow, search_criteria, false)
|
|
861
1770
|
|
|
862
1771
|
# Set the efficiency values
|
|
863
|
-
unless cop.nil?
|
|
864
|
-
airconditioner_variablerefrigerantflow.setRatedCoolingCOP(cop.to_f)
|
|
865
|
-
end
|
|
866
|
-
|
|
1772
|
+
airconditioner_variablerefrigerantflow.setRatedCoolingCOP(cop.to_f) unless cop.nil?
|
|
867
1773
|
end
|
|
868
1774
|
|
|
869
1775
|
# =============================================================================================================================
|
|
870
1776
|
# Applies the standard heating efficiency ratings and typical performance curves to "AirConditionerVariableRefrigerantFlow" object.
|
|
871
|
-
def airconditioner_variablerefrigerantflow_heating_apply_efficiency_and_curves(airconditioner_variablerefrigerantflow,
|
|
1777
|
+
def airconditioner_variablerefrigerantflow_heating_apply_efficiency_and_curves(airconditioner_variablerefrigerantflow, eqpt_name)
|
|
872
1778
|
successfully_set_all_properties = true
|
|
873
1779
|
|
|
874
|
-
|
|
875
|
-
search_criteria =
|
|
1780
|
+
search_criteria = {}
|
|
1781
|
+
search_criteria['name'] = eqpt_name
|
|
876
1782
|
|
|
877
1783
|
# Get the capacity
|
|
878
1784
|
capacity_w = airconditioner_variablerefrigerantflow_heating_find_capacity(airconditioner_variablerefrigerantflow)
|
|
@@ -880,7 +1786,7 @@ class ECMS
|
|
|
880
1786
|
capacity_kbtu_per_hr = OpenStudio.convert(capacity_w, 'W', 'kBtu/hr').get
|
|
881
1787
|
|
|
882
1788
|
# Lookup efficiencies
|
|
883
|
-
props =
|
|
1789
|
+
props = model_find_object(standards_data['tables']['heat_pump_heating_ecm']['table'], search_criteria, capacity_btu_per_hr)
|
|
884
1790
|
|
|
885
1791
|
# Check to make sure properties were found
|
|
886
1792
|
if props.nil?
|
|
@@ -988,32 +1894,156 @@ class ECMS
|
|
|
988
1894
|
end
|
|
989
1895
|
|
|
990
1896
|
# Find the minimum COP and rename with efficiency rating
|
|
991
|
-
cop = airconditioner_variablerefrigerantflow_heating_standard_minimum_cop(airconditioner_variablerefrigerantflow,
|
|
1897
|
+
cop = airconditioner_variablerefrigerantflow_heating_standard_minimum_cop(airconditioner_variablerefrigerantflow, search_criteria, false)
|
|
992
1898
|
|
|
993
1899
|
# Set the efficiency values
|
|
994
|
-
unless cop.nil?
|
|
995
|
-
|
|
1900
|
+
airconditioner_variablerefrigerantflow.setRatedHeatingCOP(cop.to_f) unless cop.nil?
|
|
1901
|
+
end
|
|
1902
|
+
|
|
1903
|
+
# =============================================================================================================================
|
|
1904
|
+
# Find minimum efficiency for "CoilCoolingDXSingleSpeed" object
|
|
1905
|
+
def coil_cooling_dx_single_speed_standard_minimum_cop(coil_cooling_dx_single_speed,
|
|
1906
|
+
search_criteria,
|
|
1907
|
+
rename = false)
|
|
1908
|
+
|
|
1909
|
+
capacity_w = coil_cooling_dx_single_speed_find_capacity(coil_cooling_dx_single_speed)
|
|
1910
|
+
capacity_btu_per_hr = OpenStudio.convert(capacity_w, 'W', 'Btu/hr').get
|
|
1911
|
+
capacity_kbtu_per_hr = OpenStudio.convert(capacity_w, 'W', 'kBtu/hr').get
|
|
1912
|
+
|
|
1913
|
+
# Look up the efficiency characteristics
|
|
1914
|
+
ac_props = model_find_object(standards_data['tables']['heat_pump_cooling_ecm']['table'], search_criteria, capacity_btu_per_hr)
|
|
1915
|
+
|
|
1916
|
+
# Check to make sure properties were found
|
|
1917
|
+
if ac_props.nil?
|
|
1918
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilCoolingDXSingleSpeed', "For #{coil_cooling_dx_single_speed.name}, cannot find efficiency info using #{search_criteria}, cannot apply efficiency standard.")
|
|
1919
|
+
successfully_set_all_properties = false
|
|
1920
|
+
return successfully_set_all_properties
|
|
1921
|
+
end
|
|
1922
|
+
|
|
1923
|
+
# Get the minimum efficiency standards
|
|
1924
|
+
cop = nil
|
|
1925
|
+
|
|
1926
|
+
# If specified as SEER
|
|
1927
|
+
unless ac_props['minimum_seasonal_energy_efficiency_ratio'].nil?
|
|
1928
|
+
min_seer = ac_props['minimum_seasonal_energy_efficiency_ratio']
|
|
1929
|
+
cop = seer_to_cop_cooling_with_fan(min_seer)
|
|
1930
|
+
new_comp_name = "#{coil_cooling_dx_single_speed.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_seer}SEER"
|
|
1931
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilCoolingDXSingleSpeed', "For #{template}: #{coil_cooling_dx_single_speed.name}: Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; SEER = #{min_seer}")
|
|
1932
|
+
end
|
|
1933
|
+
|
|
1934
|
+
# If specified as EER
|
|
1935
|
+
unless ac_props['minimum_energy_efficiency_ratio'].nil?
|
|
1936
|
+
min_eer = ac_props['minimum_energy_efficiency_ratio']
|
|
1937
|
+
cop = eer_to_cop(min_eer)
|
|
1938
|
+
new_comp_name = "#{coil_cooling_dx_single_speed.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_eer}EER"
|
|
1939
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilCoolingDXSingleSpeed', "For #{template}: #{coil_cooling_dx_single_speed.name}: Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; EER = #{min_eer}")
|
|
1940
|
+
end
|
|
1941
|
+
|
|
1942
|
+
# if specified as SEER (heat pump)
|
|
1943
|
+
unless ac_props['minimum_seasonal_efficiency'].nil?
|
|
1944
|
+
min_seer = ac_props['minimum_seasonal_efficiency']
|
|
1945
|
+
cop = seer_to_cop_cooling_with_fan(min_seer)
|
|
1946
|
+
new_comp_name = "#{coil_cooling_dx_single_speed.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_seer}SEER"
|
|
1947
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilCoolingDXSingleSpeed', "For #{template}: #{coil_cooling_dx_single_speed.name}: Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; SEER = #{min_seer}")
|
|
1948
|
+
end
|
|
1949
|
+
|
|
1950
|
+
# If specified as EER (heat pump)
|
|
1951
|
+
unless ac_props['minimum_full_load_efficiency'].nil?
|
|
1952
|
+
min_eer = ac_props['minimum_full_load_efficiency']
|
|
1953
|
+
cop = eer_to_cop(min_eer)
|
|
1954
|
+
new_comp_name = "#{coil_cooling_dx_single_speed.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_eer}EER"
|
|
1955
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilCoolingDXSingleSpeed', "For #{template}: #{coil_cooling_dx_single_speed.name}: Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; EER = #{min_eer}")
|
|
1956
|
+
end
|
|
1957
|
+
|
|
1958
|
+
# If specified as COP
|
|
1959
|
+
unless ac_props['minimum_coefficient_of_performance_cooling'].nil?
|
|
1960
|
+
cop = ac_props['minimum_coefficient_of_performance_cooling']
|
|
1961
|
+
new_comp_name = "#{coil_cooling_dx_single_speed.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{cop}COP"
|
|
1962
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilCoolingDXSingleSpeed', "For #{template}: #{coil_cooling_dx_single_speed.name}: Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; COP = #{cop}")
|
|
1963
|
+
end
|
|
1964
|
+
|
|
1965
|
+
# Rename
|
|
1966
|
+
if rename
|
|
1967
|
+
coil_cooling_dx_single_speed.setName(new_comp_name)
|
|
1968
|
+
end
|
|
1969
|
+
|
|
1970
|
+
return cop
|
|
1971
|
+
end
|
|
1972
|
+
|
|
1973
|
+
# =============================================================================================================================
|
|
1974
|
+
# Find minimum efficiency for "CoilHeatingDXSingleSpeed" object
|
|
1975
|
+
def coil_heating_dx_single_speed_standard_minimum_cop(coil_heating_dx_single_speed,
|
|
1976
|
+
search_criteria,
|
|
1977
|
+
rename = false)
|
|
1978
|
+
|
|
1979
|
+
capacity_w = coil_heating_dx_single_speed_find_capacity(coil_heating_dx_single_speed)
|
|
1980
|
+
capacity_btu_per_hr = OpenStudio.convert(capacity_w, 'W', 'Btu/hr').get
|
|
1981
|
+
capacity_kbtu_per_hr = OpenStudio.convert(capacity_w, 'W', 'kBtu/hr').get
|
|
1982
|
+
|
|
1983
|
+
# Look up the efficiency characteristics
|
|
1984
|
+
props = model_find_object(standards_data['tables']['heat_pump_heating_ecm'], search_criteria, capacity_btu_per_hr)
|
|
1985
|
+
|
|
1986
|
+
# Check to make sure properties were found
|
|
1987
|
+
if props.nil?
|
|
1988
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilHeatingDXSingleSpeed', "For #{coil_heating_dx_single_speed.name}, cannot find efficiency info using #{search_criteria}, cannot apply efficiency standard.")
|
|
1989
|
+
successfully_set_all_properties = false
|
|
1990
|
+
return successfully_set_all_properties
|
|
1991
|
+
end
|
|
1992
|
+
|
|
1993
|
+
# Get the minimum efficiency standards
|
|
1994
|
+
cop = nil
|
|
1995
|
+
|
|
1996
|
+
# If specified as EER
|
|
1997
|
+
unless props['minimum_energy_efficiency_ratio'].nil?
|
|
1998
|
+
min_eer = props['minimum_energy_efficiency_ratio']
|
|
1999
|
+
cop = eer_to_cop(min_eer)
|
|
2000
|
+
new_comp_name = "#{coil_heating_dx_single_speed.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_eer}EER"
|
|
2001
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilHeatingDXSingleSpeed', "For #{template}: #{coil_heating_dx_single_speed.name}: Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; EER = #{min_eer}")
|
|
2002
|
+
end
|
|
2003
|
+
|
|
2004
|
+
# if specified as HSPF (heat pump)
|
|
2005
|
+
unless props['minimum_heating_seasonal_performance_factor'].nil?
|
|
2006
|
+
min_hspf = props['minimum_heating_seasonal_performance_factor']
|
|
2007
|
+
cop = hspf_to_cop_heating_with_fan(min_hspf)
|
|
2008
|
+
new_comp_name = "#{coil_heating_dx_single_speed.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_seer}HSPF"
|
|
2009
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilHeatingDXSingleSpeed', "For #{template}: #{coil_heating_dx_single_speed.name}: Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; SEER = #{min_seer}")
|
|
2010
|
+
end
|
|
2011
|
+
|
|
2012
|
+
# If specified as EER (heat pump)
|
|
2013
|
+
unless props['minimum_full_load_efficiency'].nil?
|
|
2014
|
+
min_eer = props['minimum_full_load_efficiency']
|
|
2015
|
+
cop = eer_to_cop(min_eer)
|
|
2016
|
+
new_comp_name = "#{coil_heating_dx_single_speed.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_eer}EER"
|
|
2017
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilHeatingDXSingleSpeed', "For #{template}: #{coil_heating_dx_single_speed.name}: Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; EER = #{min_eer}")
|
|
2018
|
+
end
|
|
2019
|
+
|
|
2020
|
+
# If specified as COP
|
|
2021
|
+
unless props['minimum_coefficient_of_performance_heating'].nil?
|
|
2022
|
+
cop = props['minimum_coefficient_of_performance_heating']
|
|
2023
|
+
new_comp_name = "#{coil_heating_dx_single_speed.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{cop}COP"
|
|
2024
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilHeatingDXSingleSpeed', "For #{template}: #{coil_heating_dx_single_speed.name}: Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; EER = #{min_eer}")
|
|
2025
|
+
end
|
|
2026
|
+
|
|
2027
|
+
# Rename
|
|
2028
|
+
if rename
|
|
2029
|
+
coil_heating_dx_single_speed.setName(new_comp_name)
|
|
996
2030
|
end
|
|
997
2031
|
|
|
2032
|
+
return cop
|
|
998
2033
|
end
|
|
999
2034
|
|
|
1000
2035
|
# =============================================================================================================================
|
|
1001
2036
|
# Find minimum efficiency for "CoilCoolingDXVariableSpeed" object
|
|
1002
|
-
def coil_cooling_dx_variable_speed_standard_minimum_cop(coil_cooling_dx_variable_speed,
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
sub_category = search_criteria['subcategory']
|
|
2037
|
+
def coil_cooling_dx_variable_speed_standard_minimum_cop(coil_cooling_dx_variable_speed,
|
|
2038
|
+
search_criteria,
|
|
2039
|
+
rename = false)
|
|
2040
|
+
|
|
1007
2041
|
capacity_w = coil_cooling_dx_variable_speed_find_capacity(coil_cooling_dx_variable_speed)
|
|
1008
2042
|
capacity_btu_per_hr = OpenStudio.convert(capacity_w, 'W', 'Btu/hr').get
|
|
1009
2043
|
capacity_kbtu_per_hr = OpenStudio.convert(capacity_w, 'W', 'kBtu/hr').get
|
|
1010
2044
|
|
|
1011
2045
|
# Look up the efficiency characteristics
|
|
1012
|
-
ac_props =
|
|
1013
|
-
model_find_object(standards_data['tables']["heat_pumps_ecm_#{ecm_name.downcase}"]['table'], search_criteria, capacity_btu_per_hr, Date.today)
|
|
1014
|
-
else
|
|
1015
|
-
model_find_object(standards_data['tables']["unitary_acs_ecm_#{ecm_name.downcase}"]['table'], search_criteria, capacity_btu_per_hr, Date.today)
|
|
1016
|
-
end
|
|
2046
|
+
ac_props = model_find_object(standards_data['tables']['heat_pump_cooling_ecm']['table'], search_criteria, capacity_btu_per_hr)
|
|
1017
2047
|
|
|
1018
2048
|
# Check to make sure properties were found
|
|
1019
2049
|
if ac_props.nil?
|
|
@@ -1030,15 +2060,15 @@ class ECMS
|
|
|
1030
2060
|
min_seer = ac_props['minimum_seasonal_energy_efficiency_ratio']
|
|
1031
2061
|
cop = seer_to_cop_cooling_with_fan(min_seer)
|
|
1032
2062
|
new_comp_name = "#{coil_cooling_dx_variable_speed.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_seer}SEER"
|
|
1033
|
-
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilCoolingDXVariableSpeed', "For #{template}: #{coil_cooling_dx_variable_speed.name}:
|
|
2063
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilCoolingDXVariableSpeed', "For #{template}: #{coil_cooling_dx_variable_speed.name}: Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; SEER = #{min_seer}")
|
|
1034
2064
|
end
|
|
1035
2065
|
|
|
1036
2066
|
# If specified as EER
|
|
1037
2067
|
unless ac_props['minimum_energy_efficiency_ratio'].nil?
|
|
1038
2068
|
min_eer = ac_props['minimum_energy_efficiency_ratio']
|
|
1039
2069
|
cop = eer_to_cop(min_eer)
|
|
1040
|
-
new_comp_name = "#{
|
|
1041
|
-
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilCoolingDXVariableSpeed', "For #{template}: #{coil_cooling_dx_variable_speed.name}:
|
|
2070
|
+
new_comp_name = "#{coil_cooling_dx_single_speed.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_eer}EER"
|
|
2071
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilCoolingDXVariableSpeed', "For #{template}: #{coil_cooling_dx_variable_speed.name}: Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; EER = #{min_eer}")
|
|
1042
2072
|
end
|
|
1043
2073
|
|
|
1044
2074
|
# if specified as SEER (heat pump)
|
|
@@ -1046,7 +2076,7 @@ class ECMS
|
|
|
1046
2076
|
min_seer = ac_props['minimum_seasonal_efficiency']
|
|
1047
2077
|
cop = seer_to_cop_cooling_with_fan(min_seer)
|
|
1048
2078
|
new_comp_name = "#{coil_cooling_dx_variable_speed.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_seer}SEER"
|
|
1049
|
-
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilCoolingDXVariableSpeed', "For #{template}: #{coil_cooling_dx_variable_speed.name}:
|
|
2079
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilCoolingDXVariableSpeed', "For #{template}: #{coil_cooling_dx_variable_speed.name}: Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; SEER = #{min_seer}")
|
|
1050
2080
|
end
|
|
1051
2081
|
|
|
1052
2082
|
# If specified as EER (heat pump)
|
|
@@ -1054,14 +2084,14 @@ class ECMS
|
|
|
1054
2084
|
min_eer = ac_props['minimum_full_load_efficiency']
|
|
1055
2085
|
cop = eer_to_cop(min_eer)
|
|
1056
2086
|
new_comp_name = "#{coil_cooling_dx_variable_speed.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_eer}EER"
|
|
1057
|
-
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilCoolingDXVariableSpeed', "For #{template}: #{coil_cooling_dx_variable_speed.name}:
|
|
2087
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilCoolingDXVariableSpeed', "For #{template}: #{coil_cooling_dx_variable_speed.name}: Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; EER = #{min_eer}")
|
|
1058
2088
|
end
|
|
1059
2089
|
|
|
1060
2090
|
# If specified as COP
|
|
1061
2091
|
unless ac_props['minimum_coefficient_of_performance_cooling'].nil?
|
|
1062
2092
|
cop = ac_props['minimum_coefficient_of_performance_cooling']
|
|
1063
2093
|
new_comp_name = "#{coil_cooling_dx_variable_speed.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{cop}COP"
|
|
1064
|
-
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilCoolingDXVariableSpeed', "For #{template}: #{coil_cooling_dx_variable_speed.name}:
|
|
2094
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilCoolingDXVariableSpeed', "For #{template}: #{coil_cooling_dx_variable_speed.name}: Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; COP = #{cop}")
|
|
1065
2095
|
end
|
|
1066
2096
|
|
|
1067
2097
|
# Rename
|
|
@@ -1073,18 +2103,17 @@ class ECMS
|
|
|
1073
2103
|
end
|
|
1074
2104
|
|
|
1075
2105
|
# =============================================================================================================================
|
|
1076
|
-
# Find minimum efficiency for "
|
|
1077
|
-
def coil_heating_dx_variable_speed_standard_minimum_cop(coil_heating_dx_variable_speed,
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
sub_category = search_criteria['subcategory']
|
|
2106
|
+
# Find minimum efficiency for "CoilHeatingDXVariableSpeed" object
|
|
2107
|
+
def coil_heating_dx_variable_speed_standard_minimum_cop(coil_heating_dx_variable_speed,
|
|
2108
|
+
search_criteria,
|
|
2109
|
+
rename = false)
|
|
2110
|
+
|
|
1082
2111
|
capacity_w = coil_heating_dx_variable_speed_find_capacity(coil_heating_dx_variable_speed)
|
|
1083
2112
|
capacity_btu_per_hr = OpenStudio.convert(capacity_w, 'W', 'Btu/hr').get
|
|
1084
2113
|
capacity_kbtu_per_hr = OpenStudio.convert(capacity_w, 'W', 'kBtu/hr').get
|
|
1085
2114
|
|
|
1086
2115
|
# Look up the efficiency characteristics
|
|
1087
|
-
props = model_find_object(standards_data['tables'][
|
|
2116
|
+
props = model_find_object(standards_data['tables']['heat_pump_heating_ecm'], search_criteria, capacity_btu_per_hr)
|
|
1088
2117
|
|
|
1089
2118
|
# Check to make sure properties were found
|
|
1090
2119
|
if props.nil?
|
|
@@ -1101,7 +2130,7 @@ class ECMS
|
|
|
1101
2130
|
min_eer = props['minimum_energy_efficiency_ratio']
|
|
1102
2131
|
cop = eer_to_cop(min_eer)
|
|
1103
2132
|
new_comp_name = "#{coil_heating_dx_variable_speed.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_eer}EER"
|
|
1104
|
-
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilHeatingDXVariableSpeed', "For #{template}: #{coil_heating_dx_variable_speed.name}:
|
|
2133
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilHeatingDXVariableSpeed', "For #{template}: #{coil_heating_dx_variable_speed.name}: Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; EER = #{min_eer}")
|
|
1105
2134
|
end
|
|
1106
2135
|
|
|
1107
2136
|
# if specified as HSPF (heat pump)
|
|
@@ -1109,7 +2138,7 @@ class ECMS
|
|
|
1109
2138
|
min_hspf = props['minimum_heating_seasonal_performance_factor']
|
|
1110
2139
|
cop = hspf_to_cop_heating_with_fan(min_hspf)
|
|
1111
2140
|
new_comp_name = "#{coil_heating_dx_variable_speed.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_seer}HSPF"
|
|
1112
|
-
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilHeatingDXVariableSpeed', "For #{template}: #{coil_heating_dx_variable_speed.name}:
|
|
2141
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilHeatingDXVariableSpeed', "For #{template}: #{coil_heating_dx_variable_speed.name}: Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; SEER = #{min_seer}")
|
|
1113
2142
|
end
|
|
1114
2143
|
|
|
1115
2144
|
# If specified as EER (heat pump)
|
|
@@ -1117,14 +2146,14 @@ class ECMS
|
|
|
1117
2146
|
min_eer = props['minimum_full_load_efficiency']
|
|
1118
2147
|
cop = eer_to_cop(min_eer)
|
|
1119
2148
|
new_comp_name = "#{coil_heating_dx_variable_speed.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_eer}EER"
|
|
1120
|
-
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilHeatingDXVariableSpeed', "For #{template}: #{coil_heating_dx_variable_speed.name}:
|
|
2149
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilHeatingDXVariableSpeed', "For #{template}: #{coil_heating_dx_variable_speed.name}: Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; EER = #{min_eer}")
|
|
1121
2150
|
end
|
|
1122
2151
|
|
|
1123
2152
|
# If specified as COP
|
|
1124
2153
|
unless props['minimum_coefficient_of_performance_heating'].nil?
|
|
1125
2154
|
cop = props['minimum_coefficient_of_performance_heating']
|
|
1126
2155
|
new_comp_name = "#{coil_heating_dx_variable_speed.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{cop}COP"
|
|
1127
|
-
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilHeatingDXVariableSpeed', "For #{template}: #{coil_heating_dx_variable_speed.name}:
|
|
2156
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilHeatingDXVariableSpeed', "For #{template}: #{coil_heating_dx_variable_speed.name}: Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; EER = #{min_eer}")
|
|
1128
2157
|
end
|
|
1129
2158
|
|
|
1130
2159
|
# Rename
|
|
@@ -1137,17 +2166,16 @@ class ECMS
|
|
|
1137
2166
|
|
|
1138
2167
|
# =============================================================================================================================
|
|
1139
2168
|
# Find minimum cooling efficiency for "AirConditionerVariableRefrigerantFlow" object
|
|
1140
|
-
def airconditioner_variablerefrigerantflow_cooling_standard_minimum_cop(airconditioner_variablerefrigerantflow,
|
|
1141
|
-
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
sub_category = search_criteria['subcategory']
|
|
2169
|
+
def airconditioner_variablerefrigerantflow_cooling_standard_minimum_cop(airconditioner_variablerefrigerantflow,
|
|
2170
|
+
search_criteria,
|
|
2171
|
+
rename = false)
|
|
2172
|
+
|
|
1145
2173
|
capacity_w = airconditioner_variablerefrigerantflow_cooling_find_capacity(airconditioner_variablerefrigerantflow)
|
|
1146
2174
|
capacity_btu_per_hr = OpenStudio.convert(capacity_w, 'W', 'Btu/hr').get
|
|
1147
2175
|
capacity_kbtu_per_hr = OpenStudio.convert(capacity_w, 'W', 'kBtu/hr').get
|
|
1148
2176
|
|
|
1149
2177
|
# Look up the efficiency characteristics
|
|
1150
|
-
props = model_find_object(standards_data['tables'][
|
|
2178
|
+
props = model_find_object(standards_data['tables']['heat_pump_cooling_ecm'], search_criteria, capacity_btu_per_hr)
|
|
1151
2179
|
|
|
1152
2180
|
# Check to make sure properties were found
|
|
1153
2181
|
if props.nil?
|
|
@@ -1164,7 +2192,7 @@ class ECMS
|
|
|
1164
2192
|
min_eer = props['minimum_energy_efficiency_ratio']
|
|
1165
2193
|
cop = eer_to_cop(min_eer)
|
|
1166
2194
|
new_comp_name = "#{airconditioner_variablerefrigerantflow.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_eer}EER"
|
|
1167
|
-
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.AirConditionerVariableRefrigerantFlow', "For #{template}: #{airconditioner_variablerefrigerantflow.name}:
|
|
2195
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.AirConditionerVariableRefrigerantFlow', "For #{template}: #{airconditioner_variablerefrigerantflow.name}: Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; EER = #{min_eer}")
|
|
1168
2196
|
end
|
|
1169
2197
|
|
|
1170
2198
|
# if specified as HSPF (heat pump)
|
|
@@ -1172,7 +2200,7 @@ class ECMS
|
|
|
1172
2200
|
min_hspf = props['minimum_heating_seasonal_performance_factor']
|
|
1173
2201
|
cop = hspf_to_cop_heating_with_fan(min_hspf)
|
|
1174
2202
|
new_comp_name = "#{coil_heating_dx_variable_speed.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_seer}HSPF"
|
|
1175
|
-
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.AirConditionerVariableRefrigerantFlow', "For #{template}: #{airconditioner_variablerefrigerantflow.name}:
|
|
2203
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.AirConditionerVariableRefrigerantFlow', "For #{template}: #{airconditioner_variablerefrigerantflow.name}: Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; SEER = #{min_seer}")
|
|
1176
2204
|
end
|
|
1177
2205
|
|
|
1178
2206
|
# If specified as EER (heat pump)
|
|
@@ -1180,14 +2208,14 @@ class ECMS
|
|
|
1180
2208
|
min_eer = props['minimum_full_load_efficiency']
|
|
1181
2209
|
cop = eer_to_cop(min_eer)
|
|
1182
2210
|
new_comp_name = "#{airconditioner_variablerefrigerantflow.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_eer}EER"
|
|
1183
|
-
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.AirConditionerVariableRefrigerantFlow', "For #{template}: #{airconditioner_variablerefrigerantflow.name}:
|
|
2211
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.AirConditionerVariableRefrigerantFlow', "For #{template}: #{airconditioner_variablerefrigerantflow.name}: Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; EER = #{min_eer}")
|
|
1184
2212
|
end
|
|
1185
2213
|
|
|
1186
2214
|
# If specified as COP
|
|
1187
2215
|
unless props['minimum_coefficient_of_performance_cooling'].nil?
|
|
1188
2216
|
cop = props['minimum_coefficient_of_performance_cooling']
|
|
1189
2217
|
new_comp_name = "#{airconditioner_variablerefrigerantflow.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{cop}COP"
|
|
1190
|
-
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.AirConditionerVariableRefrigerantFlow', "For #{template}: #{airconditioner_variablerefrigerantflow.name}:
|
|
2218
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.AirConditionerVariableRefrigerantFlow', "For #{template}: #{airconditioner_variablerefrigerantflow.name}: Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; EER = #{min_eer}")
|
|
1191
2219
|
end
|
|
1192
2220
|
|
|
1193
2221
|
# Rename
|
|
@@ -1200,17 +2228,16 @@ class ECMS
|
|
|
1200
2228
|
|
|
1201
2229
|
# =============================================================================================================================
|
|
1202
2230
|
# Find minimum heating efficiency for "AirConditionerVariableRefrigerantFlow" object
|
|
1203
|
-
def airconditioner_variablerefrigerantflow_heating_standard_minimum_cop(airconditioner_variablerefrigerantflow,
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
|
|
1207
|
-
sub_category = search_criteria['subcategory']
|
|
2231
|
+
def airconditioner_variablerefrigerantflow_heating_standard_minimum_cop(airconditioner_variablerefrigerantflow,
|
|
2232
|
+
search_criteria,
|
|
2233
|
+
rename = false)
|
|
2234
|
+
|
|
1208
2235
|
capacity_w = airconditioner_variablerefrigerantflow_heating_find_capacity(airconditioner_variablerefrigerantflow)
|
|
1209
2236
|
capacity_btu_per_hr = OpenStudio.convert(capacity_w, 'W', 'Btu/hr').get
|
|
1210
2237
|
capacity_kbtu_per_hr = OpenStudio.convert(capacity_w, 'W', 'kBtu/hr').get
|
|
1211
2238
|
|
|
1212
2239
|
# Look up the efficiency characteristics
|
|
1213
|
-
props = model_find_object(standards_data['tables'][
|
|
2240
|
+
props = model_find_object(standards_data['tables']['heat_pump_heating_ecm'], search_criteria, capacity_btu_per_hr)
|
|
1214
2241
|
|
|
1215
2242
|
# Check to make sure properties were found
|
|
1216
2243
|
if props.nil?
|
|
@@ -1227,7 +2254,7 @@ class ECMS
|
|
|
1227
2254
|
min_eer = props['minimum_energy_efficiency_ratio']
|
|
1228
2255
|
cop = eer_to_cop(min_eer)
|
|
1229
2256
|
new_comp_name = "#{airconditioner_variablerefrigerantflow.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_eer}EER"
|
|
1230
|
-
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.AirConditionerVariableRefrigerantFlow', "For #{template}: #{airconditioner_variablerefrigerantflow.name}:
|
|
2257
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.AirConditionerVariableRefrigerantFlow', "For #{template}: #{airconditioner_variablerefrigerantflow.name}: Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; EER = #{min_eer}")
|
|
1231
2258
|
end
|
|
1232
2259
|
|
|
1233
2260
|
# if specified as HSPF (heat pump)
|
|
@@ -1235,7 +2262,7 @@ class ECMS
|
|
|
1235
2262
|
min_hspf = props['minimum_heating_seasonal_performance_factor']
|
|
1236
2263
|
cop = hspf_to_cop_heating_with_fan(min_hspf)
|
|
1237
2264
|
new_comp_name = "#{coil_heating_dx_variable_speed.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_seer}HSPF"
|
|
1238
|
-
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.AirConditionerVariableRefrigerantFlow', "For #{template}: #{airconditioner_variablerefrigerantflow.name}:
|
|
2265
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.AirConditionerVariableRefrigerantFlow', "For #{template}: #{airconditioner_variablerefrigerantflow.name}: Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; SEER = #{min_seer}")
|
|
1239
2266
|
end
|
|
1240
2267
|
|
|
1241
2268
|
# If specified as EER (heat pump)
|
|
@@ -1243,14 +2270,14 @@ class ECMS
|
|
|
1243
2270
|
min_eer = props['minimum_full_load_efficiency']
|
|
1244
2271
|
cop = eer_to_cop(min_eer)
|
|
1245
2272
|
new_comp_name = "#{airconditioner_variablerefrigerantflow.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_eer}EER"
|
|
1246
|
-
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.AirConditionerVariableRefrigerantFlow', "For #{template}: #{airconditioner_variablerefrigerantflow.name}:
|
|
2273
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.AirConditionerVariableRefrigerantFlow', "For #{template}: #{airconditioner_variablerefrigerantflow.name}: Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; EER = #{min_eer}")
|
|
1247
2274
|
end
|
|
1248
2275
|
|
|
1249
2276
|
# If specified as COP
|
|
1250
2277
|
unless props['minimum_coefficient_of_performance_heating'].nil?
|
|
1251
2278
|
cop = props['minimum_coefficient_of_performance_heating']
|
|
1252
2279
|
new_comp_name = "#{airconditioner_variablerefrigerantflow.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{cop}COP"
|
|
1253
|
-
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.AirConditionerVariableRefrigerantFlow', "For #{template}: #{airconditioner_variablerefrigerantflow.name}:
|
|
2280
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.AirConditionerVariableRefrigerantFlow', "For #{template}: #{airconditioner_variablerefrigerantflow.name}: Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; EER = #{min_eer}")
|
|
1254
2281
|
end
|
|
1255
2282
|
|
|
1256
2283
|
# Rename
|
|
@@ -1346,33 +2373,33 @@ class ECMS
|
|
|
1346
2373
|
# It also renames the boiler to include the "boiler_eff"["name"].
|
|
1347
2374
|
def modify_boiler_efficiency(model:, boiler_eff: nil)
|
|
1348
2375
|
return if boiler_eff.nil?
|
|
2376
|
+
|
|
1349
2377
|
# If boiler_eff is a string rather than a hash then assume it is the name of a boiler efficiency package and look
|
|
1350
2378
|
# for a package with that name in boiler_set.json.
|
|
1351
2379
|
if boiler_eff.is_a?(String)
|
|
1352
2380
|
eff_packages = @standards_data['tables']['boiler_eff_ecm']['table']
|
|
1353
|
-
eff_package = eff_packages.select{|eff_pack_info| eff_pack_info[
|
|
1354
|
-
|
|
1355
|
-
|
|
1356
|
-
|
|
1357
|
-
|
|
1358
|
-
|
|
1359
|
-
|
|
1360
|
-
|
|
1361
|
-
|
|
1362
|
-
|
|
1363
|
-
|
|
1364
|
-
}
|
|
1365
|
-
end
|
|
2381
|
+
eff_package = eff_packages.select { |eff_pack_info| eff_pack_info['name'] == boiler_eff }
|
|
2382
|
+
|
|
2383
|
+
raise "Cannot not find #{boiler_eff} in the ECMS boiler_set.json file. Please check that the name is correctly spelled in the ECMS class boiler_set.json and in the code calling (directly or through another method) the ECMS class modify_boiler_efficiency method." if eff_package.empty?
|
|
2384
|
+
raise "More than one boiler efficiency package with the name #{boiler_eff} was found. Please check the ECMS class boiler_set.json file and make sure that each boiler efficiency package has a unique name." if eff_package.size > 1
|
|
2385
|
+
|
|
2386
|
+
ecm_name = boiler_eff
|
|
2387
|
+
boiler_eff = {
|
|
2388
|
+
'name' => ecm_name,
|
|
2389
|
+
'efficiency' => eff_package[0]['efficiency'],
|
|
2390
|
+
'part_load_curve' => eff_package[0]['part_load_curve']
|
|
2391
|
+
}
|
|
1366
2392
|
end
|
|
1367
2393
|
# If nothing is passed in the boiler_eff hash then assume this was not supposed to be used and return without doing
|
|
1368
2394
|
# anything.
|
|
1369
|
-
return if boiler_eff[
|
|
2395
|
+
return if boiler_eff['name'].nil? && boiler_eff['efficiency'].nil? && boiler_eff['part_load_curve'].nil?
|
|
1370
2396
|
# If no efficiency or partload curve are found (either passed directly or via the boiler_set.json file) then assume
|
|
1371
2397
|
# that the current SHW setting should not be changed. Return without changing anything.
|
|
1372
|
-
return if boiler_eff[
|
|
1373
|
-
raise
|
|
1374
|
-
raise "You attempted to set the efficiency of boilers in this model to: #{boiler_eff['efficiency']}. Please check the ECMS class boiler_set.json and make sure the efficiency you set is between 0.01 and 1.0." if
|
|
1375
|
-
raise
|
|
2398
|
+
return if boiler_eff['efficiency'].nil? && boiler_eff['part_load_curve'].nil?
|
|
2399
|
+
raise 'You attempted to set the efficiency of boilers in this model to nil. Please check the ECMS class boiler_set.json and make sure the efficiency is properly set' if boiler_eff['efficiency'].nil?
|
|
2400
|
+
raise "You attempted to set the efficiency of boilers in this model to: #{boiler_eff['efficiency']}. Please check the ECMS class boiler_set.json and make sure the efficiency you set is between 0.01 and 1.0." if boiler_eff['efficiency'] < 0.01 || boiler_eff['efficiency'] > 1.0
|
|
2401
|
+
raise 'You attempted to set the part load curve of boilers in this model to nil. Please check the ECMS class boiler_set.json file and ensure that both the efficiency and part load curve are set.' if boiler_eff['part_load_curve'].nil?
|
|
2402
|
+
|
|
1376
2403
|
model.getBoilerHotWaters.sort.each do |mod_boiler|
|
|
1377
2404
|
reset_boiler_efficiency(model: model, component: mod_boiler.to_BoilerHotWater.get, eff: boiler_eff)
|
|
1378
2405
|
end
|
|
@@ -1395,38 +2422,37 @@ class ECMS
|
|
|
1395
2422
|
# "Primary/Secondary eff["name"] capacity kBtu/hr".
|
|
1396
2423
|
def reset_boiler_efficiency(model:, component:, eff:)
|
|
1397
2424
|
component.setNominalThermalEfficiency(eff['efficiency'])
|
|
1398
|
-
part_load_curve_name = eff[
|
|
2425
|
+
part_load_curve_name = eff['part_load_curve'].to_s
|
|
1399
2426
|
existing_curve = @standards_data['curves'].select { |curve| curve['name'] == part_load_curve_name }
|
|
1400
2427
|
raise "No boiler with the name #{part_load_curve_name} could be found in the ECMS class curves.json file. Please check both the ECMS class boiler_set.json and class curves.json files to ensure the curve is entered and referenced correctly." if existing_curve.empty?
|
|
1401
|
-
|
|
2428
|
+
|
|
2429
|
+
part_load_curve_data = (@standards_data['curves'].select { |curve| curve['name'] == part_load_curve_name })[0]
|
|
1402
2430
|
if part_load_curve_data['independent_variable_1'].to_s.upcase == 'TEnteringBoiler'.upcase || part_load_curve_data['independent_variable_2'].to_s.upcase == 'TEnteringBoiler'.upcase
|
|
1403
2431
|
component.setEfficiencyCurveTemperatureEvaluationVariable('EnteringBoiler')
|
|
1404
2432
|
elsif part_load_curve_data['independent_variable_1'].to_s.upcase == 'TLeavingBoiler'.upcase || part_load_curve_data['independent_variable_2'].to_s.upcase == 'TLeavingBoiler'.upcase
|
|
1405
2433
|
component.setEfficiencyCurveTemperatureEvaluationVariable('LeavingBoiler')
|
|
1406
2434
|
end
|
|
1407
2435
|
part_load_curve = model_add_curve(model, part_load_curve_name)
|
|
1408
|
-
|
|
1409
|
-
|
|
1410
|
-
|
|
1411
|
-
|
|
1412
|
-
|
|
1413
|
-
|
|
1414
|
-
|
|
1415
|
-
|
|
1416
|
-
|
|
1417
|
-
|
|
1418
|
-
|
|
1419
|
-
|
|
1420
|
-
|
|
1421
|
-
|
|
1422
|
-
|
|
1423
|
-
eff_measure_name = eff['name']
|
|
1424
|
-
end
|
|
1425
|
-
new_boiler_name = boiler_primacy + eff_measure_name + " #{boiler_size_kbtu_per_hour.round(0)}kBtu/hr #{component.nominalThermalEfficiency} Thermal Eff"
|
|
1426
|
-
component.setName(new_boiler_name)
|
|
2436
|
+
raise "There was a problem setting the boiler part load curve named #{part_load_curve_name} for #{component.name}. Please ensure that the curve is entered and referenced correctly in the ECMS class curves.json and boiler_set.json files." unless part_load_curve
|
|
2437
|
+
|
|
2438
|
+
component.setNormalizedBoilerEfficiencyCurve(part_load_curve)
|
|
2439
|
+
if component.isNominalCapacityAutosized
|
|
2440
|
+
boiler_size_W = model.getAutosizedValue(component, 'Design Size Nominal Capacity', 'W').to_f
|
|
2441
|
+
else
|
|
2442
|
+
boiler_size_W = component.nominalCapacity.to_f
|
|
2443
|
+
end
|
|
2444
|
+
boiler_size_kbtu_per_hour = OpenStudio.convert(boiler_size_W, 'W', 'kBtu/h').get
|
|
2445
|
+
boiler_primacy = 'Primary '
|
|
2446
|
+
if boiler_size_W < 1.0
|
|
2447
|
+
boiler_primacy = 'Secondary '
|
|
2448
|
+
end
|
|
2449
|
+
if eff['name'].nil?
|
|
2450
|
+
eff_measure_name = 'Revised Performance Boiler'
|
|
1427
2451
|
else
|
|
1428
|
-
|
|
2452
|
+
eff_measure_name = eff['name']
|
|
1429
2453
|
end
|
|
2454
|
+
new_boiler_name = boiler_primacy + eff_measure_name + " #{boiler_size_kbtu_per_hour.round(0)}kBtu/hr #{component.nominalThermalEfficiency} Thermal Eff"
|
|
2455
|
+
component.setName(new_boiler_name)
|
|
1430
2456
|
end
|
|
1431
2457
|
|
|
1432
2458
|
# ============================================================================================================================
|
|
@@ -1447,33 +2473,33 @@ class ECMS
|
|
|
1447
2473
|
# also renames the furnace to include the "furnace_eff"["name"].
|
|
1448
2474
|
def modify_furnace_efficiency(model:, furnace_eff: nil)
|
|
1449
2475
|
return if furnace_eff.nil?
|
|
2476
|
+
|
|
1450
2477
|
# If furnace_eff is a string rather than a hash then assume it is the name of a furnace efficiency package and look
|
|
1451
2478
|
# for a package with that name in furnace_set.json.
|
|
1452
2479
|
if furnace_eff.is_a?(String)
|
|
1453
2480
|
eff_packages = @standards_data['tables']['furnace_eff_ecm']['table']
|
|
1454
|
-
eff_package = eff_packages.select{|eff_pack_info| eff_pack_info[
|
|
1455
|
-
|
|
1456
|
-
|
|
1457
|
-
|
|
1458
|
-
|
|
1459
|
-
|
|
1460
|
-
|
|
1461
|
-
|
|
1462
|
-
|
|
1463
|
-
|
|
1464
|
-
|
|
1465
|
-
}
|
|
1466
|
-
end
|
|
2481
|
+
eff_package = eff_packages.select { |eff_pack_info| eff_pack_info['name'] == furnace_eff }
|
|
2482
|
+
|
|
2483
|
+
raise "Cannot not find #{furnace_eff} in the ECMS furnace_set.json file. Please check that the name is correctly spelled in the ECMS class furnace_set.json and in the code calling (directly or through another method) the ECMS class modify_furnace_efficiency method." if eff_package.empty?
|
|
2484
|
+
raise "More than one furnace efficiency package with the name #{furnace_eff} was found. Please check the ECMS class furnace_set.json file and make sure that each furnace efficiency package has a unique name." if eff_package.size > 1
|
|
2485
|
+
|
|
2486
|
+
ecm_name = furnace_eff
|
|
2487
|
+
furnace_eff = {
|
|
2488
|
+
'name' => ecm_name,
|
|
2489
|
+
'efficiency' => eff_package[0]['efficiency'],
|
|
2490
|
+
'part_load_curve' => eff_package[0]['part_load_curve']
|
|
2491
|
+
}
|
|
1467
2492
|
end
|
|
1468
2493
|
# If nothing is passed in the furnace_eff hash then assume this was not supposed to be used and return without doing
|
|
1469
2494
|
# anything.
|
|
1470
|
-
return if furnace_eff[
|
|
2495
|
+
return if furnace_eff['name'].nil? && furnace_eff['efficiency'].nil? && furnace_eff['part_load_curve'].nil?
|
|
1471
2496
|
# If no efficiency or partload curve are found (either passed directly or via the furnace_set.json file) then assume
|
|
1472
2497
|
# that the current furance performance settings should not be changed. Return without changing anything.
|
|
1473
|
-
return if furnace_eff[
|
|
1474
|
-
raise
|
|
1475
|
-
raise "You attempted to set the efficiency of furnaces in this model to: #{furnace_eff['efficiency']}. Please check the ECMS class furnace_set.json file and make sure the efficiency you set is between 0.01 and 1.0." if
|
|
1476
|
-
raise
|
|
2498
|
+
return if furnace_eff['efficiency'].nil? && furnace_eff['part_load_curve'].nil?
|
|
2499
|
+
raise 'You attempted to set the efficiency of furnaces in this model to nil. Please check the ECMS class furnace_set.json file and make sure the efficiency is set' if furnace_eff['efficiency'].nil?
|
|
2500
|
+
raise "You attempted to set the efficiency of furnaces in this model to: #{furnace_eff['efficiency']}. Please check the ECMS class furnace_set.json file and make sure the efficiency you set is between 0.01 and 1.0." if furnace_eff['efficiency'] < 0.01 || furnace_eff['efficiency'] > 1.0
|
|
2501
|
+
raise 'You attempted to set the part load curve of furnaces in this model to nil. Please check the ECMS class furnace_set.json file and ensure that both the efficiency and part load curve are set.' if furnace_eff['part_load_curve'].nil?
|
|
2502
|
+
|
|
1477
2503
|
model.getCoilHeatingGass.sort.each do |mod_furnace|
|
|
1478
2504
|
reset_furnace_efficiency(model: model, component: mod_furnace.to_CoilHeatingGas.get, eff: furnace_eff)
|
|
1479
2505
|
end
|
|
@@ -1492,14 +2518,16 @@ class ECMS
|
|
|
1492
2518
|
# "eff["name"] + <furnace number (whatever was there before)>".
|
|
1493
2519
|
def reset_furnace_efficiency(model:, component:, eff:)
|
|
1494
2520
|
component.setGasBurnerEfficiency(eff['efficiency'])
|
|
1495
|
-
part_load_curve_name = eff[
|
|
2521
|
+
part_load_curve_name = eff['part_load_curve'].to_s
|
|
1496
2522
|
existing_curve = @standards_data['curves'].select { |curve| curve['name'] == part_load_curve_name }
|
|
1497
2523
|
raise "No furnace part load curve with the name #{part_load_curve_name} could be found in the ECMS class curves.json file. Please check both the ECMS class curves.json and the measure furnace_set.json files to ensure the curve is entered and referenced correctly." if existing_curve.empty?
|
|
2524
|
+
|
|
1498
2525
|
part_load_curve = model_add_curve(model, part_load_curve_name)
|
|
1499
2526
|
raise "There was a problem setting the furnace part load curve named #{part_load_curve_name} for #{component.name}. Please ensure that the curve is entered and referenced correctly in the ECMS class curves.json or measure furnace_set.json files." unless part_load_curve
|
|
2527
|
+
|
|
1500
2528
|
component.setPartLoadFractionCorrelationCurve(part_load_curve)
|
|
1501
2529
|
if eff['name'].nil?
|
|
1502
|
-
ecm_package_name =
|
|
2530
|
+
ecm_package_name = 'Revised Performance Furnace'
|
|
1503
2531
|
else
|
|
1504
2532
|
ecm_package_name = eff['name']
|
|
1505
2533
|
end
|
|
@@ -1525,33 +2553,33 @@ class ECMS
|
|
|
1525
2553
|
# {valume}Gal {eff_name} Water Heater - {Capacity}kBtu/hr {efficiency} Therm Eff
|
|
1526
2554
|
def modify_shw_efficiency(model:, shw_eff: nil)
|
|
1527
2555
|
return if shw_eff.nil?
|
|
2556
|
+
|
|
1528
2557
|
# If shw_eff is a string rather than a hash then assume it is the name of a shw efficiency package and look
|
|
1529
2558
|
# for a package with that name in shw_set.json.
|
|
1530
2559
|
if shw_eff.is_a?(String)
|
|
1531
2560
|
eff_packages = @standards_data['tables']['shw_eff_ecm']['table']
|
|
1532
|
-
eff_package = eff_packages.select{|eff_pack_info| eff_pack_info[
|
|
1533
|
-
|
|
1534
|
-
|
|
1535
|
-
|
|
1536
|
-
|
|
1537
|
-
|
|
1538
|
-
|
|
1539
|
-
|
|
1540
|
-
|
|
1541
|
-
|
|
1542
|
-
|
|
1543
|
-
}
|
|
1544
|
-
end
|
|
2561
|
+
eff_package = eff_packages.select { |eff_pack_info| eff_pack_info['name'] == shw_eff }
|
|
2562
|
+
|
|
2563
|
+
raise "Cannot not find #{shw_eff} in the ECMS shw_set.json file. Please check that the name is correctly spelled in the ECMS class shw_set.json and in the code calling (directly or through another method) the ECMS class modify_shw_efficiency method." if eff_package.empty?
|
|
2564
|
+
raise "More than one shw tank efficiency package with the name #{shw_eff} was found. Please check the ECMS class shw_set.json file and make sure that each shw tank efficiency package has a unique name." if eff_package.size > 1
|
|
2565
|
+
|
|
2566
|
+
ecm_name = shw_eff
|
|
2567
|
+
shw_eff = {
|
|
2568
|
+
'name' => ecm_name,
|
|
2569
|
+
'efficiency' => eff_package[0]['efficiency'],
|
|
2570
|
+
'part_load_curve' => eff_package[0]['part_load_curve']
|
|
2571
|
+
}
|
|
1545
2572
|
end
|
|
1546
2573
|
# If nothing is passed in the shw_eff hash then assume this was not supposed to be used and return without doing
|
|
1547
2574
|
# anything.
|
|
1548
|
-
return if shw_eff[
|
|
2575
|
+
return if shw_eff['name'].nil? && shw_eff['efficiency'].nil? && shw_eff['part_load_curve'].nil?
|
|
1549
2576
|
# If no efficiency or partload curve are found (either passed directly or via the shw_set.json file) then assume
|
|
1550
2577
|
# that the current shw performance settings should not be changed. Return without changing anything.
|
|
1551
|
-
return if shw_eff[
|
|
1552
|
-
raise
|
|
1553
|
-
raise "You attempted to set the efficiency of shw tanks in this model to: #{shw_eff['efficiency']}. Please check the ECMS class shw_set.json and make sure the efficiency you set is between 0.01 and 1.0." if
|
|
1554
|
-
raise
|
|
2578
|
+
return if shw_eff['efficiency'].nil? && shw_eff['part_load_curve'].nil?
|
|
2579
|
+
raise 'You attempted to set the efficiency of shw tanks in this model to nil. Please check the ECMS class shw_set.json file and make sure the efficiency is set' if shw_eff['efficiency'].nil?
|
|
2580
|
+
raise "You attempted to set the efficiency of shw tanks in this model to: #{shw_eff['efficiency']}. Please check the ECMS class shw_set.json and make sure the efficiency you set is between 0.01 and 1.0." if shw_eff['efficiency'] < 0.01 || shw_eff['efficiency'] > 1.0
|
|
2581
|
+
raise 'You attempted to set the part load curve of shw tanks in this model to nil. Please check the ECMS class shw_set.json file and ensure that both the efficiency and part load curve are set.' if shw_eff['part_load_curve'].nil?
|
|
2582
|
+
|
|
1555
2583
|
model.getWaterHeaterMixeds.sort.each do |shw_mod|
|
|
1556
2584
|
reset_shw_efficiency(model: model, component: shw_mod, eff: shw_eff)
|
|
1557
2585
|
end
|
|
@@ -1570,34 +2598,38 @@ class ECMS
|
|
|
1570
2598
|
# {valume}Gal {eff_name} Water Heater - {Capacity}kBtu/hr {efficiency} Therm Eff
|
|
1571
2599
|
def reset_shw_efficiency(model:, component:, eff:)
|
|
1572
2600
|
return if component.heaterFuelType.to_s.upcase == 'ELECTRICITY'
|
|
2601
|
+
|
|
1573
2602
|
eff_result = component.setHeaterThermalEfficiency(eff['efficiency'].to_f)
|
|
1574
|
-
raise "There was a problem setting the efficiency of the SHW #{component.name
|
|
1575
|
-
|
|
2603
|
+
raise "There was a problem setting the efficiency of the SHW #{component.name}. Please check the ECMS class shw_set.json file or the model." unless eff_result
|
|
2604
|
+
|
|
2605
|
+
part_load_curve_name = eff['part_load_curve'].to_s
|
|
1576
2606
|
existing_curve = @standards_data['curves'].select { |curve| curve['name'] == part_load_curve_name }
|
|
1577
2607
|
raise "No shw tank part load curve with the name #{part_load_curve_name} could be found in the ECMS class curves.json file. Please check both the ECMS class curves.json and the measure shw_set.json files to ensure the curve is entered and referenced correctly." if existing_curve.empty?
|
|
2608
|
+
|
|
1578
2609
|
part_load_curve = model_add_curve(model, part_load_curve_name)
|
|
1579
2610
|
raise "There was a problem setting the shw tank part load curve named #{part_load_curve_name} for #{component.name}. Please ensure that the curve is entered and referenced correctly in the ECMS class curves.json and shw_set.json files." unless part_load_curve
|
|
2611
|
+
|
|
1580
2612
|
component.setPartLoadFactorCurve(part_load_curve)
|
|
1581
|
-
#Get the volume and capacity of the SHW tank.
|
|
2613
|
+
# Get the volume and capacity of the SHW tank.
|
|
1582
2614
|
if component.isTankVolumeAutosized
|
|
1583
|
-
shw_vol_gal =
|
|
2615
|
+
shw_vol_gal = 'auto_size'
|
|
1584
2616
|
else
|
|
1585
2617
|
shw_vol_m3 = component.tankVolume.to_f
|
|
1586
|
-
shw_vol_gal =
|
|
2618
|
+
shw_vol_gal = OpenStudio.convert(shw_vol_m3, 'm^3', 'gal').get.to_f.round(0)
|
|
1587
2619
|
end
|
|
1588
2620
|
if component.isHeaterMaximumCapacityAutosized
|
|
1589
|
-
shw_capacity_kBtu_hr =
|
|
2621
|
+
shw_capacity_kBtu_hr = 'auto_cap'
|
|
1590
2622
|
else
|
|
1591
2623
|
shw_capacity_W = component.heaterMaximumCapacity.to_f
|
|
1592
|
-
shw_capacity_kBtu_hr =
|
|
2624
|
+
shw_capacity_kBtu_hr = OpenStudio.convert(shw_capacity_W, 'W', 'kBtu/h').get.to_f.round(0)
|
|
1593
2625
|
end
|
|
1594
2626
|
# Set a default revised shw tank name if no name is present in the eff hash.
|
|
1595
|
-
if eff[
|
|
1596
|
-
shw_ecm_package_name =
|
|
2627
|
+
if eff['name'].nil?
|
|
2628
|
+
shw_ecm_package_name = 'Revised'
|
|
1597
2629
|
else
|
|
1598
|
-
shw_ecm_package_name = eff[
|
|
2630
|
+
shw_ecm_package_name = eff['name']
|
|
1599
2631
|
end
|
|
1600
|
-
shw_name = "#{shw_vol_gal} Gal #{shw_ecm_package_name} Water Heater - #{shw_capacity_kBtu_hr}kBtu/hr #{eff[
|
|
2632
|
+
shw_name = "#{shw_vol_gal} Gal #{shw_ecm_package_name} Water Heater - #{shw_capacity_kBtu_hr}kBtu/hr #{eff['efficiency']} Therm Eff"
|
|
1601
2633
|
component.setName(shw_name)
|
|
1602
2634
|
end
|
|
1603
2635
|
|
|
@@ -1605,46 +2637,48 @@ class ECMS
|
|
|
1605
2637
|
# Method to update the cop and/or the performance curves of unitary dx coils. The method input 'unitary_cop' can either be a
|
|
1606
2638
|
# string or a hash. When it's a string it's used to find a hash in the json table 'unitary_cop_ecm'. When it's a hash it holds
|
|
1607
2639
|
# the parameters needed to update the cop and/or the performance curves of the unitary coil.
|
|
1608
|
-
def modify_unitary_cop(model:, unitary_cop:,sql_db_vars_map:)
|
|
1609
|
-
return if
|
|
2640
|
+
def modify_unitary_cop(model:, unitary_cop:, sql_db_vars_map:)
|
|
2641
|
+
return if unitary_cop.nil? || (unitary_cop.to_s == 'NECB_Default')
|
|
2642
|
+
|
|
1610
2643
|
coils = model.getCoilCoolingDXSingleSpeeds + model.getCoilCoolingDXMultiSpeeds
|
|
1611
2644
|
unitary_cop_copy = unitary_cop.dup
|
|
1612
2645
|
coils.sort.each do |coil|
|
|
1613
|
-
coil_type =
|
|
1614
|
-
coil_type =
|
|
2646
|
+
coil_type = 'SingleSpeed'
|
|
2647
|
+
coil_type = 'MultiSpeed' if coil.class.name.to_s.include? 'CoilCoolingDXMultiSpeed'
|
|
1615
2648
|
# if the parameter 'unitary_cop' is a string then get the information on the new parameters for the coils from
|
|
1616
2649
|
# the json table 'unitary_cop_ecm'
|
|
1617
2650
|
if unitary_cop_copy.is_a?(String)
|
|
1618
2651
|
search_criteria = {}
|
|
1619
2652
|
search_criteria['name'] = unitary_cop_copy
|
|
1620
2653
|
coil_name = coil.name.to_s
|
|
1621
|
-
coil.setName(sql_db_vars_map[coil_name])
|
|
1622
|
-
if coil_type ==
|
|
2654
|
+
if sql_db_vars_map.has_key? coil_name then coil.setName(sql_db_vars_map[coil_name]) end
|
|
2655
|
+
if coil_type == 'SingleSpeed'
|
|
1623
2656
|
capacity_w = coil_cooling_dx_single_speed_find_capacity(coil)
|
|
1624
|
-
elsif coil_type ==
|
|
2657
|
+
elsif coil_type == 'MultiSpeed'
|
|
1625
2658
|
capacity_w = coil_cooling_dx_multi_speed_find_capacity(coil)
|
|
1626
2659
|
end
|
|
1627
2660
|
coil.setName(coil_name)
|
|
1628
2661
|
cop_package = model_find_object(@standards_data['tables']['unitary_cop_ecm'], search_criteria, capacity_w)
|
|
1629
2662
|
raise "Cannot not find #{unitary_cop_ecm} in the ECMS unitary_acs.json file. Please check that the name is correctly spelled in the ECMS class unitary_acs.json file and in the code calling (directly or through another method) the ECMS class modify_unitary_eff method." if cop_package.empty?
|
|
2663
|
+
|
|
1630
2664
|
ecm_name = unitary_cop_copy
|
|
1631
2665
|
unitary_cop = {
|
|
1632
|
-
|
|
1633
|
-
|
|
1634
|
-
|
|
1635
|
-
|
|
1636
|
-
|
|
1637
|
-
|
|
1638
|
-
|
|
1639
|
-
|
|
2666
|
+
'name' => ecm_name,
|
|
2667
|
+
'minimum_energy_efficiency_ratio' => cop_package['minimum_energy_efficiency_ratio'],
|
|
2668
|
+
'minimum_seasonal_energy_efficiency_ratio' => cop_package['minimum_seasonal_energy_efficiency_ratio'],
|
|
2669
|
+
'cool_cap_ft' => cop_package['cool_cap_ft'],
|
|
2670
|
+
'cool_cap_fflow' => cop_package['cool_cap_fflow'],
|
|
2671
|
+
'cool_eir_ft' => cop_package['cool_eir_ft'],
|
|
2672
|
+
'cool_eir_fflow' => cop_package['cool_eir_fflow'],
|
|
2673
|
+
'cool_plf_fplr' => cop_package['cool_eir_fplr']
|
|
1640
2674
|
}
|
|
1641
2675
|
end
|
|
1642
|
-
next if
|
|
1643
|
-
|
|
2676
|
+
next if unitary_cop['minimum_energy_efficiency_ratio'].nil? && unitary_cop['minimum_seasonal_energy_efficiency_ratio'].nil? && unitary_cop['cool_cap_ft'].nil? &&
|
|
2677
|
+
unitary_cop['cool_cap_fflow'].nil? && unitary_cop['cool_eir_ft'].nil? && unitary_cop['cool_eir_fflow'].nil? && unitary_cop['cool_plf_fplr'].nil?
|
|
1644
2678
|
|
|
1645
2679
|
# If the dx coil is on an air loop then update its cop and the performance curves when these are specified in the ecm data
|
|
1646
|
-
if (coil_type ==
|
|
1647
|
-
|
|
2680
|
+
if (coil_type == 'SingleSpeed' && coil.airLoopHVAC.is_initialized && (!coil.name.to_s.include? "_ASHP")) ||
|
|
2681
|
+
(coil_type == 'MultiSpeed' && coil.containingHVACComponent.get.airLoopHVAC.is_initialized)
|
|
1648
2682
|
cop = nil
|
|
1649
2683
|
if unitary_cop['minimum_energy_efficiency_ratio']
|
|
1650
2684
|
cop = eer_to_cop(unitary_cop['minimum_energy_efficiency_ratio'].to_f)
|
|
@@ -1661,14 +2695,14 @@ class ECMS
|
|
|
1661
2695
|
cool_eir_fflow = @standards_data['curves'].select { |curve| curve['name'] == unitary_cop['cool_eir_fflow'] } if unitary_cop['cool_eir_fflow']
|
|
1662
2696
|
cool_plf_fplr = nil
|
|
1663
2697
|
cool_plf_fplr = @standards_data['curves'].select { |curve| curve['name'] == unitary_cop['cool_plf_fplr'] } if unitary_cop['cool_plf_fplr']
|
|
1664
|
-
if coil_type ==
|
|
2698
|
+
if coil_type == 'SingleSpeed'
|
|
1665
2699
|
coil.setRatedCOP(cop) if cop
|
|
1666
2700
|
coil.setTotalCoolingCapacityFunctionOfTemperatureCurve(cool_cap_ft) if cool_cap_ft
|
|
1667
2701
|
coil.setTotalCoolingCapacityFunctionOfFlowFractionCurve(cool_cap_fflow) if cool_cap_fflow
|
|
1668
2702
|
coil.setEnergyInputRatioFunctionOfTemperatureCurve(cool_eir_ft) if cool_eir_ft
|
|
1669
2703
|
coil.setEnergyInputRatioFunctionOfFlowFractionCurve(cool_eir_fflow) if cool_eir_fflow
|
|
1670
2704
|
coil.setPartLoadFractionCorrelationCurve(cool_plf_fplr) if cool_plf_fplr
|
|
1671
|
-
elsif coil_type ==
|
|
2705
|
+
elsif coil_type == 'MultiSpeed'
|
|
1672
2706
|
coil.stages.sort.each do |stage|
|
|
1673
2707
|
stage.setGrossRatedCoolingCOP(cop) if cop
|
|
1674
2708
|
stage.setTotalCoolingCapacityFunctionofTemperatureCurve(cool_cap_ft) if cool_cap_ft
|
|
@@ -1678,8 +2712,8 @@ class ECMS
|
|
|
1678
2712
|
stage.setPartLoadFractionCorrelationCurve(cool_plf_fplr) if cool_plf_fplr
|
|
1679
2713
|
end
|
|
1680
2714
|
end
|
|
1681
|
-
coil.setName(
|
|
1682
|
-
coil.setName(
|
|
2715
|
+
coil.setName('CoilCoolingDXSingleSpeed_dx-adv') if cop && coil_type == 'SingleSpeed'
|
|
2716
|
+
coil.setName('CoilCoolingDXMultiSpeed_dx-adv') if cop && coil_type == 'MultiSpeed'
|
|
1683
2717
|
end
|
|
1684
2718
|
end
|
|
1685
2719
|
end
|
|
@@ -1692,32 +2726,38 @@ class ECMS
|
|
|
1692
2726
|
# loops and other stuff from being created if someone did not want them. But others felt that that was not a clear
|
|
1693
2727
|
# way of doing things and did not feel the performance penalty of creating objects, then removing them, then creating
|
|
1694
2728
|
# them again was significant.
|
|
1695
|
-
def add_ecm_remove_airloops_add_zone_baseboards(model:,
|
|
2729
|
+
def add_ecm_remove_airloops_add_zone_baseboards(model:,
|
|
2730
|
+
system_zones_map:,
|
|
2731
|
+
system_doas_flags: nil,
|
|
2732
|
+
zone_clg_eqpt_type: nil,
|
|
2733
|
+
standard:,
|
|
2734
|
+
primary_heating_fuel:)
|
|
1696
2735
|
# Set the primary fuel set to default to to specific fuel type.
|
|
1697
2736
|
standards_info = standard.standards_data
|
|
1698
2737
|
|
|
1699
2738
|
if primary_heating_fuel == 'DefaultFuel'
|
|
1700
2739
|
epw = BTAP::Environment::WeatherFile.new(model.weatherFile.get.path.get)
|
|
1701
|
-
primary_heating_fuel = standards_info['regional_fuel_use'].detect {|fuel_sources| fuel_sources['state_province_regions'].include?(epw.state_province_region)}['fueltype_set']
|
|
2740
|
+
primary_heating_fuel = standards_info['regional_fuel_use'].detect { |fuel_sources| fuel_sources['state_province_regions'].include?(epw.state_province_region) }['fueltype_set']
|
|
1702
2741
|
end
|
|
1703
2742
|
# Get fuelset.
|
|
1704
|
-
system_fuel_defaults = standards_info['fuel_type_sets'].detect {|fuel_type_set| fuel_type_set['name'] == primary_heating_fuel}
|
|
2743
|
+
system_fuel_defaults = standards_info['fuel_type_sets'].detect { |fuel_type_set| fuel_type_set['name'] == primary_heating_fuel }
|
|
1705
2744
|
raise("fuel_type_sets named #{primary_heating_fuel} not found in fuel_type_sets table.") if system_fuel_defaults.nil?
|
|
1706
2745
|
|
|
1707
|
-
|
|
1708
2746
|
# Assign fuel sources.
|
|
1709
2747
|
boiler_fueltype = system_fuel_defaults['boiler_fueltype']
|
|
1710
2748
|
baseboard_type = system_fuel_defaults['baseboard_type']
|
|
1711
|
-
mau_heating_coil_type =
|
|
2749
|
+
mau_heating_coil_type = 'none'
|
|
1712
2750
|
|
|
1713
2751
|
# Create the hot water loop if necessary.
|
|
1714
|
-
hw_loop = standard.create_hw_loop_if_required(
|
|
1715
|
-
|
|
1716
|
-
|
|
1717
|
-
|
|
2752
|
+
hw_loop = standard.create_hw_loop_if_required(
|
|
2753
|
+
baseboard_type,
|
|
2754
|
+
boiler_fueltype,
|
|
2755
|
+
mau_heating_coil_type,
|
|
2756
|
+
model
|
|
2757
|
+
)
|
|
1718
2758
|
|
|
1719
2759
|
# Add baseboard heaters to each heated zone.
|
|
1720
|
-
system_zones_map.sort.each do |sname,zones|
|
|
2760
|
+
system_zones_map.sort.each do |sname, zones|
|
|
1721
2761
|
zones.each do |zone|
|
|
1722
2762
|
standard.add_zone_baseboards(baseboard_type: baseboard_type,
|
|
1723
2763
|
hw_loop: hw_loop,
|
|
@@ -1726,4 +2766,145 @@ class ECMS
|
|
|
1726
2766
|
end
|
|
1727
2767
|
end
|
|
1728
2768
|
end
|
|
2769
|
+
|
|
2770
|
+
# ============================================================================================================================
|
|
2771
|
+
# Apply advanced chiller measure
|
|
2772
|
+
def modify_chiller_efficiency(model:, chiller_type:)
|
|
2773
|
+
return if chiller_type.nil? || chiller_type == false || chiller_type == 'none' || chiller_type == 'NECB_Default'
|
|
2774
|
+
|
|
2775
|
+
model.getChillerElectricEIRs.sort.each do |mod_chiller|
|
|
2776
|
+
ref_capacity_w = mod_chiller.referenceCapacity
|
|
2777
|
+
ref_capacity_w = ref_capacity_w.to_f
|
|
2778
|
+
|
|
2779
|
+
##### Look for a chiller set in chiller_set.json (with a capacity close to that of the existing chiller)
|
|
2780
|
+
chiller_set, chiller_min_cap, chiller_max_cap = find_chiller_set(chiller_type: chiller_type, ref_capacity_w: ref_capacity_w)
|
|
2781
|
+
|
|
2782
|
+
##### No need to replace any chillers with capacity = 0.001 W as per Kamel Haddad's comment
|
|
2783
|
+
if ref_capacity_w > 0.0011
|
|
2784
|
+
reset_chiller_efficiency(model: model, component: mod_chiller.to_ChillerElectricEIR.get, cop: chiller_set)
|
|
2785
|
+
end
|
|
2786
|
+
end
|
|
2787
|
+
|
|
2788
|
+
##### Change fan power of single-speed Cooling towers from 'Hard Sized' to Autosized (Otherwise, E+ gives the fatal error 'Autosizing of cooling tower UA failed for tower')
|
|
2789
|
+
model.getCoolingTowerSingleSpeeds.sort.each(&:autosizeFanPoweratDesignAirFlowRate)
|
|
2790
|
+
end
|
|
2791
|
+
|
|
2792
|
+
def find_chiller_set(chiller_type:, ref_capacity_w:)
|
|
2793
|
+
if chiller_type.is_a?(String)
|
|
2794
|
+
##### Find the chiller that has the required capacity
|
|
2795
|
+
search_criteria = {}
|
|
2796
|
+
search_criteria['name'] = chiller_type
|
|
2797
|
+
capacity_w = ref_capacity_w
|
|
2798
|
+
chiller_packages = model_find_object(@standards_data['tables']['chiller_eff_ecm'], search_criteria, capacity_w)
|
|
2799
|
+
chiller_name = chiller_packages['notes']
|
|
2800
|
+
ecm_name = chiller_name
|
|
2801
|
+
chiller_set = {
|
|
2802
|
+
'notes' => ecm_name,
|
|
2803
|
+
'capacity_w' => chiller_packages['capacity_w'],
|
|
2804
|
+
'cop_w_by_w' => chiller_packages['cop_w_by_w'],
|
|
2805
|
+
'ref_leaving_chilled_water_temp_c' => chiller_packages['ref_leaving_chilled_water_temp_c'],
|
|
2806
|
+
'ref_entering_condenser_fluid_temp_c' => chiller_packages['ref_entering_condenser_fluid_temp_c'],
|
|
2807
|
+
'ref_chilled_water_flow_rate_m3_s' => chiller_packages['ref_chilled_water_flow_rate_m3_s'],
|
|
2808
|
+
'ref_condenser_fluid_flow_rate_m3_s' => chiller_packages['ref_condenser_fluid_flow_rate_m3_s'],
|
|
2809
|
+
'capft_curve' => chiller_packages['capft_curve'],
|
|
2810
|
+
'eirft_curve' => chiller_packages['eirft_curve'],
|
|
2811
|
+
'eirfplr_curve' => chiller_packages['eirfplr_curve'],
|
|
2812
|
+
'min_part_load_ratio' => chiller_packages['min_part_load_ratio'],
|
|
2813
|
+
'max_part_load_ratio' => chiller_packages['max_part_load_ratio'],
|
|
2814
|
+
'opt_part_load_ratio' => chiller_packages['opt_part_load_ratio'],
|
|
2815
|
+
'min_unloading_ratio' => chiller_packages['min_unloading_ratio'],
|
|
2816
|
+
'condenser_type' => chiller_packages['condenser_type'],
|
|
2817
|
+
'fraction_of_compressor_electric_consumption_rejected_by_condenser' => chiller_packages['fraction_of_compressor_electric_consumption_rejected_by_condenser'],
|
|
2818
|
+
'leaving_chilled_water_lower_temperature_limit_c' => chiller_packages['leaving_chilled_water_lower_temperature_limit_c'],
|
|
2819
|
+
'chiller_flow_mode' => chiller_packages['chiller_flow_mode'],
|
|
2820
|
+
'design_heat_recovery_water_flow_rate_m3_s' => chiller_packages['design_heat_recovery_water_flow_rate_m3_s']
|
|
2821
|
+
}
|
|
2822
|
+
chiller_min_cap = chiller_packages['minimum_capacity']
|
|
2823
|
+
chiller_max_cap = chiller_packages['maximum_capacity']
|
|
2824
|
+
end
|
|
2825
|
+
return chiller_set, chiller_min_cap, chiller_max_cap
|
|
2826
|
+
end
|
|
2827
|
+
|
|
2828
|
+
# ============================================================================================================================
|
|
2829
|
+
def reset_chiller_efficiency(model:, component:, cop:)
|
|
2830
|
+
# Note that all parameters (except for the capacity) of an existing chiller are replaced with the ones of the VSD chiller, as per Kamel Haddad's comment.
|
|
2831
|
+
component.setName('ChillerElectricEIR_VSDCentrifugalWaterChiller')
|
|
2832
|
+
component.setReferenceCOP(cop['cop_w_by_w'])
|
|
2833
|
+
component.setReferenceLeavingChilledWaterTemperature(cop['ref_leaving_chilled_water_temp_c'])
|
|
2834
|
+
component.setReferenceEnteringCondenserFluidTemperature(cop['ref_entering_condenser_fluid_temp_c'])
|
|
2835
|
+
component.isReferenceChilledWaterFlowRateAutosized
|
|
2836
|
+
component.isReferenceCondenserFluidFlowRateAutosized
|
|
2837
|
+
component.setMinimumPartLoadRatio(cop['min_part_load_ratio'])
|
|
2838
|
+
component.setMaximumPartLoadRatio(cop['max_part_load_ratio'])
|
|
2839
|
+
component.setOptimumPartLoadRatio(cop['opt_part_load_ratio'])
|
|
2840
|
+
component.setMinimumUnloadingRatio(cop['min_unloading_ratio'])
|
|
2841
|
+
component.setCondenserType(cop['condenser_type'])
|
|
2842
|
+
component.setFractionofCompressorElectricConsumptionRejectedbyCondenser(cop['fraction_of_compressor_electric_consumption_rejected_by_condenser'])
|
|
2843
|
+
component.setLeavingChilledWaterLowerTemperatureLimit(cop['leaving_chilled_water_lower_temperature_limit_c'])
|
|
2844
|
+
component.setChillerFlowMode(cop['chiller_flow_mode'])
|
|
2845
|
+
component.setDesignHeatRecoveryWaterFlowRate(cop['design_heat_recovery_water_flow_rate_m3_s'])
|
|
2846
|
+
|
|
2847
|
+
# set other fields of this object to nothing #Note that this could not be done for the 'Condenser Heat Recovery Relative Capacity Fraction' field as there is no 'reset' for this field.
|
|
2848
|
+
component.resetCondenserFanPowerRatio
|
|
2849
|
+
component.resetSizingFactor
|
|
2850
|
+
component.resetBasinHeaterCapacity
|
|
2851
|
+
component.resetBasinHeaterSetpointTemperature
|
|
2852
|
+
component.resetBasinHeaterSchedule
|
|
2853
|
+
component.resetHeatRecoveryInletHighTemperatureLimitSchedule
|
|
2854
|
+
component.resetHeatRecoveryLeavingTemperatureSetpointNode
|
|
2855
|
+
|
|
2856
|
+
##### Replace cooling_capacity_function_of_temperature (CAPFT) curve
|
|
2857
|
+
capft_curve_name = cop['capft_curve'].to_s
|
|
2858
|
+
existing_curve = @standards_data['curves'].select { |curve| curve['name'] == capft_curve_name }
|
|
2859
|
+
raise "No chiller with the name #{capft_curve_name} could be found in the ECMS class curves.json file. Please check both the ECMS class chiller_set.json and curves.json files to ensure the curve is entered and referenced correctly." if existing_curve.empty?
|
|
2860
|
+
|
|
2861
|
+
capft_curve_data = (@standards_data['curves'].select { |curve| curve['name'] == capft_curve_name })[0]
|
|
2862
|
+
capft_curve = model_add_curve(model, capft_curve_name)
|
|
2863
|
+
component.setCoolingCapacityFunctionOfTemperature(capft_curve) if capft_curve
|
|
2864
|
+
raise "There was a problem setting the CoolingCapacityFunctionOfTemperature curve named #{capft_curve_name} for #{component.name}. Please ensure that the curve is entered and referenced correctly in the ECMS class curves.json and chiller_set.json files." if !capft_curve
|
|
2865
|
+
|
|
2866
|
+
##### Replace electric_input_to_cooling_output_ratio_function_of_temperature (EIRFT) curve
|
|
2867
|
+
eirft_curve_name = cop['eirft_curve'].to_s
|
|
2868
|
+
existing_curve = @standards_data['curves'].select { |curve| curve['name'] == eirft_curve_name }
|
|
2869
|
+
raise "No chiller with the name #{eirft_curve_name} could be found in the ECMS class curves.json file. Please check both the ECMS class chiller_set.json and curves.json files to ensure the curve is entered and referenced correctly." if existing_curve.empty?
|
|
2870
|
+
|
|
2871
|
+
eirft_curve_data = (@standards_data['curves'].select { |curve| curve['name'] == eirft_curve_name })[0]
|
|
2872
|
+
eirft_curve = model_add_curve(model, eirft_curve_name)
|
|
2873
|
+
component.setElectricInputToCoolingOutputRatioFunctionOfTemperature(eirft_curve) if eirft_curve
|
|
2874
|
+
raise "There was a problem setting the ElectricInputToCoolingOutputRatioFunctionOfTemperature curve named #{eirft_curve_name} for #{component.name}. Please ensure that the curve is entered and referenced correctly in the ECMS class curves.json and chiller_set.json files." if !eirft_curve
|
|
2875
|
+
|
|
2876
|
+
##### Replace electric_input_to_cooling_output_ratio_function_of_part_load_ratio (EIRFPLR) curve
|
|
2877
|
+
eirfplr_curve_name = cop['eirfplr_curve'].to_s
|
|
2878
|
+
existing_curve = @standards_data['curves'].select { |curve| curve['name'] == eirfplr_curve_name }
|
|
2879
|
+
raise "No chiller with the name #{eirfplr_curve_name} could be found in the ECMS class curves.json file. Please check both the ECMS class chiller_set.json and curves.json files to ensure the curve is entered and referenced correctly." if existing_curve.empty?
|
|
2880
|
+
|
|
2881
|
+
eirfplr_curve_data = (@standards_data['curves'].select { |curve| curve['name'] == eirfplr_curve_name })[0]
|
|
2882
|
+
eirfplr_curve = model_add_curve(model, eirfplr_curve_name)
|
|
2883
|
+
component.setElectricInputToCoolingOutputRatioFunctionOfPLR(eirfplr_curve) if eirfplr_curve
|
|
2884
|
+
raise "There was a problem setting the ElectricInputToCoolingOutputRatioFunctionOfPLR curve named #{eirfplr_curve_name} for #{component.name}. Please ensure that the curve is entered and referenced correctly in the ECMS class curves.json and chiller_set.json files." if !eirfplr_curve
|
|
2885
|
+
end
|
|
2886
|
+
|
|
2887
|
+
# ============================================================================================================================
|
|
2888
|
+
# Add air side economizer for each airloop
|
|
2889
|
+
def add_airloop_economizer(model:, airloop_economizer_type:)
|
|
2890
|
+
return if airloop_economizer_type.nil? || (airloop_economizer_type.to_s == 'NECB_Default')
|
|
2891
|
+
|
|
2892
|
+
if airloop_economizer_type.downcase == "differentialenthalpy"
|
|
2893
|
+
economizer_type = 'DifferentialEnthalpy'
|
|
2894
|
+
elsif airloop_economizer_type.downcase == "differentialdrybulb"
|
|
2895
|
+
economizer_type = 'DifferentialDryBulb'
|
|
2896
|
+
else
|
|
2897
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.airLoopHVACOutdoorAirSystem', "The air loop economizer type #{airloop_economizer_type} is not recognized. Please make sure that the economizer being applied by the ECM is either a DifferentialEnthalpy or DifferentialDryBulb type. No economizer will be applied.")
|
|
2898
|
+
return
|
|
2899
|
+
end
|
|
2900
|
+
|
|
2901
|
+
model.getAirLoopHVACs.sort.each do |air_loop|
|
|
2902
|
+
oa_sys = air_loop.airLoopHVACOutdoorAirSystem
|
|
2903
|
+
if oa_sys.is_initialized
|
|
2904
|
+
oa_sys = oa_sys.get
|
|
2905
|
+
oa_control = oa_sys.getControllerOutdoorAir
|
|
2906
|
+
oa_control.setEconomizerControlType(economizer_type)
|
|
2907
|
+
end
|
|
2908
|
+
end
|
|
2909
|
+
end
|
|
1729
2910
|
end
|