Skip to content

Commit 87b5a4a

Browse files
authored
Merge pull request #11782 from NatLabRockies/wahp-eqnft-avail
Fix availability schedules for Coil:Cooling:WaterToAirHeatPump:EquationFit (and Heating)
2 parents e1cb059 + 561b83e commit 87b5a4a

4 files changed

Lines changed: 88 additions & 12 deletions

File tree

‎src/EnergyPlus/UnitarySystem.cc‎

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4527,7 +4527,7 @@ namespace UnitarySystems {
45274527
} else {
45284528
auto const &thisHeatCoil = state.dataVariableSpeedCoils->VarSpeedCoil(this->m_HeatingCoilIndex);
45294529
this->m_NumOfSpeedHeating = thisHeatCoil.NumOfSpeeds;
4530-
this->m_heatingCoilAvailSched = Sched::GetScheduleAlwaysOn(state);
4530+
this->m_heatingCoilAvailSched = thisHeatCoil.availSched;
45314531
this->m_MaxHeatAirVolFlow = thisHeatCoil.RatedAirVolFlowRate;
45324532
if (this->m_MaxHeatAirVolFlow == DataSizing::AutoSize) {
45334533
this->m_RequestAutoSize = true;
@@ -4695,7 +4695,7 @@ namespace UnitarySystems {
46954695
errFlag = false;
46964696
} else {
46974697
auto const &thisHeatCoil = state.dataWaterToAirHeatPumpSimple->SimpleWatertoAirHP(this->m_HeatingCoilIndex);
4698-
this->m_heatingCoilAvailSched = Sched::GetScheduleAlwaysOn(state);
4698+
this->m_heatingCoilAvailSched = thisHeatCoil.availSched;
46994699
this->m_DesignHeatingCapacity = thisHeatCoil.RatedCapHeat;
47004700
this->m_MaxHeatAirVolFlow = thisHeatCoil.RatedAirVolFlowRate;
47014701
if (this->m_MaxHeatAirVolFlow == DataSizing::AutoSize) {
@@ -4721,7 +4721,7 @@ namespace UnitarySystems {
47214721
errFlag = false;
47224722
} else {
47234723
auto const &thisHeatCoil = state.dataWaterToAirHeatPump->WatertoAirHP(this->m_HeatingCoilIndex);
4724-
this->m_heatingCoilAvailSched = Sched::GetScheduleAlwaysOn(state);
4724+
this->m_heatingCoilAvailSched = thisHeatCoil.availSched;
47254725
this->m_DesignHeatingCapacity = thisHeatCoil.HeatingCapacity;
47264726
HeatingCoilInletNode = thisHeatCoil.AirInletNodeNum;
47274727
HeatingCoilOutletNode = thisHeatCoil.AirOutletNodeNum;
@@ -5065,7 +5065,14 @@ namespace UnitarySystems {
50655065
}
50665066

50675067
} else if (Util::SameString(ChildCoolingCoilType, "COIL:COOLING:DX:VARIABLESPEED")) {
5068-
this->m_coolingCoilAvailSched = Sched::GetScheduleAlwaysOn(state);
5068+
int childCCIndex = VariableSpeedCoils::GetCoilIndexVariableSpeed(state, ChildCoolingCoilType, ChildCoolingCoilName, errFlag);
5069+
if (errFlag) {
5070+
ShowContinueError(state, std::format("Occurs in {} = {}", cCurrentModuleObject, thisObjectName));
5071+
errFlag = false;
5072+
errorsFound = true;
5073+
} else {
5074+
this->m_coolingCoilAvailSched = state.dataVariableSpeedCoils->VarSpeedCoil(childCCIndex).availSched;
5075+
}
50695076
this->m_MaxCoolAirVolFlow =
50705077
VariableSpeedCoils::GetCoilAirFlowRateVariableSpeed(state, ChildCoolingCoilType, ChildCoolingCoilName, errFlag);
50715078
if (errFlag) {
@@ -5225,7 +5232,7 @@ namespace UnitarySystems {
52255232
CoolingCoilInletNode = thisCoolCoil.AirInletNodeNum;
52265233
CoolingCoilOutletNode = thisCoolCoil.AirOutletNodeNum;
52275234
this->m_CondenserNodeNum = thisCoolCoil.CondenserInletNodeNum;
5228-
this->m_coolingCoilAvailSched = Sched::GetScheduleAlwaysOn(state);
5235+
this->m_coolingCoilAvailSched = thisCoolCoil.availSched;
52295236
this->m_NumOfSpeedCooling = thisCoolCoil.NumOfSpeeds;
52305237
if (this->m_NumOfSpeedCooling > 1) {
52315238
this->m_MultiOrVarSpeedCoolCoil = true;
@@ -5340,7 +5347,7 @@ namespace UnitarySystems {
53405347
errFlag = false;
53415348
} else {
53425349
auto const &thisCoolCoil = state.dataWaterToAirHeatPumpSimple->SimpleWatertoAirHP(this->m_CoolingCoilIndex);
5343-
this->m_coolingCoilAvailSched = Sched::GetScheduleAlwaysOn(state);
5350+
this->m_coolingCoilAvailSched = thisCoolCoil.availSched;
53445351
this->m_DesignCoolingCapacity = thisCoolCoil.RatedCapCoolTotal;
53455352

53465353
// this isn't likely to work on getInput calls but is what happened before
@@ -5390,7 +5397,7 @@ namespace UnitarySystems {
53905397
errFlag = false;
53915398
} else {
53925399
auto const &thisCoolCoil = state.dataWaterToAirHeatPump->WatertoAirHP(this->m_CoolingCoilIndex);
5393-
this->m_coolingCoilAvailSched = Sched::GetScheduleAlwaysOn(state);
5400+
this->m_coolingCoilAvailSched = thisCoolCoil.availSched;
53945401
this->m_DesignCoolingCapacity = thisCoolCoil.CoolingCapacity;
53955402
CoolingCoilInletNode = thisCoolCoil.AirInletNodeNum;
53965403
CoolingCoilOutletNode = thisCoolCoil.AirOutletNodeNum;
@@ -5445,7 +5452,7 @@ namespace UnitarySystems {
54455452
errFlag = false;
54465453
} else {
54475454
auto const &thisCoolCoil = state.dataPackagedThermalStorageCoil->TESCoil(this->m_CoolingCoilIndex);
5448-
this->m_coolingCoilAvailSched = Sched::GetScheduleAlwaysOn(state);
5455+
this->m_coolingCoilAvailSched = thisCoolCoil.availSched;
54495456
this->m_MaxCoolAirVolFlow = thisCoolCoil.RatedEvapAirVolFlowRate;
54505457
if (thisCoolCoil.CoolingOnlyModeIsAvailable) {
54515458
this->m_DesignCoolingCapacity = thisCoolCoil.CoolingOnlyRatedTotCap;

‎src/EnergyPlus/WaterToAirHeatPumpSimple.cc‎

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1102,7 +1102,8 @@ namespace WaterToAirHeatPumpSimple {
11021102
int AirInletNode = simpleWAHP.AirInletNodeNum;
11031103
int WaterInletNode = simpleWAHP.WaterInletNodeNum;
11041104

1105-
if ((SensLoad != 0.0 || LatentLoad != 0.0) && (state.dataLoopNodes->Node(AirInletNode).MassFlowRate > 0.0)) {
1105+
if ((SensLoad != 0.0 || LatentLoad != 0.0) && (state.dataLoopNodes->Node(AirInletNode).MassFlowRate > 0.0) &&
1106+
(simpleWAHP.availSched->getCurrentVal() > 0.0)) {
11061107
simpleWAHP.WaterMassFlowRate = simpleWAHP.DesignWaterMassFlowRate;
11071108

11081109
simpleWAHP.AirMassFlowRate = state.dataLoopNodes->Node(AirInletNode).MassFlowRate;
@@ -2899,6 +2900,11 @@ namespace WaterToAirHeatPumpSimple {
28992900

29002901
auto &simpleWAHP(state.dataWaterToAirHeatPumpSimple->SimpleWatertoAirHP(HPNum));
29012902

2903+
if (simpleWAHP.availSched->getCurrentVal() <= 0.0) {
2904+
simpleWAHP.SimFlag = false;
2905+
return;
2906+
}
2907+
29022908
TotalCapRated = simpleWAHP.RatedCapCoolTotal;
29032909
SensCapRated = simpleWAHP.RatedCapCoolSens;
29042910
CoolPowerRated = simpleWAHP.RatedPowerCool;
@@ -3179,6 +3185,11 @@ namespace WaterToAirHeatPumpSimple {
31793185

31803186
auto &simpleWAHP(state.dataWaterToAirHeatPumpSimple->SimpleWatertoAirHP(HPNum));
31813187

3188+
if (simpleWAHP.availSched->getCurrentVal() <= 0.0) {
3189+
simpleWAHP.SimFlag = false;
3190+
return;
3191+
}
3192+
31823193
HeatCapRated = simpleWAHP.RatedCapHeat;
31833194
HeatPowerRated = simpleWAHP.RatedPowerHeat;
31843195
AirVolFlowRateRated = simpleWAHP.RatedAirVolFlowRate;

‎tst/EnergyPlus/unit/UnitarySystem.unit.cc‎

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12339,9 +12339,9 @@ Fan:OnOff,
1233912339
Zone Exhaust Node, !- Air Inlet Node Name
1234012340
DX Cooling Coil Air Inlet Node; !- Air Outlet Node Name
1234112341

12342-
Coil:Cooling:WaterToAirHeatPump:EquationFit,
12342+
Coil:Cooling:WaterToAirHeatPump:EquationFit,
1234312343
Sys 1 Heat Pump Cooling Mode, !- Name
12344-
, !- Availability Schedule Name
12344+
CoolingCoilAlwaysOffAvailSched,!- Availability Schedule Name
1234512345
Sys 1 Water to Air Heat Pump Source Side1 Inlet Node, !- Water Inlet Node Name
1234612346
Sys 1 Water to Air Heat Pump Source Side1 Outlet Node, !- Water Outlet Node Name
1234712347
DX Cooling Coil Air Inlet Node, !- Air Inlet Node Name
@@ -12363,7 +12363,7 @@ Fan:OnOff,
1236312363

1236412364
Coil:Heating:WaterToAirHeatPump:EquationFit,
1236512365
Sys 1 Heat Pump Heating Mode, !- Name
12366-
, !- Availability Schedule Name
12366+
HeatingCoilAlwaysOffAvailSched,!- Availability Schedule Name
1236712367
Sys 1 Water to Air Heat Pump Source Side2 Inlet Node, !- Water Inlet Node Name
1236812368
Sys 1 Water to Air Heat Pump Source Side2 Outlet Node, !- Water Outlet Node Name
1236912369
Heating Coil Air Inlet Node, !- Air Inlet Node Name
@@ -12398,6 +12398,20 @@ Schedule:Compact,
1239812398
For: AllDays, !- Field 2
1239912399
Until: 24:00, 1.0; !- Field 3
1240012400

12401+
Schedule:Compact,
12402+
CoolingCoilAlwaysOffAvailSched, !- Name
12403+
Any Number, !- Schedule Type Limits Name
12404+
Through: 12/31, !- Field 1
12405+
For: AllDays, !- Field 2
12406+
Until: 24:00, 0.0; !- Field 3
12407+
12408+
Schedule:Compact,
12409+
HeatingCoilAlwaysOffAvailSched, !- Name
12410+
Any Number, !- Schedule Type Limits Name
12411+
Through: 12/31, !- Field 1
12412+
For: AllDays, !- Field 2
12413+
Until: 24:00, 0.0; !- Field 3
12414+
1240112415
Schedule:Compact,
1240212416
ContinuousFanSchedule, !- Name
1240312417
Any Number, !- Schedule Type Limits Name
@@ -12607,6 +12621,17 @@ Curve:QuadLinear,
1260712621
thisSys->getUnitarySystemInputData(*state, compName, zoneEquipment, 0, ErrorsFound); // get UnitarySystem input from object above
1260812622
EXPECT_FALSE(ErrorsFound); // expect no errors
1260912623

12624+
auto &coolingCoil = state->dataWaterToAirHeatPumpSimple->SimpleWatertoAirHP(thisSys->m_CoolingCoilIndex);
12625+
auto &heatingCoil = state->dataWaterToAirHeatPumpSimple->SimpleWatertoAirHP(thisSys->m_HeatingCoilIndex);
12626+
ASSERT_NE(nullptr, thisSys->m_coolingCoilAvailSched);
12627+
ASSERT_NE(nullptr, thisSys->m_heatingCoilAvailSched);
12628+
EXPECT_EQ(coolingCoil.availSched, thisSys->m_coolingCoilAvailSched);
12629+
EXPECT_EQ(heatingCoil.availSched, thisSys->m_heatingCoilAvailSched);
12630+
EXPECT_LE(thisSys->m_coolingCoilAvailSched->getCurrentVal(), 0.0);
12631+
EXPECT_LE(thisSys->m_heatingCoilAvailSched->getCurrentVal(), 0.0);
12632+
coolingCoil.availSched->currentVal = 1.0;
12633+
heatingCoil.availSched->currentVal = 1.0;
12634+
1261012635
ASSERT_EQ(1, state->dataUnitarySystems->numUnitarySystems); // only 1 unitary system above so expect 1 as number of unitary system objects
1261112636
EXPECT_EQ(thisSys->UnitType, HVAC::unitarySysTypeNames[(int)compType]); // compare UnitarySystem type string to valid type
1261212637

‎tst/EnergyPlus/unit/WaterToAirHeatPumpSimple.unit.cc‎

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@
6767
#include <EnergyPlus/PlantUtilities.hh>
6868
#include <EnergyPlus/Psychrometrics.hh>
6969
#include <EnergyPlus/ReportCoilSelection.hh>
70+
#include <EnergyPlus/ScheduleManager.hh>
7071
#include <EnergyPlus/WaterToAirHeatPumpSimple.hh>
7172

7273
using namespace EnergyPlus;
@@ -503,6 +504,22 @@ TEST_F(EnergyPlusFixture, WaterToAirHeatPumpSimple_TestAirFlow)
503504
state->dataWaterToAirHeatPumpSimple->SimpleWatertoAirHP(HPNum).OutletAirEnthalpy, (43970.75 - (17156.275 / 1.0)) * 0.5 + 43970.75 * 0.5, 0.1);
504505
EXPECT_NEAR(state->dataWaterToAirHeatPumpSimple->SimpleWatertoAirHP(HPNum).OutletAirDBTemp, 18.95267, 0.0001);
505506

507+
state->dataWaterToAirHeatPumpSimple->SimpleWatertoAirHP(HPNum).availSched = Sched::GetScheduleAlwaysOff(*state);
508+
InitSimpleWatertoAirHP(*state, HPNum, SensLoad, LatentLoad, fanOp, OnOffAirFlowRatio, FirstHVACIteration, PartLoadRatio);
509+
CalcHPCoolingSimple(*state, HPNum, fanOp, SensLoad, LatentLoad, compressorOp, PartLoadRatio, OnOffAirFlowRatio);
510+
UpdateSimpleWatertoAirHP(*state, HPNum);
511+
EXPECT_FALSE(state->dataWaterToAirHeatPumpSimple->SimpleWatertoAirHP(HPNum).SimFlag);
512+
EXPECT_EQ(state->dataWaterToAirHeatPumpSimple->SimpleWatertoAirHP(HPNum).Power, 0.0);
513+
EXPECT_EQ(state->dataWaterToAirHeatPumpSimple->SimpleWatertoAirHP(HPNum).QLoadTotal, 0.0);
514+
EXPECT_EQ(state->dataWaterToAirHeatPumpSimple->SimpleWatertoAirHP(HPNum).QSensible, 0.0);
515+
EXPECT_EQ(state->dataWaterToAirHeatPumpSimple->SimpleWatertoAirHP(HPNum).OutletAirDBTemp,
516+
state->dataWaterToAirHeatPumpSimple->SimpleWatertoAirHP(HPNum).InletAirDBTemp);
517+
EXPECT_EQ(state->dataWaterToAirHeatPumpSimple->SimpleWatertoAirHP(HPNum).OutletAirHumRat,
518+
state->dataWaterToAirHeatPumpSimple->SimpleWatertoAirHP(HPNum).InletAirHumRat);
519+
EXPECT_EQ(state->dataWaterToAirHeatPumpSimple->SimpleWatertoAirHP(HPNum).OutletAirEnthalpy,
520+
state->dataWaterToAirHeatPumpSimple->SimpleWatertoAirHP(HPNum).InletAirEnthalpy);
521+
state->dataWaterToAirHeatPumpSimple->SimpleWatertoAirHP(HPNum).availSched = Sched::GetScheduleAlwaysOn(*state);
522+
506523
HPNum = 2;
507524

508525
state->dataWaterToAirHeatPumpSimple->SimpleWatertoAirHP(HPNum).plantLoc.loopNum = 2;
@@ -600,6 +617,22 @@ TEST_F(EnergyPlusFixture, WaterToAirHeatPumpSimple_TestAirFlow)
600617
0.1);
601618
EXPECT_NEAR(state->dataWaterToAirHeatPumpSimple->SimpleWatertoAirHP(HPNum).OutletAirDBTemp, 24.69937, 0.0001);
602619

620+
state->dataWaterToAirHeatPumpSimple->SimpleWatertoAirHP(HPNum).availSched = Sched::GetScheduleAlwaysOff(*state);
621+
InitSimpleWatertoAirHP(*state, HPNum, SensLoad, LatentLoad, fanOp, OnOffAirFlowRatio, FirstHVACIteration, PartLoadRatio);
622+
CalcHPHeatingSimple(*state, HPNum, fanOp, SensLoad, compressorOp, PartLoadRatio, OnOffAirFlowRatio);
623+
UpdateSimpleWatertoAirHP(*state, HPNum);
624+
EXPECT_FALSE(state->dataWaterToAirHeatPumpSimple->SimpleWatertoAirHP(HPNum).SimFlag);
625+
EXPECT_EQ(state->dataWaterToAirHeatPumpSimple->SimpleWatertoAirHP(HPNum).Power, 0.0);
626+
EXPECT_EQ(state->dataWaterToAirHeatPumpSimple->SimpleWatertoAirHP(HPNum).QLoadTotal, 0.0);
627+
EXPECT_EQ(state->dataWaterToAirHeatPumpSimple->SimpleWatertoAirHP(HPNum).QSensible, 0.0);
628+
EXPECT_EQ(state->dataWaterToAirHeatPumpSimple->SimpleWatertoAirHP(HPNum).OutletAirDBTemp,
629+
state->dataWaterToAirHeatPumpSimple->SimpleWatertoAirHP(HPNum).InletAirDBTemp);
630+
EXPECT_EQ(state->dataWaterToAirHeatPumpSimple->SimpleWatertoAirHP(HPNum).OutletAirHumRat,
631+
state->dataWaterToAirHeatPumpSimple->SimpleWatertoAirHP(HPNum).InletAirHumRat);
632+
EXPECT_EQ(state->dataWaterToAirHeatPumpSimple->SimpleWatertoAirHP(HPNum).OutletAirEnthalpy,
633+
state->dataWaterToAirHeatPumpSimple->SimpleWatertoAirHP(HPNum).InletAirEnthalpy);
634+
state->dataWaterToAirHeatPumpSimple->SimpleWatertoAirHP(HPNum).availSched = Sched::GetScheduleAlwaysOn(*state);
635+
603636
// test CheckSimpleWAHPRatedCurvesOutputs with null pointers
604637
HPNum = 1;
605638
// ensure RatedEntAirDry/WetbulbTemp is not autosize so code will test valid versus null curve pointer

0 commit comments

Comments
 (0)