Skip to content

HPWH shows very high COP #4455

Description

@rraustad

User file shows COP = 10 when COP is set at 2.7. For loop in code inadvertently increases tank source node entering water temperature which in turn lowers source node water mass flow rate, which in turn lowers HPWH PLR to the point where COP is high.

2 places in code starting at line 6856 of PlantWaterThermalTanks.cc

for ( loopIter = 1; loopIter <= 4; ++loopIter ) {
CalcHPWHDXCoil( HPWaterHeater( HPNum ).DXCoilNum, HPPartLoadRatio );
// Currently, HPWH heating rate is only a function of inlet evap conditions and air flow rate
// If HPWH is ever allowed to vary fan speed, this next sub should be called.
// (possibly with an iteration loop to converge on a solution)
// CALL CalcDOE2DXCoil(DXCoilNum, HPPartLoadRatio, FirstHVACIteration,PartLoadRatio, FanOpMode)
CondenserDeltaT = Node( HPWaterOutletNode ).Temp - Node( HPWaterInletNode ).Temp;
// move the full load outlet temperature rate to the water heater structure variables
// (water heaters source inlet node temperature/mdot are set in Init, set it here after CalcHPWHDXCoil has been called)
WaterThermalTank( WaterThermalTankNum ).SourceInletTemp = Node( HPWaterInletNode ).Temp + CondenserDeltaT;
WaterThermalTank( WaterThermalTankNum ).SourceMassFlowRate = MdotWater;

//           this CALL does not update node temps, must use WaterThermalTank variables
// select tank type
{ auto const SELECT_CASE_var1( HPWaterHeater( HPNum ).TankTypeNum );
    if ( SELECT_CASE_var1 == MixedWaterHeater ) {
        CalcWaterThermalTankMixed( WaterThermalTankNum );
        NewTankTemp = WaterThermalTank( WaterThermalTankNum ).TankTemp;
    } else if ( SELECT_CASE_var1 == StratifiedWaterHeater ) {
        CalcWaterThermalTankStratified( WaterThermalTankNum );
        NewTankTemp = FindStratifiedTankSensedTemp( WaterThermalTankNum, HPWaterHeater( HPNum ).ControlSensorLocation );
    }}
    Node( HPWaterInletNode ).Temp = WaterThermalTank( WaterThermalTankNum ).SourceOutletTemp;
    if ( std::abs( Node( HPWaterInletNode ).Temp - HPWHCondInletNodeLast ) < SmallTempDiff ) break;
    HPWHCondInletNodeLast = Node( HPWaterInletNode ).Temp;

}

Tests removing the for loop show what appears to be proper operation.
This loop was added for stratified tanks so close review is necessary.
It may also be that this was added to correct a defect file, where tank temperatures may have been changing rapidly and required some iteration. This is a little scary to change except for the fact that the HPWH is obviously not working correctly now.

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Fields

No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions