From eee31afbcef83448cd97cd25f09a9e6ca24192e6 Mon Sep 17 00:00:00 2001 From: Matt Mitchell Date: Tue, 20 Oct 2026 13:02:24 -0600 Subject: [PATCH] fix third-order zone air heat balance storage reporting --- src/EnergyPlus/ZoneTempPredictorCorrector.cc | 11 ++++------ .../unit/ZoneTempPredictorCorrector.unit.cc | 20 +++++++++++++++++++ 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/src/EnergyPlus/ZoneTempPredictorCorrector.cc b/src/EnergyPlus/ZoneTempPredictorCorrector.cc index a7cf4ffb8b2..875696ea819 100644 --- a/src/EnergyPlus/ZoneTempPredictorCorrector.cc +++ b/src/EnergyPlus/ZoneTempPredictorCorrector.cc @@ -5681,17 +5681,14 @@ void CalcZoneComponentLoadSums(EnergyPlusData &state, } } } - // now calculate air energy storage source term. - // capacitance is volume * density * heat capacity - Real64 CpAir = Psychrometrics::PsyCpAirFnW(thisHB->airHumRat); - Real64 RhoAir = Psychrometrics::PsyRhoAirFnPbTdbW(state, state.dataEnvrn->OutBaroPress, thisHB->MAT, thisHB->airHumRat); - + // Calculate the air energy storage term using the same capacitance and time integration method as the zone air temperature solver. switch (state.dataHeatBal->ZoneAirSolutionAlgo) { case DataHeatBalance::SolutionAlgo::ThirdOrder: { - thisAirRpt.CzdTdt = RhoAir * CpAir * thisZone.Volume * thisZone.ZoneVolCapMultpSens * (thisHB->MAT - thisHB->ZTM[0]) / TimeStepSysSec; - // Exact solution + thisAirRpt.CzdTdt = + thisHB->AirPowerCap * ((11.0 / 6.0) * thisHB->MAT - 3.0 * thisHB->ZTM[0] + (3.0 / 2.0) * thisHB->ZTM[1] - (1.0 / 3.0) * thisHB->ZTM[2]); } break; case DataHeatBalance::SolutionAlgo::AnalyticalSolution: { + // Exact solution thisAirRpt.CzdTdt = thisHB->TempIndCoef - thisHB->TempDepCoef * thisHB->MAT; } break; case DataHeatBalance::SolutionAlgo::EulerMethod: { diff --git a/tst/EnergyPlus/unit/ZoneTempPredictorCorrector.unit.cc b/tst/EnergyPlus/unit/ZoneTempPredictorCorrector.unit.cc index dbac610447a..b2e66300930 100644 --- a/tst/EnergyPlus/unit/ZoneTempPredictorCorrector.unit.cc +++ b/tst/EnergyPlus/unit/ZoneTempPredictorCorrector.unit.cc @@ -1117,6 +1117,26 @@ TEST_F(EnergyPlusFixture, ZoneTempPredictorCorrector_calcZoneOrSpaceSums_SurfCon EXPECT_NEAR(7328.768356, thisZoneHB.SumSysMCpT, 0.0001); } +TEST_F(EnergyPlusFixture, ZoneTempPredictorCorrector_ThirdOrderComponentLoadStorageTest) +{ + state->init_state(*state); + + state->dataHeatBal->Zone.allocate(1); + state->dataHeatBalFanSys->SumConvHTRadSys.allocate(1); + state->dataHeatBalFanSys->SumConvPool.allocate(1); + + ZoneTempPredictorCorrector::ZoneHeatBalanceData zoneHB; + zoneHB.AirPowerCap = 100.0; + zoneHB.MAT = 23.0; + zoneHB.ZTM = {20.0, 19.0, 18.0, 0.0}; + + state->dataHeatBal->ZoneAirSolutionAlgo = DataHeatBalance::SolutionAlgo::ThirdOrder; + DataHeatBalance::AirReportVars airReport; + CalcZoneComponentLoadSums(*state, 1, &zoneHB, airReport); + + EXPECT_NEAR(1400.0 / 3.0, airReport.CzdTdt, 1.0e-10); +} + TEST_F(EnergyPlusFixture, ZoneTempPredictorCorrector_EMSOverrideSetpointTest) { // AUTHOR: L. Gu, FSEC