Skip to content
21 changes: 17 additions & 4 deletions src/EnergyPlus/PlantLoopHeatPumpEIR.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1221,7 +1221,7 @@ void EIRPlantLoopHeatPump::processInputForEIRPLHP(EnergyPlusData &state)

void EIRPlantLoopHeatPump::checkConcurrentOperation(EnergyPlusData &state)
{
// This will do a recurring warning for concurrent companion operation.
// This will do a severe error for concurrent companion operation.
// This function should be called at the end of the time-step to ensure any iteration-level operation
// is worked out and the results are final.
// This function does not try to be intelligent about only reporting for one of the companions. The only
Expand All @@ -1234,9 +1234,22 @@ void EIRPlantLoopHeatPump::checkConcurrentOperation(EnergyPlusData &state)
continue;
}
if (thisPLHP.running && thisPLHP.companionHeatPumpCoil->running) {
ShowRecurringWarningErrorAtEnd(state,
"Companion heat pump objects running concurrently, check operation. Base object name: " + thisPLHP.name,
thisPLHP.recurringConcurrentOperationWarningIndex);
ShowSevereError(state, "Concurrent plant loop heat pump companion operation.");
ShowContinueErrorTimeStamp(state, "");
ShowContinueError(state, "PLHP name= " + thisPLHP.name);
ShowContinueError(state, format("PLHP source side inlet temperature= {:.2R} [C]", thisPLHP.sourceSideInletTemp));
ShowContinueError(state, format("PLHP source side outlet temperature= {:.2R} [C]", thisPLHP.sourceSideOutletTemp));
ShowContinueError(state, format("PLHP source side heat transfer rate= {:.2R} [W]", thisPLHP.sourceSideHeatTransfer));
ShowContinueError(state, "PLHP companion coil name= " + thisPLHP.companionHeatPumpCoil->name);
ShowContinueError(
state, format("PLHP companion coil source side inlet temperature= {:.2R} [C]", thisPLHP.companionHeatPumpCoil->sourceSideInletTemp));
ShowContinueError(
state,
format("PLHP companion coil source side outlet temperature= {:.2R} [C]", thisPLHP.companionHeatPumpCoil->sourceSideOutletTemp));
ShowContinueError(
state,
format("PLHP companion coil source side heat transfer rate= {:.2R} [W]", thisPLHP.companionHeatPumpCoil->sourceSideHeatTransfer));
ShowFatalError(state, "CheckConcurrentOperation: Simulation terminated because of problems in plant loop heat pump operation");
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am not sure this is the correct method. I think this would occur when there is a cooling and heating HP on the same plant loop. I mean, this is a HP so there is only 1 HX. Ok, that makes sense to have a method to heat and cool the loop to be within some temperature range. If this is true, why would the inlet temperature of one HP ever be different from the other? Unless of course you have 2 HXs and one of those HPs is upstream of the other. And if that is the case then if the first one runs then the second one should be off. As an example, the plant loop temperature set points would be say 10C for cooling and something lower, like 7C for heating so that the plant loop temp stayed between 7C and 10C.. Did I get those control temps correct? So if the inlet temp = 11C, the cooling HP would be on and the heating HP off, even if the cooling HP operated the heating HP inlet temp should not be below 7C. Same if inlet temp = 6C, only heating HP would operate. So what scenario would cause both HPs to operate? Switched cooling/heating set point temperature? One HP overshooting the set point? What is happening in the defect file to cause both HPs to operate?

}
}
}
Expand Down
11 changes: 2 additions & 9 deletions tst/EnergyPlus/unit/PlantLoopHeatPumpEIR.unit.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1740,15 +1740,8 @@ TEST_F(EnergyPlusFixture, TestConcurrentOperationChecking)
coil3->running = true;
coil4->running = true;

// check to warn about concurrent operation
EIRPlantLoopHeatPump::checkConcurrentOperation(*state);

// that will just add a recurring warning to the end, so to check whether
// a warning was actually made, I'll just check the warning index values
ASSERT_EQ(0, coil1->recurringConcurrentOperationWarningIndex);
ASSERT_EQ(0, coil2->recurringConcurrentOperationWarningIndex);
ASSERT_EQ(1, coil3->recurringConcurrentOperationWarningIndex);
ASSERT_EQ(1, coil4->recurringConcurrentOperationWarningIndex);
// check fatal error about concurrent operation
EXPECT_THROW(EIRPlantLoopHeatPump::checkConcurrentOperation(*state), std::runtime_error);
}

TEST_F(EnergyPlusFixture, ConstructionFullObjectsHeatingAndCooling_AirSource)
Expand Down