diff --git a/src/EnergyPlus/SingleDuct.cc b/src/EnergyPlus/SingleDuct.cc index c5fd062b64b..59e570811bd 100644 --- a/src/EnergyPlus/SingleDuct.cc +++ b/src/EnergyPlus/SingleDuct.cc @@ -2877,9 +2877,14 @@ void SingleDuctAirTerminal::SizeSys(EnergyPlusData &state) CheckZoneSizing(state, this->sysType, this->SysName); - Real64 heatingMaxFlow = (this->DamperHeatingAction == Action::ReverseWithLimits) - ? state.dataSize->TermUnitFinalZoneSizing(state.dataSize->CurTermUnitSizingNum).DesHeatVolFlowMax - : state.dataSize->TermUnitFinalZoneSizing(state.dataSize->CurTermUnitSizingNum).DesHeatVolFlow; + Real64 heatingMaxFlow; + if (this->DamperHeatingAction == Action::ReverseWithLimits && + state.dataSize->TermUnitFinalZoneSizing(state.dataSize->CurTermUnitSizingNum).DesHeatVolFlow > + state.dataSize->TermUnitFinalZoneSizing(state.dataSize->CurTermUnitSizingNum).DesHeatVolFlowMax) { + heatingMaxFlow = state.dataSize->TermUnitFinalZoneSizing(state.dataSize->CurTermUnitSizingNum).DesHeatVolFlowMax; + } else { + heatingMaxFlow = state.dataSize->TermUnitFinalZoneSizing(state.dataSize->CurTermUnitSizingNum).DesHeatVolFlow; + } MaxAirVolFlowRateDes = max(state.dataSize->TermUnitFinalZoneSizing(state.dataSize->CurTermUnitSizingNum).DesCoolVolFlow, heatingMaxFlow); if (MaxAirVolFlowRateDes < SmallAirVolFlow) { @@ -2929,7 +2934,9 @@ void SingleDuctAirTerminal::SizeSys(EnergyPlusData &state) } } else { CheckZoneSizing(state, this->sysType, this->SysName); - if (this->DamperHeatingAction == Action::ReverseWithLimits) { + if (this->DamperHeatingAction == Action::ReverseWithLimits && + state.dataSize->TermUnitFinalZoneSizing(state.dataSize->CurTermUnitSizingNum).DesHeatVolFlow > + state.dataSize->TermUnitFinalZoneSizing(state.dataSize->CurTermUnitSizingNum).DesHeatVolFlowMax) { MaxHeatAirVolFlowRateDes = state.dataSize->TermUnitFinalZoneSizing(state.dataSize->CurTermUnitSizingNum).DesHeatVolFlowMax; } else { MaxHeatAirVolFlowRateDes = state.dataSize->TermUnitFinalZoneSizing(state.dataSize->CurTermUnitSizingNum).DesHeatVolFlow; @@ -3221,7 +3228,13 @@ void SingleDuctAirTerminal::SizeSys(EnergyPlusData &state) if (state.dataSize->ZoneSizingRunDone) { if (state.dataSize->CurTermUnitSizingNum > 0) { // if zone sizing run done, set the design max reheat air flow to the value from the design calcs - MaxAirVolFlowRateDuringReheatDes = state.dataSize->TermUnitFinalZoneSizing(state.dataSize->CurTermUnitSizingNum).DesHeatVolFlowMax; + if (state.dataSize->TermUnitFinalZoneSizing(state.dataSize->CurTermUnitSizingNum).DesHeatVolFlow > + state.dataSize->TermUnitFinalZoneSizing(state.dataSize->CurTermUnitSizingNum).DesHeatVolFlowMax) { + MaxAirVolFlowRateDuringReheatDes = + state.dataSize->TermUnitFinalZoneSizing(state.dataSize->CurTermUnitSizingNum).DesHeatVolFlowMax; + } else { + MaxAirVolFlowRateDuringReheatDes = state.dataSize->TermUnitFinalZoneSizing(state.dataSize->CurTermUnitSizingNum).DesHeatVolFlow; + } } } else { // if no design calc use 0.002032 [m3/s-m2] times floor area. That's .40 cfm/ft2 diff --git a/tst/EnergyPlus/unit/SingleDuct.unit.cc b/tst/EnergyPlus/unit/SingleDuct.unit.cc index be75837c77b..cc7c60b35df 100644 --- a/tst/EnergyPlus/unit/SingleDuct.unit.cc +++ b/tst/EnergyPlus/unit/SingleDuct.unit.cc @@ -2765,11 +2765,27 @@ TEST_F(EnergyPlusFixture, VAVReheatTerminal_SizeMinFrac) state->dataSize->TermUnitFinalZoneSizing(1).DesHeatVolFlowMax = 1.6; thisSys.SizeSys(*state); Real64 expectedZoneMinAirFracDes = std::min(1.0, state->dataSize->TermUnitFinalZoneSizing(1).DesCoolVolFlowMin / thisSys.MaxAirVolFlowRate); + // DesHeatVolFlowMax is limiting flow rate Real64 expectedMaxAirVolFractionDuringReheat = state->dataSize->TermUnitFinalZoneSizing(1).DesHeatVolFlowMax / thisSys.MaxAirVolFlowRate; EXPECT_EQ(expectedZoneMinAirFracDes, thisSys.ZoneMinAirFracDes); EXPECT_EQ(1.0, thisSys.MaxAirVolFractionDuringReheat); EXPECT_EQ(expectedMaxAirVolFractionDuringReheat, thisSys.MaxAirVolFractionDuringReheat); + // switch magnitude of DesHeatVolFlow and DesHeatVolFlowMax, still heating dominated + thisSys.MaxAirVolFlowRate = DataSizing::AutoSize; + thisSys.ZoneMinAirFracDes = DataSizing::AutoSize; + thisSys.MaxAirVolFlowRateDuringReheat = DataSizing::AutoSize; + thisSys.MaxAirVolFractionDuringReheat = DataSizing::AutoSize; + state->dataSize->TermUnitFinalZoneSizing(1).DesHeatVolFlow = 1.6; + state->dataSize->TermUnitFinalZoneSizing(1).DesHeatVolFlowMax = 1.7; + thisSys.SizeSys(*state); + expectedZoneMinAirFracDes = std::min(1.0, state->dataSize->TermUnitFinalZoneSizing(1).DesCoolVolFlowMin / thisSys.MaxAirVolFlowRate); + // DesHeatVolFlowMax is NOT limiting flow rate + expectedMaxAirVolFractionDuringReheat = state->dataSize->TermUnitFinalZoneSizing(1).DesHeatVolFlow / thisSys.MaxAirVolFlowRate; + EXPECT_EQ(expectedZoneMinAirFracDes, thisSys.ZoneMinAirFracDes); + EXPECT_EQ(1.0, thisSys.MaxAirVolFractionDuringReheat); + EXPECT_EQ(expectedMaxAirVolFractionDuringReheat, thisSys.MaxAirVolFractionDuringReheat); + // test Maximum Flow Fraction During Reheat for cooling dominated thisSys.MaxAirVolFlowRate = DataSizing::AutoSize; thisSys.ZoneMinAirFracDes = DataSizing::AutoSize; @@ -2779,6 +2795,7 @@ TEST_F(EnergyPlusFixture, VAVReheatTerminal_SizeMinFrac) state->dataSize->TermUnitFinalZoneSizing(1).DesHeatVolFlowMax = 1.3; thisSys.SizeSys(*state); expectedZoneMinAirFracDes = std::min(1.0, state->dataSize->TermUnitFinalZoneSizing(1).DesCoolVolFlowMin / thisSys.MaxAirVolFlowRate); + // DesHeatVolFlowMax is limiting flow rate expectedMaxAirVolFractionDuringReheat = state->dataSize->TermUnitFinalZoneSizing(1).DesHeatVolFlowMax / thisSys.MaxAirVolFlowRate; EXPECT_EQ(expectedZoneMinAirFracDes, thisSys.ZoneMinAirFracDes); EXPECT_EQ(1.0, thisSys.MaxAirVolFractionDuringReheat);