Skip to content

Commit

Permalink
Merge pull request #10735 from NREL/9849wshpArrayBounds
Browse files Browse the repository at this point in the history
Fix wshp array bounds error and sizing
  • Loading branch information
Myoldmopar authored Nov 8, 2024
2 parents ec7398a + 672c1d4 commit 8cf8dc3
Show file tree
Hide file tree
Showing 2 changed files with 89 additions and 83 deletions.
9 changes: 5 additions & 4 deletions src/EnergyPlus/UnitarySystem.cc
Original file line number Diff line number Diff line change
Expand Up @@ -3153,7 +3153,7 @@ namespace UnitarySystems {
state.dataSize->DataFractionUsedForSizing = 1.0;
SizingMethod = HVAC::AutoCalculateSizing;
this->m_DesignHeatingCapacity = DataSizing::AutoSize;
if (this->m_CoolingCoilType_Num == HVAC::Coil_CoolingWaterToAirHPSimple)
if (this->m_CoolingCoilType_Num == HVAC::Coil_CoolingWaterToAirHPSimple) {
// adjusted cooling coil capacity
WaterToAirHeatPumpSimple::SimWatertoAirHPSimple(state,
blankString,
Expand All @@ -3164,9 +3164,10 @@ namespace UnitarySystems {
HVAC::CompressorOp::Off,
0.0,
FirstHVACIteration);
state.dataSize->DataConstantUsedForSizing = WaterToAirHeatPumpSimple::GetCoilCapacity(
state, HVAC::cAllCoilTypes(this->m_CoolingCoilType_Num), this->m_CoolingCoilName, ErrFound);
EqSizing.DesCoolingLoad = state.dataSize->DataConstantUsedForSizing;
state.dataSize->DataConstantUsedForSizing = WaterToAirHeatPumpSimple::GetCoilCapacity(
state, HVAC::cAllCoilTypes(this->m_CoolingCoilType_Num), this->m_CoolingCoilName, ErrFound);
EqSizing.DesCoolingLoad = state.dataSize->DataConstantUsedForSizing;
}
state.dataSize->DataFractionUsedForSizing = 1.0;
this->m_DesignCoolingCapacity = DataSizing::AutoSize;
// airflow sizing with multispeed fan
Expand Down
163 changes: 84 additions & 79 deletions src/EnergyPlus/WaterToAirHeatPumpSimple.cc
Original file line number Diff line number Diff line change
Expand Up @@ -2580,86 +2580,92 @@ namespace WaterToAirHeatPumpSimple {

// determine adjusted cooling and heating coil capacity
simpleWatertoAirHP.RatedCapHeatAtRatedCdts = RatedCapHeatDes * RatedHeatCapTempModFac;
auto &companionCoolingCoil(state.dataWaterToAirHeatPumpSimple->SimpleWatertoAirHP(simpleWatertoAirHP.CompanionCoolingCoilNum));
if (companionCoolingCoil.WAHPPlantType == DataPlant::PlantEquipmentType::CoilWAHPCoolingEquationFit &&
companionCoolingCoil.RatedCapCoolTotal == DataSizing::AutoSize) {
// case 1: companion coil is also of EquationFit type and is being autosized
RatedCapCoolTotalDes = state.dataSize->DXCoolCap;
RatedTotCapTempModFac = companionCoolingCoil.RatedCapCoolAtRatedCdts / RatedCapCoolTotalDes;
RatedCapCoolHeatDD =
simpleWatertoAirHP.RatedCapHeatAtRatedCdts / simpleWatertoAirHP.RatioRatedHeatRatedTotCoolCap / RatedTotCapTempModFac;
RatedCoolPowerTempModFac = companionCoolingCoil.RatedPowerCoolAtRatedCdts / companionCoolingCoil.RatedPowerCool;
if (RatedCapCoolHeatDD > RatedCapCoolTotalDes) {
// total cooling capacity
RatedCapCoolTotalDes = RatedCapCoolHeatDD;
// adjust for system air flow -- capacity is based on heating design day calcs
// adjust by ratio of system to heating air flow rate and temperature delta across the coil at these different airflow
if (HeatingAirVolFlowRateDes > 0) {
RatedCapCoolTotalDes *= (RatedAirVolFlowRateDes / HeatingAirVolFlowRateDes) * HeatdTratio;
if (simpleWatertoAirHP.CompanionCoolingCoilNum > 0) {
auto &companionCoolingCoil(state.dataWaterToAirHeatPumpSimple->SimpleWatertoAirHP(simpleWatertoAirHP.CompanionCoolingCoilNum));
if (companionCoolingCoil.WAHPPlantType == DataPlant::PlantEquipmentType::CoilWAHPCoolingEquationFit &&
companionCoolingCoil.RatedCapCoolTotal == DataSizing::AutoSize) {
// case 1: companion coil is also of EquationFit type and is being autosized
RatedCapCoolTotalDes = state.dataSize->DXCoolCap;
RatedTotCapTempModFac = companionCoolingCoil.RatedCapCoolAtRatedCdts / RatedCapCoolTotalDes;
RatedCapCoolHeatDD =
simpleWatertoAirHP.RatedCapHeatAtRatedCdts / simpleWatertoAirHP.RatioRatedHeatRatedTotCoolCap / RatedTotCapTempModFac;
RatedCoolPowerTempModFac = companionCoolingCoil.RatedPowerCoolAtRatedCdts / companionCoolingCoil.RatedPowerCool;
if (RatedCapCoolHeatDD > RatedCapCoolTotalDes) {
// total cooling capacity
RatedCapCoolTotalDes = RatedCapCoolHeatDD;
// adjust for system air flow -- capacity is based on heating design day calcs
// adjust by ratio of system to heating air flow rate and temperature delta across the coil at these different airflow
if (HeatingAirVolFlowRateDes > 0) {
RatedCapCoolTotalDes *= (RatedAirVolFlowRateDes / HeatingAirVolFlowRateDes) * HeatdTratio;
}
// calculate ajustment factor over previous capacity for sensible capacity adjustment
Real64 CapCoolAdjFac = RatedCapCoolTotalDes / state.dataSize->DXCoolCap;
// update cooling coil rated capacity after adjustments based on heating coil size
state.dataSize->DXCoolCap = RatedCapCoolTotalDes;
// sensible cooling capacity
RatedCapCoolSensDes = companionCoolingCoil.RatedCapCoolSens * CapCoolAdjFac; // Assume that SHR stays the same
companionCoolingCoil.RatedCapCoolSensDesAtRatedCdts *= CapCoolAdjFac;
companionCoolingCoil.RatedCapCoolSens = RatedCapCoolSensDes;
// update Water-to-Air Heat Pumps output reports
OutputReportPredefined::PreDefTableEntry(state,
state.dataOutRptPredefined->pdchWAHPRatedSensCapAtRatedCdts,
companionCoolingCoil.Name,
companionCoolingCoil.RatedCapCoolSensDesAtRatedCdts);
OutputReportPredefined::PreDefTableEntry(
state, state.dataOutRptPredefined->pdchWAHPDD, companionCoolingCoil.Name, "Heating");
OutputReportPredefined::PreDefTableEntry(
state, state.dataOutRptPredefined->pdchWAHPDD, simpleWatertoAirHP.Name, "Heating");
// update Cooling Coils output reports
OutputReportPredefined::PreDefTableEntry(state,
state.dataOutRptPredefined->pdchCoolCoilLatCap,
companionCoolingCoil.Name,
RatedCapCoolTotalDes - RatedCapCoolSensDes);
OutputReportPredefined::PreDefTableEntry(state,
state.dataOutRptPredefined->pdchCoolCoilSHR,
companionCoolingCoil.Name,
RatedCapCoolSensDes / RatedCapCoolTotalDes);
OutputReportPredefined::PreDefTableEntry(
state, state.dataOutRptPredefined->pdchCoolCoilSensCap, companionCoolingCoil.Name, RatedCapCoolSensDes);
} else {
OutputReportPredefined::PreDefTableEntry(
state, state.dataOutRptPredefined->pdchWAHPDD, companionCoolingCoil.Name, "Cooling");
OutputReportPredefined::PreDefTableEntry(
state, state.dataOutRptPredefined->pdchWAHPDD, simpleWatertoAirHP.Name, "Cooling");
}
// calculate ajustment factor over previous capacity for sensible capacity adjustment
Real64 CapCoolAdjFac = RatedCapCoolTotalDes / state.dataSize->DXCoolCap;
// update cooling coil rated capacity after adjustments based on heating coil size
state.dataSize->DXCoolCap = RatedCapCoolTotalDes;
// sensible cooling capacity
RatedCapCoolSensDes = companionCoolingCoil.RatedCapCoolSens * CapCoolAdjFac; // Assume that SHR stays the same
companionCoolingCoil.RatedCapCoolSensDesAtRatedCdts *= CapCoolAdjFac;
companionCoolingCoil.RatedCapCoolSens = RatedCapCoolSensDes;
RatedCapHeatDes =
RatedCapCoolTotalDes * RatedTotCapTempModFac * simpleWatertoAirHP.RatioRatedHeatRatedTotCoolCap / RatedHeatCapTempModFac;
companionCoolingCoil.RatedCapCoolTotal = RatedCapCoolTotalDes;
companionCoolingCoil.RatedCapCoolAtRatedCdts = RatedCapCoolTotalDes * RatedTotCapTempModFac;
companionCoolingCoil.RatedPowerCoolAtRatedCdts =
companionCoolingCoil.RatedCapCoolAtRatedCdts / companionCoolingCoil.RatedCOPCoolAtRatedCdts;
companionCoolingCoil.RatedPowerCool = companionCoolingCoil.RatedPowerCoolAtRatedCdts / RatedCoolPowerTempModFac;
// update Water-to-Air Heat Pumps output reports
OutputReportPredefined::PreDefTableEntry(state,
state.dataOutRptPredefined->pdchWAHPRatedSensCapAtRatedCdts,
state.dataOutRptPredefined->pdchWAHPRatedCapAtRatedCdts,
companionCoolingCoil.Name,
companionCoolingCoil.RatedCapCoolSensDesAtRatedCdts);
OutputReportPredefined::PreDefTableEntry(state, state.dataOutRptPredefined->pdchWAHPDD, companionCoolingCoil.Name, "Heating");
OutputReportPredefined::PreDefTableEntry(state, state.dataOutRptPredefined->pdchWAHPDD, simpleWatertoAirHP.Name, "Heating");
companionCoolingCoil.RatedCapCoolAtRatedCdts);
// update Cooling Coils output reports
OutputReportPredefined::PreDefTableEntry(state,
state.dataOutRptPredefined->pdchCoolCoilLatCap,
companionCoolingCoil.Name,
RatedCapCoolTotalDes - RatedCapCoolSensDes);
OutputReportPredefined::PreDefTableEntry(state,
state.dataOutRptPredefined->pdchCoolCoilSHR,
companionCoolingCoil.Name,
RatedCapCoolSensDes / RatedCapCoolTotalDes);
OutputReportPredefined::PreDefTableEntry(
state, state.dataOutRptPredefined->pdchCoolCoilSensCap, companionCoolingCoil.Name, RatedCapCoolSensDes);
} else {
OutputReportPredefined::PreDefTableEntry(state, state.dataOutRptPredefined->pdchWAHPDD, companionCoolingCoil.Name, "Cooling");
OutputReportPredefined::PreDefTableEntry(state, state.dataOutRptPredefined->pdchWAHPDD, simpleWatertoAirHP.Name, "Cooling");
state, state.dataOutRptPredefined->pdchCoolCoilTotCap, companionCoolingCoil.Name, RatedCapCoolTotalDes);
BaseSizer::reportSizerOutput(
state,
format("COIL:{}:WATERTOAIRHEATPUMP:EQUATIONFIT", WatertoAirHPNamesUC[static_cast<int>(companionCoolingCoil.WAHPType)]),
companionCoolingCoil.Name,
"Design Size Rated Total Cooling Capacity [W]",
companionCoolingCoil.RatedCapCoolTotal);
BaseSizer::reportSizerOutput(
state,
format("COIL:{}:WATERTOAIRHEATPUMP:EQUATIONFIT", WatertoAirHPNamesUC[static_cast<int>(companionCoolingCoil.WAHPType)]),
companionCoolingCoil.Name,
"Design Size Rated Sensible Cooling Capacity [W]",
companionCoolingCoil.RatedCapCoolSens);
} else if (companionCoolingCoil.WAHPPlantType ==
DataPlant::PlantEquipmentType::CoilWAHPCoolingEquationFit) { // case 2: companion coil is of EquationFit type but is
// not autosized
RatedCapHeatDes = companionCoolingCoil.RatedCapCoolTotal * simpleWatertoAirHP.RatioRatedHeatRatedTotCoolCap;
} else { // case 3: companion type is different than EquationFit
RatedCapHeatDes = state.dataSize->DXCoolCap;
}
RatedCapHeatDes =
RatedCapCoolTotalDes * RatedTotCapTempModFac * simpleWatertoAirHP.RatioRatedHeatRatedTotCoolCap / RatedHeatCapTempModFac;
companionCoolingCoil.RatedCapCoolTotal = RatedCapCoolTotalDes;
companionCoolingCoil.RatedCapCoolAtRatedCdts = RatedCapCoolTotalDes * RatedTotCapTempModFac;
companionCoolingCoil.RatedPowerCoolAtRatedCdts =
companionCoolingCoil.RatedCapCoolAtRatedCdts / companionCoolingCoil.RatedCOPCoolAtRatedCdts;
companionCoolingCoil.RatedPowerCool = companionCoolingCoil.RatedPowerCoolAtRatedCdts / RatedCoolPowerTempModFac;
// update Water-to-Air Heat Pumps output reports
OutputReportPredefined::PreDefTableEntry(state,
state.dataOutRptPredefined->pdchWAHPRatedCapAtRatedCdts,
companionCoolingCoil.Name,
companionCoolingCoil.RatedCapCoolAtRatedCdts);
// update Cooling Coils output reports
OutputReportPredefined::PreDefTableEntry(
state, state.dataOutRptPredefined->pdchCoolCoilTotCap, companionCoolingCoil.Name, RatedCapCoolTotalDes);
BaseSizer::reportSizerOutput(
state,
format("COIL:{}:WATERTOAIRHEATPUMP:EQUATIONFIT", WatertoAirHPNamesUC[static_cast<int>(companionCoolingCoil.WAHPType)]),
companionCoolingCoil.Name,
"Design Size Rated Total Cooling Capacity [W]",
companionCoolingCoil.RatedCapCoolTotal);
BaseSizer::reportSizerOutput(
state,
format("COIL:{}:WATERTOAIRHEATPUMP:EQUATIONFIT", WatertoAirHPNamesUC[static_cast<int>(companionCoolingCoil.WAHPType)]),
companionCoolingCoil.Name,
"Design Size Rated Sensible Cooling Capacity [W]",
companionCoolingCoil.RatedCapCoolSens);
} else if (companionCoolingCoil.WAHPPlantType ==
DataPlant::PlantEquipmentType::CoilWAHPCoolingEquationFit) { // case 2: companion coil is of EquationFit type but is
// not autosized
RatedCapHeatDes = companionCoolingCoil.RatedCapCoolTotal * simpleWatertoAirHP.RatioRatedHeatRatedTotCoolCap;
} else { // case 3: companion type is different than EquationFit
RatedCapHeatDes = state.dataSize->DXCoolCap;
}
// heating capacity final determination
simpleWatertoAirHP.RatedCapHeat = RatedCapHeatDes;
Expand Down Expand Up @@ -2734,8 +2740,8 @@ namespace WaterToAirHeatPumpSimple {

// user provided inputs are assumed to be at rated conditions
simpleWatertoAirHP.RatedPowerHeat = simpleWatertoAirHP.RatedCapHeat / simpleWatertoAirHP.RatedCOPHeatAtRatedCdts;
simpleWatertoAirHP.RatedCapHeatAtRatedCdts = 0;
simpleWatertoAirHP.RatedPowerHeatAtRatedCdts = 0;
simpleWatertoAirHP.RatedCapHeatAtRatedCdts = 0; // not sure why these are set = 0, should be RatedCapHeat?
simpleWatertoAirHP.RatedPowerHeatAtRatedCdts = 0; // should be RatedPowerHeat?
}
// Check that heat pump heating capacity is within 20% of cooling capacity. Check only for heating coil and report both.
if (simpleWatertoAirHP.WAHPType == WatertoAirHP::Heating && simpleWatertoAirHP.CompanionCoolingCoilNum > 0) {
Expand Down Expand Up @@ -2877,20 +2883,19 @@ namespace WaterToAirHeatPumpSimple {
RoutineNameAlt);

if (simpleWatertoAirHP.WAHPType == WatertoAirHP::Heating) {
RatedWaterVolFlowRateDes =
simpleWatertoAirHP.RatedCapHeatAtRatedCdts / (state.dataSize->PlantSizData(PltSizNum).DeltaT * Cp * rho);
RatedWaterVolFlowRateDes = simpleWatertoAirHP.RatedCapHeat / (state.dataSize->PlantSizData(PltSizNum).DeltaT * Cp * rho);
} else if (simpleWatertoAirHP.WAHPType == WatertoAirHP::Cooling) {
// use companion heating coil capacity to calculate volumetric flow rate
if (simpleWatertoAirHP.CompanionHeatingCoilNum > 0) {
auto &companionHeatingCoil(
state.dataWaterToAirHeatPumpSimple->SimpleWatertoAirHP(simpleWatertoAirHP.CompanionHeatingCoilNum));
if (companionHeatingCoil.RatedCapHeat == DataSizing::AutoSize) {
SystemCapacity = simpleWatertoAirHP.RatedCapCoolTotal;
SystemCapacity = simpleWatertoAirHP.RatedCapCoolTotal; // but you should use condenser capacity?
} else {
SystemCapacity = companionHeatingCoil.RatedCapHeat;
}
} else {
SystemCapacity = simpleWatertoAirHP.RatedCapCoolAtRatedCdts;
SystemCapacity = simpleWatertoAirHP.RatedCapCoolAtRatedCdts; // RatedCapCoolTotal ? * (1 + 1/COP) ?
}

RatedWaterVolFlowRateDes = SystemCapacity / (state.dataSize->PlantSizData(PltSizNum).DeltaT * Cp * rho);
Expand Down

1 comment on commit 8cf8dc3

@nrel-bot-2c
Copy link

Choose a reason for hiding this comment

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

develop (Myoldmopar) - x86_64-Linux-Ubuntu-22.04-gcc-11.4: OK (2916 of 2916 tests passed, 0 test warnings)

Build Badge Test Badge

Please sign in to comment.