NREL / EnergyPlus

EnergyPlus™ is a whole building energy simulation program that engineers, architects, and researchers use to model both energy consumption and water use in buildings.
https://energyplus.net
Other
1.07k stars 381 forks source link

Issue with VRF Heat Pump COP and Electricity Rate #9252

Closed TiejunWu closed 1 year ago

TiejunWu commented 2 years ago

Issue overview

In the attached EnergyPlus example with VRF system object "AirConditioner:VariableRefrigerantFlow", I found the output variable VRF Heat Pump COP is very low and Electricity Rate very high. In this model, the user specified Rated Cooling COP is 2.753. However, in the calculation output, the COP for July 16 is less than 1.9 for the whole day, even though the outdoor air temperature is much lower than the rating condition outdoor air temperature of 35 C.

In the attached Excel spreadsheet file, I did a manual calculation of the VRF unit COP and electricity rate based on the performance curves and compared with the EnergyPlus output. Based on the results, I think the RHS of the following two equations should multiply the "VRF Heat Pump Part Load Ratio", though I am not sure which variable it corresponds to in the source code.

https://github.com/NREL/EnergyPlus/blob/0474bcff0f09143605459c4168e69a17d49e7dd1/src/EnergyPlus/HVACVariableRefrigerantFlow.cc#L1183-L1184

https://github.com/NREL/EnergyPlus/blob/0474bcff0f09143605459c4168e69a17d49e7dd1/src/EnergyPlus/HVACVariableRefrigerantFlow.cc#L1205-L1206

Details

Some additional details for this issue (if relevant):

Checklist

Add to this list or remove from it as applicable. This is a simple templated set of guidelines.

rraustad commented 2 years ago

VRFRTF is the part load ratio adjusted by the part load fraction curve. RTF = PLR / PLF. At PLR = 1, PLF also = 1 and RTF = PLR. At PLR = 0.0000001, PLF >= 0.7, so RTF is a little bit higher than PLR. PLR is the part of the time step the component operates, an indication of thermal energy. The RTF is an ajustment to PLR based on start up delay (i.e., the instant the comprssor starts, the output is not at maximum, and gradually rises to maximum over a period of minutes), an indication of electrical energy. The PLF curve specifies the start up delay.

At a PLR of say 0.5, the compressor is turning on and off. As the compressor turns on it takes a little time to get to full output. This is the start up delay accounted for by the model. It takes a little more electrical energy to produce the thermal energy when the compressor cycles.

When calculating a thermal output (e.g., capacity) use the PLR variable, when calculating electrical output (e.g. power) use the RTF variable.

TiejunWu commented 2 years ago

@rraustad Thanks for looking into this.

For this VRF unit in the example. The following parameters are used in the calculation:

  1. Sizing calculation result: Rated Cooling Capacity = 28594.11 [W]
  2. User input in IDF file: Rated Cooling COP = 2.753
  3. User input in IDF file: Minimum Part Load Ratio = 0.25

