Skip to content

Commit

Permalink
Merge branch 'develop' into 10065ChillerHeaterMisbehavin
Browse files Browse the repository at this point in the history
  • Loading branch information
RKStrand committed Jul 5, 2024
2 parents 4ac97f5 + 1033bdc commit 46cf11b
Show file tree
Hide file tree
Showing 21 changed files with 25,042 additions and 68 deletions.
13 changes: 13 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -437,6 +437,7 @@ mark_as_advanced(KIVA_EXE_BUILD)
mark_as_advanced(KIVA_GROUND_PLOT)
mark_as_advanced(KIVA_STATIC_LIB)
mark_as_advanced(KIVA_TESTING)
mark_as_advanced(KIVA_WERROR)
mark_as_advanced(BTWXT_COVERAGE)
mark_as_advanced(BUILD_BTWXT_TESTING)
mark_as_advanced(BTWXT_STATIC_LIB)
Expand Down Expand Up @@ -488,3 +489,15 @@ mark_as_advanced(ENABLE_SANITIZER_LEAK)
mark_as_advanced(ENABLE_SANITIZER_MEMORY)
mark_as_advanced(ENABLE_SANITIZER_THREAD)
mark_as_advanced(ENABLE_SANITIZER_UNDEFINED_BEHAVIOR)
mark_as_advanced(X11_xcb_xkb_INCLUDE_PATH)
mark_as_advanced(ENABLE_SANITIZER_UNDEFINED_BEHAVIOR)
mark_as_advanced(JSONCPP_USE_SECURE_MEMORY)
mark_as_advanced(JSONCPP_WITH_CMAKE_PACKAGE)
mark_as_advanced(JSONCPP_WITH_PKGCONFIG_SUPPORT)
mark_as_advanced(JSONCPP_WITH_POST_BUILD_UNITTE)
mark_as_advanced(JSONCPP_WITH_STRICT_ISO)
mark_as_advanced(JSONCPP_WITH_TESTS)
mark_as_advanced(JSONCPP_WITH_WARNING_AS_ERROR)
mark_as_advanced(CMAKE_CXX_COMPILER_LAUNCHER)
mark_as_advanced(CMAKE_C_COMPILER_LAUNCHER)
mark_as_advanced(DEBUG_LIBNAME_SUFFIX)
122 changes: 122 additions & 0 deletions design/FY2024/NFP_VariableCondenserFlowRequest.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
Variable Condenser Flow Request
=================================

**Jeremy Lerond, Pacific Northwest National Laboratory**


## Justification for New Feature ##

