From f6453b19814547242c727bf037dd808f573f4159 Mon Sep 17 00:00:00 2001 From: Brent Griffith Date: Thu, 25 Jan 2018 12:13:51 -0700 Subject: [PATCH 01/14] draft code changes for nwe coil summary report table Contribution from TRANE for comprehensive coil information table. --- src/EnergyPlus/CMakeLists.txt | 2 + src/EnergyPlus/DXCoils.cc | 178 +- src/EnergyPlus/DXCoils.hh | 9 +- src/EnergyPlus/DataHVACGlobals.cc | 3 + src/EnergyPlus/DataHVACGlobals.hh | 2 + src/EnergyPlus/DataSizing.hh | 27 +- src/EnergyPlus/FanCoilUnits.cc | 13 +- src/EnergyPlus/HVACDXSystem.cc | 37 +- src/EnergyPlus/HVACDXSystem.hh | 6 +- src/EnergyPlus/HVACUnitaryBypassVAV.cc | 7 +- src/EnergyPlus/HVACUnitarySystem.cc | 38 +- src/EnergyPlus/HVACUnitarySystem.hh | 4 +- src/EnergyPlus/HeatingCoils.cc | 18 + src/EnergyPlus/HeatingCoils.hh | 6 +- src/EnergyPlus/OutputReportPredefined.cc | 327 +++- src/EnergyPlus/OutputReportPredefined.hh | 103 ++ src/EnergyPlus/OutputReportTabular.cc | 12 +- src/EnergyPlus/PackagedTerminalHeatPump.cc | 30 + src/EnergyPlus/PoweredInductionUnits.cc | 1 + src/EnergyPlus/ReportCoilSelection.cc | 1715 ++++++++++++++++++++ src/EnergyPlus/ReportCoilSelection.hh | 500 ++++++ src/EnergyPlus/ReportSizingManager.cc | 573 +++++++ src/EnergyPlus/SimAirServingZones.cc | 46 + src/EnergyPlus/SimulationManager.cc | 2 + src/EnergyPlus/SingleDuct.cc | 6 + src/EnergyPlus/SingleDuct.hh | 2 +- src/EnergyPlus/SizingAnalysisObjects.cc | 4 +- src/EnergyPlus/SteamCoils.cc | 50 +- src/EnergyPlus/SteamCoils.hh | 8 +- src/EnergyPlus/UnitHeater.cc | 8 + src/EnergyPlus/UnitVentilator.cc | 36 + src/EnergyPlus/VariableSpeedCoils.cc | 258 ++- src/EnergyPlus/VariableSpeedCoils.hh | 13 +- src/EnergyPlus/WaterCoils.cc | 144 +- src/EnergyPlus/WaterCoils.hh | 8 +- src/EnergyPlus/WaterToAirHeatPumpSimple.cc | 10 + src/EnergyPlus/WaterToAirHeatPumpSimple.hh | 5 +- src/EnergyPlus/WindowAC.cc | 8 + 38 files changed, 4149 insertions(+), 70 deletions(-) create mode 100644 src/EnergyPlus/ReportCoilSelection.cc create mode 100644 src/EnergyPlus/ReportCoilSelection.hh diff --git a/src/EnergyPlus/CMakeLists.txt b/src/EnergyPlus/CMakeLists.txt index 2bc0b77e5d0..b6b18b7c7c3 100644 --- a/src/EnergyPlus/CMakeLists.txt +++ b/src/EnergyPlus/CMakeLists.txt @@ -432,6 +432,8 @@ SET( SRC PurchasedAirManager.hh RefrigeratedCase.cc RefrigeratedCase.hh + ReportCoilSelection.cc + ReportCoilSelection.hh ReportSizingManager.cc ReportSizingManager.hh ReturnAirPathManager.cc diff --git a/src/EnergyPlus/DXCoils.cc b/src/EnergyPlus/DXCoils.cc index 48a8b85c9e2..30929cb20e6 100644 --- a/src/EnergyPlus/DXCoils.cc +++ b/src/EnergyPlus/DXCoils.cc @@ -91,6 +91,7 @@ #include #include #include +#include namespace EnergyPlus { @@ -5308,6 +5309,69 @@ namespace DXCoils { // get high speed rated coil bypass factor DXCoil( DXCoilNum ).RatedCBF( Mode ) = CalcCBF( DXCoil( DXCoilNum ).DXCoilType, DXCoil( DXCoilNum ).Name, RatedInletAirTemp, RatedInletAirHumRat, DXCoil( DXCoilNum ).RatedTotCap( Mode ), DXCoil( DXCoilNum ).RatedAirVolFlowRate( Mode ), DXCoil( DXCoilNum ).RatedSHR( Mode ) ); + // call coil model with everthing set at rating point + DXCoil( DXCoilNum ).InletAirMassFlowRate = DXCoil( DXCoilNum ).RatedAirMassFlowRate( Mode ) ; + DXCoil( DXCoilNum ).InletAirMassFlowRateMax = DXCoil( DXCoilNum ).RatedAirMassFlowRate( Mode ) ; + DXCoil( DXCoilNum ).InletAirTemp = RatedInletAirTemp; + Real64 tempInletAirHumRat = Psychrometrics::PsyWFnTdbTwbPb( RatedInletAirTemp, RatedInletWetBulbTemp, DataEnvironment::StdPressureSeaLevel, RoutineName ); + //DXCoil( DXCoilNum ).InletAirHumRat = RatedInletAirHumRat; // this seems inconsistent with dry bulb and wetbulb, filed NREL issue #5934 + //Real64 tempInletAirWetBulb = Psychrometrics::PsyTwbFnTdbWPb( RatedInletAirTemp, RatedInletAirHumRat, DataEnvironment::StdPressureSeaLevel ); + DXCoil( DXCoilNum ).InletAirHumRat = tempInletAirHumRat; + DXCoil( DXCoilNum ).InletAirEnthalpy = Psychrometrics::PsyHFnTdbW( RatedInletAirTemp, tempInletAirHumRat ); + + // store environment data fill back in after rating point calc is over + Real64 holdOutDryBulbTemp = DataEnvironment::OutDryBulbTemp; + Real64 holdOutHumRat = DataEnvironment::OutHumRat; + Real64 holdOutWetBulb = DataEnvironment::OutWetBulbTemp; + Real64 holdOutBaroPress = DataEnvironment::OutBaroPress; + Real64 ratedOutdoorAirWetBulb = 23.9; // from I/O ref. more precise value? + DataEnvironment::OutDryBulbTemp = RatedOutdoorAirTemp; + DataEnvironment::OutWetBulbTemp = ratedOutdoorAirWetBulb; + DataEnvironment::OutBaroPress = DataEnvironment::StdPressureSeaLevel; // assume rating is for sea level. + DataEnvironment::OutHumRat = Psychrometrics::PsyWFnTdbTwbPb( RatedOutdoorAirTemp, ratedOutdoorAirWetBulb, DataEnvironment::StdPressureSeaLevel, RoutineName ); + if ( DXCoil( DXCoilNum ).CondenserInletNodeNum( 1 ) > 0 ) { // set condenser inlet node values + Node( DXCoil( DXCoilNum ).CondenserInletNodeNum( 1 ) ).Temp = RatedOutdoorAirTemp; + Node( DXCoil( DXCoilNum ).CondenserInletNodeNum( 1 ) ).HumRat = DataEnvironment::OutHumRat; + Node( DXCoil( DXCoilNum ).CondenserInletNodeNum( 1 ) ).OutAirWetBulb = ratedOutdoorAirWetBulb; + } + + // calculate coil model at rating point + if ( DXCoil( DXCoilNum ).DXCoilType_Num == DataHVACGlobals::CoilDX_CoolingSingleSpeed ) { + CalcDoe2DXCoil( DXCoilNum, 1.0, false, 1.0, 1.0, _, 1.0 ); + } else if ( DXCoil( DXCoilNum ).DXCoilType_Num == DataHVACGlobals::CoilDX_CoolingTwoSpeed ) { + CalcMultiSpeedDXCoil( DXCoilNum, 1.0, 1.0 ); + } else if ( DXCoil( DXCoilNum ).DXCoilType_Num == DataHVACGlobals::CoilVRF_Cooling ) { + CalcVRFCoolingCoil( DXCoilNum, 1, false, 1.0, 1.0, 1.0, _, _, _ ); + } else if ( DXCoil( DXCoilNum ).DXCoilType_Num == DataHVACGlobals::CoilVRF_FluidTCtrl_Cooling ) { + CalcVRFCoolingCoil_FluidTCtrl( DXCoilNum, 1, false, 1.0, 1.0, 1.0, _, _ ); + } + + //coil outlets + Real64 RatedOutletWetBulb( 0.0 ); + RatedOutletWetBulb = Psychrometrics::PsyTwbFnTdbWPb( DXCoil( DXCoilNum ).OutletAirTemp, DXCoil( DXCoilNum ).OutletAirHumRat, DataEnvironment::StdPressureSeaLevel, RoutineName ); + + coilSelectionReportObj->setRatedCoilConditions( + DXCoil( DXCoilNum ).Name, + DXCoil( DXCoilNum ).DXCoilType, + DXCoil( DXCoilNum ).TotalCoolingEnergyRate, // this is the report variable + DXCoil( DXCoilNum ).SensCoolingEnergyRate, // this is the report variable + DXCoil( DXCoilNum ).InletAirMassFlowRate, + DXCoil( DXCoilNum ).InletAirTemp, + DXCoil( DXCoilNum ).InletAirHumRat, + RatedInletWetBulbTemp, + DXCoil( DXCoilNum ).OutletAirTemp , + DXCoil( DXCoilNum ).OutletAirHumRat , + RatedOutletWetBulb, + RatedOutdoorAirTemp, + ratedOutdoorAirWetBulb, + DXCoil( DXCoilNum ).RatedCBF( Mode ), + -999.0 ); // coil effectiveness not define for DX + + // now replace the outdoor air conditions set above for one time rating point calc + DataEnvironment::OutDryBulbTemp = holdOutDryBulbTemp; + DataEnvironment::OutHumRat = holdOutHumRat; + DataEnvironment::OutWetBulbTemp = holdOutWetBulb; + DataEnvironment::OutBaroPress = holdOutBaroPress; } if ( DXCoil( DXCoilNum ).DXCoilType_Num == CoilDX_CoolingTwoStageWHumControl ) { @@ -5370,6 +5434,69 @@ namespace DXCoils { } } + // call coil model with everthing set at rating point + DXCoil( DXCoilNum ).InletAirMassFlowRate = DXCoil( DXCoilNum ).RatedAirMassFlowRate( Mode ) ; + DXCoil( DXCoilNum ).InletAirMassFlowRateMax = DXCoil( DXCoilNum ).RatedAirMassFlowRate( Mode ) ; + + DXCoil( DXCoilNum ).InletAirTemp = RatedInletAirTempHeat; + Real64 tempInletAirHumRat = Psychrometrics::PsyWFnTdbTwbPb( RatedInletAirTempHeat, RatedInletWetBulbTempHeat, DataEnvironment::StdPressureSeaLevel, RoutineName ); + DXCoil( DXCoilNum ).InletAirHumRat = tempInletAirHumRat; + DXCoil( DXCoilNum ).InletAirEnthalpy = Psychrometrics::PsyHFnTdbW( RatedInletAirTempHeat, tempInletAirHumRat ); + + // store environment data fill back in after rating point calc is over + Real64 holdOutDryBulbTemp = DataEnvironment::OutDryBulbTemp; + Real64 holdOutHumRat = DataEnvironment::OutHumRat; + Real64 holdOutWetBulb = DataEnvironment::OutWetBulbTemp; + Real64 holdOutBaroPress = DataEnvironment::OutBaroPress; + + DataEnvironment::OutDryBulbTemp = RatedOutdoorAirTempHeat; + + Real64 ratedOutdoorAirWetBulb = 6.11; // from I/O ref. more precise value? + DataEnvironment::OutWetBulbTemp = ratedOutdoorAirWetBulb; + DataEnvironment::OutBaroPress = DataEnvironment::StdPressureSeaLevel; // assume rating is for sea level. + DataEnvironment::OutHumRat = Psychrometrics::PsyWFnTdbTwbPb( RatedOutdoorAirTempHeat, ratedOutdoorAirWetBulb, DataEnvironment::StdPressureSeaLevel, RoutineName ); + + if ( DXCoil( DXCoilNum ).CondenserInletNodeNum( 1 ) > 0 ) { // set condenser inlet node values + Node( DXCoil( DXCoilNum ).CondenserInletNodeNum( 1 ) ).Temp = RatedOutdoorAirTempHeat; + Node( DXCoil( DXCoilNum ).CondenserInletNodeNum( 1 ) ).HumRat = DataEnvironment::OutHumRat; + Node( DXCoil( DXCoilNum ).CondenserInletNodeNum( 1 ) ).OutAirWetBulb = ratedOutdoorAirWetBulb; + } + + // calculate coil model at rating point + if ( DXCoil( DXCoilNum ).DXCoilType_Num == CoilDX_HeatingEmpirical ) { + CalcDXHeatingCoil( DXCoilNum, 1.0, 1.0, 1.0 ); + } else if ( DXCoil( DXCoilNum ).DXCoilType_Num == CoilVRF_Heating ) { + CalcDXHeatingCoil( DXCoilNum, 1.0, 1.0, _, _ ); + } else if ( DXCoil( DXCoilNum ).DXCoilType_Num == CoilVRF_FluidTCtrl_Heating ) { + CalcVRFHeatingCoil_FluidTCtrl( 1.0, DXCoilNum, 1.0, 1.0, _, _); + } + //coil outlets + Real64 RatedOutletWetBulb( 0.0 ); + RatedOutletWetBulb = Psychrometrics::PsyTwbFnTdbWPb( DXCoil( DXCoilNum ).OutletAirTemp, DXCoil( DXCoilNum ).OutletAirHumRat, StdPressureSeaLevel, RoutineName ); + + coilSelectionReportObj->setRatedCoilConditions( + DXCoil( DXCoilNum ).Name, + DXCoil( DXCoilNum ).DXCoilType, + DXCoil( DXCoilNum ).TotalHeatingEnergyRate, // this is the report variable + DXCoil( DXCoilNum ).TotalHeatingEnergyRate, // this is the report variable + DXCoil( DXCoilNum ).InletAirMassFlowRate, + DXCoil( DXCoilNum ).InletAirTemp, + DXCoil( DXCoilNum ).InletAirHumRat, + RatedInletWetBulbTempHeat, + DXCoil( DXCoilNum ).OutletAirTemp , + DXCoil( DXCoilNum ).OutletAirHumRat , + RatedOutletWetBulb, + RatedOutdoorAirTempHeat, + ratedOutdoorAirWetBulb, + DXCoil( DXCoilNum ).RatedCBF( Mode ), + -999.0 ); // coil effectiveness not define for DX + + + // now replace the outdoor air conditions set above for one time rating point calc + DataEnvironment::OutDryBulbTemp = holdOutDryBulbTemp; + DataEnvironment::OutHumRat = holdOutHumRat; + DataEnvironment::OutWetBulbTemp = holdOutWetBulb; + DataEnvironment::OutBaroPress = holdOutBaroPress; } if ( DXCoil( DXCoilNum ).DXCoilType_Num == CoilDX_CoolingTwoSpeed ) { @@ -5433,6 +5560,27 @@ namespace DXCoils { } } + // store fan info for coil + if ( DXCoil( DXCoilNum ).SupplyFan_TypeNum == DataHVACGlobals::FanType_SystemModelObject ) { + if ( DXCoil( DXCoilNum ).SupplyFanIndex > -1 ) { + coilSelectionReportObj->setCoilSupplyFanInfo( + DXCoil( DXCoilNum ).Name, + DXCoil( DXCoilNum ).DXCoilType, + DXCoil( DXCoilNum ).SupplyFanName, + DataAirSystems::objectVectorOOFanSystemModel, + DXCoil( DXCoilNum ).SupplyFanIndex ); + } + + } else { + if ( DXCoil( DXCoilNum ).SupplyFanIndex > 0 ) { + coilSelectionReportObj->setCoilSupplyFanInfo( + DXCoil( DXCoilNum ).Name, + DXCoil( DXCoilNum ).DXCoilType, + DXCoil( DXCoilNum ).SupplyFanName, + DataAirSystems::structArrayLegacyFanModels, + DXCoil( DXCoilNum ).SupplyFanIndex ); + } + } } AirInletNode = DXCoil( DXCoilNum ).AirInNode; @@ -9133,7 +9281,7 @@ Label50: ; RatedCBFHS = DXCoil( DXCoilNum ).RatedCBF( Mode ); CBFHS = AdjustCBF( RatedCBFHS, DXCoil( DXCoilNum ).RatedAirMassFlowRate( Mode ), DXCoil( DXCoilNum ).InletAirMassFlowRateMax ); // get high speed total capacity and SHR at current conditions - CalcTotCapSHR( InletAirDryBulbTemp, InletAirHumRat, InletAirEnthalpy, InletAirWetBulbC, AirMassFlowRatio, DXCoil( DXCoilNum ).InletAirMassFlowRateMax, DXCoil( DXCoilNum ).RatedTotCap( Mode ), CBFHS, DXCoil( DXCoilNum ).CCapFTemp( Mode ), DXCoil( DXCoilNum ).CCapFFlow( Mode ), TotCapHS, SHRHS, CondInletTemp, OutdoorPressure ); + CalcTotCapSHR( InletAirDryBulbTemp, InletAirHumRat, InletAirEnthalpy, InletAirWetBulbC, AirMassFlowRatio, DXCoil( DXCoilNum ).InletAirMassFlowRateMax, DXCoil( DXCoilNum ).RatedTotCap( Mode ), CBFHS, DXCoil( DXCoilNum ).CCapFTemp( Mode ), DXCoil( DXCoilNum ).CCapFFlow( Mode ), TotCapHS, SHRHS, CondInletTemp, OutdoorPressure, DXCoil( DXCoilNum ).capModFacTotal ); // Eventually inlet air conditions will be used in DX Coil, these lines are commented out and marked with this comment line // CondInletTemp, Node(DXCoil(DXCoilNum)%AirInNode)%Press) // get the high speed SHR from user specified SHR modifier curves @@ -9141,7 +9289,7 @@ Label50: ; SHRHS = CalcSHRUserDefinedCurves( InletAirDryBulbTemp, InletAirWetBulbC, AirMassFlowRatio, DXCoil( DXCoilNum ).SHRFTemp( Mode ), DXCoil( DXCoilNum ).SHRFFlow( Mode ), DXCoil( DXCoilNum ).RatedSHR( Mode ) ); } // get low speed total capacity and SHR at current conditions - CalcTotCapSHR( InletAirDryBulbTemp, InletAirHumRat, InletAirEnthalpy, InletAirWetBulbC, 1.0, DXCoil( DXCoilNum ).RatedAirMassFlowRate2, DXCoil( DXCoilNum ).RatedTotCap2, DXCoil( DXCoilNum ).RatedCBF2, DXCoil( DXCoilNum ).CCapFTemp2, DXCoil( DXCoilNum ).CCapFFlow( Mode ), TotCapLS, SHRLS, CondInletTemp, OutdoorPressure ); + CalcTotCapSHR( InletAirDryBulbTemp, InletAirHumRat, InletAirEnthalpy, InletAirWetBulbC, 1.0, DXCoil( DXCoilNum ).RatedAirMassFlowRate2, DXCoil( DXCoilNum ).RatedTotCap2, DXCoil( DXCoilNum ).RatedCBF2, DXCoil( DXCoilNum ).CCapFTemp2, DXCoil( DXCoilNum ).CCapFFlow( Mode ), TotCapLS, SHRLS, CondInletTemp, OutdoorPressure, DXCoil( DXCoilNum ).capModFacTotal ); // Eventually inlet air conditions will be used in DX Coil, these lines are commented out and marked with this comment line // Node(DXCoil(DXCoilNum)%AirInNode)%Press) // get the low speed SHR from user specified SHR modifier curves @@ -9260,7 +9408,7 @@ Label50: ; // Adjust low speed coil bypass factor for actual flow rate. // CBF = AdjustCBF(DXCoil(DXCoilNum)%RatedCBF2,DXCoil(DXCoilNum)%RatedAirMassFlowRate2,AirMassFlow) // get low speed total capacity and SHR at current conditions - CalcTotCapSHR( InletAirDryBulbTemp, InletAirHumRat, InletAirEnthalpy, InletAirWetBulbC, 1.0, DXCoil( DXCoilNum ).RatedAirMassFlowRate2, DXCoil( DXCoilNum ).RatedTotCap2, DXCoil( DXCoilNum ).RatedCBF2, DXCoil( DXCoilNum ).CCapFTemp2, DXCoil( DXCoilNum ).CCapFFlow( Mode ), TotCapLS, SHRLS, CondInletTemp, OutdoorPressure ); + CalcTotCapSHR( InletAirDryBulbTemp, InletAirHumRat, InletAirEnthalpy, InletAirWetBulbC, 1.0, DXCoil( DXCoilNum ).RatedAirMassFlowRate2, DXCoil( DXCoilNum ).RatedTotCap2, DXCoil( DXCoilNum ).RatedCBF2, DXCoil( DXCoilNum ).CCapFTemp2, DXCoil( DXCoilNum ).CCapFFlow( Mode ), TotCapLS, SHRLS, CondInletTemp, OutdoorPressure, DXCoil( DXCoilNum ).capModFacTotal ); // get the low speed SHR from user specified SHR modifier curves if ( DXCoil( DXCoilNum ).UserSHRCurveExists ) { SHRLS = CalcSHRUserDefinedCurves( InletAirDryBulbTemp, InletAirWetBulbC, 1.0, DXCoil( DXCoilNum ).SHRFTemp2, DXCoil( DXCoilNum ).SHRFFlow2, DXCoil( DXCoilNum ).RatedSHR2 ); @@ -9981,7 +10129,8 @@ Label50: ; Real64 & TotCap, // total capacity at the given conditions [W] Real64 & SHR, // sensible heat ratio at the given conditions Real64 const CondInletTemp, // Condenser inlet temperature [C] - Real64 const Pressure // air pressure [Pa] + Real64 const Pressure, // air pressure [Pa] + Real64 & TotCapModFac // capacity modification factor, func of temp and func of flow ) { @@ -10095,6 +10244,7 @@ Label50: ; SHR = SHRCalc; TotCap = TotCapCalc; + TotCapModFac = TotCapTempModFac * TotCapFlowModFac; } @@ -10355,7 +10505,7 @@ Label50: ; RatedCBFLS = DXCoil( DXCoilNum ).MSRatedCBF( SpeedNumLS ); CBFLS = AdjustCBF( RatedCBFLS, DXCoil( DXCoilNum ).MSRatedAirMassFlowRate( SpeedNumLS ), MSHPMassFlowRateLow ); // get low speed total capacity and SHR at current conditions - CalcTotCapSHR( InletAirDryBulbTemp, InletAirHumRat, InletAirEnthalpy, InletAirWetBulbC, AirMassFlowRatioLS, MSHPMassFlowRateLow, DXCoil( DXCoilNum ).MSRatedTotCap( SpeedNumLS ), CBFLS, DXCoil( DXCoilNum ).MSCCapFTemp( SpeedNumLS ), DXCoil( DXCoilNum ).MSCCapFFlow( SpeedNumLS ), TotCapLS, SHRLS, CondInletTemp, OutdoorPressure ); + CalcTotCapSHR( InletAirDryBulbTemp, InletAirHumRat, InletAirEnthalpy, InletAirWetBulbC, AirMassFlowRatioLS, MSHPMassFlowRateLow, DXCoil( DXCoilNum ).MSRatedTotCap( SpeedNumLS ), CBFLS, DXCoil( DXCoilNum ).MSCCapFTemp( SpeedNumLS ), DXCoil( DXCoilNum ).MSCCapFFlow( SpeedNumLS ), TotCapLS, SHRLS, CondInletTemp, OutdoorPressure, DXCoil( DXCoilNum ).capModFacTotal ); // get low speed outlet conditions hDelta = TotCapLS / MSHPMassFlowRateLow; // Calculate new apparatus dew point conditions @@ -10385,7 +10535,7 @@ Label50: ; // get high speed total capacity and SHR at current conditions - CalcTotCapSHR( InletAirDryBulbTemp, InletAirHumRat, InletAirEnthalpy, InletAirWetBulbC, AirMassFlowRatioHS, MSHPMassFlowRateHigh, DXCoil( DXCoilNum ).MSRatedTotCap( SpeedNumHS ), CBFHS, DXCoil( DXCoilNum ).MSCCapFTemp( SpeedNumHS ), DXCoil( DXCoilNum ).MSCCapFFlow( SpeedNumHS ), TotCapHS, SHRHS, CondInletTemp, OutdoorPressure ); + CalcTotCapSHR( InletAirDryBulbTemp, InletAirHumRat, InletAirEnthalpy, InletAirWetBulbC, AirMassFlowRatioHS, MSHPMassFlowRateHigh, DXCoil( DXCoilNum ).MSRatedTotCap( SpeedNumHS ), CBFHS, DXCoil( DXCoilNum ).MSCCapFTemp( SpeedNumHS ), DXCoil( DXCoilNum ).MSCCapFFlow( SpeedNumHS ), TotCapHS, SHRHS, CondInletTemp, OutdoorPressure, DXCoil( DXCoilNum ).capModFacTotal ); hDelta = TotCapHS / MSHPMassFlowRateHigh; // Calculate new apparatus dew point conditions hADP = InletAirEnthalpy - hDelta / ( 1.0 - CBFHS ); @@ -10577,7 +10727,7 @@ Label50: ; // Adjust low speed coil bypass factor for actual flow rate. // CBF = AdjustCBF(DXCoil(DXCoilNum)%RatedCBF2,DXCoil(DXCoilNum)%RatedAirMassFlowRate2,AirMassFlow) // get low speed total capacity and SHR at current conditions - CalcTotCapSHR( InletAirDryBulbTemp, InletAirHumRat, InletAirEnthalpy, InletAirWetBulbC, AirMassFlowRatioLS, MSHPMassFlowRateHigh, DXCoil( DXCoilNum ).MSRatedTotCap( SpeedNum ), CBFLS, DXCoil( DXCoilNum ).MSCCapFTemp( SpeedNum ), DXCoil( DXCoilNum ).MSCCapFFlow( SpeedNum ), TotCapLS, SHRLS, CondInletTemp, OutdoorPressure ); + CalcTotCapSHR( InletAirDryBulbTemp, InletAirHumRat, InletAirEnthalpy, InletAirWetBulbC, AirMassFlowRatioLS, MSHPMassFlowRateHigh, DXCoil( DXCoilNum ).MSRatedTotCap( SpeedNum ), CBFLS, DXCoil( DXCoilNum ).MSCCapFTemp( SpeedNum ), DXCoil( DXCoilNum ).MSCCapFFlow( SpeedNum ), TotCapLS, SHRLS, CondInletTemp, OutdoorPressure, DXCoil( DXCoilNum ).capModFacTotal ); // Eventually inlet air conditions will be used in DX Coil, these lines are commented out and marked with this comment line // Node(DXCoil(DXCoilNum)%AirInNode)%Press) hDelta = TotCapLS / AirMassFlow; @@ -11501,6 +11651,13 @@ Label50: ; Real64 SpecHumIn; Real64 ReportingConstant; // Number of seconds per HVAC system time step, to convert from W (J/s) to J + if ( ! DataGlobals::WarmupFlag && ! DataGlobals::DoingHVACSizingSimulations && ! DataGlobals::DoingSizing && DXCoil( DXCoilNum ).reportCoilFinalSizes ) { + Real64 ratedSensCap( 0.0); + ratedSensCap = DXCoil( DXCoilNum ).RatedTotCap( 1 ) * DXCoil( DXCoilNum ).RatedSHR( 1 ); + coilSelectionReportObj->setCoilFinalSizes( DXCoil( DXCoilNum ).Name, DXCoil( DXCoilNum ).DXCoilType, DXCoil( DXCoilNum ).RatedTotCap( 1 ), ratedSensCap, DXCoil( DXCoilNum ).RatedAirVolFlowRate( 1 ), -999.0 ); + DXCoil( DXCoilNum ).reportCoilFinalSizes = false; + } + ReportingConstant = TimeStepSys * SecInHour; { auto const SELECT_CASE_var( DXCoil( DXCoilNum ).DXCoilType_Num ); @@ -13244,6 +13401,13 @@ Label50: ; if ( present( SupplyFan_TypeNum ) ) { DXCoil( DXCoilNum ).SupplyFan_TypeNum = SupplyFan_TypeNum; + if ( DXCoil( DXCoilNum ).SupplyFanIndex > -1 ) { + if ( SupplyFan_TypeNum == DataHVACGlobals::FanType_SystemModelObject ) { + coilSelectionReportObj->setCoilSupplyFanInfo( DXCoil( DXCoilNum ).Name , DXCoil( DXCoilNum ).DXCoilType, HVACFan::fanObjs[ DXCoil( DXCoilNum ).SupplyFanIndex ]->name, DataAirSystems::objectVectorOOFanSystemModel, DXCoil( DXCoilNum ).SupplyFanIndex ); + } else { + coilSelectionReportObj->setCoilSupplyFanInfo( DXCoil( DXCoilNum ).Name , DXCoil( DXCoilNum ).DXCoilType, Fans::Fan( DXCoil( DXCoilNum ).SupplyFanIndex ).FanName, DataAirSystems::structArrayLegacyFanModels, DXCoil( DXCoilNum ).SupplyFanIndex ); + } + } } } diff --git a/src/EnergyPlus/DXCoils.hh b/src/EnergyPlus/DXCoils.hh index 2d2010378b7..d704adf71c2 100644 --- a/src/EnergyPlus/DXCoils.hh +++ b/src/EnergyPlus/DXCoils.hh @@ -514,6 +514,8 @@ namespace DXCoils { Real64 ActualSC; // Actual subcooling degrees [C] Real64 RateBFVRFIUEvap; // VRF Iutdoor Unit Evaporator Rated Bypass Factor Real64 RateBFVRFIUCond; // VRF Iutdoor Unit Condenser Rated Bypass Factor + bool reportCoilFinalSizes; // one time report of sizes to coil selection report + Real64 capModFacTotal; // current coil capacity modification factor // Default Constructor DXCoilData() : @@ -753,7 +755,9 @@ namespace DXCoils { ActualSH( 0.0 ), ActualSC( 0.0 ), RateBFVRFIUEvap( 0.0592 ), - RateBFVRFIUCond( 0.1360 ) + RateBFVRFIUCond( 0.1360 ), + reportCoilFinalSizes( true ), + capModFacTotal( 0.0 ) {} }; @@ -947,7 +951,8 @@ namespace DXCoils { Real64 & TotCap, // total capacity at the given conditions [W] Real64 & SHR, // sensible heat ratio at the given conditions Real64 const CondInletTemp, // Condenser inlet temperature [C] - Real64 const Pressure // air pressure [Pa] + Real64 const Pressure, // air pressure [Pa] + Real64 & TotCapModFac // capacity modification factor, func of temp and func of flow ); void diff --git a/src/EnergyPlus/DataHVACGlobals.cc b/src/EnergyPlus/DataHVACGlobals.cc index cd6b4c63977..2aa2675b55c 100644 --- a/src/EnergyPlus/DataHVACGlobals.cc +++ b/src/EnergyPlus/DataHVACGlobals.cc @@ -233,6 +233,9 @@ namespace DataHVACGlobals { Array1D_string const cAllCoilTypes( NumAllCoilTypes, { "Coil:Cooling:DX:SingleSpeed", "Coil:Heating:DX:SingleSpeed", "Coil:Cooling:DX:TwoSpeed", "CoilSystem:Cooling:DX:HeatExchangerAssisted", "Coil:Cooling:DX:TwoStageWithHumidityControlMode", "Coil:WaterHeating:AirToWaterHeatPump:Pumped", "Coil:WaterHeating:AirToWaterHeatPump:Wrapped", "Coil:Cooling:DX:MultiSpeed", "Coil:Heating:DX:MultiSpeed", "Coil:Heating:Fuel", "Coil:Heating:Gas:MultiStage", "Coil:Heating:Electric", "Coil:Heating:Electric:MultiStage", "Coil:Heating:Desuperheater", "Coil:Cooling:Water", "Coil:Cooling:Water:DetailedGeometry", "Coil:Heating:Water", "Coil:Heating:Steam", "CoilSystem:Cooling:Water:HeatExchangerAssisted", "Coil:Cooling:WaterToAirHeatPump:ParameterEstimation", "Coil:Heating:WaterToAirHeatPump:ParameterEstimation", "Coil:Cooling:WaterToAirHeatPump:EquationFit", "Coil:Heating:WaterToAirHeatPump:EquationFit", "Coil:Cooling:DX:VariableRefrigerantFlow", "Coil:Heating:DX:VariableRefrigerantFlow", "Coil:UserDefined", "Coil:Cooling:DX:SingleSpeed:ThermalStorage", "Coil:Cooling:WaterToAirHeatPump:VariableSpeedEquationFit", "Coil:Heating:WaterToAirHeatPump:VariableSpeedEquationFit", "Coil:Cooling:DX:VariableSpeed", "Coil:Heating:DX:VariableSpeed", "Coil:WaterHeating:AirToWaterHeatPump:VariableSpeed", "Coil:Cooling:DX:VariableRefrigerantFlow:FluidTemperatureControl", "Coil:Heating:DX:VariableRefrigerantFlow:FluidTemperatureControl" } ); + Array1D_string const cCoolingCoilTypes( NumAllCoilTypes, { "Coil:Cooling:DX:SingleSpeed", "", "Coil:Cooling:DX:TwoSpeed", "CoilSystem:Cooling:DX:HeatExchangerAssisted", "Coil:Cooling:DX:TwoStageWithHumidityControlMode", "", "", "Coil:Cooling:DX:MultiSpeed", "", "", "", "", "", "", "Coil:Cooling:Water", "Coil:Cooling:Water:DetailedGeometry", "", "", "CoilSystem:Cooling:Water:HeatExchangerAssisted", "Coil:Cooling:WaterToAirHeatPump:ParameterEstimation", "", "Coil:Cooling:WaterToAirHeatPump:EquationFit", "", "Coil:Cooling:DX:VariableRefrigerantFlow", "", "", "Coil:Cooling:DX:SingleSpeed:ThermalStorage", "Coil:Cooling:WaterToAirHeatPump:VariableSpeedEquationFit", "", "Coil:Cooling:DX:VariableSpeed", "", "", "Coil:Cooling:DX:VariableRefrigerantFlow:FluidTemperatureControl", "" } ); + + Array1D_string const cHeatingCoilTypes( NumAllCoilTypes, { "", "Coil:Heating:DX:SingleSpeed", "", "", "", "Coil:WaterHeating:AirToWaterHeatPump:Pumped", "Coil:WaterHeating:AirToWaterHeatPump:Wrapped", "", "Coil:Heating:DX:MultiSpeed", "Coil:Heating:Gas", "Coil:Heating:Gas:MultiStage", "Coil:Heating:Electric", "Coil:Heating:Electric:MultiStage", "Coil:Heating:Desuperheater", "", "", "Coil:Heating:Water", "Coil:Heating:Steam", "", "", "Coil:Heating:WaterToAirHeatPump:ParameterEstimation", "", "Coil:Heating:WaterToAirHeatPump:EquationFit", "", "Coil:Heating:DX:VariableRefrigerantFlow", "", "", "", "Coil:Heating:WaterToAirHeatPump:VariableSpeedEquationFit", "", "Coil:Heating:DX:VariableSpeed", "Coil:WaterHeating:AirToWaterHeatPump:VariableSpeed", "", "Coil:Heating:DX:VariableRefrigerantFlow:FluidTemperatureControl" } ); // Water to air HP coil types int const WatertoAir_Simple( 1 ); diff --git a/src/EnergyPlus/DataHVACGlobals.hh b/src/EnergyPlus/DataHVACGlobals.hh index 99d04cf8fa1..115f741a2bc 100644 --- a/src/EnergyPlus/DataHVACGlobals.hh +++ b/src/EnergyPlus/DataHVACGlobals.hh @@ -229,6 +229,8 @@ namespace DataHVACGlobals { extern int const CoilVRF_FluidTCtrl_Heating; extern Array1D_string const cAllCoilTypes; + extern Array1D_string const cCoolingCoilTypes; + extern Array1D_string const cHeatingCoilTypes; // Water to air HP coil types extern int const WatertoAir_Simple; diff --git a/src/EnergyPlus/DataSizing.hh b/src/EnergyPlus/DataSizing.hh index 179a7c5b4c9..6fdef8da772 100644 --- a/src/EnergyPlus/DataSizing.hh +++ b/src/EnergyPlus/DataSizing.hh @@ -1082,6 +1082,20 @@ namespace DataSizing { int CoolingPeakLoadType; //Type of peak to size cooling coils on 1=SensibleCoolingLoad; 2=TotalCooligLoad int CoolCapControl; // type of control of cooling coil 1=VAV; 2=Bypass; 3=VT; 4=OnOff + Real64 CoinCoolCoilMassFlow; // coincident volume flow at time of cooling coil sensible+latent peak [m3/s] + Real64 CoinHeatCoilMassFlow; // coincident volume flow at time of heating coil sensible peak [m3/s] + Real64 DesCoolCoilVolFlow; // design cooling air volume flow rate at time of coil sens+latent peak [m3/s] + Real64 DesHeatCoilVolFlow; // design heating air volume flow rate at time of coil sens peak [m3/s] + Real64 DesMainCoilVolFlow; // design main supply duct volume flow at time of coil peak [m3/s] + //These are for reporting purposes + + int SysHeatCoilTimeStepPk; // timestep in day of heating coil peak + int SysHeatAirTimeStepPk; // timestep in day of heating airflow peak + int HeatDDNum; // index of design day for heating + int CoolDDNum; // index of design day for cooling + + Real64 SysCoolCoinSpaceSens; // sum of zone space sensible cooling loads at coincident peak + Real64 SysHeatCoinSpaceSens; // sum of zone space sensible heating loads at coincident peak // Default Constructor SystemSizingData() : LoadSizeType( 0 ), @@ -1164,7 +1178,18 @@ namespace DataSizing { CoolingTotalCapacity( 0.0 ), HeatingTotalCapacity( 0.0 ), CoolingPeakLoadType( 0 ), // wfb - CoolCapControl( 0 ) // wfb + CoolCapControl( 0 ), // wfb + CoinCoolCoilMassFlow( 0.0 ), + CoinHeatCoilMassFlow( 0.0 ), + DesCoolCoilVolFlow( 0.0 ), + DesHeatCoilVolFlow( 0.0 ), + DesMainCoilVolFlow( 0.0 ), + SysHeatCoilTimeStepPk( 0 ), + SysHeatAirTimeStepPk( 0 ), + HeatDDNum ( 0 ), + CoolDDNum ( 0 ), + SysCoolCoinSpaceSens( 0.0 ), + SysHeatCoinSpaceSens( 0.0 ) {} }; diff --git a/src/EnergyPlus/FanCoilUnits.cc b/src/EnergyPlus/FanCoilUnits.cc index be8b5ace260..7b752219ac8 100644 --- a/src/EnergyPlus/FanCoilUnits.cc +++ b/src/EnergyPlus/FanCoilUnits.cc @@ -55,6 +55,7 @@ // EnergyPlus Headers #include #include +#include #include #include #include @@ -79,6 +80,7 @@ #include #include #include +#include #include #include #include @@ -927,6 +929,15 @@ namespace FanCoilUnits { SetupOutputVariable( "Fan Coil Availability Status", OutputProcessor::Unit::None, FanCoil( FanCoilNum ).AvailStatus, "System", "Average", FanCoil( FanCoilNum ).Name ); } + for ( FanCoilNum = 1; FanCoilNum <= NumFanCoils; ++FanCoilNum ) { + if ( FanCoil( FanCoilNum ).FanType_Num == DataHVACGlobals::FanType_SystemModelObject ) { + coilSelectionReportObj->setCoilSupplyFanInfo( FanCoil( FanCoilNum ).CCoilName , FanCoil( FanCoilNum ).CCoilType, FanCoil( FanCoilNum ).FanName, DataAirSystems::objectVectorOOFanSystemModel , FanCoil( FanCoilNum ).FanIndex ); + coilSelectionReportObj->setCoilSupplyFanInfo( FanCoil( FanCoilNum ).HCoilName , FanCoil( FanCoilNum ).HCoilType, FanCoil( FanCoilNum ).FanName, DataAirSystems::objectVectorOOFanSystemModel , FanCoil( FanCoilNum ).FanIndex ); + } else { + coilSelectionReportObj->setCoilSupplyFanInfo( FanCoil( FanCoilNum ).CCoilName , FanCoil( FanCoilNum ).CCoilType, FanCoil( FanCoilNum ).FanName, DataAirSystems::structArrayLegacyFanModels , FanCoil( FanCoilNum ).FanIndex ); + coilSelectionReportObj->setCoilSupplyFanInfo( FanCoil( FanCoilNum ).HCoilName , FanCoil( FanCoilNum ).HCoilType, FanCoil( FanCoilNum ).FanName, DataAirSystems::structArrayLegacyFanModels , FanCoil( FanCoilNum ).FanIndex ); + } + } } void @@ -1802,7 +1813,7 @@ namespace FanCoilUnits { FanCoil( FanCoilNum ).DesZoneCoolingLoad = -1.0 * FanCoil( FanCoilNum ).DesCoolingLoad; FanCoil( FanCoilNum ).DesZoneHeatingLoad = FanCoil( FanCoilNum ).DesHeatingLoad; - } + } } } // if ( CurZoneEqNum > 0 ) diff --git a/src/EnergyPlus/HVACDXSystem.cc b/src/EnergyPlus/HVACDXSystem.cc index 6454bdde09e..99016a1ae8f 100644 --- a/src/EnergyPlus/HVACDXSystem.cc +++ b/src/EnergyPlus/HVACDXSystem.cc @@ -55,6 +55,7 @@ #include #include #include +#include //coil report #include #include #include @@ -63,15 +64,18 @@ #include #include #include +#include //coil report #include #include #include +#include //coil report #include #include #include #include #include #include +#include //coil report #include #include #include @@ -619,7 +623,11 @@ namespace HVACDXSystem { // considered as as 100% DOAS DX cooling coil if ( DXCoolingSystem( DXCoolSysNum ).ISHundredPercentDOASDXCoil ) { // set the system DX Coil application type to the child DX coil - SetDXCoilTypeData( DXCoolingSystem( DXCoolSysNum ).CoolingCoilName ); + if ( ! ( DXCoolingSystem( DXCoolSysNum ).CoolingCoilType_Num == Coil_CoolingAirToAirVariableSpeed ) ) { + SetDXCoilTypeData( DXCoolingSystem( DXCoolSysNum ).CoolingCoilName ); + } else { + ShowWarningError( "CoilSystem:Cooling:DX named " + DXCoolingSystem( DXCoolSysNum ).Name + " entered with both variable speed DX coil and outdoor air mode set to YES, however VS coil model does not have a special outdoor air mode" ); + } } // DOAS DX Cooling Coil Leaving Minimum Air Temperature if ( NumNums > 0 ) { @@ -775,6 +783,28 @@ namespace HVACDXSystem { MySetPointCheckFlag = false; } + if ( ! DXCoolingSystem( DXSystemNum ).VSCoilFanInfoSet && AirLoopNum > 0 ) { + if ( DXCoolingSystem( DXSystemNum ).CoolingCoilType_Num == Coil_CoolingAirToAirVariableSpeed ) { + + switch ( DataAirSystems::PrimaryAirSystem( AirLoopNum ).supFanModelTypeEnum ){ + case DataAirSystems::structArrayLegacyFanModels: { + int SupFanNum = DataAirSystems::PrimaryAirSystem( AirLoopNum ).SupFanNum; + if ( SupFanNum > 0 ) { + coilSelectionReportObj->setCoilSupplyFanInfo( DXCoolingSystem( DXSystemNum ).CoolingCoilName, DXCoolingSystem( DXSystemNum ).CoolingCoilType, Fans::Fan( DataAirSystems::PrimaryAirSystem( AirLoopNum ).SupFanNum ).FanName, DataAirSystems::structArrayLegacyFanModels, DataAirSystems::PrimaryAirSystem( AirLoopNum ).SupFanNum ); + } + + break; + } + case DataAirSystems::objectVectorOOFanSystemModel: { + if ( DataAirSystems::PrimaryAirSystem( AirLoopNum ).supFanVecIndex >= 0 ) { + coilSelectionReportObj->setCoilSupplyFanInfo( DXCoolingSystem( DXSystemNum ).CoolingCoilName, DXCoolingSystem( DXSystemNum ).CoolingCoilType, HVACFan::fanObjs[ DataAirSystems::PrimaryAirSystem( AirLoopNum ).supFanVecIndex ]->name, DataAirSystems::objectVectorOOFanSystemModel, DataAirSystems::PrimaryAirSystem( AirLoopNum ).supFanVecIndex ); + } + break; + } + } + DXCoolingSystem( DXSystemNum ).VSCoilFanInfoSet = true; + } + } // else if ( ) on OA system ?? // These initializations are done every iteration if ( AirLoopNum == -1 ) { // This IF-TEHN routine is just for ZoneHVAC:OUTDOORAIRUNIT OutNode = DXCoolingSystem( DXSystemNum ).DXCoolingCoilOutletNodeNum; @@ -2890,8 +2920,9 @@ namespace HVACDXSystem { if ( NumDXSystem > 0 ) { DXCoolSysNum = FindItemInList( DXCoilSysName, DXCoolingSystem ); if ( DXCoolSysNum > 0 && DXCoolingSystem( DXCoolSysNum ).ISHundredPercentDOASDXCoil ) { - //DXCoolingSystem(DXCoolSysNum)%ISHundredPercentDOASDXCoil = .TRUE. - SetDXCoilTypeData( DXCoolingSystem( DXCoolSysNum ).CoolingCoilName ); + if ( ! ( DXCoolingSystem( DXCoolSysNum ).CoolingCoilType_Num == Coil_CoolingAirToAirVariableSpeed ) ) { + SetDXCoilTypeData( DXCoolingSystem( DXCoolSysNum ).CoolingCoilName ); + } } } diff --git a/src/EnergyPlus/HVACDXSystem.hh b/src/EnergyPlus/HVACDXSystem.hh index d67dfcf8367..03b3f0a5486 100644 --- a/src/EnergyPlus/HVACDXSystem.hh +++ b/src/EnergyPlus/HVACDXSystem.hh @@ -189,6 +189,8 @@ namespace HVACDXSystem { int FaultyCoilSATIndex; // Index of the fault object corresponding to the coil Real64 FaultyCoilSATOffset; // Coil SAT sensor offset + bool VSCoilFanInfoSet; // flag to indicate if Coil System has set fan info in VS DX coil model + // Default Constructor DXCoolingConditions() : SchedPtr( 0 ), @@ -253,7 +255,9 @@ namespace HVACDXSystem { TESOpMode( 0 ), FaultyCoilSATFlag( false ), FaultyCoilSATIndex( 0 ), - FaultyCoilSATOffset( 0.0 ) + FaultyCoilSATOffset( 0.0 ), + VSCoilFanInfoSet( false ) + {} }; diff --git a/src/EnergyPlus/HVACUnitaryBypassVAV.cc b/src/EnergyPlus/HVACUnitaryBypassVAV.cc index 67b2aee6936..f1831194349 100644 --- a/src/EnergyPlus/HVACUnitaryBypassVAV.cc +++ b/src/EnergyPlus/HVACUnitaryBypassVAV.cc @@ -421,7 +421,12 @@ namespace HVACUnitaryBypassVAV { } Real64 locFanElecPower = 0.0; - locFanElecPower = Fans::GetFanPower( CBVAV( CBVAVNum ).FanIndex ); + if ( CBVAV( CBVAVNum ).FanType_Num == DataHVACGlobals::FanType_SystemModelObject ) { + locFanElecPower = HVACFan::fanObjs[ CBVAV( CBVAVNum ).FanIndex ]->fanPower(); + } else { + locFanElecPower = Fans::GetFanPower( CBVAV( CBVAVNum ).FanIndex ); + } + CBVAV( CBVAVNum ).ElecPower = locFanElecPower + DXElecCoolingPower + HeatingPower; } diff --git a/src/EnergyPlus/HVACUnitarySystem.cc b/src/EnergyPlus/HVACUnitarySystem.cc index 9f2c1512e07..5d045e339e8 100644 --- a/src/EnergyPlus/HVACUnitarySystem.cc +++ b/src/EnergyPlus/HVACUnitarySystem.cc @@ -90,6 +90,7 @@ #include #include #include +#include #include #include #include @@ -2765,6 +2766,7 @@ namespace HVACUnitarySystem { using VariableSpeedCoils::GetVSCoilCondenserInletNode; using VariableSpeedCoils::GetVSCoilMinOATCompressor; using VariableSpeedCoils::GetVSCoilNumOfSpeeds; + using VariableSpeedCoils::setVarSpeedFanInfo; auto & GetWtoAHPCoilCapacity( WaterToAirHeatPump::GetCoilCapacity ); auto & GetWtoAHPCoilInletNode( WaterToAirHeatPump::GetCoilInletNode ); auto & GetWtoAHPCoilOutletNode( WaterToAirHeatPump::GetCoilOutletNode ); @@ -3506,7 +3508,7 @@ namespace HVACUnitarySystem { //Get fan data FanType = Alphas( iFanTypeAlphaNum ); FanName = Alphas( iFanNameAlphaNum ); - UnitarySystem( UnitarySysNum ).fanName = FanName; //TRANE, for coil selection report + UnitarySystem( UnitarySysNum ).fanName = FanName; // for coil selection report if ( ! lAlphaBlanks( iFanTypeAlphaNum ) ) { if ( SameString( FanType, "Fan:SystemModel" ) ) { if ( ! HVACFan::checkIfFanNameIsAFanSystem( FanName ) ) { @@ -3667,6 +3669,7 @@ namespace HVACUnitarySystem { } HeatingCoilPLFCurveIndex = 0; UnitarySystem( UnitarySysNum ).HeatingCoilName = HeatingCoilName; + UnitarySystem( UnitarySysNum ).HeatingCoilTypeName = HeatingCoilType; // for coil selection report if ( ! lAlphaBlanks( iHeatingCoilTypeAlphaNum ) ) { UnitarySystem( UnitarySysNum ).HeatCoilExists = true; PrintMessage = false; @@ -4371,6 +4374,15 @@ namespace HVACUnitarySystem { if ( UnitarySystem( UnitarySysNum ).HeatingCoilType_Num == Coil_HeatingAirToAirVariableSpeed || UnitarySystem( UnitarySysNum ).HeatingCoilType_Num == Coil_HeatingWaterToAirHPVSEquationFit || UnitarySystem( UnitarySysNum ).HeatingCoilType_Num == Coil_HeatingWaterToAirHP || UnitarySystem( UnitarySysNum ).HeatingCoilType_Num == Coil_HeatingWaterToAirHPSimple || UnitarySystem( UnitarySysNum ).HeatingCoilType_Num == CoilDX_MultiSpeedHeating || UnitarySystem( UnitarySysNum ).HeatingCoilType_Num == CoilDX_HeatingEmpirical ) { UnitarySystem( UnitarySysNum ).HeatPump = true; } + + //set fan info for heating coils + if ( UnitarySystem( UnitarySysNum ).FanExists ) { + if ( UnitarySystem( UnitarySysNum ).FanType_Num == DataHVACGlobals::FanType_SystemModelObject ) { + coilSelectionReportObj->setCoilSupplyFanInfo( UnitarySystem( UnitarySysNum ).HeatingCoilName, UnitarySystem( UnitarySysNum ).HeatingCoilTypeName, UnitarySystem( UnitarySysNum ).fanName ,DataAirSystems::objectVectorOOFanSystemModel, UnitarySystem( UnitarySysNum ).FanIndex ); + } else { + coilSelectionReportObj->setCoilSupplyFanInfo( UnitarySystem( UnitarySysNum ).HeatingCoilName, UnitarySystem( UnitarySysNum ).HeatingCoilTypeName, UnitarySystem( UnitarySysNum ).fanName ,DataAirSystems::structArrayLegacyFanModels, UnitarySystem( UnitarySysNum ).FanIndex ); + } + } } } // IF (IsNotOK) THEN @@ -4677,6 +4689,10 @@ namespace HVACUnitarySystem { ErrorsFound = true; } + //Set fan info + if ( UnitarySystem( UnitarySysNum ).FanExists ) { + VariableSpeedCoils::setVarSpeedFanInfo( UnitarySystem( UnitarySysNum ).CoolingCoilIndex, FanName, UnitarySystem( UnitarySysNum ).FanIndex, UnitarySystem( UnitarySysNum ).FanType_Num ); + } } if ( errFlag ) { @@ -5110,7 +5126,10 @@ namespace HVACUnitarySystem { // considered as as 100% DOAS DX cooling coil if ( UnitarySystem( UnitarySysNum ).ISHundredPercentDOASDXCoil ) { // set the system DX Coil application type to the child DX coil - SetDXCoilTypeData( UnitarySystem( UnitarySysNum ).CoolingCoilName ); + if ( ! ( UnitarySystem( UnitarySysNum ).CoolingCoilType_Num == Coil_CoolingAirToAirVariableSpeed || UnitarySystem( UnitarySysNum ).CoolingCoilType_Num == Coil_CoolingWaterToAirHPVSEquationFit ) ) { + SetDXCoilTypeData( UnitarySystem( UnitarySysNum ).CoolingCoilName ); + } + } // DOAS DX Cooling Coil Leaving Minimum Air Temperature if ( NumNumbers > 0 ) { @@ -5157,6 +5176,7 @@ namespace HVACUnitarySystem { SuppHeatCoilType = Alphas( iSuppHeatCoilTypeAlphaNum ); SuppHeatCoilName = Alphas( iSuppHeatCoilNameAlphaNum ); UnitarySystem( UnitarySysNum ).SuppHeatCoilName = SuppHeatCoilName; + UnitarySystem( UnitarySysNum ).SuppHeatCoilTypeName = SuppHeatCoilType; errFlag = false; if ( SameString( SuppHeatCoilType, "Coil:Heating:Water" ) ) { @@ -5385,6 +5405,15 @@ namespace HVACUnitarySystem { // Add supplemental heating coil to component sets array if ( UnitarySystem( UnitarySysNum ).SuppCoilExists ) SetUpCompSets( CurrentModuleObject, Alphas( iNameAlphaNum ), Alphas( iSuppHeatCoilTypeAlphaNum ), Alphas( iSuppHeatCoilNameAlphaNum ), NodeID( SupHeatCoilInletNode ), NodeID( SupHeatCoilOutletNode ) ); + // set fan info for heating coils + if ( UnitarySystem( UnitarySysNum ).SuppCoilExists && UnitarySystem( UnitarySysNum ).FanExists ) { + if ( UnitarySystem( UnitarySysNum ).FanType_Num == DataHVACGlobals::FanType_SystemModelObject ) { + coilSelectionReportObj->setCoilSupplyFanInfo( UnitarySystem( UnitarySysNum ).SuppHeatCoilName, UnitarySystem( UnitarySysNum ).SuppHeatCoilTypeName, UnitarySystem( UnitarySysNum ).fanName ,DataAirSystems::objectVectorOOFanSystemModel, UnitarySystem( UnitarySysNum ).FanIndex ); + } else { + coilSelectionReportObj->setCoilSupplyFanInfo( UnitarySystem( UnitarySysNum ).SuppHeatCoilName, UnitarySystem( UnitarySysNum ).SuppHeatCoilTypeName, UnitarySystem( UnitarySysNum ).fanName ,DataAirSystems::structArrayLegacyFanModels, UnitarySystem( UnitarySysNum ).FanIndex ); + } + } + // Users may not provide SA flow input fields (below) and leave them blank. Check if other coil is autosized first to alieviate input requirements. // check if coil has no air flow input (VolFlow = 0) and other coil is autosized. If so, use autosize for coil with 0 air flow rate. // This means that the coils MUST mine the air flow rate if it exists @@ -13656,7 +13685,10 @@ namespace HVACUnitarySystem { UnitarySysNum = FindItemInList( UnitarySysName, UnitarySystem ); if ( UnitarySysNum > 0 ) { if ( UnitarySystem( UnitarySysNum ).ISHundredPercentDOASDXCoil ) { - SetDXCoilTypeData( UnitarySystem( UnitarySysNum ).CoolingCoilName ); + + if ( ! ( UnitarySystem( UnitarySysNum ).CoolingCoilType_Num == Coil_CoolingAirToAirVariableSpeed || UnitarySystem( UnitarySysNum ).CoolingCoilType_Num == Coil_CoolingWaterToAirHPVSEquationFit ) ) { + SetDXCoilTypeData( UnitarySystem( UnitarySysNum ).CoolingCoilName ); + } } } else { ShowSevereError( RoutineName + "System not found = AirloopHVAC:UnitarySystem \"" + UnitarySysName + "\"" ); diff --git a/src/EnergyPlus/HVACUnitarySystem.hh b/src/EnergyPlus/HVACUnitarySystem.hh index f401e9c8be2..99c9c49e94f 100644 --- a/src/EnergyPlus/HVACUnitarySystem.hh +++ b/src/EnergyPlus/HVACUnitarySystem.hh @@ -243,6 +243,7 @@ namespace HVACUnitarySystem { Real64 CoolCompPartLoadRatio; // Unitary system compressor part load ratio in cooling // Heating coil specific data std::string HeatingCoilName; // coil name (eliminate after blank is accepted in CALL) + std::string HeatingCoilTypeName; // coil type class name int HeatingCoilType_Num; // numeric coil type int HeatingCoilIndex; // index to specific heating coil Real64 DesignHeatingCapacity; // heating coil capacity (W) @@ -265,6 +266,7 @@ namespace HVACUnitarySystem { Real64 HeatCompPartLoadRatio; // Unitary system compressor part load ratio in heating // Supplemental heating coil specific data std::string SuppHeatCoilName; // coil name (eliminate after blank is accepted in CALL) + std::string SuppHeatCoilTypeName; // coil type class name int SuppHeatCoilType_Num; // numeric coil type int SuppHeatCoilIndex; // index to specific supplemental heating coil Real64 DesignSuppHeatingCapacity; // supplemental heating coil capacity (W) @@ -281,7 +283,7 @@ namespace HVACUnitarySystem { int SuppCoilBranchNum; // Branch of number of the supplemental coil in the plant loop int SuppCoilCompNum; // Comp num of the supplemental coil in the plant loop // fan specific data - std::string fanName; // TRANE + std::string fanName; int FanType_Num; // Fan type num i.e. OnOff, ConstVol, VAV int FanIndex; // index of fan of a particular type Real64 ActualFanVolFlowRate; // Actual or design fan volume flow rate diff --git a/src/EnergyPlus/HeatingCoils.cc b/src/EnergyPlus/HeatingCoils.cc index 0d1d6193a7f..cfe9768be71 100644 --- a/src/EnergyPlus/HeatingCoils.cc +++ b/src/EnergyPlus/HeatingCoils.cc @@ -83,6 +83,7 @@ #include #include #include +#include namespace EnergyPlus { @@ -2523,6 +2524,23 @@ namespace HeatingCoils { HeatingCoil( CoilNum ).ParasiticFuelLoad = HeatingCoil( CoilNum ).ParasiticFuelRate * ReportingConstant; + std::string coilObjClassName; + { auto const SELECT_CASE_var( HeatingCoil( CoilNum ).HCoilType_Num ); + if ( SELECT_CASE_var == Coil_HeatingElectric ) { + coilObjClassName = "Coil:Heating:Electric" ; + } else if ( SELECT_CASE_var == Coil_HeatingElectric_MultiStage ) { + coilObjClassName = "Coil:Heating:Electric:MultiStage" ; + } else if ( SELECT_CASE_var == Coil_HeatingGasOrOtherFuel ) { + coilObjClassName = "Coil:Heating:Fuel" ; + } else if ( SELECT_CASE_var == Coil_HeatingGas_MultiStage ) { + coilObjClassName = "Coil:Heating:Gas:MultiStage" ; + } else if ( SELECT_CASE_var == Coil_HeatingDesuperheater ) { + coilObjClassName = "Coil:Heating:Desuperheater" ; + }} + if ( ! DataGlobals::WarmupFlag && ! DataGlobals::DoingHVACSizingSimulations && ! DataGlobals::DoingSizing && HeatingCoil(CoilNum).reportCoilFinalSizes ) { + coilSelectionReportObj->setCoilFinalSizes( HeatingCoil(CoilNum).Name,coilObjClassName, HeatingCoil(CoilNum).NominalCapacity, HeatingCoil(CoilNum).NominalCapacity, -999.0 , -999.0 ); + HeatingCoil(CoilNum).reportCoilFinalSizes = false; + } } // End of Reporting subroutines for the HeatingCoil Module diff --git a/src/EnergyPlus/HeatingCoils.hh b/src/EnergyPlus/HeatingCoils.hh index 11195f190ea..6b9d685a002 100644 --- a/src/EnergyPlus/HeatingCoils.hh +++ b/src/EnergyPlus/HeatingCoils.hh @@ -166,6 +166,8 @@ namespace HeatingCoils { int FaultyCoilSATIndex; // Index of the fault object corresponding to the coil Real64 FaultyCoilSATOffset; // Coil SAT sensor offset + bool reportCoilFinalSizes; //one time report of sizes to coil report + // Default Constructor HeatingCoilEquipConditions() : HCoilType_Num( 0 ), @@ -212,7 +214,9 @@ namespace HeatingCoils { DesiccantDehumNum( 0 ), FaultyCoilSATFlag( false ), FaultyCoilSATIndex( 0 ), - FaultyCoilSATOffset( 0.0 ) + FaultyCoilSATOffset( 0.0 ), + reportCoilFinalSizes( true ) + {} }; diff --git a/src/EnergyPlus/OutputReportPredefined.cc b/src/EnergyPlus/OutputReportPredefined.cc index 5d9d93aff42..a7cdf439cba 100644 --- a/src/EnergyPlus/OutputReportPredefined.cc +++ b/src/EnergyPlus/OutputReportPredefined.cc @@ -105,6 +105,8 @@ namespace OutputReportPredefined { int pdchFanEndUse; int pdchFanPwr; int pdchFanPwrPerFlow; + int pdchFanDesDay; + int pdchFanPkTime; // Pump subtable int pdstPump; int pdchPumpType; @@ -338,6 +340,115 @@ namespace OutputReportPredefined { int pdchPlantSizPkTimeHour; int pdchPlantSizPkTimeDayOfSim; int pdchPlantSizPkTimeMin; + // Coil Selection Table + int pdrCoilSummaryTable; + int pdstCoilSummaryCoilSelection; + int pdchCoilLocation; + int pdchCoilHVACType; + int pdchCoilHVACName; + int pdchCoilZoneName; + int pdchCoilName; + int pdchCoilType; + int pdchSysSizingMethCoinc; + int pdchSysSizingMethCap; + int pdchSysSizingMethAir; + + int pdchCoilIsCapAutosized; + int pdchCoilIsAirFlowAutosized; + int pdchCoilIsWaterFlowAutosized; + int pdchCoilIsOATreated; + int pdchCoilFinalTotalCap; + int pdchCoilFinalSensCap; + int pdchCoilFinalAirVolFlowRate; + int pdchCoilFinalPlantVolFlowRate; + + int pdchCoilDDnameSensIdealPeak; + int pdchCoilDateTimeSensIdealPeak; + int pdchCoilDDnameTotIdealPeak; + int pdchCoilDateTimeTotIdealPeak; + int pdchCoilDDnameAirFlowIdealPeak; + int pdchCoilDateTimeAirFlowIdealPeak; + int pdchCoilTotalCapIdealPeak; + int pdchCoilSensCapIdealPeak; + int pdchCoilAirMassFlowIdealPeak; + int pdchCoilAirVolumeFlowIdealPeak; + int pdchCoilEntDryBulbIdealPeak; + int pdchCoilEntWetBulbIdealPeak; + int pdchCoilEntHumRatIdealPeak; + int pdchCoilEntEnthalpyIdealPeak; + int pdchCoilLvgDryBulbIdealPeak; + int pdchCoilLvgWetBulbIdealPeak; + int pdchCoilLvgHumRatIdealPeak; + int pdchCoilLvgEnthalpyIdealPeak; + int pdchCoilWaterMassFlowIdealPeak; + int pdchCoilEntWaterTempIdealPeak; + int pdchCoilLvgWaterTempIdealPeak; + int pdchCoilWaterDeltaTempIdealPeak; + int pdchCoilRatedTotalCap; + int pdchCoilRatedSensCap; + int pdchCoilOffRatingCapacityModifierIdealPeak; + int pdchCoilOffRatingCapacityModifierSimPeak; + int pdchCoilRatedAirMass; + int pdchCoilRatedEntDryBulb; + int pdchCoilRatedEntWetBulb; + int pdchCoilRatedEntHumRat; + int pdchCoilRatedEntEnthalpy; + int pdchCoilRatedLvgDryBulb; + int pdchCoilRatedLvgWetBulb; + int pdchCoilRatedLvgHumRat; + int pdchCoilRatedLvgEnthalpy; + int pdchCoilRatedWaterMass; + int pdchCoilRatedEntWaterTemp; + int pdchCoilRatedLvgWaterTemp; + int pdchCoilRatedWaterDeltaTemp; + + + int pdchFanAssociatedWithCoilName; + int pdchFanAssociatedWithCoilType; + int pdchFanAssociatedVdotSize; + int pdchFanAssociatedMdotSize; + + int pdchFanHeatGainIdealPeak; + int pdchCoilNetTotalCapacityIdealPeak; + + + + int pdchCoilPlantLoopName; + + int pdchPlantMassFlowMaximum; + int pdchPlantRetTempDesign; + int pdchPlantSupTempDesign; + int pdchPlantDeltaTempDesign; + int pdchPlantCapacity; + int pdchCoilCapPrcntPlantCapacity; + int pdchCoilFlowPrcntPlantFlow; + int pdchOADryBulbIdealPeak; + int pdchOAHumRatIdealPeak; + int pdchOAWetBulbatIdealPeak; + int pdchOAVolFlowIdealPeak; + int pdchOAFlowPrcntIdealPeak; + int pdchOABarometricPressureIdealPeak; + + int pdchAirSysRADryBulbIdealPeak; + int pdchAirSysRAHumRatIdealPeak; + int pdchZoneAirTempIdealPeak; + int pdchZoneAirDryBulbIdealPeak; + int pdchZoneAirHumRatIdealPeak; + int pdchZoneAirRelHumIdealPeak; +// int pdchAirSysFanHeatGain; + int pdchCoilUA; + int pdchZoneSensibleLoadIdealPeak; + int pdchZoneLatentLoadIdealPeak; + int pdchCoilIdealSizCapOverSimPeak; + int pdchCoilIdealSizCapUnderSimPeak; + int pdchReheatCoilMultiplier; + int pdchFlowCapRatioLowCapIncreaseRatio; + int pdchFlowCapRatioHiCapDecreaseRatio; + int pdchPlantFluidSpecificHeat; + int pdchPlantFluidDensity; + int pdchMoistAirSpecificHeat; + int pdchDryAirSpecificHeat; + int pdchStandRhoAir; //System summary int pdrSystem; @@ -767,6 +878,8 @@ namespace OutputReportPredefined { pdchFanEndUse = 0; pdchFanPwr = 0; pdchFanPwrPerFlow = 0; + pdchFanDesDay = 0; + pdchFanPkTime = 0; pdstPump = 0; pdchPumpType = 0; pdchPumpControl = 0; @@ -967,6 +1080,108 @@ namespace OutputReportPredefined { pdchPlantSizPkTimeHour = 0; pdchPlantSizPkTimeDayOfSim = 0; pdchPlantSizPkTimeMin = 0; + + pdrCoilSummaryTable = 0; + pdstCoilSummaryCoilSelection = 0; + pdchCoilLocation = 0; + pdchCoilHVACType = 0; + pdchCoilHVACName = 0; + pdchCoilZoneName = 0; + pdchCoilName = 0; + pdchCoilType = 0; + pdchSysSizingMethCoinc = 0; + pdchSysSizingMethCap = 0; + pdchSysSizingMethAir = 0; + pdchCoilIsCapAutosized = 0; + pdchCoilIsAirFlowAutosized = 0; + pdchCoilIsWaterFlowAutosized = 0; + pdchCoilIsOATreated = 0; + pdchCoilFinalTotalCap = 0; + pdchCoilFinalSensCap = 0; + pdchCoilFinalAirVolFlowRate = 0; + pdchCoilFinalPlantVolFlowRate = 0; + pdchCoilDDnameSensIdealPeak = 0; + pdchCoilDateTimeSensIdealPeak = 0; + pdchCoilDDnameTotIdealPeak = 0; + pdchCoilDateTimeTotIdealPeak = 0; + pdchCoilDDnameAirFlowIdealPeak = 0; + pdchCoilDateTimeAirFlowIdealPeak = 0; + pdchCoilTotalCapIdealPeak = 0; + pdchCoilSensCapIdealPeak = 0; + pdchCoilAirMassFlowIdealPeak = 0; + pdchCoilAirVolumeFlowIdealPeak = 0; + pdchCoilEntDryBulbIdealPeak = 0; + pdchCoilEntWetBulbIdealPeak = 0; + pdchCoilEntHumRatIdealPeak = 0; + pdchCoilEntEnthalpyIdealPeak = 0; + pdchCoilLvgDryBulbIdealPeak = 0; + pdchCoilLvgWetBulbIdealPeak = 0; + pdchCoilLvgHumRatIdealPeak = 0; + pdchCoilLvgEnthalpyIdealPeak = 0; + pdchCoilWaterMassFlowIdealPeak = 0; + pdchCoilEntWaterTempIdealPeak = 0; + pdchCoilLvgWaterTempIdealPeak = 0; + pdchCoilWaterDeltaTempIdealPeak = 0; + pdchCoilRatedTotalCap = 0; + pdchCoilRatedSensCap = 0; + pdchCoilOffRatingCapacityModifierIdealPeak = 0; + + pdchCoilRatedAirMass = 0; + pdchCoilRatedEntDryBulb = 0; + pdchCoilRatedEntWetBulb = 0; + pdchCoilRatedEntHumRat = 0; + pdchCoilRatedEntEnthalpy = 0; + pdchCoilRatedLvgDryBulb = 0; + pdchCoilRatedLvgWetBulb = 0; + pdchCoilRatedLvgHumRat = 0; + pdchCoilRatedLvgEnthalpy = 0; + pdchCoilRatedWaterMass = 0; + pdchCoilRatedEntWaterTemp = 0; + pdchCoilRatedLvgWaterTemp = 0; + pdchCoilRatedWaterDeltaTemp = 0; + + pdchFanAssociatedWithCoilName = 0; + pdchFanAssociatedWithCoilType = 0; + pdchFanAssociatedVdotSize = 0; + pdchFanAssociatedMdotSize = 0; + + pdchFanHeatGainIdealPeak = 0; + pdchCoilNetTotalCapacityIdealPeak = 0; + + pdchCoilPlantLoopName = 0; + + pdchPlantMassFlowMaximum = 0; + pdchPlantRetTempDesign = 0; + pdchPlantSupTempDesign = 0; + pdchPlantDeltaTempDesign = 0; + pdchPlantCapacity = 0; + pdchCoilCapPrcntPlantCapacity = 0; + pdchCoilFlowPrcntPlantFlow = 0; + pdchOADryBulbIdealPeak = 0; + pdchOAWetBulbatIdealPeak = 0; + pdchOAHumRatIdealPeak = 0; + pdchOAVolFlowIdealPeak = 0; + pdchOAFlowPrcntIdealPeak = 0; + pdchAirSysRADryBulbIdealPeak = 0; + pdchAirSysRAHumRatIdealPeak = 0; + pdchZoneAirTempIdealPeak = 0; + pdchZoneAirDryBulbIdealPeak = 0; + pdchZoneAirHumRatIdealPeak = 0; + pdchZoneAirRelHumIdealPeak = 0; +// pdchAirSysFanHeatGain = 0; + pdchCoilUA = 0; + pdchZoneSensibleLoadIdealPeak = 0; + pdchZoneLatentLoadIdealPeak = 0; + + pdchReheatCoilMultiplier = 0; + pdchFlowCapRatioLowCapIncreaseRatio = 0; + pdchFlowCapRatioHiCapDecreaseRatio = 0; + pdchPlantFluidSpecificHeat = 0; + pdchPlantFluidDensity = 0; + pdchMoistAirSpecificHeat = 0; + pdchDryAirSpecificHeat = 0; + pdchStandRhoAir = 0; + pdrSystem = 0; pdstEconomizer = 0; pdchEcoKind = 0; @@ -1569,6 +1784,8 @@ namespace OutputReportPredefined { pdchFanPwrPerFlow = newPreDefColumn( pdstFan, "Rated Power Per Max Air Flow Rate [W-s/m3]" ); pdchFanMotorIn = newPreDefColumn( pdstFan, "Motor Heat In Air Fraction" ); pdchFanEndUse = newPreDefColumn( pdstFan, "End Use" ); + pdchFanDesDay = newPreDefColumn( pdstFan, "Design Day Name for Fan Sizing Peak" ); + pdchFanPkTime = newPreDefColumn( pdstFan, "Date/Time for Fan Sizing Peak" ); pdstPump = newPreDefSubTable( pdrEquip, "Pumps" ); pdchPumpType = newPreDefColumn( pdstPump, "Type" ); @@ -1641,6 +1858,114 @@ namespace OutputReportPredefined { pdchPlantSizPkTimeHour = newPreDefColumn( pdstPlantSize, "Peak Hour Of Day {TIMESTAMP}[hr]" ); pdchPlantSizPkTimeMin = newPreDefColumn( pdstPlantSize, "Peak Step Start Minute {TIMESTAMP}[min]" ); + pdstCoilSummaryCoilSelection = newPreDefSubTable( pdrSizing, "Coil Sizing Summary Report" ); + // coil meta data information + // the first column will be the coil name, the unique user name from input. It has no header or column definition + pdchCoilType = newPreDefColumn( pdstCoilSummaryCoilSelection, "Coil Type" ); + pdchCoilLocation = newPreDefColumn( pdstCoilSummaryCoilSelection, "Coil Location" ); + pdchCoilHVACType = newPreDefColumn( pdstCoilSummaryCoilSelection, "HVAC Type" ); + pdchCoilHVACName = newPreDefColumn( pdstCoilSummaryCoilSelection, "HVAC Name" ); + pdchCoilZoneName = newPreDefColumn( pdstCoilSummaryCoilSelection, "Zone Name(s)" ); + + pdchSysSizingMethCoinc = newPreDefColumn( pdstCoilSummaryCoilSelection, "System Sizing Method Concurrence" ); + pdchSysSizingMethCap = newPreDefColumn( pdstCoilSummaryCoilSelection, "System Sizing Method Capacity" ); + pdchSysSizingMethAir = newPreDefColumn( pdstCoilSummaryCoilSelection, "System Sizing Method Air Flow" ); + + pdchCoilIsCapAutosized = newPreDefColumn( pdstCoilSummaryCoilSelection, "Autosized Coil Capacity?" ); + pdchCoilIsAirFlowAutosized = newPreDefColumn( pdstCoilSummaryCoilSelection, "Autosized Coil Airflow?" ); + pdchCoilIsWaterFlowAutosized = newPreDefColumn( pdstCoilSummaryCoilSelection, "Autosized Coil Water Flow?" ); + pdchCoilIsOATreated = newPreDefColumn( pdstCoilSummaryCoilSelection, "OA Pretreated prior to coil inlet?" ); + + //coil Final size summary, regardless of how determined ( +// get rid of these, this will be the same as At Rating Conditions. + pdchCoilFinalTotalCap = newPreDefColumn( pdstCoilSummaryCoilSelection, "Coil Final Gross Total Capacity [W]" ); + pdchCoilFinalSensCap = newPreDefColumn( pdstCoilSummaryCoilSelection, "Coil Final Gross Sensible Capacity [W]" ); + pdchCoilFinalAirVolFlowRate = newPreDefColumn( pdstCoilSummaryCoilSelection, "Coil Final Reference Air Volume Flow Rate [m3/s]" ); + pdchCoilFinalPlantVolFlowRate = newPreDefColumn( pdstCoilSummaryCoilSelection, "Coil Final Reference Plant Fluid Volume Flow Rate [m3/s]" ); + + + + //Misc Design output + pdchCoilUA = newPreDefColumn(pdstCoilSummaryCoilSelection, "Coil U-value Times Area Value [W/K]"); + pdchReheatCoilMultiplier = newPreDefColumn(pdstCoilSummaryCoilSelection, "Terminal Unit Reheat Coil Multiplier"); + pdchFlowCapRatioLowCapIncreaseRatio = newPreDefColumn(pdstCoilSummaryCoilSelection, "DX Coil Capacity Increase Ratio from Too Low Flow/Capacity Ratio"); + pdchFlowCapRatioHiCapDecreaseRatio = newPreDefColumn(pdstCoilSummaryCoilSelection, "DX Coil Capacity Decrease Ratio from Too High Flow/Capacity Ratio"); + + pdchMoistAirSpecificHeat = newPreDefColumn(pdstCoilSummaryCoilSelection, "Moist Air Heat Capacity [J/kg-K]"); // standard? for ideal sizing calcs? + pdchDryAirSpecificHeat = newPreDefColumn(pdstCoilSummaryCoilSelection, "Dry Air Heat Capacity [J/kg-K]"); // standard? for ideal sizing calcs? + pdchStandRhoAir = newPreDefColumn(pdstCoilSummaryCoilSelection, "Standard Air Density Adjusted for Elevation [kg/m3]"); + + //Fan info for coil + pdchFanAssociatedWithCoilName = newPreDefColumn( pdstCoilSummaryCoilSelection, "Supply Fan Name for Coil" ); + pdchFanAssociatedWithCoilType = newPreDefColumn( pdstCoilSummaryCoilSelection, "Supply Fan Type for Coil" ); + pdchFanAssociatedVdotSize = newPreDefColumn( pdstCoilSummaryCoilSelection, "Supply Fan Maximum Air Volume Flow Rate [m3/s]" ); + pdchFanAssociatedMdotSize = newPreDefColumn( pdstCoilSummaryCoilSelection, "Supply Fan Maximum Air Mass Flow Rate [kg/s]" ); + + //Plant info for coil + pdchCoilPlantLoopName = newPreDefColumn( pdstCoilSummaryCoilSelection, "Plant Name for Coil" ); + pdchPlantFluidSpecificHeat = newPreDefColumn( pdstCoilSummaryCoilSelection, "Plant Fluid Specific Heat Capacity [J/kg-K]" );// standard/inits ? + pdchPlantFluidDensity = newPreDefColumn( pdstCoilSummaryCoilSelection, "Plant Fluid Density [kg/m3]" );// standard/inits ? for ideal sizing calcs? + pdchPlantMassFlowMaximum = newPreDefColumn( pdstCoilSummaryCoilSelection, "Plant Maximum Fluid Mass Flow Rate [kg/s]" ); + pdchPlantRetTempDesign = newPreDefColumn( pdstCoilSummaryCoilSelection, "Plant Design Fluid Return Temperature [C]" ); + pdchPlantSupTempDesign = newPreDefColumn( pdstCoilSummaryCoilSelection, "Plant Design Fluid Supply Temperature [C]" ); + pdchPlantDeltaTempDesign = newPreDefColumn( pdstCoilSummaryCoilSelection, "Plant Design Fluid Temperature Difference [Delta C]" ); + pdchPlantCapacity = newPreDefColumn( pdstCoilSummaryCoilSelection, "Plant Design Capacity [W]" ); + pdchCoilCapPrcntPlantCapacity = newPreDefColumn( pdstCoilSummaryCoilSelection, "Coil Capacity Percentage of Plant Design Capacity [%]" ); + pdchCoilFlowPrcntPlantFlow = newPreDefColumn( pdstCoilSummaryCoilSelection, "Coil Fluid Flow Rate Percentage of Plant Design Flow Rate [%]" ); + + //results from regular zone and system sizing calcs, "At Ideal Loads Peak" + pdchCoilDDnameSensIdealPeak = newPreDefColumn( pdstCoilSummaryCoilSelection, "Design Day Name at Sensible Ideal Loads Peak" ); + pdchCoilDateTimeSensIdealPeak = newPreDefColumn( pdstCoilSummaryCoilSelection, "Date/Time at Sensible Ideal Loads Peak" ); + pdchCoilDDnameTotIdealPeak = newPreDefColumn( pdstCoilSummaryCoilSelection, "Design Day Name at Total Ideal Loads Peak" ); + pdchCoilDateTimeTotIdealPeak = newPreDefColumn( pdstCoilSummaryCoilSelection, "Date/Time at Total Ideal Loads Peak" ); + pdchCoilDDnameAirFlowIdealPeak = newPreDefColumn( pdstCoilSummaryCoilSelection, "Design Day Name at Air Flow Ideal Loads Peak" ); + pdchCoilDateTimeAirFlowIdealPeak = newPreDefColumn( pdstCoilSummaryCoilSelection, "Date/Time at Air Flow Ideal Loads Peak" ); + + pdchCoilTotalCapIdealPeak = newPreDefColumn( pdstCoilSummaryCoilSelection, "Coil Total Capacity at Ideal Loads Peak [W]" ); + pdchCoilSensCapIdealPeak = newPreDefColumn( pdstCoilSummaryCoilSelection, "Coil Sensible Capacity at Ideal Loads Peak [W]" ); + pdchCoilOffRatingCapacityModifierIdealPeak = newPreDefColumn( pdstCoilSummaryCoilSelection, "Coil Off-Rating Capacity Modifier at Ideal Loads Peak [ ]" ); + pdchCoilAirMassFlowIdealPeak = newPreDefColumn( pdstCoilSummaryCoilSelection, "Coil Air Mass Flow Rate at Ideal Loads Peak [kg/s]" ); + pdchCoilAirVolumeFlowIdealPeak = newPreDefColumn( pdstCoilSummaryCoilSelection, "Coil Air Volume Flow Rate at Ideal Loads Peak [m3/s]" ); + pdchCoilEntDryBulbIdealPeak = newPreDefColumn( pdstCoilSummaryCoilSelection, "Coil Entering Air Drybulb at Ideal Loads Peak [C]" ); + pdchCoilEntWetBulbIdealPeak = newPreDefColumn( pdstCoilSummaryCoilSelection, "Coil Entering Air Wetbulb at Ideal Loads Peak [C]" ); + pdchCoilEntHumRatIdealPeak = newPreDefColumn( pdstCoilSummaryCoilSelection, "Coil Entering Air Humidity Ratio at Ideal Loads Peak [kg-H2O/kg-DryAir]" ); + pdchCoilEntEnthalpyIdealPeak = newPreDefColumn( pdstCoilSummaryCoilSelection, "Coil Entering Air Enthalpy at Ideal Loads Peak [J/(kg-C)]" ); + pdchCoilLvgDryBulbIdealPeak = newPreDefColumn( pdstCoilSummaryCoilSelection, "Coil Leaving Air Drybulb at Ideal Loads Peak [C]" ); + pdchCoilLvgWetBulbIdealPeak = newPreDefColumn( pdstCoilSummaryCoilSelection, "Coil Leaving Air Wetbulb at Ideal Loads Peak [C]" ); + pdchCoilLvgHumRatIdealPeak = newPreDefColumn( pdstCoilSummaryCoilSelection, "Coil Leaving Air Humidity Ratio at Ideal Loads Peak [C]" ); + pdchCoilLvgEnthalpyIdealPeak = newPreDefColumn( pdstCoilSummaryCoilSelection, "Coil Leaving Air Enthalpy at Ideal Loads Peak [J/(kg-C)]" ); + pdchCoilWaterMassFlowIdealPeak = newPreDefColumn( pdstCoilSummaryCoilSelection, "Coil Plant Fluid Mass Flow Rate at Ideal Loads Peak [kg/s]" ); + pdchCoilEntWaterTempIdealPeak = newPreDefColumn( pdstCoilSummaryCoilSelection, "Coil Entering Plant Fluid Temperature at Ideal Loads Peak [C]" ); + pdchCoilLvgWaterTempIdealPeak = newPreDefColumn( pdstCoilSummaryCoilSelection, "Coil Leaving Plant Fluid Temperature at Ideal Loads Peak [C]" ); + pdchCoilWaterDeltaTempIdealPeak = newPreDefColumn( pdstCoilSummaryCoilSelection, "Coil Plant Fluid Temperature Difference at Ideal Loads Peak [Delta C]" ); + pdchFanHeatGainIdealPeak = newPreDefColumn( pdstCoilSummaryCoilSelection, "Supply Fan Air Heat Gain at Ideal Loads Peak [W]" ); + pdchCoilNetTotalCapacityIdealPeak = newPreDefColumn( pdstCoilSummaryCoilSelection, "Coil and Fan Net Total Capacity at Ideal Loads Peak [W]" ); + pdchOADryBulbIdealPeak = newPreDefColumn( pdstCoilSummaryCoilSelection, "Outdoor Air Drybulb at Ideal Loads Peak [C]" ); + pdchOAHumRatIdealPeak = newPreDefColumn( pdstCoilSummaryCoilSelection, "Outdoor Air Humidity Ratio at Ideal Loads Peak [kg-H2O/kg-DryAir]" ); + pdchOAWetBulbatIdealPeak = newPreDefColumn( pdstCoilSummaryCoilSelection,"Outdoor Air Wetbulb at Ideal Loads Peak [C]" ); + pdchOAVolFlowIdealPeak = newPreDefColumn( pdstCoilSummaryCoilSelection, "Outdoor Air Volume Flow Rate at Ideal Loads Peak [m3/s]" ); + pdchOAFlowPrcntIdealPeak = newPreDefColumn( pdstCoilSummaryCoilSelection, "Outdoor Air Flow Percentage at Ideal Loads Peak [%]" ); + pdchAirSysRADryBulbIdealPeak = newPreDefColumn( pdstCoilSummaryCoilSelection, "System Return Air Drybulb at Ideal Loads Peak [C]" ); + pdchAirSysRAHumRatIdealPeak = newPreDefColumn( pdstCoilSummaryCoilSelection, "System Return Air Humidity Ratio at Ideal Loads Peak [kg-H2O/kg-DryAir]" ); + pdchZoneAirDryBulbIdealPeak = newPreDefColumn( pdstCoilSummaryCoilSelection, "Zone Air Drybulb at Ideal Loads Peak [C]" ); + pdchZoneAirHumRatIdealPeak = newPreDefColumn( pdstCoilSummaryCoilSelection, "Zone Air Humidity Ratio at Ideal Loads Peak [kg-H2O/kg-DryAir]" ); + pdchZoneAirRelHumIdealPeak = newPreDefColumn( pdstCoilSummaryCoilSelection, "Zone Air Relative Humidity at Ideal Loads Peak [%]" ); + pdchZoneSensibleLoadIdealPeak = newPreDefColumn( pdstCoilSummaryCoilSelection, "Zone Sensible Heat Gain at Ideal Loads Peak [W]" ); + pdchZoneLatentLoadIdealPeak = newPreDefColumn( pdstCoilSummaryCoilSelection, "Zone Latent Heat Gain at Ideal Loads Peak [W]" ); + //results for coil at Rated Conditions + pdchCoilRatedTotalCap = newPreDefColumn( pdstCoilSummaryCoilSelection, "Coil Total Capacity at Rating Conditions [W]" ); + pdchCoilRatedSensCap = newPreDefColumn( pdstCoilSummaryCoilSelection, "Coil Sensible Capacity at Rating Conditions [W]" ); + + pdchCoilRatedAirMass = newPreDefColumn( pdstCoilSummaryCoilSelection, "Coil Air Mass Flow Rate at Rating Conditions [kg/s]" ); + pdchCoilRatedEntDryBulb = newPreDefColumn( pdstCoilSummaryCoilSelection, "Coil Entering Air Drybulb at Rating Conditions [C]" ); + pdchCoilRatedEntWetBulb = newPreDefColumn( pdstCoilSummaryCoilSelection, "Coil Entering Air Wetbulb at Rating Conditions [C]" ); + pdchCoilRatedEntHumRat = newPreDefColumn( pdstCoilSummaryCoilSelection, "Coil Entering Air Humidity Ratio at Rating Conditions [kg-H20/kg-DryAir]" ); + pdchCoilRatedEntEnthalpy = newPreDefColumn( pdstCoilSummaryCoilSelection, "Coil Entering Air Enthalpy at Rating Conditions [J/(kg-C)]" ); + pdchCoilRatedLvgDryBulb = newPreDefColumn( pdstCoilSummaryCoilSelection, "Coil Leaving Air Drybulb at Rating Conditions [C]" ); + pdchCoilRatedLvgWetBulb = newPreDefColumn( pdstCoilSummaryCoilSelection, "Coil Leaving Air Wetbulb at Rating Conditions [C]" ); + pdchCoilRatedLvgHumRat = newPreDefColumn( pdstCoilSummaryCoilSelection, "Coil Leaving Air Humidity Ratio at Rating Conditions [kg-H20/kg-DryAir]" ); + pdchCoilRatedLvgEnthalpy = newPreDefColumn( pdstCoilSummaryCoilSelection, "Coil Leaving Air Enthalpy at Rating Conditions [J/(kg-C)]" ); + // System Summary Report pdrSystem = newPreDefReport( "SystemSummary", "Sys", "System Summary" ); @@ -2174,7 +2499,7 @@ namespace OutputReportPredefined { // convert the integer to a string for the number of digits gio::write( digitString, fmtI1 ) << sigDigitCount; // build up the format string - if ( tableEntryReal < 1e10 ) { + if ( tableEntryReal < 1e8 ) { // change from 1e10 for more robust entry writing formatConvert = "(F12." + digitString + ')'; } else { formatConvert = "(E12." + digitString + ')'; diff --git a/src/EnergyPlus/OutputReportPredefined.hh b/src/EnergyPlus/OutputReportPredefined.hh index 3cb91d6d955..8d5434ed236 100644 --- a/src/EnergyPlus/OutputReportPredefined.hh +++ b/src/EnergyPlus/OutputReportPredefined.hh @@ -96,6 +96,8 @@ namespace OutputReportPredefined { extern int pdchFanEndUse; extern int pdchFanPwr; extern int pdchFanPwrPerFlow; + extern int pdchFanDesDay; + extern int pdchFanPkTime; // Pump subtable extern int pdstPump; extern int pdchPumpType; @@ -330,6 +332,107 @@ namespace OutputReportPredefined { extern int pdchPlantSizPkTimeHour; extern int pdchPlantSizPkTimeMin; + // Coil Selection Table + extern int pdrCoilSummaryTable; + extern int pdstCoilSummaryCoilSelection; + extern int pdchCoilName; + extern int pdchCoilLocation; + extern int pdchCoilHVACType; + extern int pdchCoilHVACName; + extern int pdchCoilZoneName; + extern int pdchCoilType; + extern int pdchSysSizingMethCoinc; + extern int pdchSysSizingMethCap; + extern int pdchSysSizingMethAir; + + extern int pdchCoilIsCapAutosized; + extern int pdchCoilIsAirFlowAutosized; + extern int pdchCoilIsWaterFlowAutosized; + extern int pdchCoilIsOATreated; + + extern int pdchCoilFinalTotalCap; + extern int pdchCoilFinalSensCap; + extern int pdchCoilFinalAirVolFlowRate; + extern int pdchCoilFinalPlantVolFlowRate; + + extern int pdchCoilDDnameSensIdealPeak; + extern int pdchCoilDateTimeSensIdealPeak; + extern int pdchCoilDDnameTotIdealPeak; + extern int pdchCoilDateTimeTotIdealPeak; + extern int pdchCoilDDnameAirFlowIdealPeak; + extern int pdchCoilDateTimeAirFlowIdealPeak; + extern int pdchCoilTotalCapIdealPeak; + extern int pdchCoilSensCapIdealPeak; + extern int pdchCoilOffRatingCapacityModifierIdealPeak; + extern int pdchCoilAirMassFlowIdealPeak; + extern int pdchCoilAirVolumeFlowIdealPeak; + extern int pdchCoilEntDryBulbIdealPeak; + extern int pdchCoilEntWetBulbIdealPeak; + extern int pdchCoilEntHumRatIdealPeak; + extern int pdchCoilEntEnthalpyIdealPeak; + extern int pdchCoilLvgDryBulbIdealPeak; + extern int pdchCoilLvgWetBulbIdealPeak; + extern int pdchCoilLvgHumRatIdealPeak; + extern int pdchCoilLvgEnthalpyIdealPeak; + extern int pdchCoilWaterMassFlowIdealPeak; + extern int pdchCoilEntWaterTempIdealPeak; + extern int pdchCoilLvgWaterTempIdealPeak; + extern int pdchCoilWaterDeltaTempIdealPeak; + extern int pdchCoilRatedTotalCap; + extern int pdchCoilRatedSensCap; + extern int pdchCoilRatedAirMass; + extern int pdchCoilRatedEntDryBulb; + extern int pdchCoilRatedEntWetBulb; + extern int pdchCoilRatedEntHumRat; + extern int pdchCoilRatedEntEnthalpy; + extern int pdchCoilRatedLvgDryBulb; + extern int pdchCoilRatedLvgWetBulb; + extern int pdchCoilRatedLvgHumRat; + extern int pdchCoilRatedLvgEnthalpy; + + + extern int pdchFanAssociatedWithCoilName; + extern int pdchFanAssociatedWithCoilType; + extern int pdchFanAssociatedVdotSize; + extern int pdchFanAssociatedMdotSize; + + extern int pdchFanHeatGainIdealPeak; + extern int pdchCoilNetTotalCapacityIdealPeak; + extern int pdchCoilPlantLoopName; + extern int pdchPlantMassFlowMaximum; + extern int pdchPlantRetTempDesign; + extern int pdchPlantSupTempDesign; + extern int pdchPlantDeltaTempDesign; + extern int pdchPlantCapacity; + extern int pdchCoilCapPrcntPlantCapacity; + extern int pdchCoilFlowPrcntPlantFlow; + extern int pdchOADryBulbIdealPeak; + extern int pdchOAHumRatIdealPeak; + extern int pdchOAWetBulbatIdealPeak; + extern int pdchOAVolFlowIdealPeak; + extern int pdchOAFlowPrcntIdealPeak; + extern int pdchAirSysRADryBulbIdealPeak; + extern int pdchAirSysRAHumRatIdealPeak; + extern int pdchZoneAirTempIdealPeak; + extern int pdchZoneAirDryBulbIdealPeak; + extern int pdchZoneAirHumRatIdealPeak; + extern int pdchZoneAirRelHumIdealPeak; +// extern int pdchAirSysFanHeatGain; + extern int pdchCoilUA; + extern int pdchZoneSensibleLoadIdealPeak; + extern int pdchZoneLatentLoadIdealPeak; + extern int pdchCoilIdealSizCapOverSimPeak; + extern int pdchCoilIdealSizCapUnderSimPeak; + extern int pdchReheatCoilMultiplier; + extern int pdchFlowCapRatioLowCapIncreaseRatio; + extern int pdchFlowCapRatioHiCapDecreaseRatio; + extern int pdchPlantFluidSpecificHeat; + extern int pdchPlantFluidDensity; + extern int pdchMoistAirSpecificHeat; + extern int pdchDryAirSpecificHeat; + extern int pdchStandRhoAir; + // CoilSelectin Table + //System summary extern int pdrSystem; extern int pdstEconomizer; diff --git a/src/EnergyPlus/OutputReportTabular.cc b/src/EnergyPlus/OutputReportTabular.cc index 0cff863bc74..8052a21e041 100644 --- a/src/EnergyPlus/OutputReportTabular.cc +++ b/src/EnergyPlus/OutputReportTabular.cc @@ -99,6 +99,7 @@ #include #include #include +#include #include #include #include @@ -5345,13 +5346,16 @@ namespace OutputReportTabular { WriteVeriSumTable(); WriteDemandEndUseSummary(); WriteSourceEnergyEndUseSummary(); - WritePredefinedTables(); WriteComponentSizing(); WriteSurfaceShadowing(); WriteCompCostTable(); WriteAdaptiveComfortTable(); WriteEioTables(); WriteLoadComponentSummaryTables(); + + coilSelectionReportObj->finishCoilSummaryReportTable(); // call to write out the coil selection summary table data + WritePredefinedTables(); // moved to come after zone load components is finished + if ( DoWeathSim ) { WriteMonthlyTables(); WriteTimeBinTables(); @@ -11818,7 +11822,8 @@ namespace OutputReportTabular { GetDelaySequences( coolDesSelected, true, iZone, peopleDelaySeqCool, equipDelaySeqCool, hvacLossDelaySeqCool, powerGenDelaySeqCool, lightDelaySeqCool, feneSolarDelaySeqCool, feneCondInstantSeq, surfDelaySeqCool ); ComputeTableBodyUsingMovingAvg( ZoneCoolCompLoadTables(iZone).cells, ZoneCoolCompLoadTables( iZone ).cellUsed, coolDesSelected, timeCoolMax, iZone, peopleDelaySeqCool, equipDelaySeqCool, hvacLossDelaySeqCool, powerGenDelaySeqCool, lightDelaySeqCool, feneSolarDelaySeqCool, feneCondInstantSeq, surfDelaySeqCool ); CollectPeakZoneConditions( ZoneCoolCompLoadTables( iZone ), timeCoolMax, iZone, true ); - + //send latent load info to coil summary report + coilSelectionReportObj->setZoneLatentLoadCoolingIdealPeak( iZone , ZoneCoolCompLoadTables(iZone).cells( cLatent, rGrdTot ) ); heatDesSelected = CalcFinalZoneSizing( iZone ).HeatDDNum; ZoneHeatCompLoadTables( iZone ).desDayNum = heatDesSelected; @@ -11829,6 +11834,9 @@ namespace OutputReportTabular { ComputeTableBodyUsingMovingAvg( ZoneHeatCompLoadTables( iZone ).cells, ZoneHeatCompLoadTables( iZone ).cellUsed, heatDesSelected, timeHeatMax, iZone, peopleDelaySeqHeat, equipDelaySeqHeat, hvacLossDelaySeqHeat, powerGenDelaySeqHeat, lightDelaySeqHeat, feneSolarDelaySeqHeat, feneCondInstantSeq, surfDelaySeqHeat ); CollectPeakZoneConditions( ZoneHeatCompLoadTables( iZone ), timeHeatMax, iZone, false ); + //send latent load info to coil summary report + coilSelectionReportObj->setZoneLatentLoadHeatingIdealPeak( iZone , ZoneHeatCompLoadTables( iZone ).cells( cLatent, rGrdTot ) ); + AddAreaColumnForZone( iZone, ZoneComponentAreas, ZoneCoolCompLoadTables( iZone ) ); AddAreaColumnForZone( iZone, ZoneComponentAreas, ZoneHeatCompLoadTables( iZone ) ); diff --git a/src/EnergyPlus/PackagedTerminalHeatPump.cc b/src/EnergyPlus/PackagedTerminalHeatPump.cc index 010ed2beee0..bcbf80196d6 100644 --- a/src/EnergyPlus/PackagedTerminalHeatPump.cc +++ b/src/EnergyPlus/PackagedTerminalHeatPump.cc @@ -85,6 +85,7 @@ #include #include #include +#include #include #include #include @@ -2921,6 +2922,35 @@ namespace PackagedTerminalHeatPump { SetupOutputVariable( "Zone Water to Air Heat Pump Compressor Part Load Ratio", OutputProcessor::Unit::None, PTUnit( PTUnitNum ).CompPartLoadRatio, "System", "Average", PTUnit( PTUnitNum ).Name ); SetupOutputVariable( "Zone Water to Air Heat Pump Fan Availability Status", OutputProcessor::Unit::None, PTUnit( PTUnitNum ).AvailStatus, "System", "Average", PTUnit( PTUnitNum ).Name ); } + for ( PTUnitNum = 1; PTUnitNum <= NumPTUs; ++PTUnitNum ) { + if ( PTUnit( PTUnitNum ).FanType_Num == DataHVACGlobals::FanType_SystemModelObject ) { + if ( PTUnit( PTUnitNum ).DXCoolCoilType_Num > 0 ) { + coilSelectionReportObj->setCoilSupplyFanInfo( PTUnit( PTUnitNum ).DXCoolCoilName, PTUnit( PTUnitNum ).DXCoolCoilType, PTUnit( PTUnitNum ).FanName, DataAirSystems::objectVectorOOFanSystemModel, PTUnit( PTUnitNum ).FanIndex ); + } + if ( PTUnit( PTUnitNum ).DXHeatCoilType_Num > 0 ) { + coilSelectionReportObj->setCoilSupplyFanInfo( PTUnit( PTUnitNum ).DXHeatCoilName, PTUnit( PTUnitNum ).DXHeatCoilType, PTUnit( PTUnitNum ).FanName, DataAirSystems::objectVectorOOFanSystemModel, PTUnit( PTUnitNum ).FanIndex ); + } + if ( PTUnit( PTUnitNum ).ACHeatCoilType_Num > 0 ) { + coilSelectionReportObj->setCoilSupplyFanInfo( PTUnit( PTUnitNum ).ACHeatCoilName, PTUnit( PTUnitNum ).ACHeatCoilType, PTUnit( PTUnitNum ).FanName, DataAirSystems::objectVectorOOFanSystemModel, PTUnit( PTUnitNum ).FanIndex ); + } + if ( PTUnit( PTUnitNum ).SuppHeatCoilType_Num > 0 ) { + coilSelectionReportObj->setCoilSupplyFanInfo( PTUnit( PTUnitNum ).SuppHeatCoilName, PTUnit( PTUnitNum ).SuppHeatCoilType, PTUnit( PTUnitNum ).FanName, DataAirSystems::objectVectorOOFanSystemModel, PTUnit( PTUnitNum ).FanIndex ); + } + } else { + if ( PTUnit( PTUnitNum ).DXCoolCoilType_Num > 0 ) { + coilSelectionReportObj->setCoilSupplyFanInfo( PTUnit( PTUnitNum ).DXCoolCoilName, PTUnit( PTUnitNum ).DXCoolCoilType, PTUnit( PTUnitNum ).FanName, DataAirSystems::structArrayLegacyFanModels, PTUnit( PTUnitNum ).FanIndex ); + } + if ( PTUnit( PTUnitNum ).DXHeatCoilType_Num > 0 ) { + coilSelectionReportObj->setCoilSupplyFanInfo( PTUnit( PTUnitNum ).DXHeatCoilName, PTUnit( PTUnitNum ).DXHeatCoilType, PTUnit( PTUnitNum ).FanName, DataAirSystems::structArrayLegacyFanModels, PTUnit( PTUnitNum ).FanIndex ); + } + if ( PTUnit( PTUnitNum ).ACHeatCoilType_Num > 0 ) { + coilSelectionReportObj->setCoilSupplyFanInfo( PTUnit( PTUnitNum ).ACHeatCoilName, PTUnit( PTUnitNum ).ACHeatCoilType, PTUnit( PTUnitNum ).FanName, DataAirSystems::structArrayLegacyFanModels, PTUnit( PTUnitNum ).FanIndex ); + } + if ( PTUnit( PTUnitNum ).SuppHeatCoilType_Num > 0 ) { + coilSelectionReportObj->setCoilSupplyFanInfo( PTUnit( PTUnitNum ).SuppHeatCoilName, PTUnit( PTUnitNum ).SuppHeatCoilType, PTUnit( PTUnitNum ).FanName, DataAirSystems::structArrayLegacyFanModels, PTUnit( PTUnitNum ).FanIndex ); + } + } + } } void diff --git a/src/EnergyPlus/PoweredInductionUnits.cc b/src/EnergyPlus/PoweredInductionUnits.cc index ee292df5574..e885a6689a1 100644 --- a/src/EnergyPlus/PoweredInductionUnits.cc +++ b/src/EnergyPlus/PoweredInductionUnits.cc @@ -1291,6 +1291,7 @@ namespace PoweredInductionUnits { TermUnitSizing( CurTermUnitSizingNum ).MinFlowFrac = PIU( PIUNum ).MinPriAirFlowFrac; TermUnitSizing( CurTermUnitSizingNum ).MaxHWVolFlow = PIU( PIUNum ).MaxVolHotWaterFlow; TermUnitSizing( CurTermUnitSizingNum ).MaxSTVolFlow = PIU( PIUNum ).MaxVolHotSteamFlow; + TermUnitSizing( CurZoneEqNum ).DesHeatingLoad = DesCoilLoad; //coil report TermUnitSizing( CurTermUnitSizingNum ).InducesPlenumAir = PIU( PIUNum ).InducesPlenumAir; if ( PIU( PIUNum ).HCoilType_Num == HCoilType_SimpleHeating ) { SetCoilDesFlow( PIU( PIUNum ).HCoilType, PIU( PIUNum ).HCoil, TermUnitSizing( CurTermUnitSizingNum ).AirVolFlow, ErrorsFound ); diff --git a/src/EnergyPlus/ReportCoilSelection.cc b/src/EnergyPlus/ReportCoilSelection.cc new file mode 100644 index 00000000000..0545448f704 --- /dev/null +++ b/src/EnergyPlus/ReportCoilSelection.cc @@ -0,0 +1,1715 @@ +// EnergyPlus, Copyright (c) 1996-2018, The Board of Trustees of the University of Illinois and +// The Regents of the University of California, through Lawrence Berkeley National Laboratory +// (subject to receipt of any required approvals from the U.S. Dept. of Energy). All rights +// reserved. +// +// If you have questions about your rights to use or distribute this software, please contact +// Berkeley Lab's Innovation & Partnerships Office at IPO@lbl.gov. +// +// NOTICE: This Software was developed under funding from the U.S. Department of Energy and the +// U.S. Government consequently retains certain rights. As such, the U.S. Government has been +// granted for itself and others acting on its behalf a paid-up, nonexclusive, irrevocable, +// worldwide license in the Software to reproduce, distribute copies to the public, prepare +// derivative works, and perform publicly and display publicly, and to permit others to do so. +// +// Redistribution and use in source and binary forms, with or without modification, are permitted +// provided that the following conditions are met: +// +// (1) Redistributions of source code must retain the above copyright notice, this list of +// conditions and the following disclaimer. +// +// (2) Redistributions in binary form must reproduce the above copyright notice, this list of +// conditions and the following disclaimer in the documentation and/or other materials +// provided with the distribution. +// +// (3) Neither the name of the University of California, Lawrence Berkeley National Laboratory, +// the University of Illinois, U.S. Dept. of Energy nor the names of its contributors may be +// used to endorse or promote products derived from this software without specific prior +// written permission. +// +// (4) Use of EnergyPlus(TM) Name. If Licensee (i) distributes the software in stand-alone form +// without changes from the version obtained under this License, or (ii) Licensee makes a +// reference solely to the software portion of its product, Licensee must refer to the +// software as "EnergyPlus version X" software, where "X" is the version number Licensee +// obtained under this License and may not use a different name for the software. Except as +// specifically required in this Section (4), Licensee shall not use in a company name, a +// product name, in advertising, publicity, or other promotional activities any name, trade +// name, trademark, logo, or other designation of "EnergyPlus", "E+", "e+" or confusingly +// similar designation, without Lawrence Berkeley National Laboratory's prior written consent. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR +// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY +// AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// +// You are under no obligation whatsoever to provide any bug fixes, patches, or upgrades to the +// features, functionality or performance of the source code ("Enhancements") to anyone; however, +// if you choose to make your Enhancements available either publicly, or directly to Lawrence +// Berkeley National Laboratory, without imposing a separate written license agreement for such +// Enhancements, then you hereby grant the following license: a non-exclusive, royalty-free +// perpetual license to install, use, modify, prepare derivative works, incorporate into other +// computer software, distribute, and sublicense such enhancements or derivative works thereof, +// in binary and source code form. + + +// C++ Headers +#include +#include + +// EnergyPlus Headers +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +namespace EnergyPlus { + +std::unique_ptr< ReportCoilSelection > coilSelectionReportObj; + +void +createCoilSelectionReportObj() +{ + coilSelectionReportObj = std::unique_ptr< ReportCoilSelection > ( new ReportCoilSelection() ); +} + +void +clearCoilSelectionReportObj() +{ + coilSelectionReportObj.release(); +} + +CoilSelectionData::CoilSelectionData( //constructor + std::string const & coilName + ) : + isCooling( false ), + isHeating( false ), + coilNum( -999 ), + airloopNum( -999 ), + oaControllerNum( -999 ), + zoneEqNum( -999 ), + oASysNum( -999 ), + zoneHVACTypeNum( 0 ), + zoneHVACIndex( 0 ), + typeof_Coil( -999 ), + coilSizingMethodConcurrence( -999 ), + coilSizingMethodCapacity( -999 ), + coilSizingMethodAirFlow( -999 ), + //coilDesCapUser( -999.0 ), + //coilVolFlowUser( -999.0 ), + capIsAutosized( false ), + volFlowIsAutosized( false ), + coilWaterFlowUser( -999.0 ), + oaPretreated( false ), + isSupplementalHeater( false ), + coilTotCapFinal( -999.0 ), + coilSensCapFinal( -999.0 ), + coilRefAirVolFlowFinal( -999.0 ), + coilRefWaterVolFlowFinal( -999.0 ), + coilTotCapAtPeak( -999.0 ), + coilSensCapAtPeak( -999.0 ), + coilDesMassFlow( -999.0 ), + coilDesVolFlow( -999.0 ), + coilDesEntTemp( -999.0 ), + coilDesEntWetBulb( -999.0 ), + coilDesEntHumRat( -999.0 ), + coilDesEntEnth( -999.0 ), + coilDesLvgTemp( -999.0 ), + coilDesLvgWetBulb( -999.0 ), + coilDesLvgHumRat( -999.0 ), + coilDesLvgEnth( -999.0 ), + coilDesWaterMassFlow( -999.0 ), + coilDesWaterEntTemp( -999.0 ), + coilDesWaterLvgTemp( -999.0 ), + coilDesWaterTempDiff( -999.0 ), + pltSizNum( -999 ), + waterLoopNum( -999 ), + oaPeakTemp( -999.00 ), + oaPeakHumRat( -999.0 ), + oaPeakWetBulb( -999.0 ), + oaPeakVolFlow( -999.0 ), + oaPeakVolFrac( -999.0 ), + oaDoaTemp( -999.0 ), + oaDoaHumRat( -999.0 ), + raPeakTemp( -999.0 ), + raPeakHumRat( -999.0 ), + rmPeakTemp( -999.0 ), + rmPeakHumRat( -999.0 ), + rmPeakRelHum( -999.0 ), + rmSensibleAtPeak( -999.0 ), + rmLatentAtPeak( 0.0 ), + coilIdealSizCapOverSimPeakCap( -999.0 ), + coilIdealSizCapUnderSimPeakCap( -999.0 ), + reheatLoadMult( -999.0 ), + minRatio( -999.0 ), + maxRatio( -999.0 ), + cpMoistAir( -999.0 ), + cpDryAir( -999.0 ), + rhoStandAir( -999.0 ), + rhoFluid( -999.0 ), + cpFluid( -999.0 ), + coilRatedTotCap( -999.0 ), + coilRatedSensCap( -999.0 ), + coilCapFTIdealPeak( 1.0 ), // = 1 + ratedAirMassFlow( -999.0 ), + ratedCoilInDb( -999.0 ), + ratedCoilInWb( -999.0 ), + ratedCoilInHumRat( -999.0 ), + ratedCoilInEnth( -999.0 ), + ratedCoilOutDb( -999.0 ), + ratedCoilOutWb( -999.0 ), + ratedCoilOutHumRat( -999.0 ), + ratedCoilOutEnth( -999.0 ), + ratedCoilEff( -999.0 ), + ratedCoilBpFactor( -999.0 ), + ratedCoilAppDewPt( -999.0 ), + ratedCoilOadbRef( -999.0 ), + ratedCoilOawbRef( -999.0 ), + + supFanModelTypeEnum( DataAirSystems::fanModelTypeNotYetSet ), + supFanNum( 0 ), + supFanVecIndex( -1 ), + fanSizeMaxAirVolumeFlow( -999.0 ), + fanSizeMaxAirMassFlow( -999.0 ), + fanHeatGainIdealPeak( -999.0 ), + coilAndFanNetTotalCapacityIdealPeak( -999.0 ), + plantDesMaxMassFlowRate( -999.0 ), + plantDesRetTemp( -999.0 ), + plantDesSupTemp( -999.0 ), + plantDesDeltaTemp( -999.0 ), + plantDesCapacity( -999.0 ), + coilCapPrcntPlantCap( -999.0 ), + coilFlowPrcntPlantFlow( -999.0 ), + coilUA( -999.0 ) +{ + coilName_ = coilName; + coilLocation = "unknown"; + desDayNameAtSensPeak = "unknown"; + coilSensePeakHrMin = "unknown"; + desDayNameAtTotalPeak = "unknown"; + coilTotalPeakHrMin = "unknown"; + desDayNameAtAirFlowPeak = "unknown"; + airPeakHrMin = "unknown"; + typeHVACname = "unknown"; + userNameforHVACsystem = "unknown"; + coilSizingMethodConcurrenceName = "N/A"; + coilSizingMethodCapacityName = "N/A"; + coilSizingMethodAirFlowName = "N/A"; + coilCapAutoMsg = "unknown"; + coilVolFlowAutoMsg = "unknown"; + coilWaterFlowAutoMsg = "unknown"; + coilOAPretreatMsg = "unknown"; + plantLoopName = "unknown" ; + fanAssociatedWithCoilName = "unknown"; + fanTypeName = "unknown"; + +} + + + + +void +ReportCoilSelection::finishCoilSummaryReportTable() +{ + doFinalProcessingOfCoilData(); + writeCoilSelectionOutput(); +} + +void +ReportCoilSelection::writeCoilSelectionOutput() +{ + + // make calls to fill out predefined tabular report entries for each coil selection report object + for ( auto & c : coilSelectionDataObjs ) { + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchCoilType, c->coilName_, c->coilObjName ); + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchCoilLocation, c->coilName_, c->coilLocation ); + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchCoilHVACType, c->coilName_, c->typeHVACname ); + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchCoilHVACName, c->coilName_, c->userNameforHVACsystem ); + + if ( c->zoneName.size() == 1 ) { + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchCoilZoneName, c->coilName_, c->zoneName[ 0 ] ); + } else if ( c->zoneName.size() > 1 ) { + //make list of zone names + std::string tmpZoneList; + for ( int vecLoop = 0; vecLoop < c->zoneName.size(); ++vecLoop ) { + tmpZoneList += c->zoneName[ vecLoop ] + "; " ; + } + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchCoilZoneName, c->coilName_, tmpZoneList ); + } else { + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchCoilZoneName, c->coilName_, "N/A" ); + } + + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchSysSizingMethCoinc, c->coilName_, c->coilSizingMethodConcurrenceName ); + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchSysSizingMethCap, c->coilName_, c->coilSizingMethodCapacityName ); + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchSysSizingMethAir, c->coilName_, c->coilSizingMethodAirFlowName ); + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchCoilIsCapAutosized, c->coilName_, c->coilCapAutoMsg ); + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchCoilIsAirFlowAutosized, c->coilName_, c->coilVolFlowAutoMsg ); + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchCoilIsWaterFlowAutosized, c->coilName_, c->coilWaterFlowAutoMsg ); + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchCoilIsOATreated, c->coilName_, c->coilOAPretreatMsg ); + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchCoilFinalTotalCap, c->coilName_, c->coilTotCapFinal, 3 ); + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchCoilFinalSensCap, c->coilName_, c->coilSensCapFinal, 3 ); + if ( c->coilRefAirVolFlowFinal == -999.0 || c->coilRefAirVolFlowFinal == -99999.0 ) { + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchCoilFinalAirVolFlowRate, c->coilName_, c->coilRefAirVolFlowFinal, 1 ); + } else { + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchCoilFinalAirVolFlowRate, c->coilName_, c->coilRefAirVolFlowFinal, 6 ); + } + + if ( c->coilRefWaterVolFlowFinal == -999.0 || c->coilRefWaterVolFlowFinal == -99999.0 ) { + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchCoilFinalPlantVolFlowRate, c->coilName_, c->coilRefWaterVolFlowFinal, 1 ); + } else { + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchCoilFinalPlantVolFlowRate, c->coilName_, c->coilRefWaterVolFlowFinal, 8 ); + } + + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchFanAssociatedWithCoilName, c->coilName_, c->fanAssociatedWithCoilName ); + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchFanAssociatedWithCoilType, c->coilName_, c->fanTypeName ); + if ( c->fanSizeMaxAirVolumeFlow == -999.0 || c->fanSizeMaxAirVolumeFlow == -99999.0 ) { + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchFanAssociatedVdotSize, c->coilName_, c->fanSizeMaxAirVolumeFlow, 1 ); + } else { + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchFanAssociatedVdotSize, c->coilName_, c->fanSizeMaxAirVolumeFlow, 6 ); + } + if ( c->fanSizeMaxAirMassFlow == -999.0 || c->fanSizeMaxAirMassFlow == -99999.0 ) { + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchFanAssociatedMdotSize, c->coilName_, c->fanSizeMaxAirMassFlow, 1 ); + } else { + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchFanAssociatedMdotSize, c->coilName_, c->fanSizeMaxAirMassFlow, 8 ); + } + + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchCoilDDnameSensIdealPeak, c->coilName_, c->desDayNameAtSensPeak ); + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchCoilDateTimeSensIdealPeak, c->coilName_, c->coilSensePeakHrMin ); + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchCoilDDnameTotIdealPeak, c->coilName_, c->desDayNameAtTotalPeak ); + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchCoilDateTimeTotIdealPeak, c->coilName_, c->coilTotalPeakHrMin ); + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchCoilDDnameAirFlowIdealPeak, c->coilName_, c->desDayNameAtAirFlowPeak ); + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchCoilDateTimeAirFlowIdealPeak, c->coilName_, c->airPeakHrMin ); + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchCoilTotalCapIdealPeak, c->coilName_, c->coilTotCapAtPeak, 2 ); + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchCoilSensCapIdealPeak, c->coilName_, c->coilSensCapAtPeak, 2 ); + if ( c->coilDesMassFlow == -999.0 || c->coilDesMassFlow == -99999.0 ) { + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchCoilAirMassFlowIdealPeak, c->coilName_, c->coilDesMassFlow, 1 ); + } else { + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchCoilAirMassFlowIdealPeak, c->coilName_, c->coilDesMassFlow, 8 ); + } + if ( c->coilDesVolFlow == -999.0 || c->coilDesVolFlow == -99999.0 ) { + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchCoilAirVolumeFlowIdealPeak, c->coilName_, c->coilDesVolFlow, 1 ); + } else { + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchCoilAirVolumeFlowIdealPeak, c->coilName_, c->coilDesVolFlow, 6 ); + } + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchCoilEntDryBulbIdealPeak, c->coilName_, c->coilDesEntTemp, 2 ); + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchCoilEntWetBulbIdealPeak, c->coilName_, c->coilDesEntWetBulb, 2 ); + if ( c->coilDesEntHumRat == -999.0 || c->coilDesEntHumRat == -99999.0 ) { + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchCoilEntHumRatIdealPeak, c->coilName_, c->coilDesEntHumRat, 1 ); + } else { + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchCoilEntHumRatIdealPeak, c->coilName_, c->coilDesEntHumRat, 8 ); + } + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchCoilEntEnthalpyIdealPeak, c->coilName_, c->coilDesEntEnth, 1 ); + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchCoilLvgDryBulbIdealPeak, c->coilName_, c->coilDesLvgTemp, 2 ); + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchCoilLvgWetBulbIdealPeak, c->coilName_, c->coilDesLvgWetBulb, 2 ); + if ( c->coilDesLvgHumRat == -999.0 || c->coilDesLvgHumRat == -99999.0 ) { + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchCoilLvgHumRatIdealPeak, c->coilName_, c->coilDesLvgHumRat, 1 ); + } else { + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchCoilLvgHumRatIdealPeak, c->coilName_, c->coilDesLvgHumRat, 8 ); + } + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchCoilLvgEnthalpyIdealPeak, c->coilName_, c->coilDesLvgEnth, 1 ); + if ( c->coilDesWaterMassFlow == -999.0 || c->coilDesWaterMassFlow == -99999.0 ) { + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchCoilWaterMassFlowIdealPeak, c->coilName_, c->coilDesWaterMassFlow, 1 ); + } else { + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchCoilWaterMassFlowIdealPeak, c->coilName_, c->coilDesWaterMassFlow, 8 ); + } + + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchCoilEntWaterTempIdealPeak, c->coilName_, c->coilDesWaterEntTemp, 2 ); + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchCoilLvgWaterTempIdealPeak, c->coilName_, c->coilDesWaterLvgTemp, 2 ); + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchCoilWaterDeltaTempIdealPeak, c->coilName_, c->coilDesWaterTempDiff, 2 ); + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchFanHeatGainIdealPeak, c->coilName_, c->fanHeatGainIdealPeak, 3 ); + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchCoilNetTotalCapacityIdealPeak, c->coilName_, c->coilAndFanNetTotalCapacityIdealPeak, 2); + + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchCoilRatedTotalCap, c->coilName_, c->coilRatedTotCap, 2 ); + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchCoilRatedSensCap, c->coilName_, c->coilRatedSensCap, 2 ); + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchCoilOffRatingCapacityModifierIdealPeak, c->coilName_, c->coilCapFTIdealPeak, 4 ); + if ( c->ratedAirMassFlow == -999.0 || c->ratedAirMassFlow == -99999.0 ) { + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchCoilRatedAirMass, c->coilName_, c->ratedAirMassFlow, 1 ); + } else { + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchCoilRatedAirMass, c->coilName_, c->ratedAirMassFlow, 8 ); + } + + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchCoilRatedEntDryBulb, c->coilName_, c->ratedCoilInDb, 2 ); + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchCoilRatedEntWetBulb, c->coilName_, c->ratedCoilInWb, 2 ); + if ( c->ratedCoilInHumRat == -999.0 || c->ratedCoilInHumRat == -99999.0 ) { + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchCoilRatedEntHumRat, c->coilName_, c->ratedCoilInHumRat, 1 ); + } else { + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchCoilRatedEntHumRat, c->coilName_, c->ratedCoilInHumRat, 8 ); + } + + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchCoilRatedEntEnthalpy, c->coilName_, c->ratedCoilInEnth, 1 ); + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchCoilRatedLvgDryBulb, c->coilName_, c->ratedCoilOutDb, 2 ); + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchCoilRatedLvgWetBulb, c->coilName_, c->ratedCoilOutWb, 2 ); + if ( c->ratedCoilOutHumRat == -999.0 || c->ratedCoilOutHumRat == -99999.0 ) { + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchCoilRatedLvgHumRat, c->coilName_, c->ratedCoilOutHumRat, 1 ); + } else { + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchCoilRatedLvgHumRat, c->coilName_, c->ratedCoilOutHumRat, 8 ); + } + + + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchCoilRatedLvgEnthalpy, c->coilName_, c->ratedCoilOutEnth, 1 ); + + if ( c->plantDesMaxMassFlowRate == -999.0 || c->plantDesMaxMassFlowRate == -99999.0 ) { + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchPlantMassFlowMaximum, c->coilName_, c->plantDesMaxMassFlowRate, 1 ); + } else { + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchPlantMassFlowMaximum, c->coilName_, c->plantDesMaxMassFlowRate, 8 ); + } + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchPlantRetTempDesign, c->coilName_, c->plantDesRetTemp, 2 ); + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchPlantSupTempDesign, c->coilName_, c->plantDesSupTemp, 2 ); + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchPlantDeltaTempDesign, c->coilName_, c->plantDesDeltaTemp , 2); + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchPlantCapacity, c->coilName_, c->plantDesCapacity, 2 ); + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchCoilCapPrcntPlantCapacity, c->coilName_, c->coilCapPrcntPlantCap, 4 ); + if ( c->coilFlowPrcntPlantFlow == -999.0 || c->coilFlowPrcntPlantFlow == -99999.0 ) { + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchCoilFlowPrcntPlantFlow, c->coilName_, c->coilFlowPrcntPlantFlow, 1 ); + } else { + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchCoilFlowPrcntPlantFlow, c->coilName_, c->coilFlowPrcntPlantFlow, 6 ); + } + + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchOADryBulbIdealPeak, c->coilName_, c->oaPeakTemp, 2 ); + if ( c->oaPeakHumRat == -999.0 || c->oaPeakHumRat == -99999.0 ) { + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchOAHumRatIdealPeak, c->coilName_, c->oaPeakHumRat, 1 ); + } else { + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchOAHumRatIdealPeak, c->coilName_, c->oaPeakHumRat, 8 ); + } + + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchOAWetBulbatIdealPeak, c->coilName_, c->oaPeakWetBulb, 2 ); + if ( c->oaPeakVolFlow == -999.0 || c->oaPeakVolFlow == -99999.0 ) { + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchOAVolFlowIdealPeak, c->coilName_, c->oaPeakVolFlow, 1 ); + } else { + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchOAVolFlowIdealPeak, c->coilName_, c->oaPeakVolFlow, 8 ); + } + + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchOAFlowPrcntIdealPeak, c->coilName_, c->oaPeakVolFrac, 4 ); + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchAirSysRADryBulbIdealPeak, c->coilName_, c->raPeakTemp, 2 ); + if ( c->raPeakHumRat == -999.0 || c->raPeakHumRat == -99999.0 ) { + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchAirSysRAHumRatIdealPeak, c->coilName_, c->raPeakHumRat, 1 ); + } else { + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchAirSysRAHumRatIdealPeak, c->coilName_, c->raPeakHumRat, 8 ); + } + + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchZoneAirDryBulbIdealPeak, c->coilName_, c->rmPeakTemp, 2 ); + if ( c->rmPeakHumRat == -999.0 || c->rmPeakHumRat == -99999.0 ) { + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchZoneAirHumRatIdealPeak, c->coilName_, c->rmPeakHumRat, 1 ); + } else { + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchZoneAirHumRatIdealPeak, c->coilName_, c->rmPeakHumRat, 8 ); + } + + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchZoneAirRelHumIdealPeak, c->coilName_, c->rmPeakRelHum, 4 ); + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchCoilUA, c->coilName_, c->coilUA, 3 ); + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchZoneSensibleLoadIdealPeak, c->coilName_, c->rmSensibleAtPeak, 2 ); + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchZoneLatentLoadIdealPeak, c->coilName_, c->rmLatentAtPeak ); + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchReheatCoilMultiplier, c->coilName_, c->reheatLoadMult, 4); + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchFlowCapRatioLowCapIncreaseRatio, c->coilName_, c->maxRatio, 5 ); + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchFlowCapRatioHiCapDecreaseRatio, c->coilName_, c->minRatio, 5 ); + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchPlantFluidSpecificHeat, c->coilName_, c->cpFluid, 4 ); + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchPlantFluidDensity, c->coilName_, c->rhoFluid, 4 ); + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchMoistAirSpecificHeat, c->coilName_, c->cpMoistAir, 4 ); + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchDryAirSpecificHeat, c->coilName_, c->cpDryAir, 4 ); + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchStandRhoAir, c->coilName_, c->rhoStandAir, 4 ); + + } +} + +void +ReportCoilSelection::setCoilFinalSizes( + std::string const & coilName, // user-defined name of the coil + std::string const & coilObjName , // coil object name, e.g., Coil:Cooling:Water + Real64 const totGrossCap, // total capacity [W] + Real64 const sensGrossCap,// sensible capacity [W] + Real64 const airFlowRate, // design or reference or rated air flow rate [m3/s] + Real64 const waterFlowRate //design or reference or rated water flow rate [m3/s] +) +{ + int index = getIndexForOrCreateDataObjFromCoilName( coilName,coilObjName ); + auto & c( coilSelectionDataObjs[ index ] ); + if ( c != nullptr ) { + c->coilTotCapFinal = totGrossCap; + c->coilSensCapFinal = sensGrossCap; + c->coilRefAirVolFlowFinal = airFlowRate; + c->coilRefWaterVolFlowFinal = waterFlowRate; + } +} + +void +ReportCoilSelection::doAirLoopSetup( + int const coilVecIndex +) +{ + // this routine sets up some things for central air systems, needs to follow setting of an airloop num + auto & c( coilSelectionDataObjs[ coilVecIndex ] ); + if ( c->airloopNum > 0 ) { + // see if there is an OA controller + if ( DataAirSystems::PrimaryAirSystem( c->airloopNum ).OASysExists ) { + //loop over OA controllers and match node num ? + for ( int loop = 1; loop <= MixedAir::NumOAControllers; ++loop ) { + if ( DataAirSystems::PrimaryAirSystem( c->airloopNum ).OASysInletNodeNum == MixedAir::OAController( loop ).RetNode ) { + c->oaControllerNum = loop; + } + } + } + //fill list of zones connected to this air loop + // this could be reworked to use different structure which is available now since std 62.1 changes + + if ( DataAirLoop::AirToZoneNodeInfo( c->airloopNum ).NumZonesCooled > 0 ) { + int zoneCount = DataAirLoop::AirToZoneNodeInfo( c->airloopNum ).NumZonesCooled; + c->zoneNum.resize( zoneCount ); + c->zoneName.resize( zoneCount ); + for ( int loopZone = 1; loopZone <= DataAirLoop::AirToZoneNodeInfo( c->airloopNum ).NumZonesCooled; ++loopZone ) { + c->zoneNum[ loopZone - 1] = DataAirLoop::AirToZoneNodeInfo( c->airloopNum).CoolCtrlZoneNums( loopZone ); + c->zoneName[ loopZone - 1] = DataHeatBalance::Zone( c->zoneNum[ loopZone - 1] ).Name; + } + } + + if ( DataAirLoop::AirToZoneNodeInfo( c->airloopNum ).NumZonesHeated > 0 ) { + int zoneCount = DataAirLoop::AirToZoneNodeInfo( c->airloopNum ).NumZonesHeated; + for ( int loopZone = 1; loopZone <= DataAirLoop::AirToZoneNodeInfo( c->airloopNum ).NumZonesHeated; ++loopZone ) { + int zoneIndex = DataAirLoop::AirToZoneNodeInfo( c->airloopNum).HeatCtrlZoneNums( loopZone ); + // see if this zone is new or already in list + bool found = false; + for ( auto & z : c->zoneNum ) { + if ( z == zoneIndex ) { + found = true; + break; + } + } + if ( ! found ) { // add it + c->zoneNum.emplace_back( zoneIndex ); + c->zoneName.emplace_back( DataHeatBalance::Zone( zoneIndex ).Name ); + } + } + } + + } + + +} + +void +ReportCoilSelection::doZoneEqSetup( + int const coilVecIndex +) +{ + auto & c( coilSelectionDataObjs[ coilVecIndex ] ); + c->coilLocation = "Zone"; + c->zoneNum.resize( 1 ); + c->zoneNum[ 0 ] = DataZoneEquipment::ZoneEquipConfig( c->zoneEqNum ).ActualZoneNum; + c->zoneName.resize( 1 ); + c->zoneName[ 0 ] = DataHeatBalance::Zone( c->zoneNum[ 0 ] ).Name; + c->typeHVACname = "Zone Equipment"; // init + + // find the system and get c->oaControllerNum + + // need to rework for new multiple air handler in zone + + // going to need the zone inlet node index for this now... how to find it?? + + // maybe not needed, would be set in other calls c->airloopNum = DataZoneEquipment::ZoneEquipConfig( c->zoneEqNum ).AirLoopNum; + + if ( c->airloopNum > 0) { + if ( DataAirSystems::PrimaryAirSystem( c->airloopNum ).OASysExists ) { + //loop over OA controllers and match node num ? + for ( int loop = 1; loop <= MixedAir::NumOAControllers; ++loop ) { + if ( DataAirSystems::PrimaryAirSystem( c->airloopNum ).OASysInletNodeNum == MixedAir::OAController( loop ).RetNode ) { + c->oaControllerNum = loop; + } + } + } + // fill out supply fan info + switch ( DataAirSystems::PrimaryAirSystem( c->airloopNum ).supFanModelTypeEnum ){ + case DataAirSystems::structArrayLegacyFanModels: { + + coilSelectionReportObj->setCoilSupplyFanInfo( c->coilName_, c->coilObjName, Fans::Fan( DataAirSystems::PrimaryAirSystem( c->airloopNum ).SupFanNum ).FanName, DataAirSystems::structArrayLegacyFanModels, DataAirSystems::PrimaryAirSystem( c->airloopNum ).SupFanNum ); + break; + } + case DataAirSystems::objectVectorOOFanSystemModel: { + + coilSelectionReportObj->setCoilSupplyFanInfo( c->coilName_, c->coilObjName, HVACFan::fanObjs[ DataAirSystems::PrimaryAirSystem( c->airloopNum ).supFanVecIndex ]->name, DataAirSystems::objectVectorOOFanSystemModel, DataAirSystems::PrimaryAirSystem( c->airloopNum ).supFanVecIndex ); + break; + } + case DataAirSystems::fanModelTypeNotYetSet: { + // do nothing + break; + } + } // end switch + } + + if ( c->zoneEqNum > 0 ) { + c->coilLocation = "Unknown"; + c->typeHVACname = "Unknown"; + c->userNameforHVACsystem = "Unknown"; + // now search equiment + if ( DataZoneEquipment::ZoneEquipList( c->zoneEqNum ).NumOfEquipTypes == 1 ) { // this must be it, fill strings for type and name + c->typeHVACname = DataZoneEquipment::ZoneEquipList( c->zoneEqNum ).EquipType( 1 ); + c->userNameforHVACsystem = DataZoneEquipment::ZoneEquipList( c->zoneEqNum ).EquipName( 1 ); + c->coilLocation = "Zone Equipment"; + c->zoneHVACTypeNum = DataZoneEquipment::ZoneEquipList( c->zoneEqNum ).EquipType_Num( 1 ); + c->zoneHVACIndex = DataZoneEquipment::ZoneEquipList( c->zoneEqNum ).EquipIndex( 1 ); + } else if ( DataZoneEquipment::ZoneEquipList( c->zoneEqNum ).NumOfEquipTypes > 1 ) { + bool foundOne( false ); + for ( int equipLoop = 1; equipLoop <= DataZoneEquipment::ZoneEquipList( c->zoneEqNum ).NumOfEquipTypes ; ++equipLoop ) { + // go with the first ZoneHVAC device in the list + if ( ( DataZoneEquipment::ZoneEquipList( c->zoneEqNum ).EquipType_Num( equipLoop ) == DataHVACGlobals::ZoneEquipTypeOf_VariableRefrigerantFlow ) + || ( DataZoneEquipment::ZoneEquipList( c->zoneEqNum ).EquipType_Num( equipLoop ) == DataHVACGlobals::ZoneEquipTypeOf_EnergyRecoveryVentilator ) + || ( DataZoneEquipment::ZoneEquipList( c->zoneEqNum ).EquipType_Num( equipLoop ) == DataHVACGlobals::ZoneEquipTypeOf_FourPipeFanCoil ) + || ( DataZoneEquipment::ZoneEquipList( c->zoneEqNum ).EquipType_Num( equipLoop ) == DataHVACGlobals::ZoneEquipTypeOf_OutdoorAirUnit ) + || ( DataZoneEquipment::ZoneEquipList( c->zoneEqNum ).EquipType_Num( equipLoop ) == DataHVACGlobals::ZoneEquipTypeOf_PackagedTerminalAirConditioner ) + || ( DataZoneEquipment::ZoneEquipList( c->zoneEqNum ).EquipType_Num( equipLoop ) == DataHVACGlobals::ZoneEquipTypeOf_PackagedTerminalHeatPump ) + || ( DataZoneEquipment::ZoneEquipList( c->zoneEqNum ).EquipType_Num( equipLoop ) == DataHVACGlobals::ZoneEquipTypeOf_UnitHeater ) + || ( DataZoneEquipment::ZoneEquipList( c->zoneEqNum ).EquipType_Num( equipLoop ) == DataHVACGlobals::ZoneEquipTypeOf_UnitVentilator ) + || ( DataZoneEquipment::ZoneEquipList( c->zoneEqNum ).EquipType_Num( equipLoop ) == DataHVACGlobals::ZoneEquipTypeOf_VentilatedSlab ) + || ( DataZoneEquipment::ZoneEquipList( c->zoneEqNum ).EquipType_Num( equipLoop ) == DataHVACGlobals::ZoneEquipTypeOf_WaterToAirHeatPump ) + || ( DataZoneEquipment::ZoneEquipList( c->zoneEqNum ).EquipType_Num( equipLoop ) == DataHVACGlobals::ZoneEquipTypeOf_WindowAirConditioner) + || ( DataZoneEquipment::ZoneEquipList( c->zoneEqNum ).EquipType_Num( equipLoop ) == DataHVACGlobals::ZoneEquipTypeOf_DehumidifierDX ) ) { + if ( ! foundOne) { + c->typeHVACname = DataZoneEquipment::ZoneEquipList( c->zoneEqNum ).EquipType( equipLoop ); + c->userNameforHVACsystem = DataZoneEquipment::ZoneEquipList( c->zoneEqNum ).EquipName( equipLoop ); + foundOne = true; + c->coilLocation = "Zone Equipment"; + c->zoneHVACTypeNum = DataZoneEquipment::ZoneEquipList( c->zoneEqNum ).EquipType_Num( equipLoop ); + c->zoneHVACIndex = DataZoneEquipment::ZoneEquipList( c->zoneEqNum ).EquipIndex( equipLoop ); + } else { // or may have found another + c->typeHVACname += " or " + DataZoneEquipment::ZoneEquipList( c->zoneEqNum ).EquipType( equipLoop ); + c->userNameforHVACsystem += " or " +DataZoneEquipment::ZoneEquipList( c->zoneEqNum ).EquipName( equipLoop ); + } + } + } + } + } + +} + +void +ReportCoilSelection::doFinalProcessingOfCoilData() +{ + // this routine does some final processing in preparation for writing out results + for ( auto & c : coilSelectionDataObjs ) { + + //mine final/hard values from coil models + + + + if ( c->zoneEqNum > 0 ) { + c->coilLocation = "Unknown"; + c->typeHVACname = "Unknown"; + c->userNameforHVACsystem = "Unknown"; + // now search equiment + if ( DataZoneEquipment::ZoneEquipList( c->zoneEqNum ).NumOfEquipTypes == 1 ) { // this must be it, fill strings for type and name + c->typeHVACname = DataZoneEquipment::ZoneEquipList( c->zoneEqNum ).EquipType( 1 ); + c->userNameforHVACsystem = DataZoneEquipment::ZoneEquipList( c->zoneEqNum ).EquipName( 1 ); + c->coilLocation = "Zone Equipment"; + } else if ( DataZoneEquipment::ZoneEquipList( c->zoneEqNum ).NumOfEquipTypes > 1 ) { + bool foundOne( false ); + for ( int equipLoop = 1; equipLoop <= DataZoneEquipment::ZoneEquipList( c->zoneEqNum ).NumOfEquipTypes ; ++equipLoop ) { + // go with the first ZoneHVAC device in the list + if ( ( DataZoneEquipment::ZoneEquipList( c->zoneEqNum ).EquipType_Num( equipLoop ) == DataHVACGlobals::ZoneEquipTypeOf_VariableRefrigerantFlow ) + || ( DataZoneEquipment::ZoneEquipList( c->zoneEqNum ).EquipType_Num( equipLoop ) == DataHVACGlobals::ZoneEquipTypeOf_EnergyRecoveryVentilator ) + || ( DataZoneEquipment::ZoneEquipList( c->zoneEqNum ).EquipType_Num( equipLoop ) == DataHVACGlobals::ZoneEquipTypeOf_FourPipeFanCoil ) + || ( DataZoneEquipment::ZoneEquipList( c->zoneEqNum ).EquipType_Num( equipLoop ) == DataHVACGlobals::ZoneEquipTypeOf_OutdoorAirUnit ) + || ( DataZoneEquipment::ZoneEquipList( c->zoneEqNum ).EquipType_Num( equipLoop ) == DataHVACGlobals::ZoneEquipTypeOf_PackagedTerminalAirConditioner ) + || ( DataZoneEquipment::ZoneEquipList( c->zoneEqNum ).EquipType_Num( equipLoop ) == DataHVACGlobals::ZoneEquipTypeOf_PackagedTerminalHeatPump ) + || ( DataZoneEquipment::ZoneEquipList( c->zoneEqNum ).EquipType_Num( equipLoop ) == DataHVACGlobals::ZoneEquipTypeOf_UnitHeater ) + || ( DataZoneEquipment::ZoneEquipList( c->zoneEqNum ).EquipType_Num( equipLoop ) == DataHVACGlobals::ZoneEquipTypeOf_UnitVentilator ) + || ( DataZoneEquipment::ZoneEquipList( c->zoneEqNum ).EquipType_Num( equipLoop ) == DataHVACGlobals::ZoneEquipTypeOf_VentilatedSlab ) + || ( DataZoneEquipment::ZoneEquipList( c->zoneEqNum ).EquipType_Num( equipLoop ) == DataHVACGlobals::ZoneEquipTypeOf_WaterToAirHeatPump ) + || ( DataZoneEquipment::ZoneEquipList( c->zoneEqNum ).EquipType_Num( equipLoop ) == DataHVACGlobals::ZoneEquipTypeOf_WindowAirConditioner) + || ( DataZoneEquipment::ZoneEquipList( c->zoneEqNum ).EquipType_Num( equipLoop ) == DataHVACGlobals::ZoneEquipTypeOf_DehumidifierDX ) ) { + if ( ! foundOne) { + c->typeHVACname = DataZoneEquipment::ZoneEquipList( c->zoneEqNum ).EquipType( equipLoop ); + c->userNameforHVACsystem = DataZoneEquipment::ZoneEquipList( c->zoneEqNum ).EquipName( equipLoop ); + foundOne = true; + c->coilLocation = "Zone Equipment"; + } else { // or may have found another + c->typeHVACname += " or " + DataZoneEquipment::ZoneEquipList( c->zoneEqNum ).EquipType( equipLoop ); + c->userNameforHVACsystem += " or " +DataZoneEquipment::ZoneEquipList( c->zoneEqNum ).EquipName( equipLoop ); + } + } + } + } + } + + if ( c->airloopNum > 0 && c->zoneEqNum == 0) { + c->coilLocation = "AirLoop"; + c->typeHVACname = "AirLoopHVAC"; + c->userNameforHVACsystem = DataAirSystems::PrimaryAirSystem( c->airloopNum ).Name; + } else if ( c->zoneEqNum > 0 && c->airloopNum > 0 ) { // e.g. reheat coil, has a system and is zone equipment + c->userNameforHVACsystem += " on air system named " + DataAirSystems::PrimaryAirSystem( c->airloopNum ).Name; + c->coilLocation = "Zone Equipment"; + } + + if ( c->coilDesVolFlow > 0 ) { + c->oaPeakVolFrac = ( c->oaPeakVolFlow / c->coilDesVolFlow ) * 100.0 ; // make into percentage + } else { + c->oaPeakVolFrac = -999.0; + } + + + + if ( c->coilSizingMethodConcurrence == DataSizing::NonCoincident ) { + c->coilSizingMethodConcurrenceName = "Non-Coincident"; + } else if ( c->coilSizingMethodConcurrence == DataSizing::Coincident ) { + c->coilSizingMethodConcurrenceName = "Coincident"; + } + + if ( c->coilSizingMethodCapacity == DataSizing::CoolingDesignCapacity ) { + c->coilSizingMethodCapacityName = "CoolingDesignCapacity"; + } else if ( c->coilSizingMethodCapacity == DataSizing::HeatingDesignCapacity ) { + c->coilSizingMethodCapacityName = "HeatingDesignCapacity"; + } else if ( c->coilSizingMethodCapacity == DataSizing::CapacityPerFloorArea ) { + c->coilSizingMethodCapacityName = "CapacityPerFloorArea"; + } else if ( c->coilSizingMethodCapacity == DataSizing::FractionOfAutosizedCoolingCapacity ) { + c->coilSizingMethodCapacityName = "FractionOfAutosizedCoolingCapacity"; + } else if ( c->coilSizingMethodCapacity == DataSizing::FractionOfAutosizedHeatingCapacity ) { + c->coilSizingMethodCapacityName = "FractionOfAutosizedHeatingCapacity"; + } + + if ( c->coilSizingMethodAirFlow == DataSizing::SupplyAirFlowRate ) { + c->coilSizingMethodAirFlowName = "SupplyAirFlowRate"; + } else if ( c->coilSizingMethodAirFlow == DataSizing::FlowPerFloorArea ) { + c->coilSizingMethodAirFlowName = "FlowPerFloorArea"; + } else if ( c->coilSizingMethodAirFlow == DataSizing::FractionOfAutosizedCoolingAirflow ) { + c->coilSizingMethodAirFlowName = "FractionOfAutosizedCoolingAirflow"; + } else if ( c->coilSizingMethodAirFlow == DataSizing::FractionOfAutosizedHeatingAirflow ) { + c->coilSizingMethodAirFlowName = "FractionOfAutosizedHeatingAirflow"; + } + + if ( c->capIsAutosized ) { + c->coilCapAutoMsg = "Yes"; + } else { + c->coilCapAutoMsg = "No"; + } + + if ( c->volFlowIsAutosized ) { + c->coilVolFlowAutoMsg = "Yes" ; + } else { + c->coilVolFlowAutoMsg = "No" ; + } + + if ( c->oaPretreated ) { + c->coilOAPretreatMsg = "Yes"; + } else { + c->coilOAPretreatMsg = "No"; + } + + // call psych routine to flush out moist air metrics from those available + if ( c->coilDesEntTemp != -999.0 ) { + c->coilDesEntWetBulb = Psychrometrics::PsyTwbFnTdbWPb( c->coilDesEntTemp, c->coilDesEntHumRat, DataEnvironment::StdBaroPress, "ReportCoilSelection::doFinalProcessingOfCoilData" ); + if ( c->coilDesEntHumRat != -999.0 ) { + c->coilDesEntEnth = Psychrometrics::PsyHFnTdbW( c->coilDesEntTemp, c->coilDesEntHumRat ); + } + } + if ( c->oaPeakTemp != -999.0 && c->oaPeakHumRat != -999.0 ) { + c->oaPeakWetBulb = Psychrometrics::PsyTwbFnTdbWPb( c->oaPeakTemp, c->oaPeakHumRat, DataEnvironment::StdBaroPress, "ReportCoilSelection::doFinalProcessingOfCoilData" ); + } + + if ( c->waterLoopNum > 0 && c->pltSizNum > 0 ) { + + c->plantLoopName = DataPlant::PlantLoop( c->waterLoopNum ).Name; + if ( DataSizing::PlantSizData( c->pltSizNum ).LoopType != DataSizing::SteamLoop ) { + c->rhoFluid = FluidProperties::GetDensityGlycol( DataPlant::PlantLoop( c->waterLoopNum ).FluidName, DataGlobals::InitConvTemp, DataPlant::PlantLoop( c->waterLoopNum ).FluidIndex, "ReportCoilSelection::doFinalProcessingOfCoilData" ); + + c->cpFluid = FluidProperties::GetSpecificHeatGlycol( DataPlant::PlantLoop( c->waterLoopNum ).FluidName, DataGlobals::InitConvTemp, DataPlant::PlantLoop( c->waterLoopNum ).FluidIndex, "ReportCoilSelection::doFinalProcessingOfCoilData" ); + } else { // steam loop + c->rhoFluid = FluidProperties::GetSatDensityRefrig( DataPlant::PlantLoop( c->waterLoopNum ).FluidName, 100.0, 1.0, DataPlant::PlantLoop( c->waterLoopNum ).FluidIndex, "ReportCoilSelection::doFinalProcessingOfCoilData" ); + c->cpFluid = FluidProperties::GetSatSpecificHeatRefrig( DataPlant::PlantLoop( c->waterLoopNum ).FluidName, 100.0, 0.0, DataPlant::PlantLoop( c->waterLoopNum ).FluidIndex, "ReportCoilSelection::doFinalProcessingOfCoilData" ); + } + c->plantDesMaxMassFlowRate = DataPlant::PlantLoop( c->waterLoopNum ).MaxMassFlowRate; + if ( c->plantDesMaxMassFlowRate > 0.0 && c->coilDesWaterMassFlow > 0.0 ) { + c->coilFlowPrcntPlantFlow = ( c->coilDesWaterMassFlow / c->plantDesMaxMassFlowRate ) * 100.0 ; // convert to percentage. + } + } + // fill out some fan information + switch ( c->supFanModelTypeEnum ){ + case DataAirSystems::structArrayLegacyFanModels: { + int locFanTypeNum( 0 ); + bool errorsFound( false ); + Fans::GetFanType( c->fanAssociatedWithCoilName, locFanTypeNum, errorsFound ); + if ( locFanTypeNum == DataHVACGlobals::FanType_SimpleConstVolume ) { + c->fanTypeName = "Fan:ConstantVolume"; + } else if ( locFanTypeNum == DataHVACGlobals::FanType_SimpleVAV ) { + c->fanTypeName = "Fan:VariableVolume"; + } else if ( locFanTypeNum == DataHVACGlobals::FanType_SimpleOnOff ) { + c->fanTypeName = "Fan:OnOff"; + } else if ( locFanTypeNum == DataHVACGlobals::FanType_ZoneExhaust ) { + c->fanTypeName = "Fan:ZoneExhaust"; + } else if ( locFanTypeNum == DataHVACGlobals::FanType_ComponentModel ) { + c->fanTypeName = "Fan:ComponentModel"; + } + if ( c->supFanNum <= 0 ) { + Fans::GetFanIndex( c->fanAssociatedWithCoilName, c->supFanNum, errorsFound, c->fanTypeName); + } + c->fanSizeMaxAirVolumeFlow = Fans::GetFanDesignVolumeFlowRate( c->fanTypeName, c->fanAssociatedWithCoilName, errorsFound, c->supFanNum ); + c->fanSizeMaxAirMassFlow = Fans::Fan( c->supFanNum ).MaxAirMassFlowRate; + break; + } + case DataAirSystems::objectVectorOOFanSystemModel: { + c->fanTypeName = "Fan:SystemModel"; + if ( c->supFanVecIndex < 0 ) { + c->supFanVecIndex = HVACFan::getFanObjectVectorIndex( c->fanAssociatedWithCoilName ); + } + c->fanSizeMaxAirVolumeFlow = HVACFan::fanObjs[ c->supFanVecIndex ]->designAirVolFlowRate; + c->fanSizeMaxAirMassFlow = HVACFan::fanObjs[ c->supFanVecIndex ]->maxAirMassFlowRate(); + break; + } + case DataAirSystems::fanModelTypeNotYetSet: { + // do nothing + break; + } + } // end switch + + c->coilAndFanNetTotalCapacityIdealPeak = c->coilTotCapAtPeak - c->fanHeatGainIdealPeak; + + // fill out some plant design info + if ( c->pltSizNum > 0 ) { + c->plantDesSupTemp = DataSizing::PlantSizData( c->pltSizNum ).ExitTemp; + c->plantDesDeltaTemp = DataSizing::PlantSizData( c->pltSizNum ).DeltaT; + if ( DataSizing::PlantSizData( c->pltSizNum ).LoopType == DataSizing::HeatingLoop ) { + c->plantDesRetTemp = c->plantDesSupTemp - c->plantDesDeltaTemp; + } else if ( DataSizing::PlantSizData( c->pltSizNum ).LoopType == DataSizing::CoolingLoop || DataSizing::PlantSizData( c->pltSizNum ).LoopType == DataSizing::CondenserLoop ) { + c->plantDesRetTemp = c->plantDesSupTemp + c->plantDesDeltaTemp; + } + + if ( DataSizing::PlantSizData( c->pltSizNum ).LoopType != DataSizing::SteamLoop ) { + c->plantDesCapacity = c->cpFluid * c->rhoFluid * DataSizing::PlantSizData( c->pltSizNum ).DeltaT * DataSizing::PlantSizData( c->pltSizNum ).DesVolFlowRate; + } else { + // find boiler on this plant loop and get capacity from it + if ( allocated( BoilerSteam::Boiler )) { + for ( int boilerIndex = 1; boilerIndex <= BoilerSteam::NumBoilers; ++boilerIndex ) { + if ( BoilerSteam::Boiler( boilerIndex ).LoopNum = c->waterLoopNum ) { // steam boiler on this loop + c->plantDesSupTemp = BoilerSteam::Boiler( boilerIndex ).TempUpLimitBoilerOut; + c->plantDesRetTemp = BoilerSteam::Boiler( boilerIndex ).TempUpLimitBoilerOut - c->plantDesDeltaTemp; + c->plantDesCapacity = BoilerSteam::Boiler( boilerIndex ).NomCap; + } + } + } + + } + + if ( c->plantDesCapacity > 0.0 ) { + c->coilCapPrcntPlantCap = ( c->coilTotCapAtPeak / c->plantDesCapacity ) * 100.0; // convert to percentage. + } + } + + if ( c->pltSizNum == 0 && c->waterLoopNum == 0 ) { + c->rhoFluid = -999.0; + c->cpFluid = -999.0; + c->plantDesMaxMassFlowRate = -999.0; + c->coilFlowPrcntPlantFlow = -999.0; + c->plantDesSupTemp = -999.0; + c->plantDesDeltaTemp = -999.0; + c->plantDesRetTemp = -999.0; + c->coilDesWaterMassFlow = -999.0; + c->coilDesWaterEntTemp = -999.0; + c->coilDesWaterLvgTemp = -999.0; + c->coilDesWaterTempDiff = -999.0; + c->plantDesCapacity = -999.0; + c->coilCapPrcntPlantCap = -999.0; + c->coilFlowPrcntPlantFlow = -999.0; + } + + c->cpDryAir = Psychrometrics::PsyCpAirFnWTdb( 0.0, 20.0 ); + c->rhoStandAir = DataEnvironment::StdRhoAir ; + + // apply ADP method to find an SHR for Ideal loads peak, calculate sensible capacity for cooling coils + if ( c->coilDesEntTemp > c->coilDesLvgTemp ) { // cooling coil + Real64 CoilADPTemp = Psychrometrics::PsyTdpFnWPb( c->coilDesLvgHumRat, DataEnvironment::StdBaroPress ); // apparatus dewpoint temperature + Real64 CoilADPHumRat = Psychrometrics::PsyWFnTdpPb( CoilADPTemp, DataEnvironment::StdBaroPress ); // humidity ratio at apparatus dewpoint temperaure + Real64 CoilTinwADPEnthalpy = Psychrometrics::PsyHFnTdbW( c->coilDesEntTemp, CoilADPHumRat ); // Enthalpy at inlet drybulb and humidity ratio at apparatus dewpoint temperature + Real64 CoilADPEnthalpy = Psychrometrics::PsyHFnTdbW( CoilADPTemp, CoilADPHumRat ); // Enthalpy at apparatus dewpoint, with Tdb set at apparatus dewpoint + Real64 SHRatIdealPeak( 1.0 ); + if ( ( c->coilDesEntEnth - CoilADPEnthalpy ) > 1.e-10 ) { + SHRatIdealPeak = min( ( CoilTinwADPEnthalpy - CoilADPEnthalpy ) / ( c->coilDesEntEnth - CoilADPEnthalpy ), 1.0 ); // calculate SHR + } else { + SHRatIdealPeak = 1.0; + } + c->coilSensCapAtPeak = SHRatIdealPeak * c->coilTotCapAtPeak; + } + } // end for loop over each coil + + +} + + + + + +int +ReportCoilSelection::getIndexForOrCreateDataObjFromCoilName ( + std::string const & coilName, // user-defined name of the coil + std::string const & coilType // idf input object class name of coil +) +{ + int index( -1 ); + for ( int i = 0; i < numCoilsReported_ ; i++ ) { + if ( coilSelectionDataObjs[ i ] != nullptr ) { + if ( InputProcessor::SameString( coilSelectionDataObjs[ i ]->coilName_ , coilName ) ) { + if ( InputProcessor::SameString( coilSelectionDataObjs[ i ]->coilObjName , coilType ) ) { + return index = i; + } else { + // throw error coil type does not match coil name, check for unique names across coil types + ShowWarningError( "check for unique coil names across different coil types: " + coilName + " occurs in both " + coilType + " and " +coilSelectionDataObjs[ i ]->coilObjName ); + } + } + } + } + + if ( index = -1 ) { // then did not find it + //check if really a coil type + bool found( false ); + bool locIsCooling( false ); + bool locIsHeating( false ); + for ( int loop = 1; loop < DataHVACGlobals::NumAllCoilTypes; ++loop ) { + if ( InputProcessor::SameString( coilType, DataHVACGlobals::cAllCoilTypes( loop ) ) ) { + found = true; + locIsCooling = InputProcessor::SameString( coilType, DataHVACGlobals::cCoolingCoilTypes( loop ) ); + locIsHeating = InputProcessor::SameString( coilType, DataHVACGlobals::cHeatingCoilTypes( loop ) ); + break; + } + } + if ( found ) { + coilSelectionDataObjs.emplace_back( new CoilSelectionData( coilName ) ); + index = coilSelectionDataObjs.size() - 1; + coilSelectionDataObjs[ index ]->coilObjName = coilType; + ++numCoilsReported_; + coilSelectionDataObjs[ index ]->isCooling = locIsCooling; + coilSelectionDataObjs[ index ]->isHeating = locIsHeating; + } + + } + + return index; +} + +void +ReportCoilSelection::setRatedCoilConditions( + std::string const & coilName, // ! user-defined name of the coil + std::string const & coilObjName , // coil object name, e.g., Coil:Cooling:Water + Real64 const RatedCoilTotCap, // ! rated coil total capacity [W] + Real64 const RatedCoilSensCap, // rated coil sensible capacity [W] + Real64 const RatedAirMassFlow, // rated coil design air mass flow rate [m3/s] + Real64 const RatedCoilInDb, // rated coil inlet air dry bulb at time of peak [C] + Real64 const RatedCoilInHumRat, // rated coil inlet air humidity ratio [kgWater/kgDryAir] + Real64 const RatedCoilInWb, // rated coil inlet air wet bulb [C] + Real64 const RatedCoilOutDb, // rated coil outlet air dry bulb [C] + Real64 const RatedCoilOutHumRat, // rated coil outlet air humidity ratio, [kgWater/kgDryAir] + Real64 const RatedCoilOutWb, // rated coil outlet air wet bulb [C] + Real64 const RatedCoilOadbRef, // rated DX coil outside air dry bulb reference [C] + Real64 const RatedCoilOawbRef, // rated DX coil outside air wet bulb reference [C] + Real64 const RatedCoilBpFactor, // rated coil bypass factor + Real64 const RatedCoilEff // rated coil effectiveness +) +{ + int index = getIndexForOrCreateDataObjFromCoilName( coilName,coilObjName ); + auto & c( coilSelectionDataObjs[ index ] ); + c->coilRatedTotCap = RatedCoilTotCap; + c->coilRatedSensCap = RatedCoilSensCap; + c->ratedAirMassFlow = RatedAirMassFlow; + c->ratedCoilInDb = RatedCoilInDb; + c->ratedCoilInWb = RatedCoilInWb; + c->ratedCoilInHumRat = RatedCoilInHumRat; + if ( ( RatedCoilInDb == -999.0) || ( RatedCoilInHumRat == -999.0) ) { + c->ratedCoilInEnth = -999.0; + } else { + c->ratedCoilInEnth = Psychrometrics::PsyHFnTdbW( RatedCoilInDb,RatedCoilInHumRat ); + } + + + c->ratedCoilOutDb = RatedCoilOutDb; + c->ratedCoilOutWb = RatedCoilOutWb; + c->ratedCoilOutHumRat = RatedCoilOutHumRat; + if ( ( RatedCoilOutDb == -999.0 ) || ( RatedCoilOutHumRat == -999.0 ) ) { + c->ratedCoilOutEnth = -999.0; + } else { + c->ratedCoilOutEnth = Psychrometrics::PsyHFnTdbW( RatedCoilOutDb,RatedCoilOutHumRat ); + } + + c->ratedCoilEff = RatedCoilEff; + c->ratedCoilBpFactor = RatedCoilBpFactor; +//TODO //c->ratedCoilAppDewPt = + c->ratedCoilOadbRef = RatedCoilOadbRef; + c->ratedCoilOawbRef = RatedCoilOawbRef; +} + +void +ReportCoilSelection::setCoilAirFlow( + std::string const & coilName, // user-defined name of the coil + std::string const & coilType, // idf input object class name of coil + Real64 const airVdot, // air flow rate in m3/s + bool const isAutoSized // true if air flow was autosized +) +{ + int index = getIndexForOrCreateDataObjFromCoilName( coilName,coilType ); + auto & c( coilSelectionDataObjs[ index ] ); + c->coilDesVolFlow = airVdot; + c->volFlowIsAutosized = isAutoSized; + + c->coilDesMassFlow = airVdot * DataEnvironment::StdRhoAir ; + +} + +void +ReportCoilSelection::setCoilWaterFlow( + std::string const & coilName, // user-defined name of the coil + std::string const & coilType, // idf input object class name of coil + Real64 const waterVdot, // plant fluid flow rate in m3/s + bool const isAutoSized, // true if water flow was autosized + int const plantSizNum, // plant sizing structure index + int const plantLoopNum // plant loop structure index +) +{ + int index = getIndexForOrCreateDataObjFromCoilName( coilName,coilType ); + auto & c( coilSelectionDataObjs[ index ] ); + c->pltSizNum = plantSizNum; + c->waterLoopNum = plantLoopNum; + + if ( c->waterLoopNum > 0 && c->pltSizNum > 0 ) { + c->plantLoopName = DataPlant::PlantLoop( c->waterLoopNum ).Name; + if ( DataSizing::PlantSizData( c->pltSizNum ).LoopType != DataSizing::SteamLoop ) { + c->rhoFluid = FluidProperties::GetDensityGlycol( DataPlant::PlantLoop( c->waterLoopNum ).FluidName, DataGlobals::InitConvTemp, DataPlant::PlantLoop( c->waterLoopNum ).FluidIndex, "ReportCoilSelection::setCoilWaterFlow" ); + + c->cpFluid = FluidProperties::GetSpecificHeatGlycol( DataPlant::PlantLoop( c->waterLoopNum ).FluidName, DataGlobals::InitConvTemp, DataPlant::PlantLoop( c->waterLoopNum ).FluidIndex, "ReportCoilSelection::setCoilWaterFlow" ); + } else { // steam loop + c->rhoFluid = FluidProperties::GetSatDensityRefrig( DataPlant::PlantLoop( c->waterLoopNum ).FluidName, 100.0, 1.0, DataPlant::PlantLoop( c->waterLoopNum ).FluidIndex, "ReportCoilSelection::setCoilWaterFlow" ); + c->cpFluid = FluidProperties::GetSatSpecificHeatRefrig( DataPlant::PlantLoop( c->waterLoopNum ).FluidName, 100.0, 0.0, DataPlant::PlantLoop( c->waterLoopNum ).FluidIndex, "ReportCoilSelection::setCoilWaterFlow" ); + } + + c->coilDesWaterMassFlow = waterVdot * c->rhoFluid; + } + if ( isAutoSized ) { + c->coilWaterFlowAutoMsg = "Yes" ; + } else { + c->coilWaterFlowAutoMsg = "No" ; + } +} + +void +ReportCoilSelection::setCoilEntAirTemp( + std::string const & coilName, // user-defined name of the coil + std::string const & coilType, // idf input object class name of coil + Real64 const entAirDryBulbTemp, // degree C air entering coil + int const curSysNum, // airloop system number index, if non zero + int const curZoneEqNum // zone equipment list index, if non-zero +) +{ + int index = getIndexForOrCreateDataObjFromCoilName( coilName,coilType ); + auto & c( coilSelectionDataObjs[ index ] ); + c->coilDesEntTemp = entAirDryBulbTemp; + c->airloopNum = curSysNum; + doAirLoopSetup( index ); + c->zoneEqNum = curZoneEqNum; +} + +void +ReportCoilSelection::setCoilEntAirHumRat( + std::string const & coilName, // user-defined name of the coil + std::string const & coilType, // idf input object class name of coil + Real64 const entAirHumrat // +) +{ + int index = getIndexForOrCreateDataObjFromCoilName( coilName,coilType ); + auto & c( coilSelectionDataObjs[ index ] ); + c->coilDesEntHumRat = entAirHumrat; +} + +void +ReportCoilSelection::setCoilEntWaterTemp( + std::string const & coilName, // user-defined name of the coil + std::string const & coilType, // idf input object class name of coil + Real64 const entWaterTemp // +) +{ + int index = getIndexForOrCreateDataObjFromCoilName( coilName,coilType ); + auto & c( coilSelectionDataObjs[ index ] ); + c->coilDesWaterEntTemp = entWaterTemp; +} + +void +ReportCoilSelection::setCoilLvgWaterTemp( + std::string const & coilName, // user-defined name of the coil + std::string const & coilType, // idf input object class name of coil + Real64 const lvgWaterTemp // +) +{ + int index = getIndexForOrCreateDataObjFromCoilName( coilName,coilType ); + auto & c( coilSelectionDataObjs[ index ] ); + c->coilDesWaterLvgTemp = lvgWaterTemp; +} + +void +ReportCoilSelection::setCoilWaterDeltaT( + std::string const & coilName, // user-defined name of the coil + std::string const & coilType, // idf input object class name of coil + Real64 const CoilWaterDeltaT // degree C temperature difference used to size coil +) +{ + int index = getIndexForOrCreateDataObjFromCoilName( coilName,coilType ); + auto & c( coilSelectionDataObjs[ index ] ); + c->coilDesWaterTempDiff = CoilWaterDeltaT; +} + +void +ReportCoilSelection::setCoilLvgAirTemp( + std::string const & coilName, // user-defined name of the coil + std::string const & coilType, // idf input object class name of coil + Real64 const lvgAirDryBulbTemp // +) +{ + int index = getIndexForOrCreateDataObjFromCoilName( coilName,coilType ); + auto & c( coilSelectionDataObjs[ index ] ); + c->coilDesLvgTemp = lvgAirDryBulbTemp; +} + + +void +ReportCoilSelection::setCoilLvgAirHumRat( + std::string const & coilName, // user-defined name of the coil + std::string const & coilType, // idf input object class name of coil + Real64 const lvgAirHumRat // +) +{ + int index = getIndexForOrCreateDataObjFromCoilName( coilName,coilType ); + auto & c( coilSelectionDataObjs[ index ] ); + c->coilDesLvgHumRat = lvgAirHumRat; +} + +void +ReportCoilSelection::setCoilCoolingCapacity( + std::string const & coilName, // user-defined name of the coil + std::string const & coilType, // idf input object class name of coil + Real64 const TotalCoolingCap, // {W} coil cooling capacity, sizing result + bool const isAutoSize, // true if value was autosized + int const curSysNum, // airloop system number index, if non zero + int const curZoneEqNum, // zone equipment list index, if non-zero + int const curOASysNum, // OA system equipment list index, if non-zero + Real64 const fanCoolLoad, // {W} fan load used in ideal loads coil sizing + Real64 const coilCapFunTempFac, // {W} curve result for modification factor for capacity as a function of temperature + Real64 const DXFlowPerCapMinRatio, // non dimensional ratio, capacity adjustment ratio min + Real64 const DXFlowPerCapMaxRatio // non dimensional ratio, capacity adjustment ratio max +) +{ + int index = getIndexForOrCreateDataObjFromCoilName( coilName,coilType ); + auto & c( coilSelectionDataObjs[ index ] ); +// no this is adjusted back to ratings c->coilTotCapAtPeak = TotalCoolingCap; + c->coilCapFTIdealPeak = coilCapFunTempFac; + c->coilTotCapAtPeak = TotalCoolingCap / c->coilCapFTIdealPeak; + c->capIsAutosized = isAutoSize; + c->minRatio = DXFlowPerCapMinRatio; + c->maxRatio = DXFlowPerCapMaxRatio; + + c->fanHeatGainIdealPeak = fanCoolLoad; + c->airloopNum = curSysNum; + doAirLoopSetup( index ); + c->zoneEqNum = curZoneEqNum; +// if ( c->zoneEqNum > 0 ) doZoneEqSetup( index ); + c->oASysNum = curOASysNum; + if ( curSysNum > 0 && c->zoneEqNum == 0 && allocated( DataSizing::FinalSysSizing ) ) { + + // These next blocks does not always work with SizingPeriod:WeatherFileDays or SizingPeriod:WeatherFileConditionType, protect against hard crash + if ( DataSizing::SysSizPeakDDNum( curSysNum ).SensCoolPeakDD > 0 && DataSizing::SysSizPeakDDNum( curSysNum ).SensCoolPeakDD <= DataEnvironment::TotDesDays ) { + c->desDayNameAtSensPeak = WeatherManager::DesDayInput( DataSizing::SysSizPeakDDNum( curSysNum ).SensCoolPeakDD ).Title; + c->coilSensePeakHrMin = General::TrimSigDigits( WeatherManager::DesDayInput( DataSizing::SysSizPeakDDNum( curSysNum ).SensCoolPeakDD ).Month ) + "/" + General::TrimSigDigits( WeatherManager::DesDayInput( DataSizing::SysSizPeakDDNum( curSysNum ).SensCoolPeakDD ).DayOfMonth ) + " " + getTimeText( DataSizing::SysSizPeakDDNum( curSysNum ).TimeStepAtSensCoolPk( DataSizing::SysSizPeakDDNum( curSysNum ).SensCoolPeakDD ) ); + } + if ( DataSizing::SysSizPeakDDNum( curSysNum ).TotCoolPeakDD > 0 && DataSizing::SysSizPeakDDNum( curSysNum ).TotCoolPeakDD <= DataEnvironment::TotDesDays ) { + c->desDayNameAtTotalPeak = WeatherManager::DesDayInput( DataSizing::SysSizPeakDDNum( curSysNum ).TotCoolPeakDD ).Title; + c->coilTotalPeakHrMin = General::TrimSigDigits( WeatherManager::DesDayInput( DataSizing::SysSizPeakDDNum( curSysNum ).TotCoolPeakDD ).Month ) + "/" + General::TrimSigDigits( WeatherManager::DesDayInput( DataSizing::SysSizPeakDDNum( curSysNum ).TotCoolPeakDD ).DayOfMonth ) + " " + getTimeText( DataSizing::SysSizPeakDDNum( curSysNum ).TimeStepAtTotCoolPk( DataSizing::SysSizPeakDDNum( curSysNum ).TotCoolPeakDD ) ); + } + + if ( DataSizing::SysSizPeakDDNum( curSysNum ).CoolFlowPeakDD > 0 && DataSizing::SysSizPeakDDNum( curSysNum ).CoolFlowPeakDD <= DataEnvironment::TotDesDays ) { + c->desDayNameAtAirFlowPeak = WeatherManager::DesDayInput( DataSizing::SysSizPeakDDNum( curSysNum ).CoolFlowPeakDD ).Title; + c->airPeakHrMin = General::TrimSigDigits( WeatherManager::DesDayInput( DataSizing::SysSizPeakDDNum( curSysNum ).CoolFlowPeakDD ).Month ) + "/" + General::TrimSigDigits( WeatherManager::DesDayInput( DataSizing::SysSizPeakDDNum( curSysNum ).CoolFlowPeakDD ).DayOfMonth ) + " " + getTimeText( DataSizing::SysSizPeakDDNum( curSysNum ).TimeStepAtCoolFlowPk( DataSizing::SysSizPeakDDNum( curSysNum ).CoolFlowPeakDD ) ); + } + + + c->oaPeakTemp = DataSizing::FinalSysSizing( curSysNum ).OutTempAtCoolPeak; + c->oaPeakVolFlow = DataSizing::FinalSysSizing( curSysNum ).DesOutAirVolFlow; + c->oaPeakHumRat = DataSizing::FinalSysSizing( curSysNum ).OutHumRatAtCoolPeak; + c->raPeakTemp = DataSizing::FinalSysSizing( curSysNum ).RetTempAtCoolPeak; + c->raPeakHumRat = DataSizing::FinalSysSizing( curSysNum ).RetHumRatAtCoolPeak; + c->coilSizingMethodConcurrence = DataSizing::FinalSysSizing( curSysNum ).SizingOption; + c->coilSizingMethodCapacity = DataSizing::FinalSysSizing( curSysNum ).CoolingCapMethod; + c->coilSizingMethodAirFlow = DataSizing::FinalSysSizing( curSysNum ).ScaleCoolSAFMethod; + //DesOutAirVolFlow + + //loop over cooled zones attached to this airloop to find average Room condition + // weighted average by zone air volume for all the zones on this coil's air system + Real64 sumT_V( 0.0 ); // numerator for average zone temperature, zone temperature values times zone air volume + Real64 sumW_V( 0.0 ); // numerator average zone humidity ratio, zone hum rat value times zone air volume + Real64 sumSensLoad( 0.0 ); // straight total for zone design loads + Real64 sumV( 0.0 ); // denominator for zone-volume weighted averages + + for ( auto & z : c->zoneNum ) { + Real64 mult = DataHeatBalance::Zone( z ).Multiplier * DataHeatBalance::Zone( z ).ListMultiplier; + sumT_V += DataSizing::FinalZoneSizing( z ).ZoneTempAtCoolPeak * DataHeatBalance::Zone( z ).Volume * mult; + sumW_V += DataSizing::FinalZoneSizing( z ).ZoneHumRatAtCoolPeak * DataHeatBalance::Zone( z ).Volume * mult; + sumSensLoad += DataSizing::FinalZoneSizing( z ).DesCoolLoad * mult; + sumV += DataHeatBalance::Zone( z ).Volume * mult; + } + + if ( c->zoneNum.size() > 0 && sumV > 0.0 ) { + c->rmPeakTemp = ( sumT_V / sumV ); + c->rmPeakHumRat = ( sumW_V / sumV ); + c->rmPeakRelHum = Psychrometrics::PsyRhFnTdbWPb( c->rmPeakTemp,c->rmPeakHumRat, DataEnvironment::StdBaroPress ) * 100.0; // convert to percentage + } else { + c->rmPeakTemp = -999.0; + c->rmPeakHumRat= -999.0; + c->rmPeakRelHum = -999.0; + } + + if ( c->coilSizingMethodConcurrence == DataSizing::Coincident ) { + c->rmSensibleAtPeak = DataSizing::FinalSysSizing( curSysNum).SysCoolCoinSpaceSens; + } else if ( c->coilSizingMethodConcurrence == DataSizing::NonCoincident ){ + c->rmSensibleAtPeak = sumSensLoad; + } + + // now set Coil Ent And Lvg Conditions + if ( curOASysNum > 0 ) { // then this system coil is part of OA system + c->coilDesEntTemp = DataSizing::FinalSysSizing( curSysNum ).OutTempAtCoolPeak; + c->coilDesEntHumRat = DataSizing::FinalSysSizing( curSysNum ).OutHumRatAtCoolPeak; + c->coilDesEntWetBulb = Psychrometrics::PsyTwbFnTdbWPb( c->coilDesEntTemp, c->coilDesEntHumRat, DataEnvironment::StdBaroPress, "ReportCoilSelection::setCoilCoolingCapacity" ); + c->coilDesEntEnth = Psychrometrics::PsyHFnTdbW ( c->coilDesEntTemp, c->coilDesEntHumRat ); + c->coilDesLvgTemp = DataSizing::FinalSysSizing( curSysNum ).PrecoolTemp; + c->coilDesLvgHumRat = DataSizing::FinalSysSizing( curSysNum ).PrecoolHumRat; + c->coilDesLvgWetBulb = Psychrometrics::PsyTwbFnTdbWPb( c->coilDesLvgTemp, c->coilDesLvgHumRat, DataEnvironment::StdBaroPress, "ReportCoilSelection::setCoilCoolingCapacity" ); + c->coilDesLvgEnth = Psychrometrics::PsyHFnTdbW ( c->coilDesLvgTemp, c->coilDesLvgHumRat ); + + } else { // part of main air loop + c->coilDesEntTemp = DataSizing::FinalSysSizing( curSysNum ).MixTempAtCoolPeak; + c->coilDesEntHumRat = DataSizing::FinalSysSizing( curSysNum ).MixHumRatAtCoolPeak; + c->coilDesEntWetBulb = Psychrometrics::PsyTwbFnTdbWPb( c->coilDesEntTemp, c->coilDesEntHumRat, DataEnvironment::StdBaroPress, "ReportCoilSelection::setCoilCoolingCapacity" ); + c->coilDesEntEnth = Psychrometrics::PsyHFnTdbW ( c->coilDesEntTemp, c->coilDesEntHumRat ); + c->coilDesLvgTemp = DataSizing::FinalSysSizing( curSysNum ).CoolSupTemp; + c->coilDesLvgHumRat = DataSizing::FinalSysSizing( curSysNum ).CoolSupHumRat; + c->coilDesLvgWetBulb = Psychrometrics::PsyTwbFnTdbWPb( c->coilDesLvgTemp, c->coilDesLvgHumRat, DataEnvironment::StdBaroPress, "ReportCoilSelection::setCoilCoolingCapacity" ); + c->coilDesLvgEnth = Psychrometrics::PsyHFnTdbW ( c->coilDesLvgTemp, c->coilDesLvgHumRat ); + if ( DataAirSystems::PrimaryAirSystem( curSysNum ).NumOACoolCoils > 0) { // there is precooling of the OA stream + c->oaPretreated = true; + } + + } + + } else if ( curZoneEqNum > 0 && allocated( DataSizing::FinalZoneSizing ) ) { + c->desDayNameAtSensPeak = DataSizing::FinalZoneSizing( curZoneEqNum ).CoolDesDay; + c->oaPeakTemp = DataSizing::FinalZoneSizing( curZoneEqNum ).OutTempAtCoolPeak; + c->oaPeakHumRat = DataSizing::FinalZoneSizing(curZoneEqNum).OutHumRatAtCoolPeak; + c->raPeakTemp = DataSizing::FinalZoneSizing( curZoneEqNum ).ZoneRetTempAtCoolPeak; + c->raPeakHumRat = DataSizing::FinalZoneSizing( curZoneEqNum ).ZoneHumRatAtCoolPeak; + c->rmPeakTemp = DataSizing::FinalZoneSizing( curZoneEqNum ).ZoneTempAtCoolPeak; + c->rmPeakHumRat = DataSizing::FinalZoneSizing( curZoneEqNum ).ZoneHumRatAtCoolPeak; + c->rmPeakRelHum = Psychrometrics::PsyRhFnTdbWPb( c->rmPeakTemp,c->rmPeakHumRat, DataEnvironment::StdBaroPress ) * 100.0; // convert to percentage + if ( DataSizing::FinalZoneSizing( curZoneEqNum ).CoolDDNum > 0 && DataSizing::FinalZoneSizing( curZoneEqNum ).CoolDDNum <= DataEnvironment::TotDesDays ) { + c->coilSensePeakHrMin = General::TrimSigDigits( WeatherManager::DesDayInput( DataSizing::FinalZoneSizing( curZoneEqNum ).CoolDDNum ).Month ) + "/" + General::TrimSigDigits( WeatherManager::DesDayInput( DataSizing::FinalZoneSizing( curZoneEqNum ).CoolDDNum ).DayOfMonth ) + " " + getTimeText( DataSizing::FinalZoneSizing( curZoneEqNum ).TimeStepNumAtCoolMax ); + c->airPeakHrMin = General::TrimSigDigits( WeatherManager::DesDayInput( DataSizing::FinalZoneSizing( curZoneEqNum ).CoolDDNum ).Month ) + "/" + General::TrimSigDigits( WeatherManager::DesDayInput( DataSizing::FinalZoneSizing( curZoneEqNum ).CoolDDNum ).DayOfMonth ) + " " + getTimeText( DataSizing::FinalZoneSizing( curZoneEqNum ).TimeStepNumAtCoolMax ); + } + + c->rmSensibleAtPeak = DataSizing::FinalZoneSizing( curZoneEqNum ).DesCoolLoad; + + c->oaPeakVolFlow = DataSizing::ZoneEqSizing( curZoneEqNum ).OAVolFlow; + //coil entering conditions depend on the type of zone equipment involved + // set typeof_Coil integer + if ( DataSizing::TermUnitIU ) { //an unpowered induction terminal unit + //should be picked up by CoolingWaterDesAirInletHumRatSizing and CoolingWaterDesWaterInletTempSizing + //c->coilDesEntTemp = DataSizing::FinalZoneSizing( curZoneEqNum ).ZoneTempAtCoolPeak; + //c->coilDesEntHumRat = DataSizing::FinalZoneSizing( curZoneEqNum ).ZoneHumRatAtCoolPeak; + } else if ( DataSizing::ZoneEqFanCoil ) { + //should be picked up by CoolingWaterDesAirInletHumRatSizing and CoolingWaterDesWaterInletTempSizing + //if ( DataSizing::FinalZoneSizing( curZoneEqNum ).DesCoolMassFlow > 0.0 ) { + // c->oaPeakVolFrac = min( (DataEnvironment::StdRhoAir * c->oaPeakVolFlow)/DataSizing::FinalZoneSizing( curZoneEqNum ).DesCoolMassFlow, 1.0 ); + //} else { + // c->oaPeakVolFrac = 0.0; + //} + //c->coilDesEntTemp = c->oaPeakVolFrac * DataSizing::FinalZoneSizing( curZoneEqNum ).OutTempAtCoolPeak + ( 1.0 - c->oaPeakVolFrac ) * DataSizing::FinalZoneSizing( curZoneEqNum ).ZoneTempAtCoolPeak; + //c->coilDesEntHumRat = c->oaPeakVolFrac * DataSizing::FinalZoneSizing( curZoneEqNum ).OutHumRatAtCoolPeak + ( 1.0 - c->oaPeakVolFrac ) * DataSizing::FinalZoneSizing( curZoneEqNum ).ZoneHumRatAtCoolPeak; + } else if ( DataSizing::ZoneEqDXCoil ) { + if ( DataSizing::ZoneEqSizing( curZoneEqNum ).OAVolFlow > 0.0) { + c->coilDesEntTemp = DataSizing::FinalZoneSizing( curZoneEqNum ).DesCoolCoilInTemp; + c->coilDesEntHumRat = DataSizing::FinalZoneSizing( curZoneEqNum ).DesCoolCoilInHumRat; + } else { + c->coilDesEntTemp = DataSizing::FinalZoneSizing( curZoneEqNum ).ZoneRetTempAtCoolPeak; + c->coilDesEntHumRat = DataSizing::FinalZoneSizing( curZoneEqNum ).ZoneHumRatAtCoolPeak; + } + } else { + c->coilDesEntTemp = DataSizing::FinalZoneSizing( curZoneEqNum ).DesCoolCoilInTemp; + c->coilDesEntHumRat = DataSizing::FinalZoneSizing( curZoneEqNum ).DesCoolCoilInHumRat; + } + + c->coilDesLvgTemp = DataSizing::FinalZoneSizing( curZoneEqNum ).CoolDesTemp; + c->coilDesLvgHumRat = DataSizing::FinalZoneSizing( curZoneEqNum ).CoolDesHumRat; + c->coilDesLvgWetBulb = Psychrometrics::PsyTwbFnTdbWPb( c->coilDesLvgTemp, c->coilDesLvgHumRat, DataEnvironment::StdBaroPress, "ReportCoilSelection::setCoilCoolingCapacity" ); + c->coilDesLvgEnth = Psychrometrics::PsyHFnTdbW ( c->coilDesLvgTemp, c->coilDesLvgHumRat ); + } else { + // do nothing + } + + + //calc sensible capacity from inlet outlet + c->cpMoistAir = Psychrometrics::PsyCpAirFnWTdb( c->coilDesEntHumRat, 0.5*( c->coilDesEntTemp + c->coilDesLvgTemp ) ); + +} + +void +ReportCoilSelection::setCoilHeatingCapacity( + std::string const & coilName, // user-defined name of the coil + std::string const & coilType, // idf input object class name of coil + Real64 const totalHeatingCap, // {W} coil Heating capacity + bool const isAutoSize, // true if value was autosized + int const curSysNum, // airloop system number index, if non zero + int const curZoneEqNum, // zone equipment list index, if non-zero + int const curOASysNum, // OA system equipment list index, if non-zero + Real64 const fanHeatGain, // {W} fan load used in ideal loads coil sizing + Real64 const coilCapFunTempFac, // {W} curve result for modification factor for capacity as a function of temperature + Real64 const DXFlowPerCapMinRatio, // non dimensional ratio, capacity adjustment ratio min + Real64 const DXFlowPerCapMaxRatio // non dimensional ratio, capacity adjustment ratio max +) +{ + int index = getIndexForOrCreateDataObjFromCoilName( coilName,coilType ); + auto & c( coilSelectionDataObjs[ index ] ); + c->capIsAutosized = isAutoSize; + c->coilCapFTIdealPeak = coilCapFunTempFac; + c->coilTotCapAtPeak = totalHeatingCap / c->coilCapFTIdealPeak; + c->minRatio = DXFlowPerCapMinRatio; + c->maxRatio = DXFlowPerCapMaxRatio; + + + c->fanHeatGainIdealPeak = fanHeatGain; + c->airloopNum = curSysNum; + doAirLoopSetup( index ); + c->zoneEqNum = curZoneEqNum; +// if ( c->zoneEqNum > 0 ) doZoneEqSetup( index ); + if ( curSysNum > 0 && c->zoneEqNum == 0 && allocated( DataSizing::FinalSysSizing ) ) { + c->desDayNameAtSensPeak = DataSizing::FinalSysSizing( curSysNum ).HeatDesDay; + + + c->oaPeakTemp = DataSizing::FinalSysSizing( curSysNum).HeatOutTemp; + c->oaPeakHumRat = DataSizing::FinalSysSizing( curSysNum).HeatOutHumRat; + c->oaPeakVolFlow = DataSizing::FinalSysSizing( curSysNum ).DesOutAirVolFlow; + c->raPeakTemp = DataSizing::FinalSysSizing( curSysNum).HeatRetTemp; + c->raPeakHumRat = DataSizing::FinalSysSizing( curSysNum).HeatRetHumRat; + c->coilSizingMethodConcurrence = DataSizing::FinalSysSizing( curSysNum).SizingOption; + c->coilSizingMethodCapacity = DataSizing::FinalSysSizing( curSysNum ).HeatingCapMethod; + c->coilSizingMethodAirFlow = DataSizing::FinalSysSizing( curSysNum ).ScaleHeatSAFMethod; + //DesOutAirVolFlow + + //loop over heated zones attached to this airloop to find average Room condition, if none heated use cooled zones + // weighted average by zone air volume for all the zones on this coil's air system + Real64 sumT_V( 0.0 ); // numerator for average zone temperature, zone temperature values times zone air volume + Real64 sumW_V( 0.0 ); // numerator average zone humidity ratio, zone hum rat value times zone air volume + Real64 sumLoad( 0.0 ); // straight total for zone design loads + Real64 sumV( 0.0 ); // denominator for zone-volume weighted averages + + for ( auto & z : c->zoneNum ) { + Real64 mult = DataHeatBalance::Zone( z ).Multiplier * DataHeatBalance::Zone( z ).ListMultiplier; + sumT_V += DataSizing::FinalZoneSizing( z ).ZoneTempAtHeatPeak * DataHeatBalance::Zone( z ).Volume * mult; + sumW_V += DataSizing::FinalZoneSizing( z ).ZoneHumRatAtHeatPeak * DataHeatBalance::Zone( z ).Volume * mult; + sumLoad += DataSizing::FinalZoneSizing( z ).DesHeatLoad * mult; + sumV += DataHeatBalance::Zone( z ).Volume * mult; + } + + if ( c->zoneNum.size() > 0 && sumV > 0.0 ) { + c->rmPeakTemp = ( sumT_V / sumV ); + c->rmPeakHumRat = ( sumW_V / sumV ); + c->rmPeakRelHum = Psychrometrics::PsyRhFnTdbWPb( c->rmPeakTemp,c->rmPeakHumRat, DataEnvironment::StdBaroPress ) * 100.0; // convert to percentage + } else { + c->rmPeakTemp = -999.0; + c->rmPeakHumRat= -999.0; + c->rmPeakRelHum = -999.0; + } + + if ( c->coilSizingMethodConcurrence == DataSizing::Coincident ) { + c->rmSensibleAtPeak = DataSizing::FinalSysSizing( curSysNum).SysHeatCoinSpaceSens; + } else if ( c->coilSizingMethodConcurrence == DataSizing::NonCoincident ){ + c->rmSensibleAtPeak = sumLoad; + } + + if ( DataSizing::FinalSysSizing( curSysNum ).HeatDDNum > 0 && DataSizing::FinalSysSizing( curSysNum ).HeatDDNum <= DataEnvironment::TotDesDays ) { + c->coilSensePeakHrMin = General::TrimSigDigits( WeatherManager::DesDayInput( DataSizing::FinalSysSizing( curSysNum ).HeatDDNum ).Month ) + "/" + General::TrimSigDigits( WeatherManager::DesDayInput( DataSizing::FinalSysSizing( curSysNum ).HeatDDNum ).DayOfMonth ) + " " + getTimeText( DataSizing::FinalSysSizing( curSysNum ).SysHeatCoilTimeStepPk ); + c->airPeakHrMin = General::TrimSigDigits( WeatherManager::DesDayInput( DataSizing::FinalSysSizing( curSysNum ).HeatDDNum ).Month ) + "/" + General::TrimSigDigits( WeatherManager::DesDayInput( DataSizing::FinalSysSizing( curSysNum ).HeatDDNum ).DayOfMonth ) + " " + getTimeText( DataSizing::FinalSysSizing( curSysNum ).SysHeatAirTimeStepPk ); + c->desDayNameAtAirFlowPeak = WeatherManager::DesDayInput( DataSizing::FinalSysSizing( curSysNum ).HeatDDNum ).Title ; + } + + // now set Coil Ent And Lvg Conditions + + if ( curOASysNum > 0 ) { // then this system coil is part of OA system + c->coilDesEntTemp = DataSizing::FinalSysSizing( curSysNum ).HeatOutTemp; + c->coilDesEntHumRat = DataSizing::FinalSysSizing( curSysNum ).HeatOutHumRat; + c->coilDesEntWetBulb = Psychrometrics::PsyTwbFnTdbWPb( c->coilDesEntTemp, c->coilDesEntHumRat, DataEnvironment::StdBaroPress, "ReportCoilSelection::setCoilCoolingCapacity" ); + c->coilDesEntEnth = Psychrometrics::PsyHFnTdbW ( c->coilDesEntTemp, c->coilDesEntHumRat ); + c->coilDesLvgTemp = DataSizing::FinalSysSizing( curSysNum ).PreheatTemp; + c->coilDesLvgHumRat = DataSizing::FinalSysSizing( curSysNum ).PreheatHumRat; + c->coilDesLvgWetBulb = Psychrometrics::PsyTwbFnTdbWPb( c->coilDesLvgTemp, c->coilDesLvgHumRat, DataEnvironment::StdBaroPress, "ReportCoilSelection::setCoilCoolingCapacity" ); + c->coilDesLvgEnth = Psychrometrics::PsyHFnTdbW ( c->coilDesLvgTemp, c->coilDesLvgHumRat ); + + } else { // part of main air loop + c->coilDesEntTemp = DataSizing::FinalSysSizing( curSysNum ).HeatMixTemp; + c->coilDesEntHumRat = DataSizing::FinalSysSizing( curSysNum ).HeatMixHumRat; + c->coilDesEntWetBulb = Psychrometrics::PsyTwbFnTdbWPb( c->coilDesEntTemp, c->coilDesEntHumRat, DataEnvironment::StdBaroPress, "ReportCoilSelection::setCoilCoolingCapacity" ); + c->coilDesEntEnth = Psychrometrics::PsyHFnTdbW ( c->coilDesEntTemp, c->coilDesEntHumRat ); + c->coilDesLvgTemp = DataSizing::FinalSysSizing( curSysNum ).HeatSupTemp; + c->coilDesLvgHumRat = DataSizing::FinalSysSizing( curSysNum ).HeatSupHumRat; + c->coilDesLvgWetBulb = Psychrometrics::PsyTwbFnTdbWPb( c->coilDesLvgTemp, c->coilDesLvgHumRat, DataEnvironment::StdBaroPress, "ReportCoilSelection::setCoilCoolingCapacity" ); + c->coilDesLvgEnth = Psychrometrics::PsyHFnTdbW ( c->coilDesLvgTemp, c->coilDesLvgHumRat ); + if ( DataAirSystems::PrimaryAirSystem( curSysNum ).NumOAHeatCoils > 0) { // there is preHeating of the OA stream + c->oaPretreated = true; + } + } + + } else if ( curZoneEqNum > 0 && allocated( DataSizing::FinalZoneSizing ) ) { + c->desDayNameAtSensPeak = DataSizing::FinalZoneSizing( curZoneEqNum ).HeatDesDay; + c->oaPeakTemp = DataSizing::FinalZoneSizing( curZoneEqNum ).OutTempAtHeatPeak; + c->oaPeakHumRat = DataSizing::FinalZoneSizing(curZoneEqNum).OutHumRatAtHeatPeak; + c->raPeakTemp = DataSizing::FinalZoneSizing( curZoneEqNum ).ZoneRetTempAtHeatPeak; + c->raPeakHumRat = DataSizing::FinalZoneSizing( curZoneEqNum ).ZoneHumRatAtHeatPeak; + c->rmPeakTemp = DataSizing::FinalZoneSizing( curZoneEqNum ).ZoneTempAtHeatPeak; + c->rmPeakHumRat = DataSizing::FinalZoneSizing( curZoneEqNum ).ZoneHumRatAtHeatPeak; + c->rmPeakRelHum = Psychrometrics::PsyRhFnTdbWPb( c->rmPeakTemp,c->rmPeakHumRat, DataEnvironment::StdBaroPress ) * 100.0; // convert to percentage + if ( DataSizing::FinalZoneSizing( curZoneEqNum ).HeatDDNum > 0 && DataSizing::FinalZoneSizing( curZoneEqNum ).HeatDDNum <= DataEnvironment::TotDesDays ) { + c->coilSensePeakHrMin = General::TrimSigDigits( WeatherManager::DesDayInput( DataSizing::FinalZoneSizing( curZoneEqNum ).HeatDDNum ).Month ) + "/" + General::TrimSigDigits( WeatherManager::DesDayInput( DataSizing::FinalZoneSizing( curZoneEqNum ).HeatDDNum ).DayOfMonth ) + " " + getTimeText( DataSizing::FinalZoneSizing( curZoneEqNum ).TimeStepNumAtHeatMax ); + c->airPeakHrMin = General::TrimSigDigits( WeatherManager::DesDayInput( DataSizing::FinalZoneSizing( curZoneEqNum ).HeatDDNum ).Month ) + "/" + General::TrimSigDigits( WeatherManager::DesDayInput( DataSizing::FinalZoneSizing( curZoneEqNum ).HeatDDNum ).DayOfMonth ) + " " + getTimeText( DataSizing::FinalZoneSizing( curZoneEqNum ).TimeStepNumAtHeatMax ); + } + c->desDayNameAtAirFlowPeak = DataSizing::FinalZoneSizing( curZoneEqNum ).HeatDesDay; + + c->rmSensibleAtPeak = DataSizing::FinalZoneSizing( curZoneEqNum ).DesHeatLoad; + + c->oaPeakVolFlow = DataSizing::ZoneEqSizing( curZoneEqNum ).OAVolFlow; + //coil entering conditions depend on the type of zone equipment involved + // set typeof_Coil integer + if ( DataSizing::TermUnitIU ) { //an unpowered induction terminal unit + //should be picked up by HeatingWaterDesAirInletTempSizing and HeatingWaterDesAirInletHumRatSizing + + } else if ( DataSizing::TermUnitPIU ) { + //should be picked up by HeatingWaterDesAirInletTempSizing and HeatingWaterDesAirInletHumRatSizing + } else if ( DataSizing::ZoneEqFanCoil ) { + //should be picked up by CoolingWaterDesAirInletHumRatSizing and CoolingWaterDesWaterInletTempSizing + + } else if ( DataSizing::ZoneEqDXCoil ) { + if ( DataSizing::ZoneEqSizing( curZoneEqNum ).OAVolFlow > 0.0) { + c->coilDesEntTemp = DataSizing::FinalZoneSizing( curZoneEqNum ).DesHeatCoilInTemp; + c->coilDesEntHumRat = DataSizing::FinalZoneSizing( curZoneEqNum ).DesHeatCoilInHumRat; + } else { + c->coilDesEntTemp = DataSizing::FinalZoneSizing( curZoneEqNum ).ZoneRetTempAtHeatPeak; + c->coilDesEntHumRat = DataSizing::FinalZoneSizing( curZoneEqNum ).ZoneHumRatAtHeatPeak; + } + } else { + c->coilDesEntTemp = DataSizing::FinalZoneSizing( curZoneEqNum ).DesHeatCoilInTemp; + c->coilDesEntHumRat = DataSizing::FinalZoneSizing( curZoneEqNum ).DesHeatCoilInHumRat; + } + + + c->coilDesEntWetBulb = Psychrometrics::PsyTwbFnTdbWPb( c->coilDesEntTemp, c->coilDesEntHumRat, DataEnvironment::StdBaroPress, "ReportCoilSelection::setCoilCoolingCapacity" ); + c->coilDesEntEnth = Psychrometrics::PsyHFnTdbW ( c->coilDesEntTemp, c->coilDesEntHumRat ); + + + c->coilDesLvgTemp = DataSizing::FinalZoneSizing( curZoneEqNum ).HeatDesTemp; + c->coilDesLvgHumRat = DataSizing::FinalZoneSizing( curZoneEqNum ).HeatDesHumRat; + c->coilDesLvgWetBulb = Psychrometrics::PsyTwbFnTdbWPb( c->coilDesLvgTemp, c->coilDesLvgHumRat, DataEnvironment::StdBaroPress, "ReportCoilSelection::setCoilCoolingCapacity" ); + c->coilDesLvgEnth = Psychrometrics::PsyHFnTdbW ( c->coilDesLvgTemp, c->coilDesLvgHumRat ); + + } else { + // do nothing + } + + + if ( DataSizing::DataCoilIsSuppHeater ) { + c->isSupplementalHeater = true; + } + // some heating coils only use this routine, so set air flow if not yet set + if ( c->coilDesVolFlow <= 0.0 ) { + if ( DataSizing::DataFlowUsedForSizing > 0.0 ) { // flow has been set in global, so use it + c->coilDesVolFlow = DataSizing::DataFlowUsedForSizing; + c->coilDesMassFlow = c->coilDesVolFlow * DataEnvironment::StdRhoAir; + } else if ( ( curZoneEqNum > 0 ) && allocated( DataSizing::FinalZoneSizing ) && ( DataSizing::FinalZoneSizing( curZoneEqNum ).DesHeatMassFlow >= DataHVACGlobals::SmallMassFlow ) ) { + c->coilDesMassFlow = DataSizing::FinalZoneSizing( curZoneEqNum ).DesHeatMassFlow; + c->coilDesVolFlow = c->coilDesMassFlow / DataEnvironment::StdRhoAir ; + } else if ( curSysNum > 0 && allocated( DataSizing::FinalSysSizing ) ) { + if ( curOASysNum > 0 && allocated( DataSizing::OASysEqSizing ) ) { + if ( DataSizing::OASysEqSizing( curOASysNum ).AirFlow ) { + c->coilDesVolFlow = DataSizing::OASysEqSizing( curOASysNum).AirVolFlow; + } else if ( DataSizing::OASysEqSizing( curOASysNum ).HeatingAirFlow) { + c->coilDesVolFlow = DataSizing::OASysEqSizing( curOASysNum).HeatingAirVolFlow; + } else { + c->coilDesVolFlow = DataSizing::FinalSysSizing( curSysNum ).DesOutAirVolFlow; + } + } else { + if ( DataSizing::DataFlowUsedForSizing > 0.0 ) { + c->coilDesVolFlow = DataSizing::DataFlowUsedForSizing; + } else if ( DataSizing::UnitarySysEqSizing( curSysNum ).AirFlow ) { + c->coilDesVolFlow = DataSizing::UnitarySysEqSizing( curSysNum ).AirVolFlow; + } else if ( DataSizing::UnitarySysEqSizing( curSysNum ).HeatingAirFlow ) { + c->coilDesVolFlow = DataSizing::UnitarySysEqSizing( curSysNum ).HeatingAirVolFlow; + } else { + if ( DataSizing::CurDuctType == DataHVACGlobals::Main ) { + if ( DataSizing::FinalSysSizing( curSysNum ).SysAirMinFlowRat > 0.0 && !DataSizing::DataDesicRegCoil ) { + c->coilDesVolFlow = DataSizing::FinalSysSizing( curSysNum ).SysAirMinFlowRat*DataSizing::FinalSysSizing( curSysNum ).DesMainVolFlow; + } else { + c->coilDesVolFlow = DataSizing::FinalSysSizing( curSysNum ).DesMainVolFlow; + } + } else if ( DataSizing::CurDuctType == DataHVACGlobals::Cooling ) { + if ( DataSizing::FinalSysSizing( curSysNum ).SysAirMinFlowRat > 0.0 && !DataSizing::DataDesicRegCoil ) { + c->coilDesVolFlow = DataSizing::FinalSysSizing( curSysNum ).SysAirMinFlowRat*DataSizing::FinalSysSizing( curSysNum ).DesCoolVolFlow; + } else { + c->coilDesVolFlow = DataSizing::FinalSysSizing( curSysNum ).DesCoolVolFlow; + } + } else if ( DataSizing::CurDuctType == DataHVACGlobals::Heating ) { + c->coilDesVolFlow = DataSizing::FinalSysSizing( curSysNum ).DesHeatVolFlow; + } else if ( DataSizing::CurDuctType == DataHVACGlobals::Other ) { + c->coilDesVolFlow = DataSizing::FinalSysSizing( curSysNum ).DesMainVolFlow; + } else { + c->coilDesVolFlow = DataSizing::FinalSysSizing( curSysNum ).DesMainVolFlow; + } + } + } + } + c->coilDesMassFlow = c->coilDesVolFlow * DataEnvironment::StdRhoAir; + } + + //calc sensible capacity from inlet outlet + c->cpMoistAir = Psychrometrics::PsyCpAirFnWTdb( c->coilDesLvgHumRat, 0.5*( c->coilDesEntTemp + c->coilDesLvgTemp ) ); + // this is not generally correct but okay for heating coils + c->coilSensCapAtPeak = abs( c->cpMoistAir * c->coilDesMassFlow * ( c->coilDesLvgTemp - c->coilDesEntTemp ) ); + c->coilSensCapAtPeak = min( c->coilSensCapAtPeak, c->coilTotCapAtPeak ); +} + +void +ReportCoilSelection::setCoilWaterCoolingCapacity( + std::string const & coilName, // user-defined name of the coil + std::string const & coilType, // idf input object class name of coil + Real64 const totalCoolingCap, // {W} coil cooling capacity + bool const isAutoSize, // true if value was autosized + int const dataPltSizNum, // plant sizing structure index + int const dataWaterLoopNum // plant loop structure index +) +{ + int index = getIndexForOrCreateDataObjFromCoilName( coilName,coilType ); + auto & c( coilSelectionDataObjs[ index ] ); + c->coilTotCapAtPeak = totalCoolingCap; + c->capIsAutosized = isAutoSize; + c->pltSizNum = dataPltSizNum; + c->waterLoopNum = dataWaterLoopNum; +} + +void +ReportCoilSelection::setCoilWaterHeaterCapacity( + std::string const & coilName, // user-defined name of the coil + std::string const & coilType, // idf input object class name of coil + Real64 const totalHeatingCap, // {W} coil Heating capacity + bool const isAutoSize, // true if value was autosized + int const dataPltSizNum, // plant sizing structure index + int const dataWaterLoopNum // plant loop structure index +) +{ + int index = getIndexForOrCreateDataObjFromCoilName( coilName,coilType ); + auto & c( coilSelectionDataObjs[ index ] ); + c->coilTotCapAtPeak = totalHeatingCap; + c->capIsAutosized = isAutoSize; + c->pltSizNum = dataPltSizNum; + c->waterLoopNum = dataWaterLoopNum; +} + +void +ReportCoilSelection::setCoilUA( + std::string const & coilName, // user-defined name of the coil + std::string const & coilType, // idf input object class name of coil + Real64 const UAvalue, // [W/k] UA value for coil, + Real64 const dataCapacityUsedForSizing, // [W] sizing global + bool const isAutoSize, // true if value was autosized + int const curSysNum, // airloop system number index, if non zero + int const curZoneEqNum // zone equipment list index, if non-zero +) +{ + int index = getIndexForOrCreateDataObjFromCoilName( coilName,coilType ); + auto & c( coilSelectionDataObjs[ index ] ); + c->coilUA = UAvalue; + c->coilTotCapAtPeak = dataCapacityUsedForSizing; + c->capIsAutosized = isAutoSize; + c->airloopNum = curSysNum; + doAirLoopSetup( index ); + c->zoneEqNum = curZoneEqNum; + +} + +void +ReportCoilSelection::setCoilReheatMultiplier( + std::string const & coilName, // user-defined name of the coil + std::string const & coilType, // idf input object class name of coil + Real64 const multiplierReheatLoad +) +{ + int index = getIndexForOrCreateDataObjFromCoilName( coilName,coilType ); + auto & c( coilSelectionDataObjs[ index ] ); + c->reheatLoadMult = multiplierReheatLoad; +} + +void +ReportCoilSelection::setCoilSupplyFanInfo( + std::string const & coilName, // user-defined name of the coil + std::string const & coilType, // idf input object class name of coil + std::string const & fanName, + DataAirSystems::fanModelTypeEnum const & fanEnumType, + int const & fanIndex +) +{ + int index = getIndexForOrCreateDataObjFromCoilName( coilName,coilType ); + auto & c( coilSelectionDataObjs[ index ] ); + c->fanAssociatedWithCoilName = fanName; + c->supFanModelTypeEnum = fanEnumType; + int locFanIndex( -1 ); + if ( fanEnumType == DataAirSystems::structArrayLegacyFanModels ) { + if ( fanIndex <= 0 ) { + bool errorsFound( false ); + Fans::GetFanIndex( fanName, locFanIndex, errorsFound ); + } else { + locFanIndex = fanIndex; + } + c->supFanNum = locFanIndex; + } else if ( fanEnumType == DataAirSystems::objectVectorOOFanSystemModel ) { + if ( fanIndex < 0 ) { + locFanIndex = HVACFan::getFanObjectVectorIndex( fanName ); + } else { + locFanIndex = fanIndex; + } + c->supFanVecIndex = locFanIndex; + } +} + +std::string +ReportCoilSelection::getTimeText( + int const timeStepAtPeak +) +{ + std::string returnString = ""; + + if ( timeStepAtPeak == 0 ) { + return returnString; + } + + // Scan timesteps of 24-hr day to match up correct hour and minute + int minutes( 0 ); + int timeStepIndex( 0 ); + int hourPrint; + std::string hrMinString; + std::string dateString; + for ( int hourCounter = 1; hourCounter <= 24; ++hourCounter ) { + for ( int timeStepCounter = 1; timeStepCounter <= DataGlobals::NumOfTimeStepInHour; ++timeStepCounter ) { + ++timeStepIndex; + minutes += DataGlobals::MinutesPerTimeStep; + if ( minutes == 60 ) { + minutes = 0; + hourPrint = hourCounter; + } else { + hourPrint = hourCounter - 1; + } + if ( timeStepIndex == timeStepAtPeak ) { + gio::write( hrMinString, DataSizing::PeakHrMinFmt ) << hourPrint << minutes; + returnString = hrMinString ; + } + } + } + + return returnString; + +} + +bool +ReportCoilSelection::isCompTypeFan( + std::string const & compType // string component type, input object class name +) +{ + // if compType name is one of the fan objects, then return true + if ( InputProcessor::SameString( compType, "Fan:SystemModel" ) ) { + return true; + } else if ( InputProcessor::SameString( compType, "Fan:ComponentModel" ) ) { + return true; + } else if ( InputProcessor::SameString( compType, "Fan:OnOff" ) ) { + return true; + } else if ( InputProcessor::SameString( compType, "Fan:ConstantVolume" ) ) { + return true; + } else if ( InputProcessor::SameString( compType, "Fan:VariableVolume" ) ) { + return true; + } else { + return false; + } +} + +bool +ReportCoilSelection::isCompTypeCoil( + std::string const & compType // string component type, input object class name +) +{ + // if compType name is one of the coil objects, then return true + bool found( false ); + for ( int loop = 1; loop < DataHVACGlobals::NumAllCoilTypes; ++loop ) { + if ( InputProcessor::SameString( compType, DataHVACGlobals::cAllCoilTypes( loop ) ) ) { + found = true; + break; + } + } + return found; +} + +void +ReportCoilSelection::setZoneLatentLoadCoolingIdealPeak( + int const zoneIndex, + Real64 const zoneCoolingLatentLoad +) +{ + // loop over all the coils and the zones in the coils and if this zone index is in the coil + for ( auto & c : coilSelectionDataObjs ) { + + if ( c->isCooling ) { + for ( int zoneInd = 0; zoneInd < c->zoneNum.size(); ++zoneInd) { + if ( zoneIndex == c->zoneNum[ zoneInd ] ) { + c->rmLatentAtPeak += zoneCoolingLatentLoad; + break; + } + } + } + } +} + +void +ReportCoilSelection::setZoneLatentLoadHeatingIdealPeak( + int const zoneIndex, + Real64 const zoneHeatingLatentLoad +) +{ + // loop over all the coils and the zones in the coils and if this zone index is in the coil + for ( auto & c : coilSelectionDataObjs ) { + + if ( c->isHeating ) { + for ( int zoneInd = 0; zoneInd < c->zoneNum.size(); ++zoneInd) { + if ( zoneIndex == c->zoneNum[ zoneInd ] ) { + c->rmLatentAtPeak += zoneHeatingLatentLoad; + break; + } + } + } + } +} + +} // EnergyPlus namespace \ No newline at end of file diff --git a/src/EnergyPlus/ReportCoilSelection.hh b/src/EnergyPlus/ReportCoilSelection.hh new file mode 100644 index 00000000000..4c69174d7f9 --- /dev/null +++ b/src/EnergyPlus/ReportCoilSelection.hh @@ -0,0 +1,500 @@ +// EnergyPlus, Copyright (c) 1996-2018, The Board of Trustees of the University of Illinois and +// The Regents of the University of California, through Lawrence Berkeley National Laboratory +// (subject to receipt of any required approvals from the U.S. Dept. of Energy). All rights +// reserved. +// +// If you have questions about your rights to use or distribute this software, please contact +// Berkeley Lab's Innovation & Partnerships Office at IPO@lbl.gov. +// +// NOTICE: This Software was developed under funding from the U.S. Department of Energy and the +// U.S. Government consequently retains certain rights. As such, the U.S. Government has been +// granted for itself and others acting on its behalf a paid-up, nonexclusive, irrevocable, +// worldwide license in the Software to reproduce, distribute copies to the public, prepare +// derivative works, and perform publicly and display publicly, and to permit others to do so. +// +// Redistribution and use in source and binary forms, with or without modification, are permitted +// provided that the following conditions are met: +// +// (1) Redistributions of source code must retain the above copyright notice, this list of +// conditions and the following disclaimer. +// +// (2) Redistributions in binary form must reproduce the above copyright notice, this list of +// conditions and the following disclaimer in the documentation and/or other materials +// provided with the distribution. +// +// (3) Neither the name of the University of California, Lawrence Berkeley National Laboratory, +// the University of Illinois, U.S. Dept. of Energy nor the names of its contributors may be +// used to endorse or promote products derived from this software without specific prior +// written permission. +// +// (4) Use of EnergyPlus(TM) Name. If Licensee (i) distributes the software in stand-alone form +// without changes from the version obtained under this License, or (ii) Licensee makes a +// reference solely to the software portion of its product, Licensee must refer to the +// software as "EnergyPlus version X" software, where "X" is the version number Licensee +// obtained under this License and may not use a different name for the software. Except as +// specifically required in this Section (4), Licensee shall not use in a company name, a +// product name, in advertising, publicity, or other promotional activities any name, trade +// name, trademark, logo, or other designation of "EnergyPlus", "E+", "e+" or confusingly +// similar designation, without Lawrence Berkeley National Laboratory's prior written consent. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR +// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY +// AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// +// You are under no obligation whatsoever to provide any bug fixes, patches, or upgrades to the +// features, functionality or performance of the source code ("Enhancements") to anyone; however, +// if you choose to make your Enhancements available either publicly, or directly to Lawrence +// Berkeley National Laboratory, without imposing a separate written license agreement for such +// Enhancements, then you hereby grant the following license: a non-exclusive, royalty-free +// perpetual license to install, use, modify, prepare derivative works, incorporate into other +// computer software, distribute, and sublicense such enhancements or derivative works thereof, +// in binary and source code form. + + +#ifndef ReportCoilSelection_hh_INCLUDED +#define ReportCoilSelection_hh_INCLUDED + +// C++ Headers +#include +#include +#include + +#include +#include + +// EnergyPlus Headers +#include +#include + +namespace EnergyPlus { + +class CoilSelectionData + // data object, one for each unique coil in simulation +{ + +public: //methods + + //Constructor + CoilSelectionData( std::string const & coilName ); + + //Destructor + ~CoilSelectionData() + {} + +public: // data + std::string coilName_; // user-defined coil name + std::string coilObjName; // coil object name, e.g., Coil:Cooling:Water, Coil:Heating:DX:SingleSpeed, etc. + bool isCooling; // true if this coil is for cooling + bool isHeating; // true if this coil is for heating + std::string coilLocation; // where is the coil located?, AirLoop or Zone + std::string desDayNameAtSensPeak; //the name of the design day that produced the sensible Ideal Loads peak + std::string coilSensePeakHrMin; //time stamp of the sensible coil peak during Ideal Loads Simulation + std::string desDayNameAtTotalPeak; //the name of the design day that produced the total Ideal Loads peak + std::string coilTotalPeakHrMin; //time stamp of the sensible coil peak during Ideal Loads Simulation + std::string desDayNameAtAirFlowPeak; //the name of the design day that produced the air flow Ideal Loads peak + std::string airPeakHrMin; //time stamp of the airflow peak during Ideal Loads Simulation + + + int coilNum; // coil array index associated with WaterCoil(), DXCoil(), or HeatingCoil() array structures + int airloopNum; // Coil index to AirLoop + int oaControllerNum; // Coil index to OAController + int zoneEqNum; // Coil index to CurZoneEqNum, for zone coils + int oASysNum; // Coil index to OASysEqSizing + std::vector< int > zoneNum; // list of zone indexes associated with this coil + std::vector< std::string > zoneName ; // list of zone names associated with this coil, if any + std::string typeHVACname; // this coil is in what sort of HVAC system, parent object types + std::string userNameforHVACsystem; // this coil is an HVAC system named by the user. + int zoneHVACTypeNum; // store type num if zoneHVAC + int zoneHVACIndex; // store component index for zone HVAC + int typeof_Coil; // type of coil, e.g., TypeOf_CoilWaterSimpleHeating, TypeOf_CoilWaterDetailedFlatCooling, TypeOf_CoilWaterCooling + + int coilSizingMethodConcurrence; // 1 = noncoincident, 2 = coincident + std::string coilSizingMethodConcurrenceName; // string name of sizing method for concurrence + + int coilSizingMethodCapacity; // 8=CoolingDesignCapacity, 9=HeatingDesignCapacity, 10=CapacityPerFloorArea, 11=FractionOfAutosizedCoolingCapacity, 12=FractionOfAutosizedHeatingCapacity + std::string coilSizingMethodCapacityName; + + int coilSizingMethodAirFlow; // choice of how to get system design air flow rates; + // 2=SupplyAirFlowRate, 3=FlowPerFloorArea, 4=FractionOfAutosizedCoolingAirflow, 5=FractionOfAutosizedHeatingAirflow, 6=FlowPerCoolingCapacity, 7=FlowPerHeatingCapacity + std::string coilSizingMethodAirFlowName; + + //Real64 coilDesCapUser; // coil capacity original input value [W]; -999 means field not applicable to this coil + bool capIsAutosized; // true if the coil's capacity was autosized + std::string coilCapAutoMsg; // Yes if user cap was autosized, No if hard value entered + + bool volFlowIsAutosized; // true if the coil's flow was autosized + std::string coilVolFlowAutoMsg; // Yes if user flow was autosized, no if hard value; + Real64 coilWaterFlowUser; // coil water flow original input value [m3/s]; -999 means field not applicable to this coil + std::string coilWaterFlowAutoMsg; // Yes if user water flow was autosized + + bool oaPretreated; // Was the outside air pretreated prior to inlet of coil [True or False] + std::string coilOAPretreatMsg; // Yes if the entering air OA was pretreated before mixing, No otherwise + + bool isSupplementalHeater; // true if heating coil is a supplemental heater. + Real64 coilTotCapFinal; + Real64 coilSensCapFinal; + Real64 coilRefAirVolFlowFinal; + Real64 coilRefWaterVolFlowFinal; + + //Values from time of Ideal Load Sizing Peak + Real64 coilTotCapAtPeak; // coil total capacity at peak [W] + Real64 coilSensCapAtPeak; // coil sensible capacity at peak [W] + Real64 coilDesMassFlow; // coil design air mass flow rate [kg/s] + Real64 coilDesVolFlow; // coil design air volume flow rate [m3/s] + Real64 coilDesEntTemp; // coil entering dry bulb at peak [C] + Real64 coilDesEntWetBulb; // coil design entering wet bulb [C] + Real64 coilDesEntHumRat; // coil entering humidity ratio at peak [kgWater/kgDryAir] + Real64 coilDesEntEnth; // coil entering enthalpy [J/kg-C] + Real64 coilDesLvgTemp; // coil leaving dry bulb at peak [C] + Real64 coilDesLvgWetBulb; // coil design leaving wet bulb [C] + Real64 coilDesLvgHumRat; // coil leaving humidity ratio at peak [kgWater/kgDryAir] + Real64 coilDesLvgEnth; // coil leaving enthalpy [J/kg-C] + Real64 coilDesWaterMassFlow; //coil design water mass flow rate [m3/s] + Real64 coilDesWaterEntTemp; // coil design entering water temperature[C] + Real64 coilDesWaterLvgTemp; // coil design leaving water temperature [C] + Real64 coilDesWaterTempDiff; // coil plant design delta T [ delta C] + + int pltSizNum; // index to PlantSizData() array if this coil attached to a plant + int waterLoopNum; // Plant loop index if this (water) coil attached to a plant + std::string plantLoopName; // user name of the plant loop + Real64 oaPeakTemp; // outside air dry bulb at ideal loads peak [C] + Real64 oaPeakHumRat; // outside air humidity ratio at ideal loads peak [kgWater/kgDryAir] + Real64 oaPeakWetBulb; // outside air wet bulb at peak [C] + Real64 oaPeakVolFlow; // outside air volume flow rate at peak [m3/s] + Real64 oaPeakVolFrac; // fraction of outside air volume flow rate at peak + Real64 oaDoaTemp; // DOA unit design supply air dry bulb [C] + Real64 oaDoaHumRat; // DOA unit design supply air humidity ratio [kgWater/kgDryAir] + Real64 raPeakTemp; // return air dry bulb at peak [C] + Real64 raPeakHumRat; // return air humidity ratio at peak [kgWater/kgDryAir] + Real64 rmPeakTemp; // room air dry bulb (setpoint) at peak [C] + Real64 rmPeakHumRat; // room air humidity ratio (setpoint) at peak [kgWater/kgDryAir] + Real64 rmPeakRelHum; // room air relative humidity (setpoint) at peak [%] + Real64 rmSensibleAtPeak; // space sensible zone load at peak [W] + Real64 rmLatentAtPeak; // space latent zone load at ideal loads peak [W] + Real64 coilIdealSizCapOverSimPeakCap; // capacity at rated conditions subtracted by capacity at simulation peak, zero if under sized [W] + Real64 coilIdealSizCapUnderSimPeakCap; // capacity at simulation peak subtracted by capacity at rated conditions, zero if oversized [W] + Real64 reheatLoadMult; // reheat coil multiplier due to over/undersizing of coil airflow + Real64 minRatio; // Flow/capacity ratio too low so reducing capacity by ratio + Real64 maxRatio; // Flow/capacity ratio too high so increasing capacity by ratio + Real64 cpMoistAir; // specific heat capacity of moist air through coil [J/kg-C] + Real64 cpDryAir; // specific heat capacity of dry air (at elevation) [J/kg-C] + Real64 rhoStandAir; // density of dry air at a standard temp and at eleveation [kg/m3] + Real64 rhoFluid; // density of coil plant fluid [kg/m3] + Real64 cpFluid; // specific heat capacity of coil plant fluid [J/kg-K] + Real64 coilCapFTIdealPeak; // coil capacity multiplier at Ideal Peak conditions, func of temperature only, to the input rating point (usually for a DX coil) [W] + Real64 coilCapModFacSimPeak; // coil capacity multiplier at Simulation Peak conditions, total modification including func temp, func air flow, part load, speed etc. + //Values at rating point, reference point, nominal values for model input. + Real64 coilRatedTotCap; // rated coil total capacity [W] + Real64 coilRatedSensCap; // rated coil sensible capacity [W] + Real64 ratedAirMassFlow; // rated coil design air mass flow rate [m3/s] + Real64 ratedCoilInDb; // rated coil inlet air dry bulb [C] + Real64 ratedCoilInWb; // rated coil inlet air wet bulb [C] + Real64 ratedCoilInHumRat; // rated coil inlet air humidity ratio [kgWater/kgDryAir] + Real64 ratedCoilInEnth; // rated coil inlet air enthalpy [J/kg-C] + Real64 ratedCoilOutDb; // rated coil outlet air dry bulb [C] + Real64 ratedCoilOutWb; // rated coil outlet air wet bulb [C] + Real64 ratedCoilOutHumRat; // rated coil outlet air humidity ratio, [kgWater/kgDryAir] + Real64 ratedCoilOutEnth; // rated coil outlet air enthalpy [J/kg-C] + Real64 ratedCoilEff; // rated coil effectiveness + Real64 ratedCoilBpFactor; // rated coil bypass factor + Real64 ratedCoilAppDewPt; // rated coil apparatus dew point [C] + Real64 ratedCoilOadbRef; // rated DX coil outside air dry bulb reference [C] + Real64 ratedCoilOawbRef; // rated DX coil outside air wet bulb reference [C] + + std::string fanAssociatedWithCoilName; // name of fan found to be associated with this coil + std::string fanTypeName; // type of fan found to be associated with this coil + DataAirSystems::fanModelTypeEnum supFanModelTypeEnum; //indicates which type of fan model for supply fan, legacy or new OO + int supFanNum; // index pointing to this fan in legacy fan data structure, 1-based struct array + int supFanVecIndex; // index pointing to this fan in new OO fan object array, 0-based + Real64 fanSizeMaxAirVolumeFlow; // the size of the fan in terms of volume flow rate [m3/s] + Real64 fanSizeMaxAirMassFlow; // the size of the fan in terms of mass flow rate [kg/s] + Real64 fanHeatGainIdealPeak; // Fan heat gain to air during Ideal loads peak sizing [W] + Real64 coilAndFanNetTotalCapacityIdealPeak; // coil net total capacity including fan heat gain for ideal loads peak sizing [W] + + //static plant info + Real64 plantDesMaxMassFlowRate; // this coil's plant loop overall design flow rate [kg/s] + Real64 plantDesRetTemp; // this coil's plant loop design return temperature + Real64 plantDesSupTemp; // this coil's plant loop design supply temperature + Real64 plantDesDeltaTemp; // this coil's plant loop design temperature differene (delta C) + Real64 plantDesCapacity; // this coil's plant loop capacity [W] + Real64 coilCapPrcntPlantCap; // this coil's capacity as a percentage of the overall loop's capacity + Real64 coilFlowPrcntPlantFlow; // this coil's design flow rate as a percentage the overall loop's design flow rate + //misc + Real64 coilUA; // U-value times Area, coil sizing result for UA [ ] + + +}; // end class CoilSelectionData + + +class ReportCoilSelection + +{ +public: // Creation + ReportCoilSelection() : + numCoilsReported_( 0 ) + {} + +public: + // destructor + ~ReportCoilSelection() + {} + + +public: // methods + + void + finishCoilSummaryReportTable(); + + void + setCoilFinalSizes( + std::string const & coilName, // user-defined name of the coil + std::string const & coilObjName , // coil object name, e.g., Coil:Cooling:Water + Real64 const totGrossCap, // total capacity [W] + Real64 const sensGrossCap,// sensible capacity [W] + Real64 const airFlowRate, // design or reference or rated air flow rate [m3/s] + Real64 const waterFlowRate //design or reference or rated water flow rate [m3/s] + ); + + void + setRatedCoilConditions( + std::string const & coilName, // ! user-defined name of the coil + std::string const & coilObjName , // coil object name, e.g., Coil:Cooling:Water + Real64 const RatedCoilTotCap, // ! rated coil total capacity [W] + Real64 const RatedCoilSensCap, // rated coil sensible capacity [W] + Real64 const RatedAirMassFlow, // rated coil design air mass flow rate [m3/s] + Real64 const RatedCoilInDb, // rated coil inlet air dry bulb at time of peak [C] + Real64 const RatedCoilInHumRat, // rated coil inlet air humidity ratio [kgWater/kgDryAir] + Real64 const RatedCoilInWb, // rated coil inlet air wet bulb [C] + Real64 const RatedCoilOutDb, // rated coil outlet air dry bulb [C] + Real64 const RatedCoilOutHumRat, // rated coil outlet air humidity ratio, [kgWater/kgDryAir] + Real64 const RatedCoilOutWb, // rated coil outlet air wet bulb [C] + + Real64 const RatedCoilOadbRef, // rated DX coil outside air dry bulb reference [C] + Real64 const RatedCoilOawbRef, // rated DX coil outside air wet bulb reference [C] + Real64 const RatedCoilBpFactor, // rated coil bypass factor + Real64 const RatedCoilEff // rated coil effectiveness + ); + + void + setCoilAirFlow( + std::string const & coilName, // user-defined name of the coil + std::string const & coilType, // idf input object class name of coil + Real64 const airVdot, // air flow rate in m3/s + bool const isAutoSized // true if air flow was autosized + ); + + + void + setCoilWaterFlow( + std::string const & coilName, // user-defined name of the coil + std::string const & coilType, // idf input object class name of coil + Real64 const waterVdot, // water flow rate in m3/s + bool const isAutoSized, // true if water flow was autosized + int const DataPltSizNum, // plant sizing structure index + int const DataWaterLoopNum // plant loop structure index + ); + + void + setCoilEntAirTemp( + std::string const & coilName, // user-defined name of the coil + std::string const & coilType, // idf input object class name of coil + Real64 const entAirDryBulbTemp, // ideal loads sizing result for air entering coil drybulb temp (C) + int const curSysNum, // airloop system number index, if non zero + int const curZoneEqNum // zone equipment list index, if non-zero + ); + + void + setCoilEntAirHumRat( + std::string const & coilName, // user-defined name of the coil + std::string const & coilType, // idf input object class name of coil + Real64 const entAirHumRat + ); + + void + setCoilEntWaterTemp( + std::string const & coilName, // user-defined name of the coil + std::string const & coilType, // idf input object class name of coil + Real64 const entWaterTemp // degree C + ); + + void + setCoilLvgWaterTemp( + std::string const & coilName, // user-defined name of the coil + std::string const & coilType, // idf input object class name of coil + Real64 const lvgWaterTemp // degree C + ); + + void + setCoilWaterDeltaT( + std::string const & coilName, // user-defined name of the coil + std::string const & coilType, // idf input object class name of coil + Real64 const CoilWaterDeltaT // degree C temperature difference used to size coil + ); + + void + setCoilLvgAirTemp( + std::string const & coilName, // user-defined name of the coil + std::string const & coilType, // idf input object class name of coil + Real64 const lvgAirDryBulbTemp // air temperature leaving coil {C} + ); + + void + setCoilLvgAirHumRat( + std::string const & coilName, // user-defined name of the coil + std::string const & coilType, // idf input object class name of coil + Real64 const lvgAirHumRat // + ); + + void + setCoilCoolingCapacity( + std::string const & coilName, // user-defined name of the coil + std::string const & coilType, // idf input object class name of coil + Real64 const totalCoolingCap, // {W} coil cooling capacity + bool const isAutoSize, // true if value was autosized + int const curSysNum, // airloop system number index, if non zero + int const curZoneEqNum, // zone equipment list index, if non-zero + int const curOASysNum, // OA system equipment list index, if non-zero + Real64 const fanCoolLoad, // {W} fan load used in ideal loads coil sizing + Real64 const coilCapFunTempFac, // {W} curve result for modification factor for capacity as a function of temperature + Real64 const DXFlowPerCapMinRatio, // non dimensional ratio, capacity adjustment ratio min + Real64 const DXFlowPerCapMaxRatio // non dimensional ratio, capacity adjustment ratio max + ); + + void + setCoilHeatingCapacity( + std::string const & coilName, // user-defined name of the coil + std::string const & coilType, // idf input object class name of coil + Real64 const totalHeatingCap, // {W} coil Heating capacity + bool const isAutoSize, // true if value was autosized + int const curSysNum, // airloop system number index, if non zero + int const curZoneEqNum, // zone equipment list index, if non-zero + int const curOASysNum, // OA system equipment list index, if non-zero + Real64 const fanHeatGain, // {W} fan load used in ideal loads coil sizing + Real64 const coilCapFunTempFac, // {W} curve result for modification factor for capacity as a function of temperature + Real64 const DXFlowPerCapMinRatio, // non dimensional ratio, capacity adjustment ratio min + Real64 const DXFlowPerCapMaxRatio // non dimensional ratio, capacity adjustment ratio max + ); + + void + setCoilWaterCoolingCapacity( + std::string const & coilName, // user-defined name of the coil + std::string const & coilType, // idf input object class name of coil + Real64 const totalCoolingCap, // {W} coil cooling capacity + bool const isAutoSize, // true if value was autosized + int const dataPltSizNum, // plant sizing structure index + int const dataWaterLoopNum // plant loop structure index + ); + + void + setCoilWaterHeaterCapacity( + std::string const & coilName, // user-defined name of the coil + std::string const & coilType, // idf input object class name of coil + Real64 const totalHeatingCap, // {W} coil Heating capacity + bool const isAutoSize, // true if value was autosized + int const dataPltSizNum, // plant sizing structure index + int const dataWaterLoopNum // plant loop structure index + ); + + void + setCoilUA( + std::string const & coilName, // user-defined name of the coil + std::string const & coilType, // idf input object class name of coil + Real64 const UAvalue, // [W/k] UA value for coil, + Real64 const dataCapacityUsedForSizing, // [W] sizing global + bool const isAutoSize, // true if value was autosized + int const curSysNum, // airloop system number index, if non zero + int const curZoneEqNum // zone equipment list index, if non-zero + ); + + void + setCoilReheatMultiplier( + std::string const & coilName, // user-defined name of the coil + std::string const & coilType, // idf input object class name of coil + Real64 const multiplierReheatLoad + ); + + void + setCoilSupplyFanInfo( + std::string const & coilName, // user-defined name of the coil + std::string const & coilType, // idf input object class name of coil + std::string const & fanName, + DataAirSystems::fanModelTypeEnum const & fanEnumType, + int const & fanIndex + ); + + std::string + getTimeText( + int const timeStepAtPeak + ); + + bool + isCompTypeFan( + std::string const & compType // string component type, input object class name + ); + + bool + isCompTypeCoil( + std::string const & compType // string component type, input object class name + ); + + void + setZoneLatentLoadCoolingIdealPeak( + int const zoneIndex, + Real64 const zoneCoolingLatentLoad + ); + + void + setZoneLatentLoadHeatingIdealPeak( + int const zoneIndex, + Real64 const zoneHeatingLatentLoad + ); + +private: // methods + + void + doAirLoopSetup( + int const coilVecIndex + ); + + void + doZoneEqSetup( + int const coilVecIndex + ); + + void + doFinalProcessingOfCoilData(); + + void + writeCoilSelectionOutput(); + + int + getIndexForOrCreateDataObjFromCoilName ( + std::string const & coilName, // user-defined name of the coil + std::string const & coilType // idf input object class name of coil + ); + + +private: // data + int numCoilsReported_; + std::vector< std::unique_ptr< CoilSelectionData > > coilSelectionDataObjs; + +}; //end ReportCoilSelection class + + +extern std::unique_ptr< ReportCoilSelection > coilSelectionReportObj; + +void +createCoilSelectionReportObj(); + +void +clearCoilSelectionReportObj(); + +} // EnergyPlus namespace + +#endif diff --git a/src/EnergyPlus/ReportSizingManager.cc b/src/EnergyPlus/ReportSizingManager.cc index 0962e841d5c..731dcd48cdc 100644 --- a/src/EnergyPlus/ReportSizingManager.cc +++ b/src/EnergyPlus/ReportSizingManager.cc @@ -76,6 +76,8 @@ #include #include #include +#include +#include namespace EnergyPlus { @@ -423,6 +425,13 @@ namespace ReportSizingManager { Real64 const RatedInletAirTemp( 26.6667 ); // 26.6667C or 80F Real64 const RatedInletAirHumRat( 0.01125 ); // Humidity ratio corresponding to 80F dry bulb/67F wet bulb + std::string DDNameFanPeak; + DDNameFanPeak = " test my Design Day"; + std::string dateTimeFanPeak; + dateTimeFanPeak = " test 1/2 00:00:00 "; + Real64 DXFlowPerCapMinRatio(1.0); + Real64 DXFlowPerCapMaxRatio(1.0); + AutosizeDes = 0.0; AutosizeUser = 0.0; IsAutoSize = false; @@ -436,6 +445,10 @@ namespace ReportSizingManager { RetFanNum = 0; FanCoolLoad = 0; SizingDesValueFromParent = false; + TotCapTempModFac = 1.0; + CoilOutTemp = -999.0; + DesVolFlow = 0.0; + CoilInTemp = 0.0; if ( SysSizingRunDone || ZoneSizingRunDone ) { HardSizeNoDesRun = false; @@ -498,93 +511,284 @@ namespace ReportSizingManager { if ( ZoneEqSizing( CurZoneEqNum ).SystemAirFlow ) { AutosizeDes = max( ZoneEqSizing( CurZoneEqNum ).AirVolFlow, FinalZoneSizing( CurZoneEqNum ).DesCoolVolFlow, FinalZoneSizing( CurZoneEqNum ).DesHeatVolFlow ); + if ( AutosizeDes == FinalZoneSizing( CurZoneEqNum ).DesCoolVolFlow ) { + if ( FinalZoneSizing( CurZoneEqNum ).CoolDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).CoolDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).CoolDDNum ).Title; + } + } else if ( AutosizeDes == FinalZoneSizing( CurZoneEqNum ).DesHeatVolFlow ) { + if ( FinalZoneSizing( CurZoneEqNum ).HeatDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).HeatDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).HeatDDNum ).Title; + } + } else if ( AutosizeDes == ZoneEqSizing( CurZoneEqNum ).AirVolFlow ) { + DDNameFanPeak = "Unknown"; + } } else { if ( ZoneCoolingOnlyFan ) { AutosizeDes = FinalZoneSizing( CurZoneEqNum ).DesCoolVolFlow; + if ( FinalZoneSizing( CurZoneEqNum ).CoolDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).CoolDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).CoolDDNum ).Title; + } } else if ( ZoneHeatingOnlyFan ) { AutosizeDes = FinalZoneSizing( CurZoneEqNum ).DesHeatVolFlow; + if ( FinalZoneSizing( CurZoneEqNum ).HeatDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).HeatDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).HeatDDNum ).Title; + } } else if ( ZoneEqSizing( CurZoneEqNum ).CoolingAirFlow && !ZoneEqSizing( CurZoneEqNum ).HeatingAirFlow ) { AutosizeDes = ZoneEqSizing( CurZoneEqNum ).CoolingAirVolFlow; + if ( FinalZoneSizing( CurZoneEqNum ).CoolDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).CoolDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).CoolDDNum ).Title; + } } else if ( ZoneEqSizing( CurZoneEqNum ).HeatingAirFlow && !ZoneEqSizing( CurZoneEqNum ).CoolingAirFlow ) { AutosizeDes = ZoneEqSizing( CurZoneEqNum ).HeatingAirVolFlow; + if ( FinalZoneSizing( CurZoneEqNum ).HeatDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).HeatDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).HeatDDNum ).Title; + } } else if ( ZoneEqSizing( CurZoneEqNum ).HeatingAirFlow && ZoneEqSizing( CurZoneEqNum ).CoolingAirFlow ) { AutosizeDes = max( ZoneEqSizing( CurZoneEqNum ).CoolingAirVolFlow, ZoneEqSizing( CurZoneEqNum ).HeatingAirVolFlow ); + if ( AutosizeDes == ZoneEqSizing( CurZoneEqNum ).CoolingAirVolFlow ) { + if ( FinalZoneSizing( CurZoneEqNum ).CoolDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).CoolDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).CoolDDNum ).Title; + } + } else if ( AutosizeDes == ZoneEqSizing( CurZoneEqNum ).HeatingAirVolFlow ) { + if ( FinalZoneSizing( CurZoneEqNum ).HeatDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).HeatDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).HeatDDNum ).Title; + } + } } else { AutosizeDes = max( FinalZoneSizing( CurZoneEqNum ).DesCoolVolFlow, FinalZoneSizing( CurZoneEqNum ).DesHeatVolFlow ); + if ( AutosizeDes == FinalZoneSizing( CurZoneEqNum ).DesCoolVolFlow ) { + if ( FinalZoneSizing( CurZoneEqNum ).CoolDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).CoolDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).CoolDDNum ).Title; + } + } else if ( AutosizeDes == FinalZoneSizing( CurZoneEqNum ).DesHeatVolFlow ) { + if ( FinalZoneSizing( CurZoneEqNum ).HeatDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).HeatDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).HeatDDNum ).Title; + } + } } } } else if ( SELECT_CASE_var == FractionOfAutosizedCoolingAirflow ) { if ( ZoneCoolingOnlyFan ) { AutosizeDes = DataFracOfAutosizedCoolingAirflow * FinalZoneSizing( CurZoneEqNum ).DesCoolVolFlow; + if ( FinalZoneSizing( CurZoneEqNum ).CoolDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).CoolDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).CoolDDNum ).Title; + } } else if ( ZoneHeatingOnlyFan ) { AutosizeDes = DataFracOfAutosizedHeatingAirflow * FinalZoneSizing( CurZoneEqNum ).DesHeatVolFlow; + if ( FinalZoneSizing( CurZoneEqNum ).HeatDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).HeatDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).HeatDDNum ).Title; + } } else if ( ZoneEqSizing( CurZoneEqNum ).CoolingAirFlow && !ZoneEqSizing( CurZoneEqNum ).HeatingAirFlow ) { AutosizeDes = DataFracOfAutosizedCoolingAirflow * ZoneEqSizing( CurZoneEqNum ).CoolingAirVolFlow; + if ( FinalZoneSizing( CurZoneEqNum ).CoolDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).CoolDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).CoolDDNum ).Title; + } } else if ( ZoneEqSizing( CurZoneEqNum ).HeatingAirFlow && !ZoneEqSizing( CurZoneEqNum ).CoolingAirFlow ) { AutosizeDes = DataFracOfAutosizedHeatingAirflow * ZoneEqSizing( CurZoneEqNum ).HeatingAirVolFlow; + if ( FinalZoneSizing( CurZoneEqNum ).HeatDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).HeatDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).HeatDDNum ).Title; + } } else if ( ZoneEqSizing( CurZoneEqNum ).HeatingAirFlow && ZoneEqSizing( CurZoneEqNum ).CoolingAirFlow ) { AutosizeDes = max( DataFracOfAutosizedCoolingAirflow * ZoneEqSizing( CurZoneEqNum ).CoolingAirVolFlow, DataFracOfAutosizedHeatingAirflow * ZoneEqSizing( CurZoneEqNum ).HeatingAirVolFlow ); + if ( AutosizeDes == DataFracOfAutosizedCoolingAirflow * ZoneEqSizing( CurZoneEqNum ).CoolingAirVolFlow ) { + if ( FinalZoneSizing( CurZoneEqNum ).CoolDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).CoolDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).CoolDDNum ).Title; + } + } else if ( AutosizeDes == DataFracOfAutosizedHeatingAirflow * ZoneEqSizing( CurZoneEqNum ).HeatingAirVolFlow ) { + if ( FinalZoneSizing( CurZoneEqNum ).HeatDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).HeatDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).HeatDDNum ).Title; + } + } } else { AutosizeDes = max( DataFracOfAutosizedCoolingAirflow * FinalZoneSizing( CurZoneEqNum ).DesCoolVolFlow, DataFracOfAutosizedHeatingAirflow * FinalZoneSizing( CurZoneEqNum ).DesHeatVolFlow ); + if ( AutosizeDes == DataFracOfAutosizedCoolingAirflow * FinalZoneSizing( CurZoneEqNum ).DesCoolVolFlow ) { + if ( FinalZoneSizing( CurZoneEqNum ).CoolDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).CoolDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).CoolDDNum ).Title; + } + } else if ( AutosizeDes == DataFracOfAutosizedHeatingAirflow * FinalZoneSizing( CurZoneEqNum ).DesHeatVolFlow ) { + if ( FinalZoneSizing( CurZoneEqNum ).HeatDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).HeatDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).HeatDDNum ).Title; + } + } } } else if ( SELECT_CASE_var == FractionOfAutosizedHeatingAirflow ) { if ( ZoneCoolingOnlyFan ) { AutosizeDes = DataFracOfAutosizedCoolingAirflow * FinalZoneSizing( CurZoneEqNum ).DesCoolVolFlow; + if ( FinalZoneSizing( CurZoneEqNum ).CoolDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).CoolDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).CoolDDNum ).Title; + } } else if ( ZoneHeatingOnlyFan ) { AutosizeDes = DataFracOfAutosizedHeatingAirflow * FinalZoneSizing( CurZoneEqNum ).DesHeatVolFlow; + if ( FinalZoneSizing( CurZoneEqNum ).HeatDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).HeatDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).HeatDDNum ).Title; + } } else if ( ZoneEqSizing( CurZoneEqNum ).CoolingAirFlow && !ZoneEqSizing( CurZoneEqNum ).HeatingAirFlow ) { AutosizeDes = DataFracOfAutosizedCoolingAirflow * ZoneEqSizing( CurZoneEqNum ).CoolingAirVolFlow; + if ( FinalZoneSizing( CurZoneEqNum ).CoolDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).CoolDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).CoolDDNum ).Title; + } } else if ( ZoneEqSizing( CurZoneEqNum ).HeatingAirFlow && !ZoneEqSizing( CurZoneEqNum ).CoolingAirFlow ) { AutosizeDes = DataFracOfAutosizedHeatingAirflow * ZoneEqSizing( CurZoneEqNum ).HeatingAirVolFlow; + if ( FinalZoneSizing( CurZoneEqNum ).HeatDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).HeatDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).HeatDDNum ).Title; + } } else if ( ZoneEqSizing( CurZoneEqNum ).HeatingAirFlow && ZoneEqSizing( CurZoneEqNum ).CoolingAirFlow ) { AutosizeDes = max( DataFracOfAutosizedCoolingAirflow * ZoneEqSizing( CurZoneEqNum ).CoolingAirVolFlow, DataFracOfAutosizedHeatingAirflow * ZoneEqSizing( CurZoneEqNum ).HeatingAirVolFlow ); + if ( AutosizeDes == DataFracOfAutosizedCoolingAirflow * ZoneEqSizing( CurZoneEqNum ).CoolingAirVolFlow ) { + if ( FinalZoneSizing( CurZoneEqNum ).CoolDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).CoolDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).CoolDDNum ).Title; + } + } else if ( AutosizeDes == DataFracOfAutosizedHeatingAirflow * ZoneEqSizing( CurZoneEqNum ).HeatingAirVolFlow ) { + if ( FinalZoneSizing( CurZoneEqNum ).HeatDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).HeatDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).HeatDDNum ).Title; + } + } } else { AutosizeDes = max( DataFracOfAutosizedCoolingAirflow * FinalZoneSizing( CurZoneEqNum ).DesCoolVolFlow, DataFracOfAutosizedHeatingAirflow * FinalZoneSizing( CurZoneEqNum ).DesHeatVolFlow ); + if ( AutosizeDes == DataFracOfAutosizedCoolingAirflow * FinalZoneSizing( CurZoneEqNum ).DesCoolVolFlow ) { + if ( FinalZoneSizing( CurZoneEqNum ).CoolDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).CoolDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).CoolDDNum ).Title; + } + } else if ( AutosizeDes == DataFracOfAutosizedHeatingAirflow * FinalZoneSizing( CurZoneEqNum ).DesHeatVolFlow ) { + if ( FinalZoneSizing( CurZoneEqNum ).HeatDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).HeatDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).HeatDDNum ).Title; + } + } } } else if ( SELECT_CASE_var == FlowPerCoolingCapacity ) { if ( ZoneCoolingOnlyFan ) { AutosizeDes = DataFlowPerCoolingCapacity * DataAutosizedCoolingCapacity; + if ( FinalZoneSizing( CurZoneEqNum ).CoolDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).CoolDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).CoolDDNum ).Title; + } } else if ( ZoneHeatingOnlyFan ) { AutosizeDes = DataFlowPerHeatingCapacity * DataAutosizedHeatingCapacity; + if ( FinalZoneSizing( CurZoneEqNum ).HeatDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).HeatDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).HeatDDNum ).Title; + } } else if ( ZoneEqSizing( CurZoneEqNum ).CoolingAirFlow && !ZoneEqSizing( CurZoneEqNum ).HeatingAirFlow ) { AutosizeDes = DataFlowPerCoolingCapacity * DataAutosizedCoolingCapacity; + if ( FinalZoneSizing( CurZoneEqNum ).CoolDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).CoolDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).CoolDDNum ).Title; + } } else if ( ZoneEqSizing( CurZoneEqNum ).HeatingAirFlow && !ZoneEqSizing( CurZoneEqNum ).CoolingAirFlow ) { AutosizeDes = DataFlowPerHeatingCapacity * DataAutosizedHeatingCapacity; + if ( FinalZoneSizing( CurZoneEqNum ).HeatDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).HeatDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).HeatDDNum ).Title; + } } else if ( ZoneEqSizing( CurZoneEqNum ).HeatingAirFlow && ZoneEqSizing( CurZoneEqNum ).CoolingAirFlow ) { AutosizeDes = max( DataFlowPerCoolingCapacity * DataAutosizedCoolingCapacity, DataFlowPerHeatingCapacity * DataAutosizedHeatingCapacity ); + if ( AutosizeDes == DataFlowPerCoolingCapacity * DataAutosizedCoolingCapacity ) { + if ( FinalZoneSizing( CurZoneEqNum ).CoolDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).CoolDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).CoolDDNum ).Title; + } + } else if ( AutosizeDes == DataFlowPerHeatingCapacity * DataAutosizedHeatingCapacity ) { + if ( FinalZoneSizing( CurZoneEqNum ).HeatDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).HeatDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).HeatDDNum ).Title; + } + } } else { AutosizeDes = max( DataFlowPerCoolingCapacity * DataAutosizedCoolingCapacity, DataFlowPerHeatingCapacity * DataAutosizedHeatingCapacity ); + if ( AutosizeDes == DataFlowPerCoolingCapacity * DataAutosizedCoolingCapacity ) { + if ( FinalZoneSizing( CurZoneEqNum ).CoolDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).CoolDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).CoolDDNum ).Title; + } + } else if ( AutosizeDes == DataFlowPerHeatingCapacity * DataAutosizedHeatingCapacity ) { + if ( FinalZoneSizing( CurZoneEqNum ).HeatDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).HeatDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).HeatDDNum ).Title; + } + } } } else if ( SELECT_CASE_var == FlowPerHeatingCapacity ) { if ( ZoneCoolingOnlyFan ) { AutosizeDes = DataFlowPerCoolingCapacity * DataAutosizedCoolingCapacity; + if ( FinalZoneSizing( CurZoneEqNum ).CoolDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).CoolDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).CoolDDNum ).Title; + } } else if ( ZoneHeatingOnlyFan ) { AutosizeDes = DataFlowPerHeatingCapacity * DataAutosizedHeatingCapacity; + if ( FinalZoneSizing( CurZoneEqNum ).HeatDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).HeatDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).HeatDDNum ).Title; + } } else if ( ZoneEqSizing( CurZoneEqNum ).CoolingAirFlow && !ZoneEqSizing( CurZoneEqNum ).HeatingAirFlow ) { AutosizeDes = DataFlowPerCoolingCapacity * DataAutosizedCoolingCapacity; + if ( FinalZoneSizing( CurZoneEqNum ).CoolDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).CoolDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).CoolDDNum ).Title; + } } else if ( ZoneEqSizing( CurZoneEqNum ).HeatingAirFlow && !ZoneEqSizing( CurZoneEqNum ).CoolingAirFlow ) { AutosizeDes = DataFlowPerHeatingCapacity * DataAutosizedHeatingCapacity; + if ( FinalZoneSizing( CurZoneEqNum ).HeatDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).HeatDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).HeatDDNum ).Title; + } } else if ( ZoneEqSizing( CurZoneEqNum ).HeatingAirFlow && ZoneEqSizing( CurZoneEqNum ).CoolingAirFlow ) { AutosizeDes = max( DataFlowPerCoolingCapacity * DataAutosizedCoolingCapacity, DataFlowPerHeatingCapacity * DataAutosizedHeatingCapacity ); + if ( AutosizeDes == DataFlowPerCoolingCapacity * DataAutosizedCoolingCapacity ) { + if ( FinalZoneSizing( CurZoneEqNum ).CoolDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).CoolDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).CoolDDNum ).Title; + } + } else if ( AutosizeDes == DataFlowPerHeatingCapacity * DataAutosizedHeatingCapacity ) { + if ( FinalZoneSizing( CurZoneEqNum ).HeatDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).HeatDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).HeatDDNum ).Title; + } + } } else { AutosizeDes = max( DataFlowPerCoolingCapacity * DataAutosizedCoolingCapacity, DataFlowPerHeatingCapacity * DataAutosizedHeatingCapacity ); + if ( AutosizeDes == DataFlowPerCoolingCapacity * DataAutosizedCoolingCapacity ) { + if ( FinalZoneSizing( CurZoneEqNum ).CoolDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).CoolDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).CoolDDNum ).Title; + } + } else if ( AutosizeDes == DataFlowPerHeatingCapacity * DataAutosizedHeatingCapacity ) { + if ( FinalZoneSizing( CurZoneEqNum ).HeatDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).HeatDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).HeatDDNum ).Title; + } + } } } else { if ( ZoneEqSizing( CurZoneEqNum ).CoolingAirFlow && !ZoneEqSizing( CurZoneEqNum ).HeatingAirFlow ) { AutosizeDes = ZoneEqSizing( CurZoneEqNum ).CoolingAirVolFlow; + if ( FinalZoneSizing( CurZoneEqNum ).CoolDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).CoolDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).CoolDDNum ).Title; + } } else if ( ZoneEqSizing( CurZoneEqNum ).HeatingAirFlow && !ZoneEqSizing( CurZoneEqNum ).CoolingAirFlow ) { AutosizeDes = ZoneEqSizing( CurZoneEqNum ).HeatingAirVolFlow; + if ( FinalZoneSizing( CurZoneEqNum ).HeatDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).HeatDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).HeatDDNum ).Title; + } } else if ( ZoneEqSizing( CurZoneEqNum ).HeatingAirFlow && ZoneEqSizing( CurZoneEqNum ).CoolingAirFlow ) { AutosizeDes = max( ZoneEqSizing( CurZoneEqNum ).CoolingAirVolFlow, ZoneEqSizing( CurZoneEqNum ).HeatingAirVolFlow ); + if ( AutosizeDes == ZoneEqSizing( CurZoneEqNum ).CoolingAirVolFlow ) { + if ( FinalZoneSizing( CurZoneEqNum ).CoolDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).CoolDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).CoolDDNum ).Title; + } + } else if ( AutosizeDes == ZoneEqSizing( CurZoneEqNum ).HeatingAirVolFlow ) { + if ( FinalZoneSizing( CurZoneEqNum ).HeatDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).HeatDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).HeatDDNum ).Title; + } + } } else { if ( ZoneEqSizing( CurZoneEqNum ).SystemAirFlow ) { AutosizeDes = max( ZoneEqSizing( CurZoneEqNum ).AirVolFlow, ZoneEqSizing( CurZoneEqNum ).CoolingAirVolFlow, ZoneEqSizing( CurZoneEqNum ).HeatingAirVolFlow ); } else if ( ZoneCoolingOnlyFan ) { AutosizeDes = FinalZoneSizing( CurZoneEqNum ).DesCoolVolFlow; + if ( FinalZoneSizing( CurZoneEqNum ).CoolDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).CoolDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).CoolDDNum ).Title; + } } else if ( ZoneHeatingOnlyFan ) { AutosizeDes = FinalZoneSizing( CurZoneEqNum ).DesHeatVolFlow; + if ( FinalZoneSizing( CurZoneEqNum ).HeatDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).HeatDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).HeatDDNum ).Title; + } } else { AutosizeDes = max( FinalZoneSizing( CurZoneEqNum ).DesCoolVolFlow, FinalZoneSizing( CurZoneEqNum ).DesHeatVolFlow ); + if ( AutosizeDes = FinalZoneSizing( CurZoneEqNum ).DesCoolVolFlow ) { + if ( FinalZoneSizing( CurZoneEqNum ).CoolDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).CoolDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).CoolDDNum ).Title; + } + } else if ( AutosizeDes = FinalZoneSizing( CurZoneEqNum ).DesHeatVolFlow ) { + if ( FinalZoneSizing( CurZoneEqNum ).HeatDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).HeatDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).HeatDDNum ).Title; + } + } } } if ( DataFractionUsedForSizing > 0.0 ) AutosizeDes = AutosizeDes * DataFractionUsedForSizing; @@ -595,76 +799,249 @@ namespace ReportSizingManager { if ( ( SELECT_CASE_var == SupplyAirFlowRate ) || ( SELECT_CASE_var == None ) || ( SELECT_CASE_var == FlowPerFloorArea ) ) { if ( ZoneEqSizing( CurZoneEqNum ).SystemAirFlow ) { AutosizeDes = max( ZoneEqSizing( CurZoneEqNum ).AirVolFlow, ZoneEqSizing( CurZoneEqNum ).CoolingAirVolFlow, ZoneEqSizing( CurZoneEqNum ).HeatingAirVolFlow ); + if ( SizingType == CoolingAirflowSizing ) { + if ( FinalZoneSizing( CurZoneEqNum ).CoolDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).CoolDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).CoolDDNum ).Title; + } + } else if ( SizingType == HeatingAirflowSizing ) { + + if ( FinalZoneSizing( CurZoneEqNum ).HeatDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).HeatDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).HeatDDNum ).Title; + } + } else { + + if ( AutosizeDes == ZoneEqSizing( CurZoneEqNum ).CoolingAirVolFlow ) { + if ( FinalZoneSizing( CurZoneEqNum ).CoolDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).CoolDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).CoolDDNum ).Title; + } + } else if ( AutosizeDes == ZoneEqSizing( CurZoneEqNum ).HeatingAirVolFlow ) { + if ( FinalZoneSizing( CurZoneEqNum ).HeatDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).HeatDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).HeatDDNum ).Title; + } + } else if ( AutosizeDes == ZoneEqSizing( CurZoneEqNum ).AirVolFlow ) { + DDNameFanPeak = "Unknown"; + } + } } else { if ( ZoneCoolingOnlyFan ) { AutosizeDes = FinalZoneSizing( CurZoneEqNum ).DesCoolVolFlow; + if ( FinalZoneSizing( CurZoneEqNum ).CoolDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).CoolDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).CoolDDNum ).Title; + } } else if ( ZoneHeatingOnlyFan ) { AutosizeDes = FinalZoneSizing( CurZoneEqNum ).DesHeatVolFlow; + if ( FinalZoneSizing( CurZoneEqNum ).HeatDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).HeatDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).HeatDDNum ).Title; + } } else if ( ZoneEqSizing( CurZoneEqNum ).CoolingAirFlow && !ZoneEqSizing( CurZoneEqNum ).HeatingAirFlow ) { AutosizeDes = ZoneEqSizing( CurZoneEqNum ).CoolingAirVolFlow; + if ( FinalZoneSizing( CurZoneEqNum ).CoolDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).CoolDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).CoolDDNum ).Title; + } } else if ( ZoneEqSizing( CurZoneEqNum ).HeatingAirFlow && !ZoneEqSizing( CurZoneEqNum ).CoolingAirFlow ) { AutosizeDes = ZoneEqSizing( CurZoneEqNum ).HeatingAirVolFlow; + if ( FinalZoneSizing( CurZoneEqNum ).HeatDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).HeatDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).HeatDDNum ).Title; + } } else if ( ZoneEqSizing( CurZoneEqNum ).HeatingAirFlow && ZoneEqSizing( CurZoneEqNum ).CoolingAirFlow ) { AutosizeDes = max( ZoneEqSizing( CurZoneEqNum ).CoolingAirVolFlow, ZoneEqSizing( CurZoneEqNum ).HeatingAirVolFlow ); + if ( AutosizeDes == ZoneEqSizing( CurZoneEqNum ).CoolingAirVolFlow ) { + if ( FinalZoneSizing( CurZoneEqNum ).CoolDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).CoolDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).CoolDDNum ).Title; + } + } else if ( AutosizeDes == ZoneEqSizing( CurZoneEqNum ).HeatingAirVolFlow ) { + if ( FinalZoneSizing( CurZoneEqNum ).HeatDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).HeatDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).HeatDDNum ).Title; + } + } } else { AutosizeDes = max( FinalZoneSizing( CurZoneEqNum ).DesCoolVolFlow, FinalZoneSizing( CurZoneEqNum ).DesHeatVolFlow ); + if ( AutosizeDes == FinalZoneSizing( CurZoneEqNum ).DesCoolVolFlow ) { + if ( FinalZoneSizing( CurZoneEqNum ).CoolDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).CoolDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).CoolDDNum ).Title; + } + } else if ( AutosizeDes == FinalZoneSizing( CurZoneEqNum ).DesHeatVolFlow ) { + if ( FinalZoneSizing( CurZoneEqNum ).HeatDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).HeatDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).HeatDDNum ).Title; + } + } } } } else if ( SELECT_CASE_var == FractionOfAutosizedCoolingAirflow ) { if ( ZoneCoolingOnlyFan ) { AutosizeDes = DataFracOfAutosizedCoolingAirflow * FinalZoneSizing( CurZoneEqNum ).DesCoolVolFlow; + if ( FinalZoneSizing( CurZoneEqNum ).CoolDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).CoolDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).CoolDDNum ).Title; + } } else if ( ZoneHeatingOnlyFan ) { AutosizeDes = DataFracOfAutosizedHeatingAirflow * FinalZoneSizing( CurZoneEqNum ).DesHeatVolFlow; + if ( FinalZoneSizing( CurZoneEqNum ).HeatDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).HeatDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).HeatDDNum ).Title; + } } else if ( ZoneEqSizing( CurZoneEqNum ).CoolingAirFlow && !ZoneEqSizing( CurZoneEqNum ).HeatingAirFlow ) { AutosizeDes = DataFracOfAutosizedCoolingAirflow * ZoneEqSizing( CurZoneEqNum ).CoolingAirVolFlow; + if ( FinalZoneSizing( CurZoneEqNum ).CoolDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).CoolDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).CoolDDNum ).Title; + } } else if ( ZoneEqSizing( CurZoneEqNum ).HeatingAirFlow && !ZoneEqSizing( CurZoneEqNum ).CoolingAirFlow ) { AutosizeDes = DataFracOfAutosizedHeatingAirflow * ZoneEqSizing( CurZoneEqNum ).HeatingAirVolFlow; + if ( FinalZoneSizing( CurZoneEqNum ).HeatDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).HeatDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).HeatDDNum ).Title; + } } else if ( ZoneEqSizing( CurZoneEqNum ).HeatingAirFlow && ZoneEqSizing( CurZoneEqNum ).CoolingAirFlow ) { AutosizeDes = max( DataFracOfAutosizedCoolingAirflow * ZoneEqSizing( CurZoneEqNum ).CoolingAirVolFlow, DataFracOfAutosizedHeatingAirflow * ZoneEqSizing( CurZoneEqNum ).HeatingAirVolFlow ); + if ( AutosizeDes == DataFracOfAutosizedCoolingAirflow * ZoneEqSizing( CurZoneEqNum ).CoolingAirVolFlow ) { + if ( FinalZoneSizing( CurZoneEqNum ).CoolDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).CoolDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).CoolDDNum ).Title; + } + } else if ( AutosizeDes == DataFracOfAutosizedHeatingAirflow * ZoneEqSizing( CurZoneEqNum ).HeatingAirVolFlow ) { + if ( FinalZoneSizing( CurZoneEqNum ).HeatDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).HeatDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).HeatDDNum ).Title; + } + } } else { AutosizeDes = max( DataFracOfAutosizedCoolingAirflow * FinalZoneSizing( CurZoneEqNum ).DesCoolVolFlow, DataFracOfAutosizedHeatingAirflow * FinalZoneSizing( CurZoneEqNum ).DesHeatVolFlow ); + if ( AutosizeDes == DataFracOfAutosizedCoolingAirflow * FinalZoneSizing( CurZoneEqNum ).DesCoolVolFlow ) { + if ( FinalZoneSizing( CurZoneEqNum ).CoolDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).CoolDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).CoolDDNum ).Title; + } + } else if ( AutosizeDes == DataFracOfAutosizedHeatingAirflow * FinalZoneSizing( CurZoneEqNum ).DesHeatVolFlow ) { + if ( FinalZoneSizing( CurZoneEqNum ).HeatDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).HeatDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).HeatDDNum ).Title; + } + } } } else if ( SELECT_CASE_var == FractionOfAutosizedHeatingAirflow ) { if ( ZoneCoolingOnlyFan ) { AutosizeDes = DataFracOfAutosizedCoolingAirflow * FinalZoneSizing( CurZoneEqNum ).DesCoolVolFlow; + if ( FinalZoneSizing( CurZoneEqNum ).CoolDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).CoolDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).CoolDDNum ).Title; + } } else if ( ZoneHeatingOnlyFan ) { AutosizeDes = DataFracOfAutosizedHeatingAirflow * FinalZoneSizing( CurZoneEqNum ).DesHeatVolFlow; + if ( FinalZoneSizing( CurZoneEqNum ).HeatDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).HeatDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).HeatDDNum ).Title; + } } else if ( ZoneEqSizing( CurZoneEqNum ).CoolingAirFlow && !ZoneEqSizing( CurZoneEqNum ).HeatingAirFlow ) { AutosizeDes = DataFracOfAutosizedCoolingAirflow * ZoneEqSizing( CurZoneEqNum ).CoolingAirVolFlow; + if ( FinalZoneSizing( CurZoneEqNum ).CoolDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).CoolDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).CoolDDNum ).Title; + } } else if ( ZoneEqSizing( CurZoneEqNum ).HeatingAirFlow && !ZoneEqSizing( CurZoneEqNum ).CoolingAirFlow ) { AutosizeDes = DataFracOfAutosizedHeatingAirflow * ZoneEqSizing( CurZoneEqNum ).HeatingAirVolFlow; + if ( FinalZoneSizing( CurZoneEqNum ).HeatDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).HeatDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).HeatDDNum ).Title; + } } else if ( ZoneEqSizing( CurZoneEqNum ).HeatingAirFlow && ZoneEqSizing( CurZoneEqNum ).CoolingAirFlow ) { AutosizeDes = max( DataFracOfAutosizedCoolingAirflow * ZoneEqSizing( CurZoneEqNum ).CoolingAirVolFlow, DataFracOfAutosizedHeatingAirflow * ZoneEqSizing( CurZoneEqNum ).HeatingAirVolFlow ); + if ( AutosizeDes == DataFracOfAutosizedCoolingAirflow * ZoneEqSizing( CurZoneEqNum ).CoolingAirVolFlow ) { + if ( FinalZoneSizing( CurZoneEqNum ).CoolDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).CoolDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).CoolDDNum ).Title; + } + } else if ( AutosizeDes == DataFracOfAutosizedHeatingAirflow * ZoneEqSizing( CurZoneEqNum ).HeatingAirVolFlow ) { + if ( FinalZoneSizing( CurZoneEqNum ).HeatDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).HeatDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).HeatDDNum ).Title; + } + } } else { AutosizeDes = max( DataFracOfAutosizedCoolingAirflow * FinalZoneSizing( CurZoneEqNum ).DesCoolVolFlow, DataFracOfAutosizedHeatingAirflow * FinalZoneSizing( CurZoneEqNum ).DesHeatVolFlow ); + if ( AutosizeDes == DataFracOfAutosizedCoolingAirflow * FinalZoneSizing( CurZoneEqNum ).DesCoolVolFlow ) { + if ( FinalZoneSizing( CurZoneEqNum ).CoolDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).CoolDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).CoolDDNum ).Title; + } + } else if ( AutosizeDes == DataFracOfAutosizedHeatingAirflow * FinalZoneSizing( CurZoneEqNum ).DesHeatVolFlow ) { + if ( FinalZoneSizing( CurZoneEqNum ).HeatDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).HeatDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).HeatDDNum ).Title; + } + } } } else if ( SELECT_CASE_var == FlowPerCoolingCapacity ) { if ( ZoneCoolingOnlyFan ) { AutosizeDes = DataFlowPerCoolingCapacity * DataAutosizedCoolingCapacity; + if ( FinalZoneSizing( CurZoneEqNum ).CoolDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).CoolDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).CoolDDNum ).Title; + } } else if ( ZoneHeatingOnlyFan ) { AutosizeDes = DataFlowPerHeatingCapacity * DataAutosizedHeatingCapacity; + if ( FinalZoneSizing( CurZoneEqNum ).HeatDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).HeatDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).HeatDDNum ).Title; + } } else if ( ZoneEqSizing( CurZoneEqNum ).CoolingAirFlow && !ZoneEqSizing( CurZoneEqNum ).HeatingAirFlow ) { AutosizeDes = DataFlowPerCoolingCapacity * DataAutosizedCoolingCapacity; + if ( FinalZoneSizing( CurZoneEqNum ).CoolDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).CoolDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).CoolDDNum ).Title; + } } else if ( ZoneEqSizing( CurZoneEqNum ).HeatingAirFlow && !ZoneEqSizing( CurZoneEqNum ).CoolingAirFlow ) { AutosizeDes = DataFlowPerHeatingCapacity * DataAutosizedHeatingCapacity; + if ( FinalZoneSizing( CurZoneEqNum ).HeatDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).HeatDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).HeatDDNum ).Title; + } } else if ( ZoneEqSizing( CurZoneEqNum ).HeatingAirFlow && ZoneEqSizing( CurZoneEqNum ).CoolingAirFlow ) { AutosizeDes = max( DataFlowPerCoolingCapacity * DataAutosizedCoolingCapacity, DataFlowPerHeatingCapacity * DataAutosizedHeatingCapacity ); + if ( AutosizeDes == DataFlowPerCoolingCapacity * DataAutosizedCoolingCapacity ) { + if ( FinalZoneSizing( CurZoneEqNum ).CoolDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).CoolDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).CoolDDNum ).Title; + } + } else if ( AutosizeDes == DataFlowPerHeatingCapacity * DataAutosizedHeatingCapacity ) { + if ( FinalZoneSizing( CurZoneEqNum ).HeatDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).HeatDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).HeatDDNum ).Title; + } + } } else { AutosizeDes = max( DataFlowPerCoolingCapacity * DataAutosizedCoolingCapacity, DataFlowPerHeatingCapacity * DataAutosizedHeatingCapacity ); + if ( AutosizeDes == DataFlowPerCoolingCapacity * DataAutosizedCoolingCapacity ) { + if ( FinalZoneSizing( CurZoneEqNum ).CoolDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).CoolDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).CoolDDNum ).Title; + } + } else if ( AutosizeDes == DataFlowPerHeatingCapacity * DataAutosizedHeatingCapacity ) { + if ( FinalZoneSizing( CurZoneEqNum ).HeatDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).HeatDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).HeatDDNum ).Title; + } + } } } else if ( SELECT_CASE_var == FlowPerHeatingCapacity ) { if ( ZoneCoolingOnlyFan ) { AutosizeDes = DataFlowPerCoolingCapacity * DataAutosizedCoolingCapacity; + if ( FinalZoneSizing( CurZoneEqNum ).CoolDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).CoolDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).CoolDDNum ).Title; + } } else if ( ZoneHeatingOnlyFan ) { AutosizeDes = DataFlowPerHeatingCapacity * DataAutosizedHeatingCapacity; + if ( FinalZoneSizing( CurZoneEqNum ).HeatDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).HeatDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).HeatDDNum ).Title; + } } else if ( ZoneEqSizing( CurZoneEqNum ).CoolingAirFlow && !ZoneEqSizing( CurZoneEqNum ).HeatingAirFlow ) { AutosizeDes = DataFlowPerCoolingCapacity * DataAutosizedCoolingCapacity; + if ( FinalZoneSizing( CurZoneEqNum ).CoolDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).CoolDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).CoolDDNum ).Title; + } } else if ( ZoneEqSizing( CurZoneEqNum ).HeatingAirFlow && !ZoneEqSizing( CurZoneEqNum ).CoolingAirFlow ) { AutosizeDes = DataFlowPerHeatingCapacity * DataAutosizedHeatingCapacity; + if ( FinalZoneSizing( CurZoneEqNum ).HeatDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).HeatDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).HeatDDNum ).Title; + } } else if ( ZoneEqSizing( CurZoneEqNum ).HeatingAirFlow && ZoneEqSizing( CurZoneEqNum ).CoolingAirFlow ) { AutosizeDes = max( DataFlowPerCoolingCapacity * DataAutosizedCoolingCapacity, DataFlowPerHeatingCapacity * DataAutosizedHeatingCapacity ); + if ( AutosizeDes == DataFlowPerCoolingCapacity * DataAutosizedCoolingCapacity ) { + if ( FinalZoneSizing( CurZoneEqNum ).CoolDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).CoolDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).CoolDDNum ).Title; + } + } else if ( AutosizeDes == DataFlowPerHeatingCapacity * DataAutosizedHeatingCapacity ) { + if ( FinalZoneSizing( CurZoneEqNum ).HeatDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).HeatDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).HeatDDNum ).Title; + } + } } else { AutosizeDes = max( DataFlowPerCoolingCapacity * DataAutosizedCoolingCapacity, DataFlowPerHeatingCapacity * DataAutosizedHeatingCapacity ); + if ( AutosizeDes == DataFlowPerCoolingCapacity * DataAutosizedCoolingCapacity ) { + if ( FinalZoneSizing( CurZoneEqNum ).CoolDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).CoolDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).CoolDDNum ).Title; + } + } else if ( AutosizeDes == DataFlowPerHeatingCapacity * DataAutosizedHeatingCapacity ) { + if ( FinalZoneSizing( CurZoneEqNum ).HeatDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).HeatDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).HeatDDNum ).Title; + } + } } } else { if ( ZoneCoolingOnlyFan ) { @@ -1236,6 +1613,7 @@ namespace ReportSizingManager { Cp = GetSpecificHeatGlycol( PlantLoop( DataWaterLoopNum ).FluidName, DataGlobals::HWInitConvTemp, PlantLoop( DataWaterLoopNum ).FluidIndex, CallingRoutine ); rho = GetDensityGlycol( PlantLoop( DataWaterLoopNum ).FluidName, DataGlobals::HWInitConvTemp, PlantLoop( DataWaterLoopNum ).FluidIndex, CallingRoutine ); AutosizeDes = DataWaterFlowUsedForSizing * DataWaterCoilSizHeatDeltaT * Cp * rho; + coilSelectionReportObj->setCoilReheatMultiplier( CompName, CompType, 1.0 ); } else if ( ( TermUnitPIU || TermUnitIU ) && ( CurTermUnitSizingNum > 0 ) ) { DesMassFlow = StdRhoAir * TermUnitSizing( CurTermUnitSizingNum ).AirVolFlow * TermUnitSizing( CurTermUnitSizingNum ).ReheatAirFlowMult; Cp = GetSpecificHeatGlycol( PlantLoop( DataWaterLoopNum ).FluidName, DataGlobals::HWInitConvTemp, PlantLoop( DataWaterLoopNum ).FluidIndex, CallingRoutine ); @@ -1245,6 +1623,7 @@ namespace ReportSizingManager { Cp = GetSpecificHeatGlycol( PlantLoop( DataWaterLoopNum ).FluidName, DataGlobals::HWInitConvTemp, PlantLoop( DataWaterLoopNum ).FluidIndex, CallingRoutine ); rho = GetDensityGlycol( PlantLoop( DataWaterLoopNum ).FluidName, DataGlobals::HWInitConvTemp, PlantLoop( DataWaterLoopNum ).FluidIndex, CallingRoutine ); AutosizeDes = DataWaterFlowUsedForSizing * DataWaterCoilSizHeatDeltaT * Cp * rho; + coilSelectionReportObj->setCoilReheatMultiplier( CompName, CompType, 1.0 ); } else { if ( ZoneEqSizing( CurZoneEqNum ).SystemAirFlow ) { DesMassFlow = ZoneEqSizing( CurZoneEqNum ).AirVolFlow * StdRhoAir; @@ -1267,10 +1646,14 @@ namespace ReportSizingManager { } else if ( SizingType == HeatingWaterDesCoilWaterVolFlowUsedForUASizing ) { if ( TermUnitSingDuct ) { AutosizeDes = DataWaterFlowUsedForSizing; + coilSelectionReportObj->setCoilReheatMultiplier( CompName, CompType, 1.0 ); } else if ( ( TermUnitPIU || TermUnitIU ) && ( CurTermUnitSizingNum > 0 ) ) { AutosizeDes = DataWaterFlowUsedForSizing * TermUnitSizing( CurTermUnitSizingNum ).ReheatLoadMult; + coilSelectionReportObj->setCoilReheatMultiplier( CompName, CompType, TermUnitSizing( CurTermUnitSizingNum ).ReheatLoadMult ); + } else if ( ZoneEqFanCoil ) { AutosizeDes = DataWaterFlowUsedForSizing; + coilSelectionReportObj->setCoilReheatMultiplier( CompName, CompType, 1.0 ); } else { AutosizeDes = DataWaterFlowUsedForSizing; } @@ -1544,15 +1927,58 @@ namespace ReportSizingManager { if ( AirLoopSysFlag ) { if ( UnitarySysEqSizing( CurSysNum ).CoolingAirFlow && UnitarySysEqSizing( CurSysNum ).HeatingAirFlow ) { AutosizeDes = std::max( UnitarySysEqSizing( CurSysNum ).CoolingAirVolFlow, UnitarySysEqSizing( CurSysNum ).HeatingAirVolFlow ); + if ( AutosizeDes == UnitarySysEqSizing( CurSysNum ).CoolingAirVolFlow ) { + if ( DataSizing::SysSizPeakDDNum( CurSysNum ).CoolFlowPeakDD > 0 && DataSizing::SysSizPeakDDNum( CurSysNum ).CoolFlowPeakDD <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( DataSizing::SysSizPeakDDNum( CurSysNum ).CoolFlowPeakDD ).Title; + dateTimeFanPeak = General::TrimSigDigits( WeatherManager::DesDayInput( DataSizing::SysSizPeakDDNum( CurSysNum ).CoolFlowPeakDD ).Month ) + "/" + General::TrimSigDigits( WeatherManager::DesDayInput( DataSizing::SysSizPeakDDNum( CurSysNum ).CoolFlowPeakDD ).DayOfMonth ) + " " + coilSelectionReportObj->getTimeText( DataSizing::SysSizPeakDDNum( CurSysNum ).TimeStepAtCoolFlowPk( DataSizing::SysSizPeakDDNum( CurSysNum ).CoolFlowPeakDD ) ); + } + + } else if ( AutosizeDes == UnitarySysEqSizing( CurSysNum ).HeatingAirVolFlow ){ + if ( FinalSysSizing( CurSysNum ).HeatDDNum > 0 && FinalSysSizing( CurSysNum ).HeatDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalSysSizing( CurSysNum ).HeatDDNum ).Title; + dateTimeFanPeak = General::TrimSigDigits( WeatherManager::DesDayInput( FinalSysSizing( CurSysNum ).HeatDDNum ).Month ) + "/" + General::TrimSigDigits( WeatherManager::DesDayInput( FinalSysSizing( CurSysNum ).HeatDDNum ).DayOfMonth ) + " " + coilSelectionReportObj->getTimeText( FinalSysSizing( CurSysNum ).SysHeatAirTimeStepPk ); + } + } } else if ( UnitarySysEqSizing( CurSysNum ).CoolingAirFlow ) { AutosizeDes = UnitarySysEqSizing( CurSysNum ).CoolingAirVolFlow; + if ( DataSizing::SysSizPeakDDNum( CurSysNum ).CoolFlowPeakDD > 0 && DataSizing::SysSizPeakDDNum( CurSysNum ).CoolFlowPeakDD <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( DataSizing::SysSizPeakDDNum( CurSysNum ).CoolFlowPeakDD ).Title; + dateTimeFanPeak = General::TrimSigDigits( WeatherManager::DesDayInput( DataSizing::SysSizPeakDDNum( CurSysNum ).CoolFlowPeakDD ).Month ) + "/" + General::TrimSigDigits( WeatherManager::DesDayInput( DataSizing::SysSizPeakDDNum( CurSysNum ).CoolFlowPeakDD ).DayOfMonth ) + " " + coilSelectionReportObj->getTimeText( DataSizing::SysSizPeakDDNum( CurSysNum ).TimeStepAtCoolFlowPk( DataSizing::SysSizPeakDDNum( CurSysNum ).CoolFlowPeakDD ) ); + } } else if ( UnitarySysEqSizing( CurSysNum ).HeatingAirFlow ) { AutosizeDes = UnitarySysEqSizing( CurSysNum ).HeatingAirVolFlow; + if ( FinalSysSizing( CurSysNum ).HeatDDNum > 0 && FinalSysSizing( CurSysNum ).HeatDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalSysSizing( CurSysNum ).HeatDDNum ).Title; + dateTimeFanPeak = General::TrimSigDigits( WeatherManager::DesDayInput( FinalSysSizing( CurSysNum ).HeatDDNum ).Month ) + "/" + General::TrimSigDigits( WeatherManager::DesDayInput( FinalSysSizing( CurSysNum ).HeatDDNum ).DayOfMonth ) + " " + coilSelectionReportObj->getTimeText( FinalSysSizing( CurSysNum ).SysHeatAirTimeStepPk ); + } + } else { AutosizeDes = FinalSysSizing( CurSysNum ).DesMainVolFlow; + if ( AutosizeDes == FinalSysSizing( CurSysNum ).DesHeatVolFlow ) { + if ( FinalSysSizing( CurSysNum ).HeatDDNum > 0 && FinalSysSizing( CurSysNum ).HeatDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalSysSizing( CurSysNum ).HeatDDNum ).Title; + dateTimeFanPeak = General::TrimSigDigits( WeatherManager::DesDayInput( FinalSysSizing( CurSysNum ).HeatDDNum ).Month ) + "/" + General::TrimSigDigits( WeatherManager::DesDayInput( FinalSysSizing( CurSysNum ).HeatDDNum ).DayOfMonth ) + " " + coilSelectionReportObj->getTimeText( FinalSysSizing( CurSysNum ).SysHeatAirTimeStepPk ); + } + } else if ( AutosizeDes == FinalSysSizing( CurSysNum ).DesCoolVolFlow ) { + if ( DataSizing::SysSizPeakDDNum( CurSysNum ).CoolFlowPeakDD > 0 && DataSizing::SysSizPeakDDNum( CurSysNum ).CoolFlowPeakDD <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( DataSizing::SysSizPeakDDNum( CurSysNum ).CoolFlowPeakDD ).Title; + dateTimeFanPeak = General::TrimSigDigits( WeatherManager::DesDayInput( DataSizing::SysSizPeakDDNum( CurSysNum ).CoolFlowPeakDD ).Month ) + "/" + General::TrimSigDigits( WeatherManager::DesDayInput( DataSizing::SysSizPeakDDNum( CurSysNum ).CoolFlowPeakDD ).DayOfMonth ) + " " + coilSelectionReportObj->getTimeText( DataSizing::SysSizPeakDDNum( CurSysNum ).TimeStepAtCoolFlowPk( DataSizing::SysSizPeakDDNum( CurSysNum ).CoolFlowPeakDD ) ); + } + } } } else { AutosizeDes = FinalSysSizing( CurSysNum ).DesMainVolFlow; + if ( AutosizeDes == FinalSysSizing( CurSysNum ).DesHeatVolFlow ) { + if ( FinalSysSizing( CurSysNum ).HeatDDNum > 0 && FinalSysSizing( CurSysNum ).HeatDDNum <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( FinalSysSizing( CurSysNum ).HeatDDNum ).Title; + dateTimeFanPeak = General::TrimSigDigits( WeatherManager::DesDayInput( FinalSysSizing( CurSysNum ).HeatDDNum ).Month ) + "/" + General::TrimSigDigits( WeatherManager::DesDayInput( FinalSysSizing( CurSysNum ).HeatDDNum ).DayOfMonth ) + " " + coilSelectionReportObj->getTimeText( FinalSysSizing( CurSysNum ).SysHeatAirTimeStepPk ); + } + } else if ( AutosizeDes == FinalSysSizing( CurSysNum ).DesCoolVolFlow ) { + if ( DataSizing::SysSizPeakDDNum( CurSysNum ).CoolFlowPeakDD > 0 && DataSizing::SysSizPeakDDNum( CurSysNum ).CoolFlowPeakDD <= DataEnvironment::TotDesDays ) { + DDNameFanPeak = WeatherManager::DesDayInput( DataSizing::SysSizPeakDDNum( CurSysNum ).CoolFlowPeakDD ).Title; + dateTimeFanPeak = General::TrimSigDigits( WeatherManager::DesDayInput( DataSizing::SysSizPeakDDNum( CurSysNum ).CoolFlowPeakDD ).Month ) + "/" + General::TrimSigDigits( WeatherManager::DesDayInput( DataSizing::SysSizPeakDDNum( CurSysNum ).CoolFlowPeakDD ).DayOfMonth ) + " " + coilSelectionReportObj->getTimeText( DataSizing::SysSizPeakDDNum( CurSysNum ).TimeStepAtCoolFlowPk( DataSizing::SysSizPeakDDNum( CurSysNum ).CoolFlowPeakDD ) ); + } + } } if ( DataFractionUsedForSizing > 0.0 ) AutosizeDes = AutosizeDes * DataFractionUsedForSizing; } @@ -1851,10 +2277,17 @@ namespace ReportSizingManager { switch ( PrimaryAirSystem( CurSysNum ).supFanModelTypeEnum ){ case DataAirSystems::structArrayLegacyFanModels: { FanCoolLoad = FanDesHeatGain( PrimaryAirSystem( CurSysNum ).SupFanNum, DesVolFlow ); + if ( coilSelectionReportObj->isCompTypeCoil( CompType ) && ( SupFanNum > 0 ) ) { + coilSelectionReportObj->setCoilSupplyFanInfo( CompName, CompType, Fans::Fan( PrimaryAirSystem( CurSysNum ).SupFanNum ).FanName, DataAirSystems::structArrayLegacyFanModels, PrimaryAirSystem( CurSysNum ).SupFanNum ); + } + break; } case DataAirSystems::objectVectorOOFanSystemModel: { FanCoolLoad = HVACFan::fanObjs[ PrimaryAirSystem( CurSysNum ).supFanVecIndex ]->getFanDesignHeatGain( DesVolFlow ); + if ( coilSelectionReportObj->isCompTypeCoil( CompType ) && ( PrimaryAirSystem( CurSysNum ).supFanVecIndex >= 0 ) ) { + coilSelectionReportObj->setCoilSupplyFanInfo( CompName, CompType, HVACFan::fanObjs[ PrimaryAirSystem( CurSysNum ).supFanVecIndex ]->name, DataAirSystems::objectVectorOOFanSystemModel, PrimaryAirSystem( CurSysNum ).supFanVecIndex ); + } break; } case DataAirSystems::fanModelTypeNotYetSet: { @@ -2039,6 +2472,25 @@ namespace ReportSizingManager { } } + switch ( PrimaryAirSystem( CurSysNum ).supFanModelTypeEnum ){ + case DataAirSystems::structArrayLegacyFanModels: { + if ( coilSelectionReportObj->isCompTypeCoil( CompType ) && ( PrimaryAirSystem( CurSysNum ).SupFanNum > 0 ) ) { + coilSelectionReportObj->setCoilSupplyFanInfo(CompName, CompType, Fans::Fan( PrimaryAirSystem( CurSysNum ).SupFanNum ).FanName, DataAirSystems::structArrayLegacyFanModels, PrimaryAirSystem( CurSysNum ).SupFanNum ); + } + break; + } + case DataAirSystems::objectVectorOOFanSystemModel: { + if ( coilSelectionReportObj->isCompTypeCoil( CompType ) && ( PrimaryAirSystem( CurSysNum ).supFanVecIndex >= 0 ) ) { + coilSelectionReportObj->setCoilSupplyFanInfo(CompName, CompType, HVACFan::fanObjs[ PrimaryAirSystem( CurSysNum ).supFanVecIndex ]->name, DataAirSystems::objectVectorOOFanSystemModel, PrimaryAirSystem( CurSysNum ).supFanVecIndex ); + } + break; + } + case DataAirSystems::fanModelTypeNotYetSet: { + // do nothing + break; + } + } // end switch + } else if ( SizingType == HeatingWaterDesCoilLoadUsedForUASizing ) { if ( CurOASysNum > 0 ) { OutAirFrac = 1.0; @@ -2351,7 +2803,10 @@ namespace ReportSizingManager { ShowContinueError( "...Requested flow/capacity ratio (m3/s/W ) = " + TrimSigDigits( RatedVolFlowPerRatedTotCap, 3 ) ); ShowContinueError( "...Minimum flow/capacity ratio (m3/s/W ) = " + TrimSigDigits( MinRatedVolFlowPerRatedTotCap( DXCT ), 3 ) ); } + + DXFlowPerCapMinRatio = (DesVolFlow / MinRatedVolFlowPerRatedTotCap(DXCT)) / SizingResult; //set DX Coil Capacity Increase Ratio from Too Low Flow/Capacity Ratio SizingResult = DesVolFlow / MinRatedVolFlowPerRatedTotCap( DXCT ); + if ( !DataEMSOverride && DisplayExtraWarnings && PrintWarningFlag ) { ShowContinueError( "...Adjusted capacity ( W ) = " + TrimSigDigits( SizingResult, 3 ) ); } @@ -2364,7 +2819,10 @@ namespace ReportSizingManager { ShowContinueError( "...Requested flow/capacity ratio ( m3/s/W ) = " + TrimSigDigits( RatedVolFlowPerRatedTotCap, 3 ) ); ShowContinueError( "...Maximum flow/capacity ratio ( m3/s/W ) = " + TrimSigDigits( MaxRatedVolFlowPerRatedTotCap( DXCT ), 3 ) ); } + + DXFlowPerCapMaxRatio = DesVolFlow / MaxRatedVolFlowPerRatedTotCap(DXCT) / SizingResult; // set DX Coil Capacity Decrease Ratio from Too High Flow/Capacity Ratio SizingResult = DesVolFlow / MaxRatedVolFlowPerRatedTotCap( DXCT ); + if ( !DataEMSOverride && DisplayExtraWarnings && PrintWarningFlag ) { ShowContinueError( "...Adjusted capacity ( W ) = " + TrimSigDigits( SizingResult, 3 ) ); } @@ -2459,6 +2917,121 @@ namespace ReportSizingManager { // eventually move hardsize reporting here? [up in calcs, 3 places at e.g., if ( !IsAutoSize && !SizingDesRunThisAirSys )] } // } + // Coil summary Reporting + if ( SizingType == CoolingAirflowSizing ) { + if ( coilSelectionReportObj->isCompTypeCoil( CompType ) ) { + //SizingResult is airflow in m3/s + coilSelectionReportObj->setCoilAirFlow( CompName, CompType, SizingResult, IsAutoSize ); + } + + // fill fan peak day and time here + if ( coilSelectionReportObj->isCompTypeFan( CompType ) ) { + if ( DataScalableSizingON ) { + DDNameFanPeak = "Scaled size, not from any peak"; + dateTimeFanPeak = "Scaled size, not from any peak"; + } + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchFanDesDay, CompName, DDNameFanPeak ); + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchFanPkTime, CompName, dateTimeFanPeak ); + } + } else if ( SizingType == CoolingWaterflowSizing ) { // used by watercoils.cc + //SizingResult is water flow in m3/s + coilSelectionReportObj->setCoilWaterFlow( CompName, CompType, SizingResult, IsAutoSize, DataPltSizCoolNum, DataWaterLoopNum ); + coilSelectionReportObj->setCoilWaterDeltaT( CompName, CompType , CoilDesWaterDeltaT ); + coilSelectionReportObj->setCoilEntWaterTemp( CompName, CompType , DataGlobals::CWInitConvTemp ); + coilSelectionReportObj->setCoilLvgWaterTemp( CompName, CompType , DataGlobals::CWInitConvTemp + CoilDesWaterDeltaT ); + } else if ( SizingType == HeatingWaterflowSizing ) { + //SizingResult is water flow in m3/s + coilSelectionReportObj->setCoilWaterFlow( CompName, CompType, SizingResult, IsAutoSize, DataPltSizHeatNum, DataWaterLoopNum ); + coilSelectionReportObj->setCoilWaterDeltaT( CompName, CompType , PlantSizData( DataPltSizHeatNum ).DeltaT ); + coilSelectionReportObj->setCoilEntWaterTemp( CompName, CompType , DataGlobals::HWInitConvTemp ); + coilSelectionReportObj->setCoilLvgWaterTemp( CompName, CompType , DataGlobals::HWInitConvTemp - PlantSizData( DataPltSizHeatNum ).DeltaT ); + } else if ( SizingType == CoolingWaterDesAirInletTempSizing ) { + coilSelectionReportObj->setCoilEntAirTemp( CompName, CompType, SizingResult, CurSysNum, CurZoneEqNum ); + } else if ( SizingType == CoolingWaterDesAirInletHumRatSizing ) { + coilSelectionReportObj->setCoilEntAirHumRat( CompName, CompType, SizingResult ); + } else if ( SizingType == CoolingWaterDesWaterInletTempSizing ) { + coilSelectionReportObj->setCoilEntWaterTemp( CompName, CompType, SizingResult ); + } else if ( SizingType == CoolingWaterDesAirOutletTempSizing ) { + coilSelectionReportObj->setCoilLvgAirTemp( CompName, CompType, SizingResult ); + } else if ( SizingType == CoolingWaterDesAirOutletHumRatSizing ) { + coilSelectionReportObj->setCoilLvgAirHumRat( CompName, CompType, SizingResult ); + } else if ( SizingType == CoolingWaterNumofTubesPerRowSizing ) { + // do nothing + } else if ( SizingType == HeatingWaterDesAirInletTempSizing ) { + coilSelectionReportObj->setCoilEntAirTemp( CompName, CompType, SizingResult, CurSysNum, CurZoneEqNum ); + } else if ( SizingType == HeatingWaterDesAirInletHumRatSizing ) { + coilSelectionReportObj->setCoilEntAirHumRat( CompName, CompType, SizingResult ); + } else if ( SizingType == HeatingWaterDesCoilLoadUsedForUASizing ) { + coilSelectionReportObj->setCoilHeatingCapacity( CompName, CompType, SizingResult, IsAutoSize,CurSysNum, CurZoneEqNum,CurOASysNum, FanCoolLoad, TotCapTempModFac, DXFlowPerCapMinRatio, DXFlowPerCapMaxRatio ); + } else if ( SizingType == HeatingWaterDesCoilWaterVolFlowUsedForUASizing ) { + coilSelectionReportObj->setCoilWaterFlow( CompName, CompType, SizingResult, IsAutoSize, DataPltSizHeatNum, DataWaterLoopNum ); + } else if ( SizingType == HeatingAirflowSizing ) { + if ( coilSelectionReportObj->isCompTypeCoil( CompType ) ) { + //SizingResult is airflow in m3/s + coilSelectionReportObj->setCoilAirFlow( CompName, CompType, SizingResult, IsAutoSize ); + } + // fill fan peak day and time here + if ( coilSelectionReportObj->isCompTypeFan( CompType ) ) { + if ( DataScalableSizingON ) { + DDNameFanPeak = "Scaled size, not from any peak"; + dateTimeFanPeak = "Scaled size, not from any peak"; + } + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchFanDesDay, CompName, DDNameFanPeak ); + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchFanPkTime, CompName, dateTimeFanPeak ); + } + } else if ( SizingType == HeatingAirflowUASizing ) { + + // do nothing + } else if ( SizingType == SystemAirflowSizing ) { + // fill fan peak day and time here + if ( coilSelectionReportObj->isCompTypeFan( CompType ) ) { + if ( DataScalableSizingON ) { + DDNameFanPeak = "Scaled size, not from any peak"; + dateTimeFanPeak = "Scaled size, not from any peak"; + } + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchFanDesDay, CompName, DDNameFanPeak ); + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchFanPkTime, CompName, dateTimeFanPeak ); + } + + } else if ( SizingType == CoolingCapacitySizing ) { + if ( coilSelectionReportObj->isCompTypeCoil( CompType ) ) { + coilSelectionReportObj->setCoilCoolingCapacity( CompName, CompType, SizingResult, IsAutoSize ,CurSysNum, CurZoneEqNum, CurOASysNum, FanCoolLoad , TotCapTempModFac, DXFlowPerCapMinRatio, DXFlowPerCapMaxRatio ); + } + } else if ( SizingType == HeatingCapacitySizing ) { + if ( coilSelectionReportObj->isCompTypeCoil( CompType ) ) { + coilSelectionReportObj->setCoilHeatingCapacity( CompName, CompType, SizingResult, IsAutoSize, CurSysNum, CurZoneEqNum,CurOASysNum,FanCoolLoad, TotCapTempModFac, DXFlowPerCapMinRatio, DXFlowPerCapMaxRatio ); + } + } else if ( SizingType == WaterHeatingCapacitySizing ) { + if ( coilSelectionReportObj->isCompTypeCoil( CompType ) ) { + coilSelectionReportObj->setCoilWaterHeaterCapacity( CompName, CompType, SizingResult, IsAutoSize, DataPltSizHeatNum, DataWaterLoopNum ); + } + } else if ( SizingType == WaterHeatingCoilUASizing ) { + coilSelectionReportObj->setCoilUA( CompName, CompType, SizingResult, DataCapacityUsedForSizing, IsAutoSize, CurSysNum, CurZoneEqNum ); + + } else if ( SizingType == CoolingSHRSizing ) { + + } else if ( SizingType == HeatingDefrostSizing ) { + + } else if ( SizingType == MaxHeaterOutletTempSizing ) { + + } else if ( SizingType == AutoCalculateSizing ) { + // do nothing + } else if ( SizingType == ZoneCoolingLoadSizing ) { + // do nothing + } else if ( SizingType == ZoneHeatingLoadSizing ) { + // do nothing + } else if ( SizingType == MinSATempCoolingSizing ) { + + } else if ( SizingType == MaxSATempHeatingSizing ) { + + } else if ( SizingType == HeatingCoilDesAirInletTempSizing ) { + coilSelectionReportObj->setCoilEntAirTemp( CompName, CompType, SizingResult, CurSysNum, CurZoneEqNum ); + } else if ( SizingType == HeatingCoilDesAirOutletTempSizing ) { + coilSelectionReportObj->setCoilLvgAirTemp( CompName, CompType, SizingResult ); + } else if ( SizingType == HeatingCoilDesAirInletHumRatSizing ) { + coilSelectionReportObj->setCoilEntAirHumRat( CompName, CompType, SizingResult ); + } + } void diff --git a/src/EnergyPlus/SimAirServingZones.cc b/src/EnergyPlus/SimAirServingZones.cc index 6dab0494c14..554a8fb62d7 100644 --- a/src/EnergyPlus/SimAirServingZones.cc +++ b/src/EnergyPlus/SimAirServingZones.cc @@ -5329,6 +5329,12 @@ namespace SimAirServingZones { SysSizing( CurOverallSimDay, AirLoopNum ).OutTempAtCoolPeak = OutDryBulbTemp; SysSizing( CurOverallSimDay, AirLoopNum ).OutHumRatAtCoolPeak = OutHumRat; SysSizing( CurOverallSimDay, AirLoopNum ).MassFlowAtCoolPeak = SysSizing( CurOverallSimDay, AirLoopNum ).CoolFlowSeq( TimeStepInDay ); + + } + SysSizing( CurOverallSimDay, AirLoopNum ).SysCoolCoinSpaceSens = 0.0; + for ( int zonesCoolLoop = 1; zonesCoolLoop <= AirToZoneNodeInfo( AirLoopNum ).NumZonesCooled; ++zonesCoolLoop ) { + int zoneNum = AirToZoneNodeInfo( AirLoopNum ).CoolCtrlZoneNums( zonesCoolLoop ); + SysSizing( CurOverallSimDay, AirLoopNum ).SysCoolCoinSpaceSens += CalcZoneSizing( CurOverallSimDay, zoneNum ).CoolLoadSeq( TimeStepInDay ); } } // get the maximum cooling mass flow rate @@ -5396,7 +5402,21 @@ namespace SimAirServingZones { SysSizing( CurOverallSimDay, AirLoopNum ).HeatRetHumRat = SysHeatRetHumRat; SysSizing( CurOverallSimDay, AirLoopNum ).HeatOutTemp = OutDryBulbTemp; SysSizing( CurOverallSimDay, AirLoopNum ).HeatOutHumRat = OutHumRat; + // save time of system coincident heating coil peak + SysSizing( CurOverallSimDay, AirLoopNum ).SysHeatCoilTimeStepPk = TimeStepInDay; + SysSizing( CurOverallSimDay, AirLoopNum ).SysHeatCoinSpaceSens = 0.0; + if ( AirToZoneNodeInfo( AirLoopNum ).NumZonesHeated > 0 ) { + for ( int zonesHeatLoop = 1; zonesHeatLoop <= AirToZoneNodeInfo( AirLoopNum ).NumZonesHeated; ++zonesHeatLoop ) { + int zoneNum = AirToZoneNodeInfo( AirLoopNum ).HeatCtrlZoneNums( zonesHeatLoop ); + SysSizing( CurOverallSimDay, AirLoopNum ).SysHeatCoinSpaceSens += CalcZoneSizing( CurOverallSimDay, zoneNum ).HeatLoadSeq( TimeStepInDay ); + } + } } + //! save time of system coincident heating airflow peak + if ( SysSizing( CurOverallSimDay, AirLoopNum ).HeatFlowSeq( TimeStepInDay ) > SysSizing( CurOverallSimDay, AirLoopNum ).CoinHeatMassFlow ) { + SysSizing( CurOverallSimDay, AirLoopNum ).SysHeatAirTimeStepPk = TimeStepInDay; + } + // Get the maximum system heating flow rate SysSizing( CurOverallSimDay, AirLoopNum ).CoinHeatMassFlow = max( SysSizing( CurOverallSimDay, AirLoopNum ).CoinHeatMassFlow, SysSizing( CurOverallSimDay, AirLoopNum ).HeatFlowSeq( TimeStepInDay ) ); @@ -5448,7 +5468,20 @@ namespace SimAirServingZones { SysSizing( CurOverallSimDay, AirLoopNum ).HeatRetHumRat = SysHeatRetHumRat; SysSizing( CurOverallSimDay, AirLoopNum ).HeatOutTemp = OutDryBulbTemp; SysSizing( CurOverallSimDay, AirLoopNum ).HeatOutHumRat = OutHumRat; + // save time of system coincident heating coil peak + SysSizing( CurOverallSimDay, AirLoopNum ).SysHeatCoilTimeStepPk = TimeStepInDay; + + SysSizing( CurOverallSimDay, AirLoopNum ).SysHeatCoinSpaceSens = 0.0; + for ( int zonesCoolLoop = 1; zonesCoolLoop <= AirToZoneNodeInfo( AirLoopNum ).NumZonesCooled; ++zonesCoolLoop ) { + int zoneNum = AirToZoneNodeInfo( AirLoopNum ).CoolCtrlZoneNums( zonesCoolLoop ); + SysSizing( CurOverallSimDay, AirLoopNum ).SysHeatCoinSpaceSens += CalcZoneSizing( CurOverallSimDay, zoneNum ).HeatLoadSeq( TimeStepInDay ); + } } // Get the maximum system heating flow rate + // save time of system coincident heating airflow peak + if ( SysSizing( CurOverallSimDay, AirLoopNum ).HeatFlowSeq( TimeStepInDay ) > SysSizing( CurOverallSimDay, AirLoopNum).CoinHeatMassFlow ) { + SysSizing( CurOverallSimDay, AirLoopNum ).SysHeatAirTimeStepPk = TimeStepInDay; + } + SysSizing( CurOverallSimDay, AirLoopNum ).CoinHeatMassFlow = max( SysSizing( CurOverallSimDay, AirLoopNum ).CoinHeatMassFlow, SysSizing( CurOverallSimDay, AirLoopNum ).HeatFlowSeq( TimeStepInDay ) ); } @@ -6057,6 +6090,7 @@ namespace SimAirServingZones { CalcSysSizing( AirLoopNum ).SysCoolOutHumRatSeq = SysSizing( DDNum, AirLoopNum ).SysCoolOutHumRatSeq; CalcSysSizing( AirLoopNum ).SysDOASHeatAddSeq = SysSizing( DDNum, AirLoopNum ).SysDOASHeatAddSeq; CalcSysSizing( AirLoopNum ).SysDOASLatAddSeq = SysSizing( DDNum, AirLoopNum ).SysDOASLatAddSeq; + CalcSysSizing( AirLoopNum ).SysCoolCoinSpaceSens = SysSizing( DDNum, AirLoopNum ).SysCoolCoinSpaceSens; } } @@ -6089,6 +6123,7 @@ namespace SimAirServingZones { CalcSysSizing( AirLoopNum ).SysDOASHeatAddSeq = SysSizing( DDNum, AirLoopNum ).SysDOASHeatAddSeq; CalcSysSizing( AirLoopNum ).SysDOASLatAddSeq = SysSizing( DDNum, AirLoopNum ).SysDOASLatAddSeq; } + CalcSysSizing( AirLoopNum ).SysCoolCoinSpaceSens = SysSizing( DDNum, AirLoopNum ).SysCoolCoinSpaceSens; } if ( SysSizing( DDNum, AirLoopNum ).CoinCoolMassFlow > CalcSysSizing( AirLoopNum ).CoinCoolMassFlow ) { @@ -6120,6 +6155,12 @@ namespace SimAirServingZones { CalcSysSizing( AirLoopNum ).SysHeatRetHumRatSeq = SysSizing( DDNum, AirLoopNum ).SysHeatRetHumRatSeq; CalcSysSizing( AirLoopNum ).SysHeatOutTempSeq = SysSizing( DDNum, AirLoopNum ).SysHeatOutTempSeq; CalcSysSizing( AirLoopNum ).SysHeatOutHumRatSeq = SysSizing( DDNum, AirLoopNum ).SysHeatOutHumRatSeq; + + CalcSysSizing( AirLoopNum ).SysHeatCoilTimeStepPk = SysSizing( DDNum, AirLoopNum ).SysHeatCoilTimeStepPk; + + CalcSysSizing( AirLoopNum ).SysHeatAirTimeStepPk = SysSizing( DDNum, AirLoopNum ).SysHeatAirTimeStepPk; + CalcSysSizing( AirLoopNum ).HeatDDNum = DDNum; + CalcSysSizing( AirLoopNum ).SysHeatCoinSpaceSens = SysSizing( DDNum, AirLoopNum ).SysHeatCoinSpaceSens; } } @@ -6354,6 +6395,11 @@ namespace SimAirServingZones { z.HeatRetHumRat = c.HeatRetHumRat; z.HeatOutTemp = c.HeatOutTemp; z.HeatOutHumRat = c.HeatOutHumRat; + z.SysHeatCoilTimeStepPk = c.SysHeatCoilTimeStepPk; + z.SysHeatAirTimeStepPk = c.SysHeatAirTimeStepPk; + z.HeatDDNum = c.HeatDDNum; + z.SysCoolCoinSpaceSens = c.SysCoolCoinSpaceSens; + z.SysHeatCoinSpaceSens = c.SysHeatCoinSpaceSens; } for ( AirLoopNum = 1; AirLoopNum <= NumPrimaryAirSys; ++AirLoopNum ) { diff --git a/src/EnergyPlus/SimulationManager.cc b/src/EnergyPlus/SimulationManager.cc index 44dd6997548..47b5d823765 100644 --- a/src/EnergyPlus/SimulationManager.cc +++ b/src/EnergyPlus/SimulationManager.cc @@ -139,6 +139,7 @@ extern "C" { #include #include #include +#include namespace EnergyPlus { namespace SimulationManager { @@ -355,6 +356,7 @@ namespace SimulationManager { CheckIfAnyBasements(); CheckIfAnyIdealCondEntSetPoint(); createFacilityElectricPowerServiceObject(); + createCoilSelectionReportObj(); ManageBranchInput(); // just gets input and returns. diff --git a/src/EnergyPlus/SingleDuct.cc b/src/EnergyPlus/SingleDuct.cc index de6a7eeffb7..0520bd17b51 100644 --- a/src/EnergyPlus/SingleDuct.cc +++ b/src/EnergyPlus/SingleDuct.cc @@ -82,6 +82,7 @@ #include #include #include +#include #include #include #include @@ -2423,6 +2424,10 @@ namespace SingleDuct { TermUnitSizing( CurTermUnitSizingNum ).ReheatAirFlowMult = 1.0; TermUnitSizing( CurTermUnitSizingNum ).ReheatLoadMult = 1.0; } + if ( Sys( SysNum ).ReheatComp_Index > 0 ) { + coilSelectionReportObj->setCoilReheatMultiplier( Sys( SysNum ).ReheatName, Sys( SysNum ).ReheatComp,TermUnitSizing( CurTermUnitSizingNum ).ReheatLoadMult ); + } + } IsAutoSize = false; @@ -2572,6 +2577,7 @@ namespace SingleDuct { TermUnitSizing( CurTermUnitSizingNum ).MinFlowFrac = Sys( SysNum ).ZoneMinAirFrac; TermUnitSizing( CurTermUnitSizingNum ).MaxHWVolFlow = Sys( SysNum ).MaxReheatWaterVolFlow; TermUnitSizing( CurTermUnitSizingNum ).MaxSTVolFlow = Sys( SysNum ).MaxReheatSteamVolFlow; + TermUnitSizing( CurTermUnitSizingNum ).DesHeatingLoad = DesCoilLoad; // Coil Summary report if ( Sys( SysNum ).ReheatComp_Num == HCoilType_SimpleHeating ) { if ( Sys( SysNum ).DamperHeatingAction == Normal ) { SetCoilDesFlow( Sys( SysNum ).ReheatComp, Sys( SysNum ).ReheatName, Sys( SysNum ).ZoneMinAirFrac * Sys( SysNum ).MaxAirVolFlowRate, ErrorsFound ); diff --git a/src/EnergyPlus/SingleDuct.hh b/src/EnergyPlus/SingleDuct.hh index 9ef9bbbc654..e7e30ead257 100644 --- a/src/EnergyPlus/SingleDuct.hh +++ b/src/EnergyPlus/SingleDuct.hh @@ -68,7 +68,7 @@ namespace SingleDuct { extern int const ReverseAction; extern int const ReverseActionWithLimits; extern int const HeatingActionNotUsed; - extern int const NormalEnforceVavMinForHtg; //TRANE, special version of Normal where (re)heating flow rates are enforced. + // SysTypes represented here extern int const SingleDuctVAVReheat; extern int const SingleDuctConstVolReheat; diff --git a/src/EnergyPlus/SizingAnalysisObjects.cc b/src/EnergyPlus/SizingAnalysisObjects.cc index 7678cb3131b..4a6ee65bd01 100644 --- a/src/EnergyPlus/SizingAnalysisObjects.cc +++ b/src/EnergyPlus/SizingAnalysisObjects.cc @@ -654,7 +654,7 @@ namespace EnergyPlus { } if ( ! nullStampProblem ) { - if ( ! changedByDemand && ! CheckTimeStampForNull( newFoundMassFlowRateTimeStamp )) { //Trane: bug fix #5665 + if ( ! changedByDemand && ! CheckTimeStampForNull( newFoundMassFlowRateTimeStamp )) { // bug fix #5665 if ( newFoundMassFlowRateTimeStamp.envrnNum > 0 ) { // protect against invalid index PreDefTableEntry( pdchPlantSizDesDay, PlantLoop( plantLoopIndex ).Name + " Sizing Pass " + chIteration , Environment(newFoundMassFlowRateTimeStamp.envrnNum).Title ); } @@ -664,7 +664,7 @@ namespace EnergyPlus { newFoundMassFlowRateTimeStamp.hourOfDay - 1 ); PreDefTableEntry( pdchPlantSizPkTimeMin, PlantLoop( plantLoopIndex ).Name + " Sizing Pass " + chIteration , newFoundMassFlowRateTimeStamp.stepStartMinute, 0 ); - } else if ( changedByDemand && ! CheckTimeStampForNull( NewFoundMaxDemandTimeStamp ) ) { //Trane: bug fix #5665 + } else if ( changedByDemand && ! CheckTimeStampForNull( NewFoundMaxDemandTimeStamp ) ) { //bug fix #5665 if ( NewFoundMaxDemandTimeStamp.envrnNum > 0 ) { // protect against invalid index PreDefTableEntry( pdchPlantSizDesDay, PlantLoop( plantLoopIndex ).Name + " Sizing Pass " + chIteration , Environment(NewFoundMaxDemandTimeStamp.envrnNum).Title ); } diff --git a/src/EnergyPlus/SteamCoils.cc b/src/EnergyPlus/SteamCoils.cc index 7b39a0f9f9d..4309b16f362 100644 --- a/src/EnergyPlus/SteamCoils.cc +++ b/src/EnergyPlus/SteamCoils.cc @@ -63,10 +63,12 @@ #include #include #include +#include #include #include #include #include +#include #include #include #include @@ -75,6 +77,7 @@ #include #include #include +#include namespace EnergyPlus { @@ -687,7 +690,7 @@ namespace SteamCoils { Real64 DesVolFlow; Real64 MinFlowFrac; Real64 OutAirFrac; - Real64 TempSteamIn; + Real64 TempSteamIn( 100.0 ); Real64 EnthSteamInDry; Real64 EnthSteamOutWet; Real64 LatentHeatSteam; @@ -714,10 +717,12 @@ namespace SteamCoils { CpWater = 0.0; RhoAirStd = PsyRhoAirFnPbTdbW( StdBaroPress, 20.0, 0.0 ); CpAirStd = PsyCpAirFnWTdb( 0.0, 20.0 ); + bool coilWasAutosized( false ); //coil report // If this is a steam coil // Find the appropriate steam Plant Sizing object if ( SteamCoil( CoilNum ).MaxSteamVolFlowRate == AutoSize ) { + coilWasAutosized = true; //coil report PltSizSteamNum = MyPlantSizingIndex( "steam heating coil", SteamCoil( CoilNum ).Name, SteamCoil( CoilNum ).SteamInletNodeNum, SteamCoil( CoilNum ).SteamOutletNodeNum, ErrorsFound ); } @@ -818,6 +823,24 @@ namespace SteamCoils { ReportSizingOutput( "Coil:Heating:Steam", SteamCoil( CoilNum ).Name, "Maximum Steam Flow Rate [m3/s]", SteamCoil( CoilNum ).MaxSteamVolFlowRate ); } DataDesicRegCoil = false; // reset all globals to 0 to ensure correct sizing for other child components + //Coil report, set fan info for airloopnum + switch ( DataAirSystems::PrimaryAirSystem( CurSysNum ).supFanModelTypeEnum ){ + case DataAirSystems::structArrayLegacyFanModels: { + int SupFanNum = DataAirSystems::PrimaryAirSystem( CurSysNum ).SupFanNum; + if ( SupFanNum > 0 ) { + coilSelectionReportObj->setCoilSupplyFanInfo( SteamCoil( CoilNum ).Name, "Coil:Heating:Steam", Fans::Fan( DataAirSystems::PrimaryAirSystem( CurSysNum ).SupFanNum ).FanName, DataAirSystems::structArrayLegacyFanModels, DataAirSystems::PrimaryAirSystem( CurSysNum ).SupFanNum ); + } + + break; + } + case DataAirSystems::objectVectorOOFanSystemModel: { + if ( DataAirSystems::PrimaryAirSystem( CurSysNum ).supFanVecIndex >= 0 ) { + coilSelectionReportObj->setCoilSupplyFanInfo( SteamCoil( CoilNum ).Name, "Coil:Heating:Steam", HVACFan::fanObjs[ DataAirSystems::PrimaryAirSystem( CurSysNum ).supFanVecIndex ]->name, DataAirSystems::objectVectorOOFanSystemModel, DataAirSystems::PrimaryAirSystem( CurSysNum ).supFanVecIndex ); + } + break; + } + } + // if this is a zone coil } else if ( CurZoneEqNum > 0 ) { CheckZoneSizing( "Coil:Heating:Steam", SteamCoil( CoilNum ).Name ); @@ -831,14 +854,17 @@ namespace SteamCoils { SteamCoil( CoilNum ).MaxSteamVolFlowRate = 0.0; } // if coil is part of a zonal unit, calc coil load to get hot Steam flow rate + DesCoilLoad = TermUnitSizing( CurTermUnitSizingNum ).DesHeatingLoad; //coil report + DesVolFlow = TermUnitSizing( CurTermUnitSizingNum ).AirVolFlow * TermUnitSizing( CurTermUnitSizingNum ).ReheatAirFlowMult; //coil report } else { CoilInTemp = FinalZoneSizing( CurZoneEqNum ).DesHeatCoilInTemp; CoilOutTemp = FinalZoneSizing( CurZoneEqNum ).HeatDesTemp; CoilOutHumRat = FinalZoneSizing( CurZoneEqNum ).HeatDesHumRat; DesMassFlow = FinalZoneSizing( CurZoneEqNum ).DesHeatMassFlow; + DesVolFlow = DesMassFlow / RhoAirStd; DesCoilLoad = PsyCpAirFnWTdb( CoilOutHumRat, 0.5 * ( CoilInTemp + CoilOutTemp ) ) * DesMassFlow * ( CoilOutTemp - CoilInTemp ); if ( DesCoilLoad >= SmallLoad ) { - TempSteamIn = 100.0; // DSU? Should be from the PlantSizing object (ExitTemp) instead of hardwired to 100? + TempSteamIn = 100.0; // RefrigIndex is set during GetInput for this module EnthSteamInDry = GetSatEnthalpyRefrig( fluidNameSteam, TempSteamIn, 1.0, SteamCoil( CoilNum ).FluidIndex, RoutineName ); EnthSteamOutWet = GetSatEnthalpyRefrig( fluidNameSteam, TempSteamIn, 0.0, SteamCoil( CoilNum ).FluidIndex, RoutineName ); @@ -880,10 +906,30 @@ namespace SteamCoils { // save the design Steam volumetric flow rate for use by the Steam loop sizing algorithms RegisterPlantCompDesignFlow( SteamCoil( CoilNum ).SteamInletNodeNum, SteamCoil( CoilNum ).MaxSteamVolFlowRate ); + coilSelectionReportObj->setCoilHeatingCapacity( SteamCoil( CoilNum ).Name, "Coil:Heating:Steam", DesCoilLoad, coilWasAutosized, CurSysNum, CurZoneEqNum, CurOASysNum, 0.0, 1.0, -999.0,-999.0 ); + coilSelectionReportObj->setCoilWaterHeaterCapacity( SteamCoil( CoilNum ).Name, "Coil:Heating:Steam", DesCoilLoad, coilWasAutosized, PltSizSteamNum, SteamCoil( CoilNum ).LoopNum ); + coilSelectionReportObj->setCoilWaterFlow( SteamCoil( CoilNum ).Name, "Coil:Heating:Steam", SteamCoil( CoilNum ).MaxSteamVolFlowRate, coilWasAutosized, PltSizSteamNum, SteamCoil( CoilNum ).LoopNum ); + coilSelectionReportObj->setCoilEntWaterTemp( SteamCoil( CoilNum ).Name, "Coil:Heating:Steam" , TempSteamIn ); //coil report + coilSelectionReportObj->setCoilLvgWaterTemp( SteamCoil( CoilNum ).Name, "Coil:Heating:Steam" , TempSteamIn - SteamCoil( CoilNum ).DegOfSubcooling ); //coil report + coilSelectionReportObj->setCoilWaterDeltaT( SteamCoil( CoilNum ).Name, "Coil:Heating:Steam" , SteamCoil( CoilNum ).DegOfSubcooling ); //coil report + SteamCoil( CoilNum ).DesCoilCapacity = DesCoilLoad; + SteamCoil( CoilNum ).DesAirVolFlow = DesVolFlow; if ( ErrorsFound ) { ShowFatalError( "Preceding Steam coil sizing errors cause program termination" ); } + //There is no standard rating for heating coils at this point, so fill with dummy flag values + coilSelectionReportObj->setRatedCoilConditions( + SteamCoil( CoilNum ).Name, + "Coil:Heating:Steam", + -999.0, + -999.0, + -999.0, + -999.0, + -999.0, + -999.0, + -999.0,-999.0,-999.0, + -999.0,-999.0, -999.0, -999.0 ); } // End Initialization Section of the Module diff --git a/src/EnergyPlus/SteamCoils.hh b/src/EnergyPlus/SteamCoils.hh index 81263147bcb..f88986e3b0e 100644 --- a/src/EnergyPlus/SteamCoils.hh +++ b/src/EnergyPlus/SteamCoils.hh @@ -157,6 +157,9 @@ namespace SteamCoils { bool FaultyCoilSATFlag; // True if the coil has SAT sensor fault int FaultyCoilSATIndex; // Index of the fault object corresponding to the coil Real64 FaultyCoilSATOffset; // Coil SAT sensor offset + bool reportCoilFinalSizes; // one time report of sizes to coil selection report + Real64 DesCoilCapacity; //store design load + Real64 DesAirVolFlow; // store design air flow // Default Constructor SteamCoilEquipConditions() : @@ -214,7 +217,10 @@ namespace SteamCoils { DesiccantDehumNum( 0 ), FaultyCoilSATFlag( false ), FaultyCoilSATIndex( 0 ), - FaultyCoilSATOffset( 0.0 ) + FaultyCoilSATOffset( 0.0 ), + reportCoilFinalSizes( true ), + DesCoilCapacity( 0.0 ), + DesAirVolFlow( 0.0 ) {} }; diff --git a/src/EnergyPlus/UnitHeater.cc b/src/EnergyPlus/UnitHeater.cc index c4c7249b47a..58f7131fc9d 100644 --- a/src/EnergyPlus/UnitHeater.cc +++ b/src/EnergyPlus/UnitHeater.cc @@ -75,6 +75,7 @@ #include #include #include +#include #include #include #include @@ -657,6 +658,13 @@ namespace UnitHeater { } } + for ( UnitHeatNum = 1; UnitHeatNum <= NumOfUnitHeats; ++UnitHeatNum ) { + if ( UnitHeat( UnitHeatNum ).FanType_Num == DataHVACGlobals::FanType_SystemModelObject ) { + coilSelectionReportObj->setCoilSupplyFanInfo( UnitHeat( UnitHeatNum ).HCoilName, UnitHeat( UnitHeatNum ).HCoilTypeCh, UnitHeat( UnitHeatNum ).FanName, DataAirSystems::objectVectorOOFanSystemModel, UnitHeat( UnitHeatNum ).Fan_Index ); + } else { + coilSelectionReportObj->setCoilSupplyFanInfo( UnitHeat( UnitHeatNum ).HCoilName, UnitHeat( UnitHeatNum ).HCoilTypeCh, UnitHeat( UnitHeatNum ).FanName, DataAirSystems::structArrayLegacyFanModels, UnitHeat( UnitHeatNum ).Fan_Index ); + } + } } void diff --git a/src/EnergyPlus/UnitVentilator.cc b/src/EnergyPlus/UnitVentilator.cc index ea947ff262b..c8bcd8d7d79 100644 --- a/src/EnergyPlus/UnitVentilator.cc +++ b/src/EnergyPlus/UnitVentilator.cc @@ -55,6 +55,7 @@ // EnergyPlus Headers #include #include +#include #include #include #include @@ -78,6 +79,7 @@ #include #include #include +#include #include #include #include @@ -1021,6 +1023,40 @@ namespace UnitVentilator { } } + for ( UnitVentNum = 1; UnitVentNum <= NumOfUnitVents; ++UnitVentNum ) { + if ( UnitVent( UnitVentNum ).FanType_Num == DataHVACGlobals::FanType_SystemModelObject ) { + if ( UnitVent( UnitVentNum ).HCoilPresent ) { + coilSelectionReportObj->setCoilSupplyFanInfo( UnitVent( UnitVentNum ).HCoilName, UnitVent( UnitVentNum ).HCoilTypeCh, UnitVent( UnitVentNum ).FanName, DataAirSystems::objectVectorOOFanSystemModel, UnitVent( UnitVentNum ).Fan_Index ); + } + if ( UnitVent( UnitVentNum ).CCoilPresent ) { + coilSelectionReportObj->setCoilSupplyFanInfo( UnitVent( UnitVentNum ).CCoilName , UnitVent( UnitVentNum ).CCoilTypeCh , UnitVent( UnitVentNum ).FanName, DataAirSystems::objectVectorOOFanSystemModel, UnitVent( UnitVentNum ).Fan_Index ); + } + } else { + if ( UnitVent( UnitVentNum ).HCoilPresent ) { + coilSelectionReportObj->setCoilSupplyFanInfo( UnitVent( UnitVentNum ).HCoilName, UnitVent( UnitVentNum ).HCoilTypeCh, UnitVent( UnitVentNum ).FanName, DataAirSystems::structArrayLegacyFanModels, UnitVent( UnitVentNum ).Fan_Index ); + } + if ( UnitVent( UnitVentNum ).CCoilPresent ) { + coilSelectionReportObj->setCoilSupplyFanInfo( UnitVent( UnitVentNum ).CCoilName , UnitVent( UnitVentNum ).CCoilTypeCh , UnitVent( UnitVentNum ).FanName, DataAirSystems::structArrayLegacyFanModels, UnitVent( UnitVentNum ).Fan_Index ); + } + } + } + for ( UnitVentNum = 1; UnitVentNum <= NumOfUnitVents; ++UnitVentNum ) { + if ( UnitVent( UnitVentNum ).FanType_Num == DataHVACGlobals::FanType_SystemModelObject ) { + if ( UnitVent( UnitVentNum ).HCoilPresent ) { + coilSelectionReportObj->setCoilSupplyFanInfo( UnitVent( UnitVentNum ).HCoilName, UnitVent( UnitVentNum ).HCoilTypeCh, UnitVent( UnitVentNum ).FanName, DataAirSystems::objectVectorOOFanSystemModel, UnitVent( UnitVentNum ).Fan_Index ); + } + if ( UnitVent( UnitVentNum ).CCoilPresent ) { + coilSelectionReportObj->setCoilSupplyFanInfo( UnitVent( UnitVentNum ).CCoilName , UnitVent( UnitVentNum ).CCoilTypeCh , UnitVent( UnitVentNum ).FanName, DataAirSystems::objectVectorOOFanSystemModel, UnitVent( UnitVentNum ).Fan_Index ); + } + } else { + if ( UnitVent( UnitVentNum ).HCoilPresent ) { + coilSelectionReportObj->setCoilSupplyFanInfo( UnitVent( UnitVentNum ).HCoilName, UnitVent( UnitVentNum ).HCoilTypeCh, UnitVent( UnitVentNum ).FanName, DataAirSystems::structArrayLegacyFanModels, UnitVent( UnitVentNum ).Fan_Index ); + } + if ( UnitVent( UnitVentNum ).CCoilPresent ) { + coilSelectionReportObj->setCoilSupplyFanInfo( UnitVent( UnitVentNum ).CCoilName , UnitVent( UnitVentNum ).CCoilTypeCh , UnitVent( UnitVentNum ).FanName, DataAirSystems::structArrayLegacyFanModels, UnitVent( UnitVentNum ).Fan_Index ); + } + } + } } void diff --git a/src/EnergyPlus/VariableSpeedCoils.cc b/src/EnergyPlus/VariableSpeedCoils.cc index f6076619ec8..a6adbadac2d 100644 --- a/src/EnergyPlus/VariableSpeedCoils.cc +++ b/src/EnergyPlus/VariableSpeedCoils.cc @@ -82,6 +82,7 @@ #include #include #include +#include namespace EnergyPlus { @@ -393,8 +394,11 @@ namespace VariableSpeedCoils { WaterVolFlowAutoSized( false ), // Used to report autosizing info for the HPWH DX coil TotalHeatingEnergy( 0.0 ), //total water heating energy TotalHeatingEnergyRate( 0.0 ), //total WH energy rate - bIsDesuperheater( false )//whether the coil is used for a desuperheater, i.e. zero all the cooling capacity and power + bIsDesuperheater( false ),//whether the coil is used for a desuperheater, i.e. zero all the cooling capacity and power //end variables for HPWH + reportCoilFinalSizes( true ), //coil report + capModFacTotal( 0.0 ) // coil report + {} @@ -473,12 +477,12 @@ namespace VariableSpeedCoils { SpeedCal = SpeedNum; } - if ( ( VarSpeedCoil( DXCoilNum ).VSCoilTypeOfNum == TypeOf_CoilVSWAHPCoolingEquationFit ) || ( VarSpeedCoil( DXCoilNum ).VSCoilTypeOfNum == Coil_CoolingAirToAirVariableSpeed ) ) { + if ( ( VarSpeedCoil( DXCoilNum ).VSCoilTypeOfNum == DataHVACGlobals::Coil_CoolingWaterToAirHPVSEquationFit ) || ( VarSpeedCoil( DXCoilNum ).VSCoilTypeOfNum == Coil_CoolingAirToAirVariableSpeed ) ) { // Cooling mode InitVarSpeedCoil( DXCoilNum, MaxONOFFCyclesperHour, HPTimeConstant, FanDelayTime, SensLoad, LatentLoad, CyclingScheme, OnOffAirFlowRatio, SpeedRatio, SpeedCal ); CalcVarSpeedCoilCooling( DXCoilNum, CyclingScheme, RuntimeFrac, SensLoad, LatentLoad, CompOp, PartLoadFrac, OnOffAirFlowRatio, SpeedRatio, SpeedCal ); UpdateVarSpeedCoil( DXCoilNum ); - } else if ( ( VarSpeedCoil( DXCoilNum ).VSCoilTypeOfNum == TypeOf_CoilVSWAHPHeatingEquationFit ) || ( VarSpeedCoil( DXCoilNum ).VSCoilTypeOfNum == Coil_HeatingAirToAirVariableSpeed ) ) { + } else if ( ( VarSpeedCoil( DXCoilNum ).VSCoilTypeOfNum == DataHVACGlobals::Coil_HeatingWaterToAirHPVSEquationFit ) || ( VarSpeedCoil( DXCoilNum ).VSCoilTypeOfNum == Coil_HeatingAirToAirVariableSpeed ) ) { // Heating mode InitVarSpeedCoil( DXCoilNum, MaxONOFFCyclesperHour, HPTimeConstant, FanDelayTime, SensLoad, LatentLoad, CyclingScheme, OnOffAirFlowRatio, SpeedRatio, SpeedCal ); CalcVarSpeedCoilHeating( DXCoilNum, CyclingScheme, RuntimeFrac, SensLoad, CompOp, PartLoadFrac, OnOffAirFlowRatio, SpeedRatio, SpeedCal ); @@ -644,7 +648,8 @@ namespace VariableSpeedCoils { VarSpeedCoil( DXCoilNum ).bIsDesuperheater = false; VarSpeedCoil( DXCoilNum ).Name = AlphArray( 1 ); VarSpeedCoil( DXCoilNum ).CoolHeatType = "COOLING"; - VarSpeedCoil( DXCoilNum ).VSCoilTypeOfNum = TypeOf_CoilVSWAHPCoolingEquationFit; + VarSpeedCoil( DXCoilNum ).VSCoilTypeOfNum = DataHVACGlobals::Coil_CoolingWaterToAirHPVSEquationFit; + VarSpeedCoil( DXCoilNum ).VarSpeedCoilType = DataHVACGlobals::cAllCoilTypes( VarSpeedCoil( DXCoilNum ).VSCoilTypeOfNum ); VarSpeedCoil( DXCoilNum ).NumOfSpeeds = int( NumArray( 1 ) ); VarSpeedCoil( DXCoilNum ).NormSpedLevel = int( NumArray( 2 ) ); VarSpeedCoil( DXCoilNum ).RatedCapCoolTotal = NumArray( 3 ); @@ -1024,6 +1029,7 @@ namespace VariableSpeedCoils { DataHeatBalance::HeatReclaimVS_DXCoil( DXCoilNum ).SourceType = CurrentModuleObject; VarSpeedCoil( DXCoilNum ).CoolHeatType = "COOLING"; VarSpeedCoil( DXCoilNum ).VSCoilTypeOfNum = Coil_CoolingAirToAirVariableSpeed; + VarSpeedCoil( DXCoilNum ).VarSpeedCoilType = DataHVACGlobals::cAllCoilTypes( Coil_CoolingAirToAirVariableSpeed ); VarSpeedCoil( DXCoilNum ).NumOfSpeeds = int( NumArray( 1 ) ); VarSpeedCoil( DXCoilNum ).NormSpedLevel = int( NumArray( 2 ) ); VarSpeedCoil( DXCoilNum ).RatedCapCoolTotal = NumArray( 3 ); @@ -1376,7 +1382,9 @@ namespace VariableSpeedCoils { VarSpeedCoil( DXCoilNum ).bIsDesuperheater = false; VarSpeedCoil( DXCoilNum ).Name = AlphArray( 1 ); VarSpeedCoil( DXCoilNum ).CoolHeatType = "HEATING"; - VarSpeedCoil( DXCoilNum ).VSCoilTypeOfNum = TypeOf_CoilVSWAHPHeatingEquationFit; + VarSpeedCoil( DXCoilNum ).VSCoilTypeOfNum = Coil_HeatingWaterToAirHPVSEquationFit; // fix coil type + + VarSpeedCoil( DXCoilNum ).VarSpeedCoilType = DataHVACGlobals::cAllCoilTypes( VarSpeedCoil( DXCoilNum ).VSCoilTypeOfNum ); VarSpeedCoil( DXCoilNum ).NumOfSpeeds = int( NumArray( 1 ) ); VarSpeedCoil( DXCoilNum ).NormSpedLevel = int( NumArray( 2 ) ); VarSpeedCoil( DXCoilNum ).RatedCapHeat = NumArray( 3 ); @@ -1733,6 +1741,7 @@ namespace VariableSpeedCoils { VarSpeedCoil( DXCoilNum ).Name = AlphArray( 1 ); VarSpeedCoil( DXCoilNum ).CoolHeatType = "HEATING"; VarSpeedCoil( DXCoilNum ).VSCoilTypeOfNum = Coil_HeatingAirToAirVariableSpeed; + VarSpeedCoil( DXCoilNum ).VarSpeedCoilType = DataHVACGlobals::cAllCoilTypes( Coil_HeatingAirToAirVariableSpeed ); VarSpeedCoil( DXCoilNum ).NumOfSpeeds = int( NumArray( 1 ) ); VarSpeedCoil( DXCoilNum ).NormSpedLevel = int( NumArray( 2 ) ); VarSpeedCoil( DXCoilNum ).RatedCapHeat = NumArray( 3 ); @@ -2565,7 +2574,7 @@ namespace VariableSpeedCoils { } } else { - if ( VarSpeedCoil( DXCoilNum ).VSCoilTypeOfNum == TypeOf_CoilVSWAHPCoolingEquationFit ) { + if ( VarSpeedCoil( DXCoilNum ).VSCoilTypeOfNum == Coil_CoolingWaterToAirHPVSEquationFit ) { //fix coil type // cooling WAHP coil // Setup Report variables for water source Heat Pump SetupOutputVariable( "Cooling Coil Electric Power", OutputProcessor::Unit::W, VarSpeedCoil( DXCoilNum ).Power, "System", "Average", VarSpeedCoil( DXCoilNum ).Name ); @@ -2588,7 +2597,7 @@ namespace VariableSpeedCoils { SetupOutputVariable( "Cooling Coil Upper Speed Level", OutputProcessor::Unit::None, VarSpeedCoil( DXCoilNum ).SpeedNumReport, "System", "Average", VarSpeedCoil( DXCoilNum ).Name ); SetupOutputVariable( "Cooling Coil Neighboring Speed Levels Ratio", OutputProcessor::Unit::None, VarSpeedCoil( DXCoilNum ).SpeedRatioReport, "System", "Average", VarSpeedCoil( DXCoilNum ).Name ); SetupOutputVariable( "Cooling Coil Recoverable Heat Transfer Rate", OutputProcessor::Unit::W, VarSpeedCoil( DXCoilNum ).QWasteHeat, "System", "Average", VarSpeedCoil( DXCoilNum ).Name ); - } else if ( VarSpeedCoil( DXCoilNum ).VSCoilTypeOfNum == TypeOf_CoilVSWAHPHeatingEquationFit ) { + } else if ( VarSpeedCoil( DXCoilNum ).VSCoilTypeOfNum == Coil_HeatingWaterToAirHPVSEquationFit ) { //fix coil type // heating WAHP coil // Setup Report variables for water source Heat Pump SetupOutputVariable( "Heating Coil Electric Power", OutputProcessor::Unit::W, VarSpeedCoil( DXCoilNum ).Power, "System", "Average", VarSpeedCoil( DXCoilNum ).Name ); @@ -2715,8 +2724,7 @@ namespace VariableSpeedCoils { static bool ErrorsFound( false ); // TRUE when errors found, air loop initialization error Real64 RatedVolFlowPerRatedTotCap; // Rated Air Volume Flow Rate divided by Rated Total Capacity [m3/s-W) int Mode; // Performance mode for MultiMode DX coil; Always 1 for other coil types - Real64 RatedHeatPumpIndoorAirTemp; - // Indoor dry-bulb temperature to heat pump evaporator at rated conditions [C] + Real64 RatedHeatPumpIndoorAirTemp; // Indoor dry-bulb temperature to heat pump evaporator at rated conditions [C] Real64 RatedHeatPumpIndoorHumRat; // Inlet humidity ratio to heat pump evaporator at rated conditions [kg/kg] Real64 WaterFlowScale; // water flow scaling factor match rated flow rate @@ -2750,10 +2758,17 @@ namespace VariableSpeedCoils { // water source - if ( ( VarSpeedCoil( DXCoilNum ).VSCoilTypeOfNum == TypeOf_CoilVSWAHPCoolingEquationFit ) || ( VarSpeedCoil( DXCoilNum ).VSCoilTypeOfNum == TypeOf_CoilVSWAHPHeatingEquationFit ) ) { + if ( ( VarSpeedCoil( DXCoilNum ).VSCoilTypeOfNum == DataHVACGlobals::Coil_CoolingWaterToAirHPVSEquationFit ) || ( VarSpeedCoil( DXCoilNum ).VSCoilTypeOfNum == DataHVACGlobals::Coil_HeatingWaterToAirHPVSEquationFit ) ) { //fix coil type if ( MyPlantScanFlag( DXCoilNum ) && allocated( PlantLoop ) ) { + // switch from coil type numbers in DataHVACGlobals, to coil type numbers in plant. + int plantTypeOfNum( 0 ); + if ( VarSpeedCoil( DXCoilNum ).VSCoilTypeOfNum == DataHVACGlobals::Coil_CoolingWaterToAirHPVSEquationFit ) { + plantTypeOfNum = DataPlant::TypeOf_CoilVSWAHPCoolingEquationFit; + } else if ( VarSpeedCoil( DXCoilNum ).VSCoilTypeOfNum == DataHVACGlobals::Coil_HeatingWaterToAirHPVSEquationFit ) { + plantTypeOfNum = DataPlant::TypeOf_CoilVSWAHPHeatingEquationFit; + } errFlag = false; - ScanPlantLoopsForObject( VarSpeedCoil( DXCoilNum ).Name, VarSpeedCoil( DXCoilNum ).VSCoilTypeOfNum, VarSpeedCoil( DXCoilNum ).LoopNum, VarSpeedCoil( DXCoilNum ).LoopSide, VarSpeedCoil( DXCoilNum ).BranchNum, VarSpeedCoil( DXCoilNum ).CompNum, _, _, _, _, _, errFlag ); + ScanPlantLoopsForObject( VarSpeedCoil( DXCoilNum ).Name, plantTypeOfNum, VarSpeedCoil( DXCoilNum ).LoopNum, VarSpeedCoil( DXCoilNum ).LoopSide, VarSpeedCoil( DXCoilNum ).BranchNum, VarSpeedCoil( DXCoilNum ).CompNum, _, _, _, _, _, errFlag ); if ( errFlag ) { ShowFatalError( "InitVarSpeedCoil: Program terminated for previous conditions." ); } @@ -2770,7 +2785,7 @@ namespace VariableSpeedCoils { MySizeFlag( DXCoilNum ) = false; // Multispeed Cooling - if ( ( VarSpeedCoil( DXCoilNum ).VSCoilTypeOfNum == TypeOf_CoilVSWAHPCoolingEquationFit ) || ( VarSpeedCoil( DXCoilNum ).VSCoilTypeOfNum == Coil_CoolingAirToAirVariableSpeed ) ) { + if ( ( VarSpeedCoil( DXCoilNum ).VSCoilTypeOfNum == DataHVACGlobals::Coil_CoolingWaterToAirHPVSEquationFit ) || ( VarSpeedCoil( DXCoilNum ).VSCoilTypeOfNum == Coil_CoolingAirToAirVariableSpeed ) ) { for ( Mode = 1; Mode <= VarSpeedCoil( DXCoilNum ).NumOfSpeeds; ++Mode ) { // Check for zero capacity or zero max flow rate if ( VarSpeedCoil( DXCoilNum ).MSRatedTotCap( Mode ) <= 0.0 ) { @@ -2808,10 +2823,74 @@ namespace VariableSpeedCoils { // VarSpeedCoil(DXCoilNum)%MSRatedAirMassFlowRate(Mode), & // VarSpeedCoil(DXCoilNum)%MSRatedSHR(Mode)) } + // call coil model with everthing set at rating point + VarSpeedCoil( DXCoilNum ).InletAirDBTemp = RatedInletAirTemp; + VarSpeedCoil( DXCoilNum ).InletAirHumRat = Psychrometrics::PsyWFnTdbTwbPb( RatedInletAirTemp, RatedInletWetBulbTemp, DataEnvironment::StdPressureSeaLevel ); + VarSpeedCoil( DXCoilNum ).InletAirEnthalpy = Psychrometrics::PsyHFnTdbW( RatedInletAirTemp, VarSpeedCoil( DXCoilNum ).InletAirHumRat ); + VarSpeedCoil( DXCoilNum ).InletAirPressure = DataEnvironment::StdPressureSeaLevel; + + VarSpeedCoil( DXCoilNum ).AirMassFlowRate = VarSpeedCoil( DXCoilNum ).RatedAirVolFlowRate * Psychrometrics::PsyRhoAirFnPbTdbW( DataEnvironment::StdPressureSeaLevel, RatedInletAirTemp, VarSpeedCoil( DXCoilNum ).InletAirHumRat ) ; + // store environment data fill back in after rating point calc is over + Real64 holdOutDryBulbTemp = DataEnvironment::OutDryBulbTemp; + Real64 holdOutHumRat = DataEnvironment::OutHumRat; + Real64 holdOutWetBulb = DataEnvironment::OutWetBulbTemp; + Real64 holdOutBaroPress = DataEnvironment::OutBaroPress; + Real64 ratedOutdoorAirWetBulb = 23.9; // from I/O ref. more precise value? + + DataEnvironment::OutDryBulbTemp = RatedAmbAirTemp; + DataEnvironment::OutWetBulbTemp = ratedOutdoorAirWetBulb; + DataEnvironment::OutBaroPress = DataEnvironment::StdPressureSeaLevel; // assume rating is for sea level. + DataEnvironment::OutHumRat = Psychrometrics::PsyWFnTdbTwbPb( RatedAmbAirTemp, ratedOutdoorAirWetBulb, DataEnvironment::StdPressureSeaLevel, RoutineName ); + if ( VarSpeedCoil( DXCoilNum ).CondenserInletNodeNum > 0 ) { + Node( VarSpeedCoil( DXCoilNum ).CondenserInletNodeNum ).Temp = RatedAmbAirTemp; + Node( VarSpeedCoil( DXCoilNum ).CondenserInletNodeNum ).HumRat = DataEnvironment::OutHumRat; + Node( VarSpeedCoil( DXCoilNum ).CondenserInletNodeNum ).Press = DataEnvironment::StdPressureSeaLevel; + Node( VarSpeedCoil( DXCoilNum ).CondenserInletNodeNum ).OutAirWetBulb = ratedOutdoorAirWetBulb; + } + if ( VarSpeedCoil( DXCoilNum ).VSCoilTypeOfNum == DataHVACGlobals::Coil_CoolingWaterToAirHPVSEquationFit ) { // need to set water info for WSHP + VarSpeedCoil( DXCoilNum ).WaterMassFlowRate = VarSpeedCoil( DXCoilNum ).MSRatedWaterMassFlowRate( VarSpeedCoil( DXCoilNum ).NumOfSpeeds ); + VarSpeedCoil( DXCoilNum ).InletWaterTemp = RatedInletWaterTemp; // 85 F cooling mode + Real64 CpSource = GetSpecificHeatGlycol( PlantLoop( VarSpeedCoil( DXCoilNum ).LoopNum ).FluidName, SourceSideInletTemp, PlantLoop( VarSpeedCoil( DXCoilNum ).LoopNum ).FluidIndex, RoutineName ); + VarSpeedCoil( DXCoilNum ).InletWaterEnthalpy = VarSpeedCoil( DXCoilNum ).InletWaterTemp * CpSource ; + } + + // calculate coil model at rating point + Real64 runtimeFrac( 1.0 ); + VarSpeedCoil( DXCoilNum ).DesignAirMassFlowRate = VarSpeedCoil( DXCoilNum ).MSRatedAirMassFlowRate( VarSpeedCoil( DXCoilNum ).NumOfSpeeds ); + VarSpeedCoil( DXCoilNum ).DesignAirVolFlowRate = VarSpeedCoil( DXCoilNum ).MSRatedAirVolFlowRate( VarSpeedCoil( DXCoilNum ).NumOfSpeeds ); + VarSpeedCoil( DXCoilNum ).DesignWaterMassFlowRate = VarSpeedCoil( DXCoilNum ).MSRatedWaterMassFlowRate( VarSpeedCoil( DXCoilNum ).NumOfSpeeds ); + VarSpeedCoil( DXCoilNum ).DesignWaterVolFlowRate = VarSpeedCoil( DXCoilNum ).MSRatedWaterVolFlowRate( VarSpeedCoil( DXCoilNum ).NumOfSpeeds ); + + CalcVarSpeedCoilCooling( DXCoilNum, 2.0, runtimeFrac, SensLoad, LatentLoad, 1, 1.0, 1.0, 1.0, VarSpeedCoil( DXCoilNum ).NumOfSpeeds ); + //coil outlets + Real64 RatedOutletWetBulb( 0.0 ); + RatedOutletWetBulb = Psychrometrics::PsyTwbFnTdbWPb( VarSpeedCoil( DXCoilNum ).OutletAirDBTemp, VarSpeedCoil( DXCoilNum ).OutletAirHumRat, DataEnvironment::StdPressureSeaLevel, RoutineName ); + coilSelectionReportObj->setRatedCoilConditions( + VarSpeedCoil( DXCoilNum ).Name, + VarSpeedCoil( DXCoilNum ).VarSpeedCoilType, + VarSpeedCoil( DXCoilNum ).QLoadTotal, // this is the report variable + VarSpeedCoil( DXCoilNum ).QSensible, // this is the report variable + VarSpeedCoil( DXCoilNum ).AirMassFlowRate, + VarSpeedCoil( DXCoilNum ).InletAirDBTemp, + VarSpeedCoil( DXCoilNum ).InletAirHumRat, + RatedInletWetBulbTemp, + VarSpeedCoil( DXCoilNum ).OutletAirDBTemp , + VarSpeedCoil( DXCoilNum ).OutletAirHumRat , + RatedOutletWetBulb, + RatedAmbAirTemp, + ratedOutdoorAirWetBulb, + VarSpeedCoil( DXCoilNum ).MSRatedCBF( VarSpeedCoil( DXCoilNum ).NumOfSpeeds ), + -999.0 ); // coil effectiveness not define for DX + + // now replace the outdoor air conditions set above for one time rating point calc + DataEnvironment::OutDryBulbTemp = holdOutDryBulbTemp; + DataEnvironment::OutHumRat = holdOutHumRat; + DataEnvironment::OutWetBulbTemp = holdOutWetBulb; + DataEnvironment::OutBaroPress = holdOutBaroPress; } // Multispeed Heating - if ( ( VarSpeedCoil( DXCoilNum ).VSCoilTypeOfNum == TypeOf_CoilVSWAHPHeatingEquationFit ) || ( VarSpeedCoil( DXCoilNum ).VSCoilTypeOfNum == Coil_HeatingAirToAirVariableSpeed ) ) { + if ( ( VarSpeedCoil( DXCoilNum ).VSCoilTypeOfNum == DataHVACGlobals::Coil_HeatingWaterToAirHPVSEquationFit ) || ( VarSpeedCoil( DXCoilNum ).VSCoilTypeOfNum == Coil_HeatingAirToAirVariableSpeed ) ) { RatedHeatPumpIndoorAirTemp = 21.11; // 21.11C or 70F RatedHeatPumpIndoorHumRat = 0.00881; // Humidity ratio corresponding to 70F dry bulb/60F wet bulb for ( Mode = 1; Mode <= VarSpeedCoil( DXCoilNum ).NumOfSpeeds; ++Mode ) { @@ -2833,8 +2912,92 @@ namespace VariableSpeedCoils { // Manual for valid range.') // END IF } - } + // call coil model with everthing set at rating point + VarSpeedCoil( DXCoilNum ).InletAirDBTemp = RatedInletAirTempHeat; + VarSpeedCoil( DXCoilNum ).InletAirHumRat = Psychrometrics::PsyWFnTdbTwbPb( RatedInletAirTempHeat, RatedInletWetBulbTemp, DataEnvironment::StdPressureSeaLevel ); + VarSpeedCoil( DXCoilNum ).InletAirEnthalpy = Psychrometrics::PsyHFnTdbW( RatedInletAirTempHeat, VarSpeedCoil( DXCoilNum ).InletAirHumRat ); + VarSpeedCoil( DXCoilNum ).InletAirPressure = DataEnvironment::StdPressureSeaLevel; + + VarSpeedCoil( DXCoilNum ).AirMassFlowRate = VarSpeedCoil( DXCoilNum ).RatedAirVolFlowRate * Psychrometrics::PsyRhoAirFnPbTdbW( DataEnvironment::StdPressureSeaLevel, RatedInletAirTempHeat, VarSpeedCoil( DXCoilNum ).InletAirHumRat ) ; + // store environment data fill back in after rating point calc is over + Real64 holdOutDryBulbTemp = DataEnvironment::OutDryBulbTemp; + Real64 holdOutHumRat = DataEnvironment::OutHumRat; + Real64 holdOutWetBulb = DataEnvironment::OutWetBulbTemp; + Real64 holdOutBaroPress = DataEnvironment::OutBaroPress; + + DataEnvironment::OutDryBulbTemp = RatedAmbAirTempHeat; + DataEnvironment::OutWetBulbTemp = RatedAmbAirWBHeat; + DataEnvironment::OutBaroPress = DataEnvironment::StdPressureSeaLevel; // assume rating is for sea level. + DataEnvironment::OutHumRat = Psychrometrics::PsyWFnTdbTwbPb( RatedAmbAirTempHeat, RatedAmbAirWBHeat, DataEnvironment::StdPressureSeaLevel, RoutineName ); + if ( VarSpeedCoil( DXCoilNum ).CondenserInletNodeNum > 0 ) { + Node( VarSpeedCoil( DXCoilNum ).CondenserInletNodeNum ).Temp = RatedAmbAirTempHeat; + Node( VarSpeedCoil( DXCoilNum ).CondenserInletNodeNum ).HumRat = DataEnvironment::OutHumRat; + Node( VarSpeedCoil( DXCoilNum ).CondenserInletNodeNum ).Press = DataEnvironment::StdPressureSeaLevel; + Node( VarSpeedCoil( DXCoilNum ).CondenserInletNodeNum ).OutAirWetBulb = RatedAmbAirWBHeat; + } + + if ( VarSpeedCoil( DXCoilNum ).VSCoilTypeOfNum == DataHVACGlobals::Coil_HeatingWaterToAirHPVSEquationFit ) { // need to set water info for WSHP + VarSpeedCoil( DXCoilNum ).WaterMassFlowRate = VarSpeedCoil( DXCoilNum ).MSRatedWaterMassFlowRate( VarSpeedCoil( DXCoilNum ).NumOfSpeeds ); + VarSpeedCoil( DXCoilNum ).InletWaterTemp = RatedInletWaterTempHeat; // 21.11C or 70F, heating mode + Real64 CpSource = GetSpecificHeatGlycol( PlantLoop( VarSpeedCoil( DXCoilNum ).LoopNum ).FluidName, SourceSideInletTemp, PlantLoop( VarSpeedCoil( DXCoilNum ).LoopNum ).FluidIndex, RoutineName ); + VarSpeedCoil( DXCoilNum ).InletWaterEnthalpy = VarSpeedCoil( DXCoilNum ).InletWaterTemp * CpSource ; + } + + // calculate coil model at rating point + Real64 runtimeFrac( 1.0 ); + VarSpeedCoil( DXCoilNum ).DesignAirMassFlowRate = VarSpeedCoil( DXCoilNum ).MSRatedAirMassFlowRate( VarSpeedCoil( DXCoilNum ).NumOfSpeeds ); + VarSpeedCoil( DXCoilNum ).DesignAirVolFlowRate = VarSpeedCoil( DXCoilNum ).MSRatedAirVolFlowRate( VarSpeedCoil( DXCoilNum ).NumOfSpeeds ); + VarSpeedCoil( DXCoilNum ).DesignWaterMassFlowRate = VarSpeedCoil( DXCoilNum ).MSRatedWaterMassFlowRate( VarSpeedCoil( DXCoilNum ).NumOfSpeeds ); + VarSpeedCoil( DXCoilNum ).DesignWaterVolFlowRate = VarSpeedCoil( DXCoilNum ).MSRatedWaterVolFlowRate( VarSpeedCoil( DXCoilNum ).NumOfSpeeds ); + CalcVarSpeedCoilHeating( DXCoilNum, 2.0, runtimeFrac, SensLoad, 1, 1.0, 1.0, 1.0, VarSpeedCoil( DXCoilNum ).NumOfSpeeds ); + //coil outlets + Real64 RatedOutletWetBulb( 0.0 ); + RatedOutletWetBulb = Psychrometrics::PsyTwbFnTdbWPb( VarSpeedCoil( DXCoilNum ).OutletAirDBTemp, VarSpeedCoil( DXCoilNum ).OutletAirHumRat, DataEnvironment::StdPressureSeaLevel, RoutineName ); + coilSelectionReportObj->setRatedCoilConditions( + VarSpeedCoil( DXCoilNum ).Name, + VarSpeedCoil( DXCoilNum ).VarSpeedCoilType, + VarSpeedCoil( DXCoilNum ).QLoadTotal, // this is the report variable + VarSpeedCoil( DXCoilNum ).QSensible, // this is the report variable + VarSpeedCoil( DXCoilNum ).AirMassFlowRate, + VarSpeedCoil( DXCoilNum ).InletAirDBTemp, + VarSpeedCoil( DXCoilNum ).InletAirHumRat, + RatedInletWetBulbTemp, + VarSpeedCoil( DXCoilNum ).OutletAirDBTemp , + VarSpeedCoil( DXCoilNum ).OutletAirHumRat , + RatedOutletWetBulb, + RatedAmbAirTempHeat, + RatedAmbAirWBHeat, + VarSpeedCoil( DXCoilNum ).MSRatedCBF( VarSpeedCoil( DXCoilNum ).NumOfSpeeds ), + -999.0 ); // coil effectiveness not define for DX + + // now replace the outdoor air conditions set above for one time rating point calc + DataEnvironment::OutDryBulbTemp = holdOutDryBulbTemp; + DataEnvironment::OutHumRat = holdOutHumRat; + DataEnvironment::OutWetBulbTemp = holdOutWetBulb; + DataEnvironment::OutBaroPress = holdOutBaroPress; + } + + // store fan info for coil + if ( VarSpeedCoil( DXCoilNum ).SupplyFan_TypeNum == DataHVACGlobals::FanType_SystemModelObject ) { + if ( VarSpeedCoil( DXCoilNum ).SupplyFanIndex > -1 ) { + coilSelectionReportObj->setCoilSupplyFanInfo( + VarSpeedCoil( DXCoilNum ).Name, + VarSpeedCoil( DXCoilNum ).VarSpeedCoilType, + VarSpeedCoil( DXCoilNum ).SupplyFanName, + DataAirSystems::objectVectorOOFanSystemModel, + VarSpeedCoil( DXCoilNum ).SupplyFanIndex ); + } + } else { + if ( VarSpeedCoil( DXCoilNum ).SupplyFanIndex > 0 ) { + coilSelectionReportObj->setCoilSupplyFanInfo( + VarSpeedCoil( DXCoilNum ).Name, + VarSpeedCoil( DXCoilNum ).VarSpeedCoilType, + VarSpeedCoil( DXCoilNum ).SupplyFanName, + DataAirSystems::structArrayLegacyFanModels, + VarSpeedCoil( DXCoilNum ).SupplyFanIndex ); + } + } } if ( SpeedNum > VarSpeedCoil( DXCoilNum ).NumOfSpeeds ) { @@ -2893,7 +3056,7 @@ namespace VariableSpeedCoils { VarSpeedCoil( DXCoilNum ).HPTimeConstant = HPTimeConstant; VarSpeedCoil( DXCoilNum ).FanDelayTime = FanDelayTime; - if ( ( VarSpeedCoil( DXCoilNum ).VSCoilTypeOfNum == TypeOf_CoilVSWAHPHeatingEquationFit ) || ( VarSpeedCoil( DXCoilNum ).VSCoilTypeOfNum == TypeOf_CoilVSWAHPCoolingEquationFit ) ) { + if ( ( VarSpeedCoil( DXCoilNum ).VSCoilTypeOfNum == Coil_HeatingWaterToAirHPVSEquationFit ) || ( VarSpeedCoil( DXCoilNum ).VSCoilTypeOfNum == Coil_CoolingWaterToAirHPVSEquationFit ) ) { WaterInletNode = VarSpeedCoil( DXCoilNum ).WaterInletNodeNum; rho = GetDensityGlycol( PlantLoop( VarSpeedCoil( DXCoilNum ).LoopNum ).FluidName, CWInitConvTemp, PlantLoop( VarSpeedCoil( DXCoilNum ).LoopNum ).FluidIndex, RoutineNameSimpleWatertoAirHP ); @@ -2964,7 +3127,7 @@ namespace VariableSpeedCoils { VarSpeedCoil( DXCoilNum ).AirMassFlowRate = 0.0; } - if ( ( VarSpeedCoil( DXCoilNum ).VSCoilTypeOfNum == TypeOf_CoilVSWAHPHeatingEquationFit ) || ( VarSpeedCoil( DXCoilNum ).VSCoilTypeOfNum == TypeOf_CoilVSWAHPCoolingEquationFit ) ) { + if ( ( VarSpeedCoil( DXCoilNum ).VSCoilTypeOfNum == Coil_HeatingWaterToAirHPVSEquationFit ) || ( VarSpeedCoil( DXCoilNum ).VSCoilTypeOfNum == Coil_CoolingWaterToAirHPVSEquationFit ) ) { SetComponentFlowRate( VarSpeedCoil( DXCoilNum ).WaterMassFlowRate, VarSpeedCoil( DXCoilNum ).WaterInletNodeNum, VarSpeedCoil( DXCoilNum ).WaterOutletNodeNum, VarSpeedCoil( DXCoilNum ).LoopNum, VarSpeedCoil( DXCoilNum ).LoopSide, VarSpeedCoil( DXCoilNum ).BranchNum, VarSpeedCoil( DXCoilNum ).CompNum ); VarSpeedCoil( DXCoilNum ).InletWaterTemp = Node( WaterInletNode ).Temp; @@ -3187,7 +3350,7 @@ namespace VariableSpeedCoils { DefrostCapacityDes = 0.0; DefrostCapacityUser = 0.0; - if ( VarSpeedCoil( DXCoilNum ).VSCoilTypeOfNum == TypeOf_CoilVSWAHPCoolingEquationFit || VarSpeedCoil( DXCoilNum ).VSCoilTypeOfNum == TypeOf_CoilVSWAHPHeatingEquationFit ) { + if ( VarSpeedCoil( DXCoilNum ).VSCoilTypeOfNum == DataHVACGlobals::Coil_CoolingWaterToAirHPVSEquationFit || VarSpeedCoil( DXCoilNum ).VSCoilTypeOfNum == DataHVACGlobals::Coil_HeatingWaterToAirHPVSEquationFit ) { CurrentObjSubfix = ":WATERTOAIRHEATPUMP:VARIABLESPEEDEQUATIONFIT"; } else if ( VarSpeedCoil( DXCoilNum ).VSCoilTypeOfNum == CoilDX_HeatPumpWaterHeaterVariableSpeed ) { CurrentObjSubfix = ":WATERHEATING:AIRTOWATERHEATPUMP:VARIABLESPEED"; @@ -3202,6 +3365,7 @@ namespace VariableSpeedCoils { VarSpeedCoil( DXCoilNum ).MSRatedTotCap( NormSpeed );//0.00005035; VarSpeedCoil( DXCoilNum ).AirVolFlowAutoSized = true; } + coilSelectionReportObj->setCoilAirFlow( VarSpeedCoil( DXCoilNum ).Name, VarSpeedCoil( DXCoilNum ).VarSpeedCoilType, VarSpeedCoil( DXCoilNum ).RatedAirVolFlowRate, VarSpeedCoil( DXCoilNum ).AirVolFlowAutoSized ); if ( VarSpeedCoil( DXCoilNum ).RatedWaterVolFlowRate == AutoCalculate ) { VarSpeedCoil( DXCoilNum ).RatedHPWHCondWaterFlow = VarSpeedCoil( DXCoilNum ).RatedCapWH * @@ -3211,6 +3375,7 @@ namespace VariableSpeedCoils { VarSpeedCoil( DXCoilNum ).RatedHPWHCondWaterFlow; VarSpeedCoil( DXCoilNum ).WaterVolFlowAutoSized = true; } + coilSelectionReportObj->setCoilWaterFlow( VarSpeedCoil( DXCoilNum ).Name, VarSpeedCoil( DXCoilNum ).VarSpeedCoilType, VarSpeedCoil( DXCoilNum ).RatedWaterVolFlowRate,VarSpeedCoil( DXCoilNum ).WaterVolFlowAutoSized, -999 , VarSpeedCoil( DXCoilNum ).LoopNum ); } if ( VarSpeedCoil( DXCoilNum ).RatedAirVolFlowRate == AutoSize ) { @@ -3410,6 +3575,15 @@ namespace VariableSpeedCoils { } } } + + coilSelectionReportObj->setCoilEntAirTemp( VarSpeedCoil( DXCoilNum ).Name, VarSpeedCoil( DXCoilNum ).VarSpeedCoilType, MixTemp, CurSysNum, CurZoneEqNum ); + coilSelectionReportObj->setCoilEntAirHumRat( VarSpeedCoil( DXCoilNum ).Name, VarSpeedCoil( DXCoilNum ).VarSpeedCoilType, MixHumRat ); + coilSelectionReportObj->setCoilLvgAirTemp( VarSpeedCoil( DXCoilNum ).Name, VarSpeedCoil( DXCoilNum ).VarSpeedCoilType, SupTemp ); + coilSelectionReportObj->setCoilLvgAirHumRat( VarSpeedCoil( DXCoilNum ).Name, VarSpeedCoil( DXCoilNum ).VarSpeedCoilType, SupHumRat ); + coilSelectionReportObj->setCoilCoolingCapacity( VarSpeedCoil( DXCoilNum ).Name, VarSpeedCoil( DXCoilNum ).VarSpeedCoilType, RatedCapCoolTotalDes, RatedCapCoolTotalAutoSized, CurSysNum, CurZoneEqNum, CurOASysNum, + 0.0, // no fan load included in sizing + TotCapTempModFac, + -999.0, -999.0 ); // VS model doesn't limit, double check } // Set the global DX cooling coil capacity variable for use by other objects @@ -3442,6 +3616,7 @@ namespace VariableSpeedCoils { if ( RatedCapHeatDes < SmallLoad ) { RatedCapHeatDes = 0.0; } + coilSelectionReportObj->setCoilHeatingCapacity( VarSpeedCoil( DXCoilNum ).Name, VarSpeedCoil( DXCoilNum ).VarSpeedCoilType,RatedCapHeatDes, RatedCapHeatAutoSized, CurSysNum, CurZoneEqNum, CurOASysNum, 0.0, 1.0, -999.0,-999.0 ); } if ( RatedCapHeatAutoSized ) { VarSpeedCoil( DXCoilNum ).RatedCapHeat = RatedCapHeatDes; @@ -3498,6 +3673,8 @@ namespace VariableSpeedCoils { } } } + coilSelectionReportObj->setCoilAirFlow( VarSpeedCoil( DXCoilNum ).Name, VarSpeedCoil( DXCoilNum ).VarSpeedCoilType, RatedAirVolFlowRateDes, RatedAirFlowAutoSized ); + } // Check that heat pump heating capacity is within 20% of cooling capacity. Check only for heating coil and report both. @@ -3596,7 +3773,7 @@ namespace VariableSpeedCoils { } // Size water volumetric flow rate - if ( ( VarSpeedCoil( DXCoilNum ).RatedWaterVolFlowRate == AutoSize ) && ( VarSpeedCoil( DXCoilNum ).VSCoilTypeOfNum == TypeOf_CoilVSWAHPCoolingEquationFit || VarSpeedCoil( DXCoilNum ).VSCoilTypeOfNum == TypeOf_CoilVSWAHPHeatingEquationFit ) ) { + if ( ( VarSpeedCoil( DXCoilNum ).RatedWaterVolFlowRate == AutoSize ) && ( VarSpeedCoil( DXCoilNum ).VSCoilTypeOfNum == Coil_CoolingWaterToAirHPVSEquationFit || VarSpeedCoil( DXCoilNum ).VSCoilTypeOfNum == Coil_HeatingWaterToAirHPVSEquationFit ) ) { RatedWaterFlowAutoSized = true; } @@ -3627,6 +3804,7 @@ namespace VariableSpeedCoils { // TRIM(CurrentObjSubfix), & // VarSpeedCoil(DXCoilNum)%Name, & // 'Rated Water Flow Rate [m3/s]', VarSpeedCoil(DXCoilNum)%RatedWaterVolFlowRate) + coilSelectionReportObj->setCoilLvgWaterTemp(VarSpeedCoil( DXCoilNum ).Name, VarSpeedCoil( DXCoilNum ).VarSpeedCoilType, PlantSizData( PltSizNum ).ExitTemp + PlantSizData( PltSizNum ).DeltaT ); //TRACE 3D Plus coil selection report } else if ( VarSpeedCoil( DXCoilNum ).CoolHeatType == "COOLING" ) { @@ -3643,7 +3821,13 @@ namespace VariableSpeedCoils { // //TRIM(CurrentObjSubfix), & // VarSpeedCoil(DXCoilNum)%Name, & // 'Rated Water Flow Rate [m3/s]', VarSpeedCoil(DXCoilNum)%RatedWaterVolFlowRate) + coilSelectionReportObj->setCoilLvgWaterTemp(VarSpeedCoil( DXCoilNum ).Name, VarSpeedCoil( DXCoilNum ).VarSpeedCoilType, PlantSizData( PltSizNum ).ExitTemp - PlantSizData( PltSizNum ).DeltaT ); //TRACE 3D Plus coil selection report } + + + coilSelectionReportObj->setCoilEntWaterTemp( VarSpeedCoil( DXCoilNum ).Name, VarSpeedCoil( DXCoilNum ).VarSpeedCoilType , PlantSizData( PltSizNum ).ExitTemp ); //TRACE 3D Plus coil selection report + + coilSelectionReportObj->setCoilWaterDeltaT( VarSpeedCoil( DXCoilNum ).Name, VarSpeedCoil( DXCoilNum ).VarSpeedCoilType, PlantSizData( PltSizNum ).DeltaT ); //TRACE 3D Plus coil selection report } else { ShowSevereError( "Autosizing of water flow requires a loop Sizing:Plant object" ); ShowContinueError( "Autosizing also requires physical connection to a plant or condenser loop." ); @@ -3660,6 +3844,7 @@ namespace VariableSpeedCoils { } else if ( RatedCapHeatAutoSized ) { RatedWaterVolFlowRateDes = VarSpeedCoil( DXCoilNum ).RatedCapHeat * VarSpeedCoil( DXCoilNum ).MSRatedWaterVolFlowPerRatedTotCap( NormSpeed ); } + coilSelectionReportObj->setCoilWaterFlow( VarSpeedCoil( DXCoilNum ).Name, VarSpeedCoil( DXCoilNum ).VarSpeedCoilType, RatedWaterVolFlowRateDes, RatedWaterFlowAutoSized, PltSizNum, VarSpeedCoil( DXCoilNum ).LoopNum ); VarSpeedCoil( DXCoilNum ).RatedWaterVolFlowRate = RatedWaterVolFlowRateDes; ReportSizingOutput( "COIL:" + VarSpeedCoil( DXCoilNum ).CoolHeatType + CurrentObjSubfix, VarSpeedCoil( DXCoilNum ).Name, "Design Size Rated Water Flow Rate [m3/s]", RatedWaterVolFlowRateDes ); // Ensure water flow rate at lower speed must be lower or @@ -3698,13 +3883,13 @@ namespace VariableSpeedCoils { RegisterPlantCompDesignFlow( VarSpeedCoil( DXCoilNum ).WaterInletNodeNum, 0.5 * VarSpeedCoil( DXCoilNum ).RatedWaterVolFlowRate ); } - if ( VarSpeedCoil( DXCoilNum ).VSCoilTypeOfNum == TypeOf_CoilVSWAHPCoolingEquationFit || VarSpeedCoil( DXCoilNum ).VSCoilTypeOfNum == TypeOf_CoilVSWAHPHeatingEquationFit ) { + if ( VarSpeedCoil( DXCoilNum ).VSCoilTypeOfNum == Coil_CoolingWaterToAirHPVSEquationFit || VarSpeedCoil( DXCoilNum ).VSCoilTypeOfNum == Coil_HeatingWaterToAirHPVSEquationFit ) { RatedSourceTempCool = RatedInletWaterTemp; if ( PltSizNum > 0 ) { rhoW = rho; - } else if ( VarSpeedCoil( DXCoilNum ).VSCoilTypeOfNum == TypeOf_CoilVSWAHPCoolingEquationFit ) { + } else if ( VarSpeedCoil( DXCoilNum ).VSCoilTypeOfNum == Coil_CoolingWaterToAirHPVSEquationFit ) { rhoW = GetDensityGlycol( PlantLoop( VarSpeedCoil( DXCoilNum ).LoopNum ).FluidName, RatedInletWaterTemp, PlantLoop( VarSpeedCoil( DXCoilNum ).LoopNum ).FluidIndex, RoutineName ); } else { rhoW = GetDensityGlycol( PlantLoop( VarSpeedCoil( DXCoilNum ).LoopNum ).FluidName, RatedInletWaterTempHeat, PlantLoop( VarSpeedCoil( DXCoilNum ).LoopNum ).FluidIndex, RoutineName ); @@ -3832,7 +4017,7 @@ namespace VariableSpeedCoils { WaterMassFlowRatio = 1.0; } - CalcTotCapSHR_VSWSHP( RatedInletAirTemp, RatedInletAirHumRat, RatedInletEnth, RatedInletWetBulbTemp, AirMassFlowRatio, WaterMassFlowRatio, RatedAirMassFlowRate, CBFRated, VarSpeedCoil( DXCoilNum ).MSRatedTotCap( NormSpeed ), VarSpeedCoil( DXCoilNum ).MSCCapFTemp( NormSpeed ), VarSpeedCoil( DXCoilNum ).MSCCapAirFFlow( NormSpeed ), VarSpeedCoil( DXCoilNum ).MSCCapWaterFFlow( NormSpeed ), 0.0, 0, 0, 0, QLoadTotal1, QLoadTotal2, QLoadTotal, SHR, RatedSourceTempCool, StdBaroPress, 0.0, 1 ); + CalcTotCapSHR_VSWSHP( RatedInletAirTemp, RatedInletAirHumRat, RatedInletEnth, RatedInletWetBulbTemp, AirMassFlowRatio, WaterMassFlowRatio, RatedAirMassFlowRate, CBFRated, VarSpeedCoil( DXCoilNum ).MSRatedTotCap( NormSpeed ), VarSpeedCoil( DXCoilNum ).MSCCapFTemp( NormSpeed ), VarSpeedCoil( DXCoilNum ).MSCCapAirFFlow( NormSpeed ), VarSpeedCoil( DXCoilNum ).MSCCapWaterFFlow( NormSpeed ), 0.0, 0, 0, 0, QLoadTotal1, QLoadTotal2, QLoadTotal, SHR, RatedSourceTempCool, StdBaroPress, 0.0, 1, VarSpeedCoil( DXCoilNum ).capModFacTotal ); RatedCapCoolSensDes = VarSpeedCoil( DXCoilNum ).RatedCapCoolTotal * SHR; } else if ( VarSpeedCoil( DXCoilNum ).RatedAirVolFlowRate >= SmallAirVolFlow && @@ -4315,7 +4500,7 @@ namespace VariableSpeedCoils { if ( CBFSpeed > 0.999 ) CBFSpeed = 0.999; - CalcTotCapSHR_VSWSHP( LoadSideInletDBTemp, LoadSideInletHumRat, LoadSideInletEnth, LoadSideInletWBTemp, AirMassFlowRatio, WaterMassFlowRatio, LoadSideMassFlowRate, CBFSpeed, VarSpeedCoil( DXCoilNum ).MSRatedTotCap( SpeedCal ), VarSpeedCoil( DXCoilNum ).MSCCapFTemp( SpeedCal ), VarSpeedCoil( DXCoilNum ).MSCCapAirFFlow( SpeedCal ), VarSpeedCoil( DXCoilNum ).MSCCapWaterFFlow( SpeedCal ), 0.0, 0, 0, 0, QLoadTotal1, QLoadTotal2, QLoadTotal, SHR, SourceSideInletTemp, VarSpeedCoil( DXCoilNum ).InletAirPressure, 0.0, 1 ); + CalcTotCapSHR_VSWSHP( LoadSideInletDBTemp, LoadSideInletHumRat, LoadSideInletEnth, LoadSideInletWBTemp, AirMassFlowRatio, WaterMassFlowRatio, LoadSideMassFlowRate, CBFSpeed, VarSpeedCoil( DXCoilNum ).MSRatedTotCap( SpeedCal ), VarSpeedCoil( DXCoilNum ).MSCCapFTemp( SpeedCal ), VarSpeedCoil( DXCoilNum ).MSCCapAirFFlow( SpeedCal ), VarSpeedCoil( DXCoilNum ).MSCCapWaterFFlow( SpeedCal ), 0.0, 0, 0, 0, QLoadTotal1, QLoadTotal2, QLoadTotal, SHR, SourceSideInletTemp, VarSpeedCoil( DXCoilNum ).InletAirPressure, 0.0, 1,VarSpeedCoil( DXCoilNum ).capModFacTotal ); Winput = QLoadTotal * EIR; @@ -4341,7 +4526,7 @@ namespace VariableSpeedCoils { if ( CBFSpeed > 0.999 ) CBFSpeed = 0.999; CalcTotCapSHR_VSWSHP( LoadSideInletDBTemp, LoadSideInletHumRat, LoadSideInletEnth, LoadSideInletWBTemp, AirMassFlowRatio, WaterMassFlowRatio, LoadSideMassFlowRate, CBFSpeed, VarSpeedCoil( DXCoilNum ).MSRatedTotCap( SpeedCal - 1 ), VarSpeedCoil( DXCoilNum ).MSCCapFTemp( SpeedCal - 1 ), VarSpeedCoil( DXCoilNum ).MSCCapAirFFlow( SpeedCal - 1 ), VarSpeedCoil( DXCoilNum ).MSCCapWaterFFlow( SpeedCal - 1 ), VarSpeedCoil( DXCoilNum ).MSRatedTotCap( SpeedCal ), VarSpeedCoil( DXCoilNum ).MSCCapFTemp( SpeedCal ), VarSpeedCoil( DXCoilNum ).MSCCapAirFFlow( SpeedCal ), - VarSpeedCoil( DXCoilNum ).MSCCapWaterFFlow( SpeedCal ), QLoadTotal1, QLoadTotal2, QLoadTotal, SHR, SourceSideInletTemp, VarSpeedCoil( DXCoilNum ).InletAirPressure, SpeedRatio, 2 ); + VarSpeedCoil( DXCoilNum ).MSCCapWaterFFlow( SpeedCal ), QLoadTotal1, QLoadTotal2, QLoadTotal, SHR, SourceSideInletTemp, VarSpeedCoil( DXCoilNum ).InletAirPressure, SpeedRatio, 2, VarSpeedCoil( DXCoilNum ).capModFacTotal ); SpeedCal = SpeedNum - 1; EIRTempModFac = CurveValue( VarSpeedCoil( DXCoilNum ).MSEIRFTemp( SpeedCal ), LoadSideInletWBTemp, SourceSideInletTemp ); @@ -5143,6 +5328,18 @@ namespace VariableSpeedCoils { VarSpeedCoil( dXCoilNum ).SupplyFanIndex = fanIndex; } + void + setVarSpeedFanInfo( + int const dXCoilNum, + std::string const fanName, + int const fanIndex, + int const fanTypeNum + ){ + VarSpeedCoil( dXCoilNum ).SupplyFanIndex = fanIndex; + VarSpeedCoil( dXCoilNum ).SupplyFan_TypeNum = fanTypeNum; + VarSpeedCoil( dXCoilNum ).SupplyFanName = fanName; + } + void CalcVarSpeedCoilHeating( int const DXCoilNum, // Heat Pump Number @@ -5346,6 +5543,7 @@ namespace VariableSpeedCoils { } QLoadTotal = VarSpeedCoil( DXCoilNum ).MSRatedTotCap( SpeedCal ) * TotCapTempModFac * TotCapAirFFModFac * TotCapWaterFFModFac; + VarSpeedCoil( DXCoilNum ).capModFacTotal = TotCapTempModFac * TotCapAirFFModFac * TotCapWaterFFModFac; TotRatedCapacity = VarSpeedCoil( DXCoilNum ).MSRatedTotCap( SpeedCal ); // for defrosting power cal EIRTempModFac = CurveValue( VarSpeedCoil( DXCoilNum ).MSEIRFTemp( SpeedCal ), LoadSideInletDBTemp, SourceSideInletTemp ); @@ -6220,6 +6418,14 @@ namespace VariableSpeedCoils { Node( AirOutletNode ).CO2 = Node( AirInletNode ).CO2; } + if ( ! DataGlobals::WarmupFlag && ! DataGlobals::DoingHVACSizingSimulations && ! DataGlobals::DoingSizing && VarSpeedCoil( DXCoilNum ).reportCoilFinalSizes ) { + if ( VarSpeedCoil(DXCoilNum).VSCoilTypeOfNum == Coil_CoolingWaterToAirHPVSEquationFit || VarSpeedCoil(DXCoilNum).VSCoilTypeOfNum == Coil_CoolingAirToAirVariableSpeed ) { // cooling coil + coilSelectionReportObj->setCoilFinalSizes( VarSpeedCoil( DXCoilNum ).Name,VarSpeedCoil( DXCoilNum ).VarSpeedCoilType, VarSpeedCoil( DXCoilNum ).RatedCapCoolTotal, VarSpeedCoil( DXCoilNum ).RatedCapCoolSens, VarSpeedCoil( DXCoilNum ).RatedAirVolFlowRate, VarSpeedCoil( DXCoilNum ).RatedWaterMassFlowRate ); + } else if ( VarSpeedCoil(DXCoilNum).VSCoilTypeOfNum == Coil_HeatingWaterToAirHPVSEquationFit || VarSpeedCoil(DXCoilNum).VSCoilTypeOfNum == Coil_HeatingAirToAirVariableSpeed ) { // heating coil + coilSelectionReportObj->setCoilFinalSizes( VarSpeedCoil( DXCoilNum ).Name,VarSpeedCoil( DXCoilNum ).VarSpeedCoilType, VarSpeedCoil( DXCoilNum ).RatedCapHeat, VarSpeedCoil( DXCoilNum ).RatedCapHeat, VarSpeedCoil( DXCoilNum ).RatedAirVolFlowRate, VarSpeedCoil( DXCoilNum ).RatedWaterMassFlowRate ); + } + VarSpeedCoil( DXCoilNum ).reportCoilFinalSizes = false; + } } Real64 @@ -6375,7 +6581,8 @@ namespace VariableSpeedCoils { Real64 const CondInletTemp, // Condenser inlet temperature [C] Real64 const Pressure, // air pressure [Pa] Real64 const SpeedRatio, // from 0.0 to 1.0 - int const NumSpeeds // number of speeds for input + int const NumSpeeds, // number of speeds for input + Real64 & TotCapModFac // capacity modification factor, func of temp and func of flow ) { // SUBROUTINE INFORMATION: @@ -6474,6 +6681,7 @@ namespace VariableSpeedCoils { TotCapCalc = TotCapNom1 * TotCapAirFlowModFac1 * TotCapWaterFlowModFac1 * TotCapTempModFac1; TotCapCalc1 = TotCapCalc; TotCapCalc2 = 0.0; + TotCapModFac = TotCapAirFlowModFac1 * TotCapWaterFlowModFac1 * TotCapTempModFac1; } else { TotCapTempModFac2 = CurveValue( CCapFTemp2, InletWetBulbCalc, CondInletTemp ); TotCapAirFlowModFac2 = CurveValue( CCapAirFFlow2, AirMassFlowRatio ); @@ -6488,7 +6696,7 @@ namespace VariableSpeedCoils { TotCapCalc2 = TotCapNom2 * TotCapAirFlowModFac2 * TotCapWaterFlowModFac2 * TotCapTempModFac2; TotCapCalc = TotCapCalc2 * SpeedRatio + ( 1.0 - SpeedRatio ) * TotCapCalc1; - + TotCapModFac = ( TotCapAirFlowModFac2 * TotCapWaterFlowModFac2 * TotCapTempModFac2 ) * SpeedRatio + ( 1.0 - SpeedRatio ) * ( TotCapAirFlowModFac1 * TotCapWaterFlowModFac1 * TotCapTempModFac1 ); } if ( CBF < 0.001 ) { diff --git a/src/EnergyPlus/VariableSpeedCoils.hh b/src/EnergyPlus/VariableSpeedCoils.hh index 81d292cebe3..d746e137967 100644 --- a/src/EnergyPlus/VariableSpeedCoils.hh +++ b/src/EnergyPlus/VariableSpeedCoils.hh @@ -360,6 +360,8 @@ namespace VariableSpeedCoils { Real64 TotalHeatingEnergyRate;//total WH energy rate bool bIsDesuperheater;//whether the coil is used for a desuperheater, i.e. zero all the cooling capacity and power //end variables for HPWH + bool reportCoilFinalSizes; // one time report of sizes to coil selection report + Real64 capModFacTotal; // coil TotCapTempModFac * TotCapAirFFModFac * TotCapWaterFFModFac, for result for simulation peak reporting // Default Constructor VariableSpeedCoilData(); @@ -555,7 +557,8 @@ namespace VariableSpeedCoils { Real64 const CondInletTemp, // Condenser inlet temperature [C] Real64 const Pressure, // air pressure [Pa] Real64 const SpeedRatio, // from 0.0 to 1.0 - int const NumSpeeds // number of speeds for input + int const NumSpeeds, // number of speeds for input + Real64 & TotCapModFac // capacity modification factor, func of temp and func of flow ); void @@ -582,6 +585,14 @@ namespace VariableSpeedCoils { int const fanIndex ); + void + setVarSpeedFanInfo( + int const dXCoilNum, + std::string const fanName, + int const fanIndex, + int const fanTypeNum + ); + } // VariableSpeedCoils } // EnergyPlus diff --git a/src/EnergyPlus/WaterCoils.cc b/src/EnergyPlus/WaterCoils.cc index 8127783ff7a..402f969e7fe 100644 --- a/src/EnergyPlus/WaterCoils.cc +++ b/src/EnergyPlus/WaterCoils.cc @@ -85,6 +85,7 @@ #include #include #include +#include namespace EnergyPlus { @@ -938,11 +939,7 @@ namespace WaterCoils { static Real64 SurfaceArea( 0.0 ); // heat exchanger surface area, [m2] static Real64 UATotal( 0.0 ); // heat exchanger UA total, [W/C] static Array1D_bool RptCoilHeaderFlag( 2, true ); - Real64 x_a; // result of Eq.70 in Wetter 1999 - Real64 x_w; // result of Eq.72 in Wetter 1999 - Real64 AirConvectTerm; // result of Eq.71 in Wetter 1999 - Real64 WaterConvectTerm; // result of Eq.73 in Wetter 1999 - Real64 WaterConvSensitivity; // "s" in Wetter 1999, temperature sensitivity in water side convection + Real64 DesUACoilExternalEnth; // enthalpy based UAExternal for wet coil surface {kg/s} Real64 LogMeanEnthDiff; // long mean enthalpy difference {J/kg} @@ -1466,6 +1463,9 @@ namespace WaterCoils { PreDefTableEntry( pdchHeatCoilNomEff, WaterCoil( CoilNum ).Name, "-" ); addFootNoteSubTable( pdstHeatCoil, "Nominal values are gross at rated conditions, i.e., the supply air fan heat and electric power NOT accounted for." ); gio::write( OutputFileInits, fmtA ) << "Water Heating Coil Capacity Information,Coil:Heating:Water," + WaterCoil( CoilNum ).Name + ',' + RoundSigDigits( WaterCoil( CoilNum ).TotWaterHeatingCoilRate, 2 ); + bool errorsfound; + coilSelectionReportObj->setCoilAirFlow(WaterCoil( CoilNum ).Name,"Coil:Heating:Water", WaterCoil( CoilNum ).DesAirVolFlowRate,WaterCoil( CoilNum ).RequestingAutoSize ); + coilSelectionReportObj->setCoilWaterHeaterCapacity( WaterCoil( CoilNum ).Name,"Coil:Heating:Water",WaterCoil( CoilNum ).TotWaterHeatingCoilRate,WaterCoil( CoilNum ).RequestingAutoSize, MyPlantSizingIndex( "hot water coil", WaterCoil( CoilNum ).Name, WaterCoil( CoilNum ).WaterInletNodeNum, WaterCoil( CoilNum ).WaterOutletNodeNum, errorsfound ), WaterCoil ( CoilNum ).WaterLoopNum ); //coil report } else if ( SELECT_CASE_var == WaterCoil_DetFlatFinCooling ) { if ( RptCoilHeaderFlag( 2 ) ) { gio::write( OutputFileInits, fmtA ) << "! ,Component Type,Name,Nominal Total Capacity {W},Nominal Sensible Capacity {W},Nominal Latent Capacity {W},Nominal Sensible Heat Ratio"; @@ -1482,6 +1482,9 @@ namespace WaterCoils { PreDefTableEntry( pdchCoolCoilNomEff, WaterCoil( CoilNum ).Name, "-" ); addFootNoteSubTable( pdstCoolCoil, "Nominal values are gross at rated conditions, i.e., the supply air fan heat and electric power NOT accounted for." ); gio::write( OutputFileInits, fmtA ) << "Water Cooling Coil Capacity Information,Coil:Cooling:Water:DetailedGeometry," + WaterCoil( CoilNum ).Name + ',' + RoundSigDigits( WaterCoil( CoilNum ).TotWaterCoolingCoilRate, 2 ) + ',' + RoundSigDigits( WaterCoil( CoilNum ).SenWaterCoolingCoilRate, 2 ) + ',' + RoundSigDigits( RatedLatentCapacity, 2 ) + ',' + RoundSigDigits( RatedSHR, 2 ); + coilSelectionReportObj->setCoilAirFlow( WaterCoil( CoilNum ).Name,"Coil:Cooling:Water:DetailedGeometry", WaterCoil( CoilNum ).DesAirVolFlowRate,WaterCoil( CoilNum ).RequestingAutoSize ); //Coil Report + bool errorsFound; + coilSelectionReportObj->setCoilWaterCoolingCapacity( WaterCoil( CoilNum ).Name,"Coil:Cooling:Water:DetailedGeometry", WaterCoil( CoilNum ).DesWaterCoolingCoilRate, WaterCoil( CoilNum ).RequestingAutoSize, MyPlantSizingIndex( "chilled water coil", WaterCoil( CoilNum ).Name, WaterCoil( CoilNum ).WaterInletNodeNum, WaterCoil( CoilNum ).WaterOutletNodeNum, errorsFound ),WaterCoil( CoilNum ).WaterLoopNum ); //Coil Report } else if ( SELECT_CASE_var == WaterCoil_Cooling ) { if ( RptCoilHeaderFlag( 2 ) ) { gio::write( OutputFileInits, fmtA ) << "! ,Component Type,Name,Nominal Total Capacity {W},Nominal Sensible Capacity {W},Nominal Latent Capacity {W},Nominal Sensible Heat Ratio, Nominal Coil UA Value {W/C}, Nominal Coil Surface Area {m2}"; @@ -1500,9 +1503,85 @@ namespace WaterCoils { PreDefTableEntry( pdchCoolCoilArea, WaterCoil( CoilNum ).Name, WaterCoil( CoilNum ).TotCoilOutsideSurfArea ); addFootNoteSubTable( pdstCoolCoil, "Nominal values are gross at rated conditions, i.e., the supply air fan heat and electric power NOT accounted for." ); gio::write( OutputFileInits, fmtA ) << "Water Cooling Coil Capacity Information,Coil:Cooling:Water," + WaterCoil( CoilNum ).Name + ',' + RoundSigDigits( WaterCoil( CoilNum ).TotWaterCoolingCoilRate, 2 ) + ',' + RoundSigDigits( WaterCoil( CoilNum ).SenWaterCoolingCoilRate, 2 ) + ',' + RoundSigDigits( RatedLatentCapacity, 2 ) + ',' + RoundSigDigits( RatedSHR, 2 ) + ',' + RoundSigDigits( UATotal, 2 ) + ',' + RoundSigDigits( SurfaceArea, 2 ); + coilSelectionReportObj->setCoilAirFlow( WaterCoil( CoilNum ).Name,"Coil:Cooling:Water", WaterCoil( CoilNum ).DesAirVolFlowRate,WaterCoil( CoilNum ).RequestingAutoSize ); // Coil Report + bool errorsFound; + coilSelectionReportObj->setCoilWaterCoolingCapacity( WaterCoil( CoilNum ).Name,"Coil:Cooling:Water", WaterCoil( CoilNum ).DesWaterCoolingCoilRate, WaterCoil( CoilNum ).RequestingAutoSize, MyPlantSizingIndex( "chilled water coil", WaterCoil( CoilNum ).Name, WaterCoil( CoilNum ).WaterInletNodeNum, WaterCoil( CoilNum ).WaterOutletNodeNum, errorsFound ),WaterCoil ( CoilNum ).WaterLoopNum ); //Coil Report }} if ( WaterCoil( CoilNum ).DesWaterCoolingCoilRate <= 0.0 ) WaterCoil( CoilNum ).DesWaterCoolingCoilRate = WaterCoil( CoilNum ).TotWaterCoolingCoilRate; if ( WaterCoil( CoilNum ).DesWaterHeatingCoilRate <= 0.0 ) WaterCoil( CoilNum ).DesWaterHeatingCoilRate = WaterCoil( CoilNum ).TotWaterHeatingCoilRate; + + // call coil model with everthing set at rating point + WaterCoil( CoilNum ).InletAirMassFlowRate = WaterCoil( CoilNum ).DesAirMassFlowRate; + WaterCoil( CoilNum ).InletAirTemp = WaterCoil( CoilNum ).DesInletAirTemp; + WaterCoil( CoilNum ).InletAirHumRat = WaterCoil( CoilNum ).DesInletAirHumRat; // fixed in sizing routine + WaterCoil( CoilNum ).InletAirEnthalpy = Psychrometrics::PsyHFnTdbW( WaterCoil( CoilNum ).DesInletAirTemp, WaterCoil( CoilNum ).DesInletAirHumRat ); + Real64 DesInletWetBulb = Psychrometrics::PsyTwbFnTdbWPb( WaterCoil( CoilNum ).DesInletAirTemp, WaterCoil( CoilNum ).DesInletAirHumRat, DataEnvironment::StdPressureSeaLevel,"InitWaterCoils" ); + WaterCoil( CoilNum ).InletWaterMassFlowRate = WaterCoil( CoilNum ).MaxWaterMassFlowRate; + WaterCoil( CoilNum ).InletWaterTemp = WaterCoil( CoilNum ).DesInletWaterTemp; + Real64 cp = GetSpecificHeatGlycol( PlantLoop( WaterCoil( CoilNum ).WaterLoopNum ).FluidName, WaterCoil( CoilNum ).DesInletWaterTemp, PlantLoop( WaterCoil( CoilNum ).WaterLoopNum ).FluidIndex, "InitWaterCoil" ); + WaterCoil( CoilNum ).InletWaterEnthalpy = cp * WaterCoil( CoilNum ).InletWaterTemp ; + + WaterCoil( CoilNum ).UACoilVariable = WaterCoil( CoilNum ).UACoil; + WaterCoil( CoilNum ).FoulingFactor = 0.0; + Real64 holdOutBaroPress = DataEnvironment::OutBaroPress; + DataEnvironment::OutBaroPress = DataEnvironment::StdPressureSeaLevel; // assume rating is for sea level. + CalcAdjustedCoilUA( CoilNum ); + + std::string coilTypeName( " "); + // calculate coil sim model at rating point, full load, continuous fan + if ( WaterCoil( CoilNum ).WaterCoilType_Num == WaterCoil_DetFlatFinCooling ) { + CalcDetailFlatFinCoolingCoil( CoilNum, SimCalc, ContFanCycCoil, 1.0 ); + coilTypeName = "Coil:Cooling:Water:DetailedGeometry"; + } else if ( WaterCoil( CoilNum ).WaterCoilType_Num == WaterCoil_Cooling ) { + CoolingCoil( CoilNum, FirstHVACIteration, SimCalc, ContFanCycCoil, 1.0 ); + coilTypeName = "Coil:Cooling:Water"; + } else if ( WaterCoil( CoilNum ).WaterCoilType_Num == WaterCoil_SimpleHeating ) { + CalcSimpleHeatingCoil( CoilNum, ContFanCycCoil, 1.0, SimCalc ); + coilTypeName = "Coil:Heating:Water"; + } + + // coil outlets + Real64 RatedOutletWetBulb( 0.0 ); + RatedOutletWetBulb = Psychrometrics::PsyTwbFnTdbWPb( WaterCoil( CoilNum ).OutletAirTemp, WaterCoil( CoilNum ).OutletAirHumRat, DataEnvironment::StdPressureSeaLevel, "InitWaterCoil" ); + + // call set routine in coil report + if ( WaterCoil( CoilNum ).WaterCoilType_Num == WaterCoil_DetFlatFinCooling || WaterCoil( CoilNum ).WaterCoilType_Num == WaterCoil_Cooling ) { + coilSelectionReportObj->setRatedCoilConditions( + WaterCoil( CoilNum ).Name, + coilTypeName, + WaterCoil( CoilNum ).TotWaterCoolingCoilRate, // this is the report variable + WaterCoil( CoilNum ).SenWaterCoolingCoilRate, // this is the report variable + WaterCoil( CoilNum ).InletAirMassFlowRate, + WaterCoil( CoilNum ).InletAirTemp, + WaterCoil( CoilNum ).InletAirHumRat, + DesInletWetBulb, + WaterCoil( CoilNum ).OutletAirTemp , + WaterCoil( CoilNum ).OutletAirHumRat , + RatedOutletWetBulb, + -999.0, + -999.0, + -999.0, + -999.0 ); // coil effectiveness + } else if ( WaterCoil( CoilNum ).WaterCoilType_Num == WaterCoil_SimpleHeating ) { + coilSelectionReportObj->setRatedCoilConditions( + WaterCoil( CoilNum ).Name, + coilTypeName, + WaterCoil( CoilNum ).TotWaterHeatingCoilRate, // this is the report variable + WaterCoil( CoilNum ).TotWaterHeatingCoilRate, // this is the report variable + WaterCoil( CoilNum ).InletAirMassFlowRate, + WaterCoil( CoilNum ).InletAirTemp, + WaterCoil( CoilNum ).InletAirHumRat, + DesInletWetBulb, + WaterCoil( CoilNum ).OutletAirTemp , + WaterCoil( CoilNum ).OutletAirHumRat , + RatedOutletWetBulb, + -999.0, + -999.0, + -999.0, + -999.0 ); // coil effectiveness + } + // now replace the outdoor air conditions set above for one time rating point calc + DataEnvironment::OutBaroPress = holdOutBaroPress; } } @@ -1560,6 +1639,25 @@ namespace WaterCoils { } } + CalcAdjustedCoilUA( CoilNum ); + + WaterCoil( CoilNum ).TotWaterHeatingCoilRate = 0.0; + WaterCoil( CoilNum ).TotWaterCoolingCoilRate = 0.0; + WaterCoil( CoilNum ).SenWaterCoolingCoilRate = 0.0; + + } + + //refactor coilUA adjustment into separate routine, for use with rating calc + void + CalcAdjustedCoilUA( int const CoilNum ) + { + //Pull these precalc routines out of big init routine + //modify the coil UA based on model in Wetter 1999 + Real64 x_a; // result of Eq.70 in Wetter 1999 + Real64 x_w; // result of Eq.72 in Wetter 1999 + Real64 AirConvectTerm; // result of Eq.71 in Wetter 1999 + Real64 WaterConvectTerm; // result of Eq.73 in Wetter 1999 + Real64 WaterConvSensitivity; // "s" in Wetter 1999, temperature sensitivity in water side convection if ( ( WaterCoil( CoilNum ).WaterCoilType_Num == WaterCoil_SimpleHeating ) && ( ! ( MyUAAndFlowCalcFlag( CoilNum ) ) ) ) { // update Coil UA based on inlet mass flows and temps x_a = 1.0 + 4.769E-3 * ( WaterCoil( CoilNum ).InletAirTemp - WaterCoil( CoilNum ).DesInletAirTemp ); if ( WaterCoil( CoilNum ).DesAirMassFlowRate > 0.0 ) { @@ -1608,11 +1706,6 @@ namespace WaterCoils { WaterCoil( CoilNum ).UAWetExtPerUnitArea = WaterCoil( CoilNum ).UACoilExternal / WaterCoil( CoilNum ).TotCoilOutsideSurfArea; WaterCoil( CoilNum ).UADryExtPerUnitArea = WaterCoil( CoilNum ).UAWetExtPerUnitArea; } - - WaterCoil( CoilNum ).TotWaterHeatingCoilRate = 0.0; - WaterCoil( CoilNum ).TotWaterCoolingCoilRate = 0.0; - WaterCoil( CoilNum ).SenWaterCoolingCoilRate = 0.0; - } void @@ -1767,6 +1860,8 @@ namespace WaterCoils { TempSize = WaterCoil( CoilNum ).DesAirVolFlowRate; RequestSizing( CompType, CompName, CoolingAirflowSizing, SizingString, TempSize, bPRINT, RoutineName ); WaterCoil( CoilNum ).DesAirVolFlowRate = TempSize; + WaterCoil ( CoilNum ).DesAirMassFlowRate = WaterCoil ( CoilNum ).DesAirVolFlowRate * StdRhoAir; + if ( WaterCoil( CoilNum ).DesAirVolFlowRate <= 0.0 ) { WaterCoil( CoilNum ).DesAirVolFlowRate = 0.0; ShowWarningError( "The design air flow rate is zero for Coil:Cooling:Water " + WaterCoil( CoilNum ).Name ); @@ -1783,6 +1878,8 @@ namespace WaterCoils { SizingString = WaterCoilNumericFields( CoilNum ).FieldNames( FieldNum ) + " [C]"; DataFlowUsedForSizing = DataAirFlowUsedForSizing; // used by air loop coils TempSize = WaterCoil( CoilNum ).DesInletAirTemp; + TempSize = AutoSize; + RequestSizing( CompType, CompName, CoolingWaterDesAirInletTempSizing, SizingString, TempSize, bPRINT, RoutineName ); WaterCoil( CoilNum ).DesInletAirTemp = TempSize; DataDesInletAirTemp = TempSize; @@ -1797,6 +1894,7 @@ namespace WaterCoils { SizingString = WaterCoilNumericFields( CoilNum ).FieldNames( FieldNum ) + " [C]"; DataFlowUsedForSizing = DataAirFlowUsedForSizing; TempSize = WaterCoil( CoilNum ).DesInletWaterTemp; + TempSize = AutoSize; RequestSizing( CompType, CompName, CoolingWaterDesWaterInletTempSizing, SizingString, TempSize, bPRINT, RoutineName ); WaterCoil( CoilNum ).DesInletWaterTemp = TempSize; @@ -1827,6 +1925,7 @@ namespace WaterCoils { DataDesInletWaterTemp = WaterCoil( CoilNum ).DesInletWaterTemp; // used for warning messages DataDesInletAirHumRat = WaterCoil( CoilNum ).DesInletAirHumRat; TempSize = WaterCoil( CoilNum ).DesOutletAirTemp; + TempSize = AutoSize; RequestSizing( CompType, CompName, CoolingWaterDesAirOutletTempSizing, SizingString, TempSize, bPRINT, RoutineName ); WaterCoil( CoilNum ).DesOutletAirTemp = TempSize; DataDesOutletAirTemp = TempSize; @@ -1842,6 +1941,7 @@ namespace WaterCoils { SizingString = WaterCoilNumericFields( CoilNum ).FieldNames( FieldNum ); // + " [kgWater/kgDryAir]"; DataFlowUsedForSizing = DataAirFlowUsedForSizing; TempSize = WaterCoil( CoilNum ).DesInletAirHumRat; + TempSize = AutoSize; RequestSizing( CompType, CompName, CoolingWaterDesAirInletHumRatSizing, SizingString, TempSize, bPRINT, RoutineName ); WaterCoil( CoilNum ).DesInletAirHumRat = TempSize; } @@ -2105,10 +2205,12 @@ namespace WaterCoils { WaterCoil( CoilNum ).InletAirTemp = TempSize; TempSize = AutoSize; // these data are initially 0, set to autosize to receive a result from RequestSizing RequestSizing( CompType, CompName, HeatingCoilDesAirInletHumRatSizing, SizingString, TempSize, bPRINT, RoutineName ); + WaterCoil( CoilNum ).DesInletAirHumRat = TempSize; //coil report WaterCoil( CoilNum ).InletAirHumRat = TempSize; TempSize = AutoSize; // these data are initially 0, set to autosize to receive a result from RequestSizing RequestSizing( CompType, CompName, HeatingAirflowUASizing, SizingString, TempSize, bPRINT, RoutineName ); //WaterCoil( CoilNum ).InletAirMassFlowRate = TempSize; + WaterCoil( CoilNum ).DesAirVolFlowRate = DataAirFlowUsedForSizing; //coil report WaterCoil( CoilNum ).InletAirMassFlowRate = DataAirFlowUsedForSizing * StdRhoAir; // this is stiil volume flow! } else { TempSize = AutoSize; // these data are initially 0, set to autosize to receive a result from RequestSizing @@ -2116,9 +2218,11 @@ namespace WaterCoils { WaterCoil( CoilNum ).InletAirTemp = TempSize; TempSize = AutoSize; // these data are initially 0, set to autosize to receive a result from RequestSizing RequestSizing( CompType, CompName, HeatingWaterDesAirInletHumRatSizing, SizingString, TempSize, bPRINT, RoutineName ); + WaterCoil( CoilNum ).DesInletAirHumRat = TempSize; //coil report WaterCoil( CoilNum ).InletAirHumRat = TempSize; TempSize = AutoSize; // these data are initially 0, set to autosize to receive a result from RequestSizing RequestSizing( CompType, CompName, HeatingAirflowUASizing, SizingString, TempSize, bPRINT, RoutineName ); + WaterCoil( CoilNum ).DesAirMassFlowRate = TempSize; //coil report WaterCoil( CoilNum ).InletAirMassFlowRate = TempSize; } @@ -4098,6 +4202,26 @@ namespace WaterCoils { Real64 SpecHumIn; Real64 ReportingConstant; + std::string coilObjClassName; + if ( WaterCoil(CoilNum).WaterCoilType_Num == WaterCoil_SimpleHeating ) { + coilObjClassName = "Coil:Heating:Water"; + if ( ! DataGlobals::WarmupFlag && ! DataGlobals::DoingHVACSizingSimulations && ! DataGlobals::DoingSizing && WaterCoil(CoilNum).reportCoilFinalSizes ) { + coilSelectionReportObj->setCoilFinalSizes( WaterCoil(CoilNum).Name, coilObjClassName, WaterCoil(CoilNum).DesWaterHeatingCoilRate, WaterCoil(CoilNum).DesWaterHeatingCoilRate, WaterCoil(CoilNum).DesAirVolFlowRate, WaterCoil(CoilNum).MaxWaterVolFlowRate ); + WaterCoil(CoilNum).reportCoilFinalSizes = false; + } + } else if ( WaterCoil(CoilNum).WaterCoilType_Num == WaterCoil_DetFlatFinCooling ) { + coilObjClassName = "Coil:Cooling:Water:DetailedGeometry"; + if ( ! DataGlobals::WarmupFlag && ! DataGlobals::DoingHVACSizingSimulations && ! DataGlobals::DoingSizing && WaterCoil(CoilNum).reportCoilFinalSizes ) { + coilSelectionReportObj->setCoilFinalSizes( WaterCoil(CoilNum).Name, coilObjClassName, WaterCoil(CoilNum).DesWaterCoolingCoilRate, -999.0, WaterCoil(CoilNum).DesAirVolFlowRate, WaterCoil(CoilNum).MaxWaterVolFlowRate ); + WaterCoil(CoilNum).reportCoilFinalSizes = false; + } + } else if ( WaterCoil(CoilNum).WaterCoilType_Num == WaterCoil_Cooling ) { + coilObjClassName = "Coil:Cooling:Water"; + if ( ! DataGlobals::WarmupFlag && ! DataGlobals::DoingHVACSizingSimulations && ! DataGlobals::DoingSizing && WaterCoil(CoilNum).reportCoilFinalSizes ) { + coilSelectionReportObj->setCoilFinalSizes( WaterCoil(CoilNum).Name, coilObjClassName, WaterCoil(CoilNum).DesWaterCoolingCoilRate, -999.0, WaterCoil(CoilNum).DesAirVolFlowRate, WaterCoil(CoilNum).MaxWaterVolFlowRate ); + WaterCoil(CoilNum).reportCoilFinalSizes = false; + } + } ReportingConstant = TimeStepSys * SecInHour; // report the WaterCoil energy from this component WaterCoil( CoilNum ).TotWaterHeatingCoilEnergy = WaterCoil( CoilNum ).TotWaterHeatingCoilRate * ReportingConstant; diff --git a/src/EnergyPlus/WaterCoils.hh b/src/EnergyPlus/WaterCoils.hh index 3aaa66e54db..7936c482d43 100644 --- a/src/EnergyPlus/WaterCoils.hh +++ b/src/EnergyPlus/WaterCoils.hh @@ -266,6 +266,7 @@ namespace WaterCoils { bool UseDesignWaterDeltaTemp; // is true, the DesignWaterDeltaTemp is used for sizing coil design water flow rate std::string ControllerName; // controller name used by water coil int ControllerIndex; // controller index used by water coil + bool reportCoilFinalSizes; // one time report of sizes to coil summary report // Default Constructor WaterCoilEquipConditions() : @@ -380,9 +381,9 @@ namespace WaterCoils { DesignWaterDeltaTemp( 0.0 ), UseDesignWaterDeltaTemp( false ), ControllerName( "" ), - ControllerIndex( 0 ) + ControllerIndex( 0 ), + reportCoilFinalSizes( true ) {} - }; struct WaterCoilNumericFieldData @@ -432,6 +433,9 @@ namespace WaterCoils { bool const FirstHVACIteration // unused1208 ); + void // refactor for coil report + CalcAdjustedCoilUA( int const CoilNum ); //refactor for coil report + void SizeWaterCoil( int const CoilNum ); diff --git a/src/EnergyPlus/WaterToAirHeatPumpSimple.cc b/src/EnergyPlus/WaterToAirHeatPumpSimple.cc index 6f32fcfaee9..99a59b68b8b 100644 --- a/src/EnergyPlus/WaterToAirHeatPumpSimple.cc +++ b/src/EnergyPlus/WaterToAirHeatPumpSimple.cc @@ -74,6 +74,7 @@ #include #include #include +#include namespace EnergyPlus { @@ -2250,6 +2251,15 @@ namespace WaterToAirHeatPumpSimple { Node( AirOutletNode ).GenContam = Node( AirInletNode ).GenContam; } + if ( ! DataGlobals::WarmupFlag && ! DataGlobals::DoingHVACSizingSimulations && ! DataGlobals::DoingSizing && SimpleWatertoAirHP( HPNum ).reportCoilFinalSizes ) { + + if ( InputProcessor::SameString( SimpleWatertoAirHP( HPNum ).WatertoAirHPType, "COOLING" ) ) { // cooling + coilSelectionReportObj->setCoilFinalSizes( SimpleWatertoAirHP( HPNum ).Name,"Coil:" + SimpleWatertoAirHP( HPNum ).WatertoAirHPType + ":WaterToAirHeatPump:EquationFit",SimpleWatertoAirHP( HPNum ).RatedCapCoolTotal, SimpleWatertoAirHP( HPNum ).RatedCapCoolSens, SimpleWatertoAirHP( HPNum ).RatedAirVolFlowRate, SimpleWatertoAirHP( HPNum ).RatedWaterVolFlowRate ); + } else if ( InputProcessor::SameString( SimpleWatertoAirHP( HPNum ).WatertoAirHPType, "HEATING" ) ) { // heating + coilSelectionReportObj->setCoilFinalSizes( SimpleWatertoAirHP( HPNum ).Name,"Coil:" + SimpleWatertoAirHP( HPNum ).WatertoAirHPType + ":WaterToAirHeatPump:EquationFit",SimpleWatertoAirHP( HPNum ).RatedCapHeat, SimpleWatertoAirHP( HPNum ).RatedCapHeat, SimpleWatertoAirHP( HPNum ).RatedAirVolFlowRate, SimpleWatertoAirHP( HPNum ).RatedWaterVolFlowRate ); + } + } + } // End of Update subroutines for the WatertoAirHP Module diff --git a/src/EnergyPlus/WaterToAirHeatPumpSimple.hh b/src/EnergyPlus/WaterToAirHeatPumpSimple.hh index c62ba686b0c..e488fa1fe95 100644 --- a/src/EnergyPlus/WaterToAirHeatPumpSimple.hh +++ b/src/EnergyPlus/WaterToAirHeatPumpSimple.hh @@ -209,7 +209,7 @@ namespace WaterToAirHeatPumpSimple { Real64 MaxONOFFCyclesperHour; // Maximum cycling rate of heat pump [cycles/hr] Real64 HPTimeConstant; // Heat pump time constant [s] Real64 FanDelayTime; // Fan delay time, time delay for the HP's fan to - + bool reportCoilFinalSizes; //one time report of sizes to coil report // Default Constructor SimpleWatertoAirHPConditions() : WAHPPlantTypeOfNum( 0 ), @@ -294,7 +294,8 @@ namespace WaterToAirHeatPumpSimple { Gamma_Rated( 0.0 ), MaxONOFFCyclesperHour( 0.0 ), HPTimeConstant( 0.0 ), - FanDelayTime( 0.0 ) + FanDelayTime( 0.0 ), + reportCoilFinalSizes( true ) {} }; diff --git a/src/EnergyPlus/WindowAC.cc b/src/EnergyPlus/WindowAC.cc index 29d6805e217..8ac598e8ff2 100644 --- a/src/EnergyPlus/WindowAC.cc +++ b/src/EnergyPlus/WindowAC.cc @@ -77,6 +77,7 @@ #include #include #include +#include #include #include #include @@ -707,6 +708,13 @@ namespace WindowAC { } } + for ( WindACNum = 1; WindACNum <= NumWindAC; ++WindACNum ) { + if ( WindAC( WindACNum ).FanType_Num == DataHVACGlobals::FanType_SystemModelObject ) { + coilSelectionReportObj->setCoilSupplyFanInfo( WindAC( WindACNum ).DXCoilName , WindAC( WindACNum ).DXCoilType, WindAC( WindACNum ).FanName, DataAirSystems::objectVectorOOFanSystemModel , WindAC( WindACNum ).FanIndex ); + } else { + coilSelectionReportObj->setCoilSupplyFanInfo( WindAC( WindACNum ).DXCoilName , WindAC( WindACNum ).DXCoilType, WindAC( WindACNum ).FanName, DataAirSystems::structArrayLegacyFanModels , WindAC( WindACNum ).FanIndex ); + } + } } From 6e2d1929a78711e2a2364f9da233ee3e914d82bd Mon Sep 17 00:00:00 2001 From: mjwitte Date: Wed, 31 Jan 2018 12:20:13 -0600 Subject: [PATCH 02/14] CoilSizingReport-NFP --- ...for Sizing Reporting Enhancements-Final.docx | Bin 0 -> 44436 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 design/FY2018/NFP for Sizing Reporting Enhancements-Final.docx diff --git a/design/FY2018/NFP for Sizing Reporting Enhancements-Final.docx b/design/FY2018/NFP for Sizing Reporting Enhancements-Final.docx new file mode 100644 index 0000000000000000000000000000000000000000..de94a87015426dd177d3ae28f8c662852617bac8 GIT binary patch literal 44436 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Ξ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 literal 0 HcmV?d00001 From dcfcab472f5abafbbf9c7b43a6bb6bdfc5711445 Mon Sep 17 00:00:00 2001 From: Brent Griffith Date: Mon, 5 Feb 2018 10:20:45 -0500 Subject: [PATCH 03/14] Doc changes for coil report table add description of table columns to Output Details and Examples documentation, Trane Contribution --- .../src/output-files/eplustbl-lt-ext-gt.tex | 188 ++++++++++++++++++ 1 file changed, 188 insertions(+) diff --git a/doc/output-details-and-examples/src/output-files/eplustbl-lt-ext-gt.tex b/doc/output-details-and-examples/src/output-files/eplustbl-lt-ext-gt.tex index f01d297f672..7d2aff44cc4 100644 --- a/doc/output-details-and-examples/src/output-files/eplustbl-lt-ext-gt.tex +++ b/doc/output-details-and-examples/src/output-files/eplustbl-lt-ext-gt.tex @@ -1175,6 +1175,194 @@ \subsection{HVAC Sizing Summary}\label{hvac-sizing-summary} \emph{Note:} values listed as ``calculated'' are the unaltered result of the zone or system sizing calculations, using the design sizing period weather and schedules specified in the input. Values listed as ``user specified'' are either the calculated values modified by global or zone sizing factors or values specified with the \emph{flow/zone} or \emph{flow/system} design air flow method. +The HVAC Sizing Summary also includes a coil summary report table. This is a large data table that collects a variety of results organized by each individual coil. It can be viewed in html or csv format but it expected to be used from the sqlite database. The table has 87 columns and a row for each coil in the building model. The column titles are also called fields here, as in fields to use with a database query. + +Throughout this table the special value of -999.0 is deliberately used to signal that no data are available to report for that coil for that field or column. This could be for a variety of reasons such as, no sizing calculations in the model, did not run design day full simulations, particular fields only applies to certain types of coils, certain calculations are only performed for particular coils, etc. If you find a -999.0 in a situation where you think the value should be available, please report it. Another special value of -99999.0 may be encountered which is used within EnergyPlus to signal that numeric input fields were set to Autosize, Autocalculate, or left blank and in some cases this value will carry into the coil report table. + +The encyclopedic documentation that follows is important because in many cases, very similiar data are available from up to three seperate fields and one must be careful to understand the subtle differences and be aware that there is some repetition of the similar types of data in the fields. This is mainly because coil performance changes with the conditions under which it operates and so an important part of this table is describing each coil under different sets of operating conditions. + +There are three broad groupings of data fields in the table: + +\begin{itemize} +\item + Meta data. The meta data fields include string names to identify the coil, where it is being used, names and types of IDF objects involved, what some of the various sizing method input choices were set to, and information about the supply fan and plant found to be associated with the coil. 40 fields. +\item + Ideal loads sizing summary. The collection of fields whose names end with ``at Ideal Loads Peak'' are all related to the sizing calculations done by the ideal loads zone sizing routines and the system sizing routines based on them. Many of the values reported here come from Sizing:Zone and/or Sizing:System input. The operating conditions occuring during Ideal Loads sizing calculations are unlikely to match the conditions used in the definitions for coil input data. 36 fields. +\item + Rating point summary. This is a collection of fields with names that end in ``at Rating Conditions.'' The model input data for many types of coils is based on defined set of conditions variously referred to as the rating point, reference, nominal, or design. The coil models are calculated with conditions set to match the rating point and the inputs and outputs from that are reported here. Many of the values here are from the input documentation that defines the conditions at the rating point. The coil capacities and leaving conditions are the results from the running complete coil model. Some coil models do not have a rating point as part of the model definition, because the models are not sensitive to operating conditions, and those coils will have -999.0 in these fields. 11 fields. +\end{itemize} + +The following is a comprehensive listing of each column/field in the coil summary table with a brief definition and/or summary. + +\emph{Coil Type} The input object class name in IDF syntax. Text string. + +\emph{Coil Location} The broad type of HVAC this coil is being used in. ``AirLoop'' means the coil is part of a central air system, such as a main coil in a multizone air handler. ``Zone Equipment'' means that the coil is part of Zone equipment like a PTAC, or in the zone terminal unit of an airhandler like a VAV reheat coil. Text string. + +\emph{HVAC Type} This is more specifically what HVAC the coil is used in. The values are the input object class name, in IDF syntax, found to be associated with the coil. Text string. + +\emph{HVAC Name} This is the unique user name input for the \emph{HVAC Type}. The strings will be converted to upper case compared to what is in the actual input data file. Text string. + +\emph{Zone Name(s)} This is the zone, or list of zones, found to be associated with this coil. The zone name is defined by the user in the Zone object. For multizone systems, the coils can have a list of zone names with the individual names separated by a semicolon. The zones listed here are those used to generate (aggregate and volume-weighted average) values for the room conditions and loads. Text string. + +\emph{System Sizing Method Concurrence} This field applies to ``AirLoop'' coils. It describes if the central air system sizing was done using ``Coincident'' or ``Non-Coincident'' method. This refers to how the ideal loads sizing routines process the time sequence of zone loads. The concurrent sum of peaks, or coincident or "block", is often lower than the sum of the individual peaks regardless of when they occur, or non-conicident sum. This field is not applicable to ``Zone Equipment'' coils and will show ``N/A'' here. This corresponds to the input field called Type of Zone Sum to Use in the Sizing:System input object. Text string. + +\emph{System Sizing Method Capacity} This field applies to ``AirLoop'' coils. It describes what was chosen for the method of determining coil capacity during ideal loads sizing routines. The values here will match the input key choices available for the the Sizing:System object's input fields called \emph{Cooling Design Capacity Method}, for cooling coils, and \emph{Heating Design Capacity Method}, for heating coils. Values here of ``HeatingDesignCapacity'' or ``CoolingDesignCapacity'' mean that the coil was sized using the design loads calculated from the zone ideal loads results. When sizing was scaled using floor area the value here would be ``CapacityPerFloorArea.'' Values of \emph{FractionOfAutosizedHeatingCapacity} and \emph{FractionOfAutosizeCoolingCapacity} mean that the usual design load based results were further scaled by a separate user scaling factor. This field is not applicable to ``Zone Equipment'' coils and will show ``N/A'' here. Text string. + +\emph{System Sizing Method Air Flow} This field applies to ``AirLoop'' coils. It describes what was chosen for the method of determining the system air flow rate during ideal loads sizing routines. This field is not applicable to ``Zone Equipment'' coils and will show ``N/A'' here. Text string. + +\emph{Autosized Coil Capacity?} This field describes if the coil capacity was autosized or not. Values here will be ``Yes'' or ``No.'' A ``No'' means that the size of the coil was set at input, hard sized, and no capacity sizing calculations were done for the coil. A ``Yes'' means that coil's capacity was autosized. Text string. + +\emph{Autosized Coil Airflow?} This field describes if the coil's airflow rate was autosized or not. Values here will be ``Yes'' or ``No.'' A ``No'' means that the airflow rate used to size the coil's capacity was set at input, hard sized. This means that the coil's capacity was set for an airflow rate that was not autosized. A ``Yes'' means that the airflow rate for the coil came from sizing calculations. Text string. + +\emph{Autosized Coil Water Flow?} This field describes if the coil's water flow rate was autosized or not. Values here will be ``Yes'' or ``No.'' A ``No'' means that the water flow rate used to size the coil's capacity was set at input, hard sized. This means that the coil's capacity was set for a water flow rate that was not autosized. A ``Yes'' means that the water flow rate for the coil came from sizing calculations. This field is only applicable to water-to-air coils. Text string. + +\emph{OA Pretreated prior to coil inlet?} This field describes if the coil's sizing calculations are based on the outdoor air being preconditioned, as with a separate coil, or if the outdoor air is unconditioned. Values here will be ``Yes'' or ``No.'' A ``No'' means that the outdoor air is not preconditioned. A ``Yes'' means that the outdoor is preconditioned. This field only really applies to central air system coils. The outdoor air may be mixed with return air before the coil, but that mixed air may be based on either treated or untreated outdoor air, depending on Sizing:System input. Text string. + +\emph{Coil Final Gross Total Capacity [W]} This field describes the coil's gross total capacity, in units of W. No fan impact. This field will generally be the main value the model uses for capacity as a result of the sizing calculations. However if a coil was not autosized, the capacity was hard sized on input, then this field will be filled with the hard sized coil capacity (if that is a parameter in the coil model). This field is very similiar to the field called Coil Total Capacity at Rating Conditions with the difference being that this one is the model input while that other one is the result of running the full coil model at the rating point conditions. Water heating coil models using UA and design water flow rate performance input method do not have a single design capacity in Watts and this field will show as -99999.0 (and the coil is better characterized using the field called Coil U-value Times Area Value). Real number. + +\emph{Coil Final Gross Sensible Capacity [W]} Real number. This field describes the coil's gross sensible capacity, if available, in units of W. No fan impact. This field is generally the total capacity multiplied by the sensible heat ratio if both are defined in the model. Real number. + +\emph{Coil Final Reference Air Volume Flow Rate [m3/s]} This field describes the coil's rated/reference/nominal air flow rate, in units of m3/s. This field will generally be the model input (or autosize result) for the process air flow rate through the coil at the rating point. Some coil models do not have any rated/reference/nominal air flow rate as part of the model description (d.g. electric and gas heating coils) and these will have -999.0 in this field. Real number. + +\emph{Coil Final Reference Plant Fluid Volume Flow Rate [m3/s]} This field describes the coil's rated/reference/nominal water flow rate, in units of m3/s. This field will be the model input or autosize result for the source water, or other plant fluid type, flow rate through the coil at the design or rating point. Many coils have no water source and these will have -999.0 in this field. Real number. + +\emph{Coil U-value Times Area Value [W/K]} This field describes the coil's overall UA value, in units of W/K. This is mainly for the Coil:Heating:Water coil using the Performance Input method of UFactorTimesAirAndDesignWaterFlowRate and is not avaliable for other coils. This will be the result from the ideal loads sizing calculations or the hard sized entry. Real number. + +\emph{Terminal Unit Reheat Coil Multiplier} This field describes the coil sizing multiplier that might have affected the calculated size of a coil used as a reheat coil in a zone air terminal unit. This is a non-dimensional scaling factor. Real number. + +\emph{DX Coil Capacity Increase Ratio from Too Low Flow/Capacity Ratio} This field describes sizing adjustments that can occur for DX coils when the combination of capacity and air flow rate is outside of prescribed limits. If the air flow to capacity ratio was too low this will ratio will show how the capacity was increased to force the result into the prescribed range. Real Number. + +\emph{DX Coil Capacity Decrease Ratio from Too High Flow/Capacity Ratio} This field describes sizing adjustments that can occur for DX coils when the combination of capacity and air flow rate is outside of prescribed limits. If the air flow to capacity ratio was too high this will ratio will show how the capacity was decreased to force the result into the prescribed range. Real Number. + +\emph{Moist Air Heat Capacity [J/kg-K]} This is the moist air heat capacity, cp, that is applicable to coil calculations. Real number. + +\emph{Dry Air Heat Capacity [J/kg-K]} This is the dry air heat capacity, cp, that is applicable to coil calculations. Real number. + +\emph{Standard Air Density Adjusted for Elevation [kg/m3]} This is the dry air density, adjusted for elevation above sea level, that is applicable to coil calculations. Real number. + +\emph{Supply Fan Name for Coil} The program tries to detect the supply fan associated with the coil. This field is the user-defined name for that fan. Text string. + +\emph{Supply Fan Type for Coil} The program tries to detect the supply fan associated with the coil. The values are the input object class name, in IDF syntax, for the fan. Text string. + +\emph{Supply Fan Maximum Air Volume Flow Rate [m3/s]} This field is the design volume flow rate, in units of m3/s, for the fan found to be associated with the coil. Real number + +\emph{Supply Fan Maximum Air Mass Flow Rate [kg/s]} This field is the design mass flow rate, in kg/s, for the fan found to be associated with the coil. Real number + +\emph{Plant Name for Coil} If the coil is a water-to-air or steam coil, then the program tries to detect the central plant system serving the coil. This field is the user-defined name for that plant system. This will be the name in the PlantLoop and Sizing:Plant objects. The next nine fields provides various results for that the central plant loop system. If the coil is not a water or steam coil, then this field will have ``unknown'' as the value. Text string. + +\emph{Plant Fluid Specific Heat Capacity [J/kg-K]} This is the specific heat of the fluid circulating through the plant and serving the coil, in units of J/kg-K. This is evaulated at the temperature used for sizing calculations. The plant need not always be water, glycol mixtures and steam are supported and this value will be adjusted accordingly. If the coil is not served by a plant, then this field will have -999.0 as the value. Real number. + +\emph{Plant Fluid Density [kg/m3]} This is the density of the fluid circulating through the plant and serving the coil, in units of kg/m3. This is evaulated at the temperature used for sizing calculations. The plant need not always be water, glycol mixtures are supported and this value will be adjusted accordingly. If the coil is not served by a plant, then this field will have -999.0 as the value. Real number. + +\emph{Plant Maximum Fluid Mass Flow Rate [kg/s]} This field is the design flow rate for the (entire) central plant system serving the coil, in units of kg/s. This value is the final outcome from plant sizing calculations, or perhaps from the hard-sized value entered in the PlantLoop object for the maximum volume flow rate. If the coil is not served by a plant, then this field will have -999.0 as the value. Real number. + +\emph{Plant Design Fluid Return Temperature [C]} This is the value, in degrees Celsius, used in sizing calculations for the temperature of the fluid returning to the supply side of the plant system. It is derived from values entered in the Sizing:Plant object (except for steam which depends on subcooling input). If the coil is not served by a plant, then this field will have -999.0 as the value. Real number. + +\emph{Plant Design Fluid Supply Temperature [C]} This is the value, in degrees Celsius, used in the sizing calculations for the temperature of the fluid leaving the supply side of the plant system and going into the coils. This is the value entered in the Sizing:Plant object in the input field called Design Loop Exit Temperature (except for steam which is 100 C). If the coil is not served by a plant, then this field will have -999.0 as the value. Real number. + +\emph{Plant Design Fluid Temperature Difference [Delta C]} This is the value, in degrees Celsius (difference), used in the sizing calculations for the temperature difference between the plant supply and return temperatures. This is the value entered in the Sizing:Plant object in the input field called Loop Design Temperature Difference (except for steam it is the amount of subcooling in the coil). If the coil is not served by a plant, then this field will have -999.0 as the value. Real number. + +\emph{Plant Design Capacity [W]} This is the design capacity of the central plant system, in Watts, that is the result of the sizing calculations. For steam plants it is the capacity of the steam boiler attached to the supply side of the plant. If the coil is not served by a plant, then this field will have -999.0 as the value. Real number. + +\emph{Coil Capacity Percentage of Plant Design Capacity [\%]} The coil being reported on here will be one among many others that might be also be attached to the same plant. This field compares this coil's (design gross) total capacity to the central plant's design capacity, W/W, and gives a value in percentage from 0.0 to 100.0. If the coil is not served by a plant, then this field will have -999.0 as the value. Real Number. + +\emph{Coil Fluid Flow Rate Percentage of Plant Design Flow Rate [\%]} The coil being reported on here will be one among many others that might be also be attached to the same plant. This field compares this coil's design flow rate to the central plant's design flow rate, {kg/s}/{kg/s}, and gives a value in percentage from 0.0 to 100.0. If the coil is not served by a plant, then this field will have -999.0 as the value. Real Number. + +\emph{Design Day Name at Sensible Ideal Loads Peak} This field is the name of the design day selected to have the sensible load peak for ideal loads sizing calculations. The text here will be from the user-defined names entered in the name field of the SizingPeriod:DesignDay objects. If this is a cooling coil, the load peak will be for sensible cooling loads and the name here will be from one of the cooling design days. If this is a heating coil, the load peak will be for sensible heating loads and the name from the heating design days. Text String. + +\emph{Date/Time at Sensible Ideal Loads Peak} This field provides the result for the date and time of day when the sensible load peak was found to occur. The format is (M)M/(D)D HH:MM:00, eg. 1/1 06:00:00 or 12/11 06:00:00. There is no specific year associated with design days. Text String. + +\emph{Design Day Name at Total Ideal Loads Peak} The name of the design day selected to have the total load peak for ideal loads sizing calculations. The text here will be from the user-defined names entered in the name field of the SizingPeriod:DesignDay objects. If this is a cooling coil, the load peak will be for total cooling loads and the name here will be from one of the cooling design days. If this is a heating coil, this field usually ``unknown'' because EnergyPlus does not use a total load for heating sizing. Text String. + +\emph{Date/Time at Total Ideal Loads Peak} This field provides the result for the date and time of day when the total load peak was found to occur during ideal loads sizing. The format is (M)M/(D)D HH:MM:00, eg. 1/1 06:00:00 or 12/11 06:00:00. There is no specific year associated with design days. If the ideal loads sizing calculations never determine a total load the value here will be ``unknown.'' Text String. + +\emph{Design Day Name at Air Flow Ideal Loads Peak} This field is the name of the design day selected to have the air flow peak for ideal loads sizing calculations. The text here will be from the user-defined names entered in the name field of the SizingPeriod:DesignDay objects. If this is a cooling coil, the air flow peak might be calculated seperately and the name here will be from one of the cooling design days. If this is a heating coil, the air flow peak will be the same as the sensible load peak. Text String. + +\emph{Date/Time at Air Flow Ideal Loads Peak} This field provides the result for the date and time of day when the air flow peak was found to occur. The format is (M)M/(D)D HH:MM:00, eg. 1/1 06:00:00 or 12/11 06:00:00. There is no specific year associated with design days. Text String. + +\emph{Coil Total Capacity at Ideal Loads Peak [W]} This field is the coil's gross total capacity, in Watts, resulting from the ideal loads sizing calculations. This is the total, sensible plus latent, capacity under the conditions used for ideal loads sizing described in other ``Ideal Loads Peak'' fields. This does not include the supply fan impacts. Real Number. + +\emph{Coil Sensible Capacity at Ideal Loads Peak [W]} This field is the coil's gross sensible capacity, in Watts, resulting from the ideal loads sizing calculations. This is the sensible capacity under the conditiosn used for ideal loads sizing described in the other ``Ideal Loads Peak'' fields. This does not include the supply fan impacts. Real number. + +\emph{Coil Off-Rating Capacity Modifier at Ideal Loads Peak [ ]} This field is the capacity modification factor for the conditions during ideal loads sizing. The coil model may have performance curves that alter the capacity as a function of the conditions experienced by the coil. When the ideal loads sizing conditions are different than the conditions that the performance curves are normalized to, the rating point, the coil is being sized at ``Off-rating.'' This value can be used to convert the Coil Total Capacity at Ideal Loads Peak to what the capacity should be at the rating point. The ideal loads sizing is often not at the rating point because of a fraction of outdoor air has been mixed into the entering air. Real number. + +\emph{Coil Air Mass Flow Rate at Ideal Loads Peak [kg/s]} This field is the coil's air mass flow rate, in kg/s, resulting from, and/or used during, the ideal loads sizing calculations. Real number. + +\emph{Coil Air Volume Flow Rate at Ideal Loads Peak [m3/s]} This field is the coil's air volume flow rate, in m3/s, resulting from, and/or used during, the ideal loads sizing calculations. Real number. + +\emph{Coil Entering Air Drybulb at Ideal Loads Peak [C]} This field is the drybulb temperature, in degrees Celsius, of the air entering the coil during ideal loads sizing calculations. Real number. + +\emph{Coil Entering Air Wetbulb at Ideal Loads Peak [C]} This field is the wetbulb temperature, in degrees Celsius, of the air entering the coil during ideal loads sizing calculations. Real number. + +\emph{Coil Entering Air Humidity Ratio at Ideal Loads Peak [kg-H2O/kg-DryAir]} This field is the humidity ratio, in kg-water/kg-dryAir, of the air entering the coil during ideal loads sizing calculations. Real number. + +\emph{Coil Entering Air Enthalpy at Ideal Loads Peak [J/(kg-C)]} This field is the enthalpy, in J/kg-C (base 0.0 at drybulb = 0.0C), of the air entering the coil during ideal loads sizing calculations. Real number. + +\emph{Coil Leaving Air Drybulb at Ideal Loads Peak [C]} This field is the drybulb temperature, in degrees Celsius, of the air leaving the coil during the ideal loads sizing calculations for the coil. Real number. + +\emph{Coil Leaving Air Wetbulb at Ideal Loads Peak [C]} This field is the wetbulb temperature, in degrees Celsius, of the air leaving the coil during ideal loads sizing calculations. Real number. + +\emph{Coil Leaving Air Humidity Ratio at Ideal Loads Peak [C]} This field is the humidity ratio, in kg-water/kg-dryAir, of the air leaving the coil during ideal loads sizing calculations. Real number. + +\emph{Coil Leaving Air Enthalpy at Ideal Loads Peak [J/(kg-C)]} This field is the enthalpy, in J/kg-C (base 0.0 at drybulb = 0.0C), of the air leaving the coil during ideal loads sizing calculations. Real number. + +\emph{Coil Plant Fluid Mass Flow Rate at Ideal Loads Peak [kg/s]} This field is the design or maximum water flow rate, in kg/s, of the plant fluid serving the coil during ideal loads sizing calculations. If the coil is not a water coil then this field will have a value of -999.0. Real number. + +\emph{Coil Entering Plant Fluid Temperature at Ideal Loads Peak [C]} This field is the water temperature, in degrees Celsius, of the plant fluid entering the coil during ideal loads sizing calculations. If the coil is not a water coil then this field will have a value of -999.0. Real number. + +\emph{Coil Leaving Plant Fluid Temperature at Ideal Loads Peak [C]} This field is the water temperature, in degrees Celsius, of the plant fluid leaving the coil during ideal loads sizing calculations. If the coil is not a water coil then this field will have a value of -999.0. Real number. + +\emph{Coil Plant Fluid Temperature Difference at Ideal Loads Peak [Delta C]} This field is the water temperature difference across the coil, in degrees Celsius (difference), of the plant fluid passing through the coil during ideal loads sizing calculations. If the coil is not a water coil then this field will have a value of -999.0. Real number. + +\emph{Supply Fan Air Heat Gain at Ideal Loads Peak [W]} This field is the fan load that was included in the ideal loads sizing calculations. This may only be included in calculations for central air system cooling coils. If the coil was not sized with fan heat gain taken into account, then this value will be 0.0 (even though there still is a fan with heat during normal operation). Real number. + +\emph{Coil and Fan Net Total Capacity at Ideal Loads Peak [W]} This field shows the net coil total capacity which is the gross total capacity with the fan heat gain, if any was calculated. Real number. + +\emph{Outdoor Air Drybulb at Ideal Loads Peak [C]} This field is the outdoor air drybulb temperature, in degrees Celsius, used during the ideal loads sizing calculations. Real number. + +\emph{Outdoor Air Humidity Ratio at Ideal Loads Peak [kg-H2O/kg-DryAir]} This field is the outdoor air humidity ratio, in kg of water per kg of dry air, used during the ideal loads sizing calculations. Real number. + +\emph{Outdoor Air Wetbulb at Ideal Loads Peak [C]} This field is the outdoor air wetbulb temperature, in degrees Celsius, used during the ideal loads sizing calculations. Real number. + +\emph{Outdoor Air Volume Flow Rate at Ideal Loads Peak [m3/s]} This field is the outdoor air volume flow rate, in m3/s, that occurred during the ideal loads sizing calculations. Real number. + +\emph{Outdoor Air Flow Percentage at Ideal Loads Peak [\%]} This field is the percentage of outdoor air in the air entering the coil that occurred during the ideal loads sizing calculations. Real number. + +\emph{System Return Air Drybulb at Ideal Loads Peak [C]} This field is the drybulb temperature, in degrees C, of air returning into the HVAC system that occurred during the ideal loads sizing calculations. Real number. + +\emph{System Return Air Humidity Ratio at Ideal Loads Peak [kg-H2O/kg-DryAir]} This field is the humidity ratio, in kg of water per kg of dry air, of air returning into the HVAC system that occurred during the ideal loads sizing calculations. Real number. + +\emph{Zone Air Drybulb at Ideal Loads Peak [C]} This field is the drybulb temperature, in degrees C, of the zone air that occurred during the ideal loads sizing calculations. For multizone system this is the volume-weighted average. Real number. + +\emph{Zone Air Humidity Ratio at Ideal Loads Peak [kg-H2O/kg-DryAir]} This field is the humidity ratio, in kg of water per kg of dry air, of the zone air that occurred during the ideal loads sizing calculations. For multizone system this is the volume-weighted average. Real number. + +\emph{Zone Air Relative Humidity at Ideal Loads Peak [\%]} This field is the percent relative humidity of the zone air that occurred during the ideal loads sizing calculations. For multizone system this is the volume-weighted average. Real number. + +\emph{Zone Sensible Heat Gain at Ideal Loads Peak [W]} This field is the zone sensible load, in Watts, found during ideal loads sizing. For multizone system it is the sum of all the zones on the air system. Real number. + +\emph{Zone Latent Heat Gain at Ideal Loads Peak [W]} This field is the zone latent load, in Watts, found during ideal loads sizing. For multizone system it is the sum of all the zones on the air system. Real number. + +\emph{Coil Total Capacity at Rating Conditions [W]} This field is the gross total capacity of the coil when operated at the rating point conditions, in units of Watts. This is the result from calculating the full coil model under the operating conditions specified for the rating point. Real number. + +\emph{Coil Sensible Capacity at Rating Conditions [W]} This field is the gross sensible capacity of the coil when operated at the rating point conditions, in units of Watts. This is the result from calculating the full coil model under the operating conditions specified for the rating point. Real number. + +\emph{Coil Air Mass Flow Rate at Rating Conditions [kg/s]} This field is the air mass flow rate, in units of kg/s, used when calculating the full coil model under the operating conditions specified for the rating point. Real number. + +\emph{Coil Entering Air Drybulb at Rating Conditions [C]} This field is the coil air inlet drybulb temperature, in degrees Celsius, used when calculating the full coil model under the operating conditions specified for the rating point. The value should match the definition of the rating point as described in the coil model input documentation. For DX cooling coils, this will be 26.6667C or 80F. Real number. + +\emph{Coil Entering Air Wetbulb at Rating Conditions [C]} This field is the coil air inlet wetbulb temperature, in degrees Celsius, used when calculating the full coil model under the operating conditions specified for the rating point. The value should match the definition of the rating point as described in the coil model input documentation. For DX cooling coils, this will be 19.444C or 67F. Real number + +\emph{Coil Entering Air Humidity Ratio at Rating Conditions [kg-H20/kg-DryAir]} This field is the coil air inlet humidity ratio, in kg-water/kg-dryAir, used when calculating the full coil model under the operating conditions specified for the rating point. Real number. + +\emph{Coil Entering Air Enthalpy at Rating Conditions [J/(kg-C)]} This field is the coil air inlet enthalpy, in J/kg-C with zero base at 0.0C, used when calculating the full coil model under the operating conditins specified for the rating point. Real number. + +\emph{Coil Leaving Air Drybulb at Rating Conditions [C]} This field is the coil air outlet drybulb, in degrees Celsius, from calculating the full coil model under the operating conditions specified for the rating point. Real number. + +\emph{Coil Leaving Air Wetbulb at Rating Conditions [C]} This field is the coil air outlet wetbulb, in degrees Celsius, from calculating the full coil model under the operating conditions specified for the rating point. Real number. + +\emph{Coil Leaving Air Humidity Ratio at Rating Conditions [kg-H20/kg-DryAir]} This field is the coil air outlet humidity ratio, in kg-water/kg-dryair, from calculating the full coil model under the operating conditions specified for the rating point. Real number. + +\emph{Coil Leaving Air Enthalpy at Rating Conditions [J/(kg-C)]} This field is the coil air outlet enthalpy, in J/kg-C with zero base at 0.0C, from calculating the full coil model under the operating conditions specified for the rating point. Real number. Directly following is an example of the report. The key used to obtain this report is HVACSizingSummary. From d395b276fb0c4d10e5518b239b4f74176aa85874 Mon Sep 17 00:00:00 2001 From: mjwitte Date: Wed, 14 Feb 2018 15:54:43 -0600 Subject: [PATCH 04/14] Coil sizing report - fix test failures --- src/EnergyPlus/DataPlant.hh | 2 +- src/EnergyPlus/ReportCoilSelection.cc | 57 ++++++++++--------- .../unit/Fixtures/EnergyPlusFixture.cc | 2 + tst/EnergyPlus/unit/HVACUnitarySystem.unit.cc | 2 + tst/EnergyPlus/unit/OutdoorAirUnit.unit.cc | 1 + .../unit/PackagedTerminalHeatPump.unit.cc | 16 +++--- 6 files changed, 44 insertions(+), 36 deletions(-) diff --git a/src/EnergyPlus/DataPlant.hh b/src/EnergyPlus/DataPlant.hh index 215a2ec2fa2..a210d8ffb45 100644 --- a/src/EnergyPlus/DataPlant.hh +++ b/src/EnergyPlus/DataPlant.hh @@ -992,7 +992,7 @@ namespace DataPlant { // Default Constructor PlantLoopData() : FluidType( 0 ), - FluidIndex( 0 ), + FluidIndex( 1 ), // default to water MFErrIndex( 0 ), MFErrIndex1( 0 ), MFErrIndex2( 0 ), diff --git a/src/EnergyPlus/ReportCoilSelection.cc b/src/EnergyPlus/ReportCoilSelection.cc index 0545448f704..b475761c201 100644 --- a/src/EnergyPlus/ReportCoilSelection.cc +++ b/src/EnergyPlus/ReportCoilSelection.cc @@ -465,7 +465,7 @@ ReportCoilSelection::doAirLoopSetup( { // this routine sets up some things for central air systems, needs to follow setting of an airloop num auto & c( coilSelectionDataObjs[ coilVecIndex ] ); - if ( c->airloopNum > 0 ) { + if ( c->airloopNum > 0 && allocated( DataAirSystems::PrimaryAirSystem ) ) { // see if there is an OA controller if ( DataAirSystems::PrimaryAirSystem( c->airloopNum ).OASysExists ) { //loop over OA controllers and match node num ? @@ -477,36 +477,36 @@ ReportCoilSelection::doAirLoopSetup( } //fill list of zones connected to this air loop // this could be reworked to use different structure which is available now since std 62.1 changes - - if ( DataAirLoop::AirToZoneNodeInfo( c->airloopNum ).NumZonesCooled > 0 ) { - int zoneCount = DataAirLoop::AirToZoneNodeInfo( c->airloopNum ).NumZonesCooled; - c->zoneNum.resize( zoneCount ); - c->zoneName.resize( zoneCount ); - for ( int loopZone = 1; loopZone <= DataAirLoop::AirToZoneNodeInfo( c->airloopNum ).NumZonesCooled; ++loopZone ) { - c->zoneNum[ loopZone - 1] = DataAirLoop::AirToZoneNodeInfo( c->airloopNum).CoolCtrlZoneNums( loopZone ); - c->zoneName[ loopZone - 1] = DataHeatBalance::Zone( c->zoneNum[ loopZone - 1] ).Name; + if ( allocated( DataAirLoop::AirToZoneNodeInfo ) ) { + if ( DataAirLoop::AirToZoneNodeInfo( c->airloopNum ).NumZonesCooled > 0 ) { + int zoneCount = DataAirLoop::AirToZoneNodeInfo( c->airloopNum ).NumZonesCooled; + c->zoneNum.resize( zoneCount ); + c->zoneName.resize( zoneCount ); + for ( int loopZone = 1; loopZone <= DataAirLoop::AirToZoneNodeInfo( c->airloopNum ).NumZonesCooled; ++loopZone ) { + c->zoneNum[ loopZone - 1] = DataAirLoop::AirToZoneNodeInfo( c->airloopNum).CoolCtrlZoneNums( loopZone ); + c->zoneName[ loopZone - 1] = DataHeatBalance::Zone( c->zoneNum[ loopZone - 1] ).Name; + } } - } - if ( DataAirLoop::AirToZoneNodeInfo( c->airloopNum ).NumZonesHeated > 0 ) { - int zoneCount = DataAirLoop::AirToZoneNodeInfo( c->airloopNum ).NumZonesHeated; - for ( int loopZone = 1; loopZone <= DataAirLoop::AirToZoneNodeInfo( c->airloopNum ).NumZonesHeated; ++loopZone ) { - int zoneIndex = DataAirLoop::AirToZoneNodeInfo( c->airloopNum).HeatCtrlZoneNums( loopZone ); - // see if this zone is new or already in list - bool found = false; - for ( auto & z : c->zoneNum ) { - if ( z == zoneIndex ) { - found = true; - break; + if ( DataAirLoop::AirToZoneNodeInfo( c->airloopNum ).NumZonesHeated > 0 ) { + int zoneCount = DataAirLoop::AirToZoneNodeInfo( c->airloopNum ).NumZonesHeated; + for ( int loopZone = 1; loopZone <= DataAirLoop::AirToZoneNodeInfo( c->airloopNum ).NumZonesHeated; ++loopZone ) { + int zoneIndex = DataAirLoop::AirToZoneNodeInfo( c->airloopNum).HeatCtrlZoneNums( loopZone ); + // see if this zone is new or already in list + bool found = false; + for ( auto & z : c->zoneNum ) { + if ( z == zoneIndex ) { + found = true; + break; + } + } + if ( ! found ) { // add it + c->zoneNum.emplace_back( zoneIndex ); + c->zoneName.emplace_back( DataHeatBalance::Zone( zoneIndex ).Name ); } - } - if ( ! found ) { // add it - c->zoneNum.emplace_back( zoneIndex ); - c->zoneName.emplace_back( DataHeatBalance::Zone( zoneIndex ).Name ); } } } - } @@ -885,7 +885,7 @@ ReportCoilSelection::getIndexForOrCreateDataObjFromCoilName ( bool found( false ); bool locIsCooling( false ); bool locIsHeating( false ); - for ( int loop = 1; loop < DataHVACGlobals::NumAllCoilTypes; ++loop ) { + for ( int loop = 1; loop <= DataHVACGlobals::NumAllCoilTypes; ++loop ) { if ( InputProcessor::SameString( coilType, DataHVACGlobals::cAllCoilTypes( loop ) ) ) { found = true; locIsCooling = InputProcessor::SameString( coilType, DataHVACGlobals::cCoolingCoilTypes( loop ) ); @@ -904,6 +904,9 @@ ReportCoilSelection::getIndexForOrCreateDataObjFromCoilName ( } + if ( index == -1 ) { + ShowFatalError( "getIndexForOrCreateDataObjFromCoilName: Developer error - not a coil: " + coilType + " = " + coilName ); + } return index; } @@ -1129,7 +1132,7 @@ ReportCoilSelection::setCoilCoolingCapacity( c->zoneEqNum = curZoneEqNum; // if ( c->zoneEqNum > 0 ) doZoneEqSetup( index ); c->oASysNum = curOASysNum; - if ( curSysNum > 0 && c->zoneEqNum == 0 && allocated( DataSizing::FinalSysSizing ) ) { + if ( curSysNum > 0 && c->zoneEqNum == 0 && allocated( DataSizing::FinalSysSizing ) && allocated( DataSizing::SysSizPeakDDNum ) ) { // These next blocks does not always work with SizingPeriod:WeatherFileDays or SizingPeriod:WeatherFileConditionType, protect against hard crash if ( DataSizing::SysSizPeakDDNum( curSysNum ).SensCoolPeakDD > 0 && DataSizing::SysSizPeakDDNum( curSysNum ).SensCoolPeakDD <= DataEnvironment::TotDesDays ) { diff --git a/tst/EnergyPlus/unit/Fixtures/EnergyPlusFixture.cc b/tst/EnergyPlus/unit/Fixtures/EnergyPlusFixture.cc index a0c06ce3c6f..cfd1b26cc62 100644 --- a/tst/EnergyPlus/unit/Fixtures/EnergyPlusFixture.cc +++ b/tst/EnergyPlus/unit/Fixtures/EnergyPlusFixture.cc @@ -173,6 +173,7 @@ #include #include #include +#include #include #include #include @@ -244,6 +245,7 @@ namespace EnergyPlus { UtilityRoutines::outputErrorHeader = false; Psychrometrics::InitializePsychRoutines(); + createCoilSelectionReportObj(); } void EnergyPlusFixture::TearDown() { diff --git a/tst/EnergyPlus/unit/HVACUnitarySystem.unit.cc b/tst/EnergyPlus/unit/HVACUnitarySystem.unit.cc index 22700538c6d..7fc8fa4aee1 100644 --- a/tst/EnergyPlus/unit/HVACUnitarySystem.unit.cc +++ b/tst/EnergyPlus/unit/HVACUnitarySystem.unit.cc @@ -2155,6 +2155,7 @@ TEST_F( EnergyPlusFixture, UnitarySystemSizingTest_ConfirmUnitarySystemSizingTes HVACUnitarySystem::NumUnitarySystem = 50; // trick code so that UnitarySystemNumericFields.deallocate(); does not occur within code called from unit test FinalZoneSizing.allocate( 1 ); ZoneEqSizing.allocate( 1 ); + SysSizPeakDDNum.allocate( 1 ); CurSysNum = 0; CurOASysNum = 0; @@ -8485,6 +8486,7 @@ TEST_F( EnergyPlusFixture, UnitarySystem_SizingWithFans ) { // Need this to prevent crash in RequestSizing UnitarySysEqSizing.allocate( 1 ); OASysEqSizing.allocate( 1 ); + SysSizPeakDDNum.allocate( 1 ); int UnitarySysNum( 1 ); int AirLoopNum( 1 ); diff --git a/tst/EnergyPlus/unit/OutdoorAirUnit.unit.cc b/tst/EnergyPlus/unit/OutdoorAirUnit.unit.cc index 1b692ce6f3b..e223cc8d7bb 100644 --- a/tst/EnergyPlus/unit/OutdoorAirUnit.unit.cc +++ b/tst/EnergyPlus/unit/OutdoorAirUnit.unit.cc @@ -305,6 +305,7 @@ namespace EnergyPlus { FinalZoneSizing.allocate( 1 ); FinalZoneSizing( CurZoneEqNum ).MinOA = 0.5; FinalZoneSizing( CurZoneEqNum ).ZoneRetTempAtCoolPeak = 26.66667; + FinalZoneSizing( CurZoneEqNum ).ZoneTempAtCoolPeak = 26.66667; FinalZoneSizing( CurZoneEqNum ).ZoneHumRatAtCoolPeak = 0.01117049470250416; // AHRI condition at 80 F db / 67 F wb FinalZoneSizing( CurZoneEqNum ).CoolDDNum = 1; FinalZoneSizing( CurZoneEqNum ).TimeStepNumAtCoolMax = 1; diff --git a/tst/EnergyPlus/unit/PackagedTerminalHeatPump.unit.cc b/tst/EnergyPlus/unit/PackagedTerminalHeatPump.unit.cc index 31dc52a9728..41326b34b01 100644 --- a/tst/EnergyPlus/unit/PackagedTerminalHeatPump.unit.cc +++ b/tst/EnergyPlus/unit/PackagedTerminalHeatPump.unit.cc @@ -459,19 +459,19 @@ namespace EnergyPlus { PlantLoop( 2 ).FluidName = "ChilledWater"; PlantLoop( 2 ).FluidIndex = 1; PlantLoop( 2 ).FluidName = "WATER"; - PlantLoop( 2 ).LoopSide( 1 ).Branch( 1 ).Comp( 1 ).Name = VarSpeedCoil( 2 ).Name; - PlantLoop( 2 ).LoopSide( 1 ).Branch( 1 ).Comp( 1 ).TypeOf_Num = VarSpeedCoil( 2 ).VSCoilTypeOfNum; - PlantLoop( 2 ).LoopSide( 1 ).Branch( 1 ).Comp( 1 ).NodeNumIn = VarSpeedCoil( 2 ).WaterInletNodeNum; - PlantLoop( 2 ).LoopSide( 1 ).Branch( 1 ).Comp( 1 ).NodeNumOut = VarSpeedCoil( 2 ).WaterOutletNodeNum; + PlantLoop( 2 ).LoopSide( 1 ).Branch( 1 ).Comp( 1 ).Name = VarSpeedCoil( 1 ).Name; + PlantLoop( 2 ).LoopSide( 1 ).Branch( 1 ).Comp( 1 ).TypeOf_Num = DataPlant::TypeOf_CoilVSWAHPCoolingEquationFit; + PlantLoop( 2 ).LoopSide( 1 ).Branch( 1 ).Comp( 1 ).NodeNumIn = VarSpeedCoil( 1 ).WaterInletNodeNum; + PlantLoop( 2 ).LoopSide( 1 ).Branch( 1 ).Comp( 1 ).NodeNumOut = VarSpeedCoil( 1 ).WaterOutletNodeNum; PlantLoop( 1 ).Name = "HotWaterLoop"; PlantLoop( 1 ).FluidName = "HotWater"; PlantLoop( 1 ).FluidIndex = 1; PlantLoop( 1 ).FluidName = "WATER"; - PlantLoop( 1 ).LoopSide( 1 ).Branch( 1 ).Comp( 1 ).Name = VarSpeedCoil( 1 ).Name; - PlantLoop( 1 ).LoopSide( 1 ).Branch( 1 ).Comp( 1 ).TypeOf_Num = VarSpeedCoil( 1 ).VSCoilTypeOfNum; - PlantLoop( 1 ).LoopSide( 1 ).Branch( 1 ).Comp( 1 ).NodeNumIn = VarSpeedCoil( 1 ).WaterInletNodeNum; - PlantLoop( 1 ).LoopSide( 1 ).Branch( 1 ).Comp( 1 ).NodeNumOut = VarSpeedCoil( 1 ).WaterOutletNodeNum; + PlantLoop( 1 ).LoopSide( 1 ).Branch( 1 ).Comp( 1 ).Name = VarSpeedCoil( 2 ).Name; + PlantLoop( 1 ).LoopSide( 1 ).Branch( 1 ).Comp( 1 ).TypeOf_Num = DataPlant::TypeOf_CoilVSWAHPHeatingEquationFit; + PlantLoop( 1 ).LoopSide( 1 ).Branch( 1 ).Comp( 1 ).NodeNumIn = VarSpeedCoil( 2 ).WaterInletNodeNum; + PlantLoop( 1 ).LoopSide( 1 ).Branch( 1 ).Comp( 1 ).NodeNumOut = VarSpeedCoil( 2 ).WaterOutletNodeNum; DataSizing::CurZoneEqNum = 1; DataSizing::ZoneSizingRunDone = true; From 1ee7c8d0ad88ef5e2401112300a796ce7e1d4ac1 Mon Sep 17 00:00:00 2001 From: mjwitte Date: Wed, 14 Feb 2018 16:30:52 -0600 Subject: [PATCH 05/14] Coil sizing report - protect against errors for fan not found --- src/EnergyPlus/ReportCoilSelection.cc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/EnergyPlus/ReportCoilSelection.cc b/src/EnergyPlus/ReportCoilSelection.cc index b475761c201..aa568ad0795 100644 --- a/src/EnergyPlus/ReportCoilSelection.cc +++ b/src/EnergyPlus/ReportCoilSelection.cc @@ -1577,6 +1577,9 @@ ReportCoilSelection::setCoilSupplyFanInfo( int const & fanIndex ) { + if ( fanName == "" ) { + return; + } int index = getIndexForOrCreateDataObjFromCoilName( coilName,coilType ); auto & c( coilSelectionDataObjs[ index ] ); c->fanAssociatedWithCoilName = fanName; From 1c22fd3b19e353fde183857f0432270604952168 Mon Sep 17 00:00:00 2001 From: mjwitte Date: Thu, 15 Feb 2018 18:15:45 -0600 Subject: [PATCH 06/14] Coil sizing report - fix test failures 2 and build warnings --- src/EnergyPlus/HVACDXSystem.cc | 4 ++++ src/EnergyPlus/ReportCoilSelection.cc | 6 +++--- src/EnergyPlus/ReportSizingManager.cc | 4 ++-- src/EnergyPlus/SteamCoils.cc | 4 ++++ 4 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/EnergyPlus/HVACDXSystem.cc b/src/EnergyPlus/HVACDXSystem.cc index 99016a1ae8f..9b4f3531156 100644 --- a/src/EnergyPlus/HVACDXSystem.cc +++ b/src/EnergyPlus/HVACDXSystem.cc @@ -801,6 +801,10 @@ namespace HVACDXSystem { } break; } + case DataAirSystems::fanModelTypeNotYetSet: { + // do nothing + break; + } } DXCoolingSystem( DXSystemNum ).VSCoilFanInfoSet = true; } diff --git a/src/EnergyPlus/ReportCoilSelection.cc b/src/EnergyPlus/ReportCoilSelection.cc index aa568ad0795..228fff7ae1e 100644 --- a/src/EnergyPlus/ReportCoilSelection.cc +++ b/src/EnergyPlus/ReportCoilSelection.cc @@ -490,7 +490,7 @@ ReportCoilSelection::doAirLoopSetup( if ( DataAirLoop::AirToZoneNodeInfo( c->airloopNum ).NumZonesHeated > 0 ) { int zoneCount = DataAirLoop::AirToZoneNodeInfo( c->airloopNum ).NumZonesHeated; - for ( int loopZone = 1; loopZone <= DataAirLoop::AirToZoneNodeInfo( c->airloopNum ).NumZonesHeated; ++loopZone ) { + for ( int loopZone = 1; loopZone <= zoneCount; ++loopZone ) { int zoneIndex = DataAirLoop::AirToZoneNodeInfo( c->airloopNum).HeatCtrlZoneNums( loopZone ); // see if this zone is new or already in list bool found = false; @@ -802,7 +802,7 @@ ReportCoilSelection::doFinalProcessingOfCoilData() // find boiler on this plant loop and get capacity from it if ( allocated( BoilerSteam::Boiler )) { for ( int boilerIndex = 1; boilerIndex <= BoilerSteam::NumBoilers; ++boilerIndex ) { - if ( BoilerSteam::Boiler( boilerIndex ).LoopNum = c->waterLoopNum ) { // steam boiler on this loop + if ( BoilerSteam::Boiler( boilerIndex ).LoopNum == c->waterLoopNum ) { // steam boiler on this loop c->plantDesSupTemp = BoilerSteam::Boiler( boilerIndex ).TempUpLimitBoilerOut; c->plantDesRetTemp = BoilerSteam::Boiler( boilerIndex ).TempUpLimitBoilerOut - c->plantDesDeltaTemp; c->plantDesCapacity = BoilerSteam::Boiler( boilerIndex ).NomCap; @@ -880,7 +880,7 @@ ReportCoilSelection::getIndexForOrCreateDataObjFromCoilName ( } } - if ( index = -1 ) { // then did not find it + if ( index == -1 ) { // then did not find it //check if really a coil type bool found( false ); bool locIsCooling( false ); diff --git a/src/EnergyPlus/ReportSizingManager.cc b/src/EnergyPlus/ReportSizingManager.cc index 731dcd48cdc..1c2f32abe66 100644 --- a/src/EnergyPlus/ReportSizingManager.cc +++ b/src/EnergyPlus/ReportSizingManager.cc @@ -780,11 +780,11 @@ namespace ReportSizingManager { } } else { AutosizeDes = max( FinalZoneSizing( CurZoneEqNum ).DesCoolVolFlow, FinalZoneSizing( CurZoneEqNum ).DesHeatVolFlow ); - if ( AutosizeDes = FinalZoneSizing( CurZoneEqNum ).DesCoolVolFlow ) { + if ( AutosizeDes == FinalZoneSizing( CurZoneEqNum ).DesCoolVolFlow ) { if ( FinalZoneSizing( CurZoneEqNum ).CoolDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).CoolDDNum <= DataEnvironment::TotDesDays ) { DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).CoolDDNum ).Title; } - } else if ( AutosizeDes = FinalZoneSizing( CurZoneEqNum ).DesHeatVolFlow ) { + } else if ( AutosizeDes == FinalZoneSizing( CurZoneEqNum ).DesHeatVolFlow ) { if ( FinalZoneSizing( CurZoneEqNum ).HeatDDNum > 0 && FinalZoneSizing( CurZoneEqNum ).HeatDDNum <= DataEnvironment::TotDesDays ) { DDNameFanPeak = WeatherManager::DesDayInput( FinalZoneSizing( CurZoneEqNum ).HeatDDNum ).Title; } diff --git a/src/EnergyPlus/SteamCoils.cc b/src/EnergyPlus/SteamCoils.cc index 4309b16f362..00d6dbf05cc 100644 --- a/src/EnergyPlus/SteamCoils.cc +++ b/src/EnergyPlus/SteamCoils.cc @@ -839,6 +839,10 @@ namespace SteamCoils { } break; } + case DataAirSystems::fanModelTypeNotYetSet: { + // do nothing + break; + } } // if this is a zone coil From 41ab0aa07ab4b396dad2c6fe200f1fc5e8fc7fd8 Mon Sep 17 00:00:00 2001 From: Edwin Lee Date: Sat, 17 Feb 2018 20:53:35 -0600 Subject: [PATCH 07/14] Add test for zero mass flow, fix missing pointer initialization in unit tests --- src/EnergyPlus/DXCoils.cc | 6 ++++++ tst/EnergyPlus/unit/WaterCoils.unit.cc | 14 +++++++++++--- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/EnergyPlus/DXCoils.cc b/src/EnergyPlus/DXCoils.cc index 30929cb20e6..95add650cb0 100644 --- a/src/EnergyPlus/DXCoils.cc +++ b/src/EnergyPlus/DXCoils.cc @@ -10198,6 +10198,12 @@ Label50: ; InletWetBulbCalc = InletWetBulb; InletHumRatCalc = InletHumRat; + if ( AirMassFlow <= 0.00001 ) { + TotCap = 0.0; + SHR = 0.0; + return; + } + // DO WHILE (ABS(werror) .gt. Tolerance .OR. Counter == 0) // Get capacity modifying factor (function of inlet wetbulb & outside drybulb) for off-rated conditions while ( true ) { diff --git a/tst/EnergyPlus/unit/WaterCoils.unit.cc b/tst/EnergyPlus/unit/WaterCoils.unit.cc index e1231e80d43..dc4dfa0dde9 100644 --- a/tst/EnergyPlus/unit/WaterCoils.unit.cc +++ b/tst/EnergyPlus/unit/WaterCoils.unit.cc @@ -71,6 +71,7 @@ #include #include #include +#include #include #include #include @@ -216,6 +217,7 @@ TEST_F( WaterCoilsTest, WaterCoolingCoilSizing ) DataWaterLoopNum = 1; NumOfGlycols = 1; + createCoilSelectionReportObj(); SizeWaterCoil( CoilNum ); EXPECT_DOUBLE_EQ( 0.00159, WaterCoil( CoilNum ).DesAirVolFlowRate ); @@ -463,6 +465,7 @@ TEST_F( WaterCoilsTest, CoilHeatingWaterUASizing ) MySizeFlag( 1 ) = true; // run water coil sizing + createCoilSelectionReportObj(); SizeWaterCoil( CoilNum ); EXPECT_DOUBLE_EQ( 1.0, WaterCoil( CoilNum ).DesAirVolFlowRate ); @@ -615,6 +618,7 @@ TEST_F( WaterCoilsTest, CoilHeatingWaterLowAirFlowUASizing ) { MySizeFlag( 1 ) = true; // run water coil sizing + createCoilSelectionReportObj(); SizeWaterCoil( CoilNum ); EXPECT_DOUBLE_EQ( 1.0, WaterCoil( CoilNum ).DesAirVolFlowRate ); @@ -771,6 +775,7 @@ TEST_F( WaterCoilsTest, CoilHeatingWaterUASizingLowHwaterInletTemp ) MySizeFlag( 1 ) = true; // run water coil sizing + createCoilSelectionReportObj(); SizeWaterCoil( CoilNum ); EXPECT_DOUBLE_EQ( 1.0, WaterCoil( CoilNum ).DesAirVolFlowRate ); @@ -883,7 +888,8 @@ TEST_F( WaterCoilsTest, CoilCoolingWaterSimpleSizing ) NumOfGlycols = 1; // run water coil sizing - SizeWaterCoil( CoilNum ); + createCoilSelectionReportObj(); + SizeWaterCoil( CoilNum ); EXPECT_DOUBLE_EQ( 1.0, WaterCoil( CoilNum ).DesAirVolFlowRate ); Real64 DesCoilCoolingLoad = 0.0; @@ -999,7 +1005,8 @@ TEST_F( WaterCoilsTest, CoilCoolingWaterSimpleSizing ) NumOfGlycols = 1; // run water coil sizing - SizeWaterCoil( CoilNum ); + createCoilSelectionReportObj(); + SizeWaterCoil( CoilNum ); EXPECT_DOUBLE_EQ( 1.0, WaterCoil( CoilNum ).DesAirVolFlowRate ); Real64 DesCoilCoolingLoad = 0.0; @@ -1095,7 +1102,8 @@ TEST_F( WaterCoilsTest, CoilCoolingWaterSimpleSizing ) NumOfGlycols = 1; // run water coil sizing - SizeWaterCoil( CoilNum ); + createCoilSelectionReportObj(); + SizeWaterCoil( CoilNum ); EXPECT_DOUBLE_EQ( 1.0, WaterCoil( CoilNum ).DesAirVolFlowRate ); Real64 CpAirStd = 0.0; From 314cdd5a6e3045e553096b3e2fbaf5b285bed55d Mon Sep 17 00:00:00 2001 From: Brent Griffith Date: Sun, 18 Feb 2018 09:46:08 -0500 Subject: [PATCH 08/14] fix build warnings in coil sizing report --- src/EnergyPlus/ReportCoilSelection.cc | 32 ++++++++------------------- src/EnergyPlus/ReportCoilSelection.hh | 23 +++++-------------- 2 files changed, 14 insertions(+), 41 deletions(-) diff --git a/src/EnergyPlus/ReportCoilSelection.cc b/src/EnergyPlus/ReportCoilSelection.cc index 228fff7ae1e..917f86c2716 100644 --- a/src/EnergyPlus/ReportCoilSelection.cc +++ b/src/EnergyPlus/ReportCoilSelection.cc @@ -1,10 +1,8 @@ -// EnergyPlus, Copyright (c) 1996-2018, The Board of Trustees of the University of Illinois and +// EnergyPlus, Copyright (c) 1996-2018, The Board of Trustees of the University of Illinois, // The Regents of the University of California, through Lawrence Berkeley National Laboratory -// (subject to receipt of any required approvals from the U.S. Dept. of Energy). All rights -// reserved. -// -// If you have questions about your rights to use or distribute this software, please contact -// Berkeley Lab's Innovation & Partnerships Office at IPO@lbl.gov. +// (subject to receipt of any required approvals from the U.S. Dept. of Energy), Oak Ridge +// National Laboratory, managed by UT-Battelle, Alliance for Sustainable Energy, LLC, and other +// contributors. All rights reserved. // // NOTICE: This Software was developed under funding from the U.S. Department of Energy and the // U.S. Government consequently retains certain rights. As such, the U.S. Government has been @@ -35,7 +33,7 @@ // specifically required in this Section (4), Licensee shall not use in a company name, a // product name, in advertising, publicity, or other promotional activities any name, trade // name, trademark, logo, or other designation of "EnergyPlus", "E+", "e+" or confusingly -// similar designation, without Lawrence Berkeley National Laboratory's prior written consent. +// similar designation, without the U.S. Department of Energy's prior written consent. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR // IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY @@ -46,16 +44,6 @@ // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. -// -// You are under no obligation whatsoever to provide any bug fixes, patches, or upgrades to the -// features, functionality or performance of the source code ("Enhancements") to anyone; however, -// if you choose to make your Enhancements available either publicly, or directly to Lawrence -// Berkeley National Laboratory, without imposing a separate written license agreement for such -// Enhancements, then you hereby grant the following license: a non-exclusive, royalty-free -// perpetual license to install, use, modify, prepare derivative works, incorporate into other -// computer software, distribute, and sublicense such enhancements or derivative works thereof, -// in binary and source code form. - // C++ Headers #include @@ -124,8 +112,6 @@ CoilSelectionData::CoilSelectionData( //constructor coilSizingMethodConcurrence( -999 ), coilSizingMethodCapacity( -999 ), coilSizingMethodAirFlow( -999 ), - //coilDesCapUser( -999.0 ), - //coilVolFlowUser( -999.0 ), capIsAutosized( false ), volFlowIsAutosized( false ), coilWaterFlowUser( -999.0 ), @@ -177,9 +163,9 @@ CoilSelectionData::CoilSelectionData( //constructor rhoStandAir( -999.0 ), rhoFluid( -999.0 ), cpFluid( -999.0 ), + coilCapFTIdealPeak( 1.0 ), coilRatedTotCap( -999.0 ), coilRatedSensCap( -999.0 ), - coilCapFTIdealPeak( 1.0 ), // = 1 ratedAirMassFlow( -999.0 ), ratedCoilInDb( -999.0 ), ratedCoilInWb( -999.0 ), @@ -260,7 +246,7 @@ ReportCoilSelection::writeCoilSelectionOutput() } else if ( c->zoneName.size() > 1 ) { //make list of zone names std::string tmpZoneList; - for ( int vecLoop = 0; vecLoop < c->zoneName.size(); ++vecLoop ) { + for ( std::size_t vecLoop = 0; vecLoop < c->zoneName.size(); ++vecLoop ) { tmpZoneList += c->zoneName[ vecLoop ] + "; " ; } OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdchCoilZoneName, c->coilName_, tmpZoneList ); @@ -1688,7 +1674,7 @@ ReportCoilSelection::setZoneLatentLoadCoolingIdealPeak( for ( auto & c : coilSelectionDataObjs ) { if ( c->isCooling ) { - for ( int zoneInd = 0; zoneInd < c->zoneNum.size(); ++zoneInd) { + for ( std::size_t zoneInd = 0; zoneInd < c->zoneNum.size(); ++zoneInd) { if ( zoneIndex == c->zoneNum[ zoneInd ] ) { c->rmLatentAtPeak += zoneCoolingLatentLoad; break; @@ -1708,7 +1694,7 @@ ReportCoilSelection::setZoneLatentLoadHeatingIdealPeak( for ( auto & c : coilSelectionDataObjs ) { if ( c->isHeating ) { - for ( int zoneInd = 0; zoneInd < c->zoneNum.size(); ++zoneInd) { + for ( std::size_t zoneInd = 0; zoneInd < c->zoneNum.size(); ++zoneInd) { if ( zoneIndex == c->zoneNum[ zoneInd ] ) { c->rmLatentAtPeak += zoneHeatingLatentLoad; break; diff --git a/src/EnergyPlus/ReportCoilSelection.hh b/src/EnergyPlus/ReportCoilSelection.hh index 4c69174d7f9..d4d60ac25b6 100644 --- a/src/EnergyPlus/ReportCoilSelection.hh +++ b/src/EnergyPlus/ReportCoilSelection.hh @@ -1,10 +1,8 @@ -// EnergyPlus, Copyright (c) 1996-2018, The Board of Trustees of the University of Illinois and +// EnergyPlus, Copyright (c) 1996-2018, The Board of Trustees of the University of Illinois, // The Regents of the University of California, through Lawrence Berkeley National Laboratory -// (subject to receipt of any required approvals from the U.S. Dept. of Energy). All rights -// reserved. -// -// If you have questions about your rights to use or distribute this software, please contact -// Berkeley Lab's Innovation & Partnerships Office at IPO@lbl.gov. +// (subject to receipt of any required approvals from the U.S. Dept. of Energy), Oak Ridge +// National Laboratory, managed by UT-Battelle, Alliance for Sustainable Energy, LLC, and other +// contributors. All rights reserved. // // NOTICE: This Software was developed under funding from the U.S. Department of Energy and the // U.S. Government consequently retains certain rights. As such, the U.S. Government has been @@ -35,7 +33,7 @@ // specifically required in this Section (4), Licensee shall not use in a company name, a // product name, in advertising, publicity, or other promotional activities any name, trade // name, trademark, logo, or other designation of "EnergyPlus", "E+", "e+" or confusingly -// similar designation, without Lawrence Berkeley National Laboratory's prior written consent. +// similar designation, without the U.S. Department of Energy's prior written consent. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR // IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY @@ -46,15 +44,6 @@ // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. -// -// You are under no obligation whatsoever to provide any bug fixes, patches, or upgrades to the -// features, functionality or performance of the source code ("Enhancements") to anyone; however, -// if you choose to make your Enhancements available either publicly, or directly to Lawrence -// Berkeley National Laboratory, without imposing a separate written license agreement for such -// Enhancements, then you hereby grant the following license: a non-exclusive, royalty-free -// perpetual license to install, use, modify, prepare derivative works, incorporate into other -// computer software, distribute, and sublicense such enhancements or derivative works thereof, -// in binary and source code form. #ifndef ReportCoilSelection_hh_INCLUDED @@ -188,8 +177,6 @@ public: // data Real64 rhoFluid; // density of coil plant fluid [kg/m3] Real64 cpFluid; // specific heat capacity of coil plant fluid [J/kg-K] Real64 coilCapFTIdealPeak; // coil capacity multiplier at Ideal Peak conditions, func of temperature only, to the input rating point (usually for a DX coil) [W] - Real64 coilCapModFacSimPeak; // coil capacity multiplier at Simulation Peak conditions, total modification including func temp, func air flow, part load, speed etc. - //Values at rating point, reference point, nominal values for model input. Real64 coilRatedTotCap; // rated coil total capacity [W] Real64 coilRatedSensCap; // rated coil sensible capacity [W] Real64 ratedAirMassFlow; // rated coil design air mass flow rate [m3/s] From 5868641fbab5c9c28c4077d1414d9a5fd8d04e74 Mon Sep 17 00:00:00 2001 From: Brent Griffith Date: Sun, 18 Feb 2018 17:57:50 -0500 Subject: [PATCH 09/14] fix uninitialized variable build warning coil sizing report store design vol flow build warngin. --- src/EnergyPlus/SteamCoils.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/src/EnergyPlus/SteamCoils.cc b/src/EnergyPlus/SteamCoils.cc index 00d6dbf05cc..5af2a127ff1 100644 --- a/src/EnergyPlus/SteamCoils.cc +++ b/src/EnergyPlus/SteamCoils.cc @@ -714,6 +714,7 @@ namespace SteamCoils { DesCoilLoad = 0.0; MinFlowFrac = 0.0; DesMassFlow = 0.0; + DesVolFlow = 0.0; CpWater = 0.0; RhoAirStd = PsyRhoAirFnPbTdbW( StdBaroPress, 20.0, 0.0 ); CpAirStd = PsyCpAirFnWTdb( 0.0, 20.0 ); From af4fe2b7f4200bfa163e0a8770ce33a8ad564c0c Mon Sep 17 00:00:00 2001 From: mjwitte Date: Sun, 18 Feb 2018 20:22:18 -0600 Subject: [PATCH 10/14] Coil sizing report - Add new CoilSizingDetails report --- idd/Energy+.idd.in | 83 ++++++++++++++ src/EnergyPlus/OutputReportPredefined.cc | 138 +++++++++++++++++++++-- src/EnergyPlus/OutputReportPredefined.hh | 46 +++++++- src/EnergyPlus/ReportCoilSelection.cc | 79 +++++++++++++ src/EnergyPlus/ReportCoilSelection.hh | 3 + 5 files changed, 332 insertions(+), 17 deletions(-) diff --git a/idd/Energy+.idd.in b/idd/Energy+.idd.in index d601386d21a..be4fad46b81 100644 --- a/idd/Energy+.idd.in +++ b/idd/Energy+.idd.in @@ -97849,6 +97849,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -97946,6 +97947,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -98043,6 +98045,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -98140,6 +98143,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -98237,6 +98241,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -98334,6 +98339,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -98431,6 +98437,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -98528,6 +98535,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -98625,6 +98633,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -98722,6 +98731,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -98819,6 +98829,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -98916,6 +98927,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -99013,6 +99025,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -99110,6 +99123,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -99207,6 +99221,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -99304,6 +99319,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -99401,6 +99417,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -99498,6 +99515,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -99595,6 +99613,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -99692,6 +99711,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -99789,6 +99809,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -99886,6 +99907,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -99983,6 +100005,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -100080,6 +100103,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -100177,6 +100201,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -100274,6 +100299,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -100371,6 +100397,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -100468,6 +100495,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -100565,6 +100593,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -100662,6 +100691,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -100759,6 +100789,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -100856,6 +100887,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -100953,6 +100985,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -101050,6 +101083,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -101147,6 +101181,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -101244,6 +101279,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -101341,6 +101377,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -101438,6 +101475,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -101535,6 +101573,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -101632,6 +101671,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -101729,6 +101769,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -101826,6 +101867,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -101923,6 +101965,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -102020,6 +102063,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -102117,6 +102161,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -102214,6 +102259,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -102311,6 +102357,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -102408,6 +102455,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -102505,6 +102553,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -102602,6 +102651,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -102699,6 +102749,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -102796,6 +102847,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -102893,6 +102945,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -102990,6 +103043,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -103087,6 +103141,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -103184,6 +103239,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -103281,6 +103337,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -103378,6 +103435,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -103475,6 +103533,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -103572,6 +103631,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -103669,6 +103729,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -103766,6 +103827,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -103863,6 +103925,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -103960,6 +104023,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -104057,6 +104121,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -104154,6 +104219,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -104251,6 +104317,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -104348,6 +104415,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -104445,6 +104513,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -104542,6 +104611,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -104639,6 +104709,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -104736,6 +104807,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -104833,6 +104905,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -104930,6 +105003,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -105027,6 +105101,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -105124,6 +105199,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -105221,6 +105297,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -105318,6 +105395,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -105415,6 +105493,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -105512,6 +105591,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -105609,6 +105689,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -105706,6 +105787,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary @@ -105803,6 +105885,7 @@ Output:Table:SummaryReports, \key HVACSizingSummary \key SystemSummary \key ComponentSizingSummary + \key CoilSizingDetails \key OutdoorAirSummary \key ObjectCountSummary \key ComponentCostEconomicsSummary diff --git a/src/EnergyPlus/OutputReportPredefined.cc b/src/EnergyPlus/OutputReportPredefined.cc index a7cdf439cba..037ca951479 100644 --- a/src/EnergyPlus/OutputReportPredefined.cc +++ b/src/EnergyPlus/OutputReportPredefined.cc @@ -340,8 +340,9 @@ namespace OutputReportPredefined { int pdchPlantSizPkTimeHour; int pdchPlantSizPkTimeDayOfSim; int pdchPlantSizPkTimeMin; + // Coil Selection Table - int pdrCoilSummaryTable; + int pdrCoilSizingDetailsTable; int pdstCoilSummaryCoilSelection; int pdchCoilLocation; int pdchCoilHVACType; @@ -402,7 +403,6 @@ namespace OutputReportPredefined { int pdchCoilRatedLvgWaterTemp; int pdchCoilRatedWaterDeltaTemp; - int pdchFanAssociatedWithCoilName; int pdchFanAssociatedWithCoilType; int pdchFanAssociatedVdotSize; @@ -411,8 +411,6 @@ namespace OutputReportPredefined { int pdchFanHeatGainIdealPeak; int pdchCoilNetTotalCapacityIdealPeak; - - int pdchCoilPlantLoopName; int pdchPlantMassFlowMaximum; @@ -431,11 +429,9 @@ namespace OutputReportPredefined { int pdchAirSysRADryBulbIdealPeak; int pdchAirSysRAHumRatIdealPeak; - int pdchZoneAirTempIdealPeak; int pdchZoneAirDryBulbIdealPeak; int pdchZoneAirHumRatIdealPeak; int pdchZoneAirRelHumIdealPeak; -// int pdchAirSysFanHeatGain; int pdchCoilUA; int pdchZoneSensibleLoadIdealPeak; int pdchZoneLatentLoadIdealPeak; @@ -450,6 +446,45 @@ namespace OutputReportPredefined { int pdchDryAirSpecificHeat; int pdchStandRhoAir; + // Coil Sizing Summary (subset of Coil Selection Table) + int pdst2CoilSummaryCoilSelection; + int pdch2CoilName; + int pdch2CoilType; + int pdch2CoilHVACType; + int pdch2CoilHVACName; + + int pdch2CoilFinalTotalCap; + int pdch2CoilFinalSensCap; + int pdch2CoilFinalAirVolFlowRate; + int pdch2CoilFinalPlantVolFlowRate; + int pdch2CoilUA; + + int pdch2CoilDDnameSensIdealPeak; + int pdch2CoilDateTimeSensIdealPeak; + int pdch2CoilDDnameAirFlowIdealPeak; + int pdch2CoilDateTimeAirFlowIdealPeak; + int pdch2CoilTotalCapIdealPeak; + int pdch2CoilSensCapIdealPeak; + int pdch2CoilAirVolumeFlowIdealPeak; + int pdch2CoilEntDryBulbIdealPeak; + int pdch2CoilEntWetBulbIdealPeak; + int pdch2CoilEntHumRatIdealPeak; + int pdch2CoilLvgDryBulbIdealPeak; + int pdch2CoilLvgWetBulbIdealPeak; + int pdch2CoilLvgHumRatIdealPeak; + int pdch2CoilRatedTotalCap; + int pdch2CoilRatedSensCap; + + int pdch2OADryBulbIdealPeak; + int pdch2OAHumRatIdealPeak; + int pdch2OAWetBulbatIdealPeak; + int pdch2OAFlowPrcntIdealPeak; + int pdch2ZoneAirDryBulbIdealPeak; + int pdch2ZoneAirHumRatIdealPeak; + int pdch2ZoneAirRelHumIdealPeak; + int pdch2ZoneSensibleLoadIdealPeak; + int pdch2ZoneLatentLoadIdealPeak; + //System summary int pdrSystem; int pdstEconomizer; @@ -1081,7 +1116,7 @@ namespace OutputReportPredefined { pdchPlantSizPkTimeDayOfSim = 0; pdchPlantSizPkTimeMin = 0; - pdrCoilSummaryTable = 0; + pdrCoilSizingDetailsTable = 0; pdstCoilSummaryCoilSelection = 0; pdchCoilLocation = 0; pdchCoilHVACType = 0; @@ -1164,11 +1199,9 @@ namespace OutputReportPredefined { pdchOAFlowPrcntIdealPeak = 0; pdchAirSysRADryBulbIdealPeak = 0; pdchAirSysRAHumRatIdealPeak = 0; - pdchZoneAirTempIdealPeak = 0; pdchZoneAirDryBulbIdealPeak = 0; pdchZoneAirHumRatIdealPeak = 0; pdchZoneAirRelHumIdealPeak = 0; -// pdchAirSysFanHeatGain = 0; pdchCoilUA = 0; pdchZoneSensibleLoadIdealPeak = 0; pdchZoneLatentLoadIdealPeak = 0; @@ -1182,6 +1215,45 @@ namespace OutputReportPredefined { pdchDryAirSpecificHeat = 0; pdchStandRhoAir = 0; + // Coil Sizing Summary (subset of Coil Selection Table) + pdst2CoilSummaryCoilSelection = 0; + pdch2CoilName = 0; + pdch2CoilType = 0; + pdch2CoilHVACType = 0; + pdch2CoilHVACName = 0; + + pdch2CoilFinalTotalCap = 0; + pdch2CoilFinalSensCap = 0; + pdch2CoilFinalAirVolFlowRate = 0; + pdch2CoilFinalPlantVolFlowRate = 0; + pdch2CoilUA = 0; + + pdch2CoilDDnameSensIdealPeak = 0; + pdch2CoilDateTimeSensIdealPeak = 0; + pdch2CoilDDnameAirFlowIdealPeak = 0; + pdch2CoilDateTimeAirFlowIdealPeak = 0; + pdch2CoilTotalCapIdealPeak = 0; + pdch2CoilSensCapIdealPeak = 0; + pdch2CoilAirVolumeFlowIdealPeak = 0; + pdch2CoilEntDryBulbIdealPeak = 0; + pdch2CoilEntWetBulbIdealPeak = 0; + pdch2CoilEntHumRatIdealPeak = 0; + pdch2CoilLvgDryBulbIdealPeak = 0; + pdch2CoilLvgWetBulbIdealPeak = 0; + pdch2CoilLvgHumRatIdealPeak = 0; + pdch2CoilRatedTotalCap = 0; + pdch2CoilRatedSensCap = 0; + + pdch2OADryBulbIdealPeak = 0; + pdch2OAHumRatIdealPeak = 0; + pdch2OAWetBulbatIdealPeak = 0; + pdch2OAFlowPrcntIdealPeak = 0; + pdch2ZoneAirDryBulbIdealPeak = 0; + pdch2ZoneAirHumRatIdealPeak = 0; + pdch2ZoneAirRelHumIdealPeak = 0; + pdch2ZoneSensibleLoadIdealPeak = 0; + pdch2ZoneLatentLoadIdealPeak = 0; + pdrSystem = 0; pdstEconomizer = 0; pdchEcoKind = 0; @@ -1858,7 +1930,51 @@ namespace OutputReportPredefined { pdchPlantSizPkTimeHour = newPreDefColumn( pdstPlantSize, "Peak Hour Of Day {TIMESTAMP}[hr]" ); pdchPlantSizPkTimeMin = newPreDefColumn( pdstPlantSize, "Peak Step Start Minute {TIMESTAMP}[min]" ); - pdstCoilSummaryCoilSelection = newPreDefSubTable( pdrSizing, "Coil Sizing Summary Report" ); + pdst2CoilSummaryCoilSelection = newPreDefSubTable( pdrSizing, "Coil Sizing Summary Report" ); + // coil meta data information + // the first column will be the coil name, the unique user name from input. It has no header or column definition + pdch2CoilType = newPreDefColumn( pdst2CoilSummaryCoilSelection, "Coil Type" ); + pdch2CoilHVACType = newPreDefColumn( pdst2CoilSummaryCoilSelection, "HVAC Type" ); + pdch2CoilHVACName = newPreDefColumn( pdst2CoilSummaryCoilSelection, "HVAC Name" ); + + //coil Final size summary, regardless of how determined ( + pdch2CoilFinalTotalCap = newPreDefColumn( pdst2CoilSummaryCoilSelection, "Coil Final Gross Total Capacity [W]" ); + pdch2CoilFinalSensCap = newPreDefColumn( pdst2CoilSummaryCoilSelection, "Coil Final Gross Sensible Capacity [W]" ); + pdch2CoilFinalAirVolFlowRate = newPreDefColumn( pdst2CoilSummaryCoilSelection, "Coil Final Reference Air Volume Flow Rate [m3/s]" ); + pdch2CoilFinalPlantVolFlowRate = newPreDefColumn( pdst2CoilSummaryCoilSelection, "Coil Final Reference Plant Fluid Volume Flow Rate [m3/s]" ); + pdch2CoilUA = newPreDefColumn(pdst2CoilSummaryCoilSelection, "Coil U-value Times Area Value [W/K]"); + + //results from regular zone and system sizing calcs, "At Ideal Loads Peak" + pdch2CoilDDnameSensIdealPeak = newPreDefColumn( pdst2CoilSummaryCoilSelection, "Design Day Name at Sensible Ideal Loads Peak" ); + pdch2CoilDateTimeSensIdealPeak = newPreDefColumn( pdst2CoilSummaryCoilSelection, "Date/Time at Sensible Ideal Loads Peak" ); + pdch2CoilDDnameAirFlowIdealPeak = newPreDefColumn( pdst2CoilSummaryCoilSelection, "Design Day Name at Air Flow Ideal Loads Peak" ); + pdch2CoilDateTimeAirFlowIdealPeak = newPreDefColumn( pdst2CoilSummaryCoilSelection, "Date/Time at Air Flow Ideal Loads Peak" ); + + pdch2CoilTotalCapIdealPeak = newPreDefColumn( pdst2CoilSummaryCoilSelection, "Coil Total Capacity at Ideal Loads Peak [W]" ); + pdch2CoilSensCapIdealPeak = newPreDefColumn( pdst2CoilSummaryCoilSelection, "Coil Sensible Capacity at Ideal Loads Peak [W]" ); + pdch2CoilAirVolumeFlowIdealPeak = newPreDefColumn( pdst2CoilSummaryCoilSelection, "Coil Air Volume Flow Rate at Ideal Loads Peak [m3/s]" ); + pdch2CoilEntDryBulbIdealPeak = newPreDefColumn( pdst2CoilSummaryCoilSelection, "Coil Entering Air Drybulb at Ideal Loads Peak [C]" ); + pdch2CoilEntWetBulbIdealPeak = newPreDefColumn( pdst2CoilSummaryCoilSelection, "Coil Entering Air Wetbulb at Ideal Loads Peak [C]" ); + pdch2CoilEntHumRatIdealPeak = newPreDefColumn( pdst2CoilSummaryCoilSelection, "Coil Entering Air Humidity Ratio at Ideal Loads Peak [kg-H2O/kg-DryAir]" ); + pdch2CoilLvgDryBulbIdealPeak = newPreDefColumn( pdst2CoilSummaryCoilSelection, "Coil Leaving Air Drybulb at Ideal Loads Peak [C]" ); + pdch2CoilLvgWetBulbIdealPeak = newPreDefColumn( pdst2CoilSummaryCoilSelection, "Coil Leaving Air Wetbulb at Ideal Loads Peak [C]" ); + pdch2CoilLvgHumRatIdealPeak = newPreDefColumn( pdst2CoilSummaryCoilSelection, "Coil Leaving Air Humidity Ratio at Ideal Loads Peak [C]" ); + pdch2OADryBulbIdealPeak = newPreDefColumn( pdst2CoilSummaryCoilSelection, "Outdoor Air Drybulb at Ideal Loads Peak [C]" ); + pdch2OAHumRatIdealPeak = newPreDefColumn( pdst2CoilSummaryCoilSelection, "Outdoor Air Humidity Ratio at Ideal Loads Peak [kg-H2O/kg-DryAir]" ); + pdch2OAWetBulbatIdealPeak = newPreDefColumn( pdst2CoilSummaryCoilSelection,"Outdoor Air Wetbulb at Ideal Loads Peak [C]" ); + pdch2OAFlowPrcntIdealPeak = newPreDefColumn( pdst2CoilSummaryCoilSelection, "Outdoor Air Flow Percentage at Ideal Loads Peak [%]" ); + pdch2ZoneAirDryBulbIdealPeak = newPreDefColumn( pdst2CoilSummaryCoilSelection, "Zone Air Drybulb at Ideal Loads Peak [C]" ); + pdch2ZoneAirHumRatIdealPeak = newPreDefColumn( pdst2CoilSummaryCoilSelection, "Zone Air Humidity Ratio at Ideal Loads Peak [kg-H2O/kg-DryAir]" ); + pdch2ZoneAirRelHumIdealPeak = newPreDefColumn( pdst2CoilSummaryCoilSelection, "Zone Air Relative Humidity at Ideal Loads Peak [%]" ); + pdch2ZoneSensibleLoadIdealPeak = newPreDefColumn( pdst2CoilSummaryCoilSelection, "Zone Sensible Heat Gain at Ideal Loads Peak [W]" ); + pdch2ZoneLatentLoadIdealPeak = newPreDefColumn( pdst2CoilSummaryCoilSelection, "Zone Latent Heat Gain at Ideal Loads Peak [W]" ); + //results for coil at Rated Conditions + pdch2CoilRatedTotalCap = newPreDefColumn( pdst2CoilSummaryCoilSelection, "Coil Total Capacity at Rating Conditions [W]" ); + pdch2CoilRatedSensCap = newPreDefColumn( pdst2CoilSummaryCoilSelection, "Coil Sensible Capacity at Rating Conditions [W]" ); + + + pdrCoilSizingDetailsTable = newPreDefReport( "CoilSizingDetails", "Coil", "Coil Sizing Details" ); + pdstCoilSummaryCoilSelection = newPreDefSubTable( pdrCoilSizingDetailsTable, "Coils" ); // coil meta data information // the first column will be the coil name, the unique user name from input. It has no header or column definition pdchCoilType = newPreDefColumn( pdstCoilSummaryCoilSelection, "Coil Type" ); @@ -1883,8 +1999,6 @@ namespace OutputReportPredefined { pdchCoilFinalAirVolFlowRate = newPreDefColumn( pdstCoilSummaryCoilSelection, "Coil Final Reference Air Volume Flow Rate [m3/s]" ); pdchCoilFinalPlantVolFlowRate = newPreDefColumn( pdstCoilSummaryCoilSelection, "Coil Final Reference Plant Fluid Volume Flow Rate [m3/s]" ); - - //Misc Design output pdchCoilUA = newPreDefColumn(pdstCoilSummaryCoilSelection, "Coil U-value Times Area Value [W/K]"); pdchReheatCoilMultiplier = newPreDefColumn(pdstCoilSummaryCoilSelection, "Terminal Unit Reheat Coil Multiplier"); diff --git a/src/EnergyPlus/OutputReportPredefined.hh b/src/EnergyPlus/OutputReportPredefined.hh index 8d5434ed236..1e6ff241fe6 100644 --- a/src/EnergyPlus/OutputReportPredefined.hh +++ b/src/EnergyPlus/OutputReportPredefined.hh @@ -332,8 +332,8 @@ namespace OutputReportPredefined { extern int pdchPlantSizPkTimeHour; extern int pdchPlantSizPkTimeMin; - // Coil Selection Table - extern int pdrCoilSummaryTable; + // Coil Sizing Details + extern int pdrCoilSizingDetailsTable; extern int pdstCoilSummaryCoilSelection; extern int pdchCoilName; extern int pdchCoilLocation; @@ -390,7 +390,6 @@ namespace OutputReportPredefined { extern int pdchCoilRatedLvgHumRat; extern int pdchCoilRatedLvgEnthalpy; - extern int pdchFanAssociatedWithCoilName; extern int pdchFanAssociatedWithCoilType; extern int pdchFanAssociatedVdotSize; @@ -413,7 +412,6 @@ namespace OutputReportPredefined { extern int pdchOAFlowPrcntIdealPeak; extern int pdchAirSysRADryBulbIdealPeak; extern int pdchAirSysRAHumRatIdealPeak; - extern int pdchZoneAirTempIdealPeak; extern int pdchZoneAirDryBulbIdealPeak; extern int pdchZoneAirHumRatIdealPeak; extern int pdchZoneAirRelHumIdealPeak; @@ -431,7 +429,45 @@ namespace OutputReportPredefined { extern int pdchMoistAirSpecificHeat; extern int pdchDryAirSpecificHeat; extern int pdchStandRhoAir; - // CoilSelectin Table + + // Coil Sizing Summary (subset of Coil Selection Table) + extern int pdst2CoilSummaryCoilSelection; + extern int pdch2CoilName; + extern int pdch2CoilType; + extern int pdch2CoilHVACType; + extern int pdch2CoilHVACName; + + extern int pdch2CoilFinalTotalCap; + extern int pdch2CoilFinalSensCap; + extern int pdch2CoilFinalAirVolFlowRate; + extern int pdch2CoilFinalPlantVolFlowRate; + extern int pdch2CoilUA; + + extern int pdch2CoilDDnameSensIdealPeak; + extern int pdch2CoilDateTimeSensIdealPeak; + extern int pdch2CoilDDnameAirFlowIdealPeak; + extern int pdch2CoilDateTimeAirFlowIdealPeak; + extern int pdch2CoilTotalCapIdealPeak; + extern int pdch2CoilSensCapIdealPeak; + extern int pdch2CoilAirVolumeFlowIdealPeak; + extern int pdch2CoilEntDryBulbIdealPeak; + extern int pdch2CoilEntWetBulbIdealPeak; + extern int pdch2CoilEntHumRatIdealPeak; + extern int pdch2CoilLvgDryBulbIdealPeak; + extern int pdch2CoilLvgWetBulbIdealPeak; + extern int pdch2CoilLvgHumRatIdealPeak; + extern int pdch2CoilRatedTotalCap; + extern int pdch2CoilRatedSensCap; + + extern int pdch2OADryBulbIdealPeak; + extern int pdch2OAHumRatIdealPeak; + extern int pdch2OAWetBulbatIdealPeak; + extern int pdch2OAFlowPrcntIdealPeak; + extern int pdch2ZoneAirDryBulbIdealPeak; + extern int pdch2ZoneAirHumRatIdealPeak; + extern int pdch2ZoneAirRelHumIdealPeak; + extern int pdch2ZoneSensibleLoadIdealPeak; + extern int pdch2ZoneLatentLoadIdealPeak; //System summary extern int pdrSystem; diff --git a/src/EnergyPlus/ReportCoilSelection.cc b/src/EnergyPlus/ReportCoilSelection.cc index 917f86c2716..fdc62ed720a 100644 --- a/src/EnergyPlus/ReportCoilSelection.cc +++ b/src/EnergyPlus/ReportCoilSelection.cc @@ -228,6 +228,7 @@ ReportCoilSelection::finishCoilSummaryReportTable() { doFinalProcessingOfCoilData(); writeCoilSelectionOutput(); + writeCoilSelectionOutput2(); } void @@ -424,6 +425,84 @@ ReportCoilSelection::writeCoilSelectionOutput() } } +void +ReportCoilSelection::writeCoilSelectionOutput2() +{ + + // make calls to fill out predefined tabular report entries for each coil selection report object + for ( auto & c : coilSelectionDataObjs ) { + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdch2CoilType, c->coilName_, c->coilObjName ); + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdch2CoilHVACType, c->coilName_, c->typeHVACname ); + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdch2CoilHVACName, c->coilName_, c->userNameforHVACsystem ); + + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdch2CoilFinalTotalCap, c->coilName_, c->coilTotCapFinal, 3 ); + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdch2CoilFinalSensCap, c->coilName_, c->coilSensCapFinal, 3 ); + if ( c->coilRefAirVolFlowFinal == -999.0 || c->coilRefAirVolFlowFinal == -99999.0 ) { + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdch2CoilFinalAirVolFlowRate, c->coilName_, c->coilRefAirVolFlowFinal, 1 ); + } else { + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdch2CoilFinalAirVolFlowRate, c->coilName_, c->coilRefAirVolFlowFinal, 6 ); + } + + if ( c->coilRefWaterVolFlowFinal == -999.0 || c->coilRefWaterVolFlowFinal == -99999.0 ) { + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdch2CoilFinalPlantVolFlowRate, c->coilName_, c->coilRefWaterVolFlowFinal, 1 ); + } else { + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdch2CoilFinalPlantVolFlowRate, c->coilName_, c->coilRefWaterVolFlowFinal, 8 ); + } + + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdch2CoilDDnameSensIdealPeak, c->coilName_, c->desDayNameAtSensPeak ); + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdch2CoilDateTimeSensIdealPeak, c->coilName_, c->coilSensePeakHrMin ); + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdch2CoilDDnameAirFlowIdealPeak, c->coilName_, c->desDayNameAtAirFlowPeak ); + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdch2CoilDateTimeAirFlowIdealPeak, c->coilName_, c->airPeakHrMin ); + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdch2CoilTotalCapIdealPeak, c->coilName_, c->coilTotCapAtPeak, 2 ); + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdch2CoilSensCapIdealPeak, c->coilName_, c->coilSensCapAtPeak, 2 ); + if ( c->coilDesVolFlow == -999.0 || c->coilDesVolFlow == -99999.0 ) { + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdch2CoilAirVolumeFlowIdealPeak, c->coilName_, c->coilDesVolFlow, 1 ); + } else { + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdch2CoilAirVolumeFlowIdealPeak, c->coilName_, c->coilDesVolFlow, 6 ); + } + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdch2CoilEntDryBulbIdealPeak, c->coilName_, c->coilDesEntTemp, 2 ); + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdch2CoilEntWetBulbIdealPeak, c->coilName_, c->coilDesEntWetBulb, 2 ); + if ( c->coilDesEntHumRat == -999.0 || c->coilDesEntHumRat == -99999.0 ) { + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdch2CoilEntHumRatIdealPeak, c->coilName_, c->coilDesEntHumRat, 1 ); + } else { + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdch2CoilEntHumRatIdealPeak, c->coilName_, c->coilDesEntHumRat, 8 ); + } + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdch2CoilLvgDryBulbIdealPeak, c->coilName_, c->coilDesLvgTemp, 2 ); + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdch2CoilLvgWetBulbIdealPeak, c->coilName_, c->coilDesLvgWetBulb, 2 ); + if ( c->coilDesLvgHumRat == -999.0 || c->coilDesLvgHumRat == -99999.0 ) { + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdch2CoilLvgHumRatIdealPeak, c->coilName_, c->coilDesLvgHumRat, 1 ); + } else { + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdch2CoilLvgHumRatIdealPeak, c->coilName_, c->coilDesLvgHumRat, 8 ); + } + + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdch2CoilRatedTotalCap, c->coilName_, c->coilRatedTotCap, 2 ); + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdch2CoilRatedSensCap, c->coilName_, c->coilRatedSensCap, 2 ); + + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdch2OADryBulbIdealPeak, c->coilName_, c->oaPeakTemp, 2 ); + if ( c->oaPeakHumRat == -999.0 || c->oaPeakHumRat == -99999.0 ) { + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdch2OAHumRatIdealPeak, c->coilName_, c->oaPeakHumRat, 1 ); + } else { + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdch2OAHumRatIdealPeak, c->coilName_, c->oaPeakHumRat, 8 ); + } + + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdch2OAWetBulbatIdealPeak, c->coilName_, c->oaPeakWetBulb, 2 ); + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdch2OAFlowPrcntIdealPeak, c->coilName_, c->oaPeakVolFrac, 4 ); + + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdch2ZoneAirDryBulbIdealPeak, c->coilName_, c->rmPeakTemp, 2 ); + if ( c->rmPeakHumRat == -999.0 || c->rmPeakHumRat == -99999.0 ) { + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdch2ZoneAirHumRatIdealPeak, c->coilName_, c->rmPeakHumRat, 1 ); + } else { + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdch2ZoneAirHumRatIdealPeak, c->coilName_, c->rmPeakHumRat, 8 ); + } + + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdch2ZoneAirRelHumIdealPeak, c->coilName_, c->rmPeakRelHum, 4 ); + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdch2CoilUA, c->coilName_, c->coilUA, 3 ); + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdch2ZoneSensibleLoadIdealPeak, c->coilName_, c->rmSensibleAtPeak, 2 ); + OutputReportPredefined::PreDefTableEntry( OutputReportPredefined::pdch2ZoneLatentLoadIdealPeak, c->coilName_, c->rmLatentAtPeak ); + + } +} + void ReportCoilSelection::setCoilFinalSizes( std::string const & coilName, // user-defined name of the coil diff --git a/src/EnergyPlus/ReportCoilSelection.hh b/src/EnergyPlus/ReportCoilSelection.hh index d4d60ac25b6..6ef39e17f83 100644 --- a/src/EnergyPlus/ReportCoilSelection.hh +++ b/src/EnergyPlus/ReportCoilSelection.hh @@ -460,6 +460,9 @@ private: // methods void writeCoilSelectionOutput(); + void + writeCoilSelectionOutput2(); + int getIndexForOrCreateDataObjFromCoilName ( std::string const & coilName, // user-defined name of the coil From 57a0055f560e70dbde62339230f7acf3c0907a93 Mon Sep 17 00:00:00 2001 From: mjwitte Date: Sun, 18 Feb 2018 20:31:49 -0600 Subject: [PATCH 11/14] Coil sizing report - Revert water coil fixes causing diffs --- src/EnergyPlus/WaterCoils.cc | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/EnergyPlus/WaterCoils.cc b/src/EnergyPlus/WaterCoils.cc index 402f969e7fe..e02c54d3b89 100644 --- a/src/EnergyPlus/WaterCoils.cc +++ b/src/EnergyPlus/WaterCoils.cc @@ -1925,7 +1925,6 @@ namespace WaterCoils { DataDesInletWaterTemp = WaterCoil( CoilNum ).DesInletWaterTemp; // used for warning messages DataDesInletAirHumRat = WaterCoil( CoilNum ).DesInletAirHumRat; TempSize = WaterCoil( CoilNum ).DesOutletAirTemp; - TempSize = AutoSize; RequestSizing( CompType, CompName, CoolingWaterDesAirOutletTempSizing, SizingString, TempSize, bPRINT, RoutineName ); WaterCoil( CoilNum ).DesOutletAirTemp = TempSize; DataDesOutletAirTemp = TempSize; @@ -1941,7 +1940,6 @@ namespace WaterCoils { SizingString = WaterCoilNumericFields( CoilNum ).FieldNames( FieldNum ); // + " [kgWater/kgDryAir]"; DataFlowUsedForSizing = DataAirFlowUsedForSizing; TempSize = WaterCoil( CoilNum ).DesInletAirHumRat; - TempSize = AutoSize; RequestSizing( CompType, CompName, CoolingWaterDesAirInletHumRatSizing, SizingString, TempSize, bPRINT, RoutineName ); WaterCoil( CoilNum ).DesInletAirHumRat = TempSize; } @@ -2205,7 +2203,6 @@ namespace WaterCoils { WaterCoil( CoilNum ).InletAirTemp = TempSize; TempSize = AutoSize; // these data are initially 0, set to autosize to receive a result from RequestSizing RequestSizing( CompType, CompName, HeatingCoilDesAirInletHumRatSizing, SizingString, TempSize, bPRINT, RoutineName ); - WaterCoil( CoilNum ).DesInletAirHumRat = TempSize; //coil report WaterCoil( CoilNum ).InletAirHumRat = TempSize; TempSize = AutoSize; // these data are initially 0, set to autosize to receive a result from RequestSizing RequestSizing( CompType, CompName, HeatingAirflowUASizing, SizingString, TempSize, bPRINT, RoutineName ); @@ -2218,7 +2215,6 @@ namespace WaterCoils { WaterCoil( CoilNum ).InletAirTemp = TempSize; TempSize = AutoSize; // these data are initially 0, set to autosize to receive a result from RequestSizing RequestSizing( CompType, CompName, HeatingWaterDesAirInletHumRatSizing, SizingString, TempSize, bPRINT, RoutineName ); - WaterCoil( CoilNum ).DesInletAirHumRat = TempSize; //coil report WaterCoil( CoilNum ).InletAirHumRat = TempSize; TempSize = AutoSize; // these data are initially 0, set to autosize to receive a result from RequestSizing RequestSizing( CompType, CompName, HeatingAirflowUASizing, SizingString, TempSize, bPRINT, RoutineName ); From b20c099cafc654d719984f9c364cbe36519112bb Mon Sep 17 00:00:00 2001 From: mjwitte Date: Tue, 20 Feb 2018 14:06:14 -0600 Subject: [PATCH 12/14] Coil sizing report - fix merge mistake --- src/EnergyPlus/DataSizing.hh | 1 - 1 file changed, 1 deletion(-) diff --git a/src/EnergyPlus/DataSizing.hh b/src/EnergyPlus/DataSizing.hh index b2dfa54ad37..e58cf54ca40 100644 --- a/src/EnergyPlus/DataSizing.hh +++ b/src/EnergyPlus/DataSizing.hh @@ -1187,7 +1187,6 @@ namespace DataSizing { CoolCapControl( 0 ), // wfb sysSizeHeatingDominant( false ), sysSizeCoolingDominant( false ), - CoolCapControl( 0 ), // wfb CoinCoolCoilMassFlow( 0.0 ), CoinHeatCoilMassFlow( 0.0 ), DesCoolCoilVolFlow( 0.0 ), From 6bb8d01a632c8a69ff06093d555ccb632d23e68f Mon Sep 17 00:00:00 2001 From: mjwitte Date: Tue, 20 Feb 2018 14:09:55 -0600 Subject: [PATCH 13/14] Coil sizing report - minor title change and add output rules --- src/EnergyPlus/OutputReportPredefined.cc | 2 +- .../OutputRulesFiles/OutputChanges8-8-0-to-8-9-0.md | 9 ++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/EnergyPlus/OutputReportPredefined.cc b/src/EnergyPlus/OutputReportPredefined.cc index 790212916e0..02e84e9f9be 100644 --- a/src/EnergyPlus/OutputReportPredefined.cc +++ b/src/EnergyPlus/OutputReportPredefined.cc @@ -1956,7 +1956,7 @@ namespace OutputReportPredefined { pdchPlantSizPkTimeHour = newPreDefColumn( pdstPlantSize, "Peak Hour Of Day {TIMESTAMP}[hr]" ); pdchPlantSizPkTimeMin = newPreDefColumn( pdstPlantSize, "Peak Step Start Minute {TIMESTAMP}[min]" ); - pdst2CoilSummaryCoilSelection = newPreDefSubTable( pdrSizing, "Coil Sizing Summary Report" ); + pdst2CoilSummaryCoilSelection = newPreDefSubTable( pdrSizing, "Coil Sizing Summary" ); // coil meta data information // the first column will be the coil name, the unique user name from input. It has no header or column definition pdch2CoilType = newPreDefColumn( pdst2CoilSummaryCoilSelection, "Coil Type" ); diff --git a/src/Transition/OutputRulesFiles/OutputChanges8-8-0-to-8-9-0.md b/src/Transition/OutputRulesFiles/OutputChanges8-8-0-to-8-9-0.md index 0f21e14a3ee..2cc6b968153 100644 --- a/src/Transition/OutputRulesFiles/OutputChanges8-8-0-to-8-9-0.md +++ b/src/Transition/OutputRulesFiles/OutputChanges8-8-0-to-8-9-0.md @@ -14,7 +14,7 @@ External Shading Calculation Method, Output External Shading Calculation Results See [6390](https://github.com/NREL/EnergyPlus/pull/6390) -### System Sizing New Outputs +### New System Sizing Outputs A part of a system sizing refactor which includes bug fixes for Std 62.1 sizing, there are several new component sizing outputs that appear in every file with an airloop: ``` @@ -30,3 +30,10 @@ Component Sizing Information, AirLoopHVAC, VAV SYS 1, Calculated Heating Air Flo See [6372](https://github.com/NREL/EnergyPlus/pull/6372) +### New Coil Sizing Reports + +A new subtable "Coil Sizing Summary" has been added at the end of the "HVAC Sizing Summary" (HVACSizingSummary) report. This new subtable is always produced with this report. + +A new "Coils Sizing Details" (CoilSizingDetails) report has been added. It is an optional report which is included with AllSummary*. The new report has over 80 columns of data. The "Coil Sizing Summary" subtable described above is a straight subset of this report with only about 30 columns. + +See [6454](https://github.com/NREL/EnergyPlus/pull/6454) From bb00e38352c1e0d7fab049a1db3e2806932a5e84 Mon Sep 17 00:00:00 2001 From: mjwitte Date: Tue, 20 Feb 2018 15:07:55 -0600 Subject: [PATCH 14/14] Coil sizing report - fix units warnings --- src/EnergyPlus/OutputReportPredefined.cc | 30 ++++++++++++------------ 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/src/EnergyPlus/OutputReportPredefined.cc b/src/EnergyPlus/OutputReportPredefined.cc index 02e84e9f9be..6138aed1cba 100644 --- a/src/EnergyPlus/OutputReportPredefined.cc +++ b/src/EnergyPlus/OutputReportPredefined.cc @@ -1981,16 +1981,16 @@ namespace OutputReportPredefined { pdch2CoilAirVolumeFlowIdealPeak = newPreDefColumn( pdst2CoilSummaryCoilSelection, "Coil Air Volume Flow Rate at Ideal Loads Peak [m3/s]" ); pdch2CoilEntDryBulbIdealPeak = newPreDefColumn( pdst2CoilSummaryCoilSelection, "Coil Entering Air Drybulb at Ideal Loads Peak [C]" ); pdch2CoilEntWetBulbIdealPeak = newPreDefColumn( pdst2CoilSummaryCoilSelection, "Coil Entering Air Wetbulb at Ideal Loads Peak [C]" ); - pdch2CoilEntHumRatIdealPeak = newPreDefColumn( pdst2CoilSummaryCoilSelection, "Coil Entering Air Humidity Ratio at Ideal Loads Peak [kg-H2O/kg-DryAir]" ); + pdch2CoilEntHumRatIdealPeak = newPreDefColumn( pdst2CoilSummaryCoilSelection, "Coil Entering Air Humidity Ratio at Ideal Loads Peak [KGWATER/KGDRYAIR]" ); pdch2CoilLvgDryBulbIdealPeak = newPreDefColumn( pdst2CoilSummaryCoilSelection, "Coil Leaving Air Drybulb at Ideal Loads Peak [C]" ); pdch2CoilLvgWetBulbIdealPeak = newPreDefColumn( pdst2CoilSummaryCoilSelection, "Coil Leaving Air Wetbulb at Ideal Loads Peak [C]" ); pdch2CoilLvgHumRatIdealPeak = newPreDefColumn( pdst2CoilSummaryCoilSelection, "Coil Leaving Air Humidity Ratio at Ideal Loads Peak [C]" ); pdch2OADryBulbIdealPeak = newPreDefColumn( pdst2CoilSummaryCoilSelection, "Outdoor Air Drybulb at Ideal Loads Peak [C]" ); - pdch2OAHumRatIdealPeak = newPreDefColumn( pdst2CoilSummaryCoilSelection, "Outdoor Air Humidity Ratio at Ideal Loads Peak [kg-H2O/kg-DryAir]" ); + pdch2OAHumRatIdealPeak = newPreDefColumn( pdst2CoilSummaryCoilSelection, "Outdoor Air Humidity Ratio at Ideal Loads Peak [KGWATER/KGDRYAIR]" ); pdch2OAWetBulbatIdealPeak = newPreDefColumn( pdst2CoilSummaryCoilSelection,"Outdoor Air Wetbulb at Ideal Loads Peak [C]" ); pdch2OAFlowPrcntIdealPeak = newPreDefColumn( pdst2CoilSummaryCoilSelection, "Outdoor Air Flow Percentage at Ideal Loads Peak [%]" ); pdch2ZoneAirDryBulbIdealPeak = newPreDefColumn( pdst2CoilSummaryCoilSelection, "Zone Air Drybulb at Ideal Loads Peak [C]" ); - pdch2ZoneAirHumRatIdealPeak = newPreDefColumn( pdst2CoilSummaryCoilSelection, "Zone Air Humidity Ratio at Ideal Loads Peak [kg-H2O/kg-DryAir]" ); + pdch2ZoneAirHumRatIdealPeak = newPreDefColumn( pdst2CoilSummaryCoilSelection, "Zone Air Humidity Ratio at Ideal Loads Peak [KGWATER/KGDRYAIR]" ); pdch2ZoneAirRelHumIdealPeak = newPreDefColumn( pdst2CoilSummaryCoilSelection, "Zone Air Relative Humidity at Ideal Loads Peak [%]" ); pdch2ZoneSensibleLoadIdealPeak = newPreDefColumn( pdst2CoilSummaryCoilSelection, "Zone Sensible Heat Gain at Ideal Loads Peak [W]" ); pdch2ZoneLatentLoadIdealPeak = newPreDefColumn( pdst2CoilSummaryCoilSelection, "Zone Latent Heat Gain at Ideal Loads Peak [W]" ); @@ -2048,7 +2048,7 @@ namespace OutputReportPredefined { pdchPlantMassFlowMaximum = newPreDefColumn( pdstCoilSummaryCoilSelection, "Plant Maximum Fluid Mass Flow Rate [kg/s]" ); pdchPlantRetTempDesign = newPreDefColumn( pdstCoilSummaryCoilSelection, "Plant Design Fluid Return Temperature [C]" ); pdchPlantSupTempDesign = newPreDefColumn( pdstCoilSummaryCoilSelection, "Plant Design Fluid Supply Temperature [C]" ); - pdchPlantDeltaTempDesign = newPreDefColumn( pdstCoilSummaryCoilSelection, "Plant Design Fluid Temperature Difference [Delta C]" ); + pdchPlantDeltaTempDesign = newPreDefColumn( pdstCoilSummaryCoilSelection, "Plant Design Fluid Temperature Difference [deltaC]" ); pdchPlantCapacity = newPreDefColumn( pdstCoilSummaryCoilSelection, "Plant Design Capacity [W]" ); pdchCoilCapPrcntPlantCapacity = newPreDefColumn( pdstCoilSummaryCoilSelection, "Coil Capacity Percentage of Plant Design Capacity [%]" ); pdchCoilFlowPrcntPlantFlow = newPreDefColumn( pdstCoilSummaryCoilSelection, "Coil Fluid Flow Rate Percentage of Plant Design Flow Rate [%]" ); @@ -2068,27 +2068,27 @@ namespace OutputReportPredefined { pdchCoilAirVolumeFlowIdealPeak = newPreDefColumn( pdstCoilSummaryCoilSelection, "Coil Air Volume Flow Rate at Ideal Loads Peak [m3/s]" ); pdchCoilEntDryBulbIdealPeak = newPreDefColumn( pdstCoilSummaryCoilSelection, "Coil Entering Air Drybulb at Ideal Loads Peak [C]" ); pdchCoilEntWetBulbIdealPeak = newPreDefColumn( pdstCoilSummaryCoilSelection, "Coil Entering Air Wetbulb at Ideal Loads Peak [C]" ); - pdchCoilEntHumRatIdealPeak = newPreDefColumn( pdstCoilSummaryCoilSelection, "Coil Entering Air Humidity Ratio at Ideal Loads Peak [kg-H2O/kg-DryAir]" ); - pdchCoilEntEnthalpyIdealPeak = newPreDefColumn( pdstCoilSummaryCoilSelection, "Coil Entering Air Enthalpy at Ideal Loads Peak [J/(kg-C)]" ); + pdchCoilEntHumRatIdealPeak = newPreDefColumn( pdstCoilSummaryCoilSelection, "Coil Entering Air Humidity Ratio at Ideal Loads Peak [KGWATER/KGDRYAIR]" ); + pdchCoilEntEnthalpyIdealPeak = newPreDefColumn( pdstCoilSummaryCoilSelection, "Coil Entering Air Enthalpy at Ideal Loads Peak [J/KG-K]" ); pdchCoilLvgDryBulbIdealPeak = newPreDefColumn( pdstCoilSummaryCoilSelection, "Coil Leaving Air Drybulb at Ideal Loads Peak [C]" ); pdchCoilLvgWetBulbIdealPeak = newPreDefColumn( pdstCoilSummaryCoilSelection, "Coil Leaving Air Wetbulb at Ideal Loads Peak [C]" ); pdchCoilLvgHumRatIdealPeak = newPreDefColumn( pdstCoilSummaryCoilSelection, "Coil Leaving Air Humidity Ratio at Ideal Loads Peak [C]" ); - pdchCoilLvgEnthalpyIdealPeak = newPreDefColumn( pdstCoilSummaryCoilSelection, "Coil Leaving Air Enthalpy at Ideal Loads Peak [J/(kg-C)]" ); + pdchCoilLvgEnthalpyIdealPeak = newPreDefColumn( pdstCoilSummaryCoilSelection, "Coil Leaving Air Enthalpy at Ideal Loads Peak [J/KG-K]" ); pdchCoilWaterMassFlowIdealPeak = newPreDefColumn( pdstCoilSummaryCoilSelection, "Coil Plant Fluid Mass Flow Rate at Ideal Loads Peak [kg/s]" ); pdchCoilEntWaterTempIdealPeak = newPreDefColumn( pdstCoilSummaryCoilSelection, "Coil Entering Plant Fluid Temperature at Ideal Loads Peak [C]" ); pdchCoilLvgWaterTempIdealPeak = newPreDefColumn( pdstCoilSummaryCoilSelection, "Coil Leaving Plant Fluid Temperature at Ideal Loads Peak [C]" ); - pdchCoilWaterDeltaTempIdealPeak = newPreDefColumn( pdstCoilSummaryCoilSelection, "Coil Plant Fluid Temperature Difference at Ideal Loads Peak [Delta C]" ); + pdchCoilWaterDeltaTempIdealPeak = newPreDefColumn( pdstCoilSummaryCoilSelection, "Coil Plant Fluid Temperature Difference at Ideal Loads Peak [deltaC]" ); pdchFanHeatGainIdealPeak = newPreDefColumn( pdstCoilSummaryCoilSelection, "Supply Fan Air Heat Gain at Ideal Loads Peak [W]" ); pdchCoilNetTotalCapacityIdealPeak = newPreDefColumn( pdstCoilSummaryCoilSelection, "Coil and Fan Net Total Capacity at Ideal Loads Peak [W]" ); pdchOADryBulbIdealPeak = newPreDefColumn( pdstCoilSummaryCoilSelection, "Outdoor Air Drybulb at Ideal Loads Peak [C]" ); - pdchOAHumRatIdealPeak = newPreDefColumn( pdstCoilSummaryCoilSelection, "Outdoor Air Humidity Ratio at Ideal Loads Peak [kg-H2O/kg-DryAir]" ); + pdchOAHumRatIdealPeak = newPreDefColumn( pdstCoilSummaryCoilSelection, "Outdoor Air Humidity Ratio at Ideal Loads Peak [KGWATER/KGDRYAIR]" ); pdchOAWetBulbatIdealPeak = newPreDefColumn( pdstCoilSummaryCoilSelection,"Outdoor Air Wetbulb at Ideal Loads Peak [C]" ); pdchOAVolFlowIdealPeak = newPreDefColumn( pdstCoilSummaryCoilSelection, "Outdoor Air Volume Flow Rate at Ideal Loads Peak [m3/s]" ); pdchOAFlowPrcntIdealPeak = newPreDefColumn( pdstCoilSummaryCoilSelection, "Outdoor Air Flow Percentage at Ideal Loads Peak [%]" ); pdchAirSysRADryBulbIdealPeak = newPreDefColumn( pdstCoilSummaryCoilSelection, "System Return Air Drybulb at Ideal Loads Peak [C]" ); - pdchAirSysRAHumRatIdealPeak = newPreDefColumn( pdstCoilSummaryCoilSelection, "System Return Air Humidity Ratio at Ideal Loads Peak [kg-H2O/kg-DryAir]" ); + pdchAirSysRAHumRatIdealPeak = newPreDefColumn( pdstCoilSummaryCoilSelection, "System Return Air Humidity Ratio at Ideal Loads Peak [KGWATER/KGDRYAIR]" ); pdchZoneAirDryBulbIdealPeak = newPreDefColumn( pdstCoilSummaryCoilSelection, "Zone Air Drybulb at Ideal Loads Peak [C]" ); - pdchZoneAirHumRatIdealPeak = newPreDefColumn( pdstCoilSummaryCoilSelection, "Zone Air Humidity Ratio at Ideal Loads Peak [kg-H2O/kg-DryAir]" ); + pdchZoneAirHumRatIdealPeak = newPreDefColumn( pdstCoilSummaryCoilSelection, "Zone Air Humidity Ratio at Ideal Loads Peak [KGWATER/KGDRYAIR]" ); pdchZoneAirRelHumIdealPeak = newPreDefColumn( pdstCoilSummaryCoilSelection, "Zone Air Relative Humidity at Ideal Loads Peak [%]" ); pdchZoneSensibleLoadIdealPeak = newPreDefColumn( pdstCoilSummaryCoilSelection, "Zone Sensible Heat Gain at Ideal Loads Peak [W]" ); pdchZoneLatentLoadIdealPeak = newPreDefColumn( pdstCoilSummaryCoilSelection, "Zone Latent Heat Gain at Ideal Loads Peak [W]" ); @@ -2099,12 +2099,12 @@ namespace OutputReportPredefined { pdchCoilRatedAirMass = newPreDefColumn( pdstCoilSummaryCoilSelection, "Coil Air Mass Flow Rate at Rating Conditions [kg/s]" ); pdchCoilRatedEntDryBulb = newPreDefColumn( pdstCoilSummaryCoilSelection, "Coil Entering Air Drybulb at Rating Conditions [C]" ); pdchCoilRatedEntWetBulb = newPreDefColumn( pdstCoilSummaryCoilSelection, "Coil Entering Air Wetbulb at Rating Conditions [C]" ); - pdchCoilRatedEntHumRat = newPreDefColumn( pdstCoilSummaryCoilSelection, "Coil Entering Air Humidity Ratio at Rating Conditions [kg-H20/kg-DryAir]" ); - pdchCoilRatedEntEnthalpy = newPreDefColumn( pdstCoilSummaryCoilSelection, "Coil Entering Air Enthalpy at Rating Conditions [J/(kg-C)]" ); + pdchCoilRatedEntHumRat = newPreDefColumn( pdstCoilSummaryCoilSelection, "Coil Entering Air Humidity Ratio at Rating Conditions [KGWATER/KGDRYAIR]" ); + pdchCoilRatedEntEnthalpy = newPreDefColumn( pdstCoilSummaryCoilSelection, "Coil Entering Air Enthalpy at Rating Conditions [J/KG-K]" ); pdchCoilRatedLvgDryBulb = newPreDefColumn( pdstCoilSummaryCoilSelection, "Coil Leaving Air Drybulb at Rating Conditions [C]" ); pdchCoilRatedLvgWetBulb = newPreDefColumn( pdstCoilSummaryCoilSelection, "Coil Leaving Air Wetbulb at Rating Conditions [C]" ); - pdchCoilRatedLvgHumRat = newPreDefColumn( pdstCoilSummaryCoilSelection, "Coil Leaving Air Humidity Ratio at Rating Conditions [kg-H20/kg-DryAir]" ); - pdchCoilRatedLvgEnthalpy = newPreDefColumn( pdstCoilSummaryCoilSelection, "Coil Leaving Air Enthalpy at Rating Conditions [J/(kg-C)]" ); + pdchCoilRatedLvgHumRat = newPreDefColumn( pdstCoilSummaryCoilSelection, "Coil Leaving Air Humidity Ratio at Rating Conditions [KGWATER/KGDRYAIR]" ); + pdchCoilRatedLvgEnthalpy = newPreDefColumn( pdstCoilSummaryCoilSelection, "Coil Leaving Air Enthalpy at Rating Conditions [J/KG-K]" ); // System Summary Report