Here I pick two time steps in the EnergyPlus output file:

  1. Time Step at 07/16 15:00:00 (at this time step the heat pump is running 100% of the time at part load, no cycling) EnergyPlus Output Variable Variables: VRF Heat Pump Total Cooling Rate = 8808.607 [W] VRF Heat Pump Cooling Electricity Rate = 4742.745 [W] VRF Heat Pump Cooling COP = 1.85728 VRF Heat Pump Part Load Ratio = 0.3138 VRF Heat Pump Runtime Fraction = 1 VRF Heat Pump Cycling Ratio = 1

    I interperet this result as the VRF outdoor unit is running 100% of the time step at Part Load Ratio of 0.3138, there is no cycling. My manual calculation based on the Rating Condition Performance and the performance curves show the following:

    Full Load Capacity = Rated Cooling Capacity Capacity Correction based on Temperature = 28594.11 0.9816 = 28067.31 [W] If I divide the VRF Heat Pump Total Cooling Rate by the Full Load Capacity, the result is:

    VRF Heat Pump Total Cooling Rate / Full Load Capacity = 8808.607 / 28594.11 = 0.3138

    This value agrees with the EnergyPlus output VRF Heat Pump Part Load Ratio.

    Then to calculate the Electricity Power Consumption, I did the following calculation to get the cooling COP of the heat pump.

    EIR Temperature Correction Factor = 0.9391 EIR Part Load Correction Factor = 0.4953 Heat Pump Operating COP = Rated Cooling COP / EIR Temperature Correction Factor / EIR Part Load Correction Factor = 2.753 / 0.9391 / 0.4953 = 5.9182

    Based on the COP and thermal output of the VRF unit at this time step, I can get the Electricity Comsunption Rate by:

    Heat Pump Electricity Rate = VRF Heat Pump Total Cooling Rate / Heat Pump Operating COP = 8808.607 / 5.9182 = 1488.4 [W]

    Looks like the ratio of the manually calculated heat pump electricity rate to the EnergyPlus output is:

    1488.4 / 4742.745 = 0.3138

    The ratio is exactly the part load ratio.

  2. Time Step at 07/16 13:00:00 (at this time step the heat pump is cycling at the minimum Part Load Ratio of 0.25) EnergyPlus Output Variable Variables: VRF Heat Pump Total Cooling Rate = 5534.549 [W] VRF Heat Pump Cooling Electricity Rate = 3655.428 [W] VRF Heat Pump Cooling COP = 1.5141 VRF Heat Pump Part Load Ratio = 0.25 VRF Heat Pump Runtime Fraction = 0.8228 VRF Heat Pump Cycling Ratio = 0.7979

    I interperet this result as the VRF outdoor unit is cycling on for 82.28% of the time step at Part Load Ratio of 0.25 to meet the load. The heat pump Total Cooling Rate is 79.79% of the cooling capacity at 0.25 Part Load Ratio, but due to cycling delay, it has to run 82.28% of the time.

    My manual calculation based on the Rating Condition Performance and the performance curves shows the following:

    Full Load Capacity = Rated Cooling Capacity Capacity Correction based on Temperature = 28594.11 0.703 = 27745.37 [W] If I divide the VRF Heat Pump Total Cooling Rate by the Full Load Capacity, the result is:

    VRF Heat Pump Total Cooling Rate / Full Load Capacity = 5534.549 / 27745.37 = 0.1995

    Since this value is less than the Minimum Part Load Ratio of 0.25, the heat pump has to cycle at the minimum Part Load of 0.25. The cycling Rate is: VRF Heat Pump Total Cooling Rate / Capacity at Minimum Part Load

    5534.549 / (27745.37 * 0.25) = 0.7979 This value agrees with the EnergyPlus output value of Cycling Ratio.

    Based on the Part Load Fraction Correction factor equation, the correction factor is: 0.85 + 0.15* Cycling Ratio = 0.969685

    So the Run Time Fraction is

    Cycling Ratio / Part Load Correction Factor = 0.7979 / 0.969685 = 0.8228 This agrees with the EnergyPlus output value for RTF.

    Then to calculate the Electricity Power Consumption, I did the following calculation to get the cooling COP of the heat pump.

    EIR Temperature Correction Factor = 0.9321 EIR Part Load Correction Factor = 0.4729 Heat Pump Operating COP = Rated Cooling COP / EIR Temperature Correction Factor / EIR Part Load Correction Factor = 2.753 / 0.9321 / 0.4729 = 6.2458

    Based on the COP and thermal output of the VRF unit at this time step, I can get the Electricity Consumption Rate by:

    Heat Pump Electricity Rate = VRF Heat Pump Total Cooling Rate / Heat Pump Operating COP = 5534.549 / 6.2458 = 913.8 [W]

    Looks like the ratio of the manually calculated heat pump electricity rate to the EnergyPlus output is:

    913.8 / 3655.428 = 0.25

    The ratio is exactly the part load ratio.

In summary, looks like in the EnergyPlus output variables, these two variables: VRF Heat Pump Cooling Electricity Rate VRF HEAT PUMP:VRF Heat Pump Cooling COP are off from what they should be, missing the Part Load Ratio in the equation. All other output variables make sense to me. I did the same calculations for heating conditions and looks like the same thing happens for two variables related to heating: VRF Heat Pump Heating Electricity Rate VRF HEAT PUMP:VRF Heat Pump Heating COP

That is how I traced to the two spots in the source code.

rraustad commented 2 years ago

The VRF compressor operates the entire time step when PLR > Minimum Heat Pump Part-Load Ratio (input field in AirConditioner:VariableRefrigerantFlow). So the PLR, RTF, and cycling ratio numbers above look correct.

Regarding the COP the underlying equation is, review these calculations:

state.dataHVACVarRefFlow->VRF(VRFCond).TotalCoolingCapacity = TotalCondCoolingCapacity * CoolingPLR * CyclingRatio;
state.dataHVACVarRefFlow->VRF(VRFCond).TotalHeatingCapacity = TotalCondHeatingCapacity * HeatingPLR * CyclingRatio;