Issue [#7111](https://github.com/NREL/EnergyPlus/issues/7111)
- "User file with Chiller:Electric:EIR always requests full condenser flow rate"
- "This is a problem not only when using cooling towers, but also when using seawater cooling by PlantComponent:TemperatureSource. Unlike cooling towers, it is not possible to make a compromise of variable tower fans instead of variable condenser water."

## E-mail and Conference Call Conclusions ##

Notes from the 5/15/2024 technicalities call:
- TRANE trace scales the condenser flow request based on the chiller PLR
- The new chiller input is different than the existing chiller flow mode input (evaporator side)
- Implement the new inputs and logic for both the `Chiller:Electric:EIR` and `Chiller:Electric:ReformulatedEIR`

## Overview ##

Chilled water plant designs can include variable flow condenser requests from chillers. Currently, the `Chiller:Electric:EIR` and `Chiller:Electric:ReformulatedEIR` objects request the maximum condenser flow rate every time a chiller is active. This new feature will implement new control strategies to allow users to model variable flow condenser requests from chillers.

## Approach ##

Three new control approaches will be implemented:
1. When used in conjunction with a cooling tower, users will be able to use the approach from the _Fundamentals of Design and Control of Central Chilled-Water Plants_ which correlates the condenser water flow ratio to the chilled water plant's PLR as follows: `CWFR = C . PLR + D`, where `CWFR` is the condenser water flow ration (actual/design), `C` and `D` are user specified coefficients (for proposed values see _Optimizing Design & Control Of Chilled Water Plants, Part 5_, S. Taylor, ASHRAE Journal June 2012) and `PLR` is the chilled water plant loop part load ratio (actual/design). The condenser loop flow would be calculated as `m_dot_CW = CWFR * m_dot_CW_design`. Because the request comes from the chillers, the chiller request will be determined as follows: `m_dot_CW_chiller = m_dot_CW * Q_chiller / Q_CHW`. Where `Q_chiller` is the chiller load and `Q_CHW` is the chilled water loop load. So if a chilled water plant loop has two chillers, then `Q_CHW = Q_chiller_1 + Q_chiller_2`.
2. When no cooling tower are used, users will be able to specify that the condenser water flow request will be determined as follows: `m_dot_CW_chiuller = Q_condenser / (C_p .dT)` where dT is the delta T across the condenser.
3. A simplified approach to 1. will also be implemented which will set the request condenser flow rate for each chiller to be `m_dot_CW_chiller = PLR_chiller * m_dot_max_condenser_chiller`.

## Testing/Validation/Data Sources ##

Unit tests will be added to confirm the correct implementation of these control strategies.

## Input Output Reference Documentation ##

A description of the new field will be added to the input output reference manual.

## Input Description ##

```
Chiller:Electric:EIR,
\min-fields 23
\memo This chiller model is the empirical model from the DOE-2 building Energy
\memo simulation program. Chiller performance at off-reference conditions is modeled
\memo using three polynomial equations. Three curves objects are required.
[...]
A16, \field End-Use Subcategory
\note Any text may be used here to categorize the end-uses in the ABUPS End Uses by Subcategory table.
\type alpha
\retaincase
\default General
A17, \field Condenser Flow Control
\note Select the chiller condenser flow request mode. With "ConstantFlow" a chiller will always request
\note its maximum condenser flow rate. With "ModulatedChillerPLR" the condenser flow request corresponds
\note to the chiller part load ratio multiplied by the chiller maximum condenser flow rate. With
\note "ModulatedLoopPLR" the chiller will request a flow rate that is function of the chilled water
\note loop's part load ratio, see the "Condenser Loop Flow Rate Fraction Function of Loop Part Load Ratio
\note Curve Name" input. With "ModulatedDeltaTemperature" the chiller will request the flow rate required
\note to meet a condenser loop delta temperature, see the "Temperature Difference Across Condenser" and
\note "Temperature Difference Across Condenser Schedule Name" input.
\note Use "ConstantFlow" when modeling a constant flow condenser plant loop, choose one of the other inputs
\note when modeling a variable flow condenser plant loop.
\key ConstantFlow
\key ModulatedChillerPLR
\key ModulatedLoopPLR
\key ModulatedDeltaTemperature
\default ConstantFlow
A18, \field Condenser Loop Flow Rate Fraction Function of Loop Part Load Ratio Curve Name
\note Condenser loop flow rate fraction as a function of the chiller water loop part load ratio. A linear
\note curve is expected.
\note CWFR = C * PLR + D
\note Where:
\note CWFR is the condenser water flow fraction (actual/design)
\note C and D are coefficients, see "Optimizing Design & Control Of Chilled Water Plants, Part 5",
\note S. Taylor, ASHRAE Journal June 2012 PLR is the chilled water plant loop part load ratio
\note (actual/design). This input is only used when the "ModulatedLoopPLR" condenser flow control
\note option is used.
\type object-list
\object-list UnivariateFunctions
A20, \field Temperature Difference Across Condenser Schedule Name
\note A schedule that defines the temperature difference across the condenser. This input is used to
\note calculate the condenser flow. This input is only used when "Condenser Flow Control" is set to
\note "ModulatedDeltaTemperature".
\type object-list
\object-list ScheduleNames
N19; \field Condenser Minimum Flow Fraction
\note This input corresponds to the minimum flow fraction to be simulated. The minimum condenser flow
\note corresponds to this fraction multiplied by the maximum condenser flow rate. This input is only used
\note when the "Condenser Flow Control" input is set to "ModulatedChillerPLR", "ModulatedLoopPLR" or
\note "ModulatedDeltaTemperature".
\type real
\minimum 0.0
\maximum 1.0
\default 0.2
```

Similar input will be implemented for the `Chiller:Electric:ReformulatedEIR` object.

## Outputs Description ##

No new output will be added.

## Engineering Reference ##

A new section will be added to the Chiller section of the Engineering Reference to provide details on the control approach as shown in the Approach section of this document.

A note will be added indicating that chiller performance will be only impacted when simulating a `Chiller:Electric:ReformulatedEIR` since this chiller object has its part load performance impacted by the leaving chiller condenser temperature.

## Example File and Transition Changes ##

No transition will be necessary.

New example files will be provided to showcase the new feature.

## References ##

- "Optimizing Design & Control Of Chilled Water Plants, Part 2", S. Taylor, ASHRAE Journal Sept 2011
- "Optimizing Design & Control Of Chilled Water Plants, Part 5", S. Taylor, ASHRAE Journal June 2012
- "Optimizing Chilled Water Plan Control", M. Hydeman, ASHRAE Journal June 2007
- "Carrier® ChillerVu™ Variable Flow Condenser Pump Application Guide", https://www.shareddocs.com/hvac/docs/1000/Public/0A/11-808-577-01.pdf
- "Achieving Variable Condenser Water Flow with VFDs" https://www.esmagazine.com/articles/99689-achieving-variable-condenser-water-flow-with-vfds
Original file line number Diff line number Diff line change
Expand Up @@ -2647,6 +2647,15 @@ \subsubsection{Heat Pump Performance Calculations}\label{eir-air-to-water-heat-p
\dot{Q}_{avail} = \dot{Q}_{ref} \times CAPFT
\end{equation}

If heat recovery is active, the capacity of the heat pump is a function of the load-side outlet temperature and the heat recovery-side inlet temperature. Again the heat pump is assumed to meet the load-side temperature set point and therefore the load-side outlet temperature is assumed to be the set point temperature.

\begin{equation}
CAPFT = f(T_{setpoint}, T_{heatrecovery,\; inlet})
\end{equation}
\begin{equation}
\dot{Q}_{avail} = \dot{Q}_{ref} \times CAPFT
\end{equation}

\subsubsection{Dry Outdoor Coil Calculations (Heating mode only)}\label{eir-air-to-water-heat-pumps-dry-coil-calculations}
For air-cooled heat pumps a dry coil correction factor, if used, is applied for heating operation. As the moisture content of the ambient air changes the heating capacity also changes. This change in performance is limited to an ambient relative humidity range of 60 - 90\% where below 60\% the outdoor coil is dry and reduces heating capacity and above 90\% the coil is fully wet and yields full heating capacity. In the following equations, below 60\% relative humidity the $Factor_{correction} = Factor_{correction,\;dry}$ and above 90\% relative humidity the $Factor_{correction} = 1$. These calculations apply only to heating operation.
\begin{equation}
Expand Down Expand Up @@ -2902,6 +2911,77 @@ \subsubsection{Final Calculation of Load and Energy, Power and Electricity, and
{Q}_{source} = \dot{Q}_{source} \times TimeStepInSeconds
\end{equation}

\subsection{Air to Water Heat Pumps with Heat Recovery}\label{air-to-water-heat-pumps-with-heat-recovery}

This section describes an air-to-water heat pump with a heat recovery option. The heat pump object is based on \textit{HeatPump:PlantLoop:EIR:Cooling} and \textit{HeatPump:PlantLoop:EIR:Heating}. The heat recovery options are supported using heat recovery refrigerant-to-water heat exchangers (condenser or evaporator coils) that connect to hot water or chilled water heat recovery plant loops. These objects have fluid inlet and outlet nodes connecting them to a heat recovery plant loop. When these objects are connected to the heat recovery plant loop and the entering fluid temperature is favorable for heat recovery, then the heat recovery operation is enabled

\subsubsection{Heat Recovery Equipment Capacity}
The heat recovery capacity is derived from the load side capacity of the heat pump by applying energy balance around the heat pump. The hot water and chilled water recovery capacities are calculated as follows:

\begin{equation}
\dot{Q}_\mathrm{Cap,\; HW} = \dot{Q}_\mathrm{RefCap,\; cool} \times \mathrm{(1 + COP_\mathrm{cool})}
\end{equation}

\begin{equation}
\dot{Q}_\mathrm{Cap,\; CHW} = \dot{Q}_\mathrm{RefCap,\; heat} \times \mathrm{(1 - COP_\mathrm{heat})}
\end{equation}

\subsubsection{Heat Recovery Reference Fluid Flow Rate}
The heat recovery fluid reference volume flow rates are determined from the heat recovery capacity, design temperature difference of the heat recovery loop, specific heat capacity of the heat recovery fluid and density of the heat recovery fluid as follows:

\begin{equation}
\dot{V}_\mathrm{heatrecovery,\; HW} = \frac{\dot{Q}_\mathrm{Cap,\; HW}}{\mathrm{Cp}_\mathrm{HW} \times \mathrm{Den}_\mathrm{HW} \times \mathrm{deltaT}_\mathrm{HW}}
\end{equation}

\begin{equation}
\dot{V}_\mathrm{heatrecovery,\; CHW} = \frac{\dot{Q}_\mathrm{Cap,\; CHW}}{\mathrm{Cp}_\mathrm{CHW} \times \mathrm{Den}_\mathrm{CHW} \times \mathrm{deltaT}_\mathrm{CHW}}
\end{equation}

\subsubsection{Heat Recovery Rate}
The hot water or chilled water heat recovery rate is determined from the load side heat transfer rate and the electric power usage rate based on energy conservation as follows:

\begin{equation}
\mathrm{Q}_\mathrm{HW} = \dot{Q}_\mathrm{load,\; cool} + \mathrm{Power}
\end{equation}

\begin{equation}
\mathrm{Q}_\mathrm{CHW} = \dot{Q}_\mathrm{load,\; heat} - \mathrm{Power}
\end{equation}

The heat recovery does not occur when the heat recovery hot water outlet temperature exceed the user specified maximum temperature limit or when the heat reovery chilled water outlet temperature drops below the minimum temperature limit. Therefore, the heat recovery operation is disabled when heat recovery loop temeprature reaches at these temperature limits.

\subsubsection{Heat Recovery Outlet Temperature}
The heat recovery fluid outlet temperature is determiend from the heat recovery rate, specific heat of the fluid, and the heat recovery inlet temperature.

\begin{equation}
\mathrm{T}_\mathrm{HW,\; Out} = \mathrm{T}_\mathrm{HW,\; In} + \frac{\mathrm{Q}_\mathrm{HW}}{\mathrm{Cp}_\mathrm{HW} \times \dot{m}_\mathrm{heatrecovery,\; HW}}
\end{equation}

\begin{equation}
\mathrm{T}_\mathrm{CHW,\; Out} = \mathrm{T}_\mathrm{CHW,\; In} - \frac{\mathrm{Q}_\mathrm{CHW}}{\mathrm{Cp}_\mathrm{CHW} \times \dot{m}_\mathrm{heatrecovery,\; CHW}}
\end{equation}

When the heat recovery outlet temperature exceeds the user-specified maximum or minimum temperature limits, the outlet temperatures are capped at this temperature, and the delivered heat recovery rate is recalculated based on these user specified temperature limits.

\begin{equation}
\dot{Q}_\mathrm{HW,\; limit} = \dot{m}_\mathrm{HW} \times \mathrm{Cp}_\mathrm{HW} \times {(\mathrm{T}_\mathrm{HW,\; limit} - \mathrm{T}_\mathrm{HW,\; In})}
\end{equation}

\begin{equation}
\dot{Q}_\mathrm{CHW,\; limit} = \dot{m}_\mathrm{CHW} \times \mathrm{Cp}_\mathrm{CHW} \times {(\mathrm{T}_\mathrm{CHW,\; In} - \mathrm{T}_\mathrm{CHW,\; limit})}
\end{equation}

The net difference between the potential heat recovery rate and delivered heat recovery rate is reported as source side heat transfer rate and is calculated as follows:

\begin{equation}
\dot{Q}_\mathrm{source,\; cool} = \dot{Q}_\mathrm{HW} - \dot{Q}_\mathrm{HW,\; limit}
\end{equation}

\begin{equation}
\dot{Q}_\mathrm{source,\; heat} = \dot{Q}_\mathrm{CHW} - \dot{Q}_\mathrm{CHW,\; limit}
\end{equation}


\subsection{Fuel-Fired Air to Water Heat Pumps}\label{fuel-fired-air-to-water-heat-pumps}

This section describes the EIR formulated model for fuel-fired plant loop absorption air-to-water heat pumps. The object is similar to a conventional air-to-water heat pump, except that it uses an absorption cycle driven by fuel combustion. The object names are HeatPump:AirToWater:FuelFired:Heating and HeatPump:AirToWater:FuelFired:Cooling. In general, these heat pump objects are treated in the same way as the other plant loop heat pump models. When dealing with the heating and cooling modules of the equipment, it uses a similar paradigm as the electric-driven \hyperref[eir-plant-loop-heat-pump-model]{EIR Formulated Plant Loop Heat Pump}: even though a heat pump is generally a single load coil and a single source coil with a reversing valve, in EnergyPlus, the paradigm is to split the operation into two separate units, one for heating a hot water loop and one for cooling a chilled water loop. It is certainly possible to connect the load side of both of these to a single plant loop if the controls are established properly. This equipment only supports air-source operation with an outdoor air node used as the source-side inlet node.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2006,3 +2006,60 @@ \subsubsection{Chiller Basin Heater}\label{chiller-basin-heater-3}
\emph{Schedule\(_{heater,basin}\)} is the basin heater schedule, user input (schedule value \textgreater{} 0 means ON)

\emph{ChillerIsOFF} is the logical variable denoting that the chiller is not operating for the current simulation time step (e.g.,~ there is no cooling load to be met by the chiller, or if there is no water flow through the chiller due to a chiller or pump availability schedule, etc.).

\subsection{Variable Flow Condenser}\label{variable-flow-condenser}

The \hyperref[electric-chiller-model-based-on-condenser-entering-temperature](Chiller:Electric:EIR) and \hyperref[electric-chiller-model-based-on-condenser-leaving-temperature](Chiller:Electric:ReformulatedEIR) have the capability to simulate variable condenser flow requests. The flow request can be capped to a minimum via a user-defined fraction. The minimum condenser plant loop flow rate will be limited by the minimum flow rates of the operating pumps. The flow request can be calculated using one of the following approaches:

\begin{itemize}
\item Chiller part load ratio
\item Chilled water part load ratio
\item Condenser temperature difference
\end{itemize}

Note that simulating a variable flow condenser will, at identical load and entering conditions, modify the condenser leaving water temperature when compared with a constant flow condenser. The performance of a Chiller:Electric:EIR object won't be impacted by a change in leaving water condenser temperature but the performance of a Chiller:Electric:ReformulatedEIR object will be impacted.

\subsubsection{Chiller Part Load Ratio}

The flow request is determined by multiplying the maximum chiller condenser mass flow rate by the chiller operating part load ratio.

\subsubsection{Chiller water part load ratio}

The flow request is determined by first calculating the chilled water loop (CHWL) part load ratio:

\begin{equation}
{PLR_{CHWL}} = \frac{{L_{CHWL}}}{CAP_{CHWL}}
\end{equation}

where:

\({PLR_{CHWL}}\) is the chilled water loop part load ratio

\({L_{CHWL}}\) is the actual load on the chilled water loop

\({CAP_{CHWL}}\) is the design chilled water loop capacity determined using inputs from the Sizing:Plant object for the loop


The condenser plant loop water flow fraction (\({CWFR}\)) corresponding to the \({PLR_{CWHL}}\) is obtained by feeding it through a user-specified curve. A linear curve is expected: \(CWFR = C * {PLR_{CHWL}} + D\) where C and D are coefficients. A reference for these coefficients is provided in ``Optimizing Design \& Control Of Chilled Water Plants, Part 5'', S. Taylor, ASHRAE Journal June 2012.

The actual condenser mass flow request for the chiller is then calculated as follows:

\begin{equation}
{\dot m_{chiller_{condenser}}} = \frac{{\dot m_{condenser_{loop_{design}}}} . {CWFR} . {\dot Q_{chiller_{evaporator}}}}{L_{CHWL}}
\end{equation}

If a single chiller is meeting the \({L_{CHWL}}\), then \({\dot m_{chiller_{condenser}}} = {\dot m_{condenser_{loop_{design}}}} * {CWFR}\).

\subsubsection{Chiller water part load ratio}

The flow request is determined as follows:

\begin{equation}
{\dot m_{chiller_{condenser}}} = \frac{{\dot Q_{chiller_{condenser}}}}{({C_p} . {\Delta {T_{condenser}}})}
\end{equation}

where:

\({\dot Q_{chiller_{condenser}}}\) is the chiller's condenser heat transfer rate

\({\Delta {T_{condenser}}}\) is the user-defined temperature difference across the chiller condenser bundle
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading

5 comments on commit 46cf11b

@nrel-bot
Copy link

Choose a reason for hiding this comment

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

10065ChillerHeaterMisbehavin (RKStrand) - Win64-Windows-10-VisualStudio-16: OK (2844 of 2844 tests passed, 0 test warnings)

Build Badge Test Badge

@nrel-bot-3
Copy link

Choose a reason for hiding this comment

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

10065ChillerHeaterMisbehavin (RKStrand) - x86_64-MacOS-10.18-clang-15.0.0: OK (3634 of 3636 tests passed, 0 test warnings)

Messages:\n

  • 2 tests had: Table big diffs.
  • 2 tests had: Table string diffs.

Failures:\n

regression Test Summary

  • Passed: 789
  • Failed: 2

Build Badge Test Badge

@nrel-bot-2b
Copy link

Choose a reason for hiding this comment

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

10065ChillerHeaterMisbehavin (RKStrand) - x86_64-Linux-Ubuntu-22.04-gcc-11.4: OK (3675 of 3677 tests passed, 0 test warnings)

Messages:\n

  • 2 tests had: Table big diffs.
  • 2 tests had: Table string diffs.

Failures:\n

regression Test Summary

  • Passed: 809
  • Failed: 2

Build Badge Test Badge

@nrel-bot-2
Copy link

Choose a reason for hiding this comment

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

10065ChillerHeaterMisbehavin (RKStrand) - x86_64-Linux-Ubuntu-22.04-gcc-11.4-UnitTestsCoverage-Debug: OK (2052 of 2052 tests passed, 0 test warnings)

Build Badge Test Badge Coverage Badge

@nrel-bot-2b
Copy link

Choose a reason for hiding this comment

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

10065ChillerHeaterMisbehavin (RKStrand) - x86_64-Linux-Ubuntu-22.04-gcc-11.4-IntegrationCoverage-Debug: OK (795 of 795 tests passed, 0 test warnings)

Build Badge Test Badge Coverage Badge

Please sign in to comment.