diff --git a/src/EnergyPlus/SingleDuct.cc b/src/EnergyPlus/SingleDuct.cc index 69f03474ac6..c5fd062b64b 100644 --- a/src/EnergyPlus/SingleDuct.cc +++ b/src/EnergyPlus/SingleDuct.cc @@ -2877,8 +2877,10 @@ void SingleDuctAirTerminal::SizeSys(EnergyPlusData &state) CheckZoneSizing(state, this->sysType, this->SysName); - MaxAirVolFlowRateDes = max(state.dataSize->TermUnitFinalZoneSizing(state.dataSize->CurTermUnitSizingNum).DesCoolVolFlow, - state.dataSize->TermUnitFinalZoneSizing(state.dataSize->CurTermUnitSizingNum).DesHeatVolFlow); + Real64 heatingMaxFlow = (this->DamperHeatingAction == Action::ReverseWithLimits) + ? state.dataSize->TermUnitFinalZoneSizing(state.dataSize->CurTermUnitSizingNum).DesHeatVolFlowMax + : state.dataSize->TermUnitFinalZoneSizing(state.dataSize->CurTermUnitSizingNum).DesHeatVolFlow; + MaxAirVolFlowRateDes = max(state.dataSize->TermUnitFinalZoneSizing(state.dataSize->CurTermUnitSizingNum).DesCoolVolFlow, heatingMaxFlow); if (MaxAirVolFlowRateDes < SmallAirVolFlow) { MaxAirVolFlowRateDes = 0.0; @@ -2927,7 +2929,11 @@ void SingleDuctAirTerminal::SizeSys(EnergyPlusData &state) } } else { CheckZoneSizing(state, this->sysType, this->SysName); - MaxHeatAirVolFlowRateDes = state.dataSize->TermUnitFinalZoneSizing(state.dataSize->CurTermUnitSizingNum).DesHeatVolFlow; + if (this->DamperHeatingAction == Action::ReverseWithLimits) { + MaxHeatAirVolFlowRateDes = state.dataSize->TermUnitFinalZoneSizing(state.dataSize->CurTermUnitSizingNum).DesHeatVolFlowMax; + } else { + MaxHeatAirVolFlowRateDes = state.dataSize->TermUnitFinalZoneSizing(state.dataSize->CurTermUnitSizingNum).DesHeatVolFlow; + } if (MaxHeatAirVolFlowRateDes < SmallAirVolFlow) { MaxHeatAirVolFlowRateDes = 0.0; } diff --git a/tst/EnergyPlus/unit/SingleDuct.unit.cc b/tst/EnergyPlus/unit/SingleDuct.unit.cc index 3c448d7b1ee..be75837c77b 100644 --- a/tst/EnergyPlus/unit/SingleDuct.unit.cc +++ b/tst/EnergyPlus/unit/SingleDuct.unit.cc @@ -2737,23 +2737,52 @@ TEST_F(EnergyPlusFixture, VAVReheatTerminal_SizeMinFrac) EXPECT_TRUE(compare_err_stream("")); int SysNum = 1; + auto &thisSys = state->dataSingleDuct->sd_airterminal(SysNum); // First test - design min flow < max flow state->dataSize->ZoneSizingRunDone = true; state->dataSize->CurZoneEqNum = 1; state->dataSize->CurTermUnitSizingNum = 1; state->dataSize->TermUnitFinalZoneSizing(1).DesCoolVolFlowMin = 0.5; - state->dataSingleDuct->sd_airterminal(SysNum).SizeSys(*state); - EXPECT_EQ(0.5, state->dataSingleDuct->sd_airterminal(SysNum).ZoneMinAirFracDes); + thisSys.SizeSys(*state); + EXPECT_EQ(0.5, thisSys.ZoneMinAirFracDes); // Second test - design min flow > max flow state->dataSize->ZoneSizingRunDone = true; state->dataSize->CurZoneEqNum = 1; state->dataSize->CurTermUnitSizingNum = 1; - state->dataSingleDuct->sd_airterminal(SysNum).ZoneMinAirFracDes = AutoSize; // need to reset this so it sizes again + thisSys.ZoneMinAirFracDes = AutoSize; // need to reset this so it sizes again state->dataSize->TermUnitFinalZoneSizing(1).DesCoolVolFlowMin = 1.5; - state->dataSingleDuct->sd_airterminal(SysNum).SizeSys(*state); - EXPECT_EQ(1.0, state->dataSingleDuct->sd_airterminal(SysNum).ZoneMinAirFracDes); + thisSys.SizeSys(*state); + EXPECT_EQ(1.0, thisSys.ZoneMinAirFracDes); + + // test Maximum Flow Fraction During Reheat for heating dominated + thisSys.MaxAirVolFlowRate = DataSizing::AutoSize; + thisSys.ZoneMinAirFracDes = DataSizing::AutoSize; + thisSys.MaxAirVolFlowRateDuringReheat = DataSizing::AutoSize; + thisSys.MaxAirVolFractionDuringReheat = DataSizing::AutoSize; + state->dataSize->TermUnitFinalZoneSizing(1).DesHeatVolFlow = 1.7; + state->dataSize->TermUnitFinalZoneSizing(1).DesHeatVolFlowMax = 1.6; + thisSys.SizeSys(*state); + Real64 expectedZoneMinAirFracDes = std::min(1.0, state->dataSize->TermUnitFinalZoneSizing(1).DesCoolVolFlowMin / thisSys.MaxAirVolFlowRate); + 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); + + // test Maximum Flow Fraction During Reheat for cooling dominated + thisSys.MaxAirVolFlowRate = DataSizing::AutoSize; + thisSys.ZoneMinAirFracDes = DataSizing::AutoSize; + thisSys.MaxAirVolFlowRateDuringReheat = DataSizing::AutoSize; + thisSys.MaxAirVolFractionDuringReheat = DataSizing::AutoSize; + state->dataSize->TermUnitFinalZoneSizing(1).DesHeatVolFlow = 1.4; + state->dataSize->TermUnitFinalZoneSizing(1).DesHeatVolFlowMax = 1.3; + thisSys.SizeSys(*state); + expectedZoneMinAirFracDes = std::min(1.0, state->dataSize->TermUnitFinalZoneSizing(1).DesCoolVolFlowMin / thisSys.MaxAirVolFlowRate); + expectedMaxAirVolFractionDuringReheat = state->dataSize->TermUnitFinalZoneSizing(1).DesHeatVolFlowMax / thisSys.MaxAirVolFlowRate; + EXPECT_EQ(expectedZoneMinAirFracDes, thisSys.ZoneMinAirFracDes); + EXPECT_EQ(1.0, thisSys.MaxAirVolFractionDuringReheat); + EXPECT_EQ(expectedMaxAirVolFractionDuringReheat, thisSys.MaxAirVolFractionDuringReheat); } TEST_F(EnergyPlusFixture, setATMixerSizingProperties_Test)