Skip to content

Commit

Permalink
Merge pull request #10511 from NREL/var_speed_cond_ctrl
Browse files Browse the repository at this point in the history
Variable flow condenser plant control
  • Loading branch information
Myoldmopar authored Jul 5, 2024
2 parents 8f66321 + 125f666 commit 1033bdc
Show file tree
Hide file tree
Showing 17 changed files with 24,832 additions and 61 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 @@ -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
33 changes: 33 additions & 0 deletions doc/input-output-reference/src/overview/group-plant-equipment.tex
Original file line number Diff line number Diff line change
Expand Up @@ -1743,6 +1743,23 @@ \subsubsection{Inputs}\label{inputs-4-023}

This optional field allows you to specify a user-defined end-use subcategory, e.g., ``Process''. A new meter for reporting is created for each unique subcategory (ref: \hyperref[outputmeter-and-outputmetermeterfileonly]{Output:Meter} objects). Any text may be used here to further subcategorize the end-uses in the ABUPS End Uses by Subcategory table and in the LEED Summary EAp2-4/5 Performance Rating Method Compliance table. If this field is omitted or blank, the chiller will be assigned to the ``General'' end-use subcategory.

\paragraph{Field: Condenser Flow Control}

This field is optional.~ It describes the chiller condenser flow request mode to be used in a simulation. With ``ConstantFlow'' a chiller will always request its maximum condenser flow rate. With ``ModulatedChillerPLR'' the condenser flow request corresponds to the chiller part load ratio multiplied by the chiller maximum condenser flow rate. With ``ModulatedLoopPLR'' the chiller will request a flow rate that is function of the chilled water loop's part load ratio, see the \hyperref[field-condenser-loop-flow-rate-function-of-loop-part-load-ratio-curve-name]{Condenser Loop Flow Rate Fraction Function of Loop Part Load Ratio Curve Name} input. With ``ModulatedDeltaTemperature'' the chiller will request the flow rate required to meet a condenser loop delta temperature, see the \hyperref[field-temperature-difference-across-condenser-schedule-name]{Temperature Difference Across Condenser Schedule Name} input. Use ``ConstantFlow'' when modeling a constant flow condenser plant loop, choose one of the other inputs when modeling a variable flow condenser plant loop. The default is ``ConstantFlow''.

\paragraph{Field: Condenser Loop Flow Rate Fraction Function of Loop Part Load Ratio Curve Name}\label{field-condenser-loop-flow-rate-function-of-loop-part-load-ratio-curve-name}

This field describes the condenser loop flow rate fraction as a function of the chiller water loop part load ratio. A linear curve is expected: CWFR = C * PLR + D where CWFR is the condenser water flow fraction (actual/design), PLR is the chilled water plant loop part load ratio (actual/design), and 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. This input is only used when the ``ModulatedLoopPLR'' condenser flow control option is used.

\paragraph{Field: Temperature Difference Across Condenser Schedule Name}\label{field-temperature-difference-across-condenser-schedule-name}

This field should be a schedule that defines the temperature difference across the condenser of the chiller. This input is used to calculate the condenser flow rate request. This input is only used when ``Condenser Flow Control'' is set to ``ModulatedDeltaTemperature''.

\paragraph{Field: Condenser Minimum Flow Fraction}

This field corresponds to the minimum condenser flow fraction. The minimum condenser flow is equal to the value of this input multiplied by the chiller maximum condenser flow rate. This input is only used when the ``Condenser Flow Control'' input is set to ``ModulatedChillerPLR'', ``ModulatedLoopPLR'' or ``ModulatedDeltaTemperature''. When not specified, a default of 0.2 is assumed.


An example of this statement in an IDF is:

\begin{lstlisting}
Expand Down Expand Up @@ -2131,6 +2148,22 @@ \subsubsection{Inputs}\label{inputs-5-021}