and then many lines down almost at the end of the function:

// calculate operating COP
if (state.dataHVACVarRefFlow->CoolingLoad(VRFCond) && CoolingPLR > 0.0) {
    if (state.dataHVACVarRefFlow->VRF(VRFCond).ElecCoolingPower != 0.0) {
        // this calc should use delivered capacity, not condenser capacity, use VRF(VRFCond)%TUCoolingLoad
        state.dataHVACVarRefFlow->VRF(VRFCond).OperatingCoolingCOP =
            (state.dataHVACVarRefFlow->VRF(VRFCond).TotalCoolingCapacity) /
            (state.dataHVACVarRefFlow->VRF(VRFCond).ElecCoolingPower + state.dataHVACVarRefFlow-VRF(VRFCond).CrankCaseHeaterPower +
             state.dataHVACVarRefFlow->VRF(VRFCond).EvapCondPumpElecPower + state.dataHVACVarRefFlow-VRF(VRFCond).DefrostPower);
    } else {
        state.dataHVACVarRefFlow->VRF(VRFCond).OperatingCoolingCOP = 0.0;
    }
}
if (state.dataHVACVarRefFlow->HeatingLoad(VRFCond) && HeatingPLR > 0.0) {
    if (state.dataHVACVarRefFlow->VRF(VRFCond).ElecHeatingPower != 0.0) {
        // this calc should use delivered capacity, not condenser capacity, use VRF(VRFCond)%TUHeatingLoad
        state.dataHVACVarRefFlow->VRF(VRFCond).OperatingHeatingCOP =
            (state.dataHVACVarRefFlow->VRF(VRFCond).TotalHeatingCapacity) /
            (state.dataHVACVarRefFlow->VRF(VRFCond).ElecHeatingPower + state.dataHVACVarRefFlow-VRF(VRFCond).CrankCaseHeaterPower +
             state.dataHVACVarRefFlow->VRF(VRFCond).EvapCondPumpElecPower + state.dataHVACVarRefFlow-VRF(VRFCond).DefrostPower);
    } else {
        state.dataHVACVarRefFlow->VRF(VRFCond).OperatingHeatingCOP = 0.0;
    }
}
edwardv720 commented 1 year ago

VRFRTF is the part load ratio adjusted by the part load fraction curve. RTF = PLR / PLF. At PLR = 1, PLF also = 1 and RTF = PLR. At PLR = 0.0000001, PLF >= 0.7, so RTF is a little bit higher than PLR. PLR is the part of the time step the component operates, an indication of thermal energy. The RTF is an ajustment to PLR based on start up delay (i.e., the instant the comprssor starts, the output is not at maximum, and gradually rises to maximum over a period of minutes), an indication of electrical energy. The PLF curve specifies the start up delay.

At a PLR of say 0.5, the compressor is turning on and off. As the compressor turns on it takes a little time to get to full output. This is the start up delay accounted for by the model. It takes a little more electrical energy to produce the thermal energy when the compressor cycles.

When calculating a thermal output (e.g., capacity) use the PLR variable, when calculating electrical output (e.g. power) use the RTF variable.

@rraustad I agree RTF = PLR / PLF but in the code it's actually calculated as VRFRTF = min(1.0, (CyclingRatio / PartLoadFraction)); and the CoolingPLR and CyclingRatio represent different things.

@rraustad @TiejunWu I think we can look at things in another way.

In a timestep where the VRF is operating at part load (PLR <1) but not cycling (CyclingRatio=RTF=1), by taking the following equation and expanding it

vrf.ElecCoolingPower = (vrf.RatedCoolingPower * TotCoolCapTempModFac) * TotCoolEIRTempModFac * EIRFPLRModFac * HREIRAdjustment * VRFRTF

we get

vrf.ElecCoolingPower = (RatedCoolingCapacity/RatedCoolingCOP TotCoolCapTempModFac) TotCoolEIRTempModFac EIRFPLRModFac HREIRAdjustment * VRFRTF

vrf.ElecCoolingPower = (RatedCoolingCapacity TotCoolCapTempModFac) (RatedEIR TotCoolEIRTempModFac EIRFPLRModFac) HREIRAdjustment VRFRTF

where (RatedCoolingCapacity*TotCoolCapTempModFac) = heating capacity adjusted for temperature

But the VRF is in part load operation and while the EIR has been adjusted for part load, the heating rate used has not.

edwardv720 commented 1 year ago

I think this all stems from the fact that there's a missing PLR factor in the vrf.ElecCoolingPower calculation in the code.

