From 5455eb0f37927dc59b3373082e220b66d28882f0 Mon Sep 17 00:00:00 2001 From: rraustad Date: Wed, 25 Feb 2026 23:14:44 -0500 Subject: [PATCH] Limit VSHP air flow to parent maximum air flow --- src/EnergyPlus/Furnaces.cc | 10 ++++++---- tst/EnergyPlus/unit/Furnaces.unit.cc | 22 +++++++++++----------- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/src/EnergyPlus/Furnaces.cc b/src/EnergyPlus/Furnaces.cc index 184f3268b35..3be532863a6 100644 --- a/src/EnergyPlus/Furnaces.cc +++ b/src/EnergyPlus/Furnaces.cc @@ -10952,8 +10952,9 @@ namespace Furnaces { if (thisFurnace.NumOfSpeedCooling > 0) { state.dataFurnaces->CompOnMassFlow = thisFurnace.CoolMassFlowRate(thisFurnace.NumOfSpeedCooling); state.dataFurnaces->CompOnFlowRatio = thisFurnace.MSCoolingSpeedRatio(thisFurnace.NumOfSpeedCooling); - state.dataHVACGlobal->MSHPMassFlowRateLow = thisFurnace.CoolMassFlowRate(thisFurnace.NumOfSpeedCooling); - state.dataHVACGlobal->MSHPMassFlowRateHigh = thisFurnace.CoolMassFlowRate(thisFurnace.NumOfSpeedCooling); + state.dataFurnaces->CompOnMassFlow = min(state.dataFurnaces->CompOnMassFlow, thisFurnace.MaxCoolAirMassFlow); + state.dataHVACGlobal->MSHPMassFlowRateLow = state.dataFurnaces->CompOnMassFlow; + state.dataHVACGlobal->MSHPMassFlowRateHigh = state.dataFurnaces->CompOnMassFlow; } else { state.dataFurnaces->CompOnMassFlow = thisFurnace.MaxCoolAirMassFlow; state.dataFurnaces->CompOnFlowRatio = thisFurnace.CoolingSpeedRatio; @@ -10969,8 +10970,9 @@ namespace Furnaces { if (thisFurnace.NumOfSpeedHeating > 0) { state.dataFurnaces->CompOnMassFlow = thisFurnace.HeatMassFlowRate(thisFurnace.NumOfSpeedHeating); state.dataFurnaces->CompOnFlowRatio = thisFurnace.MSHeatingSpeedRatio(thisFurnace.NumOfSpeedHeating); - state.dataHVACGlobal->MSHPMassFlowRateLow = thisFurnace.HeatMassFlowRate(thisFurnace.NumOfSpeedHeating); - state.dataHVACGlobal->MSHPMassFlowRateHigh = thisFurnace.HeatMassFlowRate(thisFurnace.NumOfSpeedHeating); + state.dataFurnaces->CompOnMassFlow = min(state.dataFurnaces->CompOnMassFlow, thisFurnace.MaxHeatAirMassFlow); + state.dataHVACGlobal->MSHPMassFlowRateLow = state.dataFurnaces->CompOnMassFlow; + state.dataHVACGlobal->MSHPMassFlowRateHigh = state.dataFurnaces->CompOnMassFlow; } else { state.dataFurnaces->CompOnMassFlow = thisFurnace.MaxHeatAirMassFlow; state.dataFurnaces->CompOnFlowRatio = thisFurnace.HeatingSpeedRatio; diff --git a/tst/EnergyPlus/unit/Furnaces.unit.cc b/tst/EnergyPlus/unit/Furnaces.unit.cc index 299650825bf..076cc6c8b2a 100644 --- a/tst/EnergyPlus/unit/Furnaces.unit.cc +++ b/tst/EnergyPlus/unit/Furnaces.unit.cc @@ -182,21 +182,21 @@ TEST_F(EnergyPlusFixture, SetVSHPAirFlowTest_VSFurnaceFlowTest) state->dataFurnaces->HeatingLoad = true; state->dataFurnaces->CoolingLoad = false; SetVSHPAirFlow(*state, FurnaceNum, PartLoadRatio, OnOffAirFlowRatio); - EXPECT_DOUBLE_EQ(1.0, state->dataHVACGlobal->MSHPMassFlowRateLow); - EXPECT_DOUBLE_EQ(1.0, state->dataHVACGlobal->MSHPMassFlowRateHigh); + EXPECT_DOUBLE_EQ(0.5, state->dataHVACGlobal->MSHPMassFlowRateLow); + EXPECT_DOUBLE_EQ(0.5, state->dataHVACGlobal->MSHPMassFlowRateHigh); EXPECT_DOUBLE_EQ(0.0, state->dataFurnaces->CompOffMassFlow); - EXPECT_DOUBLE_EQ(1.0, state->dataFurnaces->CompOnMassFlow); + EXPECT_DOUBLE_EQ(0.5, state->dataFurnaces->CompOnMassFlow); EXPECT_DOUBLE_EQ(1.0, OnOffAirFlowRatio); - EXPECT_DOUBLE_EQ(1.0, state->dataLoopNodes->Node(state->dataFurnaces->Furnace(FurnaceNum).FurnaceInletNodeNum).MassFlowRate); + EXPECT_DOUBLE_EQ(0.5, state->dataLoopNodes->Node(state->dataFurnaces->Furnace(FurnaceNum).FurnaceInletNodeNum).MassFlowRate); // Test availability manager signal state->dataHVACGlobal->TurnFansOff = true; state->dataHVACGlobal->TurnFansOn = false; SetVSHPAirFlow(*state, FurnaceNum, PartLoadRatio, OnOffAirFlowRatio); - EXPECT_DOUBLE_EQ(1.0, state->dataHVACGlobal->MSHPMassFlowRateLow); - EXPECT_DOUBLE_EQ(1.0, state->dataHVACGlobal->MSHPMassFlowRateHigh); + EXPECT_DOUBLE_EQ(0.5, state->dataHVACGlobal->MSHPMassFlowRateLow); + EXPECT_DOUBLE_EQ(0.5, state->dataHVACGlobal->MSHPMassFlowRateHigh); EXPECT_DOUBLE_EQ(0.0, state->dataFurnaces->CompOffMassFlow); - EXPECT_DOUBLE_EQ(1.0, state->dataFurnaces->CompOnMassFlow); + EXPECT_DOUBLE_EQ(0.5, state->dataFurnaces->CompOnMassFlow); EXPECT_DOUBLE_EQ(0.0, OnOffAirFlowRatio); EXPECT_DOUBLE_EQ(0.0, state->dataLoopNodes->Node(state->dataFurnaces->Furnace(FurnaceNum).FurnaceInletNodeNum).MassFlowRate); state->dataHVACGlobal->TurnFansOff = false; @@ -230,12 +230,12 @@ TEST_F(EnergyPlusFixture, SetVSHPAirFlowTest_VSFurnaceFlowTest) state->dataFurnaces->HeatingLoad = false; state->dataFurnaces->CoolingLoad = true; SetVSHPAirFlow(*state, FurnaceNum, PartLoadRatio, OnOffAirFlowRatio); - EXPECT_DOUBLE_EQ(1.2, state->dataHVACGlobal->MSHPMassFlowRateLow); - EXPECT_DOUBLE_EQ(1.2, state->dataHVACGlobal->MSHPMassFlowRateHigh); + EXPECT_DOUBLE_EQ(0.75, state->dataHVACGlobal->MSHPMassFlowRateLow); + EXPECT_DOUBLE_EQ(0.75, state->dataHVACGlobal->MSHPMassFlowRateHigh); EXPECT_DOUBLE_EQ(0.0, state->dataFurnaces->CompOffMassFlow); - EXPECT_DOUBLE_EQ(1.2, state->dataFurnaces->CompOnMassFlow); + EXPECT_DOUBLE_EQ(0.75, state->dataFurnaces->CompOnMassFlow); EXPECT_DOUBLE_EQ(1.0, OnOffAirFlowRatio); - EXPECT_DOUBLE_EQ(1.2, state->dataLoopNodes->Node(state->dataFurnaces->Furnace(FurnaceNum).FurnaceInletNodeNum).MassFlowRate); + EXPECT_DOUBLE_EQ(0.75, state->dataLoopNodes->Node(state->dataFurnaces->Furnace(FurnaceNum).FurnaceInletNodeNum).MassFlowRate); // constant fan mode should drop to idle flow rate state->dataFurnaces->Furnace(FurnaceNum).fanOp = HVAC::FanOp::Continuous;