Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix documentation of VRF Heat Pump Total Heating Rate, should equal the sum of coil heating rate, not air terminal heating rate #10627

Open
wants to merge 17 commits into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -619,7 +619,7 @@ \subsubsection{Outputs}\label{outputs-039}

\paragraph{VRF Heat Pump Total Heating Rate {[}W{]}}\label{vrf-heat-pump-total-heating-rate-w}

This output field is the operating total heating capacity of the variable refrigerant flow heat pump in Watts. The capacity includes any degradation due to defrost mode. This value is calculated for each HVAC system time step being simulated, and the results are averaged for the time step being reported. This value should match the sum of the individual zone terminal unit output variables for Zone VRF Air Terminal Total Heating Rate.
This output field is the operating total heating capacity of the variable refrigerant flow heat pump in Watts. The capacity includes any degradation due to defrost mode. This value is calculated for each HVAC system time step being simulated, and the results are averaged for the time step being reported. This value should match the sum of the individual zone terminal unit heating coil output variables for Heating Coil Heating Rate plus any piping loss.
Copy link
Contributor

Choose a reason for hiding this comment

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

This does seem like the correct definition for the VRF heating capacity.


\paragraph{VRF Heat Pump Cooling Electricity Rate {[}W{]}}\label{vrf-heat-pump-cooling-electric-power-w}

Expand Down Expand Up @@ -1153,6 +1153,10 @@ \subsubsection{Outputs}

Note: refer to the rdd file after a simulation for exact output variable names

\paragraph{VRF Heat Pump Total Heating Rate {[}W{]}}\label{vrf-heat-pump-total-heating-rate-w-fluidTCtrl}

This output field is the operating total heating capacity of the variable refrigerant flow heat pump in Watts. The capacity includes any degradation due to defrost mode. This value is calculated for each HVAC system time step being simulated, and the results are averaged for the time step being reported. This value should match the sum of the individual zone terminal unit heating coil output variables for Heating Coil Heating Rate plus any piping loss.

\paragraph{VRF Heat Pump Compressor Rotating Speed {[}rev/min{]}}\label{vrf-heat-pump-compressor-rotating-speed-revmin}

