openstudio-standards 0.2.14 → 0.2.15.pre.rc1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|