While the actual cooling rate adjusted with the PLR (vrf.TotalCoolingCapacity) shows up in the COP calculations https://github.com/NREL/EnergyPlus/blob/871b31f9c719b7d81f1bc7c97cd80dcd2679413c/src/EnergyPlus/HVACVariableRefrigerantFlow.cc#L1284-L1285

It isn't used in the vrf.ElecCoolingPower calculation (nor has the equation been adjusted with the PLR) https://github.com/NREL/EnergyPlus/blob/871b31f9c719b7d81f1bc7c97cd80dcd2679413c/src/EnergyPlus/HVACVariableRefrigerantFlow.cc#L1167

jcyuan2020 commented 1 year ago

This seems to be related to a recent helpdesk Ticket 16272 (and the ticket author @edwardv720 is obviously making some comments here). @rraustad If you are not currently actively working on this, would you mind if I take a look?

rraustad commented 1 year ago

Have at it. I was going to look at the code to check if HREIRAdjustment is all that is needed when VRFRTF = 1 (always equals 1 above min PLR) and the cooling load is less than the available capacity.

jcyuan2020 commented 1 year ago

Thanks! @rraustad

edwardv720 commented 1 year ago

Hi @jcyuan2020 just a friendly check in to see if there's an update on the issue . I'm also attaching 2 x idf and a set of results that would better show where the problem might be.

The idfs each contain identical VRFs with the EIRFPLR curve set to 1 for simplicity, except in one VRF, the minimum plr is set to 0.3, while the other is 0.6. The idea is, for identical VRFs with different minimum PLR and ignoring EIR-PLR and PLF effects, the 2 should operate identically (i.e. VRF capacity/power only func of temperature). For example, when both VRF are operating at PLR = 0.2, one is cycling btw 0% and 30% , the other is cycling btw 0% and 60% to meet the same load. And because the effect of EIR-PLR and cycling losses are ignored, the input power should be the same because they're meeting the same load.

However, the results show 60% min PLR-VRF uses 50% of the input power as the 30% min PLR-VRF, because there's an extra 1/PLR factor (1/0.3 = 1/(0.3*2))

office_vrf_30_percent_min_plr.txt office_vrf_60_percent_min_plr.txt ratio_vrf_power_input.xlsx

khaddad commented 1 year ago

@jcyuan2020, @rraustad , and @edwardv720: I wanted to share this comment with you on this topic.

EIRrated = 1/COPrated EIR = PLR/COP EIRFPLR = EIR/EIRrated = (COPrated/COP) x PLR

This indicates then that the effect of PLR is already included in the function EIRFPLR. This seems to be a matter of definition of what EIR is. It has to include the effect of PLR. If it doesn't then an additional correction factor (PLR) is needed. This methodology is also used in other models such as 'Chiller:Electric:EIR'. I'm joining this discussion late so I might be missing something else in the model formulation that is the source of the problem you're trying to solve.

edwardv720 commented 1 year ago

I think incorporating the PLR in the EIRFPLR curve might be the best fix for users using a prev version of E+ but formally incorporating it within the definition of existing EIRFPLR curves would be a misnomer because I believe the working definition of all EIRFPLR or EIRFTemp from other models are strictly EIR modifying factors (i.e. EIRFPLR or EIRFTemp curves are regressions of EIR vs PLR or EIR vs Temp plots and not EIR*PLR vs PLR).

In the Chiller:Electric:EIR model, even though the chiller input power (image) is defined as the PLR & temperature adjusted input power, which implies the PLR must be incorporated within ChillerEIRFPLR, image https://github.com/NREL/EnergyPlus/blob/develop/doc/engineering-reference/src/simulation-models-encyclopedic-reference/chillers.tex#L1312

the description of the ChillerEIRFPLR actually refers to a curve that parametrizes the "chiller input power ratio" (i.e. EIR modifier not EIR*PLR modifier). image https://github.com/NREL/EnergyPlus/blob/develop/doc/engineering-reference/src/simulation-models-encyclopedic-reference/chillers.tex#L1308

Also, to maintain consistency in variable naming, the ChillerEIRFPLR only should modify the EIR because the description the ChillerEIRFTemp says it's strictly an EIR modifying factor; so, the ChillerEIRPLR when multiplied by the Ref EIR should yield the EIR at part load conditions (there shouldn't be an extra PLR factor). imagehttps://github.com/NREL/EnergyPlus/blob/develop/doc/engineering-reference/src/simulation-models-encyclopedic-reference/chillers.tex#L1292