This output only applies for the VRF-FluidTCtrl model. This is the rotating speed of the compressor, which indicates the loading index.
Expand Down
36 changes: 33 additions & 3 deletions src/EnergyPlus/DXCoils.cc
Original file line number Diff line number Diff line change
Expand Up @@ -17253,6 +17253,7 @@ void ControlVRFIUCoil(EnergyPlusData &state,
MaxSH = 15;
MaxSC = 20;
Garate = state.dataDXCoils->DXCoil(CoilIndex).RatedAirMassFlowRate(1);
// why always limit the minimum fan speed ratio to 0.65?
FanSpdRatioMin = min(OAMassFlow / Garate, 1.0); // ensure that coil flow rate is higher than OA flow rate

if (QCoil == 0) {
Expand Down Expand Up @@ -17388,12 +17389,20 @@ void ControlVRFIUCoil(EnergyPlusData &state,
if (QCoilSenHeatingLoad > QinSenMin1) {
// Modulate fan speed to meet room sensible load; SC is not updated
FanSpdRatioMax = 1.0;
auto f = [QCoilSenHeatingLoad, Ts_1, Tin, Garate, BF](Real64 FanSpdRto) {
return FanSpdResidualHeat(FanSpdRto, QCoilSenHeatingLoad, Ts_1, Tin, Garate, BF);
Tout = Tin + (Ts_1 - Tin) * (1 - BF);
Real64 RatedAirMassFlowRate = state.dataDXCoils->DXCoil(CoilIndex).RatedAirMassFlowRate[0];
auto f = [QCoilSenHeatingLoad, RatedAirMassFlowRate, Tout, Tin, Win](Real64 FanSpdRto) {
return FanSpdResidualHeatUsingH(FanSpdRto, QCoilSenHeatingLoad, RatedAirMassFlowRate, Tout, Tin, Win);
};
General::SolveRoot(state, 1.0e-3, MaxIter, SolFla, Ratio1, f, FanSpdRatioMin, FanSpdRatioMax);
// this will likely cause problems eventually, -1 and -2 mean different things
if (SolFla < 0) Ratio1 = FanSpdRatioMax; // over capacity
if (SolFla < 0) {
if (f(FanSpdRatioMin) <= 0) { // capacity <= demand
Ratio1 = FanSpdRatioMax; // over capacity
} else { // capacity > demand even for the minimum fan speed
Ratio1 = FanSpdRatioMin;
}
}
FanSpdRatio = Ratio1;
CoilOnOffRatio = 1.0;

Expand Down Expand Up @@ -17674,6 +17683,27 @@ Real64 FanSpdResidualHeat(Real64 FanSpdRto, Real64 QCoilSenHeatingLoad, Real64 T
return (TotCap - ZnSenLoad) / ZnSenLoad;
}

Real64 FanSpdResidualHeatUsingH(Real64 FanSpdRto, Real64 QCoilSenHeatingLoad, Real64 RatedAirMassFlowRate, Real64 Tout, Real64 Tin, Real64 Win)
{

// FUNCTION INFORMATION:
// AUTHOR Yujie Xu (yujiex)
// DATE WRITTEN Jul 2024
//
// PURPOSE OF THIS FUNCTION:
// Calculates residual function (desired zone heating load - actual heating coil capacity)
// This is used to modify the fan speed to adjust the coil heating capacity to match
// the zone heating load. This one uses Hin and Hout difference rather than Tin and Tout difference
// like in FanSpdResidualHeat
//
Real64 ZnSenLoad = QCoilSenHeatingLoad;
// +-100 W minimum zone load?
if (std::abs(ZnSenLoad) < 100.0) ZnSenLoad = sign(100.0, ZnSenLoad);
Real64 Wout = Win;
Real64 TotCap = FanSpdRto * RatedAirMassFlowRate * (PsyHFnTdbW(Tout, Wout) - PsyHFnTdbW(Tin, Win));
return (TotCap - ZnSenLoad) / ZnSenLoad;
}

void SetMSHPDXCoilHeatRecoveryFlag(EnergyPlusData &state, int const DXCoilNum)
{

Expand Down
2 changes: 2 additions & 0 deletions src/EnergyPlus/DXCoils.hh
Original file line number Diff line number Diff line change
Expand Up @@ -933,6 +933,8 @@ namespace DXCoils {

Real64 FanSpdResidualHeat(Real64 FanSpdRto, Real64 QCoilSenHeatingLoad, Real64 Ts_1, Real64 Tin, Real64 Garate, Real64 BF);

Real64 FanSpdResidualHeatUsingH(Real64 FanSpdRto, Real64 QCoilSenHeatingLoad, Real64 RatedAirMassFlowRate, Real64 Tout, Real64 Tin, Real64 Win);

void SetMSHPDXCoilHeatRecoveryFlag(EnergyPlusData &state, int const DXCoilNum); // must match coil names for the coil type

void SetDXCoilAirLoopNumber(EnergyPlusData &state, std::string const &CoilName, int const AirLoopNum); // must match coil names for the coil type
Expand Down
27 changes: 17 additions & 10 deletions src/EnergyPlus/HVACVariableRefrigerantFlow.cc
Original file line number Diff line number Diff line change
Expand Up @@ -276,6 +276,9 @@ void SimulateVRF(EnergyPlusData &state,

if (state.dataHVACVarRefFlow->VRF(VRFCondenser).CondenserType == DataHeatBalance::RefrigCondenserType::Water)
UpdateVRFCondenser(state, VRFCondenser);
// add back piping correction to coil side
state.dataDXCoils->DXCoil(state.dataHVACVarRefFlow->VRFTU(VRFTUNum).HeatCoilIndex).TotalHeatingEnergyRate *=
state.dataHVACVarRefFlow->VRF(VRFCondenser).PipingCorrectionHeating;
}
}

Expand Down Expand Up @@ -11705,15 +11708,19 @@ void VRFCondenserEquipment::CalcVRFCondenser_FluidTCtrl(EnergyPlusData &state, c
this->VRFCondCyclingRatio = CyclingRatio;

Tsuction = this->EvaporatingTemp; // Outdoor unit evaporating temperature
this->HeatingCapacity =
this->CoffEvapCap * this->RatedEvapCapacity * CurveValue(state, this->OUCoolingCAPFT(NumOfCompSpdInput), Tdischarge, Tsuction) +
this->RatedCompPower * CurveValue(state,
this->OUCoolingPWRFT(NumOfCompSpdInput),
Tdischarge,
Tsuction); // Include the piping loss, at the highest compressor speed
if (FirstHVACIteration) {
this->HeatingCapacity =
this->CoffEvapCap * this->RatedEvapCapacity * CurveValue(state, this->OUCoolingCAPFT(NumOfCompSpdInput), Tdischarge, Tsuction) +
this->RatedCompPower * CurveValue(state,
this->OUCoolingPWRFT(NumOfCompSpdInput),
Tdischarge,
Tsuction); // Include the piping loss, at the highest compressor speed
}
this->PipingCorrectionHeating = TU_HeatingLoad / (TU_HeatingLoad + Pipe_Q_h);
state.dataHVACVarRefFlow->MaxHeatingCapacity(VRFCond) =
this->HeatingCapacity; // for report, maximum condensing capacity the system can provide
if (state.dataHVACVarRefFlow->MaxHeatingCapacity(VRFCond) == Constant::MaxCap) {
state.dataHVACVarRefFlow->MaxHeatingCapacity(VRFCond) =
this->HeatingCapacity; // for report, maximum condensing capacity the system can provide
}

this->CoolingCapacity = 0.0; // Include the piping loss
this->PipingCorrectionCooling = 1.0;
Expand Down Expand Up @@ -12064,10 +12071,10 @@ void VRFCondenserEquipment::CalcVRFCondenser_FluidTCtrl(EnergyPlusData &state, c

// From the VRF_FluidTCtrl model
TotalCondHeatingCapacity = this->HeatingCapacity;
TotalTUHeatingCapacity = TotalCondHeatingCapacity * this->PipingCorrectionHeating;
TotalTUHeatingCapacity = TotalCondHeatingCapacity;

if (TotalCondHeatingCapacity > 0.0) {
HeatingPLR = min(1.0, (this->TUHeatingLoad / this->PipingCorrectionHeating) / TotalCondHeatingCapacity);
HeatingPLR = min(1.0, (this->TUHeatingLoad) / TotalCondHeatingCapacity);
HeatingPLR += (LoadDueToDefrost * HeatingPLR) / TotalCondHeatingCapacity;
} else {
HeatingPLR = 0.0;
Expand Down
Loading