This optional field allows you to specify a user-defined end-use subcategory, e.g., ``Process''. A new meter for reporting is created for each unique subcategory (ref: \hyperref[outputmeter-and-outputmetermeterfileonly]{Output:Meter} objects). Any text may be used here to further subcategorize the end-uses in the ABUPS End Uses by Subcategory table and in the LEED Summary EAp2-4/5 Performance Rating Method Compliance table. If this field is omitted or blank, the chiller will be assigned to the ``General'' end-use subcategory.

\paragraph{Field: Condenser Flow Control}\label{field-condenser-flow-control}

This field is optional.~ It describes the chiller condenser flow request mode to be used in a simulation. With ``ConstantFlow'' a chiller will always request its maximum condenser flow rate. With ``ModulatedChillerPLR'' the condenser flow request corresponds to the chiller part load ratio multiplied by the chiller maximum condenser flow rate. With ``ModulatedLoopPLR'' the chiller will request a flow rate that is function of the chilled water loop's part load ratio, see the \hyperref[field-condenser-loop-flow-rate-function-of-loop-part-load-ratio-curve-name-2]{Condenser Loop Flow Rate Fraction Function of Loop Part Load Ratio Curve Name} input. With ``ModulatedDeltaTemperature'' the chiller will request the flow rate required to meet a condenser loop delta temperature, see the \hyperref[field-temperature-difference-across-condenser-schedule-name-2]{Temperature Difference Across Condenser Schedule Name} input. Use ``ConstantFlow'' when modeling a constant flow condenser plant loop, choose one of the other inputs when modeling a variable flow condenser plant loop. The default is ``ConstantFlow''.

\paragraph{Field: Condenser Loop Flow Rate Fraction Function of Loop Part Load Ratio Curve Name}\label{field-condenser-loop-flow-rate-function-of-loop-part-load-ratio-curve-name-2}

This field describes the condenser loop flow rate fraction as a function of the chiller water loop part load ratio. A linear curve is expected: CWFR = C * PLR + D where CWFR is the condenser water flow fraction (actual/design), PLR is the chilled water plant loop part load ratio (actual/design), and 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. This input is only used when the ``ModulatedLoopPLR'' condenser flow control option is used.

\paragraph{Field: Temperature Difference Across Condenser Schedule Name}\label{field-temperature-difference-across-condenser-schedule-name-2}

This field should be a schedule that defines the temperature difference across the condenser of the chiller. This input is used to calculate the condenser flow rate request. This input is only used when ``Condenser Flow Control'' is set to ``ModulatedDeltaTemperature''.

\paragraph{Field: Condenser Minimum Flow Fraction}

This field corresponds to the minimum condenser flow fraction. The minimum condenser flow is equal to the value of this input multiplied by the chiller maximum condenser flow rate. This input is only used when the ``Condenser Flow Control'' input is set to ``ModulatedChillerPLR'', ``ModulatedLoopPLR'' or ``ModulatedDeltaTemperature''. When not specified, a default of 0.2 is assumed.


An example of this statement in an IDF is:

Expand Down
Loading

10 comments on commit 1033bdc

@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.

develop (Myoldmopar) - x86_64-MacOS-10.18-clang-15.0.0: OK (2845 of 2845 tests passed, 0 test warnings)

Build Badge Test Badge

@nrel-bot
Copy link

Choose a reason for hiding this comment

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

develop (Myoldmopar) - Win64-Windows-10-VisualStudio-16: OK (2844 of 2844 tests passed, 0 test warnings)

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.

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

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.

develop (Myoldmopar) - 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

@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.

develop (Myoldmopar) - 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
Copy link

Choose a reason for hiding this comment

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

10299CheckConvexityChangeCheckForShadowCalculations (Myoldmopar) - 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.

10299CheckConvexityChangeCheckForShadowCalculations (Myoldmopar) - 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-2c
Copy link

Choose a reason for hiding this comment

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

10299CheckConvexityChangeCheckForShadowCalculations (Myoldmopar) - 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.

10299CheckConvexityChangeCheckForShadowCalculations (Myoldmopar) - 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-2c
Copy link

Choose a reason for hiding this comment

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

10299CheckConvexityChangeCheckForShadowCalculations (Myoldmopar) - 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.