diff --git a/cmake/CompilerFlags.cmake b/cmake/CompilerFlags.cmake index f4627f47ae8..377cff02be7 100644 --- a/cmake/CompilerFlags.cmake +++ b/cmake/CompilerFlags.cmake @@ -255,3 +255,10 @@ if("Ninja" STREQUAL ${CMAKE_GENERATOR}) endif() endif() +# Xcode/Ninja generators undefined MAKE +if(CMAKE_GENERATOR MATCHES "Make") + set(MAKE "$(MAKE)") +else() + set(MAKE make) +endif() + diff --git a/cmake/Install.cmake b/cmake/Install.cmake index 1d8a0c55762..bc830aa88d8 100644 --- a/cmake/Install.cmake +++ b/cmake/Install.cmake @@ -149,7 +149,7 @@ if( WIN32 AND NOT UNIX ) set(CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_SKIP TRUE) include(InstallRequiredSystemLibraries) if(CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS) - install(PROGRAMS ${CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS} DESTINATION "./") + install(PROGRAMS ${CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS} DESTINATION "./") endif() endif() @@ -443,7 +443,7 @@ elseif(WIN32) # You need at least one "install(..." command for it to be registered as a component install(CODE "MESSAGE(\"Registering filetypes.\")" COMPONENT RegisterFileType) install(CODE "MESSAGE(\"Copying and Registering DLLs\")" COMPONENT CopyAndRegisterSystemDLLs) - + install(CODE "MESSAGE(\"Creating start menu.\")" COMPONENT CreateStartMenu) endif() @@ -482,6 +482,44 @@ set(CPACK_PROJECT_CONFIG_FILE "${CMAKE_BINARY_DIR}/CMakeCPackOptions.cmake") ########################################################## D O C U M E N T A T I O N ############################################################# if ( BUILD_DOCS ) + # Call the build of target documentation explicitly here. + # Note: This is because you can't do `add_dependencies(package documentation)` (https://gitlab.kitware.com/cmake/cmake/issues/8438) + # Adding another custom target to be added to the "ALL" one (so it runs) and make it depend on the actual "documentation" target doesn't work + # because it'll always run if you have enabled BUILD_DOCS, regardless of whether you are calling the target "package" or not + # add_custom_target(run_documentation ALL) + # add_dependencies(run_documentation documentation) + #message(FATAL_ERROR "CMAKE_COMMAND=${CMAKE_COMMAND}") + + # +env will pass the current environment and will end up respecting the -j parameter + # this ↓↓↓ here -- https://stackoverflow.com/a/41268443/531179 + #install(CODE "execute_process(COMMAND +env \"${CMAKE_COMMAND}\" --build \"${CMAKE_BINARY_DIR}\" --target documentation)") + # Except it doesn't work with install(execute_process... + + # Passing $(MAKE) doesn't work either, and isn't a great idea for cross platform support anyways + # install(CODE "execute_process(COMMAND ${MAKE} ${DOC_BUILD_FLAGS} -C \"${CMAKE_BINARY_DIR}\" documentation)") + + # So instead, we just used the number of threads that are available. That's not ideal, since it ignores any "-j N" option passed by the user + # But LaTeX should run quickly enough to not be a major inconvenience. + # There no need to do that for Ninja for eg, so only do it for Make and MSVC + + # flag -j to cmake --build was added at 3.12 (VERSION_GREATER_EQUAL need cmake >= 3.7, we apparently support 2.8...) + if(NOT(CMAKE_VERSION VERSION_LESS "3.12") AND ((CMAKE_GENERATOR MATCHES "Make") OR WIN32)) + include(ProcessorCount) + ProcessorCount(N) + if(NOT N EQUAL 0) + set(DOC_BUILD_FLAGS "-j ${N}") + endif() + endif() + if(WIN32) + # Win32 is multi config, so you must specify a config when calling cmake. + # Let's just use Release, it won't have any effect on LaTeX anyways. + set(DOC_CONFIG_FLAG "--config Release") + endif() + + # Getting these commands to work (especially with macro expansion) is tricky. Check the resulting `cmake_install.cmake` file in your build folder if need to debug this + install(CODE "execute_process(COMMAND \"${CMAKE_COMMAND}\" --build \"${CMAKE_BINARY_DIR}\" ${DOC_CONFIG_FLAG} ${DOC_BUILD_FLAGS} --target documentation)" + COMPONENT Documentation) + install(FILES "${CMAKE_BINARY_DIR}/doc-pdf/Acknowledgments.pdf" DESTINATION "./Documentation" COMPONENT Documentation) install(FILES "${CMAKE_BINARY_DIR}/doc-pdf/AuxiliaryPrograms.pdf" DESTINATION "./Documentation" COMPONENT Documentation) install(FILES "${CMAKE_BINARY_DIR}/doc-pdf/EMSApplicationGuide.pdf" DESTINATION "./Documentation" COMPONENT Documentation) @@ -496,9 +534,11 @@ if ( BUILD_DOCS ) install(FILES "${CMAKE_BINARY_DIR}/doc-pdf/PlantApplicationGuide.pdf" DESTINATION "./Documentation" COMPONENT Documentation) install(FILES "${CMAKE_BINARY_DIR}/doc-pdf/TipsAndTricksUsingEnergyPlus.pdf" DESTINATION "./Documentation" COMPONENT Documentation) install(FILES "${CMAKE_BINARY_DIR}/doc-pdf/UsingEnergyPlusForCompliance.pdf" DESTINATION "./Documentation" COMPONENT Documentation) +else() + message(AUTHOR_WARNING "BUILD_DOCS isn't enabled, so package won't include the PDFs") endif () -########################################################## S Y S T E M L I B R A R I E S ############################################################# +########################################################## S Y S T E M L I B R A R I E S ###################################################### # TODO: is this unecessary now? I had forgotten to actually create a Libraries via cpack_add_component but everything seemed fined # At worse, try not to uncomment this as is, but place it inside an if(PLATFORM) statement @@ -559,6 +599,12 @@ cpack_add_component(Licenses DESCRIPTION "License files for EnergyPlus" REQUIRED) +# No need for system privileges for this +cpack_add_component(CreateStartMenu + DISPLAY_NAME "Start Menu links" + DESCRIPTION "Create Start Menu Links" +) + cpack_add_component(RegisterFileType DISPLAY_NAME "Associate with EP-Launch and IDFEditor" DESCRIPTION "Associate *.idf, *.imf, and *.epg files with EP-Launch, *.ddy and *.expidf with IDFEditor.exe" @@ -585,6 +631,10 @@ cpack_ifw_configure_component(Symlinks REQUIRES_ADMIN_RIGHTS ) +cpack_ifw_configure_component(CreateStartMenu + SCRIPT cmake/qtifw/install_win_createstartmenu.qs +) + cpack_ifw_configure_component(RegisterFileType SCRIPT cmake/qtifw/install_registerfiletype.qs REQUIRES_ADMIN_RIGHTS diff --git a/cmake/qtifw/install_operations.qs b/cmake/qtifw/install_operations.qs index 07a7aa51116..158f9d2a359 100644 --- a/cmake/qtifw/install_operations.qs +++ b/cmake/qtifw/install_operations.qs @@ -27,18 +27,7 @@ function Component() // On Windows if( kernel == "winnt" ) { - // Create Shortcuts in the Windows Start Menu - component.addOperation("CreateShortcut", "@TargetDir@/Documentation/index.html", "@StartMenuDir@/EnergyPlus Documentation.lnk"); - component.addOperation("CreateShortcut", "@TargetDir@/PostProcess/EP-Compare/EP-Compare.exe", "@StartMenuDir@/EP-Compare.lnk"); - component.addOperation("CreateShortcut", "@TargetDir@/PreProcess/EPDraw/EPDrawGUI.exe", "@StartMenuDir@/EPDrawGUI.lnk"); - component.addOperation("CreateShortcut", "@TargetDir@/EP-Launch.exe", "@StartMenuDir@/EP-Launch.lnk"); - component.addOperation("CreateShortcut", "@TargetDir@/ExampleFiles/ExampleFiles.html", "@StartMenuDir@/Example Files Summary.lnk"); - component.addOperation("CreateShortcut", "@TargetDir@/ExampleFiles/ExampleFiles-ObjectsLink.html", "@StartMenuDir@/ExampleFiles Link to Objects.lnk"); - component.addOperation("CreateShortcut", "@TargetDir@/PreProcess/IDFEditor/IDFEditor.exe", "@StartMenuDir@/IDFEditor.lnk"); - component.addOperation("CreateShortcut", "@TargetDir@/PreProcess/IDFVersionUpdater/IDFVersionUpdater.exe", "@StartMenuDir@/IDFVersionUpdater.lnk"); - component.addOperation("CreateShortcut", "@TargetDir@/readme.html", "@StartMenuDir@/Readme Notes.lnk"); - component.addOperation("CreateShortcut", "@TargetDir@/PreProcess/WeatherConverter/Weather.exe", "@StartMenuDir@/Weather Statistics and Conversions.lnk"); - + // Create Shortcuts in the Windows Start Menu: done separately (optional) // Note: Associate file types: done separately (optional) diff --git a/cmake/qtifw/install_win_createstartmenu.qs b/cmake/qtifw/install_win_createstartmenu.qs new file mode 100644 index 00000000000..caf3b33394f --- /dev/null +++ b/cmake/qtifw/install_win_createstartmenu.qs @@ -0,0 +1,29 @@ +// Windows commands to be performed elevated: copy and register DLLs + +function Component() +{ + Component.prototype.createOperations = function() + { + // call default implementation + component.createOperations(); + + // ... add custom operations + + var kernel = systemInfo.kernelType; + // On Windows + if( kernel == "winnt" ) { + + component.addOperation("CreateShortcut", "@TargetDir@/Documentation/index.html", "@StartMenuDir@/EnergyPlus Documentation.lnk"); + component.addOperation("CreateShortcut", "@TargetDir@/PostProcess/EP-Compare/EP-Compare.exe", "@StartMenuDir@/EP-Compare.lnk"); + component.addOperation("CreateShortcut", "@TargetDir@/PreProcess/EPDraw/EPDrawGUI.exe", "@StartMenuDir@/EPDrawGUI.lnk"); + component.addOperation("CreateShortcut", "@TargetDir@/EP-Launch.exe", "@StartMenuDir@/EP-Launch.lnk"); + component.addOperation("CreateShortcut", "@TargetDir@/ExampleFiles/ExampleFiles.html", "@StartMenuDir@/Example Files Summary.lnk"); + component.addOperation("CreateShortcut", "@TargetDir@/ExampleFiles/ExampleFiles-ObjectsLink.html", "@StartMenuDir@/ExampleFiles Link to Objects.lnk"); + component.addOperation("CreateShortcut", "@TargetDir@/PreProcess/IDFEditor/IDFEditor.exe", "@StartMenuDir@/IDFEditor.lnk"); + component.addOperation("CreateShortcut", "@TargetDir@/PreProcess/IDFVersionUpdater/IDFVersionUpdater.exe", "@StartMenuDir@/IDFVersionUpdater.lnk"); + component.addOperation("CreateShortcut", "@TargetDir@/readme.html", "@StartMenuDir@/Readme Notes.lnk"); + component.addOperation("CreateShortcut", "@TargetDir@/PreProcess/WeatherConverter/Weather.exe", "@StartMenuDir@/Weather Statistics and Conversions.lnk"); + + } + } +} diff --git a/doc/CMakeLists.txt b/doc/CMakeLists.txt index 00d44cc5b69..276b7b8e51b 100644 --- a/doc/CMakeLists.txt +++ b/doc/CMakeLists.txt @@ -7,6 +7,9 @@ file(COPY ${CMAKE_SOURCE_DIR}/doc/index.html DESTINATION ${CMAKE_BINARY_DIR}/doc # add a configure rule to the header file though configure_file(${CMAKE_SOURCE_DIR}/doc/title.tex.in ${CMAKE_SOURCE_DIR}/doc/title.tex) +# Because we don't want to rebuild doc automatically, we add a custom target called "documentation", which will depends on all individual PDFs +add_custom_target(documentation) + # add each of the documents, they have their own CMakeLists.txt files add_subdirectory(acknowledgments) add_subdirectory(auxiliary-programs) diff --git a/doc/acknowledgments/CMakeLists.txt b/doc/acknowledgments/CMakeLists.txt index c57f3b0f516..947a83fe971 100644 --- a/doc/acknowledgments/CMakeLists.txt +++ b/doc/acknowledgments/CMakeLists.txt @@ -24,6 +24,9 @@ add_custom_command( OUTPUT ${CMAKE_BINARY_DIR}/doc/${OUTPUT_FILENAME}.pdf WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/doc/${SOURCE_FILENAME} DEPENDS ${INCLUDED_TEX} ${INCLUDED_IMAGES} ) -add_custom_target( zPDF_${OUTPUT_FILENAME} ALL +add_custom_target( zPDF_${OUTPUT_FILENAME} DEPENDS ${CMAKE_BINARY_DIR}/doc/${OUTPUT_FILENAME}.pdf ) + +# Make top-level 'documentation' target depend on this one +add_dependencies(documentation zPDF_${OUTPUT_FILENAME}) \ No newline at end of file diff --git a/doc/auxiliary-programs/CMakeLists.txt b/doc/auxiliary-programs/CMakeLists.txt index f515bda5d9c..79a90780969 100644 --- a/doc/auxiliary-programs/CMakeLists.txt +++ b/doc/auxiliary-programs/CMakeLists.txt @@ -200,6 +200,9 @@ add_custom_command( OUTPUT ${CMAKE_BINARY_DIR}/doc/${OUTPUT_FILENAME}.pdf WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/doc/${SOURCE_FILENAME} DEPENDS ${INCLUDED_TEX} ${INCLUDED_IMAGES} ) -add_custom_target( zPDF_${OUTPUT_FILENAME} ALL +add_custom_target( zPDF_${OUTPUT_FILENAME} DEPENDS ${CMAKE_BINARY_DIR}/doc/${OUTPUT_FILENAME}.pdf ) + +# Make top-level 'documentation' target depend on this one +add_dependencies(documentation zPDF_${OUTPUT_FILENAME}) \ No newline at end of file diff --git a/doc/ems-application-guide/CMakeLists.txt b/doc/ems-application-guide/CMakeLists.txt index 02f1eb81a2d..d1affc06296 100644 --- a/doc/ems-application-guide/CMakeLists.txt +++ b/doc/ems-application-guide/CMakeLists.txt @@ -90,6 +90,9 @@ add_custom_command( OUTPUT ${CMAKE_BINARY_DIR}/doc/${OUTPUT_FILENAME}.pdf WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/doc/${SOURCE_FILENAME} DEPENDS ${INCLUDED_TEX} ${INCLUDED_IMAGES} ) -add_custom_target( zPDF_${OUTPUT_FILENAME} ALL +add_custom_target( zPDF_${OUTPUT_FILENAME} DEPENDS ${CMAKE_BINARY_DIR}/doc/${OUTPUT_FILENAME}.pdf ) + +# Make top-level 'documentation' target depend on this one +add_dependencies(documentation zPDF_${OUTPUT_FILENAME}) \ No newline at end of file diff --git a/doc/engineering-reference/CMakeLists.txt b/doc/engineering-reference/CMakeLists.txt index e49f0592e0e..a8a4a2c32c8 100644 --- a/doc/engineering-reference/CMakeLists.txt +++ b/doc/engineering-reference/CMakeLists.txt @@ -541,6 +541,9 @@ add_custom_command( OUTPUT ${CMAKE_BINARY_DIR}/doc/${OUTPUT_FILENAME}.pdf WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/doc/${SOURCE_FILENAME} DEPENDS ${INCLUDED_TEX} ${INCLUDED_IMAGES} ) -add_custom_target( zPDF_${OUTPUT_FILENAME} ALL +add_custom_target( zPDF_${OUTPUT_FILENAME} DEPENDS ${CMAKE_BINARY_DIR}/doc/${OUTPUT_FILENAME}.pdf ) + +# Make top-level 'documentation' target depend on this one +add_dependencies(documentation zPDF_${OUTPUT_FILENAME}) \ No newline at end of file diff --git a/doc/engineering-reference/src/simulation-models-encyclopedic-reference-002/evaporative-coolers.tex b/doc/engineering-reference/src/simulation-models-encyclopedic-reference-002/evaporative-coolers.tex index 06842688f32..c02718b8913 100644 --- a/doc/engineering-reference/src/simulation-models-encyclopedic-reference-002/evaporative-coolers.tex +++ b/doc/engineering-reference/src/simulation-models-encyclopedic-reference-002/evaporative-coolers.tex @@ -411,7 +411,7 @@ \subsubsection{Secondary Air Flow Fraction}\label{secondary-air-flow-fraction} ff_{sec} = \frac{\dot{m}_{sec}}{\dot{m}_{sec,design}} \end{equation} -The secondary air mass flow rate will either be set to or solved for numerically as described below. The secondary side flow fraction, , is defined as. (Note this is another flow ratio that differs from the one used above which combined both streams into one ratio in effectiveness modifier curves.) +And secondary air fan electric power \(p_{sec,fan}\) is calculated as. \begin{equation} P_{sec,fan} = P_{sec,fan,design}\cdot f_{sec,fan,mod}\left(ff_{sec}\right) @@ -525,13 +525,13 @@ \subsubsection{Secondary Air Flow Fraction}\label{secondary-air-flow-fraction} PLF = \frac{{{{\dot Q}_{{\mathop{\rm Re}\nolimits} quired}}}}{{{{\dot Q}_{Full}}}} \end{equation} -where \(PLF\) is the Part Load Fraction.~ When PLF is less than 1.0, it is assumed that the cooler will deliver the desired temperature air (as long as it is less than the inlet; it doesn't need heating).~ The PLF is used to modify the auxiliary fan power when the fan power modifier curve is not specified and find when the unit will overcool. +where \(PLF\) is the Part Load Fraction.~ When PLF is less than 1.0, it is assumed that the cooler will deliver the desired temperature air (as long as it is less than the inlet; it doesn't need heating).~ The PLF is used along with secondary side flow fraction to modify the auxiliary fan power when the fan power modifier curve is not specified and find when the unit will overcool. \begin{equation} -{P_{fan}} = \Delta P\cdot \dot V\cdot e\cdot PLF +{P_{fan}} = \Delta P\cdot \dot V\cdot e\cdot PLF\cdot ff_{sec} \end{equation} -Water pump power is also derated using the PLF. +Water pump power is also derated using the PLF and \(ff_{sec}\). A third air stream input to the cooler was implemented in order to allow mixing building exhaust air with outdoor air on the purge/secondary side of the cooler. The assumption when relief/tertiary air is used is that all of the available relief zone air is used and the remainder made up with outdoor air.~ Moisture and energy balances are drawn to compute humidity ratio and enthalpy of mixed secondary air.~ The volume is determined by the design volume flow rate (from secondary fan size). @@ -658,7 +658,7 @@ \subsection{Direct Evaporative Cooler Special Research Model}\label{direct-evapo The wetbulb temperature of air leaving a direct cooler is the same as the wetbulb temperature entering the cooler.~ The leaving humidity ratio of the air is calculated using psychrometric functions with leaving drybulb and wetbulb temperatures and outdoor air pressure as inputs.~ The leaving enthalpy of air is calculated using psychrometric functions with leaving drybulb temperature, leaving humidity ratio, and outdoor air pressure as inputs. -The direct cooler sometimes has the ability to overcool the air and therefore some form of modulation is useful for analysis.~ The special research model includes a Part Load Fraction, PLF, used to model the implications of controlling the amount of cooling.~ It is assumed that through some sort of on/off cycling or wetness control that the cooling electric power can be varied to exactly meet the desired temperature when PLF is less than unity.~ The auxiliary water pump power is then varied using pump power modifier curve or linearly using a Part Load Fraction when the pump power modifier curve is not specified. +The direct cooler sometimes has the ability to overcool the air and therefore some form of modulation is useful for analysis.~ The special research model includes a Part Load Fraction, PLF, used to model the implications of controlling the amount of cooling.~ It is assumed that through some sort of on/off cycling or wetness control that the cooling electric power can be varied to exactly meet the desired temperature when PLF is less than unity.~ The auxiliary water pump power is then derated using user specified pump power modifier curve or linearly using a Part Load Fraction and a fan flow fraction when the pump power modifier curve is not specified. \begin{equation} {\rm{FullOutput}} = {T_{db,out}} - {T_{db,in}} @@ -675,7 +675,6 @@ \subsection{Direct Evaporative Cooler Special Research Model}\label{direct-evapo \label{eq:IECPLF} \end{equation} -When PLF is less than 1.0 it is assumed that the cooler will deliver the desired temperature air (as long as it is less than the inlet; it doesn't need heating).~ Water pump power is also derated using the user specified pump modifier curve or using PLF when the pump modifier curve is not specified. \subsubsection{Water Consumption}\label{water-consumption-1} diff --git a/doc/engineering-reference/src/simulation-models-encyclopedic-reference-005/water-thermal-tanks-includes-water-heaters.tex b/doc/engineering-reference/src/simulation-models-encyclopedic-reference-005/water-thermal-tanks-includes-water-heaters.tex index 83d71b3638f..cdf6ec428f4 100644 --- a/doc/engineering-reference/src/simulation-models-encyclopedic-reference-005/water-thermal-tanks-includes-water-heaters.tex +++ b/doc/engineering-reference/src/simulation-models-encyclopedic-reference-005/water-thermal-tanks-includes-water-heaters.tex @@ -498,7 +498,7 @@ \subsubsection{Model Outputs}\label{model-outputs-000} \subsection{Stratified Water Thermal Tank}\label{stratified-water-thermal-tank} -The input objects WaterHeater:Stratified and ThermalStorage:ChilledWater:Stratified provide models for a stratified water thermal tank that divides the water tank into multiple nodes of equal volume. This model is used for both the stratified water heater and the stratified chilled water storage tank. The nodes are coupled by vertical conduction effects, internode fluid flow, and temperature inversion mixing. The object simultaneously solves the differential equations governing the energy balances on the nodes using an analytical solution to a simplified representation of the heat balance equation. The system time step is divided into one minute substeps at which control decisions are evaluated that allow the simulation to capture events that occur on a short time scale. +The input objects WaterHeater:Stratified and ThermalStorage:ChilledWater:Stratified provide models for a stratified water thermal tank that divides the water tank into multiple nodes of equal volume. This model is used for both the stratified water heater and the stratified chilled water storage tank. The nodes are coupled by vertical conduction effects, internode fluid flow, and temperature inversion mixing. The object simultaneously solves the differential equations governing the energy balances on the nodes using an analytical solution to a simplified representation of the heat balance equation. The system time step is divided into multiple substeps at which control decisions are evaluated that allow the simulation to capture events that occur on a short time scale. \subsubsection{Energy Balance}\label{energy-balance-1} @@ -745,7 +745,7 @@ \subsubsection{Numerical Solution}\label{numerical-solution} To solve the differential equations the nodal heat balance equations are modified into the form: -\begin{equation} +\begin{equation}\label{strat-tank-diffeq} \frac{d{T_n}}{dt} = a T_n + b \end{equation} @@ -768,7 +768,19 @@ \subsubsection{Numerical Solution}\label{numerical-solution} The solution is obtained by separating the $q_{net}$ terms described above into their respective $a$ and $b$ parts, solving for $T_{final}$ and $T_{avg}$, recalculating $b$ using the new average temperatures and iterating until the temperatures converge, at which point temperature inversions are resolved and controls decisions are made before moving on to the next sub timestep. -\paragraph{Control Logic Evaluation} +\paragraph{Adaptive Sub Timestep} + +The sub timestep is allowed to vary between 10 seconds and 10 minutes. The length of the sub timestep is determined by the current heat transfer rates in the tank, which are used to predict the amount of time until a control decision (\ref{control-logic-evaluation}) will need to be made. The sub timestep is then selected to approach the time of the control decision. + +First, the temperature difference required for a heater to turn on or off for each control node is calculated by determining the difference between its setpoint temperature and the current temperature if the heater is on or its cut in temperature and current temperature if the heater is off. The minimum of the temperature differences is selected as the maximum allowable nodal temperature change $dT_{max}$. The time until that temperature change occurs is estimated for each node by rearranging \ref{strat-tank-diffeq} to solve for $dt$. + +\begin{equation} + dt = \frac{dT_{max}}{aT + b} +\end{equation} + +Finally, the minimum of the nodal $dt$ values is used as the sub timestep unless it is outside the allowable bounds or it will extend beyond the end of the timestep. In those cases, the sub timestep is adjusted to fit within the bounds. + +\paragraph{Control Logic Evaluation}\label{control-logic-evaluation} Before each system time step is calculated the following evaluations are made: @@ -777,7 +789,7 @@ \subsubsection{Numerical Solution}\label{numerical-solution} \item Internode flow is determined and net flow rates are determined \end{enumerate} -Before each substep is calculated, the following evaluations are made: +Before each sub timestep is calculated, the following evaluations are made: \begin{enumerate} \item Thermostatic controls for heater 1 and heater 2 are evaluated to determine if the heater elements should turn on or off diff --git a/doc/engineering-reference/src/surface-heat-balance-manager-processes/infrared-radiation-transfer-material.tex b/doc/engineering-reference/src/surface-heat-balance-manager-processes/infrared-radiation-transfer-material.tex index e7eb4d29af0..c6428edec12 100644 --- a/doc/engineering-reference/src/surface-heat-balance-manager-processes/infrared-radiation-transfer-material.tex +++ b/doc/engineering-reference/src/surface-heat-balance-manager-processes/infrared-radiation-transfer-material.tex @@ -61,9 +61,13 @@ \subsection{Radiation Exchange Basics}\label{radiation-exchange-basics} T is the temperature in K. -Equation~\ref{eq:RadExchangeBlackBodyInBetween} shows that the presence of a black body surface between a source and a sink reduces the heat flux by a factor of two. The same result occurs when the IRT surface is between two zones in EnergyPlus. In that case the adjacent zones behave as black body cavities at some equivalent temperature. In order to account for this reduction, the IRT area must be doubled. This can be done without any difficulty in the EnergyPlus radiant exchange routine because the radiation view factors are determined by an approximate procedure that is based on the areas of the surfaces. Thus, doubling the surface area of the IRT surface results in the correct transfer of radiation through the IRT surface. The doubling will occur automatically in the program as described in the Input Output Reference document. +Equation~\ref{eq:RadExchangeBlackBodyInBetween} shows that the presence of a black body surface between a source and a sink reduces the heat flux by a factor of two. -It should be noted that, because of the black body behavior of the IRT surface, any visible or solar short wavelength radiation incident on the surface will be absorbed and included with the long wavelength (IR) exchange with the adjacent zone. No energy will be lost, but zones with IRT surfaces should not be used in any lighting analyses. +\subsection{IRT Radiation Exchange in EnergyPlus}\label{irt-radiation-exchange-in-energyplus} + +Ideally, this same doubling of radiation would need to occur when an IRT surface is between two zones in EnergyPlus. However, due to the complexity of the EnergyPlus heat balances and the treatment of an IRT as equivalent to any other surface in EnergyPlus, simply doubling the impact of the IRT on either zone is not possible. In testing, this resulted in either net radiation imbalances within the zones or potentially unstable conditions. So, the radiation is not doubled in EnergyPlus as in the simple example in the previous subsection. Despite this difference between the theory of the ideal case and the actual implementation in EnergyPlus, an IRT surface will still allow a zone to be separated into two separate zones with two different air temperature and the adjacent zones behave as black body cavities at some equivalent temperature. + +It should be noted that for IRT surfaces any visible or solar short wavelength radiation incident on the surface will be absorbed and included with the long wavelength (IR) exchange with the adjacent zone. No energy will be lost, but zones with IRT surfaces should not be used in any lighting analyses. \subsection{Radiation Transfer Surface Details}\label{radiation-transfer-surface-details} diff --git a/doc/engineering-reference/src/surface-heat-balance-manager-processes/inside-heat-balance.tex b/doc/engineering-reference/src/surface-heat-balance-manager-processes/inside-heat-balance.tex index 8e67cd02cbb..7cc00bc671f 100644 --- a/doc/engineering-reference/src/surface-heat-balance-manager-processes/inside-heat-balance.tex +++ b/doc/engineering-reference/src/surface-heat-balance-manager-processes/inside-heat-balance.tex @@ -356,7 +356,7 @@ \subsubsection{Fisher Pedersen Ceiling Diffuser Ceiling}\label{fisher-pedersen-c \subsubsection{Fisher Pedersen Ceiling Diffuser Floor}\label{fisher-pedersen-ceiling-diffuser-floor} -Fisher and Pedersen 1997) developed the following equation from laboratory chamber measurements. +Fisher and Pedersen (1997) developed the following equation from laboratory chamber measurements. \begin{equation} h = 3.873 + 0.082 * AC{H^{0.98}} @@ -838,6 +838,8 @@ \subsubsection{Ceiling Diffuser Algorithm}\label{ceiling-diffuser-algorithm} \caption{Ceiling Diffuser Correlation for Walls \protect \label{fig:ceiling-diffuser-correlation-for-walls}} \end{figure} +It should be noted that the conditions under which the correlations were developed included ACH values down to around 3.0. However, extrapolation of the data down to ACH=1.0 is reasonable and so within EnergyPlus, for ACH values of 1.0 or greater, the ceiling diffuser correlations as shown above are used. Below ACH values of 0.5, the natural convection algorithm is used. Between ACH values of 0.5 and 1.0, there is a linear interpolation between the two models to avoid any discontinuities in the convection coefficient calculated. + \subsubsection{Trombe Wall Algorithm}\label{trombe-wall-algorithm} The Trombe wall algorithm is used to model convection in a ``Trombe wall zone'', i.e.~the air space between the storage wall surface and the exterior glazing.~ (See the later sections on Passive and Active Trombe Walls below for more information about Trombe walls.)~ The algorithm is identical to the convection model (based on ISO 15099) used in Window5 for convection between glazing layers in multi-pane window systems.~ The use of the algorithm for modeling an unvented Trombe wall has been validated against experimental data by Ellis (2003). diff --git a/doc/engineering-reference/src/surface-heat-balance-manager-processes/outside-surface-heat-balance.tex b/doc/engineering-reference/src/surface-heat-balance-manager-processes/outside-surface-heat-balance.tex index 0db4a6c7e0e..44223c04599 100644 --- a/doc/engineering-reference/src/surface-heat-balance-manager-processes/outside-surface-heat-balance.tex +++ b/doc/engineering-reference/src/surface-heat-balance-manager-processes/outside-surface-heat-balance.tex @@ -454,7 +454,7 @@ \subsubsection{TARP ALGORITHM}\label{tarp-algorithm-000} W\(_{f}\) = 0.5 for leeward surfaces -Leeward is defined as greater than 100 degrees from normal incidence (Walton 1981). +Leeward is defined as greater than 90 degrees from normal incidence (Yazdanian and Klems 1994). The surface roughness multiplier Rf~is based on the ASHRAE graph of surface conductance (ASHRAE 1981) and may be obtained from the following table: diff --git a/doc/essentials/CMakeLists.txt b/doc/essentials/CMakeLists.txt index e5f52db5e9a..4f7b9a86a41 100644 --- a/doc/essentials/CMakeLists.txt +++ b/doc/essentials/CMakeLists.txt @@ -31,6 +31,9 @@ add_custom_command( OUTPUT ${CMAKE_BINARY_DIR}/doc/${OUTPUT_FILENAME}.pdf WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/doc/${SOURCE_FILENAME} DEPENDS ${INCLUDED_TEX} ${INCLUDED_IMAGES} ) -add_custom_target( zPDF_${OUTPUT_FILENAME} ALL +add_custom_target( zPDF_${OUTPUT_FILENAME} DEPENDS ${CMAKE_BINARY_DIR}/doc/${OUTPUT_FILENAME}.pdf ) + +# Make top-level 'documentation' target depend on this one +add_dependencies(documentation zPDF_${OUTPUT_FILENAME}) \ No newline at end of file diff --git a/doc/external-interfaces-application-guide/CMakeLists.txt b/doc/external-interfaces-application-guide/CMakeLists.txt index 9fae045728c..527f06df19c 100644 --- a/doc/external-interfaces-application-guide/CMakeLists.txt +++ b/doc/external-interfaces-application-guide/CMakeLists.txt @@ -40,6 +40,9 @@ add_custom_command( OUTPUT ${CMAKE_BINARY_DIR}/doc/${OUTPUT_FILENAME}.pdf WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/doc/${SOURCE_FILENAME} DEPENDS ${INCLUDED_TEX} ${INCLUDED_IMAGES} ) -add_custom_target( zPDF_${OUTPUT_FILENAME} ALL +add_custom_target( zPDF_${OUTPUT_FILENAME} DEPENDS ${CMAKE_BINARY_DIR}/doc/${OUTPUT_FILENAME}.pdf ) + +# Make top-level 'documentation' target depend on this one +add_dependencies(documentation zPDF_${OUTPUT_FILENAME}) \ No newline at end of file diff --git a/doc/getting-started/CMakeLists.txt b/doc/getting-started/CMakeLists.txt index 4ba5f4bc7a4..0f9399b2023 100644 --- a/doc/getting-started/CMakeLists.txt +++ b/doc/getting-started/CMakeLists.txt @@ -80,6 +80,9 @@ add_custom_command( OUTPUT ${CMAKE_BINARY_DIR}/doc/${OUTPUT_FILENAME}.pdf WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/doc/${SOURCE_FILENAME} DEPENDS ${INCLUDED_TEX} ${INCLUDED_IMAGES} ) -add_custom_target( zPDF_${OUTPUT_FILENAME} ALL +add_custom_target( zPDF_${OUTPUT_FILENAME} DEPENDS ${CMAKE_BINARY_DIR}/doc/${OUTPUT_FILENAME}.pdf ) + +# Make top-level 'documentation' target depend on this one +add_dependencies(documentation zPDF_${OUTPUT_FILENAME}) \ No newline at end of file diff --git a/doc/input-output-reference/CMakeLists.txt b/doc/input-output-reference/CMakeLists.txt index ee919dcfc21..3104ea4f1e9 100644 --- a/doc/input-output-reference/CMakeLists.txt +++ b/doc/input-output-reference/CMakeLists.txt @@ -316,6 +316,9 @@ add_custom_command( OUTPUT ${CMAKE_BINARY_DIR}/doc/${OUTPUT_FILENAME}.pdf WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/doc/${SOURCE_FILENAME} DEPENDS ${INCLUDED_TEX} ${INCLUDED_IMAGES} ) -add_custom_target( zPDF_${OUTPUT_FILENAME} ALL +add_custom_target( zPDF_${OUTPUT_FILENAME} DEPENDS ${CMAKE_BINARY_DIR}/doc/${OUTPUT_FILENAME}.pdf ) + +# Make top-level 'documentation' target depend on this one +add_dependencies(documentation zPDF_${OUTPUT_FILENAME}) \ No newline at end of file diff --git a/doc/input-output-reference/src/overview/group-evaporative-coolers.tex b/doc/input-output-reference/src/overview/group-evaporative-coolers.tex index f41d1bd69b0..ae2f84d2859 100644 --- a/doc/input-output-reference/src/overview/group-evaporative-coolers.tex +++ b/doc/input-output-reference/src/overview/group-evaporative-coolers.tex @@ -34,7 +34,7 @@ \subsubsection{Inputs}\label{inputs-016} \paragraph{Field:Availability Schedule Name}\label{fieldavailability-schedule-name} -The name of a schedule which defines when the evaporative cooler is available. A schedule value of 0 indicates that the evaporative cooler is off for that time period. A schedule value greater than 0 indicates that the evaporative cooler can operate during the time period. If this field is blank, the schedule has values of 1 for all time periods. +The name of a schedule which defines when the evaporative cooler is available. A schedule value of 0 indicates that the evaporative cooler is off for that time period. A schedule value greater than 0 indicates that the evaporative cooler can operate during the time period. If this field is blank, the evaporative cooler is always available. \paragraph{Field: Direct Pad Area}\label{field-direct-pad-area} @@ -143,72 +143,72 @@ \subsubsection{Inputs}\label{inputs-1-014} \paragraph{Field: Name}\label{field-name-1-013} -A unique identifying name for each cooler. +This alpha field is a unique identifying name for each cooler. \paragraph{Field: Availability Schedule Name}\label{field-availability-schedule-name-006} -The name of a schedule that defines when the evaporative cooler is available. A schedule value of 0 indicates that the evaporative cooler is off for that time period. A schedule value greater than 0 indicates that the evaporative cooler can operate during the time period. If this field is blank, the schedule has values of 1 for all time periods. +This alpha field is the name of a schedule that defines when the evaporative cooler is available. A schedule value of 0 indicates that the evaporative cooler is off for that time period. A schedule value greater than 0 indicates that the evaporative cooler can operate during the time period. If this field is blank, the evaporative cooler is always available. \paragraph{Field: Cooler Design Effectiveness}\label{field-cooler-design-effectiveness} -This field specifies the effectiveness at design flow rate that is applied to the wetbulb depression to determine the conditions leaving the cooler. This model assumes that the effectiveness can vary with supply air flow rate. For effectiveness variation with supply air flow fraction enter the Effectiveness Flow Ratio Modifier Curve Name input field below. The flow fraction is the ratio of the sum of current primary air and secondary air sides flow rates and the sum of the design flow rates. +This numeric field specifies the effectiveness at design flow rate that is applied to the wetbulb depression to determine the conditions leaving the cooler. This model assumes that the effectiveness can vary with supply air flow rate. For effectiveness variation with supply air flow fraction enter the Effectiveness Flow Ratio Modifier Curve Name input field below. The flow fraction is the ratio of the sum of current primary air and secondary air sides flow rates and the sum of the design flow rates. \paragraph{Field: Effectiveness Flow Ratio Modifier Curve Name}\label{field-effectiveness-flow-ratio-modifier-curve-name} -This curve modifies the effectiveness design value specified the previous field by multiplying the value by the result of this curve. The modifying curve is a function of flow fraction, which is the ratio of the current primary air flow rates divided by the design primary air flow rates. If this input field is left blank, the effectiveness is assumed to be constant. Any curve or table with one independent variable can be used. Any curve or table with one independent variable can be used: \hyperref[curvelinear]{Curve:Linear}, \hyperref[curvequadratic]{Curve:Quadratic}, \hyperref[curvecubic]{Curve:Cubic}, \hyperref[curvequartic]{Curve:Quartic}, \hyperref[curveexponent]{Curve:Exponent}, \hyperref[curveexponentialskewnormal]{Curve:ExponentialSkewNormal}, \hyperref[curvesigmoid]{Curve:Sigmoid}, Curve:RectuangularHyperbola1, \hyperref[curverectangularhyperbola2]{Curve:RectangularHyperbola2}, \hyperref[curveexponentialdecay]{Curve:ExponentialDecay}, \hyperref[curvedoubleexponentialdecay]{Curve:DoubleExponentialDecay}, and \hyperref[tablelookup]{Table:Lookup}. +This alpha field is the name of a curve that modifies the effectiveness design value specified the previous field by multiplying the value by the result of this curve. The modifying curve is a function of flow fraction, which is the ratio of the current primary air flow rates divided by the design primary air flow rates. If this input field is left blank, the effectiveness is assumed to be constant. Any curve or table with one independent variable can be used. Any curve or table with one independent variable can be used: \hyperref[curvelinear]{Curve:Linear}, \hyperref[curvequadratic]{Curve:Quadratic}, \hyperref[curvecubic]{Curve:Cubic}, \hyperref[curvequartic]{Curve:Quartic}, \hyperref[curveexponent]{Curve:Exponent}, \hyperref[curveexponentialskewnormal]{Curve:ExponentialSkewNormal}, \hyperref[curvesigmoid]{Curve:Sigmoid}, Curve:RectuangularHyperbola1, \hyperref[curverectangularhyperbola2]{Curve:RectangularHyperbola2}, \hyperref[curveexponentialdecay]{Curve:ExponentialDecay}, \hyperref[curvedoubleexponentialdecay]{Curve:DoubleExponentialDecay}, and \hyperref[tableoneindependentvariable]{Table:OneIndependentVariable}. \paragraph{Field: Primary Design Air Flow Rate}\label{field-primary-design-air-flow-rate} -This numeric input field is the primary air design air flow rate in \si{\volumeFlowRate}. This input field is autosizable. If the evaporative cooler is on main air loop branch, the design flow rate is the same as branch design flow rate, or else if it is on outdoor air system it will be the maximum of the the outdoor air design flow rate and the half of the primary air flow rate on the main air loop branch. +This numeric field is the primary air design air flow rate in \si{\volumeFlowRate}. This input field is autosizable. If the evaporative cooler is on the main air loop branch, the design flow rate is the same as branch design flow rate. If the evaporative cooler is in the outdoor air system the design flow rate will be the maximum of the outdoor air design flow rate and one-half of the primary air flow rate on the main air loop branch. \paragraph{Field: Recirculating Water Pump Design Power}\label{field-recirculating-water-pump-design-power} -This numeric input field is the recirculating and spray pump electric power at the Primary Design Air Flow Rate in \si{\watt}. +This numeric field is the recirculating and spray pump electric power at the Primary Design Air Flow Rate in \si{\watt}. This is the nominal water recirculating and spray pump power of evaporative cooler at primary air design flow rates and cooler design effectiveness. -This input field is autosizable, see Water Pump Power Sizing Factor. +This input field is autosizable, see \hyperref[field-water-pump-power-sizing-factor]{Water Pump Power Sizing Factor}. \paragraph{Field: Water Pump Power Sizing Factor}\label{field-water-pump-power-sizing-factor} -This numeric input field value is recirculating water pump sizing factor in \si{\wattperVolumeFlowRate}. -This field is used when the previous field is set to autosize. The pump design electric power is scaled with Primary Design Air Flow Rate. This input field is autosizable. +This numeric field value is recirculating water pump sizing factor in \si{\wattperVolumeFlowRate}. +This field is used when the previous field is set to autosize. The pump design electric power is scaled with the Primary Design Air Flow Rate. This input field is autosizable. Average Pump Power sizing factor was estimated from pump power and primary air design flow rates inputs from energyplus example files and is about \SI{90.0}{\wattperVolumeFlowRate} ( = 90.0 \textasciitilde{} Pump Power / Primary Air Design Flow Rate). The factor ranges from 55.0 to \SI{150.0}{\wattperVolumeFlowRate}. \paragraph{Field: Water Pump Power Modifier Curve Name}\label{field-water-pump-power-modifier-curve-name} -This alpha input field is the name of a dimensionless normalized pump power modifying curve. This curve modifies the pump electric power in the previous field by multiplying the design power by the result of this curve. The normalized curve is a function of the primary air flow fraction as independent variable. The curve shall yield a value of 1.0 at a flow fraction of 1.0. The flow fraction is the ratio of the primary air during current operation divided by primary air Design Air Flow Rate. If this input field is left blank, the pump power is assumed to lineary vary with the load. Any curve or table with one independent variable can be used: \hyperref[curvelinear]{Curve:Linear}, \hyperref[curvequadratic]{Curve:Quadratic}, \hyperref[curvecubic]{Curve:Cubic}, \hyperref[curvequartic]{Curve:Quartic}, \hyperref[curveexponent]{Curve:Exponent}, \hyperref[curveexponentialskewnormal]{Curve:ExponentialSkewNormal}, \hyperref[curvesigmoid]{Curve:Sigmoid}, Curve:RectuangularHyperbola1, \hyperref[curverectangularhyperbola2]{Curve:RectangularHyperbola2}, \hyperref[curveexponentialdecay]{Curve:ExponentialDecay}, \hyperref[curvedoubleexponentialdecay]{Curve:DoubleExponentialDecay}, and \hyperref[tablelookup]{Table:Lookup}. +This alpha field is the name of a dimensionless normalized pump power modifying curve. This curve modifies the pump electric power in the previous field by multiplying the design power by the result of this curve. The normalized curve is a function of the primary air flow fraction as the independent variable. The curve shall yield a value of 1.0 at a flow fraction of 1.0. The flow fraction is the ratio of the primary air flow rate divided by primary air Design Air Flow Rate. If this input field is left blank, the pump power is assumed to vary linearly with the load (including air system cycling, if any). If pump power does not vary linearly with load this curve should be used. Any curve or table with one independent variable can be used: \hyperref[curvelinear]{Curve:Linear}, \hyperref[curvequadratic]{Curve:Quadratic}, \hyperref[curvecubic]{Curve:Cubic}, \hyperref[curvequartic]{Curve:Quartic}, \hyperref[curveexponent]{Curve:Exponent}, \hyperref[curveexponentialskewnormal]{Curve:ExponentialSkewNormal}, \hyperref[curvesigmoid]{Curve:Sigmoid}, Curve:RectuangularHyperbola1, \hyperref[curverectangularhyperbola2]{Curve:RectangularHyperbola2}, \hyperref[curveexponentialdecay]{Curve:ExponentialDecay}, \hyperref[curvedoubleexponentialdecay]{Curve:DoubleExponentialDecay}, and \hyperref[tableoneindependentvariable]{Table:OneIndependentVariable}. \paragraph{Field: Air Inlet Node Name}\label{field-air-inlet-node-name-1-001} -The name of the air inlet node for the primary air flow path through the cooler. +This alpha field is the name of the air inlet node for the primary air flow path through the cooler. \paragraph{Field: Air Outlet Node Name}\label{field-air-outlet-node-name-1-000} -The name of the air outlet node for the primary air flow path through the cooler. +This alpha field is the name of the air outlet node for the primary air flow path through the cooler. \paragraph{Field: Sensor Node Name}\label{field-sensor-node-name-001} -This field specifies the name of a node that will provide system air temperature setpoint information. A separate SetpointManager object should be setup to update this node. +This alpha field specifies the name of a node that will provide system air temperature setpoint information. A separate SetpointManager object should be setup to update this node. \paragraph{Field: Water Supply Storage Tank Name}\label{field-water-supply-storage-tank-name-1} -This field is optional. It is used to describe where the cooler obtains water used for evaporative cooling. If blank or omitted, then the cooler will obtain water directly from the mains. If the name of a \hyperref[waterusestorage]{WaterUse:Storage} object is used here, then the cooler will obtain its water from that tank. If a tank is specified, the cooler will attempt to obtain all the water it uses from the tank. However, if the tank cannot provide all the water the cooler needs, then the cooler will still operate and obtain the rest of the water it needs from the mains. +This alpha field is optional. It is used to describe where the cooler obtains water used for evaporative cooling. If blank or omitted, then the cooler will obtain water directly from the mains. If the name of a \hyperref[waterusestorage]{WaterUse:Storage} object is used here, then the cooler will obtain its water from that tank. If a tank is specified, the cooler will attempt to obtain all the water it uses from the tank. However, if the tank cannot provide all the water the cooler needs, then the cooler will still operate and obtain the rest of the water it needs from the mains. \paragraph{Field: Drift Loss Fraction}\label{field-drift-loss-fraction} -This field is optional and can be used to model additional water consumed by the cooler from drift. Drift is water that leaves the cooling media as droplets and does not evaporate into the process air stream. For example, water may get blown off the evaporative media by winds and escape the air system. The value entered here is a simple fraction of the water consumed by the cooler for normal process evaporation. The amount of drift is this fraction times the water evaporated for the normal cooling process. This field can be left blank and then there will be no added water consumption from drift. +This numeric field is optional and can be used to model additional water consumed by the cooler from drift. Drift is water that leaves the cooling media as droplets and does not evaporate into the process air stream. For example, water may get blown off the evaporative media and escape the air system. The value entered here is a simple fraction of the water consumed by the cooler for normal process evaporation. The amount of drift is this fraction times the water evaporated for the normal cooling process. This field can be left blank and then there will be no added water consumption from drift. \paragraph{Field: Blowdown Concentration Ratio}\label{field-blowdown-concentration-ratio-000} -This field is optional and can be used to model additional water consumed by the cooler from blowdown. Blowdown is water that is intentionally drained from the cooler's sump to offset the build up of solids in the water that would otherwise occur because of evaporation. The value entered here is dimensionless. It can be characterized as the ratio of solids in the blowdown water to solids in the make up water. Typical values are 3 to 5. The default is 3.0. +This numeric field is optional and can be used to model additional water consumed by the cooler from blowdown. Blowdown is water that is intentionally drained from the cooler's sump to offset the build up of solids in the water that would otherwise occur because of evaporation. The value entered here is dimensionless. It can be characterized as the ratio of solids in the blowdown water to solids in the make up water. Typical values are 3 to 5. The default is 3.0. \paragraph{Field: Evaporative Cooler Operation Minimum Drybulb Temperature}\label{field-evaporative-cooler-operation-minimum-drybulb-temperature} -This numeric field defines the evaporative cooler inlet node drybulb temperature minimum limit in degrees Celsius. The evaporative cooler will be turned off when evaporator cooler air inlet node dry-bulb temperature falls below this value. The typical minimum value is \SI{16}{\celsius}. Users are allowed to specify their own limits. If this field is left blank, then there is no drybulb temperature lower limit for evaporative cooler operation. +This numeric field defines the evaporative cooler inlet node drybulb temperature minimum limit in degrees Celsius. The evaporative cooler will be turned off when the evaporator cooler air inlet node dry-bulb temperature falls below this value. The typical minimum value is \SI{16}{\celsius}. Users are allowed to specify their own limits. If this field is left blank, then there is no drybulb temperature lower limit for evaporative cooler operation. \paragraph{Field: Evaporative Operation Maximum Limit Wetbulb Temperature}\label{field-evaporative-operation-maximum-limit-wetbulb-temperature} -This numeric field defines the evaporative cooler air inlet node air wetbulb temperature maximum limits in degree Celsius. When the evaporative cooler air inlet node air wetbulb temperature exceeds this limit, then the evaporative cooler is turns off. The typical maximum value is \SI{24}{\celsius}. If this input field is left blank, then there is no wetbulb temperature upper limit for evaporative cooler operation. +This numeric field defines the evaporative cooler air inlet node air wetbulb temperature maximum limits in degree Celsius. When the evaporative cooler air inlet node wetbulb temperature exceeds this limit, then the evaporative cooler turns off. The typical maximum value is \SI{24}{\celsius}. If this input field is left blank, then there is no wetbulb temperature upper limit for evaporative cooler operation. \paragraph{Field: Evaporative Operation Maximum Limit Drybulb Temperature}\label{field-evaporative-operation-maximum-limit-drybulb-temperature} @@ -227,9 +227,9 @@ \subsubsection{Inputs}\label{inputs-1-014} 30.0 , !- Recirculating Water Pump Design Power , !- Water Pump Power Sizing Factor , !- Water Pump Power Modifier Curve Name - OAIndRDD Evap Cooler- OADirect Evap CoolerNode , !- Air Inlet Node Name - OADirect Evap Cooler- OAMixing BoxNode, !- Air Outlet Node Name - OADirect Evap Cooler- OAMixing BoxNode, !- Sensor Node Name + OAIndRDD Evap Cooler-OADirect Evap CoolerNode , !- Air Inlet Node Name + OADirect Evap Cooler-OAMixing BoxNode, !- Air Outlet Node Name + OADirect Evap Cooler-OAMixing BoxNode, !- Sensor Node Name , !- Water Supply Storage Tank Name 0.0, !- Drift Loss Fraction 3; !- Blowdown Concentration Ratio @@ -266,7 +266,7 @@ \subsubsection{Outputs}\label{outputs-1-009} \paragraph{Evaporative Cooler Stage Effectiveness {[]}}\label{evaporative-cooler-stage-effectiveness} -The cooler stage efficiency is defined as the temperature change of the supply air divided by the difference between the outdoor dry-bulb and wet-bulb temperatures, including the effect of the reduction in the primary air flow rate in other words, it is a measure of the approach to the entering air wet-bulb temperature. +The cooler stage efficiency is defined as the temperature change of the supply air divided by the difference between the outdoor dry-bulb and wet-bulb temperatures, including the effect of the reduction in the primary air flow rate. In other words, it is a measure of the approach to the entering air wet-bulb temperature. \paragraph{Evaporative Cooler Water Volume {[}m3{]}}\label{evaporative-cooler-water-volume-m3-1} @@ -595,123 +595,123 @@ \subsubsection{Outputs}\label{outputs-3-006} \subsection{EvaporativeCooler:Indirect:ResearchSpecial}\label{evaporativecoolerindirectresearchspecial} -This cooler is similar in principal to the \hyperref[evaporativecoolerindirectceldekpad]{EvaporativeCooler:Indirect:CelDekPad} and \hyperref[evaporativecoolerindirectwetcoil]{EvaporativeCooler:Indirect:WetCoil} (see Figure~\ref{fig:secondary-air-process-indirect-dry-coil-evap}, Figure~\ref{fig:evaporative-cooler-indirect-wet-coil}, and Figure~\ref{fig:secondary-air-process-indirect-wet-coil-evap}). The model differs in that it gives the user more flexibility to specify the source of secondary air. The cooler effectiveness with respect to wetbulb depression is allowed to go beyond 1.0. Using the ResearchSpecial input object also allows the cooler to control the amount of cooling based on node setpoints (controlled by SetpointManagers). This avoid problems from over cooling when conditions are such that loads are low and cooling power is high. Fan power is assumed to vary linearly when the cooler is operating at less than full capacity. +This cooler is similar in principal to the \hyperref[evaporativecoolerindirectceldekpad]{EvaporativeCooler:Indirect:CelDekPad} and \hyperref[evaporativecoolerindirectwetcoil]{EvaporativeCooler:Indirect:WetCoil} (see Figure~\ref{fig:secondary-air-process-indirect-dry-coil-evap}, Figure~\ref{fig:evaporative-cooler-indirect-wet-coil}, and Figure~\ref{fig:secondary-air-process-indirect-wet-coil-evap}). The model differs in that it gives the user more flexibility to specify the source of secondary air. The cooler effectiveness with respect to wetbulb depression is allowed to go beyond 1.0. Using the ResearchSpecial object also allows the cooler to control the amount of cooling based on node setpoints (controlled by SetpointManagers). This avoid problems from over cooling when conditions are such that loads are low and cooling power is high. Fan power is assumed to vary linearly when the cooler is operating at less than full capacity (includes air system cycling, if any). -The indirect evaporative cooler research special calculation procedure allows accounting for dry and wet effectiveness value variation with flow fraction. Two effectiveness modifier curves are included as optional user inputs for this purpose. Effectiveness modifier curves operate on the design dry and wet effectiveness values. The flow fraction is calculated as a ratio of the sum of current primary and secondary air flow rates to the sum of the design flow rates. These effectiveness modifier curves are required for proper operation of secondary air flow modulation in dry and wet operating modes when advanced control is desired using the following three input fields \textit{Evaporative Operation Minimum Limit Secondary Air Drybulb Temperature}, \textit{Evaporative Operation Maximum Limit Outdoor Wetbulb Temperature}, and \textit{Operation Maximum Limit Outdoor Drybulb Temperature}. Model also accounts for fan and recirculation water pump power variation with secondary air flow rates using pump power modifying curve. The fan power is calculated by multiplying the design fan power using fan power modify curve value evaluated at current secondary air flow fraction. Similarly, recirculating pump power is is calculated by multiplying the design pump power by pump power modifier curve value evaluated at current secondary air flow fraction. If the secondary air fan and recirculating pump power modifier curves are not specified, then fan and pump power are assumed to vary linearly with part load fraction. +The indirect evaporative cooler research special calculation procedure allows accounting for dry and wet effectiveness value variation with flow fraction. Two effectiveness modifier curves are included as optional user inputs for this purpose. Effectiveness modifier curves operate on the design dry and wet effectiveness values. The flow fraction is calculated as a ratio of the sum of current primary and secondary air flow rates to the sum of the design flow rates. These effectiveness modifier curves are required for proper operation of secondary air flow modulation in dry and wet operating modes when advanced control is desired using the following three input fields \textit{Evaporative Operation Minimum Limit Secondary Air Drybulb Temperature}, \textit{Evaporative Operation Maximum Limit Outdoor Wetbulb Temperature}, and \textit{Operation Maximum Limit Outdoor Drybulb Temperature}. The model also accounts for fan and recirculation water pump power variation with secondary air flow rates using pump power modifying curve. The fan power is calculated by multiplying the design fan power using fan power modify curve value evaluated at current secondary air flow fraction. Similarly, recirculating pump power is calculated by multiplying the design pump power by pump power modifier curve value evaluated at current secondary air flow fraction. If the secondary air fan and recirculating pump power modifier curves are not specified, then fan and pump power are assumed to vary linearly with flow fraction, and if the air system cycles, the air loop cycling ratio (a.k.a. air system part-load ratio). \subsubsection{Inputs}\label{inputs-4-011} \paragraph{Field: Name}\label{field-name-4-010} -A unique identifying name for each cooler. +This alpha field is a unique identifying name for each cooler. \paragraph{Field: Availability Schedule Name}\label{field-availability-schedule-name-1-004} -The name of a schedule that defines when the evaporative cooler is available. A schedule value of 0 indicates that the evaporative cooler is off for that time period. A schedule value greater than 0 indicates that the evaporative cooler can operate during the time period. If this field is blank, the schedule has values of 1 for all time periods. +The alpha field is the name of a schedule that defines when the evaporative cooler is available. A schedule value of 0 indicates that the evaporative cooler is off for that time period. A schedule value greater than 0 indicates that the evaporative cooler can operate during the time period. If this field is blank, the evaporative cooler is always available. \paragraph{Field: Cooler Wetbulb Design Effectiveness}\label{field-cooler-wetbulb-design-effectiveness} -This field specifies the design effectiveness that is applied to the wetbulb depression to determine the conditions leaving the cooler. This effectiveness is a complicated function of the efficiency with which heat and mass are transferred on the secondary side and the efficiency of heat exchange between the secondary and primary flows. The model assumes that the effectiveness a function of flow fraction. The flow fraction is the ratio of the sum of primary air and secondary air current flow rates and the sum of the primary air and secondary air design flow rates. +This numeric field specifies the design effectiveness that is applied to the wetbulb depression to determine the conditions leaving the cooler. This effectiveness is a complicated function of the efficiency with which heat and mass are transferred on the secondary side and the efficiency of heat exchange between the secondary and primary flows. The model assumes that the effectiveness is a function of flow fraction. The flow fraction is the ratio of the sum of primary air and secondary air current flow rates and the sum of the primary air and secondary air design flow rates. \paragraph{Field: Wet Bulb Effectiveness Flow Ratio Modifier Curve Name}\label{field-wet-bulb-effectiveness-flow-ratio-modifier-curve-name} -This curve modifies the wet bulb effectiveness design value specified the previous field by multiplying the value by the result of this curve. The modifying curve is a function of flow fraction, which is the ratio of the sum of the primary and secondary flow rates divided by the sum of the design flow rates. If this input field is left blank, the effectiveness is assumed to be constant. The wet bulb effectiveness modifier curve is required for proper operation of secondary air flow modulation in wet cooling operating mode, and is used with the three input fields \textit{Evaporative Operation Minimum Limit Secondary Air Drybulb Temperature}, \textit{Evaporative Operation Maximum Limit Outdoor Wetbulb Temperature}, and \textit{Operation Maximum Limit Outdoor Drybulb Temperature}. Any curve or table with one independent variable can be used. Any curve or table with one independent variable can be used: \hyperref[curvelinear]{Curve:Linear}, \hyperref[curvequadratic]{Curve:Quadratic}, \hyperref[curvecubic]{Curve:Cubic}, \hyperref[curvequartic]{Curve:Quartic}, \hyperref[curveexponent]{Curve:Exponent}, \hyperref[curveexponentialskewnormal]{Curve:ExponentialSkewNormal}, \hyperref[curvesigmoid]{Curve:Sigmoid}, Curve:RectuangularHyperbola1, \hyperref[curverectangularhyperbola2]{Curve:RectangularHyperbola2}, \hyperref[curveexponentialdecay]{Curve:ExponentialDecay}, \hyperref[curvedoubleexponentialdecay]{Curve:DoubleExponentialDecay}, and \hyperref[tablelookup]{Table:Lookup}. +This alpha field is the name of a curve that modifies the wet bulb effectiveness design value specified in the previous field by multiplying that value by the result of this curve. The modifying curve is a function of flow fraction, which is the ratio of the sum of the primary and secondary flow rates divided by the sum of the design flow rates. If this input field is left blank, the effectiveness is assumed to be constant. The wet bulb effectiveness modifier curve is required for proper operation of secondary air flow modulation in wet cooling operating mode, and is used with the three input fields \textit{Evaporative Operation Minimum Limit Secondary Air Drybulb Temperature}, \textit{Evaporative Operation Maximum Limit Outdoor Wetbulb Temperature}, and \textit{Operation Maximum Limit Outdoor Drybulb Temperature}. Any curve or table with one independent variable can be used: \hyperref[curvelinear]{Curve:Linear}, \hyperref[curvequadratic]{Curve:Quadratic}, \hyperref[curvecubic]{Curve:Cubic}, \hyperref[curvequartic]{Curve:Quartic}, \hyperref[curveexponent]{Curve:Exponent}, \hyperref[curveexponentialskewnormal]{Curve:ExponentialSkewNormal}, \hyperref[curvesigmoid]{Curve:Sigmoid}, Curve:RectuangularHyperbola1, \hyperref[curverectangularhyperbola2]{Curve:RectangularHyperbola2}, \hyperref[curveexponentialdecay]{Curve:ExponentialDecay}, \hyperref[curvedoubleexponentialdecay]{Curve:DoubleExponentialDecay}, and \hyperref[tableoneindependentvariable]{Table:OneIndependentVariable}. \paragraph{Field: Cooler Drybulb Design Effectiveness}\label{field-cooler-drybulb-design-effectiveness} -This input value is dry bulb design effectiveness of the evaporative cooler. This is the nominal design dry blub effectiveness with respect to dry bulb temperature difference, i.e., dry operation and at design air flow rates, and no water evaporation or spraying on the secondary side. +This numeric field is the dry bulb design effectiveness of the evaporative cooler. This is the nominal design dry blub effectiveness with respect to the dry bulb temperature difference, i.e., dry operation at design air flow rates, and no water evaporation or spraying on the secondary side. \paragraph{Field Drybulb Effectiveness Flow Ratio Modifier Curve Name}\label{field-drybulb-effectiveness-flow-ratio-modifier-curve-name} -This this curve modifies the drybulb effectiveness in the previous field (eff\_db\_design) by multiplying the design effectiveness value by the result of this curve. The curve is evaluated flow fraction as independent variable. The flow fraction is the ratio of sum of the primary and secondary flow rates divided by the sum of the design flow rates. If this input field is left blank, the effectiveness is assumed to be constant. The dry bulb effectiveness modifier curve is required for proper operation of secondary air flow modulation in dry cooling operating mode, and is used with the three input fields \textit{Evaporative Operation Minimum Limit Secondary Air Drybulb Temperature}, \textit{Evaporative Operation Maximum Limit Outdoor Wetbulb Temperature}, and \textit{Operation Maximum Limit Outdoor Drybulb Temperature}. Any curve or table with one independent variable can be used: \hyperref[curvelinear]{Curve:Linear}, \hyperref[curvequadratic]{Curve:Quadratic}, \hyperref[curvecubic]{Curve:Cubic}, \hyperref[curvequartic]{Curve:Quartic}, \hyperref[curveexponent]{Curve:Exponent}, \hyperref[curveexponentialskewnormal]{Curve:ExponentialSkewNormal}, \hyperref[curvesigmoid]{Curve:Sigmoid}, Curve:RectuangularHyperbola1, \hyperref[curverectangularhyperbola2]{Curve:RectangularHyperbola2}, \hyperref[curveexponentialdecay]{Curve:ExponentialDecay}, \hyperref[curvedoubleexponentialdecay]{Curve:DoubleExponentialDecay}, and \hyperref[tablelookup]{Table:Lookup}. +This alpha field is the name of a curve that modifies the drybulb effectiveness in the previous field (eff\_db\_design) by multiplying the design effectiveness value by the result of this curve. The curve is evaluated using the flow fraction as the independent variable. The flow fraction is the ratio of sum of the primary and secondary flow rates divided by the sum of the design flow rates. If this input field is left blank, the effectiveness is assumed to be constant. The dry bulb effectiveness modifier curve is required for proper operation of secondary air flow modulation in dry cooling operating mode, and is used with the three input fields \textit{Evaporative Operation Minimum Limit Secondary Air Drybulb Temperature}, \textit{Evaporative Operation Maximum Limit Outdoor Wetbulb Temperature}, and \textit{Operation Maximum Limit Outdoor Drybulb Temperature}. Any curve or table with one independent variable can be used: \hyperref[curvelinear]{Curve:Linear}, \hyperref[curvequadratic]{Curve:Quadratic}, \hyperref[curvecubic]{Curve:Cubic}, \hyperref[curvequartic]{Curve:Quartic}, \hyperref[curveexponent]{Curve:Exponent}, \hyperref[curveexponentialskewnormal]{Curve:ExponentialSkewNormal}, \hyperref[curvesigmoid]{Curve:Sigmoid}, Curve:RectuangularHyperbola1, \hyperref[curverectangularhyperbola2]{Curve:RectangularHyperbola2}, \hyperref[curveexponentialdecay]{Curve:ExponentialDecay}, \hyperref[curvedoubleexponentialdecay]{Curve:DoubleExponentialDecay}, and \hyperref[tableoneindependentvariable]{Table:OneIndependentVariable}. \paragraph{Field: Recirculating Water Pump Design Power}\label{field-recirculating-water-pump-design-power} -This numeric input field is the recirculating pump electric power at Secondary Design Air Flow Rate in W. This is the nominal design pump power water recirculation and spray for evaporation at design secondary air flow rates and cooler design effectiveness. This input field is autosizable. +This numeric field is the recirculating pump electric power at Secondary Design Air Flow Rate in W. This is the nominal design pump power water recirculation and spray for evaporation at design secondary air flow rates and cooler design effectiveness. This input field is autosizable. \paragraph{Field: Water Pump Power Sizing Factor}\label{field-water-pump-power-sizing-factor-1} -This numeric input field value is recirculating water pump sizing factor in \si{\wattperVolumeFlowRate}. This field is used when the previous field is set to autosize. The pump design electric power is scaled with Secondary Design Air Flow Rate. Average Pump Power sizing factor was estimated from pump power and secondary air design flow rates inputs from energyplus example files is about 90.0 \si{\wattperVolumeFlowRate} ( = 90.0 \textasciitilde{} Pump Power / Secondary Air Design Flow Rate). The factor ranges from 55.0 to 150.0 \si{\wattperVolumeFlowRate}. +This numeric field value is recirculating water pump sizing factor in \si{\wattperVolumeFlowRate}. This field is used when the previous field is set to autosize. The pump design electric power is scaled with Secondary Design Air Flow Rate. Average Pump Power sizing factor was estimated from pump power and secondary air design flow rates inputs from energyplus example files and is about 90.0 \si{\wattperVolumeFlowRate} ( = 90.0 \textasciitilde{} Pump Power / Secondary Air Design Flow Rate). The factor ranges from 55.0 to 150.0 \si{\wattperVolumeFlowRate}. \paragraph{Field: Water Pump Power Modifier Curve Name}\label{field-water-pump-power-modifier-curve-name-1} -This alpha input field is the name of a dimensionless normalized pump power modifying curve. This curve modifies the pump electric power in the previous field by multiplying the design power by the result of this curve. The normalized curve is a function of the secondary side flow fraction as independent variable. The curve shall yield a value of 1.0 at a flow fraction of 1.0. The flow fraction is the secondary air flow rate during operation divided by Secondary Design Air Flow Rate. If this input field is left blank, the pump power is assumed to vary linearly with the load. Any curve or table with one independent variable can be used: \hyperref[curvelinear]{Curve:Linear}, \hyperref[curvequadratic]{Curve:Quadratic}, \hyperref[curvecubic]{Curve:Cubic}, \hyperref[curvequartic]{Curve:Quartic}, \hyperref[curveexponent]{Curve:Exponent}, \hyperref[curveexponentialskewnormal]{Curve:ExponentialSkewNormal}, \hyperref[curvesigmoid]{Curve:Sigmoid}, Curve:RectuangularHyperbola1, \hyperref[curverectangularhyperbola2]{Curve:RectangularHyperbola2}, \hyperref[curveexponentialdecay]{Curve:ExponentialDecay}, \hyperref[curvedoubleexponentialdecay]{Curve:DoubleExponentialDecay}, and \hyperref[tablelookup]{Table:Lookup}. +This alpha field is the name of a dimensionless normalized pump power modifying curve. This curve modifies the pump electric power in the previous field by multiplying the design power by the result of this curve. The normalized curve is a function of the secondary side flow fraction as the independent variable. The curve shall yield a value of 1.0 at a flow fraction of 1.0. The flow fraction is the secondary air flow rate during operation divided by Secondary Design Air Flow Rate. If this input field is left blank, the pump power is assumed to vary linearly with the load. If pump power does not vary linearly with load this curve should be used. Any curve or table with one independent variable can be used: \hyperref[curvelinear]{Curve:Linear}, \hyperref[curvequadratic]{Curve:Quadratic}, \hyperref[curvecubic]{Curve:Cubic}, \hyperref[curvequartic]{Curve:Quartic}, \hyperref[curveexponent]{Curve:Exponent}, \hyperref[curveexponentialskewnormal]{Curve:ExponentialSkewNormal}, \hyperref[curvesigmoid]{Curve:Sigmoid}, Curve:RectuangularHyperbola1, \hyperref[curverectangularhyperbola2]{Curve:RectangularHyperbola2}, \hyperref[curveexponentialdecay]{Curve:ExponentialDecay}, \hyperref[curvedoubleexponentialdecay]{Curve:DoubleExponentialDecay}, and \hyperref[tableoneindependentvariable]{Table:OneIndependentVariable}. \paragraph{Field: Secondary Air Design Flow Rate}\label{field-secondary-air-design-flow-rate} -This field is used to specify the secondary air fan flow rate and is specified in \si{\volumeFlowRate}. This flow rate would typically be similar in magnitude to the flow through the primary side. This field can be autosized. When it is autosized, the program detects if the component is in the main air loop or on an outdoor air path. If it is on the main air loop, then the flow rate is set to the \hyperref[airloophvac]{AirLoopHVAC} system's design supply air flow rate (which is the maximum required for heating and cooling). If it is on the outdoor air path, then the flow rate is set to the larger of either the design minimum outdoor air flow rate or one-half of the main air loop design flow rate. The flow rate is used to determine parasitic fan energy and cooler effectiveness. The flow rate (and fan power) is effectively reduced by cycling when the amount of cooling needs to be restricted for control purpose. This field can be autosized. When this input is autosized, the program calculates by scaling the Primary Air Design Flow Rate using secondary air scaling factor specified in the input field below. +This numeric field is used to specify the secondary air fan flow rate and is specified in \si{\volumeFlowRate}. This flow rate would typically be similar in magnitude to the flow through the primary side. This field can be autosized. When it is autosized, the program detects if the component is in the main air loop or on an outdoor air path. If it is on the main air loop, then the flow rate is set to the \hyperref[airloophvac]{AirLoopHVAC} system's design supply air flow rate (which is the maximum required for heating and cooling). If it is on the outdoor air path, then the flow rate is set to the larger of either the design minimum outdoor air flow rate or one-half of the main air loop design flow rate. The flow rate is used to determine parasitic fan energy and cooler effectiveness. The flow rate (and fan power) is effectively reduced by cycling when the amount of cooling needs to be restricted for control purpose. This field can be autosized. When this input is autosized, the program calculates this input by scaling the Primary Air Design Flow Rate using secondary air scaling factor specified in the input field below. \paragraph{Field: Secondary Air Flow Scaling Factor}\label{field-secondary-air-flow-scaling-factor} -This numeric input field is used to scale the secondary air design flow rate and it is dimensionless. This field is used when the previous field is set to autosize. The Primary Design Air Flow Rate is scaled using this factor to calculate the secondary design air flow rate. +This numeric field is used to scale the secondary air design flow rate and is dimensionless. This field is used when the previous field is set to autosize. The Primary Design Air Flow Rate is scaled using this factor to calculate the secondary design air flow rate. \paragraph{Field: Secondary Air Fan Design Power}\label{field-secondary-air-fan-design-power} -This numeric input field is the fan electric power at Secondary Design Air Flow Rate. This is the nominal design electric power at full speed of the secondary air fan. This input field is autosizable. +This numeric field is the fan electric power at the Secondary Design Air Flow Rate. This is the nominal design electric power at full speed of the secondary air fan. This input field is autosizable. \paragraph{Field: Secondary Air Fan Sizing Specific Power}\label{field-secondary-air-fan-sizing-specific-power} -This input field value is secondary air fan sizing specific power in W/(m3/s). This field is used when the previous field is set to autosize. The fan power is scaled with Secondary Design Air Flow Rate. +This numeric field is the secondary air fan sizing specific power in W/(m3/s). This field is used when the previous field is set to autosize. The fan power is scaled using the Secondary Design Air Flow Rate. \paragraph{Field: Secondary Air Fan Power Modifier Curve Name}\label{field-secondary-air-fan-power-modifier-curve-name} -This input field is the name of a dimensionless normalized curve. The normalized curve modifies the design secondary air fan power in the previous field by multiplying the value by the result of this curve. The normalized curve is a function of the secondary side flow fraction as independent variable. The curve shall yield a value of 1.0 at a flow fraction of 1.0. The flow fraction is the secondary air flow rate during operation divided by Secondary Design Air Flow Rate. If this input field is left blank, the fan power is assumed to be constant. Any curve or table with one independent variable can be used: \hyperref[curvelinear]{Curve:Linear}, \hyperref[curvequadratic]{Curve:Quadratic}, \hyperref[curvecubic]{Curve:Cubic}, \hyperref[curvequartic]{Curve:Quartic}, \hyperref[curveexponent]{Curve:Exponent}, \hyperref[curveexponentialskewnormal]{Curve:ExponentialSkewNormal}, \hyperref[curvesigmoid]{Curve:Sigmoid}, Curve:RectuangularHyperbola1, \hyperref[curverectangularhyperbola2]{Curve:RectangularHyperbola2}, \hyperref[curveexponentialdecay]{Curve:ExponentialDecay}, \hyperref[curvedoubleexponentialdecay]{Curve:DoubleExponentialDecay}, and \hyperref[tablelookup]{Table:Lookup}. +This alpha field is the name of a dimensionless normalized curve. The normalized curve modifies the design secondary air fan power in the previous field by multiplying that value by the result of this curve. The normalized curve is a function of the secondary side flow fraction as the independent variable. The curve shall yield a value of 1.0 at a flow fraction of 1.0. The flow fraction is the secondary air flow rate divided by Secondary Design Air Flow Rate. If this input field is left blank, the fan power will vary linearly with load (includes air system cycling, if any). If fan power does not vary linearly with load this curve should be used. Any curve or table with one independent variable can be used: \hyperref[curvelinear]{Curve:Linear}, \hyperref[curvequadratic]{Curve:Quadratic}, \hyperref[curvecubic]{Curve:Cubic}, \hyperref[curvequartic]{Curve:Quartic}, \hyperref[curveexponent]{Curve:Exponent}, \hyperref[curveexponentialskewnormal]{Curve:ExponentialSkewNormal}, \hyperref[curvesigmoid]{Curve:Sigmoid}, Curve:RectuangularHyperbola1, \hyperref[curverectangularhyperbola2]{Curve:RectangularHyperbola2}, \hyperref[curveexponentialdecay]{Curve:ExponentialDecay}, \hyperref[curvedoubleexponentialdecay]{Curve:DoubleExponentialDecay}, and \hyperref[tableoneindependentvariable]{Table:OneIndependentVariable}. \paragraph{Field: Primary Air Inlet Node Name}\label{field-primary-air-inlet-node-name-2} -The name of the air inlet node for the primary air flow path through the cooler. +This alpha field is the name of the air inlet node for the primary air flow path through the cooler. \paragraph{Field: Primary Air Outlet Node Name}\label{field-primary-air-outlet-node-name-2} -The name of the air outlet node for the primary air flow path through the cooler. +This alpha field is the name of the air outlet node for the primary air flow path through the cooler. \paragraph{Field:Primary Design Air Flow Rate}\label{fieldprimary-design-air-flow-rate-1} -This numeric input field is the primary air design air flow rate in m3/s. This input field is autosizable. If the evaporative cooler is on main air loop branch, the design flow rate is the same as branch design flow rate, or else if it is on outdoor air system it will be the maximum of the the outdoor air design flow rate and the half of the primary air flow rate on the main air loop branch. +This numeric field is the primary air design air flow rate in m3/s. This input field is autosizable. If the evaporative cooler is on the main air loop branch, the design flow rate is the same as branch design flow rate. If the evaporative cooler is in the outdoor air system primary design flow rate will be the maximum of the the outdoor air design flow rate and one-half of the primary air flow rate on the main air loop branch. \paragraph{Field: Dewpoint Effectiveness Factor}\label{field-dewpoint-effectiveness-factor} -This field specifies an effectiveness that is applied to the dewpoint depression to determine a bound for the conditions leaving the cooler. The model uses the warmer of the two temperatures determined from wetbulb depression and dewpoint depression. +This numeric field specifies an effectiveness that is applied to the dewpoint depression to determine a bound for the conditions leaving the cooler. The model uses the warmer of the two temperatures determined from wetbulb depression and dewpoint depression. \paragraph{Field: Secondary Air Inlet Node Name}\label{field-secondary-air-inlet-node-name-2} -This field specifies the name of the node providing air to the secondary/wet side of the cooler. Typically this node could appear in an outdoor air node list or be part of an air system loop. +This alpha field specifies the name of the node providing air to the secondary/wet side of the cooler. Typically this node could appear in an outdoor air node list or be part of an air system loop. \paragraph{Field: Secondary Air Outlet Node Name}\label{field-secondary-air-outlet-node-name} -This alpha input field is the name of the secondary air side outlet node. +This alpha field is the name of the secondary air side outlet node. \paragraph{Field: Sensor Node Name}\label{field-sensor-node-name-1} -This field specifies the name of a node that will provide system air temperature setpoint information. A separate SetpointManager object should be setup to update this node. +This alpha field specifies the name of a node that will provide system air temperature setpoint information. A separate SetpointManager object should be setup to update this node. \paragraph{Field: Relief Air Inlet Node Name}\label{field-relief-air-inlet-node-name} -This field is optional, but can be used to feed two sources of secondary air into the wet side of the cooler. Typical use is to run the air system relief air into the system. The model first uses all of the air flow available from this node and then adds the air flow from the secondary air inlet node to make up the total defined by Secondary air Fan Flow Rate. +This alpha field is optional, but can be used to feed two sources of secondary air into the wet side of the cooler. Typical use is to run the air system relief air into the system. The model first uses all of the air flow available from this node and then adds the air flow from the secondary air inlet node to make up the total defined by Secondary air Fan Flow Rate. \paragraph{Field: Water Supply Storage Tank Name}\label{field-water-supply-storage-tank-name-4} -This field is optional. It is used to describe where the cooler obtains water used for evaporative cooling. If blank or omitted, then the cooler will obtain water directly from the mains. If the name of a \hyperref[waterusestorage]{WaterUse:Storage} object is used here, then the cooler will obtain its water from that tank. If a tank is specified, the cooler will attempt to obtain all the water it uses from the tank. However, if the tank cannot provide all the water the cooler needs, then the cooler will still operate and obtain the rest of the water it needs from the mains. +This alpha field is optional. It is used to describe where the cooler obtains water used for evaporative cooling. If blank or omitted, then the cooler will obtain water directly from the mains. If the name of a \hyperref[waterusestorage]{WaterUse:Storage} object is used here, then the cooler will obtain its water from that tank. If a tank is specified, the cooler will attempt to obtain all the water it uses from the tank. However, if the tank cannot provide all the water the cooler needs, then the cooler will still operate and obtain the rest of the water it needs from the mains. \paragraph{Field: Drift Loss Fraction}\label{field-drift-loss-fraction-2} -This field is optional and can be used to model additional water consumed by the cooler from drift. Drift is water that leaves the cooling media as droplets and does not evaporate into the process air stream. For example, water may get blown off the evaporative media by winds and escape the air system. The value entered here is a simple fraction of the water consumed by the cooler for normal process evaporation. The amount of drift is this fraction times the water evaporated for the normal cooling process. This field can be left blank and then there will be no added water consumption from drift. +This numeric field is optional and can be used to model additional water consumed by the cooler from drift. Drift is water that leaves the cooling media as droplets and does not evaporate into the process air stream. For example, water may get blown off the evaporative media by winds and escape the air system. The value entered here is a simple fraction of the water consumed by the cooler for normal process evaporation. The amount of drift is this fraction times the water evaporated for the normal cooling process. This field can be left blank and then there will be no added water consumption from drift. \paragraph{Field: Blowdown Concentration Ratio}\label{field-blowdown-concentration-ratio-2-000} -This field is optional and can be used to model additional water consumed by the cooler from blowdown. Blowdown is water that is intentionally drained from the cooler s sump to offset the build up of solids in the water that would otherwise occur because of evaporation. The value entered here is dimensionless. It can be characterized as the ratio of solids in the blowdown water to solids in the make up water. Typical values are 3 to 5. The default is 3.0. +This numeric field is optional and can be used to model additional water consumed by the cooler from blowdown. Blowdown is water that is intentionally drained from the cooler s sump to offset the build up of solids in the water that would otherwise occur because of evaporation. The value entered here is dimensionless. It can be characterized as the ratio of solids in the blowdown water to solids in the make up water. Typical values are 3 to 5. The default is 3.0. \paragraph{Field: Evaporative Operation Minimum Limit Drybulb Temperature}\label{field-evaporative-operation-minimum-limit-drybulb-temperature} -This input field value defines the secondary air inlet node drybulb temperature limits in degree Celsius. When the secondary side entering air dry bulb temperature drops below this limit, then the evaporative cooler operation mode changes to dry heat exchanger. Users specify their own limits. If this field is left blank, then there is no drybulb temperature lower limit for evaporative cooler operation. If operating range control is desired then this input field and the next two input fields should be specified or all the three should be left blank or left out. If no minimum drybulb temperature limit is required while there are maximum drybulb and wetbulb temperature limits then specify very low temperature limit value (e.g., -99.0 C). +This numeric field defines the secondary air inlet node drybulb temperature limits in degree Celsius. When the secondary side entering air dry bulb temperature drops below this limit, then the evaporative cooler operation mode changes to dry heat exchanger. Users specify their own limits. If this field is left blank, then there is no drybulb temperature lower limit for evaporative cooler operation. If operating range control is desired then this input field and the next two input fields should be specified or all the three should be left blank or left out. If no minimum drybulb temperature limit is required while there are maximum drybulb and wetbulb temperature limits then specify very low temperature limit value (e.g., -99.0 C). \paragraph{Field: Evaporative Operation Maximum Limit Wetbulb Temperature}\label{field-evaporative-operation-maximum-limit-wetbulb-temperature-1} -This input field value defines the secondary air inlet node wetbulb temperature limits in degree Celsius. When the secondary side entering air wet bulb temperature exceeds this limit, then the evaporative cooler is turns off and does not attempt to do any cooling. If this field is left blank, then there is no wetbulb temperature maximum limit for evaporative cooler wet operation mode. If no upper wetbulb temperature limits is desired while there are minimum drybulb and maximum drybulb upper temperature limits then then specify very high maximum wetbulb temperature limit value (e.g.~99.0 C). +This numeric field defines the secondary air inlet node wetbulb temperature limits in degree Celsius. When the secondary side entering air wet bulb temperature exceeds this limit, then the evaporative cooler is turns off and does not attempt to do any cooling. If this field is left blank, then there is no wetbulb temperature maximum limit for evaporative cooler wet operation mode. If no upper wetbulb temperature limits is desired while there are minimum drybulb and maximum drybulb upper temperature limits then then specify very high maximum wetbulb temperature limit value (e.g.~99.0 C). \paragraph{Field: Evaporative Operation Maximum Limit Drybulb Temperature}\label{field-evaporative-operation-maximum-limit-drybulb-temperature-1} -This input field value defines the secondary air inlet node drybulb temperature limits in degree Celsius. When the secondary side entering air drybulb temperature exceeds this limit, the evaporative cooler will not run in dry operation mode or may be turned off depending on its wetbulb temperature. If this field is left blank, then there is no drybulb temperature maximum limit for evaporative cooler dry operation mode. If no drybulb temperature limit is desired while there are minimum drybulb and maximum wetbulb temperature limits then specify very high maximum drybulb temperature limit value (e.g.~99.0 C). +This numeric field defines the secondary air inlet node drybulb temperature limits in degree Celsius. When the secondary side entering air drybulb temperature exceeds this limit, the evaporative cooler will not run in dry operation mode or may be turned off depending on its wetbulb temperature. If this field is left blank, then there is no drybulb temperature maximum limit for evaporative cooler dry operation mode. If no drybulb temperature limit is desired while there are minimum drybulb and maximum wetbulb temperature limits then specify very high maximum drybulb temperature limit value (e.g.~99.0 C). An IDF example is shown below: diff --git a/doc/input-output-reference/src/overview/group-location-climate-weather-file-access.tex b/doc/input-output-reference/src/overview/group-location-climate-weather-file-access.tex index 20af4f70ccb..f0fbacf0f2b 100644 --- a/doc/input-output-reference/src/overview/group-location-climate-weather-file-access.tex +++ b/doc/input-output-reference/src/overview/group-location-climate-weather-file-access.tex @@ -1314,7 +1314,7 @@ \subsubsection{Inputs}\label{inputs-16-006} \paragraph{Field: Horizontal Insulation Material Name}\label{field-horizontal-insulation-material-name} -Name of material object representing the horizontal slab insulation. Optional argument only required if horizontal insulation is present. +This alpha field is the name of a material object representing the horizontal slab insulation. It should be noted that the material listed here cannot be a "no mass" material (\hyperref[materialnomass]{Material:NoMass}) that is defined by R-Value only but should be defined as a regular material with an actual thickness. This optional argument is only required if horizontal insulation is present. \paragraph{Field: Horizontal Insulation Extents}\label{field-horizontal-insulation-extents} @@ -1330,7 +1330,7 @@ \subsubsection{Inputs}\label{inputs-16-006} \paragraph{Field: Vertical Insulation Name}\label{field-vertical-insulation-name} -Name of material object representing the vertical slab insulation. Optional argument only required if vertical insulation is present. +This alpha field is the name of a material object representing the vertical slab insulation. It should be noted that the material listed here cannot be a "no mass" material (\hyperref[materialnomass]{Material:NoMass}) that is defined by R-Value only but should be defined as a regular material with an actual thickness. This optional argument is only required if vertical insulation is present. \paragraph{Field: Vertical Insulation Depth}\label{field-vertical-insulation-depth} @@ -1524,7 +1524,7 @@ \subsubsection{Inputs}\label{inputs-17-004} \paragraph{Field: Horizontal Insulation Name}\label{field-horizontal-insulation-name} -Name of material object representing the horizontal underfloor basement insulation. Optional argument only required if horizontal insulation is present. +This alpha field is the name of a material object representing the horizontal underfloor basement insulation. It should be noted that the material listed here cannot be a "no mass" material (\hyperref[materialnomass]{Material:NoMass}) that is defined by R-Value only but should be defined as a regular material with an actual thickness. This optional argument is only required if horizontal insulation is present. \paragraph{Field: Horizontal Insulation Extents}\label{field-horizontal-insulation-extents-1} @@ -1548,7 +1548,7 @@ \subsubsection{Inputs}\label{inputs-17-004} \paragraph{Field: Vertical Insulation Name}\label{field-vertical-insulation-name-1} -Name of material object representing the vertical slab insulation. Optional argument only required if vertical insulation is present. +This alpha field is the name of a material object representing the vertical basement insulation. It should be noted that the material listed here cannot be a "no mass" material (\hyperref[materialnomass]{Material:NoMass}) that is defined by R-Value only but should be defined as a regular material with an actual thickness. This optional argument is only required if vertical insulation is present. \paragraph{Field: Vertical Insulation Depth}\label{field-vertical-insulation-depth-1} diff --git a/doc/input-output-reference/src/overview/group-thermal-zone-description-geometry.tex b/doc/input-output-reference/src/overview/group-thermal-zone-description-geometry.tex index 442e561a18d..b07340fbaad 100644 --- a/doc/input-output-reference/src/overview/group-thermal-zone-description-geometry.tex +++ b/doc/input-output-reference/src/overview/group-thermal-zone-description-geometry.tex @@ -2622,7 +2622,7 @@ \subsection{Window Output Variables}\label{window-output-variables} Zone,Average, Surface Window Inside Face Other Convection Heat Gain Rate [W] \end{lstlisting} -Output variables applicable to interior and exterior windows and doors are: +Output variables applicable to interior and exterior windows and doors under certain conditions (see next three subsections for more information) are: \begin{lstlisting} Zone,Average,Surface Window Total Absorbed Shortwave Radiation Rate Layer [W] @@ -2632,15 +2632,16 @@ \subsection{Window Output Variables}\label{window-output-variables} \subsubsection{Surface Window Total Absorbed Shortwave Radiation Rate Layer \textless{}x\textgreater{} {[}W{]}}\label{surface-window-total-absorbed-shortwave-radiation-rate-layer-x-w} -This will output shortwave radiation absorbed in a window layer. The key values for this output variable are the surface name. Layers are numbered from the outside to the inside of the surface. The full listing will appear in the RDD file. +This will output shortwave radiation absorbed in a window layer. The key values for this output variable are the surface name. Layers are numbered from the outside to the inside of the surface. The full listing will appear in the RDD file. Note that this variable is only defined for constructions defined by a \hyperref[constructioncomplexfenestrationstate]{Construction:ComplexFenestrationState}. \subsubsection{Surface Window Front Face Temperature Layer \textless{}x\textgreater{} {[}C{]}}\label{surface-window-front-face-temperature-layer-x-c} -This will output a temperature for the front face of the layer. The layer front face is considered to be the face closest to the outside environment. The full listing will appear in the RDD file. +This will output a temperature for the front face of the layer. The layer front face is considered to be the face closest to the outside environment. The full listing will appear in the RDD file. Note that this variable is only defined for constructions defined by a \hyperref[constructioncomplexfenestrationstate]{Construction:ComplexFenestrationState}. For other window constructions, this variable is also defined for the outer layer (Layer 1) only. The value will be identical to the \hyperref[surface-outside-face-temperature-c]{Surface Outside Face Temperature}. + \subsubsection{Surface Window Back Face Temperature Layer \textless{}x\textgreater{} {[}C{]}}\label{surface-window-back-face-temperature-layer-x-c} -This will output a temperature for the back face of the layer. The layer back face is considered to be the face closest to the inside environment. The full listing will appear in the RDD file. +This will output a temperature for the back face of the layer. The layer back face is considered to be the face closest to the inside environment. The full listing will appear in the RDD file. Note that this variable is only defined for constructions defined by a \hyperref[constructioncomplexfenestrationstate]{Construction:ComplexFenestrationState}. For other window constructions, this variable is also defined for the inner layer only. The value will be identical to the \hyperref[surface-inside-face-temperature-c]{Surface Inside Face Temperature}. \subsection{Surface Output Variables (all heat transfer surfaces)}\label{surface-output-variables-all-heat-transfer-surfaces} diff --git a/doc/interface-developer/CMakeLists.txt b/doc/interface-developer/CMakeLists.txt index a2f9059cda6..1b779e9ebb5 100644 --- a/doc/interface-developer/CMakeLists.txt +++ b/doc/interface-developer/CMakeLists.txt @@ -40,6 +40,9 @@ add_custom_command( OUTPUT ${CMAKE_BINARY_DIR}/doc/${OUTPUT_FILENAME}.pdf WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/doc/${SOURCE_FILENAME} DEPENDS ${INCLUDED_TEX} ${INCLUDED_IMAGES} ) -add_custom_target( zPDF_${OUTPUT_FILENAME} ALL +add_custom_target( zPDF_${OUTPUT_FILENAME} DEPENDS ${CMAKE_BINARY_DIR}/doc/${OUTPUT_FILENAME}.pdf ) + +# Make top-level 'documentation' target depend on this one +add_dependencies(documentation zPDF_${OUTPUT_FILENAME}) \ No newline at end of file diff --git a/doc/module-developer/CMakeLists.txt b/doc/module-developer/CMakeLists.txt index 496a1ba99bc..b919db3b6ef 100644 --- a/doc/module-developer/CMakeLists.txt +++ b/doc/module-developer/CMakeLists.txt @@ -93,6 +93,9 @@ add_custom_command( OUTPUT ${CMAKE_BINARY_DIR}/doc/${OUTPUT_FILENAME}.pdf WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/doc/${SOURCE_FILENAME} DEPENDS ${INCLUDED_TEX} ${INCLUDED_IMAGES} ) -add_custom_target( zPDF_${OUTPUT_FILENAME} ALL +add_custom_target( zPDF_${OUTPUT_FILENAME} DEPENDS ${CMAKE_BINARY_DIR}/doc/${OUTPUT_FILENAME}.pdf ) + +# Make top-level 'documentation' target depend on this one +add_dependencies(documentation zPDF_${OUTPUT_FILENAME}) \ No newline at end of file diff --git a/doc/module-developer/src/energyplus-services/psychrometric-services.tex b/doc/module-developer/src/energyplus-services/psychrometric-services.tex index 327e1688733..8cfe717f866 100644 --- a/doc/module-developer/src/energyplus-services/psychrometric-services.tex +++ b/doc/module-developer/src/energyplus-services/psychrometric-services.tex @@ -143,3 +143,11 @@ \subsection{CVHW (Temp,calledfrom)}\label{cvhw-tempcalledfrom} \subsection{RhoH2O (Temp,calledfrom)}\label{rhoh2o-tempcalledfrom} Returns density of water (kg/m3) as function of Temperature {[}T{]} (Celsius). + +\subsection{PsyDeltaHSenFnTdb2W2Tdb1W1 (Tdb2,W2, Tdb1, W1,calledfrom)}\label{psydeltahsenfntdb2w2tdb1w1-tdb2w2tdb1w1calledfrom} + +Returns sensible enthalpy difference of moist air going from state 1 to state 2 in Joules per kilogram as a function of state 2 dry bulb temperature {[}Tdb2{]} (Celsius), state 2 humidity ratio {[}W2{]} (kilograms of water per kilogram of dry air), state 1 dry bulb temperature {[}Tdb1{]} (Celsius), and state 1 humidity ratio {[}W1{]} (kilograms of water per kilogram of dry air). + +\subsection{PsyHfgAvgFnTdb2Tdb1 (Tdb2,Tdb1,calledfrom)}\label{psyhfgavgfntdb2tdb1-tdb2w2tdb1calledfrom} + +Returns average latent of vaporization of water for use in moist air calculation in Joules per kilogram of water as a function of state 2 dry bulb temperature {[}Tdb2{]} (Celsius), and state 1 dry bulb temperature {[}Tdb1{]} (Celsius). \ No newline at end of file diff --git a/doc/output-details-and-examples/CMakeLists.txt b/doc/output-details-and-examples/CMakeLists.txt index 8d639784c90..1a71977f97b 100644 --- a/doc/output-details-and-examples/CMakeLists.txt +++ b/doc/output-details-and-examples/CMakeLists.txt @@ -60,6 +60,9 @@ add_custom_command( OUTPUT ${CMAKE_BINARY_DIR}/doc/${OUTPUT_FILENAME}.pdf WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/doc/${SOURCE_FILENAME} DEPENDS ${INCLUDED_TEX} ${INCLUDED_IMAGES} ) -add_custom_target( zPDF_${OUTPUT_FILENAME} ALL +add_custom_target( zPDF_${OUTPUT_FILENAME} DEPENDS ${CMAKE_BINARY_DIR}/doc/${OUTPUT_FILENAME}.pdf ) + +# Make top-level 'documentation' target depend on this one +add_dependencies(documentation zPDF_${OUTPUT_FILENAME}) \ No newline at end of file diff --git a/doc/plant-application-guide/CMakeLists.txt b/doc/plant-application-guide/CMakeLists.txt index b85ceb6d1cb..b9dab53dd2a 100644 --- a/doc/plant-application-guide/CMakeLists.txt +++ b/doc/plant-application-guide/CMakeLists.txt @@ -168,6 +168,9 @@ add_custom_command( OUTPUT ${CMAKE_BINARY_DIR}/doc/${OUTPUT_FILENAME}.pdf WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/doc/${SOURCE_FILENAME} DEPENDS ${INCLUDED_TEX} ${INCLUDED_IMAGES} ) -add_custom_target( zPDF_${OUTPUT_FILENAME} ALL +add_custom_target( zPDF_${OUTPUT_FILENAME} DEPENDS ${CMAKE_BINARY_DIR}/doc/${OUTPUT_FILENAME}.pdf ) + +# Make top-level 'documentation' target depend on this one +add_dependencies(documentation zPDF_${OUTPUT_FILENAME}) \ No newline at end of file diff --git a/doc/tips-and-tricks-using-energyplus/CMakeLists.txt b/doc/tips-and-tricks-using-energyplus/CMakeLists.txt index e492100341b..01b576a3f44 100644 --- a/doc/tips-and-tricks-using-energyplus/CMakeLists.txt +++ b/doc/tips-and-tricks-using-energyplus/CMakeLists.txt @@ -111,6 +111,9 @@ add_custom_command( OUTPUT ${CMAKE_BINARY_DIR}/doc/${OUTPUT_FILENAME}.pdf WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/doc/${SOURCE_FILENAME} DEPENDS ${INCLUDED_TEX} ${INCLUDED_IMAGES} ) -add_custom_target( zPDF_${OUTPUT_FILENAME} ALL +add_custom_target( zPDF_${OUTPUT_FILENAME} DEPENDS ${CMAKE_BINARY_DIR}/doc/${OUTPUT_FILENAME}.pdf ) + +# Make top-level 'documentation' target depend on this one +add_dependencies(documentation zPDF_${OUTPUT_FILENAME}) \ No newline at end of file diff --git a/doc/using-energyplus-for-compliance/CMakeLists.txt b/doc/using-energyplus-for-compliance/CMakeLists.txt index 6f8fc6606f9..d7de213272e 100644 --- a/doc/using-energyplus-for-compliance/CMakeLists.txt +++ b/doc/using-energyplus-for-compliance/CMakeLists.txt @@ -27,6 +27,9 @@ add_custom_command( OUTPUT ${CMAKE_BINARY_DIR}/doc/${OUTPUT_FILENAME}.pdf WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/doc/${SOURCE_FILENAME} DEPENDS ${INCLUDED_TEX} ${INCLUDED_IMAGES} ) -add_custom_target( zPDF_${OUTPUT_FILENAME} ALL +add_custom_target( zPDF_${OUTPUT_FILENAME} DEPENDS ${CMAKE_BINARY_DIR}/doc/${OUTPUT_FILENAME}.pdf ) + +# Make top-level 'documentation' target depend on this one +add_dependencies(documentation zPDF_${OUTPUT_FILENAME}) \ No newline at end of file diff --git a/src/EnergyPlus/AirflowNetworkBalanceManager.cc b/src/EnergyPlus/AirflowNetworkBalanceManager.cc index 2f4f23c23d6..b0ba8a4450d 100644 --- a/src/EnergyPlus/AirflowNetworkBalanceManager.cc +++ b/src/EnergyPlus/AirflowNetworkBalanceManager.cc @@ -617,7 +617,8 @@ namespace AirflowNetworkBalanceManager { auto result = referenceConditions.find(fields.at("reference_crack_conditions")); if (result == referenceConditions.end()) { ShowSevereError(RoutineName + CurrentModuleObject + ": " + thisObjectName + - ". Cannot find reference crack conditions object \"" + fields.at("reference_crack_conditions").get() + "\"."); + ". Cannot find reference crack conditions object \"" + + fields.at("reference_crack_conditions").get() + "\"."); success = false; } else { refT = result->second.temperature; @@ -692,7 +693,8 @@ namespace AirflowNetworkBalanceManager { auto result = referenceConditions.find(fields.at("reference_crack_conditions")); if (result == referenceConditions.end()) { ShowSevereError(RoutineName + CurrentModuleObject + ": " + thisObjectName + - ". Cannot find reference crack conditions object \"" + fields.at("reference_crack_conditions").get() + "\"."); + ". Cannot find reference crack conditions object \"" + + fields.at("reference_crack_conditions").get() + "\"."); success = false; } else { refT = result->second.temperature; @@ -1641,8 +1643,9 @@ namespace AirflowNetworkBalanceManager { Real64 baseratio; // Formats - static ObjexxFCL::gio::Fmt Format_110("('! , No Multizone or Distribution/Multizone with Distribution/','Multizone " - "without Distribution/Multizone with Distribution only during Fan Operation')"); + static ObjexxFCL::gio::Fmt Format_110( + "('! , No Multizone or Distribution/Multizone with Distribution/','Multizone " + "without Distribution/Multizone with Distribution only during Fan Operation')"); static ObjexxFCL::gio::Fmt Format_120("('AirflowNetwork Model:Control,',A)"); // Set the maximum numbers of input fields @@ -1829,7 +1832,7 @@ namespace AirflowNetworkBalanceManager { // Check continuity of both curves at boundary point if (OccupantVentilationControl(i).ComfortLowTempCurveNum > 0 && OccupantVentilationControl(i).ComfortHighTempCurveNum) { if (std::abs(CurveValue(OccupantVentilationControl(i).ComfortLowTempCurveNum, Numbers(3)) - - CurveValue(OccupantVentilationControl(i).ComfortHighTempCurveNum, Numbers(3))) > 0.1) { + CurveValue(OccupantVentilationControl(i).ComfortHighTempCurveNum, Numbers(3))) > 0.1) { ShowSevereError(RoutineName + CurrentModuleObject + " object: The difference of both curve values at boundary point > 0.1"); ShowContinueError("Both curve names are = " + cAlphaFields(2) + " and " + cAlphaFields(3)); ShowContinueError("The input value of " + cNumericFields(3) + " = " + @@ -2841,8 +2844,9 @@ namespace AirflowNetworkBalanceManager { for (i = 1; i <= AirflowNetworkNumOfSurfaces; ++i) { if (MultizoneSurfaceData(i).NonRectangular) { if (found) { - ObjexxFCL::gio::write(OutputFileInits, fmtA) << "! , Name, Equivalent Height {m}, " - "Equivalent Width {m} AirflowNetwork Model:Equivalent Rectangle"; + ObjexxFCL::gio::write(OutputFileInits, fmtA) + << "! , Name, Equivalent Height {m}, " + "Equivalent Width {m} AirflowNetwork Model:Equivalent Rectangle"; found = false; } StringOut = "AirflowNetwork Model:Equivalent Rectangle Surface, " + MultizoneSurfaceData(i).SurfName; @@ -6902,7 +6906,7 @@ namespace AirflowNetworkBalanceManager { UThermal = pow(RThermTotal, -1); // Duct conduction, assuming effectiveness = 1 - exp(-NTU) - Real64 Ei = std::exp(-UThermal * DuctSurfArea / (DirSign * AirflowNetworkLinkSimu(i).FLOW * CpAir)); + Ei = General::epexp(-UThermal * DuctSurfArea / (DirSign * AirflowNetworkLinkSimu(i).FLOW * CpAir)); Real64 QCondDuct = std::abs(AirflowNetworkLinkSimu(i).FLOW) * CpAir * (Tamb - Tin) * (1 - Ei); TDuctSurf = Tamb - QCondDuct * RThermConvOut / DuctSurfArea; @@ -7019,18 +7023,18 @@ namespace AirflowNetworkBalanceManager { if (!LoopOnOffFlag(AirflowNetworkLinkageData(i).AirLoopNum) && AirflowNetworkLinkSimu(i).FLOW <= 0.0) { if (AirflowNetworkLinkSimu(i).FLOW2 > 0.0) { - Ei = std::exp(-UThermal * DuctSurfArea / (AirflowNetworkLinkSimu(i).FLOW2 * CpAir)); + Ei = General::epexp(-UThermal * DuctSurfArea / (AirflowNetworkLinkSimu(i).FLOW2 * CpAir)); } else { - Ei = 1.0; + Ei = 0.0; } MA((LT - 1) * AirflowNetworkNumOfNodes + LT) += std::abs(AirflowNetworkLinkSimu(i).FLOW2) * CpAir; MA((LT - 1) * AirflowNetworkNumOfNodes + LF) = -std::abs(AirflowNetworkLinkSimu(i).FLOW2) * CpAir * Ei; MV(LT) += std::abs(AirflowNetworkLinkSimu(i).FLOW2) * Tsurr * (1.0 - Ei) * CpAir; } else { if (AirflowNetworkLinkSimu(i).FLOW > 0.0) { - Ei = std::exp(-UThermal * DuctSurfArea / (DirSign * AirflowNetworkLinkSimu(i).FLOW * CpAir)); + Ei = General::epexp(-UThermal * DuctSurfArea / (DirSign * AirflowNetworkLinkSimu(i).FLOW * CpAir)); } else { - Ei = 1.0; + Ei = 0.0; } MA((LT - 1) * AirflowNetworkNumOfNodes + LT) += std::abs(AirflowNetworkLinkSimu(i).FLOW) * CpAir; MA((LT - 1) * AirflowNetworkNumOfNodes + LF) = -std::abs(AirflowNetworkLinkSimu(i).FLOW) * CpAir * Ei; @@ -7048,14 +7052,20 @@ namespace AirflowNetworkBalanceManager { LT = AirflowNetworkLinkageData(i).NodeNums[0]; DirSign = -1.0; } - Ei = std::exp(-0.001 * DisSysCompTermUnitData(TypeNum).L * DisSysCompTermUnitData(TypeNum).hydraulicDiameter * Pi / - (DirSign * AirflowNetworkLinkSimu(i).FLOW * CpAir)); - if (AirflowNetworkLinkSimu(i).FLOW == 0.0) Ei = 1.0; + if (AirflowNetworkLinkSimu(i).FLOW == 0.0) { + Ei = 0.0; + } else { + Ei = std::exp(-0.001 * DisSysCompTermUnitData(TypeNum).L * DisSysCompTermUnitData(TypeNum).hydraulicDiameter * Pi / + (DirSign * AirflowNetworkLinkSimu(i).FLOW * CpAir)); + } Tamb = AirflowNetworkNodeSimu(LT).TZ; if (!LoopOnOffFlag(AirflowNetworkLinkageData(i).AirLoopNum) && AirflowNetworkLinkSimu(i).FLOW <= 0.0) { - Ei = std::exp(-0.001 * DisSysCompTermUnitData(TypeNum).L * DisSysCompTermUnitData(TypeNum).hydraulicDiameter * Pi / - (AirflowNetworkLinkSimu(i).FLOW2 * CpAir)); - if (AirflowNetworkLinkSimu(i).FLOW2 == 0.0) Ei = 1.0; + if (AirflowNetworkLinkSimu(i).FLOW2 == 0.0) { + Ei = 0.0; + } else { + Ei = General::epexp(-0.001 * DisSysCompTermUnitData(TypeNum).L * DisSysCompTermUnitData(TypeNum).hydraulicDiameter * Pi / + (AirflowNetworkLinkSimu(i).FLOW2 * CpAir)); + } MA((LT - 1) * AirflowNetworkNumOfNodes + LT) += std::abs(AirflowNetworkLinkSimu(i).FLOW2) * CpAir; MA((LT - 1) * AirflowNetworkNumOfNodes + LF) = -std::abs(AirflowNetworkLinkSimu(i).FLOW2) * CpAir * Ei; MV(LT) += std::abs(AirflowNetworkLinkSimu(i).FLOW2) * Tamb * (1.0 - Ei) * CpAir; @@ -7341,10 +7351,10 @@ namespace AirflowNetworkBalanceManager { DirSign = -1.0; } if (AirflowNetworkLinkSimu(i).FLOW == 0.0) { - Ei = 1.0; + Ei = 0.0; } else { - Ei = std::exp(-DisSysCompDuctData(TypeNum).UMoisture * DisSysCompDuctData(TypeNum).L * - DisSysCompDuctData(TypeNum).hydraulicDiameter * Pi / (DirSign * AirflowNetworkLinkSimu(i).FLOW)); + Ei = General::epexp(-DisSysCompDuctData(TypeNum).UMoisture * DisSysCompDuctData(TypeNum).L * + DisSysCompDuctData(TypeNum).hydraulicDiameter * Pi / (DirSign * AirflowNetworkLinkSimu(i).FLOW)); } if (AirflowNetworkLinkageData(i).ZoneNum < 0) { Wamb = OutHumRat; @@ -7355,16 +7365,15 @@ namespace AirflowNetworkBalanceManager { } if (!LoopOnOffFlag(AirflowNetworkLinkageData(i).AirLoopNum) && AirflowNetworkLinkSimu(i).FLOW <= 0.0) { if (AirflowNetworkLinkSimu(i).FLOW2 == 0.0) { - Ei = 1.0; + Ei = 0.0; } else { - Ei = std::exp(-DisSysCompDuctData(TypeNum).UMoisture * DisSysCompDuctData(TypeNum).L * - DisSysCompDuctData(TypeNum).hydraulicDiameter * Pi / (AirflowNetworkLinkSimu(i).FLOW2)); + Ei = General::epexp(-DisSysCompDuctData(TypeNum).UMoisture * DisSysCompDuctData(TypeNum).L * + DisSysCompDuctData(TypeNum).hydraulicDiameter * Pi / (AirflowNetworkLinkSimu(i).FLOW2)); } MA((LT - 1) * AirflowNetworkNumOfNodes + LT) += std::abs(AirflowNetworkLinkSimu(i).FLOW2); MA((LT - 1) * AirflowNetworkNumOfNodes + LF) = -std::abs(AirflowNetworkLinkSimu(i).FLOW2) * Ei; MV(LT) += std::abs(AirflowNetworkLinkSimu(i).FLOW2) * Wamb * (1.0 - Ei); } else { - if (AirflowNetworkLinkSimu(i).FLOW == 0.0) Ei = 1.0; MA((LT - 1) * AirflowNetworkNumOfNodes + LT) += std::abs(AirflowNetworkLinkSimu(i).FLOW); MA((LT - 1) * AirflowNetworkNumOfNodes + LF) = -std::abs(AirflowNetworkLinkSimu(i).FLOW) * Ei; MV(LT) += std::abs(AirflowNetworkLinkSimu(i).FLOW) * Wamb * (1.0 - Ei); @@ -7381,14 +7390,20 @@ namespace AirflowNetworkBalanceManager { LT = AirflowNetworkLinkageData(i).NodeNums[0]; DirSign = -1.0; } - Ei = std::exp(-0.0001 * DisSysCompTermUnitData(TypeNum).L * DisSysCompTermUnitData(TypeNum).hydraulicDiameter * Pi / - (DirSign * AirflowNetworkLinkSimu(i).FLOW)); - if (AirflowNetworkLinkSimu(i).FLOW == 0.0) Ei = 1.0; + if (AirflowNetworkLinkSimu(i).FLOW == 0.0) { + Ei = 0.0; + } else { + Ei = General::epexp(-0.0001 * DisSysCompTermUnitData(TypeNum).L * DisSysCompTermUnitData(TypeNum).hydraulicDiameter * Pi / + (DirSign * AirflowNetworkLinkSimu(i).FLOW)); + } Wamb = AirflowNetworkNodeSimu(LT).WZ; if (!LoopOnOffFlag(AirflowNetworkLinkageData(i).AirLoopNum) && AirflowNetworkLinkSimu(i).FLOW <= 0.0) { - Ei = std::exp(-0.0001 * DisSysCompTermUnitData(TypeNum).L * DisSysCompTermUnitData(TypeNum).hydraulicDiameter * Pi / - (AirflowNetworkLinkSimu(i).FLOW2)); - if (AirflowNetworkLinkSimu(i).FLOW2 == 0.0) Ei = 1.0; + if (AirflowNetworkLinkSimu(i).FLOW2 == 0.0) { + Ei = 0.0; + } else { + Ei = General::epexp(-0.0001 * DisSysCompTermUnitData(TypeNum).L * DisSysCompTermUnitData(TypeNum).hydraulicDiameter * Pi / + (AirflowNetworkLinkSimu(i).FLOW2)); + } MA((LT - 1) * AirflowNetworkNumOfNodes + LT) += std::abs(AirflowNetworkLinkSimu(i).FLOW2); MA((LT - 1) * AirflowNetworkNumOfNodes + LF) = -std::abs(AirflowNetworkLinkSimu(i).FLOW2) * Ei; MV(LT) += std::abs(AirflowNetworkLinkSimu(i).FLOW2) * Wamb * (1.0 - Ei); @@ -7409,13 +7424,6 @@ namespace AirflowNetworkBalanceManager { LT = AirflowNetworkLinkageData(i).NodeNums[0]; DirSign = -1.0; } - // Ei = exp(-0.0001*DisSysCompCoilData(TypeNum)%L*DisSysCompCoilData(TypeNum)%D*pi/ & - // (DirSign*AirflowNetworkLinkSimu(I)%FLOW)) - // Wamb = AirflowNetworkNodeSimu(LT)%WZ - // MA((LT-1)*AirflowNetworkNumOfNodes+LT) = MA((LT-1)*AirflowNetworkNumOfNodes+LT)+ & - // ABS(AirflowNetworkLinkSimu(I)%FLOW) - // MA((LT-1)*AirflowNetworkNumOfNodes+LF) = -ABS(AirflowNetworkLinkSimu(I)%FLOW)*Ei - // MV(LT) = MV(LT)+ABS(AirflowNetworkLinkSimu(I)%FLOW)*Wamb*(1.0-Ei) } // Calculate temp in a constant pressure drop component if (CompTypeNum == CompTypeNum_CPD && CompName == BlankString) { // constant pressure element only @@ -8278,8 +8286,14 @@ namespace AirflowNetworkBalanceManager { ZN2 = AirflowNetworkNodeData(M).EPlusZoneNum; // Find a linkage from a zone to outdoors if (ZN1 > 0 && ZN2 == 0) { - Tamb = Zone(ZN1).OutDryBulbTemp; - CpAir = PsyCpAirFnWTdb(OutHumRat, Tamb); + if (Surface(MultizoneSurfaceData(i).SurfNum).HasLinkedOutAirNode) { + Tamb = Surface(MultizoneSurfaceData(i).SurfNum).OutDryBulbTemp; + CpAir = PsyCpAirFnWTdb( + Psychrometrics::PsyWFnTdbTwbPb(Tamb, Surface(MultizoneSurfaceData(i).SurfNum).OutWetBulbTemp, OutBaroPress), Tamb); + } else { + Tamb = Zone(ZN1).OutDryBulbTemp; + CpAir = PsyCpAirFnWTdb(OutHumRat, Tamb); + } if (Tamb > MAT(ZN1)) { AirflowNetworkReportData(ZN1).MultiZoneInfiSenGainW += (AirflowNetworkLinkSimu(i).FLOW2 * CpAir * (Tamb - MAT(ZN1))); AirflowNetworkReportData(ZN1).MultiZoneInfiSenGainJ += @@ -8300,8 +8314,14 @@ namespace AirflowNetworkBalanceManager { } } if (ZN1 == 0 && ZN2 > 0) { - Tamb = Zone(ZN2).OutDryBulbTemp; - CpAir = PsyCpAirFnWTdb(OutHumRat, Tamb); + if (Surface(MultizoneSurfaceData(i).SurfNum).HasLinkedOutAirNode) { + Tamb = Surface(MultizoneSurfaceData(i).SurfNum).OutDryBulbTemp; + CpAir = PsyCpAirFnWTdb( + Psychrometrics::PsyWFnTdbTwbPb(Tamb, Surface(MultizoneSurfaceData(i).SurfNum).OutWetBulbTemp, OutBaroPress), Tamb); + } else { + Tamb = Zone(ZN2).OutDryBulbTemp; + CpAir = PsyCpAirFnWTdb(OutHumRat, Tamb); + } if (Tamb > MAT(ZN2)) { AirflowNetworkReportData(ZN2).MultiZoneInfiSenGainW += (AirflowNetworkLinkSimu(i).FLOW * CpAir * (Tamb - MAT(ZN2))); AirflowNetworkReportData(ZN2).MultiZoneInfiSenGainJ += @@ -9099,9 +9119,9 @@ namespace AirflowNetworkBalanceManager { NodeMass = Node(AirflowNetworkNodeData(Node3).EPlusNodeNum).MassFlowRate; AFNMass = AirflowNetworkLinkSimu(i).FLOW; if (NodeMass > 0.0 && AFNMass > NodeMass + 0.01) { - ShowWarningError( - "The mass flow rate difference is found between System Node = '" + NodeID(AirflowNetworkNodeData(Node3).EPlusNodeNum) + - "' and AFN Link = '" + AirflowNetworkLinkageData(i).Name + "'."); + ShowWarningError("The mass flow rate difference is found between System Node = '" + + NodeID(AirflowNetworkNodeData(Node3).EPlusNodeNum) + "' and AFN Link = '" + + AirflowNetworkLinkageData(i).Name + "'."); ShowContinueError("The system node max mass flow rate = " + RoundSigDigits(NodeMass, 3) + " kg/s. The AFN node mass flow rate = " + RoundSigDigits(AFNMass, 3) + " kg.s."); WriteFlag = true; @@ -9826,7 +9846,8 @@ namespace AirflowNetworkBalanceManager { break; } else { if (OAMixerNum == GetNumOAMixers()) { - ShowSevereError(RoutineName + "'" + NodeID(i) + "' is not defined as an AirflowNetwork:Distribution:Node object."); + ShowSevereError(RoutineName + "'" + NodeID(i) + + "' is not defined as an AirflowNetwork:Distribution:Node object."); ErrorsFound = true; } } @@ -10211,6 +10232,7 @@ namespace AirflowNetworkBalanceManager { } } + for (i = NumOfNodesMultiZone + 1; i <= AirflowNetworkNumOfNodes; ++i) { if (AirflowNetworkNodeData(i).EPlusTypeNum == EPlusTypeNum_SPL) { LocalError = false; @@ -10229,6 +10251,7 @@ namespace AirflowNetworkBalanceManager { for (j = 1; j <= SplitterNodeNumbers(2); ++j) { if (AirflowNetworkNodeData(i).EPlusNodeNum == SplitterNodeNumbers(j + 2)) { if (AirflowNetworkNodeData(i).EPlusTypeNum == 0) AirflowNetworkNodeData(i).EPlusTypeNum = EPlusTypeNum_SPO; + } } } diff --git a/src/EnergyPlus/ChillerElectricEIR.cc b/src/EnergyPlus/ChillerElectricEIR.cc index a606f6b3a56..3ab3fbfddf2 100644 --- a/src/EnergyPlus/ChillerElectricEIR.cc +++ b/src/EnergyPlus/ChillerElectricEIR.cc @@ -1839,6 +1839,7 @@ namespace ChillerElectricEIR { if (PlantFinalSizesOkayToReport) { if (ChillerIPLVFlagArr(EIRChillNum)) { + Real64 IPLV; CalcChillerIPLV(ElectricEIRChiller(EIRChillNum).Name, TypeOf_Chiller_ElectricEIR, ElectricEIRChiller(EIRChillNum).RefCap, @@ -1847,7 +1848,8 @@ namespace ChillerElectricEIR { ElectricEIRChiller(EIRChillNum).ChillerCapFT, ElectricEIRChiller(EIRChillNum).ChillerEIRFT, ElectricEIRChiller(EIRChillNum).ChillerEIRFPLR, - ElectricEIRChiller(EIRChillNum).MinUnloadRat); + ElectricEIRChiller(EIRChillNum).MinUnloadRat, + IPLV); ChillerIPLVFlagArr(EIRChillNum) = false; } // create predefined report diff --git a/src/EnergyPlus/ChillerReformulatedEIR.cc b/src/EnergyPlus/ChillerReformulatedEIR.cc index e19688f345f..4f268a3860c 100644 --- a/src/EnergyPlus/ChillerReformulatedEIR.cc +++ b/src/EnergyPlus/ChillerReformulatedEIR.cc @@ -1567,6 +1567,7 @@ namespace ChillerReformulatedEIR { if (PlantFinalSizesOkayToReport) { if (MyFlag(EIRChillNum)) { + Real64 IPLV; CalcChillerIPLV(ElecReformEIRChiller(EIRChillNum).Name, TypeOf_Chiller_ElectricReformEIR, ElecReformEIRChiller(EIRChillNum).RefCap, @@ -1576,6 +1577,7 @@ namespace ChillerReformulatedEIR { ElecReformEIRChiller(EIRChillNum).ChillerEIRFT, ElecReformEIRChiller(EIRChillNum).ChillerEIRFPLR, ElecReformEIRChiller(EIRChillNum).MinUnloadRat, + IPLV, ElecReformEIRChiller(EIRChillNum).EvapVolFlowRate, ElecReformEIRChiller(EIRChillNum).CDLoopNum, ElecReformEIRChiller(EIRChillNum).CompPowerToCondenserFrac); diff --git a/src/EnergyPlus/ConvectionCoefficients.cc b/src/EnergyPlus/ConvectionCoefficients.cc index 806e2d2d269..f167640691e 100644 --- a/src/EnergyPlus/ConvectionCoefficients.cc +++ b/src/EnergyPlus/ConvectionCoefficients.cc @@ -833,7 +833,7 @@ namespace ConvectionCoefficients { if (std::abs(CosTilt) < 0.98) { // Surface is not horizontal Diff = std::abs(WindDirection - Azimuth); if ((Diff - 180.0) > 0.001) Diff -= 360.0; - if ((std::abs(Diff) - 100.0) > 0.001) AgainstWind = false; // Surface is leeward + if ((std::abs(Diff) - 90.0) > 0.001) AgainstWind = false; // Surface is leeward } return AgainstWind; @@ -8038,32 +8038,20 @@ namespace ConvectionCoefficients { bool const isWindow) { - // FUNCTION INFORMATION: - // AUTHOR Brent Griffith - // DATE WRITTEN Aug 2010 - // MODIFIED na - // RE-ENGINEERED na - - // PURPOSE OF THIS FUNCTION: - // Calculate the model equation by Fisher and Pedersen for floors with ceiling diffusers - - // METHODOLOGY EMPLOYED: - - // REFERENCES: - // Fisher, D.E. and C.O. Pedersen, Convective Heat Transfer in Building Energy and - // Thermal Load Calculations, ASHRAE Transactions, vol. 103, Pt. 2, 1997, p.13 - - if (ACH > 3.0) { - return 3.873 + 0.082 * std::pow(ACH, 0.98); + // AUTHOR: Brent Griffith (Aug 2010) + // PURPOSE OF THIS FUNCTION: Calculate the model equation by Fisher and Pedersen for floors with ceiling diffusers + // REFERENCE: Fisher, D.E. and C.O. Pedersen, Convective Heat Transfer in Building Energy and Thermal Load Calculations, + // ASHRAE Transactions, vol. 103, Pt. 2, 1997, p.13 + + Real64 Hforced; + + Hforced = 3.873 + 0.082 * std::pow(ACH, 0.98); + + if (ACH > 1.0) { + return Hforced; } - else { - if (isWindow) { // Unlikely for a floor, but okay... - Real64 const tilt = acos(cosTilt); // outward facing tilt - Real64 const sinTilt = sin(tilt); - return CalcISO15099WindowIntConvCoeff(Tsurf, Tair, humRat, height, tilt, sinTilt); - } else { - return CalcASHRAETARPNatural(Tsurf, Tair, -cosTilt); // negative cosTilt because interior of surface - } + else { // Revert to purely natural convection + return CalcFisherPedersenCeilDiffuserNatConv(Hforced,ACH,Tsurf,Tair,cosTilt,humRat,height,isWindow); } } @@ -8076,32 +8064,20 @@ namespace ConvectionCoefficients { bool const isWindow) { - // FUNCTION INFORMATION: - // AUTHOR Brent Griffith - // DATE WRITTEN Aug 2010 - // MODIFIED na - // RE-ENGINEERED na - - // PURPOSE OF THIS FUNCTION: - // Calculate the model equation by Fisher and Pedersen for ceilings with ceiling diffusers - - // METHODOLOGY EMPLOYED: - - // REFERENCES: - // Fisher, D.E. and C.O. Pedersen, Convective Heat Transfer in Building Energy and - // Thermal Load Calculations, ASHRAE Transactions, vol. 103, Pt. 2, 1997, p.13 - - if (ACH > 3.0) { - return 2.234 + 4.099 * std::pow(ACH, 0.503); + // AUTHOR: Brent Griffith (Aug 2010) + // PURPOSE OF THIS FUNCTION: Calculate the model equation by Fisher and Pedersen for floors with ceiling diffusers + // REFERENCE: Fisher, D.E. and C.O. Pedersen, Convective Heat Transfer in Building Energy and Thermal Load Calculations, + // ASHRAE Transactions, vol. 103, Pt. 2, 1997, p.13 + + Real64 Hforced; + + Hforced = 2.234 + 4.099 * std::pow(ACH, 0.503); + + if (ACH > 1.0) { + return Hforced; } - else { - if (isWindow) { // Unlikely for a floor, but okay... - Real64 const tilt = acos(cosTilt); // outward facing tilt - Real64 const sinTilt = sin(tilt); - return CalcISO15099WindowIntConvCoeff(Tsurf, Tair, humRat, height, tilt, sinTilt); - } else { - return CalcASHRAETARPNatural(Tsurf, Tair, -cosTilt); // negative cosTilt because interior of surface - } + else { // Revert to purely natural convection + return CalcFisherPedersenCeilDiffuserNatConv(Hforced,ACH,Tsurf,Tair,cosTilt,humRat,height,isWindow); } } @@ -8114,35 +8090,50 @@ namespace ConvectionCoefficients { bool const isWindow) { - // FUNCTION INFORMATION: - // AUTHOR Brent Griffith - // DATE WRITTEN Aug 2010 - // MODIFIED na - // RE-ENGINEERED na - - // PURPOSE OF THIS FUNCTION: - // Calculate the model equation by Fisher and Pedersen for walls with ceiling diffusers - - // METHODOLOGY EMPLOYED: - - // REFERENCES: - // Fisher, D.E. and C.O. Pedersen, Convective Heat Transfer in Building Energy and - // Thermal Load Calculations, ASHRAE Transactions, vol. 103, Pt. 2, 1997, p.13 - - if (ACH > 3.0) { - return 1.208 + 1.012 * std::pow(ACH, 0.604); + // AUTHOR: Brent Griffith (Aug 2010) + // PURPOSE OF THIS FUNCTION: Calculate the model equation by Fisher and Pedersen for floors with ceiling diffusers + // REFERENCE: Fisher, D.E. and C.O. Pedersen, Convective Heat Transfer in Building Energy and Thermal Load Calculations, + // ASHRAE Transactions, vol. 103, Pt. 2, 1997, p.13 + + Real64 Hforced; + + Hforced = 1.208 + 1.012 * std::pow(ACH, 0.604); + + if (ACH > 1.0) { + return Hforced; } else { // Revert to purely natural convection - if (isWindow) { // Unlikely for a floor, but okay... - Real64 const tilt = acos(cosTilt); // outward facing tilt - Real64 const sinTilt = sin(tilt); - return CalcISO15099WindowIntConvCoeff(Tsurf, Tair, humRat, height, tilt, sinTilt); - } else { - return CalcASHRAETARPNatural(Tsurf, Tair, -cosTilt); // negative cosTilt because interior of surface - } + return CalcFisherPedersenCeilDiffuserNatConv(Hforced,ACH,Tsurf,Tair,cosTilt,humRat,height,isWindow); } } + Real64 CalcFisherPedersenCeilDiffuserNatConv(Real64 const Hforced, + Real64 const ACH, + Real64 const Tsurf, + Real64 const Tair, + Real64 const cosTilt, + Real64 const humRat, + Real64 const height, + bool const isWindow) + { + + Real64 Hnatural; + + if (isWindow) { // Unlikely for a floor, but okay... + Real64 const tilt = acos(cosTilt); // outward facing tilt + Real64 const sinTilt = sin(tilt); + Hnatural = CalcISO15099WindowIntConvCoeff(Tsurf, Tair, humRat, height, tilt, sinTilt); + } else { + Hnatural = CalcASHRAETARPNatural(Tsurf, Tair, -cosTilt); // negative cosTilt because interior of surface + } + if (ACH <= 0.5) { + return Hnatural; + } else { + return Hnatural + ((Hforced-Hnatural)*((ACH-0.5)/0.5)); + } + + } + Real64 CalcAlamdariHammondUnstableHorizontal(Real64 const DeltaTemp, // [C] temperature difference between surface and air Real64 const HydraulicDiameter // [m] characteristic size, = (4 * area) / perimeter ) diff --git a/src/EnergyPlus/ConvectionCoefficients.hh b/src/EnergyPlus/ConvectionCoefficients.hh index ddbc3cc8c88..ac1e5150f74 100644 --- a/src/EnergyPlus/ConvectionCoefficients.hh +++ b/src/EnergyPlus/ConvectionCoefficients.hh @@ -618,6 +618,15 @@ namespace ConvectionCoefficients { Real64 const height, bool const isWindow=false); + Real64 CalcFisherPedersenCeilDiffuserNatConv(Real64 const Hforced, + Real64 const ACH, + Real64 const Tsurf, + Real64 const Tair, + Real64 const cosTilt, + Real64 const humRat, + Real64 const height, + bool const isWindow); + Real64 CalcAlamdariHammondUnstableHorizontal(Real64 const DeltaTemp, // [C] temperature difference between surface and air Real64 const HydraulicDiameter // [m] characteristic size, = (4 * area) / perimeter ); diff --git a/src/EnergyPlus/DXCoils.cc b/src/EnergyPlus/DXCoils.cc index e1e3e7fec6c..2ab42c450df 100644 --- a/src/EnergyPlus/DXCoils.cc +++ b/src/EnergyPlus/DXCoils.cc @@ -7082,12 +7082,12 @@ namespace DXCoils { SizingString = DXCoilNumericFields(DXCoilNum).PerfMode(Mode).FieldNames(FieldNum) + " [m3/s]"; } else { CompName = DXCoil(DXCoilNum).Name; - FieldNum = 11; + FieldNum = 12; // (High Speed) Evaporative Condenser Air Flow Rate SizingString = DXCoilNumericFields(DXCoilNum).PerfMode(Mode).FieldNames(FieldNum) + " [m3/s]"; } SizingMethod = AutoCalculateSizing; CompType = DXCoil(DXCoilNum).DXCoilType; - // // Auto size condenser air flow to Total Capacity * 0.000114 m3/s/w (850 cfm/ton) + // Auto size condenser air flow to Total Capacity * 0.000114 m3/s/w (850 cfm/ton) DataConstantUsedForSizing = DXCoil(DXCoilNum).RatedTotCap(Mode); DataFractionUsedForSizing = 0.000114; TempSize = DXCoil(DXCoilNum).EvapCondAirFlow(Mode); @@ -7140,7 +7140,7 @@ namespace DXCoils { if (DXCoil(DXCoilNum).CondenserType(1) == EvapCooled && DXCoil(DXCoilNum).EvapCondAirFlow2 != 0.0 && DXCoil(DXCoilNum).DXCoilType_Num == CoilDX_CoolingTwoSpeed) { CompName = DXCoil(DXCoilNum).Name; - FieldNum = 14; + FieldNum = 15; // Low Speed Evaporative Condenser Air Flow Rate SizingString = DXCoilNumericFields(DXCoilNum).PerfMode(Mode).FieldNames(FieldNum) + " [m3/s]"; SizingMethod = AutoCalculateSizing; CompType = DXCoil(DXCoilNum).DXCoilType; @@ -7161,11 +7161,11 @@ namespace DXCoils { if (DXCoil(DXCoilNum).DXCoilType_Num == CoilDX_CoolingTwoStageWHumControl) { CompName = DXCoil(DXCoilNum).Name + ":" + DXCoil(DXCoilNum).CoilPerformanceName(Mode); - FieldNum = 12; + FieldNum = 12; // Evaporative Condenser Pump Rated Power Consumption SizingString = DXCoilNumericFields(DXCoilNum).PerfMode(Mode).FieldNames(FieldNum) + " [W]"; } else { CompName = DXCoil(DXCoilNum).Name; - FieldNum = 12; + FieldNum = 13; // (High Speed) Evaporative Condenser Pump Rated Power Consumption SizingString = DXCoilNumericFields(DXCoilNum).PerfMode(Mode).FieldNames(FieldNum) + " [W]"; } SizingMethod = AutoCalculateSizing; @@ -7184,7 +7184,7 @@ namespace DXCoils { if (DXCoil(DXCoilNum).CondenserType(1) == EvapCooled && DXCoil(DXCoilNum).EvapCondPumpElecNomPower2 != 0.0 && DXCoil(DXCoilNum).DXCoilType_Num == CoilDX_CoolingTwoSpeed) { CompName = DXCoil(DXCoilNum).Name; - FieldNum = 15; + FieldNum = 16; // Low Speed Evaporative Condenser Pump Rated Power Consumption SizingString = DXCoilNumericFields(DXCoilNum).PerfMode(Mode).FieldNames(FieldNum) + " [W]"; SizingMethod = AutoCalculateSizing; CompType = DXCoil(DXCoilNum).DXCoilType; @@ -9663,7 +9663,7 @@ namespace DXCoils { Real64 OutdoorPressure; // Outdoor barometric pressure at condenser (Pa) static Real64 CurrentEndTime(0.0); // end time of time step for current simulation time step - static Real64 MinAirHumRat(0.0); // minimum of the inlet air humidity ratio and the outlet air humidity ratio + //static Real64 MinAirHumRat(0.0); // minimum of the inlet air humidity ratio and the outlet air humidity ratio int Mode; // Performance mode for Multimode DX coil; Always 1 for other coil types Real64 OutletAirTemp; // Supply air temperature (average value if constant fan, full output if cycling fan) Real64 OutletAirHumRat; // Supply air humidity ratio (average value if constant fan, full output if cycling fan) @@ -10153,9 +10153,9 @@ namespace DXCoils { //! Calculation for heat reclaim needs to be corrected to use compressor power (not including condenser fan power) // HeatReclaimDXCoil(DXCoilNum)%AvailCapacity = DXCoil(DXCoilNum)%TotalCoolingEnergyRate + DXCoil(DXCoilNum)%ElecCoolingPower - MinAirHumRat = min(InletAirHumRat, OutletAirHumRat); DXCoil(DXCoilNum).SensCoolingEnergyRate = - AirMassFlow * (PsyHFnTdbW(InletAirDryBulbTemp, MinAirHumRat) - PsyHFnTdbW(OutletAirTemp, MinAirHumRat)); + AirMassFlow * PsyDeltaHSenFnTdb2W2Tdb1W1(InletAirDryBulbTemp, InletAirHumRat, OutletAirTemp, OutletAirHumRat); // sensible {W}; + // Don't let sensible capacity be greater than total capacity if (DXCoil(DXCoilNum).SensCoolingEnergyRate > DXCoil(DXCoilNum).TotalCoolingEnergyRate) { DXCoil(DXCoilNum).SensCoolingEnergyRate = DXCoil(DXCoilNum).TotalCoolingEnergyRate; @@ -15797,15 +15797,10 @@ namespace DXCoils { Real64 InletAirDryBulbTemp; // inlet air dry bulb temperature [C] Real64 InletAirEnthalpy; // inlet air enthalpy [J/kg] Real64 InletAirHumRat; // inlet air humidity ratio [kg/kg] - Real64 InletAirHumRatTemp; // inlet air humidity ratio used in ADP/BF loop [kg/kg] // Eventually inlet air conditions will be used in DX Coil, these lines are commented out and marked with this comment line Real64 RatedCBF; // coil bypass factor at rated conditions - Real64 SHR; // Sensible Heat Ratio (sensible/total) of the cooling coil Real64 CBF; // coil bypass factor at off rated conditions Real64 A0; // NTU * air mass flow rate, used in CBF calculation - Real64 hDelta; // Change in air enthalpy across the cooling coil [J/kg] - Real64 hADP; // Apparatus dew point enthalpy [J/kg] - Real64 hTinwADP; // Enthalpy at inlet dry-bulb and wADP [J/kg] Real64 PLF; // Part load factor, accounts for thermal lag at compressor startup, used in power calculation Real64 CondInletTemp; // Condenser inlet temperature (C). Outdoor dry-bulb temp for air-cooled condenser. // Outdoor Wetbulb +(1 - effectiveness)*(outdoor drybulb - outdoor wetbulb) for evap condenser. @@ -15822,11 +15817,8 @@ namespace DXCoils { Real64 OutdoorWetBulb; // Outdoor wet-bulb temperature at condenser (C) Real64 OutdoorHumRat; // Outdoor humidity ratio at condenser (kg/kg) Real64 OutdoorPressure; // Outdoor barometric pressure at condenser (Pa) - Real64 tADP; // Apparatus dew point temperature [C] - Real64 wADP; // Apparatus dew point humidity ratio [kg/kg] static Real64 CurrentEndTime(0.0); // end time of time step for current simulation time step - static Real64 MinAirHumRat(0.0); // minimum of the inlet air humidity ratio and the outlet air humidity ratio int Mode; // Performance mode for Multimode DX coil; Always 1 for other coil types Real64 OutletAirTemp; // Supply air temperature (average value if constant fan, full output if cycling fan) Real64 OutletAirHumRat; // Supply air humidity ratio (average value if constant fan, full output if cycling fan) @@ -16060,23 +16052,26 @@ namespace DXCoils { // Get total capacity modifying factor (function of temperature) for off-rated conditions // InletAirHumRat may be modified in this ADP/BF loop, use temporary varible for calculations - InletAirHumRatTemp = InletAirHumRat; - // Calculate apparatus dew point conditions using TotCap and CBF - hDelta = TotCap / AirMassFlow; - // there is an issue here with using CBF to calculate the ADP enthalpy. - // at low loads the bypass factor increases significantly. - hADP = InletAirEnthalpy - hDelta / (1.0 - CBF); - tADP = PsyTsatFnHPb(hADP, OutdoorPressure, RoutineName); - // Eventually inlet air conditions will be used in DX Coil, these lines are commented out and marked with this comment line - // tADP = PsyTsatFnHPb(hADP,InletAirPressure) - wADP = min(InletAirHumRat, PsyWFnTdbH(tADP, hADP, RoutineName)); - hTinwADP = PsyHFnTdbW(InletAirDryBulbTemp, wADP); - if ((InletAirEnthalpy - hADP) > 1.e-10) { - SHR = min((hTinwADP - hADP) / (InletAirEnthalpy - hADP), 1.0); - } else { - SHR = 1.0; - } + // commented, not used issue #6950 + //InletAirHumRatTemp = InletAirHumRat; + + //// Calculate apparatus dew point conditions using TotCap and CBF + //hDelta = TotCap / AirMassFlow; + //// there is an issue here with using CBF to calculate the ADP enthalpy. + //// at low loads the bypass factor increases significantly. + //hADP = InletAirEnthalpy - hDelta / (1.0 - CBF); + //tADP = PsyTsatFnHPb(hADP, OutdoorPressure, RoutineName); + //// Eventually inlet air conditions will be used in DX Coil, these lines are commented out and marked with this comment line + //// tADP = PsyTsatFnHPb(hADP,InletAirPressure) + //wADP = min(InletAirHumRat, PsyWFnTdbH(tADP, hADP, RoutineName)); + //hTinwADP = PsyHFnTdbW(InletAirDryBulbTemp, wADP); + //if ((InletAirEnthalpy - hADP) > 1.e-10) { + // SHR = min((hTinwADP - hADP) / (InletAirEnthalpy - hADP), 1.0); + //} else { + // SHR = 1.0; + //} + // commented, not used issue #6950 ends here if (DXCoil(DXCoilNum).PLFFPLR(Mode) > 0 && CompCycRatio < 1.0) { PLF = CurveValue(DXCoil(DXCoilNum).PLFFPLR(Mode), CompCycRatio); // Calculate part-load factor @@ -16147,11 +16142,13 @@ namespace DXCoils { } // Coil total cooling - DXCoil(DXCoilNum).TotalCoolingEnergyRate = AirMassFlow * (InletAirEnthalpy - OutletAirEnthalpy); + Real64 AirMassFlowRate = DXCoil(DXCoilNum).InletAirMassFlowRate; + DXCoil(DXCoilNum).TotalCoolingEnergyRate = AirMassFlowRate * (InletAirEnthalpy - OutletAirEnthalpy); // Coil sensible cooling - MinAirHumRat = min(InletAirHumRat, OutletAirHumRat); - DXCoil(DXCoilNum).SensCoolingEnergyRate = AirMassFlow * 1005.0 * (InletAirDryBulbTemp - OutletAirTemp); + DXCoil(DXCoilNum).SensCoolingEnergyRate = + AirMassFlowRate * PsyDeltaHSenFnTdb2W2Tdb1W1(InletAirDryBulbTemp, InletAirHumRat, OutletAirTemp, OutletAirHumRat); // sensible {W}; + // Don't let sensible capacity be greater than total capacity if (DXCoil(DXCoilNum).SensCoolingEnergyRate > DXCoil(DXCoilNum).TotalCoolingEnergyRate) { DXCoil(DXCoilNum).SensCoolingEnergyRate = DXCoil(DXCoilNum).TotalCoolingEnergyRate; @@ -16576,6 +16573,7 @@ namespace DXCoils { MaxSH = 15; MaxSC = 20; Garate = DXCoil(CoilIndex).RatedAirMassFlowRate(1); + // why always limit the minimum fan speed ratio to 0.65? FanSpdRatioMin = min(max(OAMassFlow / Garate, 0.65), 1.0); // ensure that coil flow rate is higher than OA flow rate if (QCoil == 0) { diff --git a/src/EnergyPlus/DataAirLoop.hh b/src/EnergyPlus/DataAirLoop.hh index 1fffbce8d48..c19be04f84d 100644 --- a/src/EnergyPlus/DataAirLoop.hh +++ b/src/EnergyPlus/DataAirLoop.hh @@ -239,7 +239,7 @@ namespace DataAirLoop { AirLoopFlowData() : DesSupply(0.0), DesReturnFrac(1.0), SysToZoneDesFlowRatio(0.0), ReqSupplyFrac(1.0), MinOutAir(0.0), MaxOutAir(0.0), OAMinFrac(0.0), Previous(0.0), SupFlow(0.0), ZoneRetFlow(0.0), ZoneRetFlowRatio(1.0), SysRetFlow(0.0), RecircFlow(0.0), LeakFlow(0.0), - ExcessZoneExhFlow(0.0), FanPLR(0.0), OAFrac(0.0), OAFlow(0.0), FlowError(false), BypassMassFlow(0.0) + ExcessZoneExhFlow(0.0), FanPLR(1.0), OAFrac(0.0), OAFlow(0.0), FlowError(false), BypassMassFlow(0.0) { } }; diff --git a/src/EnergyPlus/DataWindowEquivalentLayer.hh b/src/EnergyPlus/DataWindowEquivalentLayer.hh index 4af9d9905a6..b99eca4861d 100644 --- a/src/EnergyPlus/DataWindowEquivalentLayer.hh +++ b/src/EnergyPlus/DataWindowEquivalentLayer.hh @@ -232,15 +232,16 @@ namespace DataWindowEquivalentLayer { struct CFSTY { // Members - std::string Name; // ID (Fenestration Name) - int NL; // number of layers - Array1D L; // layer array, L(1) is outside layer - Array1D G; // gap array, G(1) is outside-most, betw L(1) and L(2) - bool ISControlled; // CFS is not controlled, or has no controlled VB layer - int VBLayerPtr; // Venetian blind layer pointer + std::string Name; // ID (Fenestration Name) + int NL; // number of layers + Array1D L; // layer array, L(1) is outside layer + Array1D G; // gap array, G(1) is outside-most, betw L(1) and L(2) + bool ISControlled; // CFS is not controlled, or has no controlled VB layer + int VBLayerPtr; // Venetian blind layer pointer + int WEQLSolverErrorIndex; // recurring error index // Default Constructor - CFSTY() : NL(0), L(CFSMAXNL), G(CFSMAXNL - 1), ISControlled(false), VBLayerPtr(0) + CFSTY() : NL(0), L(CFSMAXNL), G(CFSMAXNL - 1), ISControlled(false), VBLayerPtr(0), WEQLSolverErrorIndex(0) { } }; diff --git a/src/EnergyPlus/EvaporativeCoolers.cc b/src/EnergyPlus/EvaporativeCoolers.cc index 9b043b35e67..3c236cae747 100644 --- a/src/EnergyPlus/EvaporativeCoolers.cc +++ b/src/EnergyPlus/EvaporativeCoolers.cc @@ -257,10 +257,10 @@ namespace EvaporativeCoolers { CalcWetIndirectEvapCooler(EvapCoolNum, ZoneEvapCoolerPLR); } else if (SELECT_CASE_var == iEvapCoolerInDirectRDDSpecial) { CalcResearchSpecialPartLoad(EvapCoolNum); - CalcIndirectResearchSpecialEvapCooler(EvapCoolNum); + CalcIndirectResearchSpecialEvapCooler(EvapCoolNum, ZoneEvapCoolerPLR); } else if (SELECT_CASE_var == iEvapCoolerDirectResearchSpecial) { CalcResearchSpecialPartLoad(EvapCoolNum); - CalcDirectResearchSpecialEvapCooler(EvapCoolNum); + CalcDirectResearchSpecialEvapCooler(EvapCoolNum, ZoneEvapCoolerPLR); } } // Update the current Evap Cooler to the outlet nodes @@ -2196,7 +2196,7 @@ namespace EvaporativeCoolers { EvapCond(EvapCoolNum).PartLoadFract = PartLoadFrac; } - void CalcIndirectResearchSpecialEvapCooler(int const EvapCoolNum) + void CalcIndirectResearchSpecialEvapCooler(int const EvapCoolNum, Real64 const FanPLR) { // SUBROUTINE INFORMATION: @@ -2379,12 +2379,12 @@ namespace EvaporativeCoolers { //*************************************************************************** // POWER OF THE SECONDARY AIR FAN with part load factor applied (assumes const efficiency) EvapCond(EvapCoolNum).EvapCoolerPower += - EvapCond(EvapCoolNum).IndirectVolFlowRate * EvapCond(EvapCoolNum).FanSizingSpecificPower * PartLoad; + EvapCond(EvapCoolNum).IndirectVolFlowRate * EvapCond(EvapCoolNum).FanSizingSpecificPower * PartLoad * FanPLR; // ENERGY CONSUMED BY THE RECIRCULATING PUMP // ENERGY CONSUMED BY THE RECIRCULATING PUMP // Add the pump energy to the total Evap Cooler energy comsumption - EvapCond(EvapCoolNum).EvapCoolerPower += EvapCond(EvapCoolNum).IndirectRecircPumpPower * PartLoad; + EvapCond(EvapCoolNum).EvapCoolerPower += EvapCond(EvapCoolNum).IndirectRecircPumpPower * PartLoad * FanPLR; //*************************************************************************** // CALCULATE THE WET BULB TEMP in the primary system air using PSYCH ROUTINES @@ -3222,7 +3222,7 @@ namespace EvaporativeCoolers { if (EvapCond(EvapCoolIndex).FanPowerModifierCurveIndex > 0) { FanPowerModCurveValue = CurveValue(EvapCond(EvapCoolIndex).FanPowerModifierCurveIndex, FlowRatio); } else { - FanPowerModCurveValue = EvapCond(EvapCoolIndex).PartLoadFract; + FanPowerModCurveValue = EvapCond(EvapCoolIndex).PartLoadFract * FlowRatio; } EvapCoolertotalPower += EvapCond(EvapCoolIndex).IndirectFanPower * FanPowerModCurveValue; if (DryWetMode == WetModulated || DryWetMode == WetFull) { @@ -3231,7 +3231,7 @@ namespace EvaporativeCoolers { PumpPowerModCurveValue = CurveValue(EvapCond(EvapCoolIndex).PumpPowerModifierCurveIndex, FlowRatio); } else { // linearly scale pump power using part-load-fraction when pump power modifier curve is not specified - PumpPowerModCurveValue = EvapCond(EvapCoolIndex).PartLoadFract; + PumpPowerModCurveValue = EvapCond(EvapCoolIndex).PartLoadFract * FlowRatio; } EvapCoolertotalPower += EvapCond(EvapCoolIndex).IndirectRecircPumpPower * PumpPowerModCurveValue; } @@ -3241,7 +3241,7 @@ namespace EvaporativeCoolers { return EvapCoolertotalPower; } - void CalcDirectResearchSpecialEvapCooler(int const EvapCoolNum) + void CalcDirectResearchSpecialEvapCooler(int const EvapCoolNum, Real64 const FanPLR) { // SUBROUTINE INFORMATION: @@ -3367,8 +3367,8 @@ namespace EvaporativeCoolers { if (EvapCond(EvapCoolNum).PumpPowerModifierCurveIndex > 0) { PumpPowerModCurveValue = CurveValue(EvapCond(EvapCoolNum).PumpPowerModifierCurveIndex, FlowRatio); } else { - // if no pump power modifier curve specified, then assume linear variation with part-load - PumpPowerModCurveValue = PartLoad; + // if no pump power modifier curve specified, then assume linear variation with part-load and primary fan PLR + PumpPowerModCurveValue = PartLoad * FanPLR; } EvapCond(EvapCoolNum).EvapCoolerPower = EvapCond(EvapCoolNum).RecircPumpPower * PumpPowerModCurveValue; //****************** diff --git a/src/EnergyPlus/EvaporativeCoolers.hh b/src/EnergyPlus/EvaporativeCoolers.hh index df326563b8b..55fd2a9666c 100644 --- a/src/EnergyPlus/EvaporativeCoolers.hh +++ b/src/EnergyPlus/EvaporativeCoolers.hh @@ -401,9 +401,9 @@ namespace EvaporativeCoolers { Real64 const FlowRatio // secondary air flow fraction ); - void CalcIndirectResearchSpecialEvapCooler(int const EvapCoolNum); + void CalcIndirectResearchSpecialEvapCooler(int const EvapCoolNum, Real64 const FanPLR = 1.0); - void CalcDirectResearchSpecialEvapCooler(int const EvapCoolNum); + void CalcDirectResearchSpecialEvapCooler(int const EvapCoolNum, Real64 const FanPLR = 1.0); // End Algorithm Section of the Module // ***************************************************************************** diff --git a/src/EnergyPlus/FanCoilUnits.cc b/src/EnergyPlus/FanCoilUnits.cc index 6effd67830d..c8c374b2364 100644 --- a/src/EnergyPlus/FanCoilUnits.cc +++ b/src/EnergyPlus/FanCoilUnits.cc @@ -3594,8 +3594,7 @@ namespace FanCoilUnits { ZoneCompTurnFansOn, ZoneCompTurnFansOff); } else { - HVACFan::fanObjs[FanCoil(FanCoilNum).FanIndex]->simulate( - FanCoil(FanCoilNum).LowSpeedRatio, ZoneCompTurnFansOn, ZoneCompTurnFansOff, _); + HVACFan::fanObjs[FanCoil(FanCoilNum).FanIndex]->simulate(_, ZoneCompTurnFansOn, ZoneCompTurnFansOff, _); } } else if (FanCoil(FanCoilNum).SpeedFanSel == 2) { @@ -3607,15 +3606,22 @@ namespace FanCoilUnits { ZoneCompTurnFansOn, ZoneCompTurnFansOff); } else { - HVACFan::fanObjs[FanCoil(FanCoilNum).FanIndex]->simulate( - FanCoil(FanCoilNum).MedSpeedRatio, ZoneCompTurnFansOn, ZoneCompTurnFansOff, _); + HVACFan::fanObjs[FanCoil(FanCoilNum).FanIndex]->simulate(_, ZoneCompTurnFansOn, ZoneCompTurnFansOff, _); } - } else { // using 1.0 here for fan speed ratio seems wrong if FCU max flow rate is different than the fan maximum flow rate + } else if (FanCoil(FanCoilNum).SpeedFanSel == 3) { + if (FanCoil(FanCoilNum).FanType_Num != DataHVACGlobals::FanType_SystemModelObject) { Fans::SimulateFanComponents( FanCoil(FanCoilNum).FanName, FirstHVACIteration, FanCoil(FanCoilNum).FanIndex, 1.0, ZoneCompTurnFansOn, ZoneCompTurnFansOff); } else { - HVACFan::fanObjs[FanCoil(FanCoilNum).FanIndex]->simulate(1.0, ZoneCompTurnFansOn, ZoneCompTurnFansOff, _); + HVACFan::fanObjs[FanCoil(FanCoilNum).FanIndex]->simulate(_, ZoneCompTurnFansOn, ZoneCompTurnFansOff, _); + } + } else { // using 1.0 here for fan speed ratio seems wrong if FCU max flow rate is different than the fan maximum flow rate + if (FanCoil(FanCoilNum).FanType_Num != DataHVACGlobals::FanType_SystemModelObject) { + Fans::SimulateFanComponents( + FanCoil(FanCoilNum).FanName, FirstHVACIteration, FanCoil(FanCoilNum).FanIndex, 0.0, ZoneCompTurnFansOn, ZoneCompTurnFansOff); + } else { + HVACFan::fanObjs[FanCoil(FanCoilNum).FanIndex]->simulate(0.0, ZoneCompTurnFansOn, ZoneCompTurnFansOff, _); } } if (FanCoil(FanCoilNum).CCoilType_Num == CCoil_HXAssist) { diff --git a/src/EnergyPlus/Fans.cc b/src/EnergyPlus/Fans.cc index caf7604bc56..7f927e4b427 100644 --- a/src/EnergyPlus/Fans.cc +++ b/src/EnergyPlus/Fans.cc @@ -52,10 +52,10 @@ #include // EnergyPlus Headers +#include #include #include #include -#include #include #include #include @@ -1639,8 +1639,8 @@ namespace Fans { // Determine the Fan Schedule for the Time step if ((GetCurrentScheduleValue(Fan(FanNum).AvailSchedPtrNum) > 0.0 || LocalTurnFansOn) && !LocalTurnFansOff && MassFlow > 0.0) { // Fan is operating - Fan(FanNum).FanPower = MassFlow * DeltaPress / (FanEff * RhoAir); // total fan power - FanShaftPower = MotEff * Fan(FanNum).FanPower; // power delivered to shaft + Fan(FanNum).FanPower = max(0.0, MassFlow * DeltaPress / (FanEff * RhoAir)); // total fan power + FanShaftPower = MotEff * Fan(FanNum).FanPower; // power delivered to shaft Fan(FanNum).PowerLossToAir = FanShaftPower + (Fan(FanNum).FanPower - FanShaftPower) * MotInAirFrac; Fan(FanNum).OutletAirEnthalpy = Fan(FanNum).InletAirEnthalpy + Fan(FanNum).PowerLossToAir / MassFlow; // This fan does not change the moisture or Mass Flow across the component @@ -1815,7 +1815,7 @@ namespace Fans { Fan(FanNum).FanCoeff(5) * pow_4(FlowFracForPower); } - Fan(FanNum).FanPower = PartLoadFrac * MaxAirMassFlowRate * DeltaPress / (FanEff * RhoAir); // total fan power (PH 7/13/03) + Fan(FanNum).FanPower = max(0.0, PartLoadFrac * MaxAirMassFlowRate * DeltaPress / (FanEff * RhoAir)); // total fan power (PH 7/13/03) FanShaftPower = MotEff * Fan(FanNum).FanPower; // power delivered to shaft Fan(FanNum).PowerLossToAir = FanShaftPower + (Fan(FanNum).FanPower - FanShaftPower) * MotInAirFrac; @@ -1841,14 +1841,14 @@ namespace Fans { Fan(FanNum).FanCoeff(4) * pow_3(MinFlowFracLimitFanHeat) + Fan(FanNum).FanCoeff(5) * pow_4(MinFlowFracLimitFanHeat); FanPoweratLowMinimum = PartLoadFracatLowMin * MaxAirMassFlowRate * DeltaPress / (FanEff * RhoAir); - Fan(FanNum).FanPower = FlowFracForPower * FanPoweratLowMinimum / MinFlowFracLimitFanHeat; + Fan(FanNum).FanPower = max(0.0, FlowFracForPower * FanPoweratLowMinimum / MinFlowFracLimitFanHeat); } else if (FlowFracActual < MinFlowFracLimitFanHeat) { PartLoadFracatLowMin = Fan(FanNum).FanCoeff(1) + Fan(FanNum).FanCoeff(2) * MinFlowFracLimitFanHeat + Fan(FanNum).FanCoeff(3) * pow_2(MinFlowFracLimitFanHeat) + Fan(FanNum).FanCoeff(4) * pow_3(MinFlowFracLimitFanHeat) + Fan(FanNum).FanCoeff(5) * pow_4(MinFlowFracLimitFanHeat); FanPoweratLowMinimum = PartLoadFracatLowMin * MaxAirMassFlowRate * DeltaPress / (FanEff * RhoAir); - Fan(FanNum).FanPower = FlowFracActual * FanPoweratLowMinimum / MinFlowFracLimitFanHeat; + Fan(FanNum).FanPower = max(0.0, FlowFracActual * FanPoweratLowMinimum / MinFlowFracLimitFanHeat); } FanShaftPower = MotEff * Fan(FanNum).FanPower; // power delivered to shaft Fan(FanNum).PowerLossToAir = FanShaftPower + (Fan(FanNum).FanPower - FanShaftPower) * MotInAirFrac; @@ -2000,7 +2000,7 @@ namespace Fans { // The fan speed ratio (passed from parent) determines the fan power according to fan laws if (present(SpeedRatio)) { // Fan(FanNum)%FanPower = MassFlow*DeltaPress/(FanEff*RhoAir*OnOffFanPartLoadFraction)! total fan power - Fan(FanNum).FanPower = MaxAirMassFlowRate * Fan(FanNum).FanRuntimeFraction * DeltaPress / (FanEff * RhoAir); + Fan(FanNum).FanPower = max(0.0, MaxAirMassFlowRate * Fan(FanNum).FanRuntimeFraction * DeltaPress / (FanEff * RhoAir)); // Do not modify fan power calculation unless fan power vs speed ratio curve is used. if (Fan(FanNum).FanPowerRatAtSpeedRatCurveIndex > 0) { @@ -2044,7 +2044,8 @@ namespace Fans { Fan(FanNum).FanPower *= SpeedRaisedToPower / EffRatioAtSpeedRatio; } } else { - Fan(FanNum).FanPower = MaxAirMassFlowRate * Fan(FanNum).FanRuntimeFraction * DeltaPress / (FanEff * RhoAir); // total fan power + Fan(FanNum).FanPower = + max(0.0, MaxAirMassFlowRate * Fan(FanNum).FanRuntimeFraction * DeltaPress / (FanEff * RhoAir)); // total fan power } // OnOffFanPartLoadFraction is passed via DataHVACGlobals from the cooling or heating coil that is @@ -2169,7 +2170,7 @@ namespace Fans { if (FanIsRunning) { // Fan is operating - Fan(FanNum).FanPower = MassFlow * DeltaPress / (FanEff * RhoAir); // total fan power + Fan(FanNum).FanPower = max(0.0, MassFlow * DeltaPress / (FanEff * RhoAir)); // total fan power Fan(FanNum).PowerLossToAir = Fan(FanNum).FanPower; Fan(FanNum).OutletAirEnthalpy = Fan(FanNum).InletAirEnthalpy + Fan(FanNum).PowerLossToAir / MassFlow; // This fan does not change the moisture or Mass Flow across the component diff --git a/src/EnergyPlus/General.cc b/src/EnergyPlus/General.cc index fcea1e17a19..eea23f77063 100644 --- a/src/EnergyPlus/General.cc +++ b/src/EnergyPlus/General.cc @@ -3923,6 +3923,23 @@ namespace General { return results; } + Real64 epexp(Real64 x) + { + if (x < -70.0) { + return 0.0; + } + return std::exp(x); + } + + Real64 epexp(Real64 x, Real64 defaultHigh) + { + if (x < -70.0) { + return 0.0; + } else if (x > defaultHigh) { + return std::exp(defaultHigh); + } + return std::exp(x); + } } // namespace General } // namespace EnergyPlus diff --git a/src/EnergyPlus/General.hh b/src/EnergyPlus/General.hh index 05d19f356c6..11fd49d0158 100644 --- a/src/EnergyPlus/General.hh +++ b/src/EnergyPlus/General.hh @@ -389,6 +389,9 @@ namespace General { std::vector splitString(const std::string &string, char delimiter); + Real64 epexp(Real64 x); + + Real64 epexp(Real64 x, Real64 defaultHigh); } // namespace General } // namespace EnergyPlus diff --git a/src/EnergyPlus/HVACFan.cc b/src/EnergyPlus/HVACFan.cc index cda2dc279c4..c4b67051e7c 100644 --- a/src/EnergyPlus/HVACFan.cc +++ b/src/EnergyPlus/HVACFan.cc @@ -813,8 +813,8 @@ namespace HVACFan { localFanTotEff = m_fanTotalEff; locHiSpeedFanRunTimeFrac = locRunTimeFraction * locFlowRatio; m_fanRunTimeFractionAtSpeed[0] += locHiSpeedFanRunTimeFrac; - m_fanPower += - locHiSpeedFanRunTimeFrac * m_maxAirMassFlowRate * localPressureRise[mode] / (localFanTotEff * m_rhoAirStdInit); + m_fanPower += max( + 0.0, locHiSpeedFanRunTimeFrac * m_maxAirMassFlowRate * localPressureRise[mode] / (localFanTotEff * m_rhoAirStdInit)); } else if (m_numSpeeds > 1) { // multi speed // find which two speed levels bracket flow ratios and calculate runtimefraction at each speed @@ -827,7 +827,7 @@ namespace HVACFan { locHiSpeedFanRunTimeFrac = locFlowRatio * locRunTimeFraction / m_flowFractionAtSpeed[0]; m_fanRunTimeFractionAtSpeed[0] += locHiSpeedFanRunTimeFrac; } else { - lowSideSpeed = 0; // hush up cppcheck + lowSideSpeed = 0; // hush up cppcheck hiSideSpeed = 0; // hush up cppcheck for (auto loop = 0; loop < m_numSpeeds - 1; ++loop) { if ((m_flowFractionAtSpeed[loop] <= locFlowRatio) && (locFlowRatio <= m_flowFractionAtSpeed[loop + 1])) { @@ -844,13 +844,15 @@ namespace HVACFan { m_fanRunTimeFractionAtSpeed[hiSideSpeed] += locHiSpeedFanRunTimeFrac; } if (lowSideSpeed != -1 && hiSideSpeed != -1) { - m_fanPower += locLowSpeedFanRunTimeFrac * m_massFlowAtSpeed[lowSideSpeed] * localPressureRise[mode] / - (m_totEfficAtSpeed[lowSideSpeed] * m_rhoAirStdInit) + - locHiSpeedFanRunTimeFrac * m_massFlowAtSpeed[hiSideSpeed] * localPressureRise[mode] / - (m_totEfficAtSpeed[hiSideSpeed] * m_rhoAirStdInit); + m_fanPower += max(0.0, + locLowSpeedFanRunTimeFrac * m_massFlowAtSpeed[lowSideSpeed] * localPressureRise[mode] / + (m_totEfficAtSpeed[lowSideSpeed] * m_rhoAirStdInit) + + locHiSpeedFanRunTimeFrac * m_massFlowAtSpeed[hiSideSpeed] * localPressureRise[mode] / + (m_totEfficAtSpeed[hiSideSpeed] * m_rhoAirStdInit)); } else if (lowSideSpeed == -1 && hiSideSpeed == 0) { - m_fanPower += locHiSpeedFanRunTimeFrac * m_massFlowAtSpeed[hiSideSpeed] * localPressureRise[mode] / - (m_totEfficAtSpeed[hiSideSpeed] * m_rhoAirStdInit); + m_fanPower += max(0.0, + locHiSpeedFanRunTimeFrac * m_massFlowAtSpeed[hiSideSpeed] * localPressureRise[mode] / + (m_totEfficAtSpeed[hiSideSpeed] * m_rhoAirStdInit)); } } } else { @@ -867,8 +869,8 @@ namespace HVACFan { localFanTotEff = m_fanTotalEff; locHiSpeedFanRunTimeFrac = locFanRunTimeFraction; m_fanRunTimeFractionAtSpeed[0] += locHiSpeedFanRunTimeFrac; - m_fanPower += - locHiSpeedFanRunTimeFrac * m_maxAirMassFlowRate * localPressureRise[mode] / (localFanTotEff * m_rhoAirStdInit); + m_fanPower += max( + 0.0, locHiSpeedFanRunTimeFrac * m_maxAirMassFlowRate * localPressureRise[mode] / (localFanTotEff * m_rhoAirStdInit)); } else if (m_numSpeeds > 1) { // multi speed // find which two speed levels bracket flow fraction and calculate runtimefraction @@ -880,7 +882,7 @@ namespace HVACFan { locHiSpeedFanRunTimeFrac = locFanRunTimeFraction / m_flowFractionAtSpeed[0]; m_fanRunTimeFractionAtSpeed[0] += locHiSpeedFanRunTimeFrac; } else { - lowSideSpeed = 0; // hush up cppcheck + lowSideSpeed = 0; // hush up cppcheck hiSideSpeed = 0; // hush up cppcheck for (auto loop = 0; loop < m_numSpeeds - 1; ++loop) { if ((m_flowFractionAtSpeed[loop] <= locFanRunTimeFraction) && @@ -898,13 +900,15 @@ namespace HVACFan { m_fanRunTimeFractionAtSpeed[hiSideSpeed] += locHiSpeedFanRunTimeFrac; } if (lowSideSpeed != -1 && hiSideSpeed != -1) { - m_fanPower += locLowSpeedFanRunTimeFrac * m_massFlowAtSpeed[lowSideSpeed] * localPressureRise[mode] / - (m_totEfficAtSpeed[lowSideSpeed] * m_rhoAirStdInit) + - locHiSpeedFanRunTimeFrac * m_massFlowAtSpeed[hiSideSpeed] * localPressureRise[mode] / - (m_totEfficAtSpeed[hiSideSpeed] * m_rhoAirStdInit); + m_fanPower += max(0.0, + locLowSpeedFanRunTimeFrac * m_massFlowAtSpeed[lowSideSpeed] * localPressureRise[mode] / + (m_totEfficAtSpeed[lowSideSpeed] * m_rhoAirStdInit) + + locHiSpeedFanRunTimeFrac * m_massFlowAtSpeed[hiSideSpeed] * localPressureRise[mode] / + (m_totEfficAtSpeed[hiSideSpeed] * m_rhoAirStdInit)); } else if (lowSideSpeed == -1 && hiSideSpeed == 0) { - m_fanPower += locHiSpeedFanRunTimeFrac * m_massFlowAtSpeed[hiSideSpeed] * localPressureRise[mode] / - (m_totEfficAtSpeed[hiSideSpeed] * m_rhoAirStdInit); + m_fanPower += max(0.0, + locHiSpeedFanRunTimeFrac * m_massFlowAtSpeed[hiSideSpeed] * localPressureRise[mode] / + (m_totEfficAtSpeed[hiSideSpeed] * m_rhoAirStdInit)); } } } @@ -930,8 +934,9 @@ namespace HVACFan { } else { localPowerFraction = CurveManager::CurveValue(powerModFuncFlowFractionCurveIndex, localFlowFractionForPower); } - Real64 localfanPower = locFanRunTimeFraction * localPowerFraction * m_maxAirMassFlowRate * localPressureRise[mode] / - (localFanTotEff * m_rhoAirStdInit); + Real64 localfanPower = max(0.0, + locFanRunTimeFraction * localPowerFraction * m_maxAirMassFlowRate * localPressureRise[mode] / + (localFanTotEff * m_rhoAirStdInit)); Real64 fanShaftPower = m_motorEff * localfanPower; Real64 localpowerLossToAir = fanShaftPower + (localfanPower - fanShaftPower) * m_motorInAirFrac; m_outletAirEnthalpy = m_inletAirEnthalpy + localpowerLossToAir / localAirMassFlow[mode]; // this will get revised later @@ -948,12 +953,12 @@ namespace HVACFan { powerFractionAtLowMin = CurveManager::CurveValue(powerModFuncFlowFractionCurveIndex, minFlowFracLimitFanHeat); fanPoweratLowMinimum = powerFractionAtLowMin * m_maxAirMassFlowRate * localPressureRise[mode] / (localFanTotEff * m_rhoAirStdInit); - localfanPower = localFlowFractionForPower * fanPoweratLowMinimum / minFlowFracLimitFanHeat; + localfanPower = max(0.0, localFlowFractionForPower * fanPoweratLowMinimum / minFlowFracLimitFanHeat); } else if (locFlowRatio < minFlowFracLimitFanHeat) { powerFractionAtLowMin = CurveManager::CurveValue(powerModFuncFlowFractionCurveIndex, minFlowFracLimitFanHeat); fanPoweratLowMinimum = powerFractionAtLowMin * m_maxAirMassFlowRate * localPressureRise[mode] / (localFanTotEff * m_rhoAirStdInit); - localfanPower = locFlowRatio * fanPoweratLowMinimum / minFlowFracLimitFanHeat; + localfanPower = max(0.0, locFlowRatio * fanPoweratLowMinimum / minFlowFracLimitFanHeat); } } m_fanPower += localfanPower; diff --git a/src/EnergyPlus/HVACVariableRefrigerantFlow.cc b/src/EnergyPlus/HVACVariableRefrigerantFlow.cc index 6212e2d8286..e8a2f5258fd 100644 --- a/src/EnergyPlus/HVACVariableRefrigerantFlow.cc +++ b/src/EnergyPlus/HVACVariableRefrigerantFlow.cc @@ -4338,6 +4338,7 @@ namespace HVACVariableRefrigerantFlow { if (!ZoneEquipConfig(CtrlZone).IsControlled) continue; for (NodeNum = 1; NodeNum <= ZoneEquipConfig(CtrlZone).NumExhaustNodes; ++NodeNum) { if (VRFTU(VRFTUNum).VRFTUInletNodeNum == ZoneEquipConfig(CtrlZone).ExhaustNode(NodeNum)) { + VRFTU(VRFTUNum).ZoneAirNode = ZoneEquipConfig(CtrlZone).ZoneNode; ZoneNodeNotFound = false; break; } @@ -4368,6 +4369,7 @@ namespace HVACVariableRefrigerantFlow { if (!ZoneEquipConfig(CtrlZone).IsControlled) continue; for (NodeNum = 1; NodeNum <= ZoneEquipConfig(CtrlZone).NumInletNodes; ++NodeNum) { if (VRFTU(VRFTUNum).VRFTUOutletNodeNum == ZoneEquipConfig(CtrlZone).InletNode(NodeNum)) { + VRFTU(VRFTUNum).ZoneAirNode = ZoneEquipConfig(CtrlZone).ZoneNode; ZoneNodeNotFound = false; break; } @@ -7925,7 +7927,6 @@ namespace HVACVariableRefrigerantFlow { int VRFTUOutletNodeNum; // TU air outlet node int VRFTUInletNodeNum; // TU air inlet node Real64 AirMassFlow; // total supply air mass flow [m3/s] - Real64 MinHumRat; // minimum humidity ratio for sensible capacity calculation (kg/kg) int OpMode; // fan operating mode, CycFanCycCoil or ContFanCycCoil int VRFCond; // index to VRF condenser Real64 SpecHumOut; // specific humidity ratio at outlet node @@ -7942,7 +7943,7 @@ namespace HVACVariableRefrigerantFlow { VRFTUOutletNodeNum = this->VRFTUOutletNodeNum; VRFTUInletNodeNum = this->VRFTUInletNodeNum; OpMode = this->OpMode; - ZoneNode = ZoneEquipConfig(this->ZoneNum).ZoneNode; + ZoneNode = this->ZoneAirNode; // Set inlet air mass flow rate based on PLR and compressor on/off air flow rates SetAverageAirFlow(VRFTUNum, PartLoadRatio, OnOffAirFlowRatio); @@ -8044,35 +8045,37 @@ namespace HVACVariableRefrigerantFlow { } } - // If there is a supply side air terminal mixer, calculate its output + Real64 LatentLoadMet = 0.0; // latent load deleivered [kgH2O/s] + Real64 TempOut = 0.0; + Real64 TempIn = 0.0; if (this->ATMixerExists) { if (this->ATMixerType == ATMixer_SupplySide) { + // Air terminal supply side mixer, calculate supply side mixer output SimATMixer(this->ATMixerName, FirstHVACIteration, this->ATMixerIndex); - } - } - // calculate sensible load met - if (this->ATMixerExists) { - if (this->ATMixerType == ATMixer_SupplySide) { - // Air terminal supply side mixer - MinHumRat = min(Node(ZoneNode).HumRat, Node(ATMixOutNode).HumRat); - LoadMet = - Node(ATMixOutNode).MassFlowRate * (PsyHFnTdbW(Node(ATMixOutNode).Temp, MinHumRat) - PsyHFnTdbW(Node(ZoneNode).Temp, MinHumRat)); + TempOut = Node(ATMixOutNode).Temp; + TempIn = Node(ZoneNode).Temp; + SpecHumOut = Node(ATMixOutNode).HumRat; + SpecHumIn = Node(ZoneNode).HumRat; + AirMassFlow = Node( ATMixOutNode ).MassFlowRate; } else { // Air terminal inlet side mixer - MinHumRat = min(Node(ZoneNode).HumRat, Node(VRFTUOutletNodeNum).HumRat); - LoadMet = AirMassFlow * (PsyHFnTdbW(Node(VRFTUOutletNodeNum).Temp, MinHumRat) - PsyHFnTdbW(Node(ZoneNode).Temp, MinHumRat)); + TempOut = Node(VRFTUOutletNodeNum).Temp; + TempIn = Node(ZoneNode).Temp; + SpecHumOut = Node(VRFTUOutletNodeNum).HumRat; + SpecHumIn = Node(ZoneNode).HumRat; } } else { - // calculate sensible load met using delta enthalpy at a constant (minimum) humidity ratio - MinHumRat = min(Node(VRFTUInletNodeNum).HumRat, Node(VRFTUOutletNodeNum).HumRat); - LoadMet = AirMassFlow * (PsyHFnTdbW(Node(VRFTUOutletNodeNum).Temp, MinHumRat) - - PsyHFnTdbW(Node(VRFTUInletNodeNum).Temp, MinHumRat)); // sensible load met by TU + TempOut = Node(VRFTUOutletNodeNum).Temp; + TempIn = Node(VRFTUInletNodeNum).Temp; + SpecHumOut = Node(VRFTUOutletNodeNum).HumRat; + SpecHumIn = Node(VRFTUInletNodeNum).HumRat; } + // calculate sensible load met using delta enthalpy + LoadMet = AirMassFlow * PsyDeltaHSenFnTdb2W2Tdb1W1(TempOut, SpecHumOut, TempIn, SpecHumIn); // sensible {W} + LatentLoadMet = AirMassFlow * (SpecHumOut - SpecHumIn); // latent {kgH2O/s} if (present(LatOutputProvided)) { // CR9155 Remove specific humidity calculations - SpecHumOut = Node(VRFTUOutletNodeNum).HumRat; - SpecHumIn = Node(VRFTUInletNodeNum).HumRat; - LatOutputProvided = AirMassFlow * (SpecHumOut - SpecHumIn); // Latent rate, kg/s (dehumid = negative) + LatOutputProvided = LatentLoadMet; } } @@ -8107,7 +8110,6 @@ namespace HVACVariableRefrigerantFlow { Real64 LatentConditioning; // - latent rate Real64 ReportingConstant; // - used to convert watts to joules int VRFCond; // - index to VRF condenser - Real64 H2OHtOfVap; // - Heat of vaporization of air (J/kg) int TUListIndex; // - index to terminal unit list int IndexToTUInTUList; // - index to the TU in the list bool HRHeatRequestFlag; // - indicates TU could be in heat mode @@ -8194,8 +8196,25 @@ namespace HVACVariableRefrigerantFlow { SensibleConditioning = VRFTU(VRFTUNum).TerminalUnitSensibleRate; LatentConditioning = VRFTU(VRFTUNum).TerminalUnitLatentRate; + Real64 TempOut = 0.0; + Real64 TempIn = 0.0; + if (VRFTU(VRFTUNum).ATMixerExists) { + if (VRFTU(VRFTUNum).ATMixerType == ATMixer_SupplySide) { + // Air terminal supply side mixer + TempOut = Node(VRFTU(VRFTUNum).ATMixerOutNode).Temp; + TempIn = Node(VRFTU(VRFTUNum).ZoneAirNode).Temp; + } else { + // Air terminal inlet side mixer + TempOut = Node(VRFTU(VRFTUNum).VRFTUOutletNodeNum).Temp; + TempIn = Node(VRFTU(VRFTUNum).ZoneAirNode).Temp; + } + } else { + TempOut = Node(VRFTU(VRFTUNum).VRFTUOutletNodeNum).Temp; + TempIn = Node(VRFTU(VRFTUNum).VRFTUInletNodeNum).Temp; + } + // latent heat vaporization/condensation used in moist air psychometrics + Real64 const H2OHtOfVap = PsyHfgAvgFnTdb2Tdb1(TempOut, TempIn); // convert latent in kg/s to watts - H2OHtOfVap = PsyHfgAirFnWTdb(Node(VRFTU(VRFTUNum).VRFTUOutletNodeNum).HumRat, Node(VRFTU(VRFTUNum).VRFTUOutletNodeNum).Temp); TotalConditioning = SensibleConditioning + (LatentConditioning * H2OHtOfVap); if (TotalConditioning <= 0.0) { @@ -10925,7 +10944,6 @@ namespace HVACVariableRefrigerantFlow { int VRFTUOutletNodeNum; // TU air outlet node int VRFTUInletNodeNum; // TU air inlet node Real64 AirMassFlow; // total supply air mass flow [m3/s] - Real64 MinHumRat; // minimum humidity ratio for sensible capacity calculation (kg/kg) int OpMode; // fan operating mode, CycFanCycCoil or ContFanCycCoil int VRFCond; // index to VRF condenser Real64 SpecHumOut; // specific humidity ratio at outlet node @@ -10936,7 +10954,6 @@ namespace HVACVariableRefrigerantFlow { Real64 CondTemp; // condensing temperature static int ATMixOutNode(0); // outlet node of ATM Mixer int ZoneNode; // Zone node of VRFTU is serving - // FLOW VRFCond = this->VRFSysNum; @@ -10947,7 +10964,7 @@ namespace HVACVariableRefrigerantFlow { OpMode = this->OpMode; EvapTemp = VRF(VRFCond).IUEvaporatingTemp; CondTemp = VRF(VRFCond).IUCondensingTemp; - ZoneNode = ZoneEquipConfig(this->ZoneNum).ZoneNode; + ZoneNode = this->ZoneAirNode; // Set inlet air mass flow rate based on PLR and compressor on/off air flow rates if (PartLoadRatio == 0) { @@ -11057,35 +11074,37 @@ namespace HVACVariableRefrigerantFlow { } } - // calculate supply side terminal unit OA mixer + Real64 LatentLoadMet = 0.0; + Real64 TempOut = 0.0; + Real64 TempIn = 0.0; if (this->ATMixerExists) { if (this->ATMixerType == ATMixer_SupplySide) { + // Air terminal supply side mixer, calculate supply side mixer output SimATMixer(this->ATMixerName, FirstHVACIteration, this->ATMixerIndex); - } - } - // calculate sensible load met - if (this->ATMixerExists) { - if (this->ATMixerType == ATMixer_SupplySide) { - // Air terminal supply side mixer - MinHumRat = min(Node(ZoneNode).HumRat, Node(ATMixOutNode).HumRat); - LoadMet = - Node(ATMixOutNode).MassFlowRate * (PsyHFnTdbW(Node(ATMixOutNode).Temp, MinHumRat) - PsyHFnTdbW(Node(ZoneNode).Temp, MinHumRat)); + TempOut = Node(ATMixOutNode).Temp; + TempIn = Node(ZoneNode).Temp; + SpecHumOut = Node(ATMixOutNode).HumRat; + SpecHumIn = Node(ZoneNode).HumRat; + AirMassFlow = Node( ATMixOutNode ).MassFlowRate; } else { // Air terminal inlet side mixer - MinHumRat = min(Node(ZoneNode).HumRat, Node(VRFTUOutletNodeNum).HumRat); - LoadMet = AirMassFlow * (PsyHFnTdbW(Node(VRFTUOutletNodeNum).Temp, MinHumRat) - PsyHFnTdbW(Node(ZoneNode).Temp, MinHumRat)); + TempOut = Node(VRFTUOutletNodeNum).Temp; + TempIn = Node(ZoneNode).Temp; + SpecHumOut = Node(VRFTUOutletNodeNum).HumRat; + SpecHumIn = Node(ZoneNode).HumRat; } } else { - // calculate sensible load met using delta enthalpy at a constant (minimum) humidity ratio - MinHumRat = min(Node(VRFTUInletNodeNum).HumRat, Node(VRFTUOutletNodeNum).HumRat); - LoadMet = AirMassFlow * (PsyHFnTdbW(Node(VRFTUOutletNodeNum).Temp, MinHumRat) - - PsyHFnTdbW(Node(VRFTUInletNodeNum).Temp, MinHumRat)); // sensible load met by TU + TempOut = Node(VRFTUOutletNodeNum).Temp; + TempIn = Node(VRFTUInletNodeNum).Temp; + SpecHumOut = Node(VRFTUOutletNodeNum).HumRat; + SpecHumIn = Node(VRFTUInletNodeNum).HumRat; } + // calculate sensible load met using delta enthalpy + LoadMet = AirMassFlow * PsyDeltaHSenFnTdb2W2Tdb1W1(TempOut, SpecHumOut, TempIn, SpecHumIn); // sensible {W} + LatentLoadMet = AirMassFlow * (SpecHumOut - SpecHumIn); // latent {kgH2O/s} if (present(LatOutputProvided)) { // CR9155 Remove specific humidity calculations - SpecHumOut = Node(VRFTUOutletNodeNum).HumRat; - SpecHumIn = Node(VRFTUInletNodeNum).HumRat; - LatOutputProvided = AirMassFlow * (SpecHumOut - SpecHumIn); // Latent rate, kg/s (dehumid = negative) + LatOutputProvided = LatentLoadMet; } } @@ -11156,7 +11175,7 @@ namespace HVACVariableRefrigerantFlow { (VRF(VRFCond).HeatRecoveryUsed && TerminalUnitList(TUListIndex).HRCoolRequest(IndexToTUInTUList))) { // VRF terminal unit is on cooling mode DXCoilNum = this->CoolCoilIndex; - QCoilReq = -PartLoadRatio * DXCoil(DXCoilNum).RatedTotCap(Mode); // positive for heating; negative for cooling + QCoilReq = -PartLoadRatio * DXCoil(DXCoilNum).RatedTotCap(Mode); TeTc = VRF(VRFCond).IUEvaporatingTemp; // For HR operations, Te is lower than the outdoor air temperature because of outdoor evaporator operations @@ -11167,7 +11186,7 @@ namespace HVACVariableRefrigerantFlow { (VRF(VRFCond).HeatRecoveryUsed && TerminalUnitList(TUListIndex).HRHeatRequest(IndexToTUInTUList))) { // VRF terminal unit is on heating mode DXCoilNum = this->HeatCoilIndex; - QCoilReq = PartLoadRatio * DXCoil(DXCoilNum).RatedTotCap(Mode); // positive for heating; negative for cooling + QCoilReq = PartLoadRatio * DXCoil(DXCoilNum).RatedTotCap(Mode); TeTc = VRF(VRFCond).IUCondensingTemp; } else { diff --git a/src/EnergyPlus/HVACVariableRefrigerantFlow.hh b/src/EnergyPlus/HVACVariableRefrigerantFlow.hh index 9b39281b46a..9ba8bac8228 100644 --- a/src/EnergyPlus/HVACVariableRefrigerantFlow.hh +++ b/src/EnergyPlus/HVACVariableRefrigerantFlow.hh @@ -629,6 +629,7 @@ namespace HVACVariableRefrigerantFlow { int TUListIndex; // index to VRF Terminal Unit List int IndexToTUInTUList; // index to TU in VRF Terminal Unit List int ZoneNum; // index to zone where VRF Terminal Unit resides + int ZoneAirNode; // zone air node number int VRFTUInletNodeNum; // VRF Terminal Unit inlet node number int VRFTUOutletNodeNum; // VRF Terminal Unit outlet node number int VRFTUOAMixerOANodeNum; // OA node number for this TU's OA mixer @@ -730,7 +731,7 @@ namespace HVACVariableRefrigerantFlow { bool MySuppCoilPlantScanFlag; // flag used to initialize plant comp for water and steam heating coils // Default Constructor VRFTerminalUnitEquipment() - : VRFTUType_Num(0), SchedPtr(-1), VRFSysNum(0), TUListIndex(0), IndexToTUInTUList(0), ZoneNum(0), VRFTUInletNodeNum(0), + : VRFTUType_Num(0), SchedPtr(-1), VRFSysNum(0), TUListIndex(0), IndexToTUInTUList(0), ZoneNum(0), ZoneAirNode(0), VRFTUInletNodeNum(0), VRFTUOutletNodeNum(0), VRFTUOAMixerOANodeNum(0), VRFTUOAMixerRelNodeNum(0), VRFTUOAMixerRetNodeNum(0), MaxCoolAirVolFlow(0.0), MaxHeatAirVolFlow(0.0), MaxNoCoolAirVolFlow(0.0), MaxNoHeatAirVolFlow(0.0), MaxCoolAirMassFlow(0.0), MaxHeatAirMassFlow(0.0), MaxNoCoolAirMassFlow(0.0), MaxNoHeatAirMassFlow(0.0), CoolOutAirVolFlow(0.0), HeatOutAirVolFlow(0.0), NoCoolHeatOutAirVolFlow(0.0), diff --git a/src/EnergyPlus/HeatBalanceIntRadExchange.cc b/src/EnergyPlus/HeatBalanceIntRadExchange.cc index 8d70db4a104..9eaf9f093d2 100644 --- a/src/EnergyPlus/HeatBalanceIntRadExchange.cc +++ b/src/EnergyPlus/HeatBalanceIntRadExchange.cc @@ -147,9 +147,9 @@ namespace HeatBalanceIntRadExchange { Array1 &NetLWRadToSurf, // Net long wavelength radiant exchange from other surfaces Optional_int_const ZoneToResimulate, // if passed in, then only calculate for this zone #ifdef EP_Count_Calls - std::string const &CalledFrom) + std::string const &CalledFrom) #else - std::string const &EP_UNUSED(CalledFrom)) + std::string const &EP_UNUSED(CalledFrom)) #endif { @@ -306,6 +306,10 @@ namespace HeatBalanceIntRadExchange { (ShadeFlagPrev != IntBlindOn && ShadeFlag == IntBlindOn) || (ShadeFlagPrev == IntShadeOn && ShadeFlag != IntShadeOn) || (ShadeFlagPrev == IntBlindOn && ShadeFlag != IntBlindOn)) IntShadeOrBlindStatusChanged = true; + if (SurfaceWindow(SurfNum).WindowModelType == WindowEQLModel && + DataWindowEquivalentLayer::CFS(Construct(ConstrNum).EQLConsPtr).ISControlled) { + IntShadeOrBlindStatusChanged = true; + } } else { UpdateMovableInsulationFlag(IntMovInsulChanged, SurfNum); } @@ -328,6 +332,10 @@ namespace HeatBalanceIntRadExchange { HeatBalanceMovableInsulation::EvalInsideMovableInsulation(SurfNum, HMovInsul, AbsInt); zone_info.Emissivity(ZoneSurfNum) = Material(Surface(SurfNum).MaterialMovInsulInt).AbsorpThermal; } + if (surface_window.WindowModelType == WindowEQLModel && + DataWindowEquivalentLayer::CFS(Construct(ConstrNum).EQLConsPtr).ISControlled) { + zone_info.Emissivity(ZoneSurfNum) = EQLWindowInsideEffectiveEmiss(ConstrNum); + } } CalcScriptF(n_zone_Surfaces, zone_info.Area, zone_info.F, zone_info.Emissivity, zone_ScriptF); @@ -478,8 +486,8 @@ namespace HeatBalanceIntRadExchange { MovableInsulationChange = false; if (Surface(SurfNum).MaterialMovInsulInt > 0) { Real64 HMovInsul; // "Resistance" value of movable insulation (if present) - Real64 AbsInt; // Absorptivity of movable insulation material - // (supercedes that of the construction if interior movable insulation is present) + Real64 AbsInt; // Absorptivity of movable insulation material + // (supercedes that of the construction if interior movable insulation is present) HeatBalanceMovableInsulation::EvalInsideMovableInsulation(SurfNum, HMovInsul, AbsInt); } else { Surface(SurfNum).MovInsulIntPresent = false; @@ -544,12 +552,13 @@ namespace HeatBalanceIntRadExchange { MaxNumOfRadEnclosureSurfs = 0; for (int enclosureNum = 1; enclosureNum <= DataViewFactorInformation::NumOfRadiantEnclosures; ++enclosureNum) { - auto & thisEnclosure(DataViewFactorInformation::ZoneRadiantInfo(enclosureNum)); + auto &thisEnclosure(DataViewFactorInformation::ZoneRadiantInfo(enclosureNum)); if (enclosureNum == 1) { if (DisplayAdvancedReportVariables) - ObjexxFCL::gio::write(OutputFileInits, fmtA) << "! ,Zone/Enclosure Name,Original Check Value,Calculated Fixed Check " - "Value,Final Check Value,Number of Iterations,Fixed RowSum Convergence,Used RowSum " - "Convergence"; + ObjexxFCL::gio::write(OutputFileInits, fmtA) + << "! ,Zone/Enclosure Name,Original Check Value,Calculated Fixed Check " + "Value,Final Check Value,Number of Iterations,Fixed RowSum Convergence,Used RowSum " + "Convergence"; } int numEnclosureSurfaces = 0; for (int zoneNum : thisEnclosure.ZoneNums) { @@ -582,17 +591,7 @@ namespace HeatBalanceIntRadExchange { // Initialize the area and emissivity arrays for (int enclSurfNum = 1; enclSurfNum <= thisEnclosure.NumOfSurfaces; ++enclSurfNum) { int const SurfNum = thisEnclosure.SurfacePtr(enclSurfNum); - - //************************************************ - if ((!Construct(Surface(SurfNum).Construction).TypeIsIRT) && - (!Construct(Surface(SurfNum).Construction).TypeIsAirBoundaryIRTSurface)) { - thisEnclosure.Area(enclSurfNum) = Surface(SurfNum).Area; - } else { - // Double area for infrared transparent (IRT) surfaces - thisEnclosure.Area(enclSurfNum) = 2.0 * Surface(SurfNum).Area; - } - //*********************************************** - + thisEnclosure.Area(enclSurfNum) = Surface(SurfNum).Area; thisEnclosure.Emissivity(enclSurfNum) = Construct(Surface(SurfNum).Construction).InsideAbsorpThermal; thisEnclosure.Azimuth(enclSurfNum) = Surface(SurfNum).Azimuth; thisEnclosure.Tilt(enclSurfNum) = Surface(SurfNum).Tilt; @@ -655,16 +654,16 @@ namespace HeatBalanceIntRadExchange { if (ViewFactorReport) { // Write to SurfInfo File // Zone Surface Information Output - ObjexxFCL::gio::write(OutputFileInits, fmtA) << "Surface View Factor - Zone/Enclosure Information," + thisEnclosure.Name + ',' + - RoundSigDigits(thisEnclosure.NumOfSurfaces); + ObjexxFCL::gio::write(OutputFileInits, fmtA) + << "Surface View Factor - Zone/Enclosure Information," + thisEnclosure.Name + ',' + RoundSigDigits(thisEnclosure.NumOfSurfaces); for (int SurfNum = 1; SurfNum <= thisEnclosure.NumOfSurfaces; ++SurfNum) { ObjexxFCL::gio::write(OutputFileInits, "(A,',',A,$)") << "Surface View Factor - Surface Information," + Surface(thisEnclosure.SurfacePtr(SurfNum)).Name + ',' + cSurfaceClass(Surface(thisEnclosure.SurfacePtr(SurfNum)).Class) << RoundSigDigits(thisEnclosure.Area(SurfNum), 4) + ',' + RoundSigDigits(thisEnclosure.Azimuth(SurfNum), 4) + ',' + - RoundSigDigits(thisEnclosure.Tilt(SurfNum), 4) + ',' + RoundSigDigits(thisEnclosure.Emissivity(SurfNum), 4) + - ',' + RoundSigDigits(Surface(thisEnclosure.SurfacePtr(SurfNum)).Sides); + RoundSigDigits(thisEnclosure.Tilt(SurfNum), 4) + ',' + RoundSigDigits(thisEnclosure.Emissivity(SurfNum), 4) + ',' + + RoundSigDigits(Surface(thisEnclosure.SurfacePtr(SurfNum)).Sides); for (Vindex = 1; Vindex <= Surface(thisEnclosure.SurfacePtr(SurfNum)).Sides; ++Vindex) { auto &Vertex = Surface(thisEnclosure.SurfacePtr(SurfNum)).Vertex(Vindex); ObjexxFCL::gio::write(OutputFileInits, "(3(',',A),$)") @@ -674,7 +673,7 @@ namespace HeatBalanceIntRadExchange { } ObjexxFCL::gio::write(OutputFileInits, "(A,A,$)") << "Approximate or User Input ViewFactors" - << ",To Surface,Surface Class,RowSum"; + << ",To Surface,Surface Class,RowSum"; for (int SurfNum = 1; SurfNum <= thisEnclosure.NumOfSurfaces; ++SurfNum) { ObjexxFCL::gio::write(OutputFileInits, "(',',A,$)") << Surface(thisEnclosure.SurfacePtr(SurfNum)).Name; } @@ -694,7 +693,7 @@ namespace HeatBalanceIntRadExchange { if (ViewFactorReport) { ObjexxFCL::gio::write(OutputFileInits, "(A,A,$)") << "Final ViewFactors" - << ",To Surface,Surface Class,RowSum"; + << ",To Surface,Surface Class,RowSum"; for (int SurfNum = 1; SurfNum <= thisEnclosure.NumOfSurfaces; ++SurfNum) { ObjexxFCL::gio::write(OutputFileInits, "(',',A,$)") << Surface(thisEnclosure.SurfacePtr(SurfNum)).Name; } @@ -718,12 +717,12 @@ namespace HeatBalanceIntRadExchange { for (Findex = 1; Findex <= thisEnclosure.NumOfSurfaces; ++Findex) { if (!(SurfNum == thisEnclosure.NumOfSurfaces && Findex == thisEnclosure.NumOfSurfaces)) { ObjexxFCL::gio::write(OutputFileDebug, fmtA) << " " + Surface(thisEnclosure.SurfacePtr(SurfNum)).Name + ',' + - Surface(thisEnclosure.SurfacePtr(Findex)).Name + ',' + - RoundSigDigits(thisEnclosure.F(Findex, SurfNum), 6) + ','; + Surface(thisEnclosure.SurfacePtr(Findex)).Name + ',' + + RoundSigDigits(thisEnclosure.F(Findex, SurfNum), 6) + ','; } else { ObjexxFCL::gio::write(OutputFileDebug, fmtA) << " " + Surface(thisEnclosure.SurfacePtr(SurfNum)).Name + ',' + - Surface(thisEnclosure.SurfacePtr(Findex)).Name + ',' + - RoundSigDigits(thisEnclosure.F(Findex, SurfNum), 6) + ';'; + Surface(thisEnclosure.SurfacePtr(Findex)).Name + ',' + + RoundSigDigits(thisEnclosure.F(Findex, SurfNum), 6) + ';'; } } } @@ -735,12 +734,12 @@ namespace HeatBalanceIntRadExchange { for (Findex = 1; Findex <= thisEnclosure.NumOfSurfaces; ++Findex) { if (!(SurfNum == thisEnclosure.NumOfSurfaces && Findex == thisEnclosure.NumOfSurfaces)) { ObjexxFCL::gio::write(OutputFileDebug, fmtA) << " " + Surface(thisEnclosure.SurfacePtr(SurfNum)).Name + ',' + - Surface(thisEnclosure.SurfacePtr(Findex)).Name + ',' + - RoundSigDigits(thisEnclosure.F(Findex, SurfNum), 6) + ','; + Surface(thisEnclosure.SurfacePtr(Findex)).Name + ',' + + RoundSigDigits(thisEnclosure.F(Findex, SurfNum), 6) + ','; } else { ObjexxFCL::gio::write(OutputFileDebug, fmtA) << " " + Surface(thisEnclosure.SurfacePtr(SurfNum)).Name + ',' + - Surface(thisEnclosure.SurfacePtr(Findex)).Name + ',' + - RoundSigDigits(thisEnclosure.F(Findex, SurfNum), 6) + ';'; + Surface(thisEnclosure.SurfacePtr(Findex)).Name + ',' + + RoundSigDigits(thisEnclosure.F(Findex, SurfNum), 6) + ';'; } } } @@ -750,7 +749,7 @@ namespace HeatBalanceIntRadExchange { if (ViewFactorReport) { ObjexxFCL::gio::write(OutputFileInits, "(A,A,$)") << "Script F Factors" - << ",X Surface"; + << ",X Surface"; for (int SurfNum = 1; SurfNum <= thisEnclosure.NumOfSurfaces; ++SurfNum) { ObjexxFCL::gio::write(OutputFileInits, "(',',A,$)") << Surface(thisEnclosure.SurfacePtr(SurfNum)).Name; } @@ -776,9 +775,9 @@ namespace HeatBalanceIntRadExchange { FixedRowSum = std::abs(FixedRowSum - thisEnclosure.NumOfSurfaces); if (DisplayAdvancedReportVariables) { ObjexxFCL::gio::write(OutputFileInits, "(8A)") << "Surface View Factor Check Values," + thisEnclosure.Name + ',' + - RoundSigDigits(CheckValue1, 6) + ',' + RoundSigDigits(CheckValue2, 6) + ',' + - RoundSigDigits(FinalCheckValue, 6) + ',' + RoundSigDigits(NumIterations) + ',' + - RoundSigDigits(FixedRowSum, 6) + ',' + RoundSigDigits(RowSum, 6); + RoundSigDigits(CheckValue1, 6) + ',' + RoundSigDigits(CheckValue2, 6) + ',' + + RoundSigDigits(FinalCheckValue, 6) + ',' + RoundSigDigits(NumIterations) + ',' + + RoundSigDigits(FixedRowSum, 6) + ',' + RoundSigDigits(RowSum, 6); } } @@ -795,7 +794,7 @@ namespace HeatBalanceIntRadExchange { static ObjexxFCL::gio::Fmt AFormat("(A)"); Array2D SaveApproximateViewFactors; // Save for View Factor reporting - std::string Option1; // view factor report option + std::string Option1; // view factor report option bool ErrorsFound = false; bool ViewFactorReport = false; @@ -803,7 +802,8 @@ namespace HeatBalanceIntRadExchange { if (ViewFactorReport) { // Print heading ObjexxFCL::gio::write(OutputFileInits, fmtA) << "! "; - ObjexxFCL::gio::write(OutputFileInits, fmtA) << "! ,Zone/Enclosure Name,Number of Surfaces"; + ObjexxFCL::gio::write(OutputFileInits, fmtA) + << "! ,Zone/Enclosure Name,Number of Surfaces"; ObjexxFCL::gio::write(OutputFileInits, fmtA) << "! ,Surface Name,Surface Class,Area {m2},Azimuth,Tilt,Solar Absorbtance,#Sides,Vertices"; ObjexxFCL::gio::write(OutputFileInits, fmtA) << "! ,Surface Name(s)"; @@ -815,12 +815,13 @@ namespace HeatBalanceIntRadExchange { if (NumZonesWithUserFbyS > 0) AlignInputViewFactors(cCurrentModuleObject, ErrorsFound); for (int enclosureNum = 1; enclosureNum <= DataViewFactorInformation::NumOfSolarEnclosures; ++enclosureNum) { - auto & thisEnclosure(DataViewFactorInformation::ZoneSolarInfo(enclosureNum)); + auto &thisEnclosure(DataViewFactorInformation::ZoneSolarInfo(enclosureNum)); if (enclosureNum == 1) { if (DisplayAdvancedReportVariables) - ObjexxFCL::gio::write(OutputFileInits, fmtA) << "! ,Zone/Enclosure Name,Original Check Value,Calculated Fixed Check " - "Value,Final Check Value,Number of Iterations,Fixed RowSum Convergence,Used RowSum " - "Convergence"; + ObjexxFCL::gio::write(OutputFileInits, fmtA) + << "! ,Zone/Enclosure Name,Original Check Value,Calculated Fixed Check " + "Value,Final Check Value,Number of Iterations,Fixed RowSum Convergence,Used RowSum " + "Convergence"; } int numEnclosureSurfaces = 0; for (int zoneNum : thisEnclosure.ZoneNums) { @@ -918,15 +919,17 @@ namespace HeatBalanceIntRadExchange { if (ViewFactorReport) { // Write to SurfInfo File // Zone Surface Information Output ObjexxFCL::gio::write(OutputFileInits, fmtA) << "Solar View Factor - Zone/Enclosure Information," + thisEnclosure.Name + ',' + - General::RoundSigDigits(thisEnclosure.NumOfSurfaces); + General::RoundSigDigits(thisEnclosure.NumOfSurfaces); for (int SurfNum = 1; SurfNum <= thisEnclosure.NumOfSurfaces; ++SurfNum) { ObjexxFCL::gio::write(OutputFileInits, "(A,',',A,$)") << "Solar View Factor - Surface Information," + Surface(thisEnclosure.SurfacePtr(SurfNum)).Name + ',' + cSurfaceClass(Surface(thisEnclosure.SurfacePtr(SurfNum)).Class) - << General::RoundSigDigits(thisEnclosure.Area(SurfNum), 4) + ',' + General::RoundSigDigits(thisEnclosure.Azimuth(SurfNum), 4) + ',' + - General::RoundSigDigits(thisEnclosure.Tilt(SurfNum), 4) + ',' + General::RoundSigDigits(thisEnclosure.SolAbsorptance(SurfNum), 4) + - ',' + General::RoundSigDigits(Surface(thisEnclosure.SurfacePtr(SurfNum)).Sides); + << General::RoundSigDigits(thisEnclosure.Area(SurfNum), 4) + ',' + + General::RoundSigDigits(thisEnclosure.Azimuth(SurfNum), 4) + ',' + + General::RoundSigDigits(thisEnclosure.Tilt(SurfNum), 4) + ',' + + General::RoundSigDigits(thisEnclosure.SolAbsorptance(SurfNum), 4) + ',' + + General::RoundSigDigits(Surface(thisEnclosure.SurfacePtr(SurfNum)).Sides); for (int Vindex = 1; Vindex <= Surface(thisEnclosure.SurfacePtr(SurfNum)).Sides; ++Vindex) { auto &Vertex = Surface(thisEnclosure.SurfacePtr(SurfNum)).Vertex(Vindex); ObjexxFCL::gio::write(OutputFileInits, "(3(',',A),$)") @@ -936,7 +939,7 @@ namespace HeatBalanceIntRadExchange { } ObjexxFCL::gio::write(OutputFileInits, "(A,A,$)") << "Approximate or User Input Solar ViewFactors" - << ",To Surface,Surface Class,RowSum"; + << ",To Surface,Surface Class,RowSum"; for (int SurfNum = 1; SurfNum <= thisEnclosure.NumOfSurfaces; ++SurfNum) { ObjexxFCL::gio::write(OutputFileInits, "(',',A,$)") << Surface(thisEnclosure.SurfacePtr(SurfNum)).Name; } @@ -948,7 +951,8 @@ namespace HeatBalanceIntRadExchange { << "Solar View Factor" << Surface(thisEnclosure.SurfacePtr(Findex)).Name << cSurfaceClass(Surface(thisEnclosure.SurfacePtr(Findex)).Class) << General::RoundSigDigits(RowSum, 4); for (int SurfNum = 1; SurfNum <= thisEnclosure.NumOfSurfaces; ++SurfNum) { - ObjexxFCL::gio::write(OutputFileInits, "(',',A,$)") << General::RoundSigDigits(SaveApproximateViewFactors(SurfNum, Findex), 4); + ObjexxFCL::gio::write(OutputFileInits, "(',',A,$)") + << General::RoundSigDigits(SaveApproximateViewFactors(SurfNum, Findex), 4); } ObjexxFCL::gio::write(OutputFileInits); } @@ -956,7 +960,7 @@ namespace HeatBalanceIntRadExchange { if (ViewFactorReport) { ObjexxFCL::gio::write(OutputFileInits, "(A,A,$)") << "Final Solar ViewFactors" - << ",To Surface,Surface Class,RowSum"; + << ",To Surface,Surface Class,RowSum"; for (int SurfNum = 1; SurfNum <= thisEnclosure.NumOfSurfaces; ++SurfNum) { ObjexxFCL::gio::write(OutputFileInits, "(',',A,$)") << Surface(thisEnclosure.SurfacePtr(SurfNum)).Name; } @@ -979,13 +983,13 @@ namespace HeatBalanceIntRadExchange { for (int SurfNum = 1; SurfNum <= thisEnclosure.NumOfSurfaces; ++SurfNum) { for (int Findex = 1; Findex <= thisEnclosure.NumOfSurfaces; ++Findex) { if (!(SurfNum == thisEnclosure.NumOfSurfaces && Findex == thisEnclosure.NumOfSurfaces)) { - ObjexxFCL::gio::write(OutputFileDebug, fmtA) << " " + Surface(thisEnclosure.SurfacePtr(SurfNum)).Name + ',' + - Surface(thisEnclosure.SurfacePtr(Findex)).Name + ',' + - General::RoundSigDigits(thisEnclosure.F(Findex, SurfNum), 6) + ','; + ObjexxFCL::gio::write(OutputFileDebug, fmtA) + << " " + Surface(thisEnclosure.SurfacePtr(SurfNum)).Name + ',' + Surface(thisEnclosure.SurfacePtr(Findex)).Name + + ',' + General::RoundSigDigits(thisEnclosure.F(Findex, SurfNum), 6) + ','; } else { - ObjexxFCL::gio::write(OutputFileDebug, fmtA) << " " + Surface(thisEnclosure.SurfacePtr(SurfNum)).Name + ',' + - Surface(thisEnclosure.SurfacePtr(Findex)).Name + ',' + - General::RoundSigDigits(thisEnclosure.F(Findex, SurfNum), 6) + ';'; + ObjexxFCL::gio::write(OutputFileDebug, fmtA) + << " " + Surface(thisEnclosure.SurfacePtr(SurfNum)).Name + ',' + Surface(thisEnclosure.SurfacePtr(Findex)).Name + + ',' + General::RoundSigDigits(thisEnclosure.F(Findex, SurfNum), 6) + ';'; } } } @@ -996,13 +1000,13 @@ namespace HeatBalanceIntRadExchange { for (int SurfNum = 1; SurfNum <= thisEnclosure.NumOfSurfaces; ++SurfNum) { for (int Findex = 1; Findex <= thisEnclosure.NumOfSurfaces; ++Findex) { if (!(SurfNum == thisEnclosure.NumOfSurfaces && Findex == thisEnclosure.NumOfSurfaces)) { - ObjexxFCL::gio::write(OutputFileDebug, fmtA) << " " + Surface(thisEnclosure.SurfacePtr(SurfNum)).Name + ',' + - Surface(thisEnclosure.SurfacePtr(Findex)).Name + ',' + - General::RoundSigDigits(thisEnclosure.F(Findex, SurfNum), 6) + ','; + ObjexxFCL::gio::write(OutputFileDebug, fmtA) + << " " + Surface(thisEnclosure.SurfacePtr(SurfNum)).Name + ',' + Surface(thisEnclosure.SurfacePtr(Findex)).Name + + ',' + General::RoundSigDigits(thisEnclosure.F(Findex, SurfNum), 6) + ','; } else { - ObjexxFCL::gio::write(OutputFileDebug, fmtA) << " " + Surface(thisEnclosure.SurfacePtr(SurfNum)).Name + ',' + - Surface(thisEnclosure.SurfacePtr(Findex)).Name + ',' + - General::RoundSigDigits(thisEnclosure.F(Findex, SurfNum), 6) + ';'; + ObjexxFCL::gio::write(OutputFileDebug, fmtA) + << " " + Surface(thisEnclosure.SurfacePtr(SurfNum)).Name + ',' + Surface(thisEnclosure.SurfacePtr(Findex)).Name + + ',' + General::RoundSigDigits(thisEnclosure.F(Findex, SurfNum), 6) + ';'; } } } @@ -1021,10 +1025,11 @@ namespace HeatBalanceIntRadExchange { RowSum = std::abs(RowSum - thisEnclosure.NumOfSurfaces); FixedRowSum = std::abs(FixedRowSum - thisEnclosure.NumOfSurfaces); if (DisplayAdvancedReportVariables) { - ObjexxFCL::gio::write(OutputFileInits, "(8A)") << "Solar View Factor Check Values," + thisEnclosure.Name + ',' + - General::RoundSigDigits(CheckValue1, 6) + ',' + General::RoundSigDigits(CheckValue2, 6) + ',' + - General::RoundSigDigits(FinalCheckValue, 6) + ',' + General::RoundSigDigits(NumIterations) + ',' + - General::RoundSigDigits(FixedRowSum, 6) + ',' + General::RoundSigDigits(RowSum, 6); + ObjexxFCL::gio::write(OutputFileInits, "(8A)") + << "Solar View Factor Check Values," + thisEnclosure.Name + ',' + General::RoundSigDigits(CheckValue1, 6) + ',' + + General::RoundSigDigits(CheckValue2, 6) + ',' + General::RoundSigDigits(FinalCheckValue, 6) + ',' + + General::RoundSigDigits(NumIterations) + ',' + General::RoundSigDigits(FixedRowSum, 6) + ',' + + General::RoundSigDigits(RowSum, 6); } } @@ -1157,12 +1162,12 @@ namespace HeatBalanceIntRadExchange { break; } } - if (!thisZoneFound){ - anyZoneNotFound = true; - break; + if (!thisZoneFound) { + anyZoneNotFound = true; + break; } } - if (anyZoneNotFound){ + if (anyZoneNotFound) { continue; // On to the next enclosure } else { enclMatchFound = true; @@ -1195,8 +1200,7 @@ namespace HeatBalanceIntRadExchange { } if (anyZoneNotFound) { continue; // On to the next enclosure - } - else { + } else { enclMatchFound = true; // If matching ZoneList found, set the enclosure name to match thisEnclosure.Name = thisZoneOrZoneListName; @@ -1208,12 +1212,12 @@ namespace HeatBalanceIntRadExchange { if (!enclMatchFound) { if (zoneListNum > 0) { ShowSevereError("AlignInputViewFactors: " + cCurrentModuleObject + "=\"" + thisZoneOrZoneListName + - "\" found a matching ZoneList, but did not find a matching radiant or solar enclosure with the same zones."); + "\" found a matching ZoneList, but did not find a matching radiant or solar enclosure with the same zones."); ErrorsFound = true; } else { ShowSevereError("AlignInputViewFactors: " + cCurrentModuleObject + "=\"" + thisZoneOrZoneListName + - "\" did not find a matching radiant or solar enclosure name."); + "\" did not find a matching radiant or solar enclosure name."); ErrorsFound = true; } } @@ -1640,7 +1644,7 @@ namespace HeatBalanceIntRadExchange { FinalCheckValue = FixedCheckValue = CheckConvergeTolerance = std::abs(sum_FixedF - N); if (CheckConvergeTolerance > 0.005) { ShowWarningError("FixViewFactors: View factors not complete. Check for bad surface descriptions or unenclosed zone=\"" + - enclName + "\"."); + enclName + "\"."); ShowContinueError("Enforced reciprocity has tolerance (ideal is 0)=[" + RoundSigDigits(CheckConvergeTolerance, 6) + "], Row Sum (ideal is " + RoundSigDigits(N) + ")=[" + RoundSigDigits(RowSum, 2) + "]."); ShowContinueError("If zone is unusual, or tolerance is on the order of 0.001, view factors are probably OK."); @@ -1664,8 +1668,8 @@ namespace HeatBalanceIntRadExchange { F = FixedF; FinalCheckValue = FixedCheckValue; } else { - ShowWarningError("FixViewFactors: View factors not complete. Check for bad surface descriptions or unenclosed zone=\"" + - enclName + "\"."); + ShowWarningError("FixViewFactors: View factors not complete. Check for bad surface descriptions or unenclosed zone=\"" + enclName + + "\"."); } } } @@ -1920,14 +1924,13 @@ namespace HeatBalanceIntRadExchange { int const radSysEnclNum = DataHeatBalance::Zone(RadSysZoneNum).RadiantEnclosureNum; if (radSysEnclNum == 0) { // This should never happen - but it does in some simple unit tests that are designed to throw errors - ShowSevereError(routineName + "Somehow the radiant system enclosure number is zero for" + cCurrentModuleObject + " = " + - RadSysName); + ShowSevereError(routineName + "Somehow the radiant system enclosure number is zero for" + cCurrentModuleObject + " = " + RadSysName); ErrorsFound = true; } else if (surfRadEnclNum == 0) { // This should never happen ShowSevereError(routineName + "Somehow the surface enclosure number is zero for" + cCurrentModuleObject + " = " + RadSysName + " and Surface = " + SurfaceName); // LCOV_EXCL_LINE - ErrorsFound = true; // LCOV_EXCL_LINE + ErrorsFound = true; // LCOV_EXCL_LINE } else if (surfRadEnclNum != radSysEnclNum) { ShowSevereError(routineName + "Surface = " + SurfaceName + " is not in the same zone or enclosure as the radiant equipment."); ShowContinueError("Surface zone or enclosure = " + DataViewFactorInformation::ZoneRadiantInfo(surfRadEnclNum).Name); diff --git a/src/EnergyPlus/HeatBalanceManager.cc b/src/EnergyPlus/HeatBalanceManager.cc index 0711b90348c..4090c0f00a2 100644 --- a/src/EnergyPlus/HeatBalanceManager.cc +++ b/src/EnergyPlus/HeatBalanceManager.cc @@ -1828,35 +1828,16 @@ namespace HeatBalanceManager { // Load the material derived type from the input data. Material(MaterNum).Name = MaterialNames(1); - - if (MaterialNumProp >= 1) { - Material(MaterNum).Resistance = MaterialProps(1); - Material(MaterNum).ROnly = true; - } else { - Material(MaterNum).Resistance = 0.01; - Material(MaterNum).ROnly = true; - } - if (MaterialNumProp >= 2) { - Material(MaterNum).AbsorpThermal = MaterialProps(2); - Material(MaterNum).AbsorpThermalInput = MaterialProps(2); - } else { - Material(MaterNum).AbsorpThermal = 0.9999; - Material(MaterNum).AbsorpThermalInput = 0.9999; - } - if (MaterialNumProp >= 3) { - Material(MaterNum).AbsorpSolar = MaterialProps(3); - Material(MaterNum).AbsorpSolarInput = MaterialProps(3); - } else { - Material(MaterNum).AbsorpSolar = 1.0; - Material(MaterNum).AbsorpSolarInput = 1.0; - } - if (MaterialNumProp >= 4) { - Material(MaterNum).AbsorpVisible = MaterialProps(4); - Material(MaterNum).AbsorpVisibleInput = MaterialProps(4); - } else { - Material(MaterNum).AbsorpVisible = 1.0; - Material(MaterNum).AbsorpVisibleInput = 1.0; - } + + // Load data for other properties that need defaults + Material(MaterNum).ROnly = true; + Material(MaterNum).Resistance = 0.01; + Material(MaterNum).AbsorpThermal = 0.9999; + Material(MaterNum).AbsorpThermalInput = 0.9999; + Material(MaterNum).AbsorpSolar = 1.0; + Material(MaterNum).AbsorpSolarInput = 1.0; + Material(MaterNum).AbsorpVisible = 1.0; + Material(MaterNum).AbsorpVisibleInput = 1.0; NominalR(MaterNum) = Material(MaterNum).Resistance; } @@ -1877,7 +1858,7 @@ namespace HeatBalanceManager { Material(MaterNum).AbsorpVisibleInput = 0.0; NominalR(MaterNum) = Material(MaterNum).Resistance; if (GlobalNames::VerifyUniqueInterObjectName( - UniqueMaterialNames, Material(MaterNum).Name, CurrentModuleObject, cAlphaFieldNames(1), ErrorsFound)) { + UniqueMaterialNames, Material(MaterNum).Name, CurrentModuleObject, cAlphaFieldNames(1), ErrorsFound)) { ShowContinueError("...All Material names must be unique regardless of subtype."); ShowContinueError("...\"~AirBoundary-IRTMaterial\" is a reserved name used internally by Construction:AirBoundary."); } @@ -3578,9 +3559,13 @@ namespace HeatBalanceManager { Material(MaterNum).ReflFrontDiffDiffVis = MaterialProps(14); Material(MaterNum).ReflBackDiffDiffVis = MaterialProps(15); } - if (!lNumericFieldBlanks(19) && !lNumericFieldBlanks(20) && !lNumericFieldBlanks(21)) { + if (!lNumericFieldBlanks(19)) { Material(MaterNum).TausThermal = MaterialProps(19); + } + if (!lNumericFieldBlanks(20)) { Material(MaterNum).EmissThermalFront = MaterialProps(20); + } + if (!lNumericFieldBlanks(21)) { Material(MaterNum).EmissThermalBack = MaterialProps(21); } // Assumes thermal emissivity is the same as thermal absorptance @@ -5356,10 +5341,26 @@ namespace HeatBalanceManager { SetOutAirNodes(); for (ZoneNum = 1; ZoneNum <= NumOfZones; ++ZoneNum) { if (Zone(ZoneNum).HasLinkedOutAirNode) { - Zone(ZoneNum).OutDryBulbTemp = GetCurrentScheduleValue(Node(Zone(ZoneNum).LinkedOutAirNode).OutAirDryBulbSchedNum); - Zone(ZoneNum).OutWetBulbTemp = GetCurrentScheduleValue(Node(Zone(ZoneNum).LinkedOutAirNode).OutAirWetBulbSchedNum); - Zone(ZoneNum).WindSpeed = GetCurrentScheduleValue(Node(Zone(ZoneNum).LinkedOutAirNode).OutAirWindSpeedSchedNum); - Zone(ZoneNum).WindDir = GetCurrentScheduleValue(Node(Zone(ZoneNum).LinkedOutAirNode).OutAirWindDirSchedNum); + if (Node(Zone(ZoneNum).LinkedOutAirNode).OutAirDryBulbSchedNum > 0) { + Zone(ZoneNum).OutDryBulbTemp = GetCurrentScheduleValue(Node(Zone(ZoneNum).LinkedOutAirNode).OutAirDryBulbSchedNum); + } else { + Zone(ZoneNum).OutDryBulbTemp = Node(Zone(ZoneNum).LinkedOutAirNode).OutAirDryBulb; + } + if (Node(Zone(ZoneNum).LinkedOutAirNode).OutAirWetBulbSchedNum > 0) { + Zone(ZoneNum).OutWetBulbTemp = GetCurrentScheduleValue(Node(Zone(ZoneNum).LinkedOutAirNode).OutAirWetBulbSchedNum); + } else { + Zone(ZoneNum).OutWetBulbTemp = Node(Zone(ZoneNum).LinkedOutAirNode).OutAirWetBulb; + } + if (Node(Zone(ZoneNum).LinkedOutAirNode).OutAirWindSpeedSchedNum > 0) { + Zone(ZoneNum).WindSpeed = GetCurrentScheduleValue(Node(Zone(ZoneNum).LinkedOutAirNode).OutAirWindSpeedSchedNum); + } else { + Zone(ZoneNum).WindSpeed = Node(Zone(ZoneNum).LinkedOutAirNode).OutAirWindSpeed; + } + if (Node(Zone(ZoneNum).LinkedOutAirNode).OutAirWindDirSchedNum > 0) { + Zone(ZoneNum).WindDir = GetCurrentScheduleValue(Node(Zone(ZoneNum).LinkedOutAirNode).OutAirWindDirSchedNum); + } else { + Zone(ZoneNum).WindDir = Node(Zone(ZoneNum).LinkedOutAirNode).OutAirWindDir; + } } } } @@ -5607,6 +5608,10 @@ namespace HeatBalanceManager { for (SurfNum = 1; SurfNum <= TotSurfaces; ++SurfNum) { DataSurfaces::Surface(SurfNum).MovInsulIntPresentPrevTS = DataSurfaces::Surface(SurfNum).MovInsulIntPresent; } + + // For non-complex windows, update a report variable so this shows up in the output as something other than zero + UpdateWindowFaceTempsNonBSDFWin(); + } void CheckWarmupConvergence() @@ -5880,6 +5885,23 @@ namespace HeatBalanceManager { } } + void UpdateWindowFaceTempsNonBSDFWin() + { + + int SurfNum; + + for (SurfNum = 1; SurfNum <= TotSurfaces; ++SurfNum) { + auto &thisSurface(DataSurfaces::Surface(SurfNum)); + if (thisSurface.Class == DataSurfaces::SurfaceClass_Window) { + auto &thisConstruct(thisSurface.Construction); + if (!Construct(thisConstruct).WindowTypeBSDF) { + FenLaySurfTempFront(1, SurfNum) = TH(1, 1, SurfNum); + FenLaySurfTempBack(Construct(thisConstruct).TotLayers,SurfNum) = TH(2, 1, SurfNum); + } + } + } + } + // End of Record Keeping subroutines for the HB Module // ***************************************************************************** @@ -7565,7 +7587,7 @@ namespace HeatBalanceManager { thisConstruct.AirBoundaryACH = fields.at("simple_mixing_air_changes_per_hour"); } else { if (!inputProcessor->getDefaultValue( - cCurrentModuleObject, "simple_mixing_air_changes_per_hour", thisConstruct.AirBoundaryACH)) { + cCurrentModuleObject, "simple_mixing_air_changes_per_hour", thisConstruct.AirBoundaryACH)) { errorsFound = true; } } diff --git a/src/EnergyPlus/HeatBalanceManager.hh b/src/EnergyPlus/HeatBalanceManager.hh index 33593ca4a06..12a138347d6 100644 --- a/src/EnergyPlus/HeatBalanceManager.hh +++ b/src/EnergyPlus/HeatBalanceManager.hh @@ -208,6 +208,8 @@ namespace HeatBalanceManager { void CheckWarmupConvergence(); void ReportWarmupConvergence(); + + void UpdateWindowFaceTempsNonBSDFWin(); // End of Record Keeping subroutines for the HB Module // ***************************************************************************** diff --git a/src/EnergyPlus/HeatPumpWaterToWaterSimple.cc b/src/EnergyPlus/HeatPumpWaterToWaterSimple.cc index c7df57c0a21..347ea826a8c 100644 --- a/src/EnergyPlus/HeatPumpWaterToWaterSimple.cc +++ b/src/EnergyPlus/HeatPumpWaterToWaterSimple.cc @@ -1251,7 +1251,7 @@ namespace HeatPumpWaterToWaterSimple { // create predefined report OutputReportPredefined::PreDefTableEntry(OutputReportPredefined::pdchMechType, this->Name, "HeatPump:WaterToWater:EquationFit:Cooling"); OutputReportPredefined::PreDefTableEntry(OutputReportPredefined::pdchMechNomEff, this->Name, this->refCOP); - OutputReportPredefined::PreDefTableEntry(OutputReportPredefined::pdchMechNomCap, this->Name, this->RatedPowerCool); + OutputReportPredefined::PreDefTableEntry(OutputReportPredefined::pdchMechNomCap, this->Name, this->RatedCapCool); } if (errorsFound) { @@ -1576,7 +1576,7 @@ namespace HeatPumpWaterToWaterSimple { // create predefined report OutputReportPredefined::PreDefTableEntry(OutputReportPredefined::pdchMechType, this->Name, "HeatPump:WaterToWater:EquationFit:Heating"); OutputReportPredefined::PreDefTableEntry(OutputReportPredefined::pdchMechNomEff, this->Name, this->refCOP); - OutputReportPredefined::PreDefTableEntry(OutputReportPredefined::pdchMechNomCap, this->Name, this->RatedPowerHeat); + OutputReportPredefined::PreDefTableEntry(OutputReportPredefined::pdchMechNomCap, this->Name, this->RatedCapHeat); } if (errorsFound) { ShowFatalError("Preceding sizing errors cause program termination"); diff --git a/src/EnergyPlus/HeatingCoils.cc b/src/EnergyPlus/HeatingCoils.cc index 5d968e12abb..bb6486b9545 100644 --- a/src/EnergyPlus/HeatingCoils.cc +++ b/src/EnergyPlus/HeatingCoils.cc @@ -2329,9 +2329,13 @@ namespace HeatingCoils { OutletAirHumRat = FullLoadOutAirHumRat; OutletAirTemp = FullLoadOutAirTemp; } else { - OutletAirEnthalpy = PartLoadRat * FullLoadOutAirEnth + (1.0 - PartLoadRat) * InletAirEnthalpy; - OutletAirHumRat = PartLoadRat * FullLoadOutAirHumRat + (1.0 - PartLoadRat) * InletAirHumRat; - OutletAirTemp = PartLoadRat * FullLoadOutAirTemp + (1.0 - PartLoadRat) * InletAirDryBulbTemp; + OutletAirEnthalpy = + PartLoadRat * AirMassFlow / HeatingCoil(CoilNum).InletAirMassFlowRate * (FullLoadOutAirEnth - InletAirEnthalpy) + + InletAirEnthalpy; + OutletAirHumRat = + PartLoadRat * AirMassFlow / HeatingCoil(CoilNum).InletAirMassFlowRate * (FullLoadOutAirHumRat - InletAirHumRat) + + InletAirHumRat; + OutletAirTemp = PsyTdbFnHW(OutletAirEnthalpy, OutletAirHumRat); } EffLS = HeatingCoil(CoilNum).MSEfficiency(StageNumLS); diff --git a/src/EnergyPlus/OutputReportTabular.cc b/src/EnergyPlus/OutputReportTabular.cc index 8849979a83e..dc24e488235 100644 --- a/src/EnergyPlus/OutputReportTabular.cc +++ b/src/EnergyPlus/OutputReportTabular.cc @@ -9153,7 +9153,6 @@ namespace OutputReportTabular { int jEndUse; Real64 largeConversionFactor; Real64 areaConversionFactor; - Real64 convBldgCondFloorArea; if (displaySourceEnergyEndUseSummary) { // show the headers of the report @@ -9209,9 +9208,6 @@ namespace OutputReportTabular { } } - // convert floor areas - convBldgCondFloorArea = buildingConditionedFloorArea / areaConversionFactor; - // convert units into MJ (divide by 1,000,000) if J otherwise kWh for (iResource = 1; iResource <= 5; ++iResource) { // don't do water for (jEndUse = 1; jEndUse <= NumEndUses; ++jEndUse) { @@ -9317,7 +9313,8 @@ namespace OutputReportTabular { "Source Energy End Use Components Summary"); } - //---- Normalized by Conditioned Area Sub-Table + + // Normalized by Area tables { auto const SELECT_CASE_var(unitsStyle); @@ -9342,69 +9339,79 @@ namespace OutputReportTabular { } } - tableBody = ""; - if (convBldgCondFloorArea > 0) { - for (iResource = 1; iResource <= 5; ++iResource) { - for (jEndUse = 1; jEndUse <= 14; ++jEndUse) { - tableBody(iResource, jEndUse) = RealToStr(useVal(iResource, jEndUse) / convBldgCondFloorArea, 2); + //---- Normalized by Conditioned Area Sub-Table + { + tableBody = ""; + // convert floor area + Real64 convBldgCondFloorArea = buildingConditionedFloorArea / areaConversionFactor; + if (convBldgCondFloorArea > 0) { + for (iResource = 1; iResource <= 5; ++iResource) { + for (jEndUse = 1; jEndUse <= 14; ++jEndUse) { + tableBody(iResource, jEndUse) = RealToStr(useVal(iResource, jEndUse) / convBldgCondFloorArea, 2); + } + tableBody(iResource, 16) = RealToStr(useVal(iResource, 15) / convBldgCondFloorArea, 2); } - tableBody(iResource, 16) = RealToStr(useVal(iResource, 15) / convBldgCondFloorArea, 2); } - } - WriteTextLine("Normalized Metrics", true); + WriteTextLine("Normalized Metrics", true); - // heading for the entire sub-table - WriteSubtitle("Source Energy End Use Components Per Conditioned Floor Area"); - WriteTable(tableBody, rowHead, columnHead, columnWidth); - if (sqlite) { - sqlite->createSQLiteTabularDataRecords(tableBody, - rowHead, - columnHead, - "SourceEnergyEndUseComponentsSummary", - "Entire Facility", - "Source Energy End Use Component Per Conditioned Floor Area"); - } - if (ResultsFramework::OutputSchema->timeSeriesAndTabularEnabled()) { - ResultsFramework::OutputSchema->TabularReportsCollection.addReportTable(tableBody, - rowHead, - columnHead, - "Source Energy End Use Components Summary", - "Entire Facility", - "Source Energy End Use Component Per Conditioned Floor Area"); - } + // heading for the entire sub-table + WriteSubtitle("Source Energy End Use Components Per Conditioned Floor Area"); + WriteTable(tableBody, rowHead, columnHead, columnWidth); + if (sqlite) { + sqlite->createSQLiteTabularDataRecords(tableBody, + rowHead, + columnHead, + "SourceEnergyEndUseComponentsSummary", + "Entire Facility", + "Source Energy End Use Component Per Conditioned Floor Area"); + } + if (ResultsFramework::OutputSchema->timeSeriesAndTabularEnabled()) { + ResultsFramework::OutputSchema->TabularReportsCollection.addReportTable(tableBody, + rowHead, + columnHead, + "Source Energy End Use Components Summary", + "Entire Facility", + "Source Energy End Use Component Per Conditioned Floor Area"); + } + } // End of Normalized by Conditioned Area //---- Normalized by Total Area Sub-Table - tableBody = ""; - if (convBldgCondFloorArea > 0) { - for (iResource = 1; iResource <= 5; ++iResource) { - for (jEndUse = 1; jEndUse <= 14; ++jEndUse) { - tableBody(iResource, jEndUse) = RealToStr(useVal(iResource, jEndUse) / convBldgCondFloorArea, 2); + { + tableBody = ""; + Real64 convBldgGrossFloorArea = buildingGrossFloorArea / areaConversionFactor; + + if (convBldgGrossFloorArea > 0) { + for (iResource = 1; iResource <= 5; ++iResource) { + for (jEndUse = 1; jEndUse <= 14; ++jEndUse) { + tableBody(iResource, jEndUse) = RealToStr(useVal(iResource, jEndUse) / convBldgGrossFloorArea, 2); + } + tableBody(iResource, 16) = RealToStr(useVal(iResource, 15) / convBldgGrossFloorArea, 2); } - tableBody(iResource, 16) = RealToStr(useVal(iResource, 15) / convBldgCondFloorArea, 2); } - } - // heading for the entire sub-table - WriteSubtitle("Source Energy End Use Components Per Total Floor Area"); - WriteTable(tableBody, rowHead, columnHead, columnWidth); - if (sqlite) { - sqlite->createSQLiteTabularDataRecords(tableBody, - rowHead, - columnHead, - "SourceEnergyEndUseComponentsSummary", - "Entire Facility", - "Source Energy End Use Components Per Total Floor Area"); - } - if (ResultsFramework::OutputSchema->timeSeriesAndTabularEnabled()) { - ResultsFramework::OutputSchema->TabularReportsCollection.addReportTable(tableBody, - rowHead, - columnHead, - "Source Energy End Use Components Summary", - "Entire Facility", - "Source Energy End Use Components Per Total Floor Area"); - } - } + // heading for the entire sub-table + WriteSubtitle("Source Energy End Use Components Per Total Floor Area"); + WriteTable(tableBody, rowHead, columnHead, columnWidth); + if (sqlite) { + sqlite->createSQLiteTabularDataRecords(tableBody, + rowHead, + columnHead, + "SourceEnergyEndUseComponentsSummary", + "Entire Facility", + "Source Energy End Use Components Per Total Floor Area"); + } + if (ResultsFramework::OutputSchema->timeSeriesAndTabularEnabled()) { + ResultsFramework::OutputSchema->TabularReportsCollection.addReportTable(tableBody, + rowHead, + columnHead, + "Source Energy End Use Components Summary", + "Entire Facility", + "Source Energy End Use Components Per Total Floor Area"); + } + } // End of Normalized by Total Area + + } // end if displaySourceEnergyEndUseSummary } void WriteDemandEndUseSummary() diff --git a/src/EnergyPlus/PlantPipingSystemsManager.cc b/src/EnergyPlus/PlantPipingSystemsManager.cc index b4ac53f889c..b2a47a80fd4 100644 --- a/src/EnergyPlus/PlantPipingSystemsManager.cc +++ b/src/EnergyPlus/PlantPipingSystemsManager.cc @@ -946,6 +946,10 @@ namespace EnergyPlus { thisDomain.HorizInsMaterialNum).SpecHeat; thisDomain.HorizInsProperties.Conductivity = DataHeatBalance::Material( thisDomain.HorizInsMaterialNum).Conductivity; + if (SiteGroundDomainUsingNoMassMat(thisDomain.HorizInsThickness, thisDomain.HorizInsMaterialNum)) { + ErrorsFound = true; + SiteGroundDomainNoMassMatError(DataIPShortCuts::cAlphaFieldNames(8), DataIPShortCuts::cAlphaArgs(8), thisDomain.Name); + } } // Set flag for horizontal insulation extents @@ -999,6 +1003,10 @@ namespace EnergyPlus { thisDomain.VertInsMaterialNum).SpecHeat; thisDomain.VertInsProperties.Conductivity = DataHeatBalance::Material( thisDomain.VertInsMaterialNum).Conductivity; + if (SiteGroundDomainUsingNoMassMat(thisDomain.VertInsThickness, thisDomain.VertInsMaterialNum)) { + ErrorsFound = true; + SiteGroundDomainNoMassMatError(DataIPShortCuts::cAlphaFieldNames(11), DataIPShortCuts::cAlphaArgs(11), thisDomain.Name); + } } // vertical insulation depth @@ -1334,6 +1342,10 @@ namespace EnergyPlus { thisDomain.HorizInsMaterialNum).SpecHeat; thisDomain.HorizInsProperties.Conductivity = DataHeatBalance::Material( thisDomain.HorizInsMaterialNum).Conductivity; + if (SiteGroundDomainUsingNoMassMat(thisDomain.HorizInsThickness, thisDomain.HorizInsMaterialNum)) { + ErrorsFound = true; + SiteGroundDomainNoMassMatError(DataIPShortCuts::cAlphaFieldNames(6), DataIPShortCuts::cAlphaArgs(6), thisDomain.Name); + } } // Set flag for horizontal insulation extents @@ -1392,6 +1404,10 @@ namespace EnergyPlus { thisDomain.VertInsMaterialNum).SpecHeat; thisDomain.VertInsProperties.Conductivity = DataHeatBalance::Material( thisDomain.VertInsMaterialNum).Conductivity; + if (SiteGroundDomainUsingNoMassMat(thisDomain.VertInsThickness, thisDomain.VertInsMaterialNum)) { + ErrorsFound = true; + SiteGroundDomainNoMassMatError(DataIPShortCuts::cAlphaFieldNames(10), DataIPShortCuts::cAlphaArgs(10), thisDomain.Name); + } } } @@ -1457,6 +1473,29 @@ namespace EnergyPlus { } } + bool SiteGroundDomainUsingNoMassMat(Real64 const MaterialThickness, + int const MaterialNum) { + + if ( (MaterialThickness <= 0.0) || (DataHeatBalance::Material(MaterialNum).ROnly) ) { + return true; + } else { + return false; + } + + } + + void SiteGroundDomainNoMassMatError(std::string const &FieldName, + std::string const &UserInputField, + std::string const &ObjectName) { + + ShowSevereError("Invalid " + FieldName + "=" + UserInputField + " was found in: " + ObjectName); + ShowContinueError("The user of no mass materials or ones with no thickness are not allowed for the insulation fields of the following objects:"); + ShowContinueError(" " + ObjName_ZoneCoupled_Slab + " or " + ObjName_ZoneCoupled_Basement); + ShowContinueError("Change any insulation designations in these objects from no mass materials to regular materials that have a thickness, etc."); + + } + + void ReadPipeCircuitInputs(bool &ErrorsFound) { // SUBROUTINE INFORMATION: diff --git a/src/EnergyPlus/PlantPipingSystemsManager.hh b/src/EnergyPlus/PlantPipingSystemsManager.hh index 4787e95af1d..d413cfbd034 100644 --- a/src/EnergyPlus/PlantPipingSystemsManager.hh +++ b/src/EnergyPlus/PlantPipingSystemsManager.hh @@ -939,6 +939,13 @@ namespace EnergyPlus { void ReadZoneCoupledDomainInputs(int StartingDomainNumForZone, int NumZoneCoupledDomains, bool &ErrorsFound); void ReadBasementInputs(int StartingDomainNumForBasement, int NumBasements, bool &ErrorsFound); + + bool SiteGroundDomainUsingNoMassMat(Real64 const MaterialThickness, + int const MaterialNum); + + void SiteGroundDomainNoMassMatError(std::string const &FieldName, + std::string const &UserInputField, + std::string const &ObjectName); void ReadPipeCircuitInputs(bool &ErrorsFound); diff --git a/src/EnergyPlus/Psychrometrics.cc b/src/EnergyPlus/Psychrometrics.cc index 236a80349e6..c7cff6ff64f 100644 --- a/src/EnergyPlus/Psychrometrics.cc +++ b/src/EnergyPlus/Psychrometrics.cc @@ -1298,25 +1298,25 @@ namespace Psychrometrics { void PsyWFnTdpPb_error(Real64 const TDP, // dew-point temperature {C} Real64 const PB, // barometric pressure {Pascals} Real64 const W, // humidity ratio + Real64 const DeltaT, // Reduced temperature difference of dew point std::string const &CalledFrom // routine this function was called from (error messages) ) { - if (W <= -0.0001) { - if (!WarmupFlag) { - if (iPsyErrIndex(iPsyWFnTdpPb) == 0) { - String = " Dew-Point= " + TrimSigDigits(TDP, 2) + " Pressure= " + TrimSigDigits(PB, 2); - ShowWarningMessage("Calculated Humidity Ratio invalid (PsyWFnTdpPb)"); - if (!CalledFrom.empty()) { - ShowContinueErrorTimeStamp(" Routine=" + CalledFrom + ','); - } else { - ShowContinueErrorTimeStamp(" Routine=Unknown,"); - } - ShowContinueError(String); - String = "Calculated Humidity Ratio= " + TrimSigDigits(W, 4); - ShowContinueError(String + " ... Humidity Ratio set to .00001"); + if (!WarmupFlag) { + if (iPsyErrIndex(iPsyWFnTdpPb) == 0) { + String = " Dew-Point= " + TrimSigDigits(TDP, 2) + " Barometric Pressure= " + TrimSigDigits(PB, 2); + ShowWarningMessage("Calculated partial vapor pressure is greater than the barometric pressure, so that calculated humidity ratio is invalid (PsyWFnTdpPb)."); + if (!CalledFrom.empty()) { + ShowContinueErrorTimeStamp(" Routine=" + CalledFrom + ','); + } else { + ShowContinueErrorTimeStamp(" Routine=Unknown,"); } - ShowRecurringWarningErrorAtEnd("Entered Humidity Ratio invalid (PsyWFnTdpPb)", iPsyErrIndex(iPsyWFnTdpPb), W, W, _, "[]", "[]"); + ShowContinueError(String); + String = "Instead, calculated Humidity Ratio at " + TrimSigDigits(TDP - DeltaT, 1) + " (" + TrimSigDigits(DeltaT) + + " degree less) = " + TrimSigDigits(W, 4); + ShowContinueError(String + " will be used. Simulation continues."); } + ShowRecurringWarningErrorAtEnd("Entered Humidity Ratio invalid (PsyWFnTdpPb)", iPsyErrIndex(iPsyWFnTdpPb), W, W, _, "[]", "[]"); } } #endif diff --git a/src/EnergyPlus/Psychrometrics.hh b/src/EnergyPlus/Psychrometrics.hh index abad58c3851..355e9d34eb1 100644 --- a/src/EnergyPlus/Psychrometrics.hh +++ b/src/EnergyPlus/Psychrometrics.hh @@ -851,6 +851,7 @@ namespace Psychrometrics { void PsyWFnTdpPb_error(Real64 const TDP, // dew-point temperature {C} Real64 const PB, // barometric pressure {Pascals} Real64 const W, // humidity ratio + Real64 const DeltaT, // Reduced temperature difference of dew point std::string const &CalledFrom // routine this function was called from (error messages) ); #endif @@ -886,10 +887,20 @@ namespace Psychrometrics { // Validity test if (W < 0.0) { + Real64 DeltaT = 0.0; + Real64 PDEW1 = PDEW; + while (PDEW1 >= PB) { + DeltaT++; + PDEW1 = PsyPsatFnTemp(TDP - DeltaT, + (CalledFrom.empty() ? RoutineName : CalledFrom)); // saturation pressure at dew-point temperature {Pascals} + } + Real64 W1 = PDEW1 * 0.62198 / (PB - PDEW1); #ifdef EP_psych_errors - if (W <= -0.0001) PsyWFnTdpPb_error(TDP, PB, W, CalledFrom); + if (W <= -0.0001) { + PsyWFnTdpPb_error(TDP, PB, W1, DeltaT, CalledFrom); + } #endif - return 1.0e-5; + return W1; } else { return W; } @@ -1168,6 +1179,24 @@ namespace Psychrometrics { return 1000.1207 + 8.3215874e-04 * TB - 4.929976e-03 * pow_2(TB) + 8.4791863e-06 * pow_3(TB); } + inline Real64 PsyDeltaHSenFnTdb2W2Tdb1W1(Real64 const TDB2, // dry-bulb temperature at state 2 {C} + Real64 const dW2, // humidity ratio at at state 2 + Real64 const TDB1, // dry-bulb temperature at at state 1 {C} + Real64 const dW1 // humidity ratio at state 1 + ) + { + // returns sensible enthalpy difference of moist air going from state 1 to state 2 + Real64 dWavg = 0.5 * (max(dW2, 1.0e-5) + max(dW1, 1.0e-5)); + return (1.00484e3 + dWavg * 1.85895e3) * (TDB2 - TDB1); + } + + inline Real64 PsyHfgAvgFnTdb2Tdb1(Real64 const TDB2, // dry-bulb temperature at at state 2 {C} + Real64 const TDB1 // dry-bulb temperature at at state 1 {C} + ) + { + // calculate average latent heat of vaporization of water vapor in moist air + return (2.50094e6 + 0.5 * (TDB2 + TDB1) * 1.85895e3); + } } // namespace Psychrometrics } // namespace EnergyPlus diff --git a/src/EnergyPlus/PurchasedAirManager.cc b/src/EnergyPlus/PurchasedAirManager.cc index cb0f500cd1d..8204d0cf35a 100644 --- a/src/EnergyPlus/PurchasedAirManager.cc +++ b/src/EnergyPlus/PurchasedAirManager.cc @@ -1770,6 +1770,7 @@ namespace PurchasedAirManager { } } else { TempSize = PurchAir(PurchAirNum).MaxHeatSensCap; + ZoneEqSizing(CurZoneEqNum).OAVolFlow = FinalZoneSizing(CurZoneEqNum).MinOA; ZoneHeatingOnlyFan = true; PrintFlag = false; RequestSizing(CompType, CompName, SizingMethod, SizingString, TempSize, PrintFlag, RoutineName); @@ -1855,6 +1856,7 @@ namespace PurchasedAirManager { } } else { ZoneCoolingOnlyFan = true; + ZoneEqSizing(CurZoneEqNum).OAVolFlow = FinalZoneSizing(CurZoneEqNum).MinOA; PrintFlag = false; TempSize = PurchAir(PurchAirNum).MaxCoolTotCap; RequestSizing(CompType, CompName, SizingMethod, SizingString, TempSize, PrintFlag, RoutineName); diff --git a/src/EnergyPlus/SimAirServingZones.cc b/src/EnergyPlus/SimAirServingZones.cc index 1383a828333..2ab7bc52a06 100644 --- a/src/EnergyPlus/SimAirServingZones.cc +++ b/src/EnergyPlus/SimAirServingZones.cc @@ -3656,7 +3656,7 @@ namespace SimAirServingZones { // Evap Cooler Types for the air system simulation } else if (SELECT_CASE_var == EvapCooler) { // 'EvaporativeCooler:Direct:CelDekPad', 'EvaporativeCooler:Indirect:CelDekPad' // 'EvaporativeCooler:Indirect:WetCoil', 'EvaporativeCooler:Indirect:ResearchSpecial' - SimEvapCooler(CompName, CompIndex); + SimEvapCooler(CompName, CompIndex, AirLoopFlow(AirLoopNum).FanPLR); // Desiccant Dehumidifier Types for the air system simulation } else if (SELECT_CASE_var == Desiccant) { // 'Dehumidifier:Desiccant:NoFans', 'Dehumidifier:Desiccant:System' diff --git a/src/EnergyPlus/SolarShading.cc b/src/EnergyPlus/SolarShading.cc index 36b9001f72b..53bfbc63877 100644 --- a/src/EnergyPlus/SolarShading.cc +++ b/src/EnergyPlus/SolarShading.cc @@ -1316,24 +1316,30 @@ namespace SolarShading { NumOfLayers = Construct(Surface(SurfLoop).Construction).TotLayers; } for (I = 1; I <= NumOfLayers; ++I) { - SetupOutputVariable("Surface Window Total Absorbed Shortwave Radiation Rate Layer " + RoundSigDigits(I) + "", - OutputProcessor::Unit::W, - QRadSWwinAbsLayer(I, SurfLoop), - "Zone", - "Average", - Surface(SurfLoop).Name); - SetupOutputVariable("Surface Window Front Face Temperature Layer " + RoundSigDigits(I) + "", - OutputProcessor::Unit::C, - FenLaySurfTempFront(I, SurfLoop), - "Zone", - "Average", - Surface(SurfLoop).Name); - SetupOutputVariable("Surface Window Back Face Temperature Layer " + RoundSigDigits(I) + "", - OutputProcessor::Unit::C, - FenLaySurfTempBack(I, SurfLoop), - "Zone", - "Average", - Surface(SurfLoop).Name); + if (Construct(Surface(SurfLoop).Construction).WindowTypeBSDF) { + SetupOutputVariable("Surface Window Total Absorbed Shortwave Radiation Rate Layer " + RoundSigDigits(I) + "", + OutputProcessor::Unit::W, + QRadSWwinAbsLayer(I, SurfLoop), + "Zone", + "Average", + Surface(SurfLoop).Name); + } + if (Construct(Surface(SurfLoop).Construction).WindowTypeBSDF || (I == 1)) { + SetupOutputVariable("Surface Window Front Face Temperature Layer " + RoundSigDigits(I) + "", + OutputProcessor::Unit::C, + FenLaySurfTempFront(I, SurfLoop), + "Zone", + "Average", + Surface(SurfLoop).Name); + } + if (Construct(Surface(SurfLoop).Construction).WindowTypeBSDF || (I == NumOfLayers)) { + SetupOutputVariable("Surface Window Back Face Temperature Layer " + RoundSigDigits(I) + "", + OutputProcessor::Unit::C, + FenLaySurfTempBack(I, SurfLoop), + "Zone", + "Average", + Surface(SurfLoop).Name); + } } SetupOutputVariable("Surface Window Transmitted Solar Radiation Rate", diff --git a/src/EnergyPlus/StandardRatings.cc b/src/EnergyPlus/StandardRatings.cc index 933a59f1e56..7791d6cdd9e 100644 --- a/src/EnergyPlus/StandardRatings.cc +++ b/src/EnergyPlus/StandardRatings.cc @@ -226,6 +226,7 @@ namespace StandardRatings { int const EIRFTempCurveIndex, // Index for the energy input ratio modifier curve int const EIRFPLRCurveIndex, // Index for the EIR vs part-load ratio curve Real64 const MinUnloadRat, // Minimum unloading ratio + Real64 &IPLV, Optional EvapVolFlowRate, // Reference water volumetric flow rate through the evaporator [m3/s] Optional_int_const CondLoopNum, // condenser water plant loop index number Optional OpenMotorEff // Open chiller motor efficiency [fraction, 0 to 1] @@ -308,7 +309,6 @@ namespace StandardRatings { // to EnteringWaterTempReduced above [C] static Real64 Cp(0.0); // Water specific heat [J/(kg*C)] static Real64 Rho(0.0); // Water density [kg/m3] - static Real64 IPLV(0.0); // Integerated Part Load Value in SI [W/W] static Real64 EIR(0.0); // Inverse of COP at reduced capacity test conditions (100%, 75%, 50%, and 25%) static Real64 Power(0.0); // Power at reduced capacity test conditions (100%, 75%, 50%, and 25%) static Real64 COPReduced(0.0); // COP at reduced capacity test conditions (100%, 75%, 50%, and 25%) @@ -380,9 +380,10 @@ namespace StandardRatings { ChillerEIRFT = CurveValue(EIRFTempCurveIndex, EvapOutletTemp, CondenserInletTemp); - if (ReducedPLR(RedCapNum) >= MinUnloadRat) { - ChillerEIRFPLR = CurveValue(EIRFPLRCurveIndex, ReducedPLR(RedCapNum)); - PartLoadRatio = ReducedPLR(RedCapNum); + PartLoadRatio = ReducedPLR(RedCapNum) / ChillerCapFT; + + if (PartLoadRatio >= MinUnloadRat) { + ChillerEIRFPLR = CurveValue(EIRFPLRCurveIndex, PartLoadRatio); } else { ChillerEIRFPLR = CurveValue(EIRFPLRCurveIndex, MinUnloadRat); PartLoadRatio = MinUnloadRat; @@ -428,9 +429,10 @@ namespace StandardRatings { ChillerEIRFT = CurveValue(EIRFTempCurveIndex, EvapOutletTemp, CondenserOutletTemp); - if (ReducedPLR(RedCapNum) >= MinUnloadRat) { - ChillerEIRFPLR = CurveValue(EIRFPLRCurveIndex, CondenserOutletTemp, ReducedPLR(RedCapNum)); - PartLoadRatio = ReducedPLR(RedCapNum); + PartLoadRatio = ReducedPLR(RedCapNum) / ChillerCapFT; + + if (PartLoadRatio >= MinUnloadRat) { + ChillerEIRFPLR = CurveValue(EIRFPLRCurveIndex, CondenserOutletTemp, PartLoadRatio); } else { ChillerEIRFPLR = CurveValue(EIRFPLRCurveIndex, CondenserOutletTemp, MinUnloadRat); PartLoadRatio = MinUnloadRat; diff --git a/src/EnergyPlus/StandardRatings.hh b/src/EnergyPlus/StandardRatings.hh index aea784f070f..f63de5a2ff7 100644 --- a/src/EnergyPlus/StandardRatings.hh +++ b/src/EnergyPlus/StandardRatings.hh @@ -149,6 +149,7 @@ namespace StandardRatings { int const EIRFTempCurveIndex, // Index for the energy input ratio modifier curve int const EIRFPLRCurveIndex, // Index for the EIR vs part-load ratio curve Real64 const MinUnloadRat, // Minimum unloading ratio + Real64 &IPLV, Optional EvapVolFlowRate = _, // Reference water volumetric flow rate through the evaporator [m3/s] Optional_int_const CondLoopNum = _, // condenser water plant loop index number Optional OpenMotorEff = _ // Open chiller motor efficiency [fraction, 0 to 1] diff --git a/src/EnergyPlus/UnitarySystem.cc b/src/EnergyPlus/UnitarySystem.cc index 2e86c0484c0..af91f02dc1f 100644 --- a/src/EnergyPlus/UnitarySystem.cc +++ b/src/EnergyPlus/UnitarySystem.cc @@ -12853,7 +12853,7 @@ namespace UnitarySystems { if (this->m_FanOpMode == DataHVACGlobals::CycFanCycCoil) { DataAirLoop::AirLoopFlow(AirLoopNum).FanPLR = this->FanPartLoadRatio; } else { - DataAirLoop::AirLoopFlow(AirLoopNum).FanPLR = 0.0; + DataAirLoop::AirLoopFlow(AirLoopNum).FanPLR = 1.0; } } } diff --git a/src/EnergyPlus/WaterThermalTanks.cc b/src/EnergyPlus/WaterThermalTanks.cc index f32d6bdcbe9..f6d2024660c 100644 --- a/src/EnergyPlus/WaterThermalTanks.cc +++ b/src/EnergyPlus/WaterThermalTanks.cc @@ -7887,7 +7887,9 @@ namespace WaterThermalTanks { static std::string const RoutineName("CalcWaterThermalTankStratified"); const Real64 TemperatureConvergenceCriteria = 0.0001; - const Real64 maxDt = 60.0; + const Real64 SubTimestepMax = 60.0 * 10.0; // seconds + const Real64 SubTimestepMin = 10.0; // seconds + Real64 dt; // Using/Aliasing using DataGlobals::HourOfDay; @@ -7929,6 +7931,9 @@ namespace WaterThermalTanks { for (auto &e : Tank.Node) e.Temp = e.SavedTemp; + Tank.HeaterOn1 = Tank.SavedHeaterOn1; + Tank.HeaterOn2 = Tank.SavedHeaterOn2; + // Condenser configuration of heat pump water heater const int HPWHCondenserConfig = Tank.HeatPumpNum > 0 ? HPWaterHeater(Tank.HeatPumpNum).TypeNum : 0; @@ -8003,8 +8008,15 @@ namespace WaterThermalTanks { std::vector Tavg; Tavg.resize(nTankNodes); + int SubTimestepCount = 0; + while(TimeRemaining > 0.0) { + ++SubTimestepCount; + + bool PrevHeaterOn1 = Tank.HeaterOn1; + bool PrevHeaterOn2 = Tank.HeaterOn2; + if (Tank.InletMode == InletModeSeeking) CalcNodeMassFlows(WaterThermalTankNum, InletModeSeeking); // Heater control logic @@ -8065,8 +8077,95 @@ namespace WaterThermalTanks { } } - // Determine the internal time step - Real64 dt = min(TimeRemaining, maxDt); + if (SubTimestepCount == 1) { + dt = SubTimestepMin; + } else { + + // Set the maximum tank temperature change allowed + Real64 dT_max = std::numeric_limits::max(); + if (Tank.HeaterOn1) { + if (Tank.Node(Tank.HeaterNode1).Temp < Tank.SetPointTemp) { + // Node temperature is less than setpoint and heater is on + dT_max = min(dT_max, Tank.SetPointTemp - Tank.Node(Tank.HeaterNode1).Temp); + } else { + // Node temperature is greater than or equal to setpoint and heater is on + // Heater will turn off next time around, calculate assuming that + dT_max = min(dT_max, Tank.Node(Tank.HeaterNode1).Temp - MinTemp1); + } + } else { // Heater off + if (Tank.Node(Tank.HeaterNode1).Temp >= MinTemp1) { + // Node temperature is greater than or equal to cut in temperature and heater is off + dT_max = min(dT_max, Tank.Node(Tank.HeaterNode1).Temp - MinTemp1); + } else { + // Heater will turn on next time around, calculate to setpoint + dT_max = min(dT_max, Tank.SetPointTemp - Tank.Node(Tank.HeaterNode1).Temp); + } + } + if (Tank.HeaterOn2) { + if (Tank.Node(Tank.HeaterNode2).Temp < Tank.SetPointTemp2) { + // Node temperature is less than setpoint and heater is on + dT_max = min(dT_max, Tank.SetPointTemp2 - Tank.Node(Tank.HeaterNode2).Temp); + } else { + // Node temperature is greater than or equal to setpoint and heater is on + // Heater will turn off next time around, calculate assuming that + dT_max = min(dT_max, Tank.Node(Tank.HeaterNode2).Temp - MinTemp2); + } + } else { // Heater off + if (Tank.Node(Tank.HeaterNode2).Temp >= MinTemp2) { + // Node temperature is greater than or equal to cut in temperature and heater is off + dT_max = min(dT_max, Tank.Node(Tank.HeaterNode2).Temp - MinTemp2); + } else { + // Heater will turn on next time around, calculate to setpoint + dT_max = min(dT_max, Tank.SetPointTemp2 - Tank.Node(Tank.HeaterNode2).Temp); + } + } + + // Make adjustments to A and B to account for heaters being on or off now + if (Tank.HeaterOn1 and !PrevHeaterOn1) { + // If heater 1 is on now and wasn't before add the heat rate to the B term + B[Tank.HeaterNode1 - 1] += Qheater1 / (Tank.Node(Tank.HeaterNode1).Mass * Cp); + } else if (!Tank.HeaterOn1 and PrevHeaterOn1) { + // If heater 1 is off now and was on before, remove the heat rate from the B term + B[Tank.HeaterNode1 - 1] -= Tank.MaxCapacity / (Tank.Node(Tank.HeaterNode1).Mass * Cp); + } + if (Tank.HeaterOn2 and !PrevHeaterOn2) { + // If heater 2 is on now and wasn't before add the heat rate to the B term + B[Tank.HeaterNode2 - 1] += Qheater2 / (Tank.Node(Tank.HeaterNode2).Mass * Cp); + } else if (!Tank.HeaterOn2 and PrevHeaterOn2) { + // If heater 1 is off now and was on before, remove the heat rate from the B term + B[Tank.HeaterNode2 - 1] -= Tank.MaxCapacity / (Tank.Node(Tank.HeaterNode2).Mass * Cp); + } + + if ((Tank.HeaterOn1 || Tank.HeaterOn2) and !(PrevHeaterOn1 || PrevHeaterOn2)) { + // Remove off cycle loads + // Apply on cycle loads + for (int i = 0; i < nTankNodes; i++) { + auto &node(Tank.Node[i]); + Real64 NodeCapacitance = node.Mass * Cp; + A[i] += (node.OffCycLossCoeff - node.OnCycLossCoeff) / NodeCapacitance; + B[i] += (- node.OffCycParaLoad + node.OnCycParaLoad + (node.OnCycLossCoeff - node.OffCycLossCoeff) * Tank.AmbientTemp) / NodeCapacitance; + } + } else if (!(Tank.HeaterOn1 || Tank.HeaterOn2) and (PrevHeaterOn1 || PrevHeaterOn2)) { + // Remove on cycle loads + // Apply off cycle loads + for (int i = 0; i < nTankNodes; i++) { + auto &node(Tank.Node[i]); + Real64 NodeCapacitance = node.Mass * Cp; + A[i] -= (node.OffCycLossCoeff - node.OnCycLossCoeff) / NodeCapacitance; + B[i] -= (- node.OffCycParaLoad + node.OnCycParaLoad + (node.OnCycLossCoeff - node.OffCycLossCoeff) * Tank.AmbientTemp) / NodeCapacitance; + } + } + + // Set the sub timestep (dt) + dt = TimeRemaining; + for (int i = 0; i < nTankNodes; ++i) { + const Real64 Denominator = fabs(A[i] * Tavg[i] + B[i]); + if (Denominator != 0.0) + dt = min(dt, dT_max / Denominator); + } + dt = max(min(SubTimestepMin, TimeRemaining), dt); + dt = min(SubTimestepMax, dt); + } // Make initial guess that average and final temperatures over the timestep are equal to the starting temperatures for (int i = 0; i < nTankNodes; i++) { diff --git a/src/EnergyPlus/WeatherManager.cc b/src/EnergyPlus/WeatherManager.cc index 95a58cf6fc1..5f238b19b86 100644 --- a/src/EnergyPlus/WeatherManager.cc +++ b/src/EnergyPlus/WeatherManager.cc @@ -4612,7 +4612,12 @@ namespace WeatherManager { auto const SELECT_CASE_var(DesDayInput(EnvrnNum).SolarModel); if (SELECT_CASE_var == ASHRAE_ClearSky) { - TotHoriz = DesDayInput(EnvrnNum).SkyClear * A * (C + CosZenith) * std::exp(-B / CosZenith); + Real64 Exponent = B / CosZenith; + if (Exponent > 700.0) { + TotHoriz = 0.0; + } else { + TotHoriz = DesDayInput(EnvrnNum).SkyClear * A * (C + CosZenith) * std::exp(-B / CosZenith); + } HO = GlobalSolarConstant * AVSC * CosZenith; KT = TotHoriz / HO; KT = min(KT, 0.75); diff --git a/src/EnergyPlus/WindowEquivalentLayer.cc b/src/EnergyPlus/WindowEquivalentLayer.cc index cc2cc7540ca..ecf6c81fe04 100644 --- a/src/EnergyPlus/WindowEquivalentLayer.cc +++ b/src/EnergyPlus/WindowEquivalentLayer.cc @@ -444,6 +444,9 @@ namespace WindowEquivalentLayer { CalcEQLWindowStandardRatings(ConstrNum); if (CFSHasControlledShade(CFS(EQLNum)) > 0) CFS(EQLNum).ISControlled = true; // is controlled + + // set internal face emissivity + Construct(ConstrNum).InsideAbsorpThermal = EffectiveEPSLB(CFS(EQLNum)); } void CalcEQLWindowUvalue(CFSTY const &FS, // CFS to be calculated @@ -550,7 +553,7 @@ namespace WindowEquivalentLayer { UNFRC = U; } - void CalcEQLWindowSHGCAndTransNormal(CFSTY &FS, // fenestration system + void CalcEQLWindowSHGCAndTransNormal(CFSTY const &FS, // fenestration system Real64 &SHGCSummer, // solar heat gain coefficient Real64 &TransNormal // transmittance at normal incidence ) @@ -647,26 +650,26 @@ namespace WindowEquivalentLayer { TransNormal = Abs1(1, NL + 1); // Calculate SHGC using net radiation method (ASHWAT Model) - CFSSHGC = ASHWAT_Thermal(FS, - TIN, - TOUT, - HCIN, - HCOUT, - TRMOUT, - TRMIN, - BeamSolarInc, - BeamSolarInc * Abs1(1, {1, NL + 1}), - TOL, - QOCF, - QOCFRoom, - T, - Q, - JF, - JB, - H, - UCG, - SHGC, - true); + CFSSHGC = ASHWAT_ThermalRatings(FS, + TIN, + TOUT, + HCIN, + HCOUT, + TRMOUT, + TRMIN, + BeamSolarInc, + BeamSolarInc * Abs1(1, {1, NL + 1}), + TOL, + QOCF, + QOCFRoom, + T, + Q, + JF, + JB, + H, + UCG, + SHGC, + true); if (!CFSSHGC) { ShowWarningMessage(RoutineName + "Solar heat gain coefficient calculation failed for " + FS.Name); @@ -822,9 +825,6 @@ namespace WindowEquivalentLayer { Real64 TRMIN; Real64 Tout(0); Real64 TRMOUT; - Real64 UCG; - Real64 SHGC; - Real64 QRLWX; Real64 QCONV; Array1D QOCF(CFSMAXNL); Real64 QOCFRoom; @@ -835,10 +835,9 @@ namespace WindowEquivalentLayer { Array1D H({0, CFSMAXNL + 1}); Array1D QAllSWwinAbs({1, CFSMAXNL + 1}); - bool ASHWAT_ThermalR; // net long wave radiation flux on the inside face of window - int EQLNum; // equivalent layer window index - int ZoneNum; // Zone number corresponding to SurfNum - int ConstrNum; // Construction number + int EQLNum; // equivalent layer window index + int ZoneNum; // Zone number corresponding to SurfNum + int ConstrNum; // Construction number int ZoneEquipConfigNum; int NodeNum; @@ -1025,12 +1024,11 @@ namespace WindowEquivalentLayer { QAllSWwinAbs({1, NL + 1}) = QRadSWwinAbs({1, NL + 1}, SurfNum); // Solve energy balance(s) for temperature at each node/layer and // heat flux, including components, between each pair of nodes/layers - ASHWAT_ThermalR = ASHWAT_Thermal( - CFS(EQLNum), TIN, Tout, HcIn, HcOut, TRMOUT, TRMIN, 0.0, QAllSWwinAbs({1, NL + 1}), TOL, QOCF, QOCFRoom, T, Q, JF, JB, H, UCG, SHGC); - // long wave radiant power to room not including reflected - QRLWX = JB(NL) - (1.0 - LWAbsIn) * JF(NL + 1); - // nominal surface temp = effective radiant temperature - SurfInsideTemp = TRadC(QRLWX, LWAbsIn); + ASHWAT_ThermalCalc(CFS(EQLNum), TIN, Tout, HcIn, HcOut, TRMOUT, TRMIN, QAllSWwinAbs({1, NL + 1}), TOL, QOCF, QOCFRoom, T, Q, JF, JB, H); + + // effective surface temperature is set to surface temperature calculated + // by the fenestration layers temperature solver + SurfInsideTemp = T(NL) - KelvinConv; // Convective to room QCONV = H(NL) * (T(NL) - TIN); // Other convective = total conv - standard model prediction @@ -5006,26 +5004,484 @@ namespace WindowEquivalentLayer { } } - bool ASHWAT_Thermal(CFSTY const &FS, // fenestration system - Real64 const TIN, // indoor / outdoor air temperature, K - Real64 const TOUT, - Real64 const HCIN, // indoor / outdoor convective heat transfer - Real64 const HCOUT, - Real64 const TRMOUT, - Real64 const TRMIN, // indoor / outdoor mean radiant temp, K - Real64 const ISOL, // total incident solar, W/m2 (values used for SOURCE derivation) - Array1S const SOURCE, // absorbed solar by layer, W/m2 - Real64 const TOL, // convergence tolerance, usually - Array1A QOCF, // returned: heat flux to layer i from gaps i-1 and i - Real64 &QOCFRoom, // returned: open channel heat gain to room, W/m2 - Array1A T, // returned: layer temperatures, 1=outside-most layer, K - Array1 &Q, // returned: heat flux at ith gap (betw layers i and i+1), W/m2 - Array1A JF, // returned: front (outside facing) radiosity of surfaces, W/m2 - Array1A JB, // returned: back (inside facing) radiosity, W/m2 - Array1A HC, // returned: gap convective heat transfer coefficient, W/m2K - Real64 &UCG, // returned: center-glass U-factor, W/m2-K - Real64 &SHGC, // returned: center-glass SHGC (Solar Heat Gain Coefficient) - Optional_bool_const HCInFlag // If true uses ISO Std 150099 routine for HCIn calc + void ASHWAT_ThermalCalc(CFSTY &FS, // fenestration system + Real64 const TIN, // indoor / outdoor air temperature, K + Real64 const TOUT, + Real64 const HCIN, // indoor / outdoor convective heat transfer + Real64 const HCOUT, + Real64 const TRMOUT, + Real64 const TRMIN, // indoor / outdoor mean radiant temp, K + Array1S const SOURCE, // absorbed solar by layer, W/m2 + Real64 const TOL, // convergence tolerance, usually + Array1A QOCF, // returned: heat flux to layer i from gaps i-1 and i + Real64 &QOCFRoom, // returned: open channel heat gain to room, W/m2 + Array1A T, // returned: layer temperatures, 1=outside-most layer, K + Array1 &Q, // returned: heat flux at ith gap (betw layers i and i+1), W/m2 + Array1A JF, // returned: front (outside facing) radiosity of surfaces, W/m2 + Array1A JB, // returned: back (inside facing) radiosity, W/m2 + Array1A HC // returned: gap convective heat transfer coefficient, W/m2K + ) + { + // SUBROUTINE INFORMATION: + // AUTHOR JOHN L. WRIGHT (University of Waterloo, Mechanical Engineering) + // Chip Barnaby (WrightSoft) + // DATE WRITTEN LATEST MODIFICATIONS, February 2008 + // MODIFIED Bereket Nigusse, June 2013 + // added standard 155099 inside convection + // coefficient calculation for U-Factor + // RE-ENGINEERED na + + // PURPOSE OF THIS SUBROUTINE: + // Subroutine to calculate the glazing temperatures of the + // various elements of a window/shade array while solving an energy + // balance which accounts for absorbed solar radiation, indoor- + // outdoor temperature difference, any combination of hemispherical + // IR optical properties of the various glazings/shading layers. + // Mean radiant temperatures can differ from air temperature on + // both the indoor and outdoor sides. + // It is also possible to allow air-flow between the two layers + // adjacent to the indoor side and/or the two layers adjacent the + // outdoor side. U-factor and SHGC calculations are also included (optional) + + // METHODOLOGY EMPLOYED: + // Uses the net radiation method developed for ASHWAT fenestration + // model by John Wright, the University of WaterLoo + + // REFERENCES: + // ASHRAE RP-1311 + + // USE STATEMENTS: + // na + + // Argument array dimensioning + QOCF.dim(FS.NL); + T.dim(FS.NL); + JF.dim(FS.NL + 1); + JB.dim({0, FS.NL}); + HC.dim({0, FS.NL}); + + // Locals + // FUNCTION ARGUMENT DEFINITIONS: + // FS.NL determines # of layers modelled + // coefficient, W/m2K + // = outside direct + outside diffuse + inside diffuse + // 0.001 (good) or 0.0001 (tight) + // due to open channel flow, W/m2 + // + = heat flow indoor to outdoor + // JF( NL+1) = room radiosity + // JB( 0) = outside environment radiosity + // 0=outside, 1=betw layer 1-2, ..., NL=inside + + // FUNCTION PARAMETER DEFINITIONS: + int const MaxIter(100); // maximum number of iterations allowed + static std::string const RoutineName("ASHWAT_ThermalCalc: "); + // INTERFACE BLOCK SPECIFICATIONS + // na + + // DERIVED TYPE DEFINITIONS + // na + + // FUNCTION LOCAL VARIABLE DECLARATIONS: + Real64 ALPHA; + Real64 HCOCFout; + Array2D A(3 * FS.NL + 4, 3 * FS.NL + 2); + Array1D XSOL(3 * FS.NL + 2); + Real64 MAXERR; + Array1D TNEW(FS.NL); // latest estimate of layer temperatures, K + Array1D EB({0, FS.NL + 1}); // black emissive power by layer, W/m2 + // EB( 0) = outdoor environment, EB( NL+1) = indoor environment + Array1D HHAT({0, FS.NL}); // convective heat transfer coefficient (W/m2.K4) + // based on EB, NOT temperature difference + Real64 RHOF_ROOM; // effective longwave room-side properties + Real64 TAU_ROOM; + Real64 EPSF_ROOM; + Real64 RHOB_OUT; // effective longwave outdoor environment properties + Real64 TAU_OUT; + Real64 EPSB_OUT; + Array1D QNET(FS.NL); // checksum - net heat flux to a layer - should be zero - not needed + int ADIM; // dimension of the A matrix + int CONVRG; + int NL; + int I; + int J; + int L; + int ITRY; + int hin_scheme; // flags different schemes for indoor convection coefficients + Array1D_int ISDL({0, FS.NL + 1}); // Flag to mark diathermanous layers, 0=opaque + Array1D QOCF_F(FS.NL); // heat flux to outdoor-facing surface of layer i, from gap i-1, + // due to open channel flow, W/m2 + Array1D QOCF_B(FS.NL); // heat flux to indoor-facing surface of layer i, from gap i, + // due to open channel flow, W/m2 + Array1D HR({0, FS.NL}); // Radiant heat transfer coefficient [W/m2K] + Array1D HJR(FS.NL); // radiative and convective jump heat transfer coefficients + Array1D HJC(FS.NL); + Array1D RHOF({0, FS.NL + 1}); // longwave reflectance, front ! these variables help simplify + Array1D RHOB({0, FS.NL + 1}); // longwave reflectance, back ! the code because it is useful to + Array1D EPSF({0, FS.NL + 1}); // longwave emisivity, front ! increase the scope of the arrays + Array1D EPSB({0, FS.NL + 1}); // longwave emisivity, back ! to include indoor and outdoor + Array1D TAU({0, FS.NL + 1}); // longwave transmittance ! nodes - more general + Array2D HC2D(6, 6); // convective heat transfer coefficients between layers i and j + Array2D HR2D(6, 6); // radiant heat transfer coefficients between layers i and j + Array1D HCIout(6); // convective and radiant heat transfer coefficients between + Array1D HRIout(6); + // layer i and outdoor air or mean radiant temperature, resp. + Array1D HCIin(6); // convective and radiant heat transfer coefficients between + Array1D HRIin(6); + // layer i and indoor air or mean radiant temperature, resp. + // Indoor side convection coefficients - used for Open Channel Flow on indoor side + Real64 HFS; // nominal height of fen system (assumed 1 m) + Real64 TOC_EFF; // effective thickness of open channel, m + Real64 ConvF; // convection factor: accounts for enhanced convection + // for e.g. VB adjacent to open channel + Real64 HC_GA; // convection - glass to air + Real64 HC_SA; // convection - shade (both sides) to air + Real64 HC_GS; // convection - glass to shade (one side) + Array1D SOURCEdv(FS.NL + 1); // indices of merit + Real64 QGAIN; // total gain to conditioned space [[W/m2] + // Flow + + NL = FS.NL; // working copy + if (NL < 1) return; + + HCOCFout = HCOUT; // outdoor side + + HHAT = 0.0; + HC = 0.0; + HR = 0.0; + T = 0.0; + TNEW = 0.0; + EB = 0.0; + JF = 0.0; + JB = 0.0; + Q = 0.0; + QOCF_F = 0.0; + QOCF_B = 0.0; + QOCF = 0.0; + QOCFRoom = 0.0; + QNET = 0.0; + QGAIN = 0.0; + TAU = 0.0; + RHOF = 0.0; + RHOB = 0.0; + EPSF = 0.0; + EPSB = 0.0; + HC_GA = 0.0; + HC_SA = 0.0; + HC_GS = 0.0; + + ITRY = 0; + + EB(0) = StefanBoltzmann * pow_4(TOUT); + EB(NL + 1) = StefanBoltzmann * pow_4(TIN); + + ADIM = 3 * NL + 2; // DIMENSION OF A-MATRIX + + // organize longwave radiant properties - book-keeping + + TAU_ROOM = 0.0; // must always be zero + RHOF_ROOM = 0.0; // almost always zero + EPSF_ROOM = 1.0 - TAU_ROOM - RHOF_ROOM; // almost always unity + RHOF(NL + 1) = RHOF_ROOM; + EPSF(NL + 1) = EPSF_ROOM; + TAU(NL + 1) = TAU_ROOM; + + for (I = 1; I <= NL; ++I) { + EPSF(I) = FS.L(I).LWP_EL.EPSLF; + EPSB(I) = FS.L(I).LWP_EL.EPSLB; + TAU(I) = FS.L(I).LWP_EL.TAUL; + RHOF(I) = 1.0 - FS.L(I).LWP_EL.EPSLF - FS.L(I).LWP_EL.TAUL; + RHOB(I) = 1.0 - FS.L(I).LWP_EL.EPSLB - FS.L(I).LWP_EL.TAUL; + } + + TAU_OUT = 0.0; // must always be zero + RHOB_OUT = 0.0; // DON'T CHANGE + EPSB_OUT = 1.0 - TAU_OUT - RHOB_OUT; // should always be unity + TAU(0) = TAU_OUT; + EPSB(0) = EPSB_OUT; + RHOB(0) = RHOB_OUT; + + // Later could add RHOF_ROOM to the parameter list + // Relaxation needed to keep solver stable if OCF is present + + ALPHA = 1.0; + if (NL >= 2) { + if (FS.G(NL - 1).GTYPE == gtyOPENin) ALPHA = 0.5; + if (FS.G(1).GTYPE == gtyOPENout) ALPHA = 0.10; + } + + // FIRST ESTIMATE OF GLAZING TEMPERATURES AND BLACK EMISSIVE POWERS + for (I = 1; I <= NL; ++I) { + T(I) = TOUT + double(I) / double(NL + 1) * (TIN - TOUT); + EB(I) = StefanBoltzmann * pow_4(T(I)); + } + + CONVRG = 0; + + // Start the solver + // ITERATION RE-ENTRY + + Real64 const TIN_2(pow_2(TIN)); + Real64 const TOUT_2(pow_2(TOUT)); + Real64 const TRMOUT_4(pow_4(TRMOUT)); + Real64 const TRMIN_4(pow_4(TRMIN)); + + for (ITRY = 1; ITRY <= MaxIter; ++ITRY) { + + // CALCULATE GAS LAYER CONVECTIVE HEAT TRANSFER COEFFICIENTS + + hin_scheme = 3; // different schemes for calculating convection + // coefficients glass-to-air and shade-to-air + // if open channel air flow is allowed + // see the corresponding subroutines for detail + // = 1 gives dependence of height, spacing, delta-T + // = 2 gives dependence of spacing, delta-T but + // returns unrealistic values for large spacing + // = 3 glass-shade spacing dependence only on HCIN + // = negative, applies HCIN without adjusting for + // temperature, height, spacing, slat angle + // Recommended -> hin_scheme=3 for use with HBX, + // simplicity, right trends wrt spacing + + // start by assuming no open channel flow on indoor side + + HC(NL) = HCIN; // default - HC(NL) supplied by calling routine + // use this for HBX + // or + // trigger calculation of HC(NL) using ASHRAE correlation + // HC(NL) = HIC_ASHRAE(1.0d0, T(NL), TIN) ! h - flat plate + // Add by BAN June 2013 for standard ratings U-value and SHGC calc only + // if (present(HCInFlag)) { + // if (HCInFlag) HC(NL) = HCInWindowStandardRatings(Height, T(NL), TIN); + // } + HC(0) = HCOUT; // HC(0) supplied by calling routine as HCOUT + + // Check for open channels - only possible with at least two layers + if (NL >= 2) { + for (I = 1; I <= NL - 1; ++I) { // Scan gaps between layers + + // DEAL WITH INDOOR OPEN CHANNEL FLOW HERE + if ((I == NL - 1) && (FS.G(I).GTYPE == gtyOPENin)) { + + // TOC_EFF = FS%G( I)%TAS_EFF / 1000. ! effective thickness of OC gap, m + TOC_EFF = FS.G(I).TAS_EFF; // effective thickness of OC gap, m Modified by BAN May 9, 2013 + HFS = 1.0; // nominal height of system (m) + + // convection - glass to air + GLtoAMB(TOC_EFF, HFS, T(NL - 1), TIN, HCIN, HC_GA, hin_scheme); + // CALL GLtoAMB( 1.0, HFS, T( NL-1), TIN, HCIN, HC_GA, hin_scheme) + // ^ VERY WIDE GAP + + // convection - shade (both sides) to air + ConvF = ConvectionFactor(FS.L(I + 1)); + HC_SA = ConvF * SLtoAMB(TOC_EFF, HFS, T(NL), TIN, HCIN, hin_scheme); + // HC_SA = ConvF * SLtoAMB( 1.0, HFS, T(NL), TIN, HCIN, hin_scheme) + // ^ VERY WIDE GAP + + // convection - glass to shade (one side) + SLtoGL(TOC_EFF, T(NL), T(NL - 1), HC_GS, 1); + // CALL SLtoGL( 1.0, T(NL), T(NL-1), HC_GS, 2) ! REMOVE LATER + // ^ VERY WIDE GAP, should return near zero + // Don't use hin_scheme as last parameter - set manually + // 1 = Conduction, 2 = slight Ra penalty + // Set negative for default HC_GS=0 + // Recommended: 2 + HC(NL - 1) = HC_GS; + HC(NL) = HCIN * ConvF; + QOCF_B(NL - 1) = (TIN - T(NL - 1)) * HC_GA; + QOCF_F(NL) = (TIN - T(NL)) * (HC_SA - HC(NL)); + QOCFRoom = -QOCF_B(NL - 1) - QOCF_F(NL); + // end of gap open to indoor side + + } else if ((I == 1) && (FS.G(I).GTYPE == gtyOPENout)) { + // outdoor open channel + QOCF_B(1) = (TOUT - T(1)) * HCOCFout; + QOCF_F(2) = (TOUT - T(2)) * HCOCFout; + HC(1) = 0.0; + HC(0) = HCOCFout; + } else { + // normal gap + HC(I) = HConvGap(FS.G(I), T(I), T(I + 1)); + } + } // end scan through gaps + + // total OCF gain to each layer + QOCF = QOCF_F + QOCF_B; + + } // end IF (NL .GE. 2) + + // CONVERT TEMPERATURE POTENTIAL CONVECTIVE COEFFICIENTS to + // BLACK EMISSIVE POWER POTENTIAL CONVECTIVE COEFFICIENTS + + HHAT(0) = HC(0) * (1.0 / StefanBoltzmann) / ((TOUT_2 + pow_2(T(1))) * (TOUT + T(1))); + + Real64 T_I_2(pow_2(T(1))), T_IP_2; + for (I = 1; I <= NL - 1; ++I) { // Scan the cavities + T_IP_2 = pow_2(T(I + 1)); + HHAT(I) = HC(I) * (1.0 / StefanBoltzmann) / ((T_I_2 + T_IP_2) * (T(I) + T(I + 1))); + T_I_2 = T_IP_2; + } + + HHAT(NL) = HC(NL) * (1.0 / StefanBoltzmann) / ((pow_2(T(NL)) + TIN_2) * (T(NL) + TIN)); + + // SET UP MATRIX + XSOL = 0.0; + A = 0.0; + + L = 1; + A(1, L) = 1.0; + A(2, L) = -1.0 * RHOB(0); // -1.0 * RHOB_OUT + A(ADIM + 1, L) = EPSB_OUT * StefanBoltzmann * TRMOUT_4; + + for (I = 1; I <= NL; ++I) { + L = 3 * I - 1; + A(3 * I - 2, L) = RHOF(I); + A(3 * I - 1, L) = -1.0; + A(3 * I, L) = EPSF(I); // LWP( I)%EPSLF + A(3 * I + 2, L) = TAU(I); // LWP( I)%TAUL + A(ADIM + 1, L) = 0.0; + + L = 3 * I; + if (NL == 1) { + A(1, L) = 1.0; // Single layer + A(2, L) = -1.0; + A(3, L) = -1.0 * (HHAT(0) + HHAT(1)); + A(4, L) = -1.0; + A(5, L) = 1.0; + A(ADIM + 1, L) = -1.0 * (HHAT(0) * EB(0) + HHAT(1) * EB(2) + SOURCE(1) + QOCF(1)); + } else if (I == 1) { + A(1, L) = 1.0; // Outdoor layer + A(2, L) = -1.0; + A(3, L) = -1.0 * (HHAT(0) + HHAT(1)); + A(4, L) = -1.0; + A(5, L) = 1.0; + A(6, L) = HHAT(1); + A(ADIM + 1, L) = -1.0 * (HHAT(0) * EB(0) + SOURCE(1) + QOCF(1)); + } else if (I == NL) { + A(3 * NL - 3, L) = HHAT(NL - 1); // Indoor layer + A(3 * NL - 2, L) = 1.0; + A(3 * NL - 1, L) = -1.0; + A(3 * NL, L) = -1.0 * (HHAT(NL) + HHAT(NL - 1)); + A(3 * NL + 1, L) = -1.0; + A(3 * NL + 2, L) = 1.0; + A(ADIM + 1, L) = -1.0 * (HHAT(NL) * EB(NL + 1) + SOURCE(NL) + QOCF(NL)); + } else { + A(3 * I - 3, L) = HHAT(I - 1); + A(3 * I - 2, L) = 1.0; + A(3 * I - 1, L) = -1.0; + A(3 * I, L) = -1.0 * (HHAT(I) + HHAT(I - 1)); + A(3 * I + 1, L) = -1.0; + A(3 * I + 2, L) = 1.0; + A(3 * I + 3, L) = HHAT(I); + A(ADIM + 1, L) = -1.0 * (SOURCE(I) + QOCF(I)); + } + L = 3 * I + 1; + A(3 * I - 2, L) = TAU(I); // LWP( I)%TAUL + A(3 * I, L) = EPSB(I); // LWP( I)%EPSLB + A(3 * I + 1, L) = -1.0; + A(3 * I + 2, L) = RHOB(I); + A(ADIM + 1, L) = 0.0; + } + + L = 3 * NL + 2; + A(3 * NL + 1, L) = -1.0 * RHOF(NL + 1); // - 1.0 * RHOF_ROOM + A(3 * NL + 2, L) = 1.0; + A(ADIM + 1, L) = EPSF_ROOM * StefanBoltzmann * TRMIN_4; + + // SOLVE MATRIX + // Call SOLMATS for single precision matrix solution + SOLMATS(ADIM, A, XSOL); + + // UNPACK SOLUTION VECTOR AND RECORD LARGEST TEMPERATURE CHANGE + JB(0) = XSOL(1); + + MAXERR = 0.0; + for (I = 1; I <= NL; ++I) { + J = 3 * I - 1; + JF(I) = XSOL(J); + ++J; + EB(I) = max(1.0, XSOL(J)); // prevent impossible temps + TNEW(I) = root_4(EB(I) / StefanBoltzmann); + ++J; + JB(I) = XSOL(J); + MAXERR = max(MAXERR, std::abs(TNEW(I) - T(I)) / TNEW(I)); + } + + JF(NL + 1) = XSOL(ADIM); + + // CALCULATE HEAT FLUX AT EACH GAP, Q + for (I = 0; I <= NL; ++I) { // Loop gaps (including inside and outside + Q(I) = JF(I + 1) - JB(I) + HHAT(I) * (EB(I + 1) - EB(I)); + } + + // A CHECK - NET HEAT FLUX INTO ANY LAYER, AT STEADY-STATE, + // SHOULD BE ZERO + for (I = 1; I <= NL; ++I) { + QNET(I) = SOURCE(I) + QOCF(I) + Q(I) - Q(I - 1); + } + + // UPDATE GLAZING TEMPERATURES AND BLACK EMISSIVE POWERS + for (I = 1; I <= NL; ++I) { + T(I) += ALPHA * (TNEW(I) - T(I)); + EB(I) = StefanBoltzmann * pow_4(T(I)); + } + + // CHECK FOR CONVERGENCE + if (CONVRG > 0) break; + if (MAXERR < TOL) ++CONVRG; + + } // main iteration + + if (CONVRG == 0) { + + if (FS.WEQLSolverErrorIndex < 1) { + ++FS.WEQLSolverErrorIndex; + ShowSevereError("CONSTRUCTION:WINDOWEQUIVALENTLAYER = \"" + FS.Name + "\""); + ShowContinueError(RoutineName + "Net radiation analysis did not converge"); + ShowContinueError("...Maximum error is = " + TrimSigDigits(MAXERR, 6)); + ShowContinueError("...Convergence tolerance is = " + TrimSigDigits(TOL, 6)); + ShowContinueErrorTimeStamp(""); + } else { + ShowRecurringWarningErrorAtEnd("CONSTRUCTION:WINDOWEQUIVALENTLAYER = \"" + FS.Name + "\"; " + RoutineName + + "Net radiation analysis did not converge error continues.", + FS.WEQLSolverErrorIndex); + } + } + + // NOTE: HC_SA, HC_GA and HC_SG are only available if there is + // an open channel on the indoor side and the calculation of + // these coefficients was triggered earlier + QGAIN = SOURCE(NL + 1) + HC(NL) * (T(NL) - TIN) + JB(NL) - JF(NL + 1); + // Modified by BAN May 3, 2013 to avoid zero layer index + if (NL >= 2) { + if (FS.G(NL - 1).GTYPE == gtyOPENin) { + QGAIN = SOURCE(NL + 1) + (HC_SA / 2.0) * (T(NL) - TIN) + JB(NL) - JF(NL + 1); + QGAIN += HC_GA * (T(NL - 1) - TIN) + (HC_SA / 2.0) * (T(NL) - TIN); + } + } + + return; + } + + bool ASHWAT_ThermalRatings(CFSTY const &FS, // fenestration system + Real64 const TIN, // indoor / outdoor air temperature, K + Real64 const TOUT, + Real64 const HCIN, // indoor / outdoor convective heat transfer + Real64 const HCOUT, + Real64 const TRMOUT, + Real64 const TRMIN, // indoor / outdoor mean radiant temp, K + Real64 const ISOL, // total incident solar, W/m2 (values used for SOURCE derivation) + Array1S const SOURCE, // absorbed solar by layer, W/m2 + Real64 const TOL, // convergence tolerance, usually + Array1A QOCF, // returned: heat flux to layer i from gaps i-1 and i + Real64 &QOCFRoom, // returned: open channel heat gain to room, W/m2 + Array1A T, // returned: layer temperatures, 1=outside-most layer, K + Array1 &Q, // returned: heat flux at ith gap (betw layers i and i+1), W/m2 + Array1A JF, // returned: front (outside facing) radiosity of surfaces, W/m2 + Array1A JB, // returned: back (inside facing) radiosity, W/m2 + Array1A HC, // returned: gap convective heat transfer coefficient, W/m2K + Real64 &UCG, // returned: center-glass U-factor, W/m2-K + Real64 &SHGC, // returned: center-glass SHGC (Solar Heat Gain Coefficient) + bool const HCInFlag // If true uses ISO Std 150099 routine for HCIn calc ) { // SUBROUTINE INFORMATION: @@ -5060,7 +5516,7 @@ namespace WindowEquivalentLayer { // na // Return value - bool ASHWAT_Thermal; + bool ASHWAT_ThermalRatings; // Argument array dimensioning QOCF.dim(FS.NL); @@ -5083,7 +5539,8 @@ namespace WindowEquivalentLayer { // FUNCTION PARAMETER DEFINITIONS: Real64 const Height(1.0); // Window height (m) for standard ratings calculation - static std::string const RoutineName("ASHWAT_Thermal: "); + int const MaxIter(100); // maximum number of iterations allowed + static std::string const RoutineName("ASHWAT_ThermalRatings: "); // INTERFACE BLOCK SPECIFICATIONS // na @@ -5098,10 +5555,10 @@ namespace WindowEquivalentLayer { Real64 MAXERR; Array1D TNEW(FS.NL); // latest estimate of layer temperatures, K Array1D EB({0, FS.NL + 1}); // black emissive power by layer, W/m2 - // EB( 0) = outdoor environment, EB( NL+1) = indoor environment - Array1D HHAT({0, FS.NL}); // convective heat transfer coefficient (W/m2.K4) - // based on EB, NOT temperature difference - Real64 RHOF_ROOM; // effective longwave room-side properties + // EB( 0) = outdoor environment, EB( NL+1) = indoor environment + Array1D HHAT({0, FS.NL}); // convective heat transfer coefficient (W/m2.K4) + // based on EB, NOT temperature difference + Real64 RHOF_ROOM; // effective longwave room-side properties Real64 TAU_ROOM; Real64 EPSF_ROOM; Real64 RHOB_OUT; // effective longwave outdoor environment properties @@ -5121,13 +5578,12 @@ namespace WindowEquivalentLayer { int IB; // Counter begin and end limits int IE; int IDV; // Integer dummy variable, general utility - int IM_ON(1); // Turns on calculation of Indices of Merit if IM_ON=1 Array1D QOCF_F(FS.NL); // heat flux to outdoor-facing surface of layer i, from gap i-1, - // due to open channel flow, W/m2 + // due to open channel flow, W/m2 Array1D QOCF_B(FS.NL); // heat flux to indoor-facing surface of layer i, from gap i, - // due to open channel flow, W/m2 - Real64 Rvalue; // R-value in IP units [hr.ft2.F/BTU] - Real64 TAE_IN; // Indoor and outdoor effective ambient temperatures [K] + // due to open channel flow, W/m2 + Real64 Rvalue; // R-value in IP units [hr.ft2.F/BTU] + Real64 TAE_IN; // Indoor and outdoor effective ambient temperatures [K] Real64 TAE_OUT; Array1D HR({0, FS.NL}); // Radiant heat transfer coefficient [W/m2K] Array1D HJR(FS.NL); // radiative and convective jump heat transfer coefficients @@ -5157,25 +5613,24 @@ namespace WindowEquivalentLayer { Real64 HFS; // nominal height of fen system (assumed 1 m) Real64 TOC_EFF; // effective thickness of open channel, m Real64 ConvF; // convection factor: accounts for enhanced convection - // for e.g. VB adjacent to open channel - Real64 HC_GA; // convection - glass to air - Real64 HC_SA; // convection - shade (both sides) to air - Real64 HC_GS; // convection - glass to shade (one side) - Real64 TINdv; // dummy variables used + // for e.g. VB adjacent to open channel + Real64 HC_GA; // convection - glass to air + Real64 HC_SA; // convection - shade (both sides) to air + Real64 HC_GS; // convection - glass to shade (one side) + Real64 TINdv; // dummy variables used Real64 TOUTdv; Real64 TRMINdv; // for boundary conditions in calculating Real64 TRMOUTdv; Array1D SOURCEdv(FS.NL + 1); // indices of merit - Real64 SUMERR; // error summation used to check validity of code/model Real64 QGAIN; // total gain to conditioned space [[W/m2] Real64 SaveHCNLm; // place to save HC(NL-1) - two resistance networks differ Real64 SaveHCNL; // place to save HC(NL) - two resistance networks differ - // in their definitions of these heat transfer coefficients - // Flow + // in their definitions of these heat transfer coefficients + // Flow - ASHWAT_Thermal = false; // init to failure - NL = FS.NL; // working copy - if (NL < 1) return ASHWAT_Thermal; + ASHWAT_ThermalRatings = false; // init to failure + NL = FS.NL; // working copy + if (NL < 1) return ASHWAT_ThermalRatings; HCOCFout = HCOUT; // outdoor side @@ -5240,7 +5695,7 @@ namespace WindowEquivalentLayer { ALPHA = 1.0; if (NL >= 2) { if (FS.G(NL - 1).GTYPE == gtyOPENin) ALPHA = 0.5; - if (FS.G(1).GTYPE == gtyOPENout) ALPHA = 0.1; + if (FS.G(1).GTYPE == gtyOPENout) ALPHA = 0.10; } // FIRST ESTIMATE OF GLAZING TEMPERATURES AND BLACK EMISSIVE POWERS @@ -5259,34 +5714,32 @@ namespace WindowEquivalentLayer { Real64 const TRMOUT_4(pow_4(TRMOUT)); Real64 const TRMIN_4(pow_4(TRMIN)); - for (ITRY = 1; ITRY <= 100; ++ITRY) { + for (ITRY = 1; ITRY <= MaxIter; ++ITRY) { // CALCULATE GAS LAYER CONVECTIVE HEAT TRANSFER COEFFICIENTS hin_scheme = 3; // different schemes for calculating convection - // coefficients glass-to-air and shade-to-air - // if open channel air flow is allowed - // see the corresponding subroutines for detail - // = 1 gives dependence of height, spacing, delta-T - // = 2 gives dependence of spacing, delta-T but - // returns unrealistic values for large spacing - // = 3 glass-shade spacing dependence only on HCIN - // = negative, applies HCIN without adjusting for - // temperature, height, spacing, slat angle - // Recommended -> hin_scheme=3 for use with HBX, - // simplicity, right trends wrt spacing + // coefficients glass-to-air and shade-to-air + // if open channel air flow is allowed + // see the corresponding subroutines for detail + // = 1 gives dependence of height, spacing, delta-T + // = 2 gives dependence of spacing, delta-T but + // returns unrealistic values for large spacing + // = 3 glass-shade spacing dependence only on HCIN + // = negative, applies HCIN without adjusting for + // temperature, height, spacing, slat angle + // Recommended -> hin_scheme=3 for use with HBX, + // simplicity, right trends wrt spacing // start by assuming no open channel flow on indoor side HC(NL) = HCIN; // default - HC(NL) supplied by calling routine - // use this for HBX - // or - // trigger calculation of HC(NL) using ASHRAE correlation - // HC(NL) = HIC_ASHRAE(1.0d0, T(NL), TIN) ! h - flat plate - // Add by BAN June 2013 for standard ratings U-value and SHGC calc only - if (present(HCInFlag)) { - if (HCInFlag) HC(NL) = HCInWindowStandardRatings(Height, T(NL), TIN); - } + // use this for HBX + // or + // trigger calculation of HC(NL) using ASHRAE correlation + // HC(NL) = HIC_ASHRAE(1.0d0, T(NL), TIN) ! h - flat plate + // Add by BAN June 2013 for standard ratings U-value and SHGC calc only + if (HCInFlag) HC(NL) = HCInWindowStandardRatings(Height, T(NL), TIN); HC(0) = HCOUT; // HC(0) supplied by calling routine as HCOUT // Check for open channels - only possible with at least two layers @@ -5422,7 +5875,6 @@ namespace WindowEquivalentLayer { A(ADIM + 1, L) = EPSF_ROOM * StefanBoltzmann * TRMIN_4; // SOLVE MATRIX - // Call SOLMATS for single precision matrix solution SOLMATS(ADIM, A, XSOL); @@ -5466,11 +5918,21 @@ namespace WindowEquivalentLayer { } // main iteration - if (CONVRG == 0) { - ShowSevereError(RoutineName + "Net radiation analysis did not converge for " + FS.Name); - ShowContinueError("...Maximum error is = " + TrimSigDigits(MAXERR, 6)); - ShowContinueError("...Convergence tolerance is = " + TrimSigDigits(TOL, 6)); - } + // if (CONVRG == 0) { + + // if (FS.WEQLSolverErrorIndex < 1) { + // ++FS.WEQLSolverErrorIndex; + // ShowSevereError("CONSTRUCTION:WINDOWEQUIVALENTLAYER = \"" + FS.Name + "\""); + // ShowContinueError(RoutineName + "Net radiation analysis did not converge"); + // ShowContinueError("...Maximum error is = " + TrimSigDigits(MAXERR, 6)); + // ShowContinueError("...Convergence tolerance is = " + TrimSigDigits(TOL, 6)); + // ShowContinueErrorTimeStamp(""); + // } else { + // ShowRecurringWarningErrorAtEnd("CONSTRUCTION:WINDOWEQUIVALENTLAYER = \"" + FS.Name + "\"; " + RoutineName + + // "Net radiation analysis did not converge error continues.", + // FS.WEQLSolverErrorIndex); + // } + //} // NOTE: HC_SA, HC_GA and HC_SG are only available if there is // an open channel on the indoor side and the calculation of @@ -5484,14 +5946,12 @@ namespace WindowEquivalentLayer { } } - ASHWAT_Thermal = true; + ASHWAT_ThermalRatings = true; // New code follows from here - for calculating Ucg and SHGC // NOTE: This code can be bypassed if // indices of merit are not needed - if (IM_ON != 1) return ASHWAT_Thermal; - // Initialize various things HR = 0.0; HJC = 0.0; @@ -5543,11 +6003,12 @@ namespace WindowEquivalentLayer { if (IDV > NDLIAR) NDLIAR = IDV; } // end loop to calculate NDLIAR - if (NDLIAR > 1) return ASHWAT_Thermal; // cannot handle two (or more) consecutive - // diathermanous layers, U/SHGC calculation - // will be skipped entirely - // CHANGE TO (NDLIAR .GT. 2) ONCE - // SUBROUTINE DL2_RES IS AVAILABLE + if (NDLIAR > 1) + return ASHWAT_ThermalRatings; // cannot handle two (or more) consecutive + // diathermanous layers, U/SHGC calculation + // will be skipped entirely + // CHANGE TO (NDLIAR .GT. 2) ONCE + // SUBROUTINE DL2_RES IS AVAILABLE // calculate radiant heat transfer coefficents between adjacent opaque // layers @@ -5567,7 +6028,7 @@ namespace WindowEquivalentLayer { // layers,three coefficients in each case for (I = 0; I <= NL - 1; ++I) { // scan through all layers - look for single DL - // layers between two opaque layers + // layers between two opaque layers if ((ISDL(I) == 0) && (ISDL(I + 1) == 1) && (ISDL(I + 2) == 0)) { if (I == 0) { // outdoor layer is diathermanous if (NL == 1) { @@ -5591,7 +6052,7 @@ namespace WindowEquivalentLayer { if (NL >= 2) { for (I = 0; I <= NL - 2; ++I) { // scan through all layers - look for double DL - // layers between two opaque layers + // layers between two opaque layers if ((ISDL(I) == 0) && (ISDL(I + 1) == 1) && (ISDL(I + 2) == 1) && (ISDL(I + 3) == 0)) { if (I == 0) { // CALL DL2_RES(TRMOUT, T(1), T(2), T(3) etc) @@ -5609,8 +6070,8 @@ namespace WindowEquivalentLayer { // calculate convective OCF/jump heat transfer coefficients if (NL >= 2) { // no OCF unless at least two layers exist - // It is not possible for both of the following cases to be - // true for the same gap (i.e., for NL=2) + // It is not possible for both of the following cases to be + // true for the same gap (i.e., for NL=2) if (FS.G(NL - 1).GTYPE == gtyOPENin) { SaveHCNLm = HC(NL - 1); @@ -5714,46 +6175,46 @@ namespace WindowEquivalentLayer { // CONFIRM VALIDITY OF CODE - if (1 == 0) { // was used for debugging - successfully - // and can now be bypassed - // - code in this section generates the - // same solution of temperatures (TNEW(i)) - // that was found by the net radiation - // solver above (T(i)) - - ADIM = NL; - A = 0.0; - XSOL = 0.0; - TOUTdv = TOUT; // solution for TNEW should - TRMOUTdv = TRMOUT; // match existing solution - TINdv = TIN; // for T - TRMINdv = TRMIN; - SOURCEdv = SOURCE; - - for (I = 1; I <= NL; ++I) { - A(ADIM + 1, I) = HCIout(I) * TOUTdv + HRIout(I) * TRMOUTdv + HCIin(I) * TINdv + HRIin(I) * TRMINdv + SOURCEdv(I); - A(I, I) = HCIout(I) + HRIout(I) + HCIin(I) + HRIin(I); - for (J = 1; J <= NL; ++J) { - if (J != I) { - A(I, I) += HC2D(J, I) + HR2D(J, I); - A(J, I) = -1.0 * (HC2D(J, I) + HR2D(J, I)); - } - } - } - - // SOLVE MATRIX - // Call SOLMATS for single precision matrix solution - SOLMATS(ADIM, A, XSOL); - - // UNPACK SOLUTION VECTOR - - SUMERR = 0.0; - for (I = 1; I <= NL; ++I) { - TNEW(I) = XSOL(I); - SUMERR += std::abs(TNEW(I) - T(I)); - } - - } // end (1 .EQ. 0) code disabled + // if (1 == 0) { // was used for debugging - successfully + // // and can now be bypassed + // // - code in this section generates the + // // same solution of temperatures (TNEW(i)) + // // that was found by the net radiation + // // solver above (T(i)) + + // ADIM = NL; + // A = 0.0; + // XSOL = 0.0; + // TOUTdv = TOUT; // solution for TNEW should + // TRMOUTdv = TRMOUT; // match existing solution + // TINdv = TIN; // for T + // TRMINdv = TRMIN; + // SOURCEdv = SOURCE; + + // for (I = 1; I <= NL; ++I) { + // A(ADIM + 1, I) = HCIout(I) * TOUTdv + HRIout(I) * TRMOUTdv + HCIin(I) * TINdv + HRIin(I) * TRMINdv + SOURCEdv(I); + // A(I, I) = HCIout(I) + HRIout(I) + HCIin(I) + HRIin(I); + // for (J = 1; J <= NL; ++J) { + // if (J != I) { + // A(I, I) += HC2D(J, I) + HR2D(J, I); + // A(J, I) = -1.0 * (HC2D(J, I) + HR2D(J, I)); + // } + // } + // } + + // // SOLVE MATRIX + // // Call SOLMATS for single precision matrix solution + // SOLMATS(ADIM, A, XSOL); + + // // UNPACK SOLUTION VECTOR + + // SUMERR = 0.0; + // for (I = 1; I <= NL; ++I) { + // TNEW(I) = XSOL(I); + // SUMERR += std::abs(TNEW(I) - T(I)); + // } + + //} // end (1 .EQ. 0) code disabled // calculate U-factor @@ -5799,7 +6260,6 @@ namespace WindowEquivalentLayer { SHGC = 0.0; if (std::abs(ISOL) > 0.01) { - ADIM = NL; A = 0.0; XSOL = 0.0; @@ -5945,7 +6405,7 @@ namespace WindowEquivalentLayer { } } - return ASHWAT_Thermal; + return ASHWAT_ThermalRatings; } void DL_RES_r2(Real64 const Tg, // mean glass layer temperature, {K} @@ -6835,10 +7295,9 @@ namespace WindowEquivalentLayer { ISOL = 0.0; // no solar winter condition SOURCE = 0.0; - CFSUFactor = ASHWAT_Thermal( + CFSUFactor = ASHWAT_ThermalRatings( FS, TIABS, TOABS, HCIN, HCOUT, TRMOUT, TRMIN, ISOL, SOURCE({1, NL + 1}), TOL, QOCF, QOCFRoom, T, Q, JF, JB, H, U, SHGC, true); - if (!CFSUFactor) return CFSUFactor; - CFSUFactor = true; + return CFSUFactor; } diff --git a/src/EnergyPlus/WindowEquivalentLayer.hh b/src/EnergyPlus/WindowEquivalentLayer.hh index 71842fcc387..422309adb82 100644 --- a/src/EnergyPlus/WindowEquivalentLayer.hh +++ b/src/EnergyPlus/WindowEquivalentLayer.hh @@ -112,7 +112,7 @@ namespace WindowEquivalentLayer { Real64 &UNFRC // NFRC U-factor, W/m2-K ); - void CalcEQLWindowSHGCAndTransNormal(CFSTY &FS, // fenestration system + void CalcEQLWindowSHGCAndTransNormal(CFSTY const &FS, // fenestration system Real64 &SHGCSummer, // solar heat gain coefficient Real64 &TransNormal // transmittance at normal incidence ); @@ -462,26 +462,44 @@ namespace WindowEquivalentLayer { Array1S XSOL // returned: solution vector, min req dimension: XSOL( N) ); - bool ASHWAT_Thermal(CFSTY const &FS, // fenestration system - Real64 const TIN, // indoor / outdoor air temperature, K - Real64 const TOUT, - Real64 const HCIN, // indoor / outdoor convective heat transfer - Real64 const HCOUT, - Real64 const TRMOUT, - Real64 const TRMIN, // indoor / outdoor mean radiant temp, K - Real64 const ISOL, // total incident solar, W/m2 (values used for SOURCE derivation) - Array1S const SOURCE, // absorbed solar by layer, W/m2 - Real64 const TOL, // convergence tolerance, usually - Array1A QOCF, // returned: heat flux to layer i from gaps i-1 and i - Real64 &QOCFRoom, // returned: open channel heat gain to room, W/m2 - Array1A T, // returned: layer temperatures, 1=outside-most layer, K - Array1 &Q, // returned: heat flux at ith gap (betw layers i and i+1), W/m2 - Array1A JF, // returned: front (outside facing) radiosity of surfaces, W/m2 - Array1A JB, // returned: back (inside facing) radiosity, W/m2 - Array1A HC, // returned: gap convective heat transfer coefficient, W/m2K - Real64 &UCG, // returned: center-glass U-factor, W/m2-K - Real64 &SHGC, // returned: center-glass SHGC (Solar Heat Gain Coefficient) - Optional_bool_const HCInFlag = _ // If true uses ISO Std 150099 routine for HCIn calc + void ASHWAT_ThermalCalc(CFSTY &FS, // fenestration system + Real64 const TIN, // indoor air temperature, K + Real64 const TOUT, // outdoor air temperature, K + Real64 const HCIN, // indoor convective heat transfer + Real64 const HCOUT, // outdoor convective heat transfer + Real64 const TRMOUT, + Real64 const TRMIN, // indoor / outdoor mean radiant temp, K + Array1S const SOURCE, // absorbed solar by layer, W/m2 + Real64 const TOL, // convergence tolerance, usually + Array1A QOCF, // returned: heat flux to layer i from gaps i-1 and i + Real64 &QOCFRoom, // returned: open channel heat gain to room, W/m2 + Array1A T, // returned: layer temperatures, 1=outside-most layer, K + Array1 &Q, // returned: heat flux at ith gap (betw layers i and i+1), W/m2 + Array1A JF, // returned: front (outside facing) radiosity of surfaces, W/m2 + Array1A JB, // returned: back (inside facing) radiosity, W/m2 + Array1A HC // returned: gap convective heat transfer coefficient, W/m2K + ); + + bool ASHWAT_ThermalRatings(CFSTY const &FS, // fenestration system + Real64 const TIN, // indoor air temperature, K + Real64 const TOUT, // outdoor air temperature, K + Real64 const HCIN, // indoor convective heat transfer + Real64 const HCOUT, // outdoor convective heat transfer + Real64 const TRMOUT, + Real64 const TRMIN, // indoor / outdoor mean radiant temp, K + Real64 const ISOL, // total incident solar, W/m2 (values used for SOURCE derivation) + Array1S const SOURCE, // absorbed solar by layer, W/m2 + Real64 const TOL, // convergence tolerance, usually + Array1A QOCF, // returned: heat flux to layer i from gaps i-1 and i + Real64 &QOCFRoom, // returned: open channel heat gain to room, W/m2 + Array1A T, // returned: layer temperatures, 1=outside-most layer, K + Array1 &Q, // returned: heat flux at ith gap (betw layers i and i+1), W/m2 + Array1A JF, // returned: front (outside facing) radiosity of surfaces, W/m2 + Array1A JB, // returned: back (inside facing) radiosity, W/m2 + Array1A HC, // returned: gap convective heat transfer coefficient, W/m2K + Real64 &UCG, // returned: center-glass U-factor, W/m2-K + Real64 &SHGC, // returned: center-glass SHGC (Solar Heat Gain Coefficient) + bool const HCInFlag // If true uses ISO Std 150099 routine for HCIn calc ); void DL_RES_r2(Real64 const Tg, // mean glass layer temperature, {K} diff --git a/src/EnergyPlus/ZoneEquipmentManager.cc b/src/EnergyPlus/ZoneEquipmentManager.cc index 063ea71da62..da1bd97c69f 100644 --- a/src/EnergyPlus/ZoneEquipmentManager.cc +++ b/src/EnergyPlus/ZoneEquipmentManager.cc @@ -216,8 +216,8 @@ namespace ZoneEquipmentManager { } void ManageZoneEquipment(bool const FirstHVACIteration, - bool &SimZone, // Set to false at the end of the routine - bool &SimAir // Eventually set to true via SimZoneEquipment if AirLoop must be resimulated + bool &SimZone, // Set to false at the end of the routine + bool &SimAir // Eventually set to true via SimZoneEquipment if AirLoop must be resimulated ) { @@ -2494,6 +2494,32 @@ namespace ZoneEquipmentManager { CalcFinalZoneSizing(CtrlZoneNum).DesHeatCoilInHumRat = CalcZoneSizing(CurOverallSimDay, CtrlZoneNum).DesHeatCoilInHumRat; } else { CalcFinalZoneSizing(CtrlZoneNum).DesHeatDens = StdRhoAir; + // save design heating load when the there is design heating load and the design heating volume flow rate is zero, i.e., when + // design heating volume flow rate is set to zero due to heating supply air temp less than zone thermostat temperature + if (CalcZoneSizing(CurOverallSimDay, CtrlZoneNum).DesHeatLoad > CalcFinalZoneSizing(CtrlZoneNum).DesHeatLoad) { + CalcFinalZoneSizing(CtrlZoneNum).DesHeatLoad = CalcZoneSizing(CurOverallSimDay, CtrlZoneNum).DesHeatLoad; + CalcFinalZoneSizing(CtrlZoneNum).HeatDesDay = CalcZoneSizing(CurOverallSimDay, CtrlZoneNum).HeatDesDay; + CalcFinalZoneSizing(CtrlZoneNum).HeatLoadSeq = CalcZoneSizing(CurOverallSimDay, CtrlZoneNum).HeatLoadSeq; + CalcFinalZoneSizing(CtrlZoneNum).HeatZoneTempSeq = CalcZoneSizing(CurOverallSimDay, CtrlZoneNum).HeatZoneTempSeq; + CalcFinalZoneSizing(CtrlZoneNum).HeatOutTempSeq = CalcZoneSizing(CurOverallSimDay, CtrlZoneNum).HeatOutTempSeq; + CalcFinalZoneSizing(CtrlZoneNum).HeatZoneRetTempSeq = CalcZoneSizing(CurOverallSimDay, CtrlZoneNum).HeatZoneRetTempSeq; + CalcFinalZoneSizing(CtrlZoneNum).HeatZoneHumRatSeq = CalcZoneSizing(CurOverallSimDay, CtrlZoneNum).HeatZoneHumRatSeq; + CalcFinalZoneSizing(CtrlZoneNum).HeatOutHumRatSeq = CalcZoneSizing(CurOverallSimDay, CtrlZoneNum).HeatOutHumRatSeq; + CalcFinalZoneSizing(CtrlZoneNum).ZoneTempAtHeatPeak = CalcZoneSizing(CurOverallSimDay, CtrlZoneNum).ZoneTempAtHeatPeak; + CalcFinalZoneSizing(CtrlZoneNum).OutTempAtHeatPeak = CalcZoneSizing(CurOverallSimDay, CtrlZoneNum).OutTempAtHeatPeak; + CalcFinalZoneSizing(CtrlZoneNum).ZoneRetTempAtHeatPeak = + CalcZoneSizing(CurOverallSimDay, CtrlZoneNum).ZoneRetTempAtHeatPeak; + CalcFinalZoneSizing(CtrlZoneNum).ZoneHumRatAtHeatPeak = + CalcZoneSizing(CurOverallSimDay, CtrlZoneNum).ZoneHumRatAtHeatPeak; + CalcFinalZoneSizing(CtrlZoneNum).OutHumRatAtHeatPeak = CalcZoneSizing(CurOverallSimDay, CtrlZoneNum).OutHumRatAtHeatPeak; + CalcFinalZoneSizing(CtrlZoneNum).HeatDDNum = CalcZoneSizing(CurOverallSimDay, CtrlZoneNum).HeatDDNum; + CalcFinalZoneSizing(CtrlZoneNum).cHeatDDDate = DesDayWeath(CurOverallSimDay).DateString; + CalcFinalZoneSizing(CtrlZoneNum).TimeStepNumAtHeatMax = + CalcZoneSizing(CurOverallSimDay, CtrlZoneNum).TimeStepNumAtHeatMax; + CalcFinalZoneSizing(CtrlZoneNum).DesHeatCoilInTemp = CalcZoneSizing(CurOverallSimDay, CtrlZoneNum).DesHeatCoilInTemp; + CalcFinalZoneSizing(CtrlZoneNum).DesHeatCoilInHumRat = CalcZoneSizing(CurOverallSimDay, CtrlZoneNum).DesHeatCoilInHumRat; + CalcFinalZoneSizing(CtrlZoneNum).HeatTstatTemp = CalcZoneSizing(CurOverallSimDay, CtrlZoneNum).HeatTstatTemp; + } } // from all the design periods, choose the one needing the most Cooling and save all its design variables in CalcFinalZoneSizing if (CalcZoneSizing(CurOverallSimDay, CtrlZoneNum).DesCoolVolFlow > CalcFinalZoneSizing(CtrlZoneNum).DesCoolVolFlow) { @@ -2521,6 +2547,32 @@ namespace ZoneEquipmentManager { CalcFinalZoneSizing(CtrlZoneNum).DesCoolCoilInHumRat = CalcZoneSizing(CurOverallSimDay, CtrlZoneNum).DesCoolCoilInHumRat; } else { CalcFinalZoneSizing(CtrlZoneNum).DesCoolDens = StdRhoAir; + // save design cooling load when the there is design cooling load and the design cooling volume flow rate is zero, i.e., when + // design cooling volume flow rate is set to zero due to cooling supply air temp greater than zone thermostat temperature + if (CalcZoneSizing(CurOverallSimDay, CtrlZoneNum).DesCoolLoad > CalcFinalZoneSizing(CtrlZoneNum).DesCoolLoad) { + CalcFinalZoneSizing(CtrlZoneNum).DesCoolLoad = CalcZoneSizing(CurOverallSimDay, CtrlZoneNum).DesCoolLoad; + CalcFinalZoneSizing(CtrlZoneNum).CoolDesDay = CalcZoneSizing(CurOverallSimDay, CtrlZoneNum).CoolDesDay; + CalcFinalZoneSizing(CtrlZoneNum).CoolLoadSeq = CalcZoneSizing(CurOverallSimDay, CtrlZoneNum).CoolLoadSeq; + CalcFinalZoneSizing(CtrlZoneNum).CoolZoneTempSeq = CalcZoneSizing(CurOverallSimDay, CtrlZoneNum).CoolZoneTempSeq; + CalcFinalZoneSizing(CtrlZoneNum).CoolOutTempSeq = CalcZoneSizing(CurOverallSimDay, CtrlZoneNum).CoolOutTempSeq; + CalcFinalZoneSizing(CtrlZoneNum).CoolZoneRetTempSeq = CalcZoneSizing(CurOverallSimDay, CtrlZoneNum).CoolZoneRetTempSeq; + CalcFinalZoneSizing(CtrlZoneNum).CoolZoneHumRatSeq = CalcZoneSizing(CurOverallSimDay, CtrlZoneNum).CoolZoneHumRatSeq; + CalcFinalZoneSizing(CtrlZoneNum).CoolOutHumRatSeq = CalcZoneSizing(CurOverallSimDay, CtrlZoneNum).CoolOutHumRatSeq; + CalcFinalZoneSizing(CtrlZoneNum).ZoneTempAtCoolPeak = CalcZoneSizing(CurOverallSimDay, CtrlZoneNum).ZoneTempAtCoolPeak; + CalcFinalZoneSizing(CtrlZoneNum).OutTempAtCoolPeak = CalcZoneSizing(CurOverallSimDay, CtrlZoneNum).OutTempAtCoolPeak; + CalcFinalZoneSizing(CtrlZoneNum).ZoneRetTempAtCoolPeak = + CalcZoneSizing(CurOverallSimDay, CtrlZoneNum).ZoneRetTempAtCoolPeak; + CalcFinalZoneSizing(CtrlZoneNum).ZoneHumRatAtCoolPeak = + CalcZoneSizing(CurOverallSimDay, CtrlZoneNum).ZoneHumRatAtCoolPeak; + CalcFinalZoneSizing(CtrlZoneNum).OutHumRatAtCoolPeak = CalcZoneSizing(CurOverallSimDay, CtrlZoneNum).OutHumRatAtCoolPeak; + CalcFinalZoneSizing(CtrlZoneNum).CoolDDNum = CalcZoneSizing(CurOverallSimDay, CtrlZoneNum).CoolDDNum; + CalcFinalZoneSizing(CtrlZoneNum).cCoolDDDate = DesDayWeath(CurOverallSimDay).DateString; + CalcFinalZoneSizing(CtrlZoneNum).TimeStepNumAtCoolMax = + CalcZoneSizing(CurOverallSimDay, CtrlZoneNum).TimeStepNumAtCoolMax; + CalcFinalZoneSizing(CtrlZoneNum).DesCoolCoilInTemp = CalcZoneSizing(CurOverallSimDay, CtrlZoneNum).DesCoolCoilInTemp; + CalcFinalZoneSizing(CtrlZoneNum).DesCoolCoilInHumRat = CalcZoneSizing(CurOverallSimDay, CtrlZoneNum).DesCoolCoilInHumRat; + CalcFinalZoneSizing(CtrlZoneNum).CoolTstatTemp = CalcZoneSizing(CurOverallSimDay, CtrlZoneNum).CoolTstatTemp; + } } } @@ -2631,10 +2683,18 @@ namespace ZoneEquipmentManager { } else if (std::abs(DeltaTemp) > SmallTempDiff && SupplyTemp > CalcFinalZoneSizing(I).ZoneTempAtCoolPeak) { ShowSevereError( "UpdateZoneSizing: Supply air temperature is greater than zone temperature during cooling air flow calculations"); + ShowContinueError("...calculated volume flow rate = " + RoundSigDigits((CalcFinalZoneSizing(I).DesCoolVolFlow), 5) + + " m3/s"); + ShowContinueError("...calculated mass flow rate = " + RoundSigDigits((CalcFinalZoneSizing(I).DesCoolMassFlow), 5) + + " kg/s"); + ShowContinueError("...thermostat set point temp = " + RoundSigDigits(CalcFinalZoneSizing(I).CoolTstatTemp, 3) + + " C"); ShowContinueError("...zone temperature = " + RoundSigDigits(CalcFinalZoneSizing(I).ZoneTempAtCoolPeak, 3) + " C"); ShowContinueError("...supply air temperature = " + RoundSigDigits(SupplyTemp, 3) + " C"); ShowContinueError("...occurs in zone = " + CalcFinalZoneSizing(I).ZoneName); + ShowContinueError( + "...Note: supply air temperature should be less than zone temperature during cooling air flow calculations"); } } // Should this be done only if there is a heating load? Or would this message help determine why there was no load? @@ -2656,7 +2716,7 @@ namespace ZoneEquipmentManager { } ShowContinueError("...check zone thermostat set point and design supply air temperatures"); ShowContinueError("...zone name = " + CalcFinalZoneSizing(I).ZoneName); - ShowContinueError("...design heating load = " + RoundSigDigits(CalcFinalZoneSizing(I).DesCoolLoad, 2) + " W"); + ShowContinueError("...design heating load = " + RoundSigDigits(CalcFinalZoneSizing(I).DesHeatLoad, 2) + " W"); ShowContinueError("...thermostat set point temp = " + RoundSigDigits(CalcFinalZoneSizing(I).HeatTstatTemp, 3) + " C"); ShowContinueError("...zone temperature = " + RoundSigDigits(CalcFinalZoneSizing(I).ZoneTempAtHeatPeak, 3) + @@ -2673,10 +2733,18 @@ namespace ZoneEquipmentManager { } else if (std::abs(DeltaTemp) > SmallTempDiff && SupplyTemp < CalcFinalZoneSizing(I).ZoneTempAtHeatPeak) { ShowSevereError( "UpdateZoneSizing: Supply air temperature is less than zone temperature during heating air flow calculations"); + ShowContinueError("...calculated design heating volume flow rate = " + + RoundSigDigits((CalcFinalZoneSizing(I).DesHeatVolFlow), 5) + " m3/s"); + ShowContinueError("...calculated design heating mass flow rate = " + + RoundSigDigits((CalcFinalZoneSizing(I).DesHeatMassFlow), 5) + " kg/s"); + ShowContinueError("...thermostat set piont temp = " + RoundSigDigits(CalcFinalZoneSizing(I).HeatTstatTemp, 3) + + " C"); ShowContinueError("...zone temperature = " + RoundSigDigits(CalcFinalZoneSizing(I).ZoneTempAtHeatPeak, 3) + " C"); ShowContinueError("...supply air temperature = " + RoundSigDigits(SupplyTemp, 3) + " C"); ShowContinueError("...occurs in zone = " + CalcFinalZoneSizing(I).ZoneName); + ShowContinueError("...Note: supply air temperature should be greater than zone temperature during heating air " + "flow calculations"); } } } diff --git a/testfiles/WCE_Diffuse_Shade.idf b/testfiles/WCE_Diffuse_Shade.idf index 1802f185a95..a590b641882 100644 --- a/testfiles/WCE_Diffuse_Shade.idf +++ b/testfiles/WCE_Diffuse_Shade.idf @@ -604,8 +604,6 @@ Output:Variable,Room 102 Window,Surface Outside Face Temperature,Timestep; - Output:Variable,Room 102 Window,Surface Window Total Absorbed Shortwave Radiation Rate Layer 1,Timestep; - Output:Variable,Room 102 Window,Surface Window Gap Convective Heat Transfer Rate,Timestep; Output:Variable,Room 102 Window,Surface Window Net Heat Transfer Rate,Timestep; diff --git a/testfiles/WCE_Interior_VB_-45_deg.idf b/testfiles/WCE_Interior_VB_-45_deg.idf index 62037dc0869..1223e33d9fc 100644 --- a/testfiles/WCE_Interior_VB_-45_deg.idf +++ b/testfiles/WCE_Interior_VB_-45_deg.idf @@ -604,8 +604,6 @@ Output:Variable,Room 102 Window,Surface Outside Face Temperature,Timestep; - Output:Variable,Room 102 Window,Surface Window Total Absorbed Shortwave Radiation Rate Layer 1,Timestep; - Output:Variable,Room 102 Window,Surface Window Gap Convective Heat Transfer Rate,Timestep; Output:Variable,Room 102 Window,Surface Window Net Heat Transfer Rate,Timestep; diff --git a/tst/EnergyPlus/unit/AirTerminalSingleDuctMixer.unit.cc b/tst/EnergyPlus/unit/AirTerminalSingleDuctMixer.unit.cc index 2e39dc03f1f..f52bac86347 100644 --- a/tst/EnergyPlus/unit/AirTerminalSingleDuctMixer.unit.cc +++ b/tst/EnergyPlus/unit/AirTerminalSingleDuctMixer.unit.cc @@ -3179,7 +3179,7 @@ TEST_F(EnergyPlusFixture, AirTerminalSingleDuctMixer_SimVRF_ATMSupplySide) ZoneSysEnergyDemand.allocate(1); ZoneSysEnergyDemand(1).RemainingOutputReqToHeatSP = 0.0; - ZoneSysEnergyDemand(1).RemainingOutputReqToCoolSP = -5000.0; + ZoneSysEnergyDemand(1).RemainingOutputReqToCoolSP = -4000.0; QZnReq = ZoneSysEnergyDemand(1).RemainingOutputReqToCoolSP; Schedule(VRFTU(VRFTUNum).SchedPtr).CurrentValue = 1.0; // unit is always available @@ -3196,7 +3196,7 @@ TEST_F(EnergyPlusFixture, AirTerminalSingleDuctMixer_SimVRF_ATMSupplySide) ATMixerOutletMassFlowRate = SecondaryAirMassFlowRate + PrimaryAirMassFlowRate; ASSERT_EQ(ATMixerOutletMassFlowRate, SysATMixer(1).MixedAirMassFlowRate); // check the cooling output delivered is within 2.0 Watt of zone cooling load - ASSERT_NEAR(QZnReq, QUnitOutVRFTU, 2.0); + ASSERT_NEAR(QZnReq, QUnitOutVRFTU, 4.0); } TEST_F(EnergyPlusFixture, AirTerminalSingleDuctMixer_SimVRFfluidCntrl_ATMInletSide) @@ -6679,7 +6679,7 @@ TEST_F(EnergyPlusFixture, AirTerminalSingleDuctMixer_SimVRFfluidCntrl_ATMSupplyS ZoneSysEnergyDemand.allocate(1); ZoneSysEnergyDemand(1).RemainingOutputReqToHeatSP = 0.0; - ZoneSysEnergyDemand(1).RemainingOutputReqToCoolSP = -5000.0; + ZoneSysEnergyDemand(1).RemainingOutputReqToCoolSP = -4000.0; QZnReq = ZoneSysEnergyDemand(1).RemainingOutputReqToCoolSP; Schedule(VRFTU(VRFTUNum).SchedPtr).CurrentValue = 1.0; // unit is always available diff --git a/tst/EnergyPlus/unit/CMakeLists.txt b/tst/EnergyPlus/unit/CMakeLists.txt index d4cf96c614c..f9a8b232b93 100644 --- a/tst/EnergyPlus/unit/CMakeLists.txt +++ b/tst/EnergyPlus/unit/CMakeLists.txt @@ -134,6 +134,7 @@ set( test_src PlantCondLoopOperation.unit.cc PlantUtilities.unit.cc PoweredInductionUnits.unit.cc + Psychrometrics.unit.cc Pumps.unit.cc PurchasedAirManager.unit.cc PVWatts.unit.cc diff --git a/tst/EnergyPlus/unit/ConvectionCoefficients.unit.cc b/tst/EnergyPlus/unit/ConvectionCoefficients.unit.cc index 543e00cc555..9bb15aec2e4 100644 --- a/tst/EnergyPlus/unit/ConvectionCoefficients.unit.cc +++ b/tst/EnergyPlus/unit/ConvectionCoefficients.unit.cc @@ -596,7 +596,7 @@ TEST_F(EnergyPlusFixture, ConvectionCoefficientsTest_EvaluateIntHcModelsFisherPe // Case 1 - Low ACH (should default to CalcASHRAETARPNatural) - Real64 ACH = 1.; + Real64 ACH = 0.25; DataHeatBalance::Zone( 1 ).Volume = 125.0; DataLoopNode::Node( 1 ).MassFlowRate = 1.17653/3600.0 * DataHeatBalance::Zone( 1 ).Volume * ACH; @@ -760,3 +760,118 @@ TEST_F(EnergyPlusFixture, ConvectionCoefficientsTest_TestCalcZoneSystemACH) EXPECT_NEAR(ACHExpected, ACHAnswer, 0.0001); } + +TEST_F(EnergyPlusFixture, ConvectionCoefficientsTest_TestCalcFisherPedersenCeilDiffuserNatConv) +{ + + Real64 Hforced; + Real64 ACH; + Real64 Tsurf; + Real64 Tair; + Real64 cosTilt; + Real64 humRat; + Real64 height; + bool isWindow; + Real64 ExpectedHconv; + Real64 CalculatedHconv; + + DataEnvironment::OutBaroPress = 101325.0; + + // Test 1: Non-window, all natural + Hforced = 10.0; + ACH = 0.25; + Tsurf = 23.0; + Tair = 18.0; + cosTilt = 1.0; + humRat = 0.08; + height = 1.0; + isWindow = false; + ExpectedHconv = 1.2994; + CalculatedHconv = CalcFisherPedersenCeilDiffuserNatConv(Hforced,ACH,Tsurf,Tair,cosTilt,humRat,height,isWindow); + EXPECT_NEAR(ExpectedHconv, CalculatedHconv, 0.0001); + + // Test 2: Window, all natural + Hforced = 10.0; + ACH = 0.25; + Tsurf = 23.0; + Tair = 18.0; + cosTilt = 1.0; + humRat = 0.08; + height = 1.0; + isWindow = true; + ExpectedHconv = 0.8067; + CalculatedHconv = CalcFisherPedersenCeilDiffuserNatConv(Hforced,ACH,Tsurf,Tair,cosTilt,humRat,height,isWindow); + EXPECT_NEAR(ExpectedHconv, CalculatedHconv, 0.0001); + + // Test 3: Non-window, all natural + Hforced = 10.0; + ACH = 0.5; + Tsurf = 23.0; + Tair = 18.0; + cosTilt = 1.0; + humRat = 0.08; + height = 1.0; + isWindow = false; + ExpectedHconv = 1.2994; + CalculatedHconv = CalcFisherPedersenCeilDiffuserNatConv(Hforced,ACH,Tsurf,Tair,cosTilt,humRat,height,isWindow); + EXPECT_NEAR(ExpectedHconv, CalculatedHconv, 0.0001); + + // Test 4: Non-window, transition + Hforced = 10.0; + ACH = 0.75; + Tsurf = 23.0; + Tair = 18.0; + cosTilt = 1.0; + humRat = 0.08; + height = 1.0; + isWindow = false; + ExpectedHconv = 5.6497; + CalculatedHconv = CalcFisherPedersenCeilDiffuserNatConv(Hforced,ACH,Tsurf,Tair,cosTilt,humRat,height,isWindow); + EXPECT_NEAR(ExpectedHconv, CalculatedHconv, 0.0001); + + // Test 5: Non-window, all ceiling diffuser correlation + Hforced = 10.0; + ACH = 1.0; + Tsurf = 23.0; + Tair = 18.0; + cosTilt = 1.0; + humRat = 0.08; + height = 1.0; + isWindow = false; + ExpectedHconv = 10.0; + CalculatedHconv = CalcFisherPedersenCeilDiffuserNatConv(Hforced,ACH,Tsurf,Tair,cosTilt,humRat,height,isWindow); + EXPECT_NEAR(ExpectedHconv, CalculatedHconv, 0.0001); + +} + +TEST_F(EnergyPlusFixture, ConvectionCoefficientsTest_TestWindward) +{ + + bool AgainstWind; + + Real64 CosTilt; + Real64 Azimuth; + Real64 WindDirection; + + // Test 1: Horizontal surface + CosTilt = 1.0; + Azimuth = 180.0; + WindDirection = 180.0; + AgainstWind = Windward(CosTilt,Azimuth,WindDirection); + EXPECT_TRUE(AgainstWind); + + // Test 2: Vertical surface, Azimuth and WindDiretion within 90 degrees of one another (windward or against wind) + CosTilt = 0.5; + Azimuth = 269.0; + WindDirection = 180.0; + AgainstWind = Windward(CosTilt,Azimuth,WindDirection); + EXPECT_TRUE(AgainstWind); + + // Test 3: Vertical surface, Azimuth and WindDiretion not within 90 degrees of one another (leeward or not against wind) + CosTilt = 0.5; + Azimuth = 271.0; + WindDirection = 180.0; + AgainstWind = Windward(CosTilt,Azimuth,WindDirection); + EXPECT_FALSE(AgainstWind); + +} diff --git a/tst/EnergyPlus/unit/DXCoils.unit.cc b/tst/EnergyPlus/unit/DXCoils.unit.cc index 1fbe890ebd7..36fa2d897e9 100644 --- a/tst/EnergyPlus/unit/DXCoils.unit.cc +++ b/tst/EnergyPlus/unit/DXCoils.unit.cc @@ -53,6 +53,7 @@ // EnergyPlus Headers #include "Fixtures/EnergyPlusFixture.hh" +#include "Fixtures/SQLiteFixture.hh" #include #include #include @@ -66,6 +67,7 @@ #include #include #include +#include using namespace EnergyPlus; using namespace DXCoils; @@ -2077,4 +2079,449 @@ TEST_F(EnergyPlusFixture, CoilCoolingDXTwoSpeed_MinOADBTempCompOperLimit) ASSERT_EQ(-25.0, DXCoil(1).MinOATCompressor); // use default value at -25C } + +TEST_F(SQLiteFixture, DXCoils_TestComponentSizingOutput_TwoSpeed) +{ + EnergyPlus::sqlite->sqliteBegin(); + EnergyPlus::sqlite->createSQLiteSimulationsRecord(1, "EnergyPlus Version", "Current Time"); + + std::string const idf_objects = delimited_string({ + + "Version,9.2;", + + "Schedule:Compact,", + " FanAvailSched, !- Name", + " Fraction, !- Schedule Type Limits Name", + " Through: 12/31, !- Field 1", + " For: AllDays, !- Field 2", + " Until: 24:00,1.0; !- Field 3", + + "Curve:Biquadratic,", + " WindACCoolCapFT, !- Name", + " 0.942587793, !- Coefficient1 Constant", + "0.009543347, !- Coefficient2 x", + "0.000683770, !- Coefficient3 x**2", + "-0.011042676, !- Coefficient4 y", + "0.000005249, !- Coefficient5 y**2", + "-0.000009720, !- Coefficient6 x*y", + "12.77778, !- Minimum Value of x", + "23.88889, !- Maximum Value of x", + "23.88889, !- Minimum Value of y", + "46.11111, !- Maximum Value of y", + ", !- Minimum Curve Output", + ", !- Maximum Curve Output", + "Temperature, !- Input Unit Type for X", + "Temperature, !- Input Unit Type for Y", + "Dimensionless; !- Output Unit Type", + + "Curve:Cubic,", + " RATED - CCAP - FFLOW, !- Name", + " 0.84, !- Coefficient1 Constant", + " 0.16, !- Coefficient2 x", + " 0.0, !- Coefficient3 x**2", + " 0.0, !- Coefficient4 x**3", + " 0.5, !- Minimum Value of x", + " 1.5; !- Maximum Value of x", + + "Curve:Biquadratic,", + " WindACEIRFT, !- Name", + " 0.942587793, !- Coefficient1 Constant", + " 0.009543347, !- Coefficient2 x", + " 0.000683770, !- Coefficient3 x**2", + " -0.011042676, !- Coefficient4 y", + " 0.000005249, !- Coefficient5 y**2", + " -0.000009720, !- Coefficient6 x*y", + " 12.77778, !- Minimum Value of x", + " 23.88889, !- Maximum Value of x", + " 23.88889, !- Minimum Value of y", + " 46.11111, !- Maximum Value of y", + " , !- Minimum Curve Output", + " , !- Maximum Curve Output", + " Temperature, !- Input Unit Type for X", + " Temperature, !- Input Unit Type for Y", + " Dimensionless; !- Output Unit Type", + + "Curve:Quadratic,", + " RATED - CEIR - FFLOW, !- Name", + " 1.3824, !- Coefficient1 Constant", + " -0.4336, !- Coefficient2 x", + " 0.0512, !- Coefficient3 x**2", + " 0.0, !- Minimum Value of x", + " 1.0; !- Maximum Value of x", + + "Curve:Quadratic,", + " WindACPLFFPLR, !- Name", + " 0.75, !- Coefficient1 Constant", + " 0.25, !- Coefficient2 x", + " 0.0, !- Coefficient3 x**2", + " 0.0, !- Minimum Value of x", + " 1.0; !- Maximum Value of x", + + "Coil:Cooling:DX:TwoSpeed,", + " Main Cooling Coil 1, !- Name", + " FanAvailSched, !- Availability Schedule Name", + " autosize, !- High Speed Gross Rated Total Cooling Capacity{ W }", + " 0.8, !- High Speed Rated Sensible Heat Ratio", + " 3.0, !- High Speed Gross Rated Cooling COP{ W / W }", + " autosize, !- High Speed Rated Air Flow Rate{ m3 / s }", + " , !- Unit Internal Static Air Pressure{ Pa }", + " Mixed Air Node 1, !- Air Inlet Node Name", + " Main Cooling Coil 1 Outlet Node, !- Air Outlet Node Name", + " WindACCoolCapFT, !- Total Cooling Capacity Function of Temperature Curve Name", + " RATED - CCAP - FFLOW, !- Total Cooling Capacity Function of Flow Fraction Curve Name", + " WindACEIRFT, !- Energy Input Ratio Function of Temperature Curve Name", + " RATED - CEIR - FFLOW, !- Energy Input Ratio Function of Flow Fraction Curve Name", + " WindACPLFFPLR, !- Part Load Fraction Correlation Curve Name", + " autosize, !- Low Speed Gross Rated Total Cooling Capacity{ W }", + " 0.8, !- Low Speed Gross Rated Sensible Heat Ratio", + " 4.2, !- Low Speed Gross Rated Cooling COP{ W / W }", + " autosize, !- Low Speed Rated Air Flow Rate{ m3 / s }", + " WindACCoolCapFT, !- Low Speed Total Cooling Capacity Function of Temperature Curve Name", + " WindACEIRFT, !- Low Speed Energy Input Ratio Function of Temperature Curve Name", + " Main Cooling Coil 1 Condenser Node, !- Condenser Air Inlet Node Name", + " EvaporativelyCooled, !- Condenser Type", + " , !- Minimum Outdoor Dry-Bulb Temperature for Compressor Operation {C}", + " , !- High Speed Evaporative Condenser Effectiveness {dimensionless}", + " autosize, !- High Speed Evaporative Condenser Air Flow Rate {m3/s}", + " autosize, !- High Speed Evaporative Condenser Pump Rated Power Consumption {W}", + " , !- Low Speed Evaporative Condenser Effectiveness {dimensionless}", + " autosize, !- Low Speed Evaporative Condenser Air Flow Rate {m3/s}", + " autosize, !- Low Speed Evaporative Condenser Pump Rated Power Consumption {W}", + " , !- Supply Water Storage Tank Name", + " , !- Condensate Collection Water Storage Tank Name", + " 200, !- Basin Heater Capacity {W/K}", + " 2, !- Basin Heater Setpoint Temperature {C}", + " BasinHeaterSched; !- Basin Heater Operating Schedule Name", + }); + + ASSERT_TRUE(process_idf(idf_objects)); + + ScheduleManager::ProcessScheduleInput(); + DXCoils::GetDXCoils(); + EXPECT_EQ(1, DXCoils::NumDXCoils); + + DataSizing::CurZoneEqNum = 0; + DataSizing::CurOASysNum = 0; + DataSizing::CurSysNum = 1; + DataSizing::FinalSysSizing.allocate(1); + DataSizing::FinalSysSizing(CurSysNum).CoolSupTemp = 12.0; + DataSizing::FinalSysSizing(CurSysNum).CoolSupHumRat = 0.0085; + DataSizing::FinalSysSizing(CurSysNum).MixTempAtCoolPeak = 28.0; + DataSizing::FinalSysSizing(CurSysNum).MixHumRatAtCoolPeak = 0.0075; + DataSizing::FinalSysSizing(CurSysNum).DesCoolVolFlow = 1.00; + DataSizing::FinalSysSizing(CurSysNum).DesOutAirVolFlow = 0.2; + + DataAirSystems::PrimaryAirSystem.allocate(1); + DataAirSystems::PrimaryAirSystem(CurSysNum).NumOACoolCoils = 0; + DataAirSystems::PrimaryAirSystem(CurSysNum).SupFanNum = 0; + DataAirSystems::PrimaryAirSystem(CurSysNum).RetFanNum = 0; + + DataSizing::SysSizingRunDone = true; + DataSizing::SysSizInput.allocate(1); + DataSizing::SysSizInput(1).AirLoopNum = CurSysNum; + DataSizing::NumSysSizInput = 1; + + DataEnvironment::StdBaroPress = 101325.0; + Psychrometrics::InitializePsychRoutines(); + + // Need this to prevent crash in RequestSizing + DataSizing::UnitarySysEqSizing.allocate(1); + DataSizing::OASysEqSizing.allocate(1); + + // Fake having a parent coil setting the size + // UnitarySysEqSizing(DXCoilNum).CoolingCapacity = true; + DataSizing::CurDuctType = DataHVACGlobals::Cooling; + + // We aim to test resulting values that are in this report, so request it + // We actually don't need this because ReportSizingOutput also outputs to the "ComponentSizes" table + // OutputReportTabular::displayEioSummary = true; + + // Setting predefined tables is needed though + OutputReportPredefined::SetPredefinedTables(); + + // SizeDXCoil is the one doing the sizing AND the reporting + DXCoils::SizeDXCoil(1); + // Ensure we have a RatedTotCap size to begin with + Real64 ratedTotCap = DXCoils::DXCoil(1).RatedTotCap(1); + EXPECT_GT(ratedTotCap, 0.0); + + // High Speed Condenser Air Flow = RatedTotCap * 0.000114 m3/s/W (850 CFM/ton) + Real64 highSpeedCondAirFlow = DXCoils::DXCoil(1).RatedTotCap(1) * 0.000114; + EXPECT_NEAR(highSpeedCondAirFlow, DXCoils::DXCoil(1).EvapCondAirFlow(1), 0.1); + + // Low Speed Condenser Air Flow: 1/3 Total Capacity * 0.000114 m3/s/w (850 cfm/ton) + Real64 lowSpeedCondAirFlow = DXCoils::DXCoil(1).RatedTotCap(1) * 0.000114 * 0.3333; + EXPECT_NEAR(lowSpeedCondAirFlow, DXCoils::DXCoil(1).EvapCondAirFlow2, 0.1); + + // High Speed Condenser Pump Power = Total Capacity * 0.004266 W/W (15 W/ton) + Real64 highSpeedCondPumpPower = DXCoils::DXCoil(1).RatedTotCap(1) * 0.004266; + EXPECT_NEAR(highSpeedCondPumpPower, DXCoils::DXCoil(1).EvapCondPumpElecNomPower(1), 0.1); + + // Low Speed Condenser Pump Power = Total Capacity * 0.004266 W/W (15 W/ton) * 1/3 + Real64 lowSpeedCondPumpPower = DXCoils::DXCoil(1).RatedTotCap(1) * 0.004266 * 0.3333; + EXPECT_NEAR(lowSpeedCondPumpPower, DXCoils::DXCoil(1).EvapCondPumpElecNomPower2, 0.1); + + // Write the EIO Table we need + // We actually don't need this because ReportSizingOutput also outputs to the "ComponentSizes" table + // OutputReportTabular::WriteEioTables(); + + // Now check output tables / EIO + const std::string compType = DXCoils::DXCoil(1).DXCoilType; + EXPECT_EQ(compType, "Coil:Cooling:DX:TwoSpeed"); + const std::string compName = DXCoils::DXCoil(1).Name; + EXPECT_EQ(compName, "MAIN COOLING COIL 1"); + + struct TestQuery { + TestQuery(std::string t_description, std::string t_units, Real64 t_value) + : description(t_description), units(t_units), expectedValue(t_value), + displayString("Description='" + description + "'; Units='" + units + "'") {}; + + const std::string description; + const std::string units; + const Real64 expectedValue; + const std::string displayString; + }; + + std::vector testQueries({ + TestQuery("Design Size High Speed Gross Rated Total Cooling Capacity", "W", ratedTotCap), + TestQuery("Design Size High Speed Evaporative Condenser Air Flow Rate", "m3/s", highSpeedCondAirFlow), + TestQuery("Design Size Low Speed Evaporative Condenser Air Flow Rate", "m3/s", lowSpeedCondAirFlow), + TestQuery("Design Size High Speed Evaporative Condenser Pump Rated Power Consumption", "W", highSpeedCondPumpPower), + TestQuery("Design Size Low Speed Evaporative Condenser Pump Rated Power Consumption", "W", lowSpeedCondPumpPower), + }); + + for (auto& testQuery : testQueries) { + + std::string query("SELECT Value From ComponentSizes" + " WHERE CompType = '" + compType + "'" + " AND CompName = '" + compName + "'" + " AND Description = '" + testQuery.description + "'" + + " AND Units = '" + testQuery.units + "'"); + + // execAndReturnFirstDouble returns -10000.0 if not found + Real64 return_val = SQLiteFixture::execAndReturnFirstDouble(query); + + if (return_val < 0) { + EXPECT_TRUE(false) << "Query returned nothing for " << testQuery.displayString; + } else { + EXPECT_NEAR(testQuery.expectedValue, return_val, 0.01) << "Failed for " << testQuery.displayString; + } + } + + EnergyPlus::sqlite->sqliteCommit(); +} + +TEST_F(SQLiteFixture, DXCoils_TestComponentSizingOutput_SingleSpeed) +{ + EnergyPlus::sqlite->sqliteBegin(); + EnergyPlus::sqlite->createSQLiteSimulationsRecord(1, "EnergyPlus Version", "Current Time"); + + std::string const idf_objects = delimited_string({ + + "Version, 9.2;", + + "Schedule:Compact,", + " FanAndCoilAvailSched, !- Name", + " Fraction, !- Schedule Type Limits Name", + " Through: 12/31, !- Field 1", + " For: AllDays, !- Field 2", + " Until: 24:00, 1.0; !- Field 3", + + "Curve:Biquadratic,", + " WindACCoolCapFT, !- Name", + " 0.942587793, !- Coefficient1 Constant", + " 0.009543347, !- Coefficient2 x", + " 0.000683770, !- Coefficient3 x**2", + " -0.011042676, !- Coefficient4 y", + " 0.000005249, !- Coefficient5 y**2", + " -0.000009720, !- Coefficient6 x*y", + " 12.77778, !- Minimum Value of x", + " 23.88889, !- Maximum Value of x", + " 18.0, !- Minimum Value of y", + " 46.11111, !- Maximum Value of y", + " , !- Minimum Curve Output", + " , !- Maximum Curve Output", + " Temperature, !- Input Unit Type for X", + " Temperature, !- Input Unit Type for Y", + " Dimensionless; !- Output Unit Type", + + "Curve:Biquadratic,", + " WindACEIRFT, !- Name", + " 0.342414409, !- Coefficient1 Constant", + " 0.034885008, !- Coefficient2 x", + " -0.000623700, !- Coefficient3 x**2", + " 0.004977216, !- Coefficient4 y", + " 0.000437951, !- Coefficient5 y**2", + " -0.000728028, !- Coefficient6 x*y", + " 12.77778, !- Minimum Value of x", + " 23.88889, !- Maximum Value of x", + " 18.0, !- Minimum Value of y", + " 46.11111, !- Maximum Value of y", + " , !- Minimum Curve Output", + " , !- Maximum Curve Output", + " Temperature, !- Input Unit Type for X", + " Temperature, !- Input Unit Type for Y", + " Dimensionless; !- Output Unit Type", + + "Curve:Quadratic,", + " WindACCoolCapFFF, !- Name", + " 0.8, !- Coefficient1 Constant", + " 0.2, !- Coefficient2 x", + " 0.0, !- Coefficient3 x**2", + " 0.5, !- Minimum Value of x", + " 1.5; !- Maximum Value of x", + + "Curve:Quadratic,", + " WindACEIRFFF, !- Name", + " 1.1552, !- Coefficient1 Constant", + " -0.1808, !- Coefficient2 x", + " 0.0256, !- Coefficient3 x**2", + " 0.5, !- Minimum Value of x", + " 1.5; !- Maximum Value of x", + + "Curve:Quadratic,", + " WindACPLFFPLR, !- Name", + " 0.85, !- Coefficient1 Constant", + " 0.15, !- Coefficient2 x", + " 0.0, !- Coefficient3 x**2", + " 0.0, !- Minimum Value of x", + " 1.0; !- Maximum Value of x", + + "Coil:Cooling:DX:SingleSpeed,", + " Furnace ACDXCoil 1, !- Name", + " FanAndCoilAvailSched, !- Availability Schedule Name", + " autosize, !- Gross Rated Total Cooling Capacity { W }", + " 0.75, !- Gross Rated Sensible Heat Ratio", + " 4.40, !- Gross Rated Cooling COP { W / W }", + " 1.30, !- Rated Air Flow Rate { m3 / s }", + " , !- Rated Evaporator Fan Power Per Volume Flow Rate { W / ( m3 / s ) }", + " DX Cooling Coil Air Inlet Node, !- Air Inlet Node Name", + " Heating Coil Air Inlet Node, !- Air Outlet Node Name", + " WindACCoolCapFT, !- Total Cooling Capacity Function of Temperature Curve Name", + " WindACCoolCapFFF, !- Total Cooling Capacity Function of Flow Fraction Curve Name", + " WindACEIRFT, !- Energy Input Ratio Function of Temperature Curve Name", + " WindACEIRFFF, !- Energy Input Ratio Function of Flow Fraction Curve Name", + " WindACPLFFPLR, !- Part Load Fraction Correlation Curve Name", + " , !- Minimum Outdoor Dry-Bulb Temperature for Compressor Operation {C}", + " 0.0, !- Nominal Time for Condensate Removal to Begin", + " 0.0, !- Ratio of Initial Moisture Evaporation Rate and Steady State Latent Capacity", + " 0.0, !- Maximum Cycling Rate", + " 0.0, !- Latent Capacity Time Constant", + " Split TSW Cooling Coil Condenser Inlet, !- Condenser Air Inlet Node Name", + " EvaporativelyCooled, !- Condenser Type", + " , !- Evaporative Condenser Effectiveness", + " autosize, !- Evaporative Condenser Air Flow Rate", + " autosize, !- Evaporative Condenser Pump Rated Power Consumption", + " 0.0, !- Crankcase Heater Capacity", + " 10.0; !- Maximum Outdoor DryBulb Temperature for Crankcase Heater Operation", + }); + + ASSERT_TRUE(process_idf(idf_objects)); + + ScheduleManager::ProcessScheduleInput(); + DXCoils::GetDXCoils(); + EXPECT_EQ(1, DXCoils::NumDXCoils); + + // All of this is to basically manage to get RatedTotCap to be autosized + DataSizing::CurZoneEqNum = 0; + DataSizing::CurOASysNum = 0; + DataSizing::CurSysNum = 1; + DataSizing::FinalSysSizing.allocate(1); + DataSizing::FinalSysSizing(CurSysNum).CoolSupTemp = 12.0; + DataSizing::FinalSysSizing(CurSysNum).CoolSupHumRat = 0.0085; + DataSizing::FinalSysSizing(CurSysNum).MixTempAtCoolPeak = 28.0; + DataSizing::FinalSysSizing(CurSysNum).MixHumRatAtCoolPeak = 0.0075; + DataSizing::FinalSysSizing(CurSysNum).DesCoolVolFlow = 1.00; + DataSizing::FinalSysSizing(CurSysNum).DesOutAirVolFlow = 0.2; + + DataAirSystems::PrimaryAirSystem.allocate(1); + DataAirSystems::PrimaryAirSystem(CurSysNum).NumOACoolCoils = 0; + DataAirSystems::PrimaryAirSystem(CurSysNum).SupFanNum = 0; + DataAirSystems::PrimaryAirSystem(CurSysNum).RetFanNum = 0; + + DataSizing::SysSizingRunDone = true; + DataSizing::SysSizInput.allocate(1); + DataSizing::SysSizInput(1).AirLoopNum = CurSysNum; + DataSizing::NumSysSizInput = 1; + + DataEnvironment::StdBaroPress = 101325.0; + Psychrometrics::InitializePsychRoutines(); + + // Need this to prevent crash in RequestSizing + DataSizing::UnitarySysEqSizing.allocate(1); + DataSizing::OASysEqSizing.allocate(1); + + // Get into a block so that it sets the RatedTotCap + DataSizing::CurDuctType = DataHVACGlobals::Cooling; + + // We aim to test resulting values that are in this report, so request it + // We actually don't need this because ReportSizingOutput also outputs to the "ComponentSizes" table + // OutputReportTabular::displayEioSummary = true; + + // Setting predefined tables is needed though + OutputReportPredefined::SetPredefinedTables(); + + // SizeDXCoil is the one doing the sizing AND the reporting + DXCoils::SizeDXCoil(1); + // Ensure we have a RatedTotCap size to begin with + Real64 ratedTotCap = DXCoils::DXCoil(1).RatedTotCap(1); + EXPECT_GT(ratedTotCap, 0.0); + + // Condenser Air Flow = RatedTotCap * 0.000114 m3/s/W (850 CFM/ton) + Real64 condAirFlow = DXCoils::DXCoil(1).RatedTotCap(1) * 0.000114; + EXPECT_NEAR(condAirFlow, DXCoils::DXCoil(1).EvapCondAirFlow(1), 0.1); + + // Condenser Pump Power = Total Capacity * 0.004266 W/W (15 W/ton) + Real64 condPumpPower = DXCoils::DXCoil(1).RatedTotCap(1) * 0.004266; + EXPECT_NEAR(condPumpPower, DXCoils::DXCoil(1).EvapCondPumpElecNomPower(1), 0.1); + + // Write the EIO Table we need + // We actually don't need this because ReportSizingOutput also outputs to the "ComponentSizes" table + // OutputReportTabular::WriteEioTables(); + + // Now check output tables / EIO + const std::string compType = DXCoils::DXCoil(1).DXCoilType; + EXPECT_EQ(compType, "Coil:Cooling:DX:SingleSpeed"); + const std::string compName = DXCoils::DXCoil(1).Name; + EXPECT_EQ(compName, "FURNACE ACDXCOIL 1"); + + struct TestQuery { + TestQuery(std::string t_description, std::string t_units, Real64 t_value) + : description(t_description), units(t_units), expectedValue(t_value), + displayString("Description='" + description + "'; Units='" + units + "'") {}; + + const std::string description; + const std::string units; + const Real64 expectedValue; + const std::string displayString; + }; + + std::vector testQueries({ + TestQuery("Design Size Gross Rated Total Cooling Capacity", "W", ratedTotCap), + TestQuery("Design Size Evaporative Condenser Air Flow Rate", "m3/s", condAirFlow), + TestQuery("Design Size Evaporative Condenser Pump Rated Power Consumption", "W", condPumpPower), + }); + + for (auto& testQuery : testQueries) { + + std::string query("SELECT Value From ComponentSizes" + " WHERE CompType = '" + compType + "'" + " AND CompName = '" + compName + "'" + " AND Description = '" + testQuery.description + "'" + + " AND Units = '" + testQuery.units + "'"); + + // execAndReturnFirstDouble returns -10000.0 if not found + Real64 return_val = SQLiteFixture::execAndReturnFirstDouble(query); + + if (return_val < 0) { + EXPECT_TRUE(false) << "Query returned nothing for " << testQuery.displayString; + } else { + EXPECT_NEAR(testQuery.expectedValue, return_val, 0.01) << "Failed for " << testQuery.displayString; + } + } + + EnergyPlus::sqlite->sqliteCommit(); +} + + } // namespace EnergyPlus diff --git a/tst/EnergyPlus/unit/EvaporativeCoolers.unit.cc b/tst/EnergyPlus/unit/EvaporativeCoolers.unit.cc index 0ff56ebb84d..1e97749d7ad 100644 --- a/tst/EnergyPlus/unit/EvaporativeCoolers.unit.cc +++ b/tst/EnergyPlus/unit/EvaporativeCoolers.unit.cc @@ -59,6 +59,8 @@ #include #include #include +#include +#include #include "Fixtures/EnergyPlusFixture.hh" @@ -161,59 +163,6 @@ TEST_F(EnergyPlusFixture, EvapCoolers_IndEvapCoolerOutletTemp) EvapCond.deallocate(); } -TEST_F(EnergyPlusFixture, EvapCoolers_IndEvapCoolerPower) -{ - - // using CurveManager::Quadratic; - int const EvapCoolNum(1); - int CurveNum(1); - int DryWetMode(EvaporativeCoolers::DryFull); - Real64 FlowRatio(1.0); - - EvapCond.allocate(EvapCoolNum); - EvapCond(EvapCoolNum).IndirectFanPower = 200.0; - EvapCond(EvapCoolNum).IndirectRecircPumpPower = 100.0; - - // set up arguments - EvapCond(EvapCoolNum).FanPowerModifierCurveIndex = CurveNum; - - NumCurves = 1; - PerfCurve.allocate(1); - PerfCurve(CurveNum).CurveType = Quadratic; - PerfCurve(CurveNum).ObjectType = "Curve:Quadratic"; - PerfCurve(CurveNum).InterpolationType = EvaluateCurveToLimits; - PerfCurve(CurveNum).Coeff1 = 0.0; - PerfCurve(CurveNum).Coeff2 = 1.0; - PerfCurve(CurveNum).Coeff3 = 0.0; - PerfCurve(CurveNum).Coeff4 = 0.0; - PerfCurve(CurveNum).Coeff5 = 0.0; - PerfCurve(CurveNum).Coeff6 = 0.0; - PerfCurve(CurveNum).Var1Min = 0.0; - PerfCurve(CurveNum).Var1Max = 1.0; - PerfCurve(CurveNum).Var2Min = 0; - PerfCurve(CurveNum).Var2Max = 0; - - // make the call for dry full load operating condition - EvapCond(EvapCoolNum).EvapCoolerPower = IndEvapCoolerPower(EvapCoolNum, DryWetMode, FlowRatio); - - // check outputs for dry full load operating condition - EXPECT_EQ(200.0, EvapCond(EvapCoolNum).EvapCoolerPower); - - // set up arguments for wet modulated operating condition - DryWetMode = WetModulated; - FlowRatio = 0.5; - EvapCond(EvapCoolNum).PartLoadFract = 0.5; - - // make the call for wet modulated operating condition - EvapCond(EvapCoolNum).EvapCoolerPower = IndEvapCoolerPower(EvapCoolNum, DryWetMode, FlowRatio); - - // check outputs for wet modulated operating condition - EXPECT_EQ(150.0, EvapCond(EvapCoolNum).EvapCoolerPower); - - EvapCond.deallocate(); - PerfCurve.deallocate(); -} - TEST_F(EnergyPlusFixture, EvapCoolers_SizeIndEvapCoolerTest) { @@ -507,14 +456,15 @@ TEST_F(EnergyPlusFixture, EvaporativeCoolers_IndEvapCoolerPower) // set up arguments for wet modulated operating condition DryWetMode = EvaporativeCoolers::WetModulated; - FlowRatio = 0.5; + FlowRatio = 0.8; EvaporativeCoolers::EvapCond(EvapCoolNum).PartLoadFract = 0.5; // make the call for wet modulated operating condition EvaporativeCoolers::EvapCond(EvapCoolNum).EvapCoolerPower = EvaporativeCoolers::IndEvapCoolerPower(EvapCoolNum, DryWetMode, FlowRatio); // check outputs for wet modulated operating condition - EXPECT_EQ(150.0, EvaporativeCoolers::EvapCond(EvapCoolNum).EvapCoolerPower); + // Power expected = curved fan power + linear scaled pump power + EXPECT_EQ(200 * 0.8 + 100 * 0.8 * 0.5, EvaporativeCoolers::EvapCond(EvapCoolNum).EvapCoolerPower); EvaporativeCoolers::EvapCond.deallocate(); PerfCurve.deallocate(); @@ -918,4 +868,55 @@ TEST_F(EnergyPlusFixture, DirectEvapCoolerAutosizeWithoutSysSizingRunDone) EXPECT_TRUE(compare_err_stream(error_string, true)); } +TEST_F(EnergyPlusFixture, EvapCoolerAirLoopPumpCycling) +{ + + bool ErrorsFound = false; + + std::string const idf_objects = delimited_string({ + + " EvaporativeCooler:Direct:CelDekPad,", + " Direct CelDekPad EvapCooler, !- Name", + " , !- Availability Schedule Name", + " 0.6, !- Direct Pad Area {m2}", + " 0.17, !- Direct Pad Depth {m}", + " 60, !- Recirculating Water Pump Power Consumption {W}", + " ZoneEvapCool Fan outlet, !- Air Inlet Node Name", + " ZoneEvapCool Inlet Node, !- Air Outlet Node Name", + " ; !- Control Type", + + }); + + ASSERT_TRUE(process_idf(idf_objects)); + + EvaporativeCoolers::GetEvapInput(); + ASSERT_FALSE(ErrorsFound); + + int AirLoopNum = 1; + int EvapCoolNum = 1; + int Evap_Cooler_CompType = 18; + DataEnvironment::OutBaroPress = 101325.0; + + // Air loop fan PLR + DataAirLoop::AirLoopFlow.allocate(AirLoopNum); + DataAirLoop::AirLoopControlInfo.allocate(AirLoopNum); + DataAirLoop::AirLoopFlow(1).FanPLR = 0.8; + + //Evap cooler conditions + DataLoopNode::Node(EvapCond(EvapCoolNum).InletNode).MassFlowRate = 0.5; + DataLoopNode::Node(EvapCond(EvapCoolNum).InletNode).Temp = 28.0; + DataLoopNode::Node(EvapCond(EvapCoolNum).InletNode).HumRat = 0.001; + DataLoopNode::Node(EvapCond(EvapCoolNum).InletNode).Press = DataEnvironment::OutBaroPress; + + DataGlobals::BeginEnvrnFlag = true; + + //Simulate air loop component calls SimEvapCooler + //SimEvapCooler calls InitEvapCooler(EvapCoolNum) and CalcDirectEvapCooler + SimAirServingZones::SimAirLoopComponent(EvapCond(EvapCoolNum).EvapCoolerName, Evap_Cooler_CompType, false, AirLoopNum, EvapCoolNum, 0); + + //air loop FanPLR successfully passed for pump power calculation + EXPECT_EQ(EvapCond(EvapCoolNum).EvapCoolerPower, 60 * 0.8); + +} + } // namespace EnergyPlus diff --git a/tst/EnergyPlus/unit/FanCoilUnits.unit.cc b/tst/EnergyPlus/unit/FanCoilUnits.unit.cc index 30c7d59920c..5448fcdcb9c 100644 --- a/tst/EnergyPlus/unit/FanCoilUnits.unit.cc +++ b/tst/EnergyPlus/unit/FanCoilUnits.unit.cc @@ -2883,4 +2883,407 @@ TEST_F(EnergyPlusFixture, FanCoil_CyclingFanMode) EXPECT_NEAR(Node(1).MassFlowRate, FanCoil(1).PLR * FanCoil(1).MaxAirMassFlow * FanCoil(1).MedSpeedRatio, 0.0000000001); } +TEST_F(EnergyPlusFixture, FanCoil_FanSystemModelCyclingFanMode) +{ + + int FanCoilNum(1); + int ZoneNum(1); + bool FirstHVACIteration(false); + bool ErrorsFound(false); + Real64 QZnReq(0.0); + Real64 HotWaterMassFlowRate(0.0); + Real64 ColdWaterMassFlowRate(0.0); + Real64 QUnitOut(0.0); + Real64 QLatOut(0.0); + Real64 AirMassFlow(0.0); + Real64 MaxAirMassFlow(0.0); + + DataEnvironment::OutBaroPress = 101325.0; + DataEnvironment::StdRhoAir = 1.20; + WaterCoils::GetWaterCoilsInputFlag = true; + NumCoils = 0; + DataGlobals::NumOfTimeStepInHour = 1; + DataGlobals::TimeStep = 1; + DataGlobals::MinutesPerTimeStep = 60; + DataSizing::CurZoneEqNum = 1; + + InitializePsychRoutines(); + + std::string const idf_objects = delimited_string({ + " Zone,", + " EAST ZONE, !- Name", + " 0, !- Direction of Relative North { deg }", + " 0, !- X Origin { m }", + " 0, !- Y Origin { m }", + " 0, !- Z Origin { m }", + " 1, !- Type", + " 1, !- Multiplier", + " autocalculate, !- Ceiling Height { m }", + " autocalculate; !- Volume { m3 }", + + " ZoneHVAC:EquipmentConnections,", + " EAST ZONE, !- Zone Name", + " Zone1Equipment, !- Zone Conditioning Equipment List Name", + " Zone1Inlets, !- Zone Air Inlet Node or NodeList Name", + " Zone1Exhausts, !- Zone Air Exhaust Node or NodeList Name", + " Zone 1 Node, !- Zone Air Node Name", + " Zone 1 Outlet Node; !- Zone Return Air Node Name", + + " ZoneHVAC:EquipmentList,", + " Zone1Equipment, !- Name", + " SequentialLoad, !- Load Distribution Scheme", + " ZoneHVAC:FourPipeFanCoil, !- Zone Equipment 1 Object Type", + " Zone1FanCoil, !- Zone Equipment 1 Name", + " 1, !- Zone Equipment 1 Cooling Sequence", + " 1; !- Zone Equipment 1 Heating or No - Load Sequence", + + " NodeList,", + " Zone1Inlets, !- Name", + " Zone1FanCoilAirOutletNode;!- Node 1 Name", + + " NodeList,", + " Zone1Exhausts, !- Name", + " Zone1FanCoilAirInletNode; !- Node 1 Name", + + " OutdoorAir:NodeList,", + " Zone1FanCoilOAInNode; !- Node or NodeList Name 1", + + " OutdoorAir:Mixer,", + " Zone1FanCoilOAMixer, !- Name", + " Zone1FanCoilOAMixerOutletNode, !- Mixed Air Node Name", + " Zone1FanCoilOAInNode, !- Outdoor Air Stream Node Name", + " Zone1FanCoilExhNode, !- Relief Air Stream Node Name", + " Zone1FanCoilAirInletNode; !- Return Air Stream Node Name", + + " Schedule:Constant,", + " FanAndCoilAvailSched, !- Name", + " FRACTION, !- Schedule Type", + " 1; !- TimeStep Value", + + " ScheduleTypeLimits,", + " Fraction, !- Name", + " 0.0, !- Lower Limit Value", + " 1.0, !- Upper Limit Value", + " CONTINUOUS; !- Numeric Type", + + " Fan:SystemModel,", + " Zone1FanCoilFan, !- Name", + " FanAndCoilAvailSched, !- Availability Schedule Name", + " Zone1FanCoilOAMixerOutletNode, !- Air Inlet Node Name", + " Zone1FanCoilFanOutletNode, !- Air Outlet Node Name", + " 0.6, !- Design Maximum Air Flow Rate {m3/s}", + " Discrete, !- Speed Control Method", + " 0.0, !- Electric Power Minimum Flow Rate Fraction", + " 75, !- Design Pressure Rise {Pa}", + " 0.9, !- Motor Efficiency", + " 1, !- Motor In Air Stream Fraction", + " , !- Design Electric Power Consumption {W}", + " TotalEfficiencyAndPressure, !- Design Power Sizing Method", + " , !- Electric Power Per Unit Flow Rate {W/(m3/s)}", + " , !- Electric Power Per Unit Flow Rate Per Unit Pressure {W/((m3/s)-Pa)}", + " 0.5, !- Fan Total Efficiency", + " , !- Electric Power Function of Flow Fraction Curve Name", + " , !- Night Ventilation Mode Pressure Rise {Pa}", + " , !- Night Ventilation Mode Flow Fraction", + " , !- Motor Loss Zone Name", + " , !- Motor Loss Radiative Fraction", + " General, !- End-Use Subcategory", + " 1, !- Number of Speeds", + " 1.0, !- Speed 1 Flow Fraction", + " 1.0; !- Speed 1 Electric Power Fraction", + + " Coil:Cooling:Water,", + " Zone1FanCoilCoolingCoil, !- Name", + " FanAndCoilAvailSched, !- Availability Schedule Namev", + " 0.0002, !- Design Water Flow Rate { m3 / s }", + " 0.5000, !- Design Air Flow Rate { m3 / s }", + " 7.22, !- Design Inlet Water Temperature { Cv }", + " 24.340, !- Design Inlet Air Temperature { C }", + " 14.000, !- Design Outlet Air Temperature { C }", + " 0.0095, !- Design Inlet Air Humidity Ratio { kgWater / kgDryAir }", + " 0.0090, !- Design Outlet Air Humidity Ratio { kgWater / kgDryAir }", + " Zone1FanCoilChWInletNode, !- Water Inlet Node Name", + " Zone1FanCoilChWOutletNode,!- Water Outlet Node Name", + " Zone1FanCoilFanOutletNode,!- Air Inlet Node Name", + " Zone1FanCoilCCOutletNode, !- Air Outlet Node Name", + " SimpleAnalysis, !- Type of Analysis", + " CrossFlow; !- Heat Exchanger Configuration", + + " Coil:Heating:Water,", + " Zone1FanCoilHeatingCoil, !- Name", + " FanAndCoilAvailSched, !- Availability Schedule Name", + " 150.0, !- U - Factor Times Area Value { W / K }", + " 0.00014, !- Maximum Water Flow Rate { m3 / s }", + " Zone1FanCoilHWInletNode, !- Water Inlet Node Name", + " Zone1FanCoilHWOutletNode, !- Water Outlet Node Name", + " Zone1FanCoilCCOutletNode, !- Air Inlet Node Name", + " Zone1FanCoilAirOutletNode, !- Air Outlet Node Name", + " UFactorTimesAreaAndDesignWaterFlowRate, !- Performance Input Method", + " autosize, !- Rated Capacity { W }", + " 82.2, !- Rated Inlet Water Temperature { C }", + " 16.6, !- Rated Inlet Air Temperature { C }", + " 71.1, !- Rated Outlet Water Temperature { C }", + " 32.2, !- Rated Outlet Air Temperature { C }", + " ; !- Rated Ratio for Air and Water Convection", + + " ZoneHVAC:FourPipeFanCoil,", + " Zone1FanCoil, !- Name", + " FanAndCoilAvailSched, !- Availability Schedule Name", + " CyclingFan, !- Capacity Control Method", + " 0.5, !- Maximum Supply Air Flow Rate { m3 / s }", + " 0.3, !- Low Speed Supply Air Flow Ratio", + " 0.6, !- Medium Speed Supply Air Flow Ratio", + " 0.0, !- Maximum Outdoor Air Flow Rate { m3 / s }", + " FanAndCoilAvailSched, !- Outdoor Air Schedule Name", + " Zone1FanCoilAirInletNode, !- Air Inlet Node Name", + " Zone1FanCoilAirOutletNode, !- Air Outlet Node Name", + " OutdoorAir:Mixer, !- Outdoor Air Mixer Object Type", + " Zone1FanCoilOAMixer, !- Outdoor Air Mixer Name", + " Fan:SystemModel, !- Supply Air Fan Object Type", + " Zone1FanCoilFan, !- Supply Air Fan Name", + " Coil:Cooling:Water, !- Cooling Coil Object Type", + " Zone1FanCoilCoolingCoil, !- Cooling Coil Name", + " 0.00014, !- Maximum Cold Water Flow Rate { m3 / s }", + " 0.0, !- Minimum Cold Water Flow Rate { m3 / s }", + " 0.001, !- Cooling Convergence Tolerance", + " Coil:Heating:Water, !- Heating Coil Object Type", + " Zone1FanCoilHeatingCoil, !- Heating Coil Name", + " 0.00014, !- Maximum Hot Water Flow Rate { m3 / s }", + " 0.0, !- Minimum Hot Water Flow Rate { m3 / s }", + " 0.001; !- Heating Convergence Tolerance", + + }); + + ASSERT_TRUE(process_idf(idf_objects)); + + GetZoneData(ErrorsFound); + EXPECT_EQ("EAST ZONE", Zone(1).Name); + + GetZoneEquipmentData1(); + ProcessScheduleInput(); + ScheduleInputProcessed = true; + + GetFanCoilUnits(); + + auto &thisFanCoil(FanCoil(1)); + + EXPECT_EQ("CYCLINGFAN", thisFanCoil.CapCtrlMeth); + EXPECT_EQ("OUTDOORAIR:MIXER", thisFanCoil.OAMixType); + EXPECT_EQ("FAN:SYSTEMMODEL", thisFanCoil.FanType); + EXPECT_EQ("COIL:COOLING:WATER", thisFanCoil.CCoilType); + EXPECT_EQ("COIL:HEATING:WATER", thisFanCoil.HCoilType); + EXPECT_EQ(DataHVACGlobals::FanType_SystemModelObject, thisFanCoil.FanType_Num); + + TotNumLoops = 2; + PlantLoop.allocate(TotNumLoops); + + AirMassFlow = 0.60; + MaxAirMassFlow = 0.60; + ColdWaterMassFlowRate = 1.0; + HotWaterMassFlowRate = 1.0; + + thisFanCoil.OutAirMassFlow = 0.0; + thisFanCoil.MaxAirMassFlow = MaxAirMassFlow; + Node(thisFanCoil.OutsideAirNode).MassFlowRateMax = 0.0; + + Node(thisFanCoil.AirInNode).MassFlowRate = AirMassFlow; + Node(thisFanCoil.AirInNode).MassFlowRateMin = AirMassFlow; + Node(thisFanCoil.AirInNode).MassFlowRateMinAvail = AirMassFlow; + Node(thisFanCoil.AirInNode).MassFlowRateMax = MaxAirMassFlow; + Node(thisFanCoil.AirInNode).MassFlowRateMaxAvail = MaxAirMassFlow; + + // outside air mixer + auto &MixerOA(OAMixer(1)); + Node(MixerOA.RetNode).MassFlowRate = AirMassFlow; + Node(MixerOA.RetNode).MassFlowRateMax = MaxAirMassFlow; + Node(MixerOA.RetNode).Temp = 22.0; + Node(MixerOA.RetNode).Enthalpy = 36000; + Node(MixerOA.RetNode).HumRat = PsyWFnTdbH(Node(MixerOA.RetNode).Temp, Node(MixerOA.RetNode).Enthalpy); + Node(MixerOA.InletNode).Temp = 10.0; + Node(MixerOA.InletNode).Enthalpy = 18000; + Node(MixerOA.InletNode).HumRat = PsyWFnTdbH(Node(MixerOA.InletNode).Temp, Node(MixerOA.InletNode).Enthalpy); + + // chilled water coil + auto &CWCoil(WaterCoil(2)); + CWCoil.UACoilTotal = 470.0; + CWCoil.UACoilExternal = 611.0; + CWCoil.UACoilInternal = 2010.0; + CWCoil.TotCoilOutsideSurfArea = 50.0; + Node(CWCoil.AirInletNodeNum).MassFlowRate = AirMassFlow; + Node(CWCoil.AirInletNodeNum).MassFlowRateMin = AirMassFlow; + Node(CWCoil.AirInletNodeNum).MassFlowRateMax = AirMassFlow; + Node(CWCoil.AirInletNodeNum).MassFlowRateMaxAvail = AirMassFlow; + CWCoil.InletWaterMassFlowRate = ColdWaterMassFlowRate; + CWCoil.MaxWaterMassFlowRate = ColdWaterMassFlowRate; + Node(CWCoil.WaterInletNodeNum).MassFlowRate = ColdWaterMassFlowRate; + Node(CWCoil.WaterInletNodeNum).MassFlowRateMaxAvail = ColdWaterMassFlowRate; + Node(CWCoil.WaterInletNodeNum).Temp = 6.0; + Node(CWCoil.WaterOutletNodeNum).MassFlowRate = ColdWaterMassFlowRate; + Node(CWCoil.WaterOutletNodeNum).MassFlowRateMaxAvail = ColdWaterMassFlowRate; + CWCoil.WaterLoopNum = 1; + CWCoil.WaterLoopSide = 1; + CWCoil.WaterLoopBranchNum = 1; + CWCoil.WaterLoopCompNum = 1; + + // hot water coil + auto &HWCoil(WaterCoil(1)); + HWCoil.InletWaterMassFlowRate = HotWaterMassFlowRate; + HWCoil.MaxWaterMassFlowRate = HotWaterMassFlowRate; + Node(HWCoil.AirInletNodeNum).MassFlowRate = AirMassFlow; + Node(HWCoil.AirInletNodeNum).MassFlowRateMaxAvail = AirMassFlow; + Node(HWCoil.WaterInletNodeNum).Temp = 60.0; + Node(HWCoil.WaterInletNodeNum).MassFlowRate = HotWaterMassFlowRate; + Node(HWCoil.WaterInletNodeNum).MassFlowRateMaxAvail = HotWaterMassFlowRate; + Node(HWCoil.WaterOutletNodeNum).MassFlowRate = HotWaterMassFlowRate; + Node(HWCoil.WaterOutletNodeNum).MassFlowRateMaxAvail = HotWaterMassFlowRate; + HWCoil.WaterLoopNum = 2; + HWCoil.WaterLoopSide = 1; + HWCoil.WaterLoopBranchNum = 1; + HWCoil.WaterLoopCompNum = 1; + + for (int l = 1; l <= TotNumLoops; ++l) { + auto &loop(PlantLoop(l)); + loop.LoopSide.allocate(2); + auto &loopside(PlantLoop(l).LoopSide(1)); + loopside.TotalBranches = 1; + loopside.Branch.allocate(1); + auto &loopsidebranch(PlantLoop(l).LoopSide(1).Branch(1)); + loopsidebranch.TotalComponents = 1; + loopsidebranch.Comp.allocate(1); + } + // chilled water plant loop + auto &CWLoop(PlantLoop(2)); + CWLoop.Name = "ChilledWaterLoop"; + CWLoop.FluidName = "ChilledWater"; + CWLoop.FluidIndex = 1; + CWLoop.FluidName = "WATER"; + CWLoop.LoopSide(1).Branch(1).Comp(1).Name = CWCoil.Name; + CWLoop.LoopSide(1).Branch(1).Comp(1).TypeOf_Num = WaterCoil_Cooling; + CWLoop.LoopSide(1).Branch(1).Comp(1).NodeNumIn = CWCoil.WaterInletNodeNum; + CWLoop.LoopSide(1).Branch(1).Comp(1).NodeNumOut = CWCoil.WaterOutletNodeNum; + // hot water plant loop + auto &HWLoop(PlantLoop(1)); + HWLoop.Name = "HotWaterLoop"; + HWLoop.FluidName = "HotWater"; + HWLoop.FluidIndex = 1; + HWLoop.FluidName = "WATER"; + HWLoop.LoopSide(1).Branch(1).Comp(1).Name = HWCoil.Name; + HWLoop.LoopSide(1).Branch(1).Comp(1).TypeOf_Num = WaterCoil_SimpleHeating; + HWLoop.LoopSide(1).Branch(1).Comp(1).NodeNumIn = HWCoil.WaterInletNodeNum; + HWLoop.LoopSide(1).Branch(1).Comp(1).NodeNumOut = HWCoil.WaterOutletNodeNum; + + // heating mode tests + CoolingLoad = false; + HeatingLoad = true; + ZoneSysEnergyDemand.allocate(1); + ZoneSysEnergyDemand(1).RemainingOutputReqToCoolSP = 0; + ZoneSysEnergyDemand(1).RemainingOutputReqToHeatSP = 4000.0; + ZoneSysEnergyDemand(1).RemainingOutputRequired = 4000.0; + thisFanCoil.SpeedFanSel = 2; + QUnitOut = 0.0; + QLatOut = 0.0; + QZnReq = 4000.0; + + MyUAAndFlowCalcFlag.allocate(2); + MyUAAndFlowCalcFlag(1) = true; + MyUAAndFlowCalcFlag(2) = true; + DataGlobals::DoingSizing = true; + + LocalTurnFansOff = false; + LocalTurnFansOn = true; + + DataEnvironment::Month = 1; + DataEnvironment::DayOfMonth = 21; + DataGlobals::HourOfDay = 1; + DataEnvironment::DSTIndicator = 0; + DataEnvironment::DayOfWeek = 2; + DataEnvironment::HolidayIndex = 0; + DataEnvironment::DayOfYear_Schedule = General::OrdinalDay(Month, DayOfMonth, 1); + UpdateScheduleValues(); + + ZoneEqSizing.allocate(1); + CurDeadBandOrSetback.allocate(1); + CurDeadBandOrSetback(1) = false; + TempControlType.allocate(1); + TempControlType(1) = 4; + ZoneSizingRunDone = true; + FinalZoneSizing.allocate(1); + FinalZoneSizing(CurZoneEqNum).DesCoolVolFlow = 0.5; + FinalZoneSizing(CurZoneEqNum).DesHeatVolFlow = 0.5; + FinalZoneSizing(CurZoneEqNum).DesCoolCoilInTemp = 30.0; + FinalZoneSizing(CurZoneEqNum).DesCoolCoilInHumRat = 0.01; + FinalZoneSizing(CurZoneEqNum).DesHeatCoilInTemp = 20.0; + FinalZoneSizing(CurZoneEqNum).DesHeatCoilInHumRat = 0.005; + FinalZoneSizing(CurZoneEqNum).DesCoolLoad = 4000.0; + FinalZoneSizing(CurZoneEqNum).DesHeatLoad = 4000.0; + StdRhoAir = 1.2; + + BeginEnvrnFlag = true; + InitFanCoilUnits(FanCoilNum, ZoneNum, ZoneNum); + Sim4PipeFanCoil(FanCoilNum, ZoneNum, ZoneNum, FirstHVACIteration, QUnitOut, QLatOut); + // expect fan speed 3 and near full air and water flow and meet capacity + EXPECT_EQ(thisFanCoil.SpeedFanSel, 3); + EXPECT_NEAR(thisFanCoil.PLR, 0.970, 0.001); + EXPECT_NEAR(QZnReq, QUnitOut, 5.0); + // cycling fan proportional to PLR and fan speed ratio + EXPECT_NEAR(Node(1).MassFlowRate, thisFanCoil.PLR * thisFanCoil.MaxAirMassFlow, 0.0000000001); + // expect minimum flow and meet capacity + ZoneSysEnergyDemand(1).RemainingOutputReqToHeatSP = 1000.0; + ZoneSysEnergyDemand(1).RemainingOutputRequired = 1000.0; + QZnReq = 1000.0; + Sim4PipeFanCoil(FanCoilNum, ZoneNum, ZoneNum, FirstHVACIteration, QUnitOut, QLatOut); + // expect fan speed 1 and moderate air and water flow and meet capacity + EXPECT_EQ(thisFanCoil.SpeedFanSel, 1); + EXPECT_NEAR(thisFanCoil.PLR, 0.636, 0.001); + EXPECT_NEAR(QZnReq, QUnitOut, 5.0); + // cycling fan proportional to PLR and fan speed ratio + EXPECT_NEAR(Node(1).MassFlowRate, thisFanCoil.PLR * thisFanCoil.MaxAirMassFlow * thisFanCoil.LowSpeedRatio, 0.0000000001); + // expect modulated flow and meet capacity + ZoneSysEnergyDemand(1).RemainingOutputReqToHeatSP = 2500.0; + ZoneSysEnergyDemand(1).RemainingOutputRequired = 2500.0; + QZnReq = 2500.0; + Sim4PipeFanCoil(FanCoilNum, ZoneNum, ZoneNum, FirstHVACIteration, QUnitOut, QLatOut); + // expect fan speed 2 and moderate air and water flow and meet capacity + EXPECT_EQ(thisFanCoil.SpeedFanSel, 2); + EXPECT_NEAR(thisFanCoil.PLR, 0.856, 0.001); + EXPECT_NEAR(QZnReq, QUnitOut, 5.0); + // cycling fan proportional to PLR and fan speed ratio + EXPECT_NEAR(Node(1).MassFlowRate, thisFanCoil.PLR * thisFanCoil.MaxAirMassFlow * thisFanCoil.MedSpeedRatio, 0.0000000001); + + // cooling mode tests + // expect full flow and meet capacity + ZoneSysEnergyDemand(1).RemainingOutputReqToHeatSP = 0.0; + ZoneSysEnergyDemand(1).RemainingOutputReqToCoolSP = -4000.0; + ZoneSysEnergyDemand(1).RemainingOutputRequired = -4000.0; + QZnReq = -4000.0; + Sim4PipeFanCoil(FanCoilNum, ZoneNum, ZoneNum, FirstHVACIteration, QUnitOut, QLatOut); + // expect fan speed 3 and near full air and water flow and meet capacity + EXPECT_EQ(3, FanCoil(1).SpeedFanSel); + EXPECT_NEAR(FanCoil(1).PLR, 0.941, 0.001); + EXPECT_NEAR(QZnReq, QUnitOut, 5.0); + // cycling fan proportional to PLR and fan speed ratio + EXPECT_NEAR(Node(1).MassFlowRate, thisFanCoil.PLR * thisFanCoil.MaxAirMassFlow, 0.0000000001); + // expect minimum flow and meet capacity + ZoneSysEnergyDemand(1).RemainingOutputReqToCoolSP = -1000.0; + ZoneSysEnergyDemand(1).RemainingOutputRequired = -1000.0; + QZnReq = -1000.0; + Sim4PipeFanCoil(FanCoilNum, ZoneNum, ZoneNum, FirstHVACIteration, QUnitOut, QLatOut); + // expect fan speed 1 and moderate air and water flow and meet capacity + EXPECT_EQ(1, FanCoil(1).SpeedFanSel); + EXPECT_NEAR(FanCoil(1).PLR, 0.500, 0.001); + EXPECT_NEAR(QZnReq, QUnitOut, 5.0); + // cycling fan proportional to PLR and fan speed ratio + EXPECT_NEAR(Node(1).MassFlowRate, thisFanCoil.PLR * thisFanCoil.MaxAirMassFlow * thisFanCoil.LowSpeedRatio, 0.0000000001); + // expect modulated flow and meet capacity + ZoneSysEnergyDemand(1).RemainingOutputReqToCoolSP = -2500.0; + ZoneSysEnergyDemand(1).RemainingOutputRequired = -2500.0; + QZnReq = -2500.0; + Sim4PipeFanCoil(FanCoilNum, ZoneNum, ZoneNum, FirstHVACIteration, QUnitOut, QLatOut); + // expect fan speed 2 and moderate air and water flow and meet capacity + EXPECT_EQ(2, FanCoil(1).SpeedFanSel); + EXPECT_NEAR(FanCoil(1).PLR, 0.753, 0.001); + EXPECT_NEAR(QZnReq, QUnitOut, 5.0); + EXPECT_NEAR(Node(1).MassFlowRate, thisFanCoil.PLR * thisFanCoil.MaxAirMassFlow * thisFanCoil.MedSpeedRatio, 0.0000000001); +} + } // namespace EnergyPlus diff --git a/tst/EnergyPlus/unit/Fans.unit.cc b/tst/EnergyPlus/unit/Fans.unit.cc index fbed0f78387..d6ebde66206 100644 --- a/tst/EnergyPlus/unit/Fans.unit.cc +++ b/tst/EnergyPlus/unit/Fans.unit.cc @@ -98,3 +98,156 @@ TEST_F(EnergyPlusFixture, Fans_FanSizing) DataNonZoneNonAirloopValue = 0.0; EXPECT_NEAR(1.0371, Fan(FanNum).DesignPointFEI, 0.0001); } + +TEST_F(EnergyPlusFixture, Fans_ConstantVolume_EMSPressureRiseResetTest) +{ + + Fans::NumFans = 1; + Fans::Fan.allocate(NumFans); + Fans::FanNumericFields.allocate(NumFans); + Fans::FanNumericFields(NumFans).FieldNames.allocate(2); + // set standard air density + DataEnvironment::StdRhoAir = 1.0; + // set fan model inputs + int FanNum(1); + FanNumericFields(FanNum).FieldNames(1) = "Fan Total Efficiency"; + FanNumericFields(FanNum).FieldNames(2) = "Pressure Rise"; + auto &thisFan(Fans::Fan(FanNum)); + thisFan.FanName = "Test Fan"; + thisFan.FanType = "Fan:ConstantVolume"; + thisFan.FanType_Num = DataHVACGlobals::FanType_SimpleConstVolume; + thisFan.MaxAirFlowRate = AutoSize; + thisFan.DeltaPress = 300.0; + thisFan.FanEff = 1.0; + thisFan.MotEff = 0.8; + thisFan.MotInAirFrac = 1.0; + thisFan.AvailSchedPtrNum = -1.0; + thisFan.MaxAirFlowRate = 1.0; + thisFan.MinAirMassFlowRate = 0.0; + thisFan.MaxAirMassFlowRate = thisFan.MaxAirFlowRate; + thisFan.InletAirMassFlowRate = thisFan.MaxAirMassFlowRate; + thisFan.RhoAirStdInit = DataEnvironment::StdRhoAir; + thisFan.EMSFanPressureOverrideOn = false; + thisFan.EMSFanPressureValue = 0.0; + Fans::LocalTurnFansOn = true; + Fans::LocalTurnFansOff = false; + // simulate the fan + Fans::SimSimpleFan(FanNum); + // fan power = MassFlow * DeltaPress / (FanEff * RhoAir) + Real64 Result_FanPower = max(0.0, thisFan.MaxAirMassFlowRate * thisFan.DeltaPress / (thisFan.FanEff * thisFan.RhoAirStdInit)); + EXPECT_DOUBLE_EQ(Result_FanPower, thisFan.FanPower); // expects 300 W + + // negative fan pressure rise set using EMS + thisFan.EMSFanPressureOverrideOn = true; + thisFan.EMSFanPressureValue = -300.0; + // simulate the fan with negative pressure rise + // set using fans EMS actuator for Pressure Rise + Fans::SimSimpleFan(FanNum); + Real64 Result2_FanPower = max(0.0, thisFan.MaxAirMassFlowRate * thisFan.EMSFanPressureValue / (thisFan.FanEff * thisFan.RhoAirStdInit)); + EXPECT_DOUBLE_EQ(Result2_FanPower, thisFan.FanPower); // expects zero +} +TEST_F(EnergyPlusFixture, Fans_OnOff_EMSPressureRiseResetTest) +{ + + Fans::NumFans = 1; + Fans::Fan.allocate(NumFans); + Fans::FanNumericFields.allocate(NumFans); + Fans::FanNumericFields(NumFans).FieldNames.allocate(2); + // set standard air density + DataEnvironment::StdRhoAir = 1.0; + // set fan model inputs + int FanNum(1); + FanNumericFields(FanNum).FieldNames(1) = "Fan Total Efficiency"; + FanNumericFields(FanNum).FieldNames(2) = "Pressure Rise"; + auto &thisFan(Fans::Fan(FanNum)); + thisFan.FanName = "Test Fan"; + thisFan.FanType = "Fan:OnOff"; + thisFan.FanType_Num = DataHVACGlobals::FanType_SimpleOnOff; + thisFan.MaxAirFlowRate = AutoSize; + thisFan.DeltaPress = 300.0; + thisFan.FanEff = 1.0; + thisFan.MotEff = 0.8; + thisFan.MotInAirFrac = 1.0; + thisFan.AvailSchedPtrNum = -1.0; + thisFan.MaxAirFlowRate = 1.0; + thisFan.MinAirMassFlowRate = 0.0; + thisFan.MaxAirMassFlowRate = thisFan.MaxAirFlowRate; + thisFan.InletAirMassFlowRate = thisFan.MaxAirMassFlowRate; + thisFan.RhoAirStdInit = DataEnvironment::StdRhoAir; + thisFan.EMSFanPressureOverrideOn = false; + thisFan.EMSFanPressureValue = 0.0; + Fans::LocalTurnFansOn = true; + Fans::LocalTurnFansOff = false; + // simulate the fan + Fans::SimOnOffFan(FanNum); + // fan power = MassFlow * DeltaPress / (FanEff * RhoAir) + Real64 Result_FanPower = max(0.0, thisFan.MaxAirMassFlowRate * thisFan.DeltaPress / (thisFan.FanEff * thisFan.RhoAirStdInit)); + EXPECT_DOUBLE_EQ(Result_FanPower, thisFan.FanPower); // expects 300 W + + // negative fan pressure rise set using EMS + thisFan.EMSFanPressureOverrideOn = true; + thisFan.EMSFanPressureValue = -300.0; + // simulate the fan with negative pressure rise + // set using fans EMS actuator for Pressure Rise + Fans::SimOnOffFan(FanNum); + Real64 Result2_FanPower = max(0.0, thisFan.MaxAirMassFlowRate * thisFan.EMSFanPressureValue / (thisFan.FanEff * thisFan.RhoAirStdInit)); + EXPECT_DOUBLE_EQ(Result2_FanPower, thisFan.FanPower); // expects zero +} +TEST_F(EnergyPlusFixture, Fans_VariableVolume_EMSPressureRiseResetTest) +{ + + Fans::NumFans = 1; + Fans::Fan.allocate(NumFans); + Fans::FanNumericFields.allocate(NumFans); + Fans::FanNumericFields(NumFans).FieldNames.allocate(2); + // set standard air density + DataEnvironment::StdRhoAir = 1.0; + // set fan model inputs + int FanNum(1); + FanNumericFields(FanNum).FieldNames(1) = "Fan Total Efficiency"; + FanNumericFields(FanNum).FieldNames(2) = "Pressure Rise"; + auto &thisFan(Fans::Fan(FanNum)); + thisFan.FanName = "Test Fan"; + thisFan.FanType = "Fan:VariableVolume"; + thisFan.FanType_Num = DataHVACGlobals::FanType_SimpleVAV; + thisFan.MaxAirFlowRate = AutoSize; + thisFan.DeltaPress = 300.0; + thisFan.FanEff = 1.0; + thisFan.MotEff = 0.8; + thisFan.MotInAirFrac = 1.0; + thisFan.AvailSchedPtrNum = -1.0; + thisFan.MaxAirFlowRate = 1.0; + thisFan.MinAirMassFlowRate = 0.0; + thisFan.MaxAirMassFlowRate = thisFan.MaxAirFlowRate; + thisFan.InletAirMassFlowRate = thisFan.MaxAirMassFlowRate; + thisFan.RhoAirStdInit = DataEnvironment::StdRhoAir; + // VAV Fan Power Coefficients + thisFan.FanCoeff(1) = 0.06990146; + thisFan.FanCoeff(2) = 1.39500612; + thisFan.FanCoeff(3) = -3.35487336; + thisFan.FanCoeff(4) = 2.89232315; + thisFan.FanCoeff(5) = 0.000; + thisFan.EMSFanPressureOverrideOn = false; + thisFan.EMSFanPressureValue = 0.0; + Fans::LocalTurnFansOn = true; + Fans::LocalTurnFansOff = false; + // simulate the fan + Fans::SimVariableVolumeFan(FanNum); + // fan power = PartLoadFrac * MassFlow * DeltaPress / (FanEff * RhoAir) + Real64 FlowRatio = 1.0; + Real64 PartLoadFrac = thisFan.FanCoeff(1) + thisFan.FanCoeff(2) * FlowRatio + thisFan.FanCoeff(3) * FlowRatio * FlowRatio + + thisFan.FanCoeff(4) * FlowRatio * FlowRatio * FlowRatio; + + Real64 Result_FanPower = max(0.0, PartLoadFrac * thisFan.MaxAirMassFlowRate * thisFan.DeltaPress / (thisFan.FanEff * thisFan.RhoAirStdInit)); + EXPECT_DOUBLE_EQ(Result_FanPower, thisFan.FanPower); // expects 300 W + + // negative fan pressure rise set using EMS + thisFan.EMSFanPressureOverrideOn = true; + thisFan.EMSFanPressureValue = -300.0; + // simulate the fan with negative pressure rise + // set using fans EMS actuator for Pressure Rise + Fans::SimVariableVolumeFan(FanNum); + Real64 Result2_FanPower = + max(0.0, PartLoadFrac * thisFan.MaxAirMassFlowRate * thisFan.EMSFanPressureValue / (thisFan.FanEff * thisFan.RhoAirStdInit)); + EXPECT_DOUBLE_EQ(Result2_FanPower, thisFan.FanPower); // expects zero +} diff --git a/tst/EnergyPlus/unit/General.unit.cc b/tst/EnergyPlus/unit/General.unit.cc index d008c412a05..e26b4716efd 100644 --- a/tst/EnergyPlus/unit/General.unit.cc +++ b/tst/EnergyPlus/unit/General.unit.cc @@ -369,4 +369,29 @@ TEST(General, nthDayOfWeekOfMonth_test) EXPECT_EQ(62, nthDayOfWeekOfMonth(4, 1, 3)); // first wednesday of march } +TEST_F(EnergyPlusFixture, General_EpexpTest) +{ + //Global exp function test + Real64 x; + Real64 y; + + // Negative value + x = -69.0; + y = epexp(x); + EXPECT_NEAR(0.0, y, 1.0E-20); + + x = -700.0; + y = epexp(x); + EXPECT_NEAR(0.0, y, 1.0E-20); + + // Positive values + x = 10.0; + y = epexp(x, 700.0); + EXPECT_NEAR(22026.46579480, y, 0.00001); + + x = 800.0; + y = epexp(x, 700.0); + EXPECT_NEAR(1.0142320547350045e+304, y, 1.0E2); +} + } // namespace EnergyPlus diff --git a/tst/EnergyPlus/unit/HVACFan.unit.cc b/tst/EnergyPlus/unit/HVACFan.unit.cc index 13eaef41ac5..e0f64963181 100644 --- a/tst/EnergyPlus/unit/HVACFan.unit.cc +++ b/tst/EnergyPlus/unit/HVACFan.unit.cc @@ -52,6 +52,7 @@ // EnergyPlus Headers #include "Fixtures/EnergyPlusFixture.hh" +#include #include #include #include @@ -59,6 +60,8 @@ namespace EnergyPlus { +using namespace EnergyPlus::EMSManager; + TEST_F(EnergyPlusFixture, SystemFanObj_TestGetFunctions1) { // this unit test checks some get functions @@ -554,4 +557,86 @@ TEST_F(EnergyPlusFixture, SystemFanObj_DiscreteMode_noPowerFFlowCurve) EXPECT_NEAR(locFanElecPower, locExpectPower, 0.01); } +TEST_F(EnergyPlusFixture, SystemFanObj_DiscreteMode_EMSPressureRiseResetTest) +{ + // this unit test checks the power when EMS actuator is used to reset pressure rise + // adopted from unit test "SystemFanObj_DiscreteMode_noPowerFFlowCurve" and modified + + std::string const idf_objects = delimited_string({ + + " Fan:SystemModel,", + " Test Fan, !- Name", + " , !- Availability Schedule Name", + " TestFanAirInletNode, !- Air Inlet Node Name", + " TestFanOutletNode, !- Air Outlet Node Name", + " 1.0 , !- Design Maximum Air Flow Rate", + " Discrete, !- Speed Control Method", + " 0.0, !- Electric Power Minimum Flow Rate Fraction", + " 100.0, !- Design Pressure Rise", + " 0.9 , !- Motor Efficiency", + " 1.0 , !- Motor In Air Stream Fraction", + " 100.0, !- Design Electric Power Consumption", + " , !- Design Power Sizing Method", + " , !- Electric Power Per Unit Flow Rate", + " , !- Electric Power Per Unit Flow Rate Per Unit Pressure", + " , !- Fan Total Efficiency", + " ; !- Electric Power Function of Flow Fraction Curve Name", + + " EnergyManagementSystem:Actuator,", + " FanPressureRise_ResetValue, !- Name", + " TEST FAN, !- Actuated Component Unique Name", + " Fan, !- Actuated Component Type", + " Fan Pressure Rise; !- Actuated Component Control Type", + + " EnergyManagementSystem:Program,", + " ResetFanPressureRise, !- Name", + " SET FanPressureRise_ResetValue = -100.0; !- ", + + " EnergyManagementSystem:ProgramCallingManager,", + " FanSystemModel_FanMainManager, !- Name", + " BeginTimestepBeforePredictor, !- EnergyPlus Model Calling Point", + " ResetFanPressureRise; !- Program Name 1", + }); + + ASSERT_TRUE(process_idf(idf_objects)); + + EMSManager::CheckIfAnyEMS(); + EMSManager::FinishProcessingUserInput = true; + + std::string fanName = "TEST FAN"; + HVACFan::fanObjs.emplace_back(new HVACFan::FanSystem(fanName)); // call constructor + DataSizing::CurZoneEqNum = 0; + DataSizing::CurSysNum = 0; + DataSizing::CurOASysNum = 0; + DataEnvironment::StdRhoAir = 1.0; + + HVACFan::fanObjs[0]->simulate(_, _, _, _); + Real64 locFanSizeVdot = HVACFan::fanObjs[0]->designAirVolFlowRate; + EXPECT_NEAR(1.00, locFanSizeVdot, 0.00001); + + // 50% of the time at speed 1 (0.5 flow) and 50% of the time at speed 2 (1.0 flow) + // average flow 0.75, on for entire timestep + Real64 designMassFlowRate = locFanSizeVdot * DataEnvironment::StdRhoAir; + Real64 massFlow1 = 0.5 * designMassFlowRate; + Real64 massFlow2 = designMassFlowRate; + Real64 runTimeFrac1 = 0.5; + Real64 runTimeFrac2 = 0.5; + HVACFan::fanObjs[0]->simulate(_, _, _, _, massFlow1, runTimeFrac1, massFlow2, runTimeFrac2); + Real64 locFanElecPower = HVACFan::fanObjs[0]->fanPower(); + // uses flow weighted power calculation. 50% of time at 50% flow and 50% of time at 100% flow + Real64 locExpectPower = (0.5 * 0.5 + 0.5 * 1.0) * HVACFan::fanObjs[0]->designElecPower; // expect 75% of power + EXPECT_NEAR(locFanElecPower, locExpectPower, 0.01); + + // reset the pressure rise to -100.0 using EMS program + bool anyRan(false); + EMSManager::ManageEMS(DataGlobals::emsCallFromSetupSimulation, anyRan); + EMSManager::ManageEMS(DataGlobals::emsCallFromBeginTimestepBeforePredictor, anyRan); + EXPECT_TRUE(anyRan); + // simulate the fan with -100.0 Pa fan pressure rise + HVACFan::fanObjs[0]->simulate(_, _, _, _, massFlow1, runTimeFrac1, massFlow2, runTimeFrac2); + locFanElecPower = HVACFan::fanObjs[0]->fanPower(); + // negative fan pressure rise results in zero fan power + locExpectPower = 0.0; + EXPECT_DOUBLE_EQ(locFanElecPower, locExpectPower); // expects zero fan power +} } // namespace EnergyPlus diff --git a/tst/EnergyPlus/unit/HVACVariableRefrigerantFlow.unit.cc b/tst/EnergyPlus/unit/HVACVariableRefrigerantFlow.unit.cc index 90b96b56d41..b54bc250549 100644 --- a/tst/EnergyPlus/unit/HVACVariableRefrigerantFlow.unit.cc +++ b/tst/EnergyPlus/unit/HVACVariableRefrigerantFlow.unit.cc @@ -9868,7 +9868,7 @@ TEST_F(EnergyPlusFixture, VRFFluidControl_FanSysModel_OnOffModeTest) " , !- Zone Equipment 1 Sequential Cooling Load Fraction", " ; !- Zone Equipment 1 Sequential Heating Load Fraction", - }); + }); ASSERT_TRUE(process_idf(idf_objects)); SimulationManager::ManageSimulation(); @@ -9919,4 +9919,2342 @@ TEST_F(EnergyPlusFixture, VRFFluidControl_FanSysModel_OnOffModeTest) Result_FanPower = HVACFan::fanObjs[0]->fanPower(); EXPECT_EQ(Result_FanPower, 0.0); } + +TEST_F(EnergyPlusFixture, VRFTU_SysCurve_ReportOutputVerificationTest) +{ + + bool ErrorsFound(false); // function returns true on error + bool FirstHVACIteration(true); // simulate the first pass through HVAC simulation, use false for next iteration + int VRFCond(1); // index to VRF condenser + int VRFTUNum(1); // index to VRF terminal unit + int EquipPtr(1); // index to equipment list + int CurZoneNum(1); // index to zone + int ZoneInletAirNode(0); // zone inlet node number + Real64 SysOutputProvided(0.0); // function returns sensible capacity [W] + Real64 LatOutputProvided(0.0); // function returns latent capacity [W] + + std::string const idf_objects = delimited_string({ + "AirConditioner:VariableRefrigerantFlow,", + " VRF Heat Pump, !- Heat Pump Name", + " VRFCondAvailSched, !- Availability Schedule Name", + " autosize, !- Gross Rated Total Cooling Capacity {W}", + " 3.2917, !- Gross Rated Cooling COP {W/W}", + " -5, !- Minimum Outdoor Temperature in Cooling Mode {C}", + " 43, !- Maximum Outdoor Temperature in Cooling Mode {C}", + " VRFCoolCapFT, !- Cooling Capacity Ratio Modifier Function of Low Temperature Curve Name", + " VRFCoolCapFTBoundary, !- Cooling Capacity Ratio Boundary Curve Name", + " VRFCoolCapFTHi, !- Cooling Capacity Ratio Modifier Function of High Temperature Curve Name", + " VRFCoolEIRFT, !- Cooling Energy Input Ratio Modifier Function of Low Temperature Curve Name", + " VRFCoolEIRFTBoundary, !- Cooling Energy Input Ratio Boundary Curve Name", + " VRFCoolEIRFTHi, !- Cooling Energy Input Ratio Modifier Function of High Temperature Curve Name", + " CoolingEIRLowPLR, !- Cooling Energy Input Ratio Modifier Function of Low Part-Load Ratio Curve Name", + " CoolingEIRHiPLR, !- Cooling Energy Input Ratio Modifier Function of High Part-Load Ratio Curve Name", + " CoolingCombRatio, !- Cooling Combination Ratio Correction Factor Curve Name", + " VRFCPLFFPLR, !- Cooling Part-Load Fraction Correlation Curve Name", + " autosize, !- Gross Rated Heating Capacity {W}", + " , !- Rated Heating Capacity Sizing Ratio {W/W}", + " 3.5484, !- Gross Rated Heating COP {W/W}", + " -20, !- Minimum Outdoor Temperature in Heating Mode {C}", + " 20, !- Maximum Outdoor Temperature in Heating Mode {C}", + " VRFHeatCapFT, !- Heating Capacity Ratio Modifier Function of Low Temperature Curve Name", + " VRFHeatCapFTBoundary, !- Heating Capacity Ratio Boundary Curve Name", + " VRFHeatCapFTHi, !- Heating Capacity Ratio Modifier Function of High Temperature Curve Name", + " VRFHeatEIRFT, !- Heating Energy Input Ratio Modifier Function of Low Temperature Curve Name", + " VRFHeatEIRFTBoundary, !- Heating Energy Input Ratio Boundary Curve Name", + " VRFHeatEIRFTHi, !- Heating Energy Input Ratio Modifier Function of High Temperature Curve Name", + " WetBulbTemperature, !- Heating Performance Curve Outdoor Temperature Type", + " HeatingEIRLowPLR, !- Heating Energy Input Ratio Modifier Function of Low Part-Load Ratio Curve Name", + " HeatingEIRHiPLR, !- Heating Energy Input Ratio Modifier Function of High Part-Load Ratio Curve Name", + " HeatingCombRatio, !- Heating Combination Ratio Correction Factor Curve Name", + " VRFCPLFFPLR, !- Heating Part-Load Fraction Correlation Curve Name", + " 0.25, !- Minimum Heat Pump Part-Load Ratio {dimensionless}", + " SPACE1-1, !- Zone Name for Master Thermostat Location", + " LoadPriority, !- Master Thermostat Priority Control Type", + " , !- Thermostat Priority Schedule Name", + " VRF Heat Pump TU List, !- Zone Terminal Unit List Name", + " No, !- Heat Pump Waste Heat Recovery", + " 30, !- Equivalent Piping Length used for Piping Correction Factor in Cooling Mode {m}", + " 10, !- Vertical Height used for Piping Correction Factor {m}", + " CoolingLengthCorrectionFactor, !- Piping Correction Factor for Length in Cooling Mode Curve Name", + " -0.000386, !- Piping Correction Factor for Height in Cooling Mode Coefficient {1/m}", + " 30, !- Equivalent Piping Length used for Piping Correction Factor in Heating Mode {m}", + " , !- Piping Correction Factor for Length in Heating Mode Curve Name", + " , !- Piping Correction Factor for Height in Heating Mode Coefficient {1/m}", + " 15, !- Crankcase Heater Power per Compressor {W}", + " 3, !- Number of Compressors {dimensionless}", + " 0.33, !- Ratio of Compressor Size to Total Compressor Capacity {W/W}", + " 7, !- Maximum Outdoor Dry-Bulb Temperature for Crankcase Heater {C}", + " Resistive, !- Defrost Strategy", + " Timed, !- Defrost Control", + " , !- Defrost Energy Input Ratio Modifier Function of Temperature Curve Name", + " , !- Defrost Time Period Fraction {dimensionless}", + " autosize, !- Resistive Defrost Heater Capacity {W}", + " 7, !- Maximum Outdoor Dry-bulb Temperature for Defrost Operation {C}", + " AirCooled, !- Condenser Type", + " MyVRFOANode, !- Condenser Inlet Node Name", + " , !- Condenser Outlet Node Name", + " , !- Water Condenser Volume Flow Rate {m3/s}", + " , !- Evaporative Condenser Effectiveness {dimensionless}", + " , !- Evaporative Condenser Air Flow Rate {m3/s}", + " 0, !- Evaporative Condenser Pump Rated Power Consumption {W}", + " , !- Supply Water Storage Tank Name", + " 0, !- Basin Heater Capacity {W/K}", + " , !- Basin Heater Setpoint Temperature {C}", + " , !- Basin Heater Operating Schedule Name", + " Electricity; !- Fuel Type", + + "Zone,", + " SPACE1-1, !- Name", + " 0, !- Direction of Relative North {deg}", + " 0, !- X Origin {m}", + " 0, !- Y Origin {m}", + " 0, !- Z Origin {m}", + " 1, !- Type", + " 1, !- Multiplier", + " 2.438400269, !- Ceiling Height {m}", + " 239.247360229; !- Volume {m3}", + + "ZoneHVAC:EquipmentConnections,", + " SPACE1-1, !- Zone Name", + " SPACE1-1 Eq, !- Zone Conditioning Equipment List Name", + " TU1 Outlet Node, !- Zone Air Inlet Node or NodeList Name", + " TU1 Inlet Node, !- Zone Air Exhaust Node or NodeList Name", + " SPACE1-1 Node, !- Zone Air Node Name", + " SPACE1-1 Out Node; !- Zone Return Air Node Name", // not used anywhere else in the example file + + "ZoneHVAC:EquipmentList,", + " SPACE1-1 Eq, !- Name", + " SequentialLoad, !- Load Distribution Scheme", + " ZoneHVAC:TerminalUnit:VariableRefrigerantFlow, !- Zone Equipment 1 Object Type", + " TU1, !- Zone Equipment 1 Name", + " 1, !- Zone Equipment 1 Cooling Sequence", + " 1; !- Zone Equipment 1 Heating or No-Load Sequence", + + "ZoneTerminalUnitList,", + " VRF Heat Pump TU List, !- Zone Terminal Unit List Name", + " TU1; !- Zone Terminal Unit Name 1", + + "ZoneHVAC:TerminalUnit:VariableRefrigerantFlow,", + " TU1, !- Zone Terminal Unit Name", + " VRFAvailSched, !- Terminal Unit Availability Schedule", + " TU1 Inlet Node, !- Terminal Unit Air Inlet Node Name", + " TU1 Outlet Node, !- Terminal Unit Air Outlet Node Name", + " autosize, !- Supply Air Flow Rate During Cooling Operation {m3/s}", + " 0, !- Supply Air Flow Rate When No Cooling is Needed {m3/s}", + " autosize, !- Supply Air Flow Rate During Heating Operation {m3/s}", + " 0, !- Supply Air Flow Rate When No Heating is Needed {m3/s}", + " 0, !- Outdoor Air Flow Rate During Cooling Operation {m3/s}", + " 0, !- Outdoor Air Flow Rate During Heating Operation {m3/s}", + " 0, !- Outdoor Air Flow Rate When No Cooling or Heating is Needed {m3/s}", + " VRFFanSchedule, !- Supply Air Fan Operating Mode Schedule Name", + " drawthrough, !- Supply Air Fan Placement", + " Fan:OnOff, !- Supply Air Fan Object Type", + " TU1 VRF Supply Fan, !- Supply Air Fan Object Name", + " OutdoorAir:Mixer, !- Outside Air Mixer Object Type", + " TU1 OA Mixer, !- Outside Air Mixer Object Name", + " COIL:Cooling:DX:VariableRefrigerantFlow, !- Cooling Coil Object Type", + " TU1 VRF DX Cooling Coil, !- Cooling Coil Object Name", + " COIL:Heating:DX:VariableRefrigerantFlow, !- Heating Coil Object Type", + " TU1 VRF DX Heating Coil, !- Heating Coil Object Name", + " 30, !- Zone Terminal Unit On Parasitic Electric Energy Use {W}", + " 20; !- Zone Terminal Unit Off Parasitic Electric Energy Use{ W }", + + "Fan:OnOff,", + " TU1 VRF Supply Fan, !- Name", + " VRFAvailSched, !- Availability Schedule Name", + " 0.7, !- Fan Total Efficiency", + " 600.0, !- Pressure Rise{ Pa }", + " autosize, !- Maximum Flow Rate{ m3 / s }", + " 0.9, !- Motor Efficiency", + " 1.0, !- Motor In Airstream Fraction", + " TU1 VRF DX HCoil Outlet Node, !- Air Inlet Node Name", + " TU1 Outlet Node; !- Air Outlet Node Name", + + "OutdoorAir:Mixer,", + " TU1 OA Mixer, !- Name", + " TU1 VRF DX CCoil Inlet Node, !- Mixed Air Node Name", + " Outside Air Inlet Node 1, !- Outdoor Air Stream Node Name", + " Relief Air Outlet Node 1, !- Relief Air Stream Node Name", + " TU1 Inlet Node; !- Return Air Stream Node Name", + + "OutdoorAir:NodeList,", + " OutsideAirInletNodes; !- Node or NodeList Name 1", + + "NodeList,", + " OutsideAirInletNodes, !- Name", + " Outside Air Inlet Node 1, !- Node 1 Name", + " MyVRFOANode; !- Node 1 Name", + + "COIL:Cooling:DX:VariableRefrigerantFlow,", + " TU1 VRF DX Cooling Coil, !- Name", + " VRFAvailSched, !- Availability Schedule Name", + " autosize, !- Gross Rated Total Cooling Capacity {W}", + " autosize, !- Gross Rated Sensible Heat Ratio", + " autosize, !- Rated Air Flow Rate {m3/s}", + " VRFTUCoolCapFT, !- Cooling Capacity Ratio Modifier Function of Temperature Curve Name", + " VRFACCoolCapFFF, !- Cooling Capacity Modifier Curve Function of Flow Fraction Name", + " TU1 VRF DX CCoil Inlet Node, !- Coil Air Inlet Node", + " TU1 VRF DX CCoil Outlet Node, !- Coil Air Outlet Node", + " ; !- Name of Water Storage Tank for Condensate Collection", + + "COIL:Heating:DX:VariableRefrigerantFlow,", + " TU1 VRF DX Heating Coil, !- Name", + " VRFAvailSched, !- Availability Schedule", + " autosize, !- Gross Rated Heating Capacity {W}", + " autosize, !- Rated Air Flow Rate {m3/s}", + " TU1 VRF DX CCoil Outlet Node, !- Coil Air Inlet Node", + " TU1 VRF DX HCoil Outlet Node, !- Coil Air Outlet Node", + " VRFTUHeatCapFT, !- Heating Capacity Ratio Modifier Function of Temperature Curve Name", + " VRFACCoolCapFFF; !- Heating Capacity Modifier Function of Flow Fraction Curve Name", + + "ScheduleTypeLimits,", + " Any Number; !- Name", + + "Schedule:Compact,", + " VRFAvailSched, !- Name", + " Any Number, !- Schedule Type Limits Name", + " Through: 12/31, !- Field 1", + " For: AllDays, !- Field 2", + " Until: 24:00,1.0; !- Field 3", + + "Schedule:Compact,", + " VRFCondAvailSched, !- Name", + " Any Number, !- Schedule Type Limits Name", + " Through: 12/31, !- Field 1", + " For: AllDays, !- Field 2", + " Until: 24:00,1.0; !- Field 3", + + "Schedule:Compact,", + " VRFFanSchedule, !- Name", + " Any Number, !- Schedule Type Limits Name", + " Through: 12/31, !- Field 1", + " For: AllDays, !- Field 2", + " Until: 24:00,1.0; !- Field 3", + + "Curve:Biquadratic,", + " VRFCoolCapFT, !- Name", + " 0.576882692, !- Coefficient1 Constant", + " 0.017447952, !- Coefficient2 x", + " 0.000583269, !- Coefficient3 x**2", + " -1.76324E-06, !- Coefficient4 y", + " -7.474E-09, !- Coefficient5 y**2", + " -1.30413E-07, !- Coefficient6 x*y", + " 15, !- Minimum Value of x", + " 24, !- Maximum Value of x", + " -5, !- Minimum Value of y", + " 23, !- Maximum Value of y", + " , !- Minimum Curve Output", + " , !- Maximum Curve Output", + " Temperature, !- Input Unit Type for X", + " Temperature, !- Input Unit Type for Y", + " Dimensionless; !- Output Unit Type", + + "Curve:Cubic,", + " VRFCoolCapFTBoundary, !- Name", + " 25.73473775, !- Coefficient1 Constant", + " -0.03150043, !- Coefficient2 x", + " -0.01416595, !- Coefficient3 x**2", + " 0, !- Coefficient4 x**3", + " 11, !- Minimum Value of x", + " 30, !- Maximum Value of x", + " , !- Minimum Curve Output", + " , !- Maximum Curve Output", + " Temperature, !- Input Unit Type for X", + " Temperature; !- Output Unit Type", + + "Curve:Biquadratic,", + " VRFCoolCapFTHi, !- Name", + " 0.6867358, !- Coefficient1 Constant", + " 0.0207631, !- Coefficient2 x", + " 0.0005447, !- Coefficient3 x**2", + " -0.0016218, !- Coefficient4 y", + " -4.259E-07, !- Coefficient5 y**2", + " -0.0003392, !- Coefficient6 x*y", + " 15, !- Minimum Value of x", + " 24, !- Maximum Value of x", + " 16, !- Minimum Value of y", + " 43, !- Maximum Value of y", + " , !- Minimum Curve Output", + " , !- Maximum Curve Output", + " Temperature, !- Input Unit Type for X", + " Temperature, !- Input Unit Type for Y", + " Dimensionless; !- Output Unit Type", + + "Curve:Biquadratic,", + " VRFCoolEIRFT, !- Name", + " 0.989010541, !- Coefficient1 Constant", + " -0.02347967, !- Coefficient2 x", + " 0.000199711, !- Coefficient3 x**2", + " 0.005968336, !- Coefficient4 y", + " -1.0289E-07, !- Coefficient5 y**2", + " -0.00015686, !- Coefficient6 x*y", + " 15, !- Minimum Value of x", + " 24, !- Maximum Value of x", + " -5, !- Minimum Value of y", + " 23, !- Maximum Value of y", + " , !- Minimum Curve Output", + " , !- Maximum Curve Output", + " Temperature, !- Input Unit Type for X", + " Temperature, !- Input Unit Type for Y", + " Dimensionless; !- Output Unit Type", + + "Curve:Cubic,", + " VRFCoolEIRFTBoundary, !- Name", + " 25.73473775, !- Coefficient1 Constant", + " -0.03150043, !- Coefficient2 x", + " -0.01416595, !- Coefficient3 x**2", + " 0, !- Coefficient4 x**3", + " 15, !- Minimum Value of x", + " 24, !- Maximum Value of x", + " , !- Minimum Curve Output", + " , !- Maximum Curve Output", + " Temperature, !- Input Unit Type for X", + " Temperature; !- Output Unit Type", + + "Curve:Biquadratic,", + " VRFCoolEIRFTHi, !- Name", + " 0.14351470, !- Coefficient1 Constant", + " 0.01860035, !- Coefficient2 x", + " -0.0003954, !- Coefficient3 x**2", + " 0.02485219, !- Coefficient4 y", + " 0.00016329, !- Coefficient5 y**2", + " -0.0006244, !- Coefficient6 x*y", + " 15, !- Minimum Value of x", + " 24, !- Maximum Value of x", + " 16, !- Minimum Value of y", + " 43, !- Maximum Value of y", + " , !- Minimum Curve Output", + " , !- Maximum Curve Output", + " Temperature, !- Input Unit Type for X", + " Temperature, !- Input Unit Type for Y", + " Dimensionless; !- Output Unit Type", + + "Curve:Cubic,", + " CoolingEIRLowPLR, !- Name", + " 0.4628123, !- Coefficient1 Constant", + " -1.0402406, !- Coefficient2 x", + " 2.17490997, !- Coefficient3 x**2", + " -0.5974817, !- Coefficient4 x**3", + " 0, !- Minimum Value of x", + " 1, !- Maximum Value of x", + " , !- Minimum Curve Output", + " , !- Maximum Curve Output", + " Temperature, !- Input Unit Type for X", + " Temperature; !- Output Unit Type", + + "Curve:Quadratic,", + " CoolingEIRHiPLR, !- Name", + " 1.0, !- Coefficient1 Constant", + " 0.0, !- Coefficient2 x", + " 0.0, !- Coefficient3 x**2", + " 1.0, !- Minimum Value of x", + " 1.5, !- Maximum Value of x", + " , !- Minimum Curve Output", + " , !- Maximum Curve Output", + " Dimensionless, !- Input Unit Type for X", + " Dimensionless; !- Output Unit Type", + + "Curve:Linear,", + " CoolingCombRatio, !- Name", + " 0.618055, !- Coefficient1 Constant", + " 0.381945, !- Coefficient2 x", + " 1.0, !- Minimum Value of x", + " 1.5, !- Maximum Value of x", + " 1.0, !- Minimum Curve Output", + " 1.2, !- Maximum Curve Output", + " Dimensionless, !- Input Unit Type for X", + " Dimensionless; !- Output Unit Type", + + "CURVE:QUADRATIC,", + " VRFCPLFFPLR, !- Name", + " 0.85, !- Coefficient1 Constant", + " 0.15, !- Coefficient2 x", + " 0.0, !- Coefficient3 x**2", + " 0.0, !- Minimum Value of x", + " 1.0, !- Maximum Value of x", + " 0.85, !- Minimum Curve Output", + " 1.0, !- Maximum Curve Output", + " Dimensionless, !- Input Unit Type for X", + " Dimensionless; !- Output Unit Type", + + "Curve:Biquadratic,", + " VRFHeatCapFT, !- Name", + " 1.014599599, !- Coefficient1 Constant", + " -0.002506703, !- Coefficient2 x", + " -0.000141599, !- Coefficient3 x**2", + " 0.026931595, !- Coefficient4 y", + " 1.83538E-06, !- Coefficient5 y**2", + " -0.000358147, !- Coefficient6 x*y", + " 15, !- Minimum Value of x", + " 27, !- Maximum Value of x", + " -20, !- Minimum Value of y", + " 15, !- Maximum Value of y", + " , !- Minimum Curve Output", + " , !- Maximum Curve Output", + " Temperature, !- Input Unit Type for X", + " Temperature, !- Input Unit Type for Y", + " Dimensionless; !- Output Unit Type", + + "Curve:Cubic,", + " VRFHeatCapFTBoundary, !- Name", + " -7.6000882, !- Coefficient1 Constant", + " 3.05090016, !- Coefficient2 x", + " -0.1162844, !- Coefficient3 x**2", + " 0.0, !- Coefficient4 x**3", + " 15, !- Minimum Value of x", + " 27, !- Maximum Value of x", + " , !- Minimum Curve Output", + " , !- Maximum Curve Output", + " Temperature, !- Input Unit Type for X", + " Temperature; !- Output Unit Type", + + "Curve:Biquadratic,", + " VRFHeatCapFTHi, !- Name", + " 1.161134821, !- Coefficient1 Constant", + " 0.027478868, !- Coefficient2 x", + " -0.00168795, !- Coefficient3 x**2", + " 0.001783378, !- Coefficient4 y", + " 2.03208E-06, !- Coefficient5 y**2", + " -6.8969E-05, !- Coefficient6 x*y", + " 15, !- Minimum Value of x", + " 27, !- Maximum Value of x", + " -10, !- Minimum Value of y", + " 15, !- Maximum Value of y", + " , !- Minimum Curve Output", + " , !- Maximum Curve Output", + " Temperature, !- Input Unit Type for X", + " Temperature, !- Input Unit Type for Y", + " Dimensionless; !- Output Unit Type", + + "Curve:Biquadratic,", + " VRFHeatEIRFT, !- Name", + " 0.87465501, !- Coefficient1 Constant", + " -0.01319754, !- Coefficient2 x", + " 0.00110307, !- Coefficient3 x**2", + " -0.0133118, !- Coefficient4 y", + " 0.00089017, !- Coefficient5 y**2", + " -0.00012766, !- Coefficient6 x*y", + " 15, !- Minimum Value of x", + " 27, !- Maximum Value of x", + " -20, !- Minimum Value of y", + " 12, !- Maximum Value of y", + " , !- Minimum Curve Output", + " , !- Maximum Curve Output", + " Temperature, !- Input Unit Type for X", + " Temperature, !- Input Unit Type for Y", + " Dimensionless; !- Output Unit Type", + + "Curve:Cubic,", + " VRFHeatEIRFTBoundary, !- Name", + " -7.6000882, !- Coefficient1 Constant", + " 3.05090016, !- Coefficient2 x", + " -0.1162844, !- Coefficient3 x**2", + " 0.0, !- Coefficient4 x**3", + " 15, !- Minimum Value of x", + " 27, !- Maximum Value of x", + " -20, !- Minimum Curve Output", + " 15, !- Maximum Curve Output", + " Temperature, !- Input Unit Type for X", + " Temperature; !- Output Unit Type", + + "Curve:Biquadratic,", + " VRFHeatEIRFTHi, !- Name", + " 2.504005146, !- Coefficient1 Constant", + " -0.05736767, !- Coefficient2 x", + " 4.07336E-05, !- Coefficient3 x**2", + " -0.12959669, !- Coefficient4 y", + " 0.00135839, !- Coefficient5 y**2", + " 0.00317047, !- Coefficient6 x*y", + " 15, !- Minimum Value of x", + " 27, !- Maximum Value of x", + " -10, !- Minimum Value of y", + " 15, !- Maximum Value of y", + " , !- Minimum Curve Output", + " , !- Maximum Curve Output", + " Temperature, !- Input Unit Type for X", + " Temperature, !- Input Unit Type for Y", + " Dimensionless; !- Output Unit Type", + + "Curve:Cubic,", + " HeatingEIRLowPLR, !- Name", + " 0.1400093, !- Coefficient1 Constant", + " 0.6415002, !- Coefficient2 x", + " 0.1339047, !- Coefficient3 x**2", + " 0.0845859, !- Coefficient4 x**3", + " 0, !- Minimum Value of x", + " 1, !- Maximum Value of x", + " , !- Minimum Curve Output", + " , !- Maximum Curve Output", + " Dimensionless, !- Input Unit Type for X", + " Dimensionless; !- Output Unit Type", + + "Curve:Quadratic,", + " HeatingEIRHiPLR, !- Name", + " 2.4294355, !- Coefficient1 Constant", + " -2.235887, !- Coefficient2 x", + " 0.8064516, !- Coefficient3 x**2", + " 1.0, !- Minimum Value of x", + " 1.5, !- Maximum Value of x", + " , !- Minimum Curve Output", + " , !- Maximum Curve Output", + " Dimensionless, !- Input Unit Type for X", + " Dimensionless; !- Output Unit Type", + + "Curve:Linear,", + " HeatingCombRatio, !- Name", + " 0.96034, !- Coefficient1 Constant", + " 0.03966, !- Coefficient2 x", + " 1.0, !- Minimum Value of x", + " 1.5, !- Maximum Value of x", + " 1.0, !- Minimum Curve Output", + " 1.023, !- Maximum Curve Output", + " Dimensionless, !- Input Unit Type for X", + " Dimensionless; !- Output Unit Type", + + "Curve:Biquadratic,", + " CoolingLengthCorrectionFactor, !- Name", + " 1.0693794, !- Coefficient1 Constant", + " -0.0014951, !- Coefficient2 x", + " 2.56E-06, !- Coefficient3 x**2", + " -0.1151104, !- Coefficient4 y", + " 0.0511169, !- Coefficient5 y**2", + " -0.0004369, !- Coefficient6 x*y", + " 8, !- Minimum Value of x", + " 175, !- Maximum Value of x", + " 0.5, !- Minimum Value of y", + " 1.5, !- Maximum Value of y", + " , !- Minimum Curve Output", + " , !- Maximum Curve Output", + " Temperature, !- Input Unit Type for X", + " Temperature, !- Input Unit Type for Y", + " Dimensionless; !- Output Unit Type", + + "Curve:Cubic,", + " VRFTUCoolCapFT, !- Name", + " 0.504547273506488, !- Coefficient1 Constant", + " 0.0288891279198444, !- Coefficient2 x", + " -0.000010819418650677, !- Coefficient3 x**2", + " 0.0000101359395177008, !- Coefficient4 x**3", + " 0.0, !- Minimum Value of x", + " 50.0, !- Maximum Value of x", + " 0.5, !- Minimum Curve Output", + " 1.5, !- Maximum Curve Output", + " Temperature, !- Input Unit Type for X", + " Dimensionless; !- Output Unit Type", + + "Curve:Quadratic,", + " VRFACCoolCapFFF, !- Name", + " 0.8, !- Coefficient1 Constant", + " 0.2, !- Coefficient2 x", + " 0.0, !- Coefficient3 x**2", + " 0.5, !- Minimum Value of x", + " 1.5; !- Maximum Value of x", + + "Curve:Cubic,", + " VRFTUHeatCapFT, !- Name", + " -0.390708928227928, !- Coefficient1 Constant", + " 0.261815023760162, !- Coefficient2 x", + " -0.0130431603151873, !- Coefficient3 x**2", + " 0.000178131745997821, !- Coefficient4 x**3", + " 0.0, !- Minimum Value of x", + " 50.0, !- Maximum Value of x", + " 0.5, !- Minimum Curve Output", + " 1.5, !- Maximum Curve Output", + " Temperature, !- Input Unit Type for X", + " Dimensionless; !- Output Unit Type", + }); + + ASSERT_TRUE(process_idf(idf_objects)); + + DataGlobals::BeginEnvrnFlag = true; + DataSizing::CurZoneEqNum = 1; + DataEnvironment::OutBaroPress = 101325; // sea level + DataZoneEquipment::ZoneEquipInputsFilled = true; // denotes zone equipment has been read in + StdRhoAir = PsyRhoAirFnPbTdbW(DataEnvironment::OutBaroPress, 20.0, 0.0); + ZoneEqSizing.allocate(1); + ZoneSizingRunDone = true; + ZoneEqSizing(CurZoneEqNum).DesignSizeFromParent = false; + ZoneEqSizing(CurZoneEqNum).SizingMethod.allocate(25); + ZoneEqSizing(CurZoneEqNum).SizingMethod(DataHVACGlobals::SystemAirflowSizing) = DataSizing::SupplyAirFlowRate; + FinalZoneSizing.allocate(1); + FinalZoneSizing(CurZoneEqNum).DesCoolVolFlow = 0.566337; + FinalZoneSizing(CurZoneEqNum).DesHeatVolFlow = 0.566337; + + ZoneSysEnergyDemand.allocate(1); + ProcessScheduleInput(); + GetCurveInput(); + GetZoneData(ErrorsFound); + EXPECT_FALSE(ErrorsFound); + // get zone input and connections + GetZoneEquipmentData(); + ZoneInletAirNode = GetVRFTUZoneInletAirNode(VRFTUNum); + Schedule(VRF(VRFCond).SchedPtr).CurrentValue = 1.0; + Schedule(VRFTU(VRFTUNum).SchedPtr).CurrentValue = 1.0; + Schedule(VRFTU(VRFTUNum).FanAvailSchedPtr).CurrentValue = 1.0; + Schedule(VRFTU(VRFTUNum).FanOpModeSchedPtr).CurrentValue = 0.0; + // set the zone cooling and heat requirements + ZoneSysEnergyDemand(CurZoneNum).RemainingOutputRequired = -5000.0; + ZoneSysEnergyDemand(CurZoneNum).RemainingOutputReqToCoolSP = -5000.0; + ZoneSysEnergyDemand(CurZoneNum).RemainingOutputReqToHeatSP = 0.0; + + auto &thisZoneEquip(ZoneEquipConfig(NumOfZones)); + // set zone air node properties + Node(thisZoneEquip.ZoneNode).Temp = 24.0; + Node(thisZoneEquip.ZoneNode).HumRat = 0.0075; + Node(thisZoneEquip.ZoneNode).Enthalpy = Psychrometrics::PsyHFnTdbW(Node(thisZoneEquip.ZoneNode).Temp, Node(thisZoneEquip.ZoneNode).HumRat); + + auto &thisVRFTU(VRFTU(1)); + Node(thisVRFTU.VRFTUInletNodeNum).Temp = 24.0; + Node(thisVRFTU.VRFTUInletNodeNum).HumRat = 0.0075; + Node(thisVRFTU.VRFTUInletNodeNum).Enthalpy = Psychrometrics::PsyHFnTdbW(Node(thisVRFTU.VRFTUInletNodeNum).Temp, Node(thisVRFTU.VRFTUInletNodeNum).HumRat); + + DataEnvironment::OutDryBulbTemp = 35.0; + DataEnvironment::OutHumRat = 0.0100; + DataEnvironment::OutBaroPress = 101325.0; + DataEnvironment::WindSpeed = 5.0; + DataEnvironment::WindDir = 0.0; + + FinalZoneSizing(CurZoneEqNum).ZoneRetTempAtCoolPeak = Node(thisVRFTU.VRFTUInletNodeNum).Temp; + FinalZoneSizing(CurZoneEqNum).ZoneHumRatAtCoolPeak = Node(thisVRFTU.VRFTUInletNodeNum).HumRat; + FinalZoneSizing(CurZoneEqNum).CoolDDNum = 1; + FinalZoneSizing(CurZoneEqNum).TimeStepNumAtCoolMax = 1; + DesDayWeath.allocate(1); + DesDayWeath(1).Temp.allocate(1); + DesDayWeath(FinalZoneSizing(CurZoneEqNum).CoolDDNum).Temp(FinalZoneSizing(CurZoneEqNum).TimeStepNumAtCoolMax) = DataEnvironment::OutDryBulbTemp; + FinalZoneSizing(CurZoneEqNum).CoolDesTemp = 13.1; + FinalZoneSizing(CurZoneEqNum).CoolDesHumRat = 0.0095; + // set pointer to components + auto &thisFan(Fan(1)); + auto &thisDXCoolingCoil(DXCoil(1)); + auto &thisDXHeatingCoil(DXCoil(2)); + // run the model + SimulateVRF(VRFTU(VRFTUNum).Name, CurZoneNum, FirstHVACIteration, SysOutputProvided, LatOutputProvided, ZoneEquipList(CurZoneEqNum).EquipIndex(EquipPtr)); + // check model inputs + ASSERT_EQ(1, NumVRFCond); + ASSERT_EQ(1, NumVRFTU); + ASSERT_EQ(1, NumFans); + ASSERT_EQ(2, NumDXCoils); + ASSERT_EQ("TU1 VRF DX COOLING COIL", thisDXCoolingCoil.Name); + ASSERT_EQ("TU1 VRF DX HEATING COIL", thisDXHeatingCoil.Name); + // check if total cooling rate provided by the cooling coil matches + // sum of the cooling delivered by VRF ATU and fan power when no OA + EXPECT_EQ(0.0, thisVRFTU.CoolOutAirMassFlow); + EXPECT_EQ(0.0, thisVRFTU.HeatOutAirMassFlow); + EXPECT_EQ(0.0, thisVRFTU.NoCoolHeatOutAirMassFlow); + EXPECT_NEAR(5367.5132, thisDXCoolingCoil.TotalCoolingEnergyRate, 0.0001); + EXPECT_NEAR(4999.3622, thisVRFTU.TotalCoolingRate, 0.0001); + EXPECT_NEAR(368.1510, thisFan.FanPower, 0.0001); + EXPECT_NEAR(thisDXCoolingCoil.TotalCoolingEnergyRate, (thisVRFTU.TotalCoolingRate + thisFan.FanPower), 0.0001); +} + +TEST_F(EnergyPlusFixture, VRF_FluidTCtrl_ReportOutputVerificationTest) +{ + // PURPOSE OF THIS TEST: + // Test a group of methods related with the outdoor unit compressor calculations in the VRF_FluidTCtrl model. + + // Inputs_general + bool ErrorsFound(false); // function returns true on error + bool FirstHVACIteration(true); // simulate the first pass through HVAC simulation, use false for next iteration + int VRFCond(1); // index to VRF condenser + int VRFTUNum(1); // index to VRF terminal unit + int EquipPtr(1); // index to equipment list + int CurZoneNum(1); // index to zone + Real64 SysOutputProvided(0.0); // function returns sensible capacity [W] + Real64 LatOutputProvided(0.0); // function returns latent capacity [W] + + std::string const idf_objects = delimited_string({ + "AirConditioner:VariableRefrigerantFlow:FluidTemperatureControl:HR, ", + " VRF Heat Pump, !- Name ", + " VRFAvailSched, !- Availability Schedule Name ", + " VRF Heat Pump TU List, !- Zone Terminal Unit List Name ", + " R410A, !- Refrigerant Type ", + " 48757, !- Rated Evaporative Capacity {W} ", + " 0.214, !- Rated Compressor Power Per Unit of Rated Evaporative Capacity ", + " -6, !- Minimum Outdoor Air Temperature in Cooling Only Mode {C} ", + " 43, !- Maximum Outdoor Air Temperature in Cooling Only Mode {C} ", + " -20, !- Minimum Outdoor Air Temperature in Heating Only Mode {C} ", + " 26, !- Maximum Outdoor Air Temperature in Heating Only Mode {C} ", + " -20, !- Minimum Outdoor Air Temperature in Heat Recovery Mode {C} ", + " 26, !- Maximum Outdoor Air Temperature in Heat Recovery Mode {C} ", + " ConstantTemp, !- Refrigerant Temperature Control Algorithm for Indoor Unit ", + " 6, !- Reference Evaporating Temperature for Indoor Unit {C} ", + " 44, !- Reference Condensing Temperature for Indoor Unit {C} ", + " 5, !- Variable Evaporating Temperature Minimum for Indoor Unit {C} ", + " 14, !- Variable Evaporating Temperature Maximum for Indoor Unit {C} ", + " 36, !- Variable Condensing Temperature Minimum for Indoor Unit {C} ", + " 46, !- Variable Condensing Temperature Maximum for Indoor Unit {C} ", + " 3, !- Outdoor Unit Evaporator Reference Superheating {C} ", + " 3, !- Outdoor Unit Condenser Reference Subcooling {C} ", + " 0.28, !- Outdoor Unit Evaporator Rated Bypass Factor ", + " 0.05, !- Outdoor Unit Condenser Rated Bypass Factor ", + " 5, !- Difference between Outdoor Unit Evaporating Temperature and Ou", + " 0.3, !- Outdoor Unit Heat Exchanger Capacity Ratio ", + " 2.67E-2, !- Outdoor Unit Fan Power Per Unit of Rated Evaporative Capacity ", + " 1.13E-4, !- Outdoor Unit Fan Flow Rate Per Unit of Rated Evaporative Capac", + " OUEvapTempCurve, !- Outdoor Unit Evaporating Temperature Function of Superheating ", + " OUCondTempCurve, !- Outdoor Unit Condensing Temperature Function of Subcooling Cur", + " 0.0349, !- Diameter of Main Pipe for Suction Gas {m} ", + " 0.0286, !- Diameter of Main Pipe for Discharge Gas {m} ", + " 30, !- Length of main pipe connecting outdoor unit to indoor units {m", + " 36, !- Equivalent length of main pipe connecting outdoor unit to indo", + " 5, !- Height difference between the outdoor unit node and indoor uni", + " 0.02, !- Insulation thickness of the main pipe {m} ", + " 0.032, !- Thermal conductivity of the main pipe insulation material {W/m", + " 33, !- Crankcase Heater Power per Compressor {W} ", + " 3, !- Number of Compressors ", + " 0.33, !- Ratio of Compressor Size to Total Compressor Capacity ", + " 7, !- Maximum Outdoor Dry-bulb Temperature for Crankcase Heater {C} ", + " , !- Defrost Strategy ", + " , !- Defrost Control ", + " , !- Defrost Energy Input Ratio Modifier Function of Temperature Cu", + " , !- Defrost Time Period Fraction ", + " , !- Resistive Defrost Heater Capacity {W} ", + " , !- Maximum Outdoor Dry-bulb Temperature for Defrost Operation {C}", + " , !- Initial Heat Recovery Cooling Capacity Fraction {W/W} ", + " , !- Heat Recovery Cooling Capacity Time Constant {hr} ", + " , !- Initial Heat Recovery Cooling Energy Fraction {W/W} ", + " , !- Heat Recovery Cooling Energy Time Constant {hr} ", + " , !- Initial Heat Recovery Heating Capacity Fraction {W/W} ", + " , !- Heat Recovery Heating Capacity Time Constant {hr} ", + " , !- Initial Heat Recovery Heating Energy Fraction {W/W} ", + " , !- Heat Recovery Heating Energy Time Constant {hr} ", + " 4500000, !- Compressor maximum delta Pressure {Pa} ", + " 0.95, !- Compressor Inverter Efficiency ", + " , !- Compressor Evaporative Capacity Correction Factor ", + " 3, !- Number of Compressor Loading Index Entries ", + " 1500, !- Compressor Speed at Loading Index 1 {rev/min} ", + " MinSpdCooling, !- Loading Index 1 Evaporative Capacity Multiplier Function of Te", + " MinSpdPower, !- Loading Index 1 Compressor Power Multiplier Function of Temper", + " 3600, !- Compressor Speed at Loading Index 2 {rev/min} ", + " Spd1Cooling, !- Loading Index 2 Evaporative Capacity Multiplier Function of Te", + " Spd1Power, !- Loading Index 2 Compressor Power Multiplier Function of Temper", + " 6000, !- Compressor Speed at Loading Index 3 {rev/min} ", + " Spd2Cooling, !- Loading Index 3 Evaporative Capacity Multiplier Function of Te", + " Spd2Power; !- Loading Index 3 Compressor Power Multiplier Function of Temper", + " ", + "Curve:Quadratic, ", + " OUEvapTempCurve, !- Name ", + " 0, !- Coefficient1 Constant ", + " 6.05E-1, !- Coefficient2 x ", + " 2.50E-2, !- Coefficient3 x**2 ", + " 0, !- Minimum Value of x ", + " 15, !- Maximum Value of x ", + " , !- Minimum Curve Output ", + " , !- Maximum Curve Output ", + " Temperature, !- Input Unit Type for X ", + " Temperature; !- Output Unit Type ", + " ", + "Curve:Quadratic, ", + " OUCondTempCurve, !- Name ", + " 0, !- Coefficient1 Constant ", + " -2.91, !- Coefficient2 x ", + " 1.180, !- Coefficient3 x**2 ", + " 0, !- Minimum Value of x ", + " 20, !- Maximum Value of x ", + " , !- Minimum Curve Output ", + " , !- Maximum Curve Output ", + " Temperature, !- Input Unit Type for X ", + " Temperature; !- Output Unit Type ", + " ", + "Curve:Biquadratic, ", + " MinSpdCooling, !- Name ", + " 3.19E-01, !- Coefficient1 Constant ", + " -1.26E-03, !- Coefficient2 x ", + " -2.15E-05, !- Coefficient3 x**2 ", + " 1.20E-02, !- Coefficient4 y ", + " 1.05E-04, !- Coefficient5 y**2 ", + " -8.66E-05, !- Coefficient6 x*y ", + " 15, !- Minimum Value of x ", + " 65, !- Maximum Value of x ", + " -30, !- Minimum Value of y ", + " 15, !- Maximum Value of y ", + " , !- Minimum Curve Output ", + " , !- Maximum Curve Output ", + " Temperature, !- Input Unit Type for X ", + " Temperature, !- Input Unit Type for Y ", + " Dimensionless; !- Output Unit Type ", + " ", + "Curve:Biquadratic, ", + " MinSpdPower, !- Name ", + " 8.79E-02 , !- Coefficient1 Constant ", + " -1.72E-04, !- Coefficient2 x ", + " 6.93E-05 , !- Coefficient3 x**2 ", + " -3.38E-05, !- Coefficient4 y ", + " -8.10E-06, !- Coefficient5 y**2 ", + " -1.04E-05, !- Coefficient6 x*y ", + " 15, !- Minimum Value of x ", + " 65, !- Maximum Value of x ", + " -30, !- Minimum Value of y ", + " 15, !- Maximum Value of y ", + " , !- Minimum Curve Output ", + " , !- Maximum Curve Output ", + " Temperature, !- Input Unit Type for X ", + " Temperature, !- Input Unit Type for Y ", + " Dimensionless; !- Output Unit Type ", + " ", + "Curve:Biquadratic, ", + " Spd1Cooling, !- Name ", + " 8.12E-01 , !- Coefficient1 Constant ", + " -4.23E-03, !- Coefficient2 x ", + " -4.11E-05, !- Coefficient3 x**2 ", + " 2.97E-02 , !- Coefficient4 y ", + " 2.67E-04 , !- Coefficient5 y**2 ", + " -2.23E-04, !- Coefficient6 x*y ", + " 15, !- Minimum Value of x ", + " 65, !- Maximum Value of x ", + " -30, !- Minimum Value of y ", + " 15, !- Maximum Value of y ", + " , !- Minimum Curve Output ", + " , !- Maximum Curve Output ", + " Temperature, !- Input Unit Type for X ", + " Temperature, !- Input Unit Type for Y ", + " Dimensionless; !- Output Unit Type ", + " ", + "Curve:Biquadratic, ", + " Spd1Power, !- Name ", + " 3.26E-01 , !- Coefficient1 Constant ", + " -2.20E-03, !- Coefficient2 x ", + " 1.42E-04 , !- Coefficient3 x**2 ", + " 2.82E-03 , !- Coefficient4 y ", + " 2.86E-05 , !- Coefficient5 y**2 ", + " -3.50E-05, !- Coefficient6 x*y ", + " 15, !- Minimum Value of x ", + " 65, !- Maximum Value of x ", + " -30, !- Minimum Value of y ", + " 15, !- Maximum Value of y ", + " , !- Minimum Curve Output ", + " , !- Maximum Curve Output ", + " Temperature, !- Input Unit Type for X ", + " Temperature, !- Input Unit Type for Y ", + " Dimensionless; !- Output Unit Type ", + " ", + "Curve:Biquadratic, ", + " Spd2Cooling, !- Name ", + " 1.32E+00 , !- Coefficient1 Constant ", + " -6.20E-03, !- Coefficient2 x ", + " -7.10E-05, !- Coefficient3 x**2 ", + " 4.89E-02 , !- Coefficient4 y ", + " 4.59E-04 , !- Coefficient5 y**2 ", + " -3.67E-04, !- Coefficient6 x*y ", + " 15, !- Minimum Value of x ", + " 65, !- Maximum Value of x ", + " -30, !- Minimum Value of y ", + " 15, !- Maximum Value of y ", + " , !- Minimum Curve Output ", + " , !- Maximum Curve Output ", + " Temperature, !- Input Unit Type for X ", + " Temperature, !- Input Unit Type for Y ", + " Dimensionless; !- Output Unit Type ", + " ", + "Curve:Biquadratic, ", + " Spd2Power, !- Name ", + " 6.56E-01 , !- Coefficient1 Constant ", + " -3.71E-03, !- Coefficient2 x ", + " 2.07E-04 , !- Coefficient3 x**2 ", + " 1.05E-02 , !- Coefficient4 y ", + " 7.36E-05 , !- Coefficient5 y**2 ", + " -1.57E-04, !- Coefficient6 x*y ", + " 15, !- Minimum Value of x ", + " 65, !- Maximum Value of x ", + " -30, !- Minimum Value of y ", + " 15, !- Maximum Value of y ", + " , !- Minimum Curve Output ", + " , !- Maximum Curve Output ", + " Temperature, !- Input Unit Type for X ", + " Temperature, !- Input Unit Type for Y ", + " Dimensionless; !- Output Unit Type ", + + "Zone,", + " SPACE1-1, !- Name", + " 0, !- Direction of Relative North {deg}", + " 0, !- X Origin {m}", + " 0, !- Y Origin {m}", + " 0, !- Z Origin {m}", + " 1, !- Type", + " 1, !- Multiplier", + " 2.438400269, !- Ceiling Height {m}", + " 239.247360229; !- Volume {m3}", + + "ZoneHVAC:EquipmentConnections,", + " SPACE1-1, !- Zone Name", + " SPACE1-1 Eq, !- Zone Conditioning Equipment List Name", + " TU1 Outlet Node, !- Zone Air Inlet Node or NodeList Name", + " TU1 Inlet Node, !- Zone Air Exhaust Node or NodeList Name", + " SPACE1-1 Node, !- Zone Air Node Name", + " SPACE1-1 Out Node; !- Zone Return Air Node Name", // not used anywhere else in the example file + + "ZoneHVAC:EquipmentList,", + " SPACE1-1 Eq, !- Name", + " SequentialLoad, !- Load Distribution Scheme", + " ZoneHVAC:TerminalUnit:VariableRefrigerantFlow, !- Zone Equipment 1 Object Type", + " TU1, !- Zone Equipment 1 Name", + " 1, !- Zone Equipment 1 Cooling Sequence", + " 1; !- Zone Equipment 1 Heating or No-Load Sequence", + + "ZoneTerminalUnitList,", + " VRF Heat Pump TU List, !- Zone Terminal Unit List Name", + " TU1; !- Zone Terminal Unit Name 1", + + "ZoneHVAC:TerminalUnit:VariableRefrigerantFlow,", + " TU1, !- Zone Terminal Unit Name", + " VRFAvailSched, !- Terminal Unit Availability Schedule", + " TU1 Inlet Node, !- Terminal Unit Air Inlet Node Name", + " TU1 Outlet Node, !- Terminal Unit Air Outlet Node Name", + " autosize, !- Supply Air Flow Rate During Cooling Operation {m3/s}", + " 0, !- Supply Air Flow Rate When No Cooling is Needed {m3/s}", + " autosize, !- Supply Air Flow Rate During Heating Operation {m3/s}", + " 0, !- Supply Air Flow Rate When No Heating is Needed {m3/s}", + " 0, !- Outdoor Air Flow Rate During Cooling Operation {m3/s}", + " 0, !- Outdoor Air Flow Rate During Heating Operation {m3/s}", + " 0, !- Outdoor Air Flow Rate When No Cooling or Heating is Needed {m3/s}", + " VRFFanSchedule, !- Supply Air Fan Operating Mode Schedule Name", + " drawthrough, !- Supply Air Fan Placement", + " Fan:VariableVolume, !- Supply Air Fan Object Type", + " TU1 VRF Supply Fan, !- Supply Air Fan Object Name", + " , !- Outside Air Mixer Object Type", + " , !- Outside Air Mixer Object Name", + " COIL:Cooling:DX:VariableRefrigerantFlow:FluidTemperatureControl, !- Cooling Coil Object Type", + " TU1 VRF DX Cooling Coil, !- Cooling Coil Object Name", + " COIL:Heating:DX:VariableRefrigerantFlow:FluidTemperatureControl, !- Heating Coil Object Type", + " TU1 VRF DX Heating Coil, !- Heating Coil Object Name", + " 30, !- Zone Terminal Unit On Parasitic Electric Energy Use {W}", + " 20; !- Zone Terminal Unit Off Parasitic Electric Energy Use{ W }", + + "Schedule:Compact,", + " VRFAvailSched, !- Name", + " Any Number, !- Schedule Type Limits Name", + " Through: 12/31, !- Field 1", + " For: AllDays, !- Field 2", + " Until: 24:00,1.0; !- Field 3", + + "Schedule:Compact,", + " VRFFanSchedule, !- Name", + " Any Number, !- Schedule Type Limits Name", + " Through: 12/31, !- Field 1", + " For: AllDays, !- Field 2", + " Until: 24:00,1.0; !- Field 3", + + "ScheduleTypeLimits,", + " Any Number; !- Name", + + " Coil:Cooling:DX:VariableRefrigerantFlow:FluidTemperatureControl, ", + " TU1 VRF DX Cooling Coil, !- Name ", + " VRFAvailSched, !- Availability Schedule Name ", + " TU1 Inlet Node, !- Coil Air Inlet Node ", + " TU1 VRF DX CCoil Outlet Node, !- Coil Air Outlet Node ", + " 5500, !- Rated Total Cooling Capacity {W} ", + " 0.865, !- Rated Sensible Heat Ratio ", + " 3, !- Indoor Unit Reference Superheating ", + " IUEvapTempCurve, !- Indoor Unit Evaporating Temperature", + " ; !- Name of Water Storage Tank for Cond", + + " Curve:Quadratic, ", + " IUEvapTempCurve, !- Name ", + " 0, !- Coefficient1 Const ", + " 0.80404, !- Coefficient2 x ", + " 0, !- Coefficient3 x**2 ", + " 0, !- Minimum Value of x ", + " 15, !- Maximum Value of x ", + " , !- Minimum Curve Outp ", + " , !- Maximum Curve Outp ", + " Dimensionless, !- Input Unit Type fo ", + " Dimensionless; !- Output Unit Type ", + + " Coil:Heating:DX:VariableRefrigerantFlow:FluidTemperatureControl,", + " TU1 VRF DX Heating Coil, !- Name", + " VRFAvailSched, !- Availability Schedule", + " TU1 VRF DX CCoil Outlet Node, !- Coil Air Inlet Node", + " TU1 VRF DX HCoil Outlet Node, !- Coil Air Outlet Node", + " 6500.0, !- Rated Total Heating Capacity {W}", + " 5, !- Indoor Unit Reference Subcooling Degrees Setpoint {C} ", + " IUCondTempCurve; !- Indoor Unit Condensing Temperature Function of Subcooling Curve Name", + + " Curve:Quadratic,", + " IUCondTempCurve, !- Name", + " -1.85, !- Coefficient1 Constant", + " 0.411, !- Coefficient2 x", + " 0.0196, !- Coefficient3 x**2", + " 0, !- Minimum Value of x ", + " 20, !- Maximum Value of x ", + " , !- Minimum Curve Output", + " , !- Maximum Curve Output", + " Temperature, !- Input Unit Type for X", + " Temperature; !- Output Unit Type", + + " Fan:VariableVolume,", + " TU1 VRF Supply Fan, !- Name", + " VRFAvailSched, !- Availability Schedule Name", + " 0.7, !- Fan Total Efficiency", + " 600, !- Pressure Rise {Pa}", + " autosize, !- Maximum Flow Rate {m3/s}", + " Fraction, !- Fan Power Minimum Flow Rate Input Method", + " 0, !- Fan Power Minimum Flow Fraction", + " 0, !- Fan Power Minimum Air Flow Rate {m3/s}", + " 0.9, !- Motor Efficiency", + " 1, !- Motor In Airstream Fraction", + " 0.059, !- Fan Power Coefficient 1", + " 0, !- Fan Power Coefficient 2", + " 0, !- Fan Power Coefficient 3", + " 0.928, !- Fan Power Coefficient 4", + " 0, !- Fan Power Coefficient 5", + " TU1 VRF DX HCoil Outlet Node, !- Air Inlet Node Name", + " TU1 Outlet Node, !- Air Outlet Node Name", + " General; !- End-Use Subcategory", + + + " !- =========== ALL OBJECTS IN CLASS: FLUIDPROPERTIES:NAME =========== ", + " ", + " FluidProperties:Name, ", + " R410a, !- Fluid Name ", + " Refrigerant; !- Fluid Type ", + " ", + " !- =========== ALL OBJECTS IN CLASS: FLUIDPROPERTIES:TEMPERATURES =========== ", + " ", + " FluidProperties:Temperatures, ", + " R410aSaturatedTemperatures, !- Name ", + " -72.000,-69.000,-66.000,-63.000,-60.000,-57.000,-54.000, ", + " -51.000,-48.000,-45.000,-42.000,-39.000,-36.000,-33.000, ", + " -30.000,-27.000,-24.000,-21.000,-18.000,-15.000,-12.000, ", + " -9.000,-6.000,-3.000,0.000,3.000,6.000,9.000, ", + " 12.000,15.000,18.000,21.000,24.000,27.000,30.000, ", + " 33.000,36.000,39.000,42.000,45.000,48.000,51.000, ", + " 54.000,57.000,60.000,63.000,66.000,69.000; ", + " ", + " FluidProperties:Temperatures, ", + " R410aSuperHeatTemperatures, !- Name ", + " -72.000,-66.000,-60.000,-54.000,-48.000,-45.000,-42.000, ", + " -39.000,-36.000,-33.000,-30.000,-27.000,-24.000,-21.000, ", + " -18.000,-15.000,-12.000,-9.000,-6.000,-3.000,0.000, ", + " 3.000,6.000,9.000,12.000,15.000,18.000,21.000, ", + " 24.000,27.000,30.000,33.000,36.000,39.000,42.000, ", + " 45.000,48.000,51.000,54.000,57.000,60.000,63.000, ", + " 66.000,69.000; ", + " ", + " !- =========== ALL OBJECTS IN CLASS: FLUIDPROPERTIES:SATURATED =========== ", + " ", + " FluidProperties:Saturated, ", + " R410a, !- Name ", + " Pressure, !- Fluid Property Type ", + " FluidGas, !- Fluid Phase ", + " R410aSaturatedTemperatures, !- Temperature Values Name ", + " 3.1238E+04,3.7717E+04,4.5248E+04,5.3954E+04,6.3963E+04,7.5412E+04,8.8445E+04, ", + " 1.0321E+05,1.1988E+05,1.3860E+05,1.5955E+05,1.8292E+05,2.0888E+05,2.3762E+05, ", + " 2.6935E+05,3.0426E+05,3.4257E+05,3.8449E+05,4.3024E+05,4.8004E+05,5.3412E+05, ", + " 5.9273E+05,6.5609E+05,7.2446E+05,7.9808E+05,8.7722E+05,9.6214E+05,1.0531E+06, ", + " 1.1504E+06,1.2543E+06,1.3651E+06,1.4831E+06,1.6086E+06,1.7419E+06,1.8834E+06, ", + " 2.0334E+06,2.1923E+06,2.3604E+06,2.5382E+06,2.7261E+06,2.9246E+06,3.1341E+06, ", + " 3.3552E+06,3.5886E+06,3.8348E+06,4.0949E+06,4.3697E+06,4.6607E+06; ", + " ", + " FluidProperties:Saturated, ", + " R410a, !- Name ", + " Enthalpy, !- Fluid Property Type ", + " Fluid, !- Fluid Phase ", + " R410aSaturatedTemperatures, !- Temperature Values Name ", + " 9.8535E+04,1.0259E+05,1.0665E+05,1.1072E+05,1.1479E+05,1.1888E+05,1.2297E+05, ", + " 1.2707E+05,1.3119E+05,1.3532E+05,1.3947E+05,1.4363E+05,1.4782E+05,1.5202E+05, ", + " 1.5624E+05,1.6048E+05,1.6475E+05,1.6904E+05,1.7337E+05,1.7772E+05,1.8210E+05, ", + " 1.8652E+05,1.9097E+05,1.9547E+05,2.0000E+05,2.0458E+05,2.0920E+05,2.1388E+05, ", + " 2.1861E+05,2.2340E+05,2.2825E+05,2.3316E+05,2.3815E+05,2.4322E+05,2.4838E+05, ", + " 2.5363E+05,2.5899E+05,2.6447E+05,2.7008E+05,2.7585E+05,2.8180E+05,2.8797E+05, ", + " 2.9441E+05,3.0120E+05,3.0848E+05,3.1650E+05,3.2578E+05,3.3815E+05; ", + " ", + " FluidProperties:Saturated, ", + " R410a, !- Name ", + " Enthalpy, !- Fluid Property Type ", + " FluidGas, !- Fluid Phase ", + " R410aSaturatedTemperatures, !- Temperature Values Name ", + " 3.8813E+05,3.8981E+05,3.9148E+05,3.9313E+05,3.9476E+05,3.9637E+05,3.9796E+05, ", + " 3.9953E+05,4.0108E+05,4.0260E+05,4.0410E+05,4.0557E+05,4.0701E+05,4.0842E+05, ", + " 4.0980E+05,4.1114E+05,4.1245E+05,4.1373E+05,4.1496E+05,4.1615E+05,4.1730E+05, ", + " 4.1840E+05,4.1945E+05,4.2045E+05,4.2139E+05,4.2227E+05,4.2308E+05,4.2382E+05, ", + " 4.2448E+05,4.2507E+05,4.2556E+05,4.2595E+05,4.2624E+05,4.2641E+05,4.2646E+05, ", + " 4.2635E+05,4.2609E+05,4.2564E+05,4.2498E+05,4.2408E+05,4.2290E+05,4.2137E+05, ", + " 4.1941E+05,4.1692E+05,4.1370E+05,4.0942E+05,4.0343E+05,3.9373E+05; ", + " ", + " FluidProperties:Saturated, ", + " R410a, !- Name ", + " Density, !- Fluid Property Type ", + " Fluid, !- Fluid Phase ", + " R410aSaturatedTemperatures, !- Temperature Values Name ", + " 1.4127E+03,1.4036E+03,1.3946E+03,1.3854E+03,1.3762E+03,1.3669E+03,1.3576E+03, ", + " 1.3482E+03,1.3387E+03,1.3291E+03,1.3194E+03,1.3097E+03,1.2998E+03,1.2898E+03, ", + " 1.2797E+03,1.2694E+03,1.2591E+03,1.2486E+03,1.2379E+03,1.2271E+03,1.2160E+03, ", + " 1.2048E+03,1.1934E+03,1.1818E+03,1.1699E+03,1.1578E+03,1.1454E+03,1.1328E+03, ", + " 1.1197E+03,1.1064E+03,1.0927E+03,1.0785E+03,1.0639E+03,1.0488E+03,1.0331E+03, ", + " 1.0167E+03,9.9971E+02,9.8187E+02,9.6308E+02,9.4319E+02,9.2198E+02,8.9916E+02, ", + " 8.7429E+02,8.4672E+02,8.1537E+02,7.7825E+02,7.3095E+02,6.5903E+02; ", + " ", + " FluidProperties:Saturated, ", + " R410a, !- Name ", + " Density, !- Fluid Property Type ", + " FluidGas, !- Fluid Phase ", + " R410aSaturatedTemperatures, !- Temperature Values Name ", + " 1.3845E+00,1.6517E+00,1.9588E+00,2.3100E+00,2.7097E+00,3.1627E+00,3.6737E+00, ", + " 4.2482E+00,4.8916E+00,5.6098E+00,6.4088E+00,7.2952E+00,8.2758E+00,9.3578E+00, ", + " 1.0549E+01,1.1857E+01,1.3292E+01,1.4861E+01,1.6576E+01,1.8447E+01,2.0485E+01, ", + " 2.2702E+01,2.5113E+01,2.7732E+01,3.0575E+01,3.3659E+01,3.7005E+01,4.0634E+01, ", + " 4.4571E+01,4.8844E+01,5.3483E+01,5.8525E+01,6.4012E+01,6.9991E+01,7.6520E+01, ", + " 8.3666E+01,9.1511E+01,1.0016E+02,1.0973E+02,1.2038E+02,1.3233E+02,1.4585E+02, ", + " 1.6135E+02,1.7940E+02,2.0095E+02,2.2766E+02,2.6301E+02,3.1759E+02; ", + " ", + " FluidProperties:Saturated, ", + " R410a, !- Name ", + " SpecificHeat, !- Fluid Property Type ", + " Fluid, !- Fluid Phase ", + " R410aSaturatedTemperatures, !- Temperature Values Name ", + " 1.3499E+03,1.3515E+03,1.3534E+03,1.3557E+03,1.3584E+03,1.3614E+03,1.3648E+03, ", + " 1.3686E+03,1.3728E+03,1.3774E+03,1.3825E+03,1.3881E+03,1.3941E+03,1.4007E+03, ", + " 1.4078E+03,1.4155E+03,1.4238E+03,1.4327E+03,1.4424E+03,1.4527E+03,1.4639E+03, ", + " 1.4759E+03,1.4888E+03,1.5027E+03,1.5177E+03,1.5340E+03,1.5515E+03,1.5706E+03, ", + " 1.5914E+03,1.6141E+03,1.6390E+03,1.6664E+03,1.6968E+03,1.7307E+03,1.7689E+03, ", + " 1.8123E+03,1.8622E+03,1.9204E+03,1.9895E+03,2.0732E+03,2.1774E+03,2.3116E+03, ", + " 2.4924E+03,2.7507E+03,3.1534E+03,3.8723E+03,5.5190E+03,1.2701E+04; ", + " ", + " FluidProperties:Saturated, ", + " R410a, !- Name ", + " SpecificHeat, !- Fluid Property Type ", + " FluidGas, !- Fluid Phase ", + " R410aSaturatedTemperatures, !- Temperature Values Name ", + " 7.2387E+02,7.3519E+02,7.4693E+02,7.5910E+02,7.7167E+02,7.8465E+02,7.9802E+02, ", + " 8.1178E+02,8.2594E+02,8.4050E+02,8.5546E+02,8.7085E+02,8.8668E+02,9.0298E+02, ", + " 9.1979E+02,9.3715E+02,9.5511E+02,9.7372E+02,9.9307E+02,1.0132E+03,1.0343E+03, ", + " 1.0564E+03,1.0796E+03,1.1042E+03,1.1302E+03,1.1580E+03,1.1877E+03,1.2196E+03, ", + " 1.2541E+03,1.2917E+03,1.3329E+03,1.3783E+03,1.4287E+03,1.4853E+03,1.5494E+03, ", + " 1.6228E+03,1.7078E+03,1.8078E+03,1.9274E+03,2.0735E+03,2.2562E+03,2.4922E+03, ", + " 2.8094E+03,3.2596E+03,3.9504E+03,5.1465E+03,7.7185E+03,1.7076E+04; ", + " ", + " !- =========== ALL OBJECTS IN CLASS: FLUIDPROPERTIES:SUPERHEATED =========== ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Enthalpy, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 3.1238E+04, !- Pressure {Pa} ", + " 3.8813E+05,3.9245E+05,3.9675E+05,4.0105E+05,4.0536E+05,4.0753E+05,4.0970E+05, ", + " 4.1189E+05,4.1408E+05,4.1628E+05,4.1849E+05,4.2071E+05,4.2294E+05,4.2518E+05, ", + " 4.2743E+05,4.2969E+05,4.3196E+05,4.3425E+05,4.3655E+05,4.3885E+05,4.4118E+05, ", + " 4.4351E+05,4.4586E+05,4.4821E+05,4.5058E+05,4.5297E+05,4.5536E+05,4.5777E+05, ", + " 4.6020E+05,4.6263E+05,4.6508E+05,4.6754E+05,4.7002E+05,4.7251E+05,4.7501E+05, ", + " 4.7752E+05,4.8005E+05,4.8259E+05,4.8515E+05,4.8772E+05,4.9030E+05,4.9290E+05, ", + " 4.9551E+05,4.9813E+05; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Density, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 3.1238E+04, !- Pressure {Pa} ", + " 1.3845E+00,1.3404E+00,1.2997E+00,1.2617E+00,1.2262E+00,1.2092E+00,1.1928E+00, ", + " 1.1768E+00,1.1613E+00,1.1462E+00,1.1316E+00,1.1173E+00,1.1034E+00,1.0898E+00, ", + " 1.0766E+00,1.0638E+00,1.0512E+00,1.0390E+00,1.0271E+00,1.0154E+00,1.0040E+00, ", + " 9.9285E-01,9.8197E-01,9.7133E-01,9.6093E-01,9.5075E-01,9.4079E-01,9.3104E-01, ", + " 9.2150E-01,9.1215E-01,9.0299E-01,8.9403E-01,8.8524E-01,8.7662E-01,8.6817E-01, ", + " 8.5989E-01,8.5177E-01,8.4380E-01,8.3598E-01,8.2831E-01,8.2077E-01,8.1338E-01, ", + " 8.0612E-01,7.9899E-01; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Enthalpy, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 4.5248E+04, !- Pressure {Pa} ", + " 0.0000E+00,3.9148E+05,3.9593E+05,4.0034E+05,4.0474E+05,4.0694E+05,4.0915E+05, ", + " 4.1136E+05,4.1358E+05,4.1580E+05,4.1803E+05,4.2027E+05,4.2252E+05,4.2478E+05, ", + " 4.2705E+05,4.2933E+05,4.3161E+05,4.3391E+05,4.3622E+05,4.3854E+05,4.4088E+05, ", + " 4.4322E+05,4.4558E+05,4.4794E+05,4.5032E+05,4.5272E+05,4.5512E+05,4.5754E+05, ", + " 4.5997E+05,4.6241E+05,4.6486E+05,4.6733E+05,4.6981E+05,4.7231E+05,4.7481E+05, ", + " 4.7733E+05,4.7987E+05,4.8241E+05,4.8497E+05,4.8755E+05,4.9013E+05,4.9273E+05, ", + " 4.9535E+05,4.9797E+05; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Density, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 4.5248E+04, !- Pressure {Pa} ", + " 0.0000E+00,1.9588E+00,1.8968E+00,1.8395E+00,1.7863E+00,1.7610E+00,1.7365E+00, ", + " 1.7128E+00,1.6898E+00,1.6674E+00,1.6457E+00,1.6246E+00,1.6041E+00,1.5842E+00, ", + " 1.5647E+00,1.5458E+00,1.5273E+00,1.5093E+00,1.4918E+00,1.4747E+00,1.4580E+00, ", + " 1.4416E+00,1.4257E+00,1.4101E+00,1.3949E+00,1.3800E+00,1.3654E+00,1.3512E+00, ", + " 1.3372E+00,1.3236E+00,1.3102E+00,1.2971E+00,1.2843E+00,1.2717E+00,1.2594E+00, ", + " 1.2473E+00,1.2355E+00,1.2239E+00,1.2125E+00,1.2013E+00,1.1903E+00,1.1796E+00, ", + " 1.1690E+00,1.1586E+00; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Enthalpy, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 6.3963E+04, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,3.9476E+05,3.9935E+05,4.0388E+05,4.0614E+05,4.0839E+05, ", + " 4.1064E+05,4.1290E+05,4.1516E+05,4.1742E+05,4.1969E+05,4.2196E+05,4.2425E+05, ", + " 4.2654E+05,4.2884E+05,4.3114E+05,4.3346E+05,4.3579E+05,4.3813E+05,4.4047E+05, ", + " 4.4283E+05,4.4520E+05,4.4758E+05,4.4997E+05,4.5238E+05,4.5479E+05,4.5722E+05, ", + " 4.5966E+05,4.6211E+05,4.6457E+05,4.6705E+05,4.6954E+05,4.7204E+05,4.7455E+05, ", + " 4.7708E+05,4.7962E+05,4.8217E+05,4.8474E+05,4.8732E+05,4.8991E+05,4.9252E+05, ", + " 4.9513E+05,4.9777E+05; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Density, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 6.3963E+04, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,2.7097E+00,2.6240E+00,2.5451E+00,2.5078E+00,2.4718E+00, ", + " 2.4370E+00,2.4034E+00,2.3708E+00,2.3393E+00,2.3086E+00,2.2789E+00,2.2500E+00, ", + " 2.2219E+00,2.1945E+00,2.1679E+00,2.1420E+00,2.1167E+00,2.0921E+00,2.0681E+00, ", + " 2.0446E+00,2.0217E+00,1.9994E+00,1.9776E+00,1.9562E+00,1.9354E+00,1.9150E+00, ", + " 1.8950E+00,1.8755E+00,1.8564E+00,1.8377E+00,1.8194E+00,1.8014E+00,1.7839E+00, ", + " 1.7666E+00,1.7497E+00,1.7332E+00,1.7169E+00,1.7010E+00,1.6854E+00,1.6700E+00, ", + " 1.6550E+00,1.6402E+00; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Enthalpy, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 8.8445E+04, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,3.9796E+05,4.0270E+05,4.0503E+05,4.0736E+05, ", + " 4.0967E+05,4.1198E+05,4.1429E+05,4.1660E+05,4.1891E+05,4.2122E+05,4.2354E+05, ", + " 4.2586E+05,4.2819E+05,4.3052E+05,4.3286E+05,4.3521E+05,4.3757E+05,4.3994E+05, ", + " 4.4232E+05,4.4470E+05,4.4710E+05,4.4951E+05,4.5193E+05,4.5436E+05,4.5680E+05, ", + " 4.5925E+05,4.6171E+05,4.6419E+05,4.6668E+05,4.6918E+05,4.7169E+05,4.7421E+05, ", + " 4.7675E+05,4.7930E+05,4.8186E+05,4.8443E+05,4.8702E+05,4.8962E+05,4.9223E+05, ", + " 4.9486E+05,4.9749E+05; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Density, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 8.8445E+04, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,3.6737E+00,3.5570E+00,3.5024E+00,3.4500E+00, ", + " 3.3995E+00,3.3509E+00,3.3039E+00,3.2585E+00,3.2146E+00,3.1720E+00,3.1308E+00, ", + " 3.0907E+00,3.0518E+00,3.0140E+00,2.9772E+00,2.9414E+00,2.9065E+00,2.8726E+00, ", + " 2.8395E+00,2.8072E+00,2.7757E+00,2.7449E+00,2.7149E+00,2.6856E+00,2.6569E+00, ", + " 2.6289E+00,2.6015E+00,2.5747E+00,2.5485E+00,2.5228E+00,2.4977E+00,2.4731E+00, ", + " 2.4490E+00,2.4254E+00,2.4022E+00,2.3795E+00,2.3573E+00,2.3354E+00,2.3140E+00, ", + " 2.2930E+00,2.2724E+00; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Enthalpy, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 1.1988E+05, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,4.0108E+05,4.0354E+05,4.0597E+05, ", + " 4.0838E+05,4.1077E+05,4.1315E+05,4.1552E+05,4.1788E+05,4.2025E+05,4.2261E+05, ", + " 4.2497E+05,4.2734E+05,4.2971E+05,4.3209E+05,4.3447E+05,4.3685E+05,4.3925E+05, ", + " 4.4165E+05,4.4406E+05,4.4648E+05,4.4891E+05,4.5135E+05,4.5380E+05,4.5626E+05, ", + " 4.5873E+05,4.6121E+05,4.6370E+05,4.6620E+05,4.6871E+05,4.7124E+05,4.7377E+05, ", + " 4.7632E+05,4.7888E+05,4.8145E+05,4.8404E+05,4.8663E+05,4.8924E+05,4.9186E+05, ", + " 4.9450E+05,4.9715E+05; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Density, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 1.1988E+05, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,4.8918E+00,4.8116E+00,4.7352E+00, ", + " 4.6621E+00,4.5920E+00,4.5247E+00,4.4599E+00,4.3974E+00,4.3370E+00,4.2787E+00, ", + " 4.2221E+00,4.1674E+00,4.1143E+00,4.0627E+00,4.0126E+00,3.9639E+00,3.9165E+00, ", + " 3.8704E+00,3.8255E+00,3.7817E+00,3.7390E+00,3.6974E+00,3.6567E+00,3.6171E+00, ", + " 3.5783E+00,3.5405E+00,3.5035E+00,3.4673E+00,3.4319E+00,3.3973E+00,3.3634E+00, ", + " 3.3302E+00,3.2977E+00,3.2659E+00,3.2347E+00,3.2041E+00,3.1742E+00,3.1448E+00, ", + " 3.1160E+00,3.0877E+00; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Enthalpy, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 1.3860E+05, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,4.0260E+05,4.0510E+05, ", + " 4.0757E+05,4.1002E+05,4.1244E+05,4.1485E+05,4.1726E+05,4.1965E+05,4.2204E+05, ", + " 4.2444E+05,4.2683E+05,4.2922E+05,4.3162E+05,4.3402E+05,4.3642E+05,4.3883E+05, ", + " 4.4125E+05,4.4368E+05,4.4611E+05,4.4855E+05,4.5100E+05,4.5346E+05,4.5593E+05, ", + " 4.5841E+05,4.6090E+05,4.6340E+05,4.6591E+05,4.6843E+05,4.7097E+05,4.7351E+05, ", + " 4.7606E+05,4.7863E+05,4.8121E+05,4.8380E+05,4.8640E+05,4.8902E+05,4.9165E+05, ", + " 4.9428E+05,4.9694E+05; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Density, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 1.3860E+05, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,5.6098E+00,5.5173E+00, ", + " 5.4293E+00,5.3451E+00,5.2645E+00,5.1871E+00,5.1127E+00,5.0409E+00,4.9717E+00, ", + " 4.9047E+00,4.8399E+00,4.7772E+00,4.7163E+00,4.6573E+00,4.5999E+00,4.5442E+00, ", + " 4.4900E+00,4.4372E+00,4.3859E+00,4.3358E+00,4.2870E+00,4.2394E+00,4.1930E+00, ", + " 4.1476E+00,4.1033E+00,4.0601E+00,4.0178E+00,3.9765E+00,3.9360E+00,3.8965E+00, ", + " 3.8578E+00,3.8199E+00,3.7828E+00,3.7464E+00,3.7108E+00,3.6759E+00,3.6417E+00, ", + " 3.6081E+00,3.5752E+00; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Enthalpy, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 1.5955E+05, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,4.0410E+05, ", + " 4.0664E+05,4.0915E+05,4.1163E+05,4.1409E+05,4.1654E+05,4.1898E+05,4.2140E+05, ", + " 4.2383E+05,4.2625E+05,4.2867E+05,4.3109E+05,4.3351E+05,4.3593E+05,4.3836E+05, ", + " 4.4080E+05,4.4324E+05,4.4569E+05,4.4815E+05,4.5061E+05,4.5309E+05,4.5557E+05, ", + " 4.5806E+05,4.6056E+05,4.6307E+05,4.6559E+05,4.6812E+05,4.7066E+05,4.7321E+05, ", + " 4.7578E+05,4.7835E+05,4.8094E+05,4.8354E+05,4.8615E+05,4.8877E+05,4.9140E+05, ", + " 4.9404E+05,4.9670E+05; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Density, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 1.5955E+05, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,6.4087E+00, ", + " 6.3023E+00,6.2010E+00,6.1045E+00,6.0120E+00,5.9233E+00,5.8380E+00,5.7559E+00, ", + " 5.6767E+00,5.6001E+00,5.5261E+00,5.4544E+00,5.3850E+00,5.3176E+00,5.2521E+00, ", + " 5.1885E+00,5.1267E+00,5.0666E+00,5.0080E+00,4.9509E+00,4.8953E+00,4.8411E+00, ", + " 4.7882E+00,4.7366E+00,4.6862E+00,4.6369E+00,4.5888E+00,4.5417E+00,4.4957E+00, ", + " 4.4507E+00,4.4066E+00,4.3635E+00,4.3212E+00,4.2799E+00,4.2393E+00,4.1996E+00, ", + " 4.1607E+00,4.1225E+00; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Enthalpy, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 1.8292E+05, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 4.0557E+05,4.0816E+05,4.1071E+05,4.1323E+05,4.1573E+05,4.1821E+05,4.2068E+05, ", + " 4.2313E+05,4.2559E+05,4.2804E+05,4.3049E+05,4.3293E+05,4.3538E+05,4.3784E+05, ", + " 4.4029E+05,4.4275E+05,4.4522E+05,4.4769E+05,4.5017E+05,4.5266E+05,4.5516E+05, ", + " 4.5766E+05,4.6017E+05,4.6270E+05,4.6523E+05,4.6777E+05,4.7032E+05,4.7288E+05, ", + " 4.7546E+05,4.7804E+05,4.8063E+05,4.8324E+05,4.8586E+05,4.8848E+05,4.9112E+05, ", + " 4.9378E+05,4.9644E+05; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Density, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 1.8292E+05, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 7.2953E+00,7.1732E+00,7.0571E+00,6.9465E+00,6.8408E+00,6.7394E+00,6.6420E+00, ", + " 6.5482E+00,6.4578E+00,6.3706E+00,6.2862E+00,6.2046E+00,6.1255E+00,6.0488E+00, ", + " 5.9743E+00,5.9020E+00,5.8317E+00,5.7633E+00,5.6968E+00,5.6320E+00,5.5688E+00, ", + " 5.5072E+00,5.4472E+00,5.3885E+00,5.3313E+00,5.2754E+00,5.2208E+00,5.1674E+00, ", + " 5.1152E+00,5.0641E+00,5.0141E+00,4.9652E+00,4.9173E+00,4.8703E+00,4.8244E+00, ", + " 4.7793E+00,4.7352E+00; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Enthalpy, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 2.0888E+05, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,4.0701E+05,4.0964E+05,4.1224E+05,4.1480E+05,4.1733E+05,4.1985E+05, ", + " 4.2235E+05,4.2485E+05,4.2733E+05,4.2981E+05,4.3229E+05,4.3477E+05,4.3724E+05, ", + " 4.3972E+05,4.4221E+05,4.4469E+05,4.4719E+05,4.4968E+05,4.5219E+05,4.5470E+05, ", + " 4.5722E+05,4.5974E+05,4.6228E+05,4.6482E+05,4.6738E+05,4.6994E+05,4.7251E+05, ", + " 4.7510E+05,4.7769E+05,4.8029E+05,4.8291E+05,4.8553E+05,4.8817E+05,4.9082E+05, ", + " 4.9348E+05,4.9615E+05; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Density, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 2.0888E+05, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,8.2759E+00,8.1361E+00,8.0034E+00,7.8770E+00,7.7563E+00,7.6407E+00, ", + " 7.5297E+00,7.4230E+00,7.3201E+00,7.2209E+00,7.1251E+00,7.0323E+00,6.9425E+00, ", + " 6.8555E+00,6.7710E+00,6.6890E+00,6.6093E+00,6.5318E+00,6.4564E+00,6.3830E+00, ", + " 6.3115E+00,6.2417E+00,6.1738E+00,6.1074E+00,6.0426E+00,5.9794E+00,5.9176E+00, ", + " 5.8572E+00,5.7981E+00,5.7404E+00,5.6839E+00,5.6286E+00,5.5744E+00,5.5214E+00, ", + " 5.4694E+00,5.4185E+00; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Enthalpy, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 2.3762E+05, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,4.0842E+05,4.1110E+05,4.1374E+05,4.1634E+05,4.1892E+05, ", + " 4.2147E+05,4.2401E+05,4.2654E+05,4.2905E+05,4.3157E+05,4.3407E+05,4.3658E+05, ", + " 4.3909E+05,4.4159E+05,4.4410E+05,4.4662E+05,4.4914E+05,4.5166E+05,4.5419E+05, ", + " 4.5672E+05,4.5927E+05,4.6182E+05,4.6437E+05,4.6694E+05,4.6952E+05,4.7210E+05, ", + " 4.7470E+05,4.7730E+05,4.7992E+05,4.8254E+05,4.8517E+05,4.8782E+05,4.9048E+05, ", + " 4.9315E+05,4.9582E+05; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Density, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 2.3762E+05, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,9.3578E+00,9.1979E+00,9.0465E+00,8.9024E+00,8.7650E+00, ", + " 8.6335E+00,8.5073E+00,8.3861E+00,8.2694E+00,8.1569E+00,8.0482E+00,7.9431E+00, ", + " 7.8414E+00,7.7429E+00,7.6473E+00,7.5546E+00,7.4645E+00,7.3769E+00,7.2917E+00, ", + " 7.2088E+00,7.1280E+00,7.0493E+00,6.9726E+00,6.8977E+00,6.8246E+00,6.7533E+00, ", + " 6.6836E+00,6.6155E+00,6.5489E+00,6.4838E+00,6.4200E+00,6.3577E+00,6.2967E+00, ", + " 6.2369E+00,6.1783E+00; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Enthalpy, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 2.6935E+05, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,4.0980E+05,4.1253E+05,4.1521E+05,4.1786E+05, ", + " 4.2047E+05,4.2307E+05,4.2564E+05,4.2820E+05,4.3075E+05,4.3330E+05,4.3584E+05, ", + " 4.3837E+05,4.4091E+05,4.4345E+05,4.4599E+05,4.4853E+05,4.5107E+05,4.5362E+05, ", + " 4.5617E+05,4.5873E+05,4.6130E+05,4.6388E+05,4.6646E+05,4.6905E+05,4.7165E+05, ", + " 4.7425E+05,4.7687E+05,4.7950E+05,4.8213E+05,4.8478E+05,4.8743E+05,4.9010E+05, ", + " 4.9278E+05,4.9546E+05; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Density, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 2.6935E+05, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,1.0549E+01,1.0367E+01,1.0194E+01,1.0030E+01, ", + " 9.8741E+00,9.7248E+00,9.5817E+00,9.4443E+00,9.3122E+00,9.1848E+00,9.0619E+00, ", + " 8.9431E+00,8.8282E+00,8.7170E+00,8.6091E+00,8.5045E+00,8.4029E+00,8.3042E+00, ", + " 8.2081E+00,8.1147E+00,8.0237E+00,7.9351E+00,7.8487E+00,7.7644E+00,7.6822E+00, ", + " 7.6019E+00,7.5235E+00,7.4469E+00,7.3721E+00,7.2989E+00,7.2273E+00,7.1572E+00, ", + " 7.0886E+00,7.0214E+00; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Enthalpy, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 3.0426E+05, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,4.1114E+05,4.1392E+05,4.1665E+05, ", + " 4.1934E+05,4.2200E+05,4.2463E+05,4.2725E+05,4.2984E+05,4.3243E+05,4.3501E+05, ", + " 4.3758E+05,4.4015E+05,4.4272E+05,4.4528E+05,4.4785E+05,4.5042E+05,4.5299E+05, ", + " 4.5556E+05,4.5814E+05,4.6073E+05,4.6332E+05,4.6592E+05,4.6853E+05,4.7114E+05, ", + " 4.7376E+05,4.7639E+05,4.7903E+05,4.8168E+05,4.8434E+05,4.8701E+05,4.8968E+05, ", + " 4.9237E+05,4.9507E+05; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Density, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 3.0426E+05, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,1.1857E+01,1.1650E+01,1.1453E+01, ", + " 1.1267E+01,1.1090E+01,1.0921E+01,1.0759E+01,1.0604E+01,1.0454E+01,1.0310E+01, ", + " 1.0172E+01,1.0038E+01,9.9083E+00,9.7830E+00,9.6615E+00,9.5438E+00,9.4294E+00, ", + " 9.3184E+00,9.2104E+00,9.1054E+00,9.0032E+00,8.9037E+00,8.8067E+00,8.7121E+00, ", + " 8.6198E+00,8.5297E+00,8.4418E+00,8.3559E+00,8.2719E+00,8.1898E+00,8.1095E+00, ", + " 8.0310E+00,7.9541E+00; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Enthalpy, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 3.4257E+05, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,4.1245E+05,4.1529E+05, ", + " 4.1807E+05,4.2080E+05,4.2350E+05,4.2617E+05,4.2883E+05,4.3146E+05,4.3408E+05, ", + " 4.3670E+05,4.3930E+05,4.4190E+05,4.4450E+05,4.4709E+05,4.4969E+05,4.5229E+05, ", + " 4.5489E+05,4.5749E+05,4.6010E+05,4.6271E+05,4.6533E+05,4.6795E+05,4.7058E+05, ", + " 4.7322E+05,4.7587E+05,4.7852E+05,4.8118E+05,4.8385E+05,4.8653E+05,4.8922E+05, ", + " 4.9192E+05,4.9463E+05; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Density, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 3.4257E+05, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,1.3292E+01,1.3056E+01, ", + " 1.2833E+01,1.2622E+01,1.2421E+01,1.2230E+01,1.2047E+01,1.1871E+01,1.1703E+01, ", + " 1.1541E+01,1.1385E+01,1.1234E+01,1.1088E+01,1.0947E+01,1.0811E+01,1.0678E+01, ", + " 1.0550E+01,1.0425E+01,1.0304E+01,1.0187E+01,1.0072E+01,9.9605E+00,9.8518E+00, ", + " 9.7459E+00,9.6426E+00,9.5417E+00,9.4433E+00,9.3472E+00,9.2533E+00,9.1615E+00, ", + " 9.0717E+00,8.9839E+00; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Enthalpy, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 3.8449E+05, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,4.1373E+05, ", + " 4.1661E+05,4.1944E+05,4.2222E+05,4.2497E+05,4.2768E+05,4.3038E+05,4.3305E+05, ", + " 4.3571E+05,4.3836E+05,4.4100E+05,4.4363E+05,4.4626E+05,4.4889E+05,4.5151E+05, ", + " 4.5414E+05,4.5677E+05,4.5940E+05,4.6203E+05,4.6467E+05,4.6732E+05,4.6997E+05, ", + " 4.7262E+05,4.7529E+05,4.7796E+05,4.8063E+05,4.8332E+05,4.8601E+05,4.8872E+05, ", + " 4.9143E+05,4.9415E+05; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Density, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 3.8449E+05, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,1.4861E+01, ", + " 1.4593E+01,1.4341E+01,1.4102E+01,1.3875E+01,1.3659E+01,1.3452E+01,1.3255E+01, ", + " 1.3065E+01,1.2882E+01,1.2707E+01,1.2537E+01,1.2374E+01,1.2216E+01,1.2063E+01, ", + " 1.1914E+01,1.1771E+01,1.1631E+01,1.1495E+01,1.1364E+01,1.1236E+01,1.1111E+01, ", + " 1.0989E+01,1.0871E+01,1.0755E+01,1.0643E+01,1.0533E+01,1.0426E+01,1.0321E+01, ", + " 1.0218E+01,1.0118E+01; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Enthalpy, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 4.3024E+05, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 4.1496E+05,4.1790E+05,4.2078E+05,4.2361E+05,4.2641E+05,4.2916E+05,4.3190E+05, ", + " 4.3461E+05,4.3731E+05,4.3999E+05,4.4267E+05,4.4533E+05,4.4800E+05,4.5066E+05, ", + " 4.5331E+05,4.5597E+05,4.5863E+05,4.6129E+05,4.6395E+05,4.6662E+05,4.6929E+05, ", + " 4.7197E+05,4.7465E+05,4.7734E+05,4.8003E+05,4.8273E+05,4.8544E+05,4.8816E+05, ", + " 4.9089E+05,4.9362E+05; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Density, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 4.3024E+05, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 1.6576E+01,1.6272E+01,1.5986E+01,1.5716E+01,1.5460E+01,1.5216E+01,1.4983E+01, ", + " 1.4761E+01,1.4547E+01,1.4343E+01,1.4145E+01,1.3955E+01,1.3772E+01,1.3595E+01, ", + " 1.3424E+01,1.3258E+01,1.3097E+01,1.2941E+01,1.2789E+01,1.2642E+01,1.2499E+01, ", + " 1.2360E+01,1.2224E+01,1.2092E+01,1.1964E+01,1.1838E+01,1.1716E+01,1.1596E+01, ", + " 1.1480E+01,1.1365E+01; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Enthalpy, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 4.8004E+05, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,4.1615E+05,4.1915E+05,4.2209E+05,4.2497E+05,4.2781E+05,4.3061E+05, ", + " 4.3339E+05,4.3614E+05,4.3888E+05,4.4160E+05,4.4431E+05,4.4701E+05,4.4971E+05, ", + " 4.5240E+05,4.5509E+05,4.5778E+05,4.6047E+05,4.6316E+05,4.6585E+05,4.6855E+05, ", + " 4.7124E+05,4.7395E+05,4.7666E+05,4.7937E+05,4.8209E+05,4.8482E+05,4.8755E+05, ", + " 4.9029E+05,4.9304E+05; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Density, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 4.8004E+05, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,1.8447E+01,1.8102E+01,1.7778E+01,1.7473E+01,1.7184E+01,1.6910E+01, ", + " 1.6648E+01,1.6398E+01,1.6158E+01,1.5928E+01,1.5707E+01,1.5495E+01,1.5289E+01, ", + " 1.5091E+01,1.4900E+01,1.4715E+01,1.4535E+01,1.4361E+01,1.4192E+01,1.4028E+01, ", + " 1.3869E+01,1.3714E+01,1.3563E+01,1.3416E+01,1.3273E+01,1.3133E+01,1.2997E+01, ", + " 1.2864E+01,1.2734E+01; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Enthalpy, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 5.3412E+05, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,4.1730E+05,4.2036E+05,4.2335E+05,4.2629E+05,4.2917E+05, ", + " 4.3202E+05,4.3485E+05,4.3764E+05,4.4042E+05,4.4318E+05,4.4593E+05,4.4867E+05, ", + " 4.5140E+05,4.5413E+05,4.5685E+05,4.5957E+05,4.6229E+05,4.6501E+05,4.6773E+05, ", + " 4.7045E+05,4.7318E+05,4.7591E+05,4.7865E+05,4.8139E+05,4.8413E+05,4.8689E+05, ", + " 4.8965E+05,4.9241E+05; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Density, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 5.3412E+05, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,2.0485E+01,2.0094E+01,1.9728E+01,1.9383E+01,1.9058E+01, ", + " 1.8749E+01,1.8455E+01,1.8174E+01,1.7905E+01,1.7648E+01,1.7400E+01,1.7162E+01, ", + " 1.6933E+01,1.6712E+01,1.6498E+01,1.6292E+01,1.6092E+01,1.5898E+01,1.5710E+01, ", + " 1.5527E+01,1.5350E+01,1.5178E+01,1.5010E+01,1.4847E+01,1.4688E+01,1.4533E+01, ", + " 1.4382E+01,1.4234E+01; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Enthalpy, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 5.9273E+05, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,4.1840E+05,4.2153E+05,4.2458E+05,4.2756E+05, ", + " 4.3050E+05,4.3340E+05,4.3627E+05,4.3911E+05,4.4193E+05,4.4473E+05,4.4752E+05, ", + " 4.5029E+05,4.5306E+05,4.5582E+05,4.5858E+05,4.6133E+05,4.6408E+05,4.6683E+05, ", + " 4.6959E+05,4.7234E+05,4.7509E+05,4.7785E+05,4.8062E+05,4.8338E+05,4.8616E+05, ", + " 4.8894E+05,4.9172E+05; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Density, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 5.9273E+05, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,2.2703E+01,2.2260E+01,2.1846E+01,2.1458E+01, ", + " 2.1091E+01,2.0744E+01,2.0413E+01,2.0098E+01,1.9798E+01,1.9509E+01,1.9233E+01, ", + " 1.8967E+01,1.8711E+01,1.8465E+01,1.8227E+01,1.7996E+01,1.7774E+01,1.7558E+01, ", + " 1.7349E+01,1.7146E+01,1.6950E+01,1.6758E+01,1.6572E+01,1.6391E+01,1.6215E+01, ", + " 1.6043E+01,1.5876E+01; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Enthalpy, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 6.5609E+05, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,4.1945E+05,4.2264E+05,4.2575E+05, ", + " 4.2880E+05,4.3179E+05,4.3474E+05,4.3765E+05,4.4054E+05,4.4340E+05,4.4625E+05, ", + " 4.4907E+05,4.5189E+05,4.5469E+05,4.5749E+05,4.6028E+05,4.6307E+05,4.6585E+05, ", + " 4.6864E+05,4.7142E+05,4.7420E+05,4.7699E+05,4.7978E+05,4.8257E+05,4.8536E+05, ", + " 4.8816E+05,4.9097E+05; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Density, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 6.5609E+05, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,2.5113E+01,2.4612E+01,2.4145E+01, ", + " 2.3707E+01,2.3294E+01,2.2904E+01,2.2533E+01,2.2180E+01,2.1844E+01,2.1522E+01, ", + " 2.1213E+01,2.0916E+01,2.0631E+01,2.0356E+01,2.0091E+01,1.9836E+01,1.9588E+01, ", + " 1.9349E+01,1.9117E+01,1.8892E+01,1.8673E+01,1.8461E+01,1.8255E+01,1.8055E+01, ", + " 1.7860E+01,1.7670E+01; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Enthalpy, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 7.2446E+05, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,4.2045E+05,4.2371E+05, ", + " 4.2688E+05,4.2999E+05,4.3304E+05,4.3604E+05,4.3900E+05,4.4194E+05,4.4484E+05, ", + " 4.4773E+05,4.5060E+05,4.5345E+05,4.5630E+05,4.5913E+05,4.6196E+05,4.6478E+05, ", + " 4.6760E+05,4.7041E+05,4.7323E+05,4.7604E+05,4.7886E+05,4.8168E+05,4.8450E+05, ", + " 4.8732E+05,4.9015E+05; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Density, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 7.2446E+05, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,2.7732E+01,2.7164E+01, ", + " 2.6636E+01,2.6143E+01,2.5678E+01,2.5240E+01,2.4825E+01,2.4430E+01,2.4053E+01, ", + " 2.3694E+01,2.3349E+01,2.3019E+01,2.2701E+01,2.2396E+01,2.2101E+01,2.1817E+01, ", + " 2.1542E+01,2.1277E+01,2.1019E+01,2.0770E+01,2.0529E+01,2.0294E+01,2.0066E+01, ", + " 1.9844E+01,1.9629E+01; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Enthalpy, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 7.9808E+05, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,4.2139E+05, ", + " 4.2472E+05,4.2797E+05,4.3113E+05,4.3424E+05,4.3730E+05,4.4031E+05,4.4329E+05, ", + " 4.4625E+05,4.4918E+05,4.5209E+05,4.5499E+05,4.5787E+05,4.6074E+05,4.6361E+05, ", + " 4.6646E+05,4.6932E+05,4.7217E+05,4.7502E+05,4.7786E+05,4.8071E+05,4.8356E+05, ", + " 4.8641E+05,4.8926E+05; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Density, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 7.9808E+05, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,3.0574E+01, ", + " 2.9931E+01,2.9335E+01,2.8779E+01,2.8257E+01,2.7765E+01,2.7299E+01,2.6857E+01, ", + " 2.6436E+01,2.6035E+01,2.5651E+01,2.5283E+01,2.4930E+01,2.4590E+01,2.4263E+01, ", + " 2.3948E+01,2.3644E+01,2.3349E+01,2.3065E+01,2.2789E+01,2.2521E+01,2.2262E+01, ", + " 2.2010E+01,2.1766E+01; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Enthalpy, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 8.7722E+05, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 4.2227E+05,4.2568E+05,4.2899E+05,4.3223E+05,4.3540E+05,4.3851E+05,4.4158E+05, ", + " 4.4461E+05,4.4761E+05,4.5059E+05,4.5355E+05,4.5649E+05,4.5941E+05,4.6232E+05, ", + " 4.6523E+05,4.6812E+05,4.7101E+05,4.7389E+05,4.7678E+05,4.7966E+05,4.8254E+05, ", + " 4.8542E+05,4.8830E+05; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Density, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 8.7722E+05, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 3.3659E+01,3.2930E+01,3.2256E+01,3.1629E+01,3.1042E+01,3.0490E+01,2.9968E+01, ", + " 2.9474E+01,2.9004E+01,2.8557E+01,2.8129E+01,2.7720E+01,2.7327E+01,2.6950E+01, ", + " 2.6587E+01,2.6238E+01,2.5900E+01,2.5575E+01,2.5260E+01,2.4955E+01,2.4660E+01, ", + " 2.4374E+01,2.4096E+01; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Enthalpy, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 9.6214E+05, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,4.2308E+05,4.2658E+05,4.2997E+05,4.3327E+05,4.3650E+05,4.3968E+05, ", + " 4.4280E+05,4.4589E+05,4.4894E+05,4.5197E+05,4.5497E+05,4.5795E+05,4.6092E+05, ", + " 4.6387E+05,4.6681E+05,4.6975E+05,4.7267E+05,4.7559E+05,4.7851E+05,4.8142E+05, ", + " 4.8434E+05,4.8725E+05; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Density, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 9.6214E+05, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,3.7005E+01,3.6178E+01,3.5416E+01,3.4709E+01,3.4049E+01,3.3429E+01, ", + " 3.2845E+01,3.2292E+01,3.1768E+01,3.1269E+01,3.0793E+01,3.0338E+01,2.9902E+01, ", + " 2.9484E+01,2.9082E+01,2.8694E+01,2.8321E+01,2.7961E+01,2.7613E+01,2.7277E+01, ", + " 2.6951E+01,2.6636E+01; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Enthalpy, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 1.0531E+06, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,4.2382E+05,4.2741E+05,4.3088E+05,4.3426E+05,4.3756E+05, ", + " 4.4079E+05,4.4398E+05,4.4712E+05,4.5023E+05,4.5330E+05,4.5635E+05,4.5938E+05, ", + " 4.6239E+05,4.6539E+05,4.6837E+05,4.7134E+05,4.7430E+05,4.7726E+05,4.8021E+05, ", + " 4.8316E+05,4.8611E+05; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Density, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 1.0531E+06, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,4.0634E+01,3.9695E+01,3.8832E+01,3.8035E+01,3.7292E+01, ", + " 3.6597E+01,3.5943E+01,3.5325E+01,3.4740E+01,3.4184E+01,3.3654E+01,3.3149E+01, ", + " 3.2665E+01,3.2201E+01,3.1755E+01,3.1327E+01,3.0915E+01,3.0517E+01,3.0133E+01, ", + " 2.9762E+01,2.9403E+01; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Enthalpy, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 1.1504E+06, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,4.2448E+05,4.2817E+05,4.3173E+05,4.3518E+05, ", + " 4.3855E+05,4.4186E+05,4.4511E+05,4.4831E+05,4.5147E+05,4.5459E+05,4.5769E+05, ", + " 4.6077E+05,4.6383E+05,4.6686E+05,4.6989E+05,4.7290E+05,4.7591E+05,4.7890E+05, ", + " 4.8189E+05,4.8488E+05; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Density, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 1.1504E+06, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,4.4572E+01,4.3503E+01,4.2527E+01,4.1626E+01, ", + " 4.0790E+01,4.0010E+01,3.9277E+01,3.8587E+01,3.7934E+01,3.7314E+01,3.6725E+01, ", + " 3.6164E+01,3.5627E+01,3.5113E+01,3.4620E+01,3.4146E+01,3.3691E+01,3.3252E+01, ", + " 3.2828E+01,3.2419E+01; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Enthalpy, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 1.2543E+06, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,4.2507E+05,4.2886E+05,4.3251E+05, ", + " 4.3605E+05,4.3949E+05,4.4287E+05,4.4618E+05,4.4944E+05,4.5266E+05,4.5584E+05, ", + " 4.5899E+05,4.6212E+05,4.6522E+05,4.6831E+05,4.7138E+05,4.7443E+05,4.7748E+05, ", + " 4.8051E+05,4.8354E+05; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Density, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 1.2543E+06, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,4.8844E+01,4.7627E+01,4.6519E+01, ", + " 4.5502E+01,4.4560E+01,4.3684E+01,4.2863E+01,4.2091E+01,4.1363E+01,4.0673E+01, ", + " 4.0018E+01,3.9394E+01,3.8799E+01,3.8230E+01,3.7685E+01,3.7161E+01,3.6658E+01, ", + " 3.6174E+01,3.5708E+01; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Enthalpy, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 1.3651E+06, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,4.2556E+05,4.2947E+05, ", + " 4.3322E+05,4.3684E+05,4.4037E+05,4.4382E+05,4.4720E+05,4.5053E+05,4.5381E+05, ", + " 4.5705E+05,4.6025E+05,4.6343E+05,4.6658E+05,4.6971E+05,4.7283E+05,4.7592E+05, ", + " 4.7901E+05,4.8209E+05; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Density, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 1.3651E+06, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,5.3484E+01,5.2094E+01, ", + " 5.0835E+01,4.9684E+01,4.8623E+01,4.7638E+01,4.6718E+01,4.5855E+01,4.5042E+01, ", + " 4.4274E+01,4.3546E+01,4.2854E+01,4.2194E+01,4.1564E+01,4.0961E+01,4.0383E+01, ", + " 3.9828E+01,3.9294E+01; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Enthalpy, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 1.4831E+06, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,4.2595E+05, ", + " 4.2999E+05,4.3385E+05,4.3757E+05,4.4119E+05,4.4471E+05,4.4817E+05,4.5156E+05, ", + " 4.5490E+05,4.5820E+05,4.6146E+05,4.6469E+05,4.6790E+05,4.7108E+05,4.7424E+05, ", + " 4.7738E+05,4.8051E+05; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Density, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 1.4831E+06, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,5.8526E+01, ", + " 5.6935E+01,5.5502E+01,5.4199E+01,5.3001E+01,5.1893E+01,5.0861E+01,4.9896E+01, ", + " 4.8989E+01,4.8133E+01,4.7324E+01,4.6555E+01,4.5824E+01,4.5127E+01,4.4461E+01, ", + " 4.3823E+01,4.3211E+01; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Enthalpy, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 1.6086E+06, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 4.2624E+05,4.3041E+05,4.3439E+05,4.3822E+05,4.4193E+05,4.4554E+05,4.4907E+05, ", + " 4.5254E+05,4.5595E+05,4.5931E+05,4.6263E+05,4.6591E+05,4.6917E+05,4.7240E+05, ", + " 4.7561E+05,4.7880E+05; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Density, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 1.6086E+06, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 6.4013E+01,6.2185E+01,6.0551E+01,5.9071E+01,5.7718E+01,5.6470E+01,5.5313E+01, ", + " 5.4232E+01,5.3220E+01,5.2267E+01,5.1367E+01,5.0514E+01,4.9704E+01,4.8933E+01, ", + " 4.8196E+01,4.7492E+01; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Enthalpy, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 1.7419E+06, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,4.2642E+05,4.3074E+05,4.3485E+05,4.3879E+05,4.4260E+05,4.4630E+05, ", + " 4.4991E+05,4.5345E+05,4.5693E+05,4.6036E+05,4.6374E+05,4.6709E+05,4.7040E+05, ", + " 4.7368E+05,4.7694E+05; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Density, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 1.7419E+06, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,6.9990E+01,6.7883E+01,6.6014E+01,6.4331E+01,6.2800E+01,6.1394E+01, ", + " 6.0094E+01,5.8884E+01,5.7753E+01,5.6691E+01,5.5691E+01,5.4744E+01,5.3847E+01, ", + " 5.2994E+01,5.2181E+01; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Enthalpy, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 1.8834E+06, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,4.2646E+05,4.3096E+05,4.3521E+05,4.3927E+05,4.4319E+05, ", + " 4.4699E+05,4.5069E+05,4.5431E+05,4.5786E+05,4.6136E+05,4.6481E+05,4.6821E+05, ", + " 4.7158E+05,4.7492E+05; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Density, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 1.8834E+06, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,7.6519E+01,7.4080E+01,7.1935E+01,7.0017E+01,6.8281E+01, ", + " 6.6694E+01,6.5232E+01,6.3876E+01,6.2613E+01,6.1429E+01,6.0316E+01,5.9266E+01, ", + " 5.8272E+01,5.7328E+01; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Enthalpy, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 2.0334E+06, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,4.2635E+05,4.3105E+05,4.3546E+05,4.3966E+05, ", + " 4.4369E+05,4.4760E+05,4.5139E+05,4.5510E+05,4.5873E+05,4.6230E+05,4.6582E+05, ", + " 4.6929E+05,4.7272E+05; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Density, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 2.0334E+06, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,8.3665E+01,8.0827E+01,7.8356E+01,7.6164E+01, ", + " 7.4192E+01,7.2398E+01,7.0753E+01,6.9232E+01,6.7819E+01,6.6499E+01,6.5261E+01, ", + " 6.4095E+01,6.2993E+01; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Enthalpy, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 2.1923E+06, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,4.2609E+05,4.3101E+05,4.3560E+05, ", + " 4.3995E+05,4.4411E+05,4.4812E+05,4.5202E+05,4.5582E+05,4.5953E+05,4.6318E+05, ", + " 4.6677E+05,4.7030E+05; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Density, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 2.1923E+06, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,9.1511E+01,8.8190E+01,8.5332E+01, ", + " 8.2819E+01,8.0573E+01,7.8542E+01,7.6687E+01,7.4980E+01,7.3398E+01,7.1925E+01, ", + " 7.0547E+01,6.9252E+01; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Enthalpy, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 2.3604E+06, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,4.2564E+05,4.3082E+05, ", + " 4.3561E+05,4.4013E+05,4.4443E+05,4.4856E+05,4.5257E+05,4.5646E+05,4.6027E+05, ", + " 4.6400E+05,4.6766E+05; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Density, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 2.3604E+06, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,1.0015E+02,9.6239E+01, ", + " 9.2918E+01,9.0027E+01,8.7463E+01,8.5159E+01,8.3065E+01,8.1145E+01,7.9374E+01, ", + " 7.7729E+01,7.6195E+01; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Enthalpy, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 2.5382E+06, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,4.2498E+05, ", + " 4.3047E+05,4.3549E+05,4.4019E+05,4.4464E+05,4.4891E+05,4.5303E+05,4.5703E+05, ", + " 4.6093E+05,4.6475E+05; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Density, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 2.5382E+06, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,1.0972E+02, ", + " 1.0507E+02,1.0119E+02,9.7851E+01,9.4915E+01,9.2295E+01,8.9926E+01,8.7766E+01, ", + " 8.5780E+01,8.3942E+01; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Enthalpy, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 2.7261E+06, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 4.2408E+05,4.2993E+05,4.3522E+05,4.4012E+05,4.4475E+05,4.4916E+05,4.5341E+05, ", + " 4.5752E+05,4.6152E+05; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Density, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 2.7261E+06, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 1.2038E+02,1.1479E+02,1.1023E+02,1.0635E+02,1.0298E+02,9.9995E+01,9.7312E+01, ", + " 9.4877E+01,9.2647E+01; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Enthalpy, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 2.9246E+06, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,4.2290E+05,4.2918E+05,4.3478E+05,4.3992E+05,4.4473E+05,4.4931E+05, ", + " 4.5369E+05,4.5792E+05; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Density, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 2.9246E+06, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,1.3233E+02,1.2554E+02,1.2013E+02,1.1562E+02,1.1173E+02,1.0831E+02, ", + " 1.0527E+02,1.0252E+02; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Enthalpy, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 3.1341E+06, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,4.2137E+05,4.2820E+05,4.3416E+05,4.3957E+05,4.4459E+05, ", + " 4.4934E+05,4.5387E+05; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Density, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 3.1341E+06, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,1.4585E+02,1.3748E+02,1.3102E+02,1.2572E+02,1.2122E+02, ", + " 1.1731E+02,1.1384E+02; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Enthalpy, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 3.3552E+06, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,4.1941E+05,4.2695E+05,4.3334E+05,4.3905E+05, ", + " 4.4432E+05,4.4926E+05; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Density, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 3.3552E+06, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,1.6135E+02,1.5082E+02,1.4302E+02,1.3677E+02, ", + " 1.3154E+02,1.2704E+02; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Enthalpy, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 3.5886E+06, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,4.1692E+05,4.2539E+05,4.3229E+05, ", + " 4.3836E+05,4.4389E+05; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Density, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 3.5886E+06, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,1.7941E+02,1.6585E+02,1.5632E+02, ", + " 1.4890E+02,1.4279E+02; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Enthalpy, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 3.8348E+06, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,4.1370E+05,4.2346E+05, ", + " 4.3100E+05,4.3748E+05; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Density, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 3.8348E+06, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,2.0095E+02,1.8289E+02, ", + " 1.7111E+02,1.6223E+02; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Enthalpy, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 4.0949E+06, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,4.0942E+05, ", + " 4.2109E+05,4.2943E+05; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Density, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 4.0949E+06, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,2.2766E+02, ", + " 2.0246E+02,1.8765E+02; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Enthalpy, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 4.3697E+06, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 4.0343E+05,4.1823E+05; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Density, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 4.3697E+06, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 2.6302E+02,2.2513E+02; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Enthalpy, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 4.6607E+06, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,3.9373E+05; ", + " ", + " FluidProperties:Superheated, ", + " R410a, !- Fluid Name ", + " Density, !- Fluid Property Type ", + " R410aSuperHeatTemperatures, !- Temperature Values Name ", + " 4.6607E+06, !- Pressure {Pa} ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00,0.0000E+00, ", + " 0.0000E+00,3.1758E+02; ", + " ", + " !*************************************************************************** ", + }); + + ASSERT_TRUE(process_idf(idf_objects)); + + DataGlobals::BeginEnvrnFlag = true; + DataSizing::CurZoneEqNum = 1; + DataEnvironment::OutBaroPress = 101325; // sea level + DataZoneEquipment::ZoneEquipInputsFilled = true; // denotes zone equipment has been read in + StdRhoAir = PsyRhoAirFnPbTdbW(DataEnvironment::OutBaroPress, 20.0, 0.0); + ZoneEqSizing.allocate(1); + ZoneSizingRunDone = true; + ZoneEqSizing(CurZoneEqNum).DesignSizeFromParent = false; + ZoneEqSizing(CurZoneEqNum).SizingMethod.allocate(25); + ZoneEqSizing(CurZoneEqNum).SizingMethod(DataHVACGlobals::SystemAirflowSizing) = DataSizing::SupplyAirFlowRate; + FinalZoneSizing.allocate(1); + FinalZoneSizing(CurZoneEqNum).DesCoolVolFlow = 0.566337; + FinalZoneSizing(CurZoneEqNum).DesHeatVolFlow = 0.566337; + + ZoneSysEnergyDemand.allocate(1); + ProcessScheduleInput(); + GetCurveInput(); + GetZoneData(ErrorsFound); + EXPECT_FALSE(ErrorsFound); + // get zone input and connections + GetZoneEquipmentData(); + // ZoneInletAirNode = GetVRFTUZoneInletAirNode(VRFTUNum); + GetVRFInput(); + GetVRFInputFlag = false; + Schedule(VRF(VRFCond).SchedPtr).CurrentValue = 1.0; + Schedule(VRFTU(VRFTUNum).SchedPtr).CurrentValue = 1.0; + Schedule(VRFTU(VRFTUNum).FanAvailSchedPtr).CurrentValue = 1.0; + Schedule(VRFTU(VRFTUNum).FanOpModeSchedPtr).CurrentValue = 0.0; + // set the zone cooling and heat requirements + ZoneSysEnergyDemand(CurZoneNum).RemainingOutputRequired = -5000.0; + ZoneSysEnergyDemand(CurZoneNum).RemainingOutputReqToCoolSP = -5000.0; + ZoneSysEnergyDemand(CurZoneNum).RemainingOutputReqToHeatSP = 0.0; + + auto &thisZoneEquip(ZoneEquipConfig(NumOfZones)); + // set zone air node properties + Node(thisZoneEquip.ZoneNode).Temp = 24.0; + Node(thisZoneEquip.ZoneNode).HumRat = 0.0075; + Node(thisZoneEquip.ZoneNode).Enthalpy = Psychrometrics::PsyHFnTdbW(Node(thisZoneEquip.ZoneNode).Temp, Node(thisZoneEquip.ZoneNode).HumRat); + + auto &thisVRFTU(VRFTU(1)); + Node(thisVRFTU.VRFTUInletNodeNum).Temp = 24.0; + Node(thisVRFTU.VRFTUInletNodeNum).HumRat = 0.0075; + Node(thisVRFTU.VRFTUInletNodeNum).Enthalpy = Psychrometrics::PsyHFnTdbW(Node(thisVRFTU.VRFTUInletNodeNum).Temp, Node(thisVRFTU.VRFTUInletNodeNum).HumRat); + + DataEnvironment::OutDryBulbTemp = 35.0; + DataEnvironment::OutHumRat = 0.0100; + DataEnvironment::OutBaroPress = 101325.0; + DataEnvironment::WindSpeed = 5.0; + DataEnvironment::WindDir = 0.0; + + FinalZoneSizing(CurZoneEqNum).ZoneRetTempAtCoolPeak = Node(thisVRFTU.VRFTUInletNodeNum).Temp; + FinalZoneSizing(CurZoneEqNum).ZoneHumRatAtCoolPeak = Node(thisVRFTU.VRFTUInletNodeNum).HumRat; + FinalZoneSizing(CurZoneEqNum).CoolDDNum = 1; + FinalZoneSizing(CurZoneEqNum).TimeStepNumAtCoolMax = 1; + DesDayWeath.allocate(1); + DesDayWeath(1).Temp.allocate(1); + DesDayWeath(FinalZoneSizing(CurZoneEqNum).CoolDDNum).Temp(FinalZoneSizing(CurZoneEqNum).TimeStepNumAtCoolMax) = DataEnvironment::OutDryBulbTemp; + FinalZoneSizing(CurZoneEqNum).CoolDesTemp = 13.1; + FinalZoneSizing(CurZoneEqNum).CoolDesHumRat = 0.0095; + + // set pointer to components + auto &thisFan(Fan(1)); + auto &thisDXCoolingCoil(DXCoil(1)); + auto &thisDXHeatingCoil(DXCoil(2)); + // run the model + SimulateVRF(VRFTU(VRFTUNum).Name, CurZoneNum, FirstHVACIteration, SysOutputProvided, LatOutputProvided, ZoneEquipList(CurZoneEqNum).EquipIndex(EquipPtr)); + // check model inputs + ASSERT_EQ(1, NumVRFCond); + ASSERT_EQ(1, NumVRFTU); + ASSERT_EQ(1, NumFans); + ASSERT_EQ(2, NumDXCoils); + ASSERT_EQ("TU1 VRF DX COOLING COIL", thisDXCoolingCoil.Name); + ASSERT_EQ("TU1 VRF DX HEATING COIL", thisDXHeatingCoil.Name); + // check if total cooling rate provided by the DX cooling coil matches + // sum of the cooling delivered by VRF ATU and fan power when no OA + EXPECT_EQ(0.0, thisVRFTU.CoolOutAirMassFlow); + EXPECT_EQ(0.0, thisVRFTU.HeatOutAirMassFlow); + EXPECT_EQ(0.0, thisVRFTU.NoCoolHeatOutAirMassFlow); + EXPECT_NEAR(5125.0531, thisDXCoolingCoil.TotalCoolingEnergyRate, 0.0001); + EXPECT_NEAR(4999.8265, thisVRFTU.TotalCoolingRate, 0.0001); + EXPECT_NEAR(125.2266, thisFan.FanPower, 0.0001); + EXPECT_NEAR(thisDXCoolingCoil.TotalCoolingEnergyRate, (thisVRFTU.TotalCoolingRate + thisFan.FanPower), 0.0001); +} } diff --git a/tst/EnergyPlus/unit/HeatBalanceManager.unit.cc b/tst/EnergyPlus/unit/HeatBalanceManager.unit.cc index 6148b523807..127282d65db 100644 --- a/tst/EnergyPlus/unit/HeatBalanceManager.unit.cc +++ b/tst/EnergyPlus/unit/HeatBalanceManager.unit.cc @@ -1278,6 +1278,24 @@ TEST_F(EnergyPlusFixture, HeatBalanceManager_TestZonePropertyLocalEnv) EXPECT_EQ(20.0, Zone(1).OutWetBulbTemp); EXPECT_EQ(1.5, Zone(1).WindSpeed); EXPECT_EQ(90.0, Zone(1).WindDir); + + // Add a test for #7308 without inputs of schedule names + DataLoopNode::Node(1).OutAirDryBulbSchedNum = 0; + DataLoopNode::Node(1).OutAirWetBulbSchedNum = 0; + DataLoopNode::Node(1).OutAirWindSpeedSchedNum = 0; + DataLoopNode::Node(1).OutAirWindDirSchedNum = 0; + DataEnvironment::OutDryBulbTemp = 25.0; + DataEnvironment::OutWetBulbTemp = 20.0; + DataEnvironment::WindSpeed = 1.5; + DataEnvironment::WindDir = 90.0; + + InitHeatBalance(); + + // Test if local value correctly overwritten + EXPECT_EQ(25.0, Zone(1).OutDryBulbTemp); + EXPECT_EQ(20.0, Zone(1).OutWetBulbTemp); + EXPECT_EQ(1.5, Zone(1).WindSpeed); + EXPECT_EQ(90.0, Zone(1).WindDir); } TEST_F(EnergyPlusFixture, HeatBalanceManager_HVACSystemRootFindingAlgorithmInputTest) @@ -1832,4 +1850,83 @@ TEST_F(EnergyPlusFixture, HeatBalanceManager_GetAirBoundaryConstructData) EXPECT_EQ(DataHeatBalance::NominalRforNominalUCalculation(constrNum), 0.0); } +TEST_F(EnergyPlusFixture, HeatBalanceManager_GetMaterialData_IRTSurfaces) +{ + std::string const idf_objects = delimited_string({ + "Material:InfraredTransparent,", + "IRTMaterial1; !- Name", + }); + + ASSERT_TRUE(process_idf(idf_objects)); + + bool ErrorsFound(false); // If errors detected in input + + HeatBalanceManager::GetMaterialData(ErrorsFound); + + ASSERT_FALSE(ErrorsFound); + + int MaterNum = 1; + + EXPECT_EQ(Material(MaterNum).ROnly, true); + EXPECT_NEAR(Material(MaterNum).Resistance, 0.01, 0.00001); + EXPECT_NEAR(Material(MaterNum).AbsorpThermal, 0.9999, 0.00001); + EXPECT_NEAR(Material(MaterNum).AbsorpThermalInput, 0.9999, 0.00001); + EXPECT_NEAR(Material(MaterNum).AbsorpSolar, 1.0, 0.00001); + EXPECT_NEAR(Material(MaterNum).AbsorpSolarInput, 1.0, 0.00001); + EXPECT_NEAR(Material(MaterNum).AbsorpVisible, 1.0, 0.00001); + EXPECT_NEAR(Material(MaterNum).AbsorpVisibleInput, 1.0, 0.00001); + +} + +TEST_F(EnergyPlusFixture, HeatBalanceManager_UpdateWindowFaceTempsNonBSDFWin) +{ + + DataSurfaces::TotSurfaces = 3; + DataSurfaces::Surface.allocate(DataSurfaces::TotSurfaces); + DataHeatBalance::TotConstructs = 3; + DataHeatBalance::Construct.allocate( DataHeatBalance::TotConstructs); + + DataSurfaces::Surface(1).Class = DataSurfaces::SurfaceClass_Wall; + DataSurfaces::Surface(2).Class = DataSurfaces::SurfaceClass_Window; + DataSurfaces::Surface(3).Class = DataSurfaces::SurfaceClass_Window; + DataSurfaces::Surface(1).Construction = 1; + DataSurfaces::Surface(2).Construction = 2; + DataSurfaces::Surface(3).Construction = 3; + DataHeatBalance::Construct(1).WindowTypeBSDF = false; + DataHeatBalance::Construct(2).WindowTypeBSDF = false; + DataHeatBalance::Construct(3).WindowTypeBSDF = true; + int SurfsForRegWindow = 3; + DataHeatBalance::Construct(1).TotLayers = 1; + DataHeatBalance::Construct(2).TotLayers = SurfsForRegWindow; + DataHeatBalance::Construct(3).TotLayers = 1; + + FenLaySurfTempFront.dimension(10, DataSurfaces::TotSurfaces, 0.0); + FenLaySurfTempBack.dimension(10, DataSurfaces::TotSurfaces, 0.0); + DataHeatBalSurface::TH.dimension(2, MaxCTFTerms, DataSurfaces::TotSurfaces, 0.0); + + DataHeatBalSurface::TH(1,1,1) = 21.0; + DataHeatBalSurface::TH(1,1,2) = 22.0; + DataHeatBalSurface::TH(1,1,3) = 23.0; + DataHeatBalSurface::TH(2,1,1) = 34.0; + DataHeatBalSurface::TH(2,1,2) = 35.0; + DataHeatBalSurface::TH(2,1,3) = 36.0; + + Real64 ZeroResult = 0.0; + + HeatBalanceManager::UpdateWindowFaceTempsNonBSDFWin(); + + // First surface is NOT a window so these should NOT be set + EXPECT_NEAR(FenLaySurfTempFront(1,1),ZeroResult,0.0001); + EXPECT_NEAR(FenLaySurfTempBack(1,1),ZeroResult,0.0001); + + // Second surface is a window so these should be set + EXPECT_NEAR(FenLaySurfTempFront(1,2),DataHeatBalSurface::TH(1,1,2),0.0001); + EXPECT_NEAR(FenLaySurfTempBack(SurfsForRegWindow,2),DataHeatBalSurface::TH(2,1,2),0.0001); + + // Third surface is a window but is also a BSDF (complex window) so these should NOT be set + EXPECT_NEAR(FenLaySurfTempFront(1,3),ZeroResult,0.0001); + EXPECT_NEAR(FenLaySurfTempBack(1,3),ZeroResult,0.0001); + +} + } // namespace EnergyPlus diff --git a/tst/EnergyPlus/unit/HeatPumpWaterToWaterSimple.unit.cc b/tst/EnergyPlus/unit/HeatPumpWaterToWaterSimple.unit.cc index 648aa8857e5..d8366225ed8 100644 --- a/tst/EnergyPlus/unit/HeatPumpWaterToWaterSimple.unit.cc +++ b/tst/EnergyPlus/unit/HeatPumpWaterToWaterSimple.unit.cc @@ -1489,5 +1489,18 @@ TEST_F(EnergyPlusFixture, WWHP_AutosizeTest1) EXPECT_NEAR(HeatPumpWaterToWaterSimple::GSHP(1).RatedSourceVolFlowHeat, 0.00025, 0.0000001); EXPECT_NEAR(HeatPumpWaterToWaterSimple::GSHP(1).RatedCapHeat, 7200.71, 0.1); EXPECT_NEAR(HeatPumpWaterToWaterSimple::GSHP(1).RatedPowerHeat, 2151.07, 0.1); + + // Check that we are outputing the correct values + EXPECT_EQ("HeatPump:WaterToWater:EquationFit:Heating", + OutputReportPredefined::RetrievePreDefTableEntry(OutputReportPredefined::pdchMechType, + HeatPumpWaterToWaterSimple::GSHP(1).Name)); + + EXPECT_EQ("3.35", + OutputReportPredefined::RetrievePreDefTableEntry(OutputReportPredefined::pdchMechNomEff, + HeatPumpWaterToWaterSimple::GSHP(1).Name)); + + EXPECT_EQ("7200.71", + OutputReportPredefined::RetrievePreDefTableEntry(OutputReportPredefined::pdchMechNomCap, + HeatPumpWaterToWaterSimple::GSHP(1).Name)); } } // namespace EnergyPlus diff --git a/tst/EnergyPlus/unit/HeatingCoils.unit.cc b/tst/EnergyPlus/unit/HeatingCoils.unit.cc index 0abf4e602a9..e0815ce1294 100644 --- a/tst/EnergyPlus/unit/HeatingCoils.unit.cc +++ b/tst/EnergyPlus/unit/HeatingCoils.unit.cc @@ -53,6 +53,11 @@ #include "Fixtures/EnergyPlusFixture.hh" #include #include +#include +#include +#include +#include +#include #include namespace EnergyPlus { @@ -107,4 +112,58 @@ TEST_F(EnergyPlusFixture, HeatingCoils_FuelTypePropaneGas) EXPECT_EQ(HeatingCoils::HeatingCoil(1).FuelType_Num, DataGlobalConstants::iRT_Propane); } +TEST_F(EnergyPlusFixture, HeatingCoils_OutletAirPropertiesTest) +{ + // 7391 Test outlet air properties for MultiStageGasHeatingCoil + int CoilNum = 1; + Real64 OffMassFlowrate = 0.2; + Real64 OnMassFlowrate = 0.6; + + HeatingCoils::HeatingCoil.allocate(CoilNum); + HeatingCoils::HeatingCoil(CoilNum).InletAirTemp = 0.0; + HeatingCoils::HeatingCoil(CoilNum).InletAirHumRat = 0.001; + HeatingCoils::HeatingCoil(CoilNum).InletAirEnthalpy = Psychrometrics::PsyHFnTdbW(HeatingCoils::HeatingCoil(CoilNum).InletAirTemp, HeatingCoils::HeatingCoil(CoilNum).InletAirHumRat); + DataEnvironment::OutBaroPress = 101325.0; + HeatingCoils::HeatingCoil(CoilNum).SchedPtr = 1; + ScheduleManager::Schedule.allocate(1); + ScheduleManager::Schedule(1).CurrentValue = 1.0; + DataHVACGlobals::MSHPMassFlowRateLow = OnMassFlowrate; + HeatingCoils::HeatingCoil(CoilNum).MSNominalCapacity.allocate(1); + HeatingCoils::HeatingCoil(CoilNum).MSNominalCapacity(1) = 10000; + HeatingCoils::HeatingCoil(CoilNum).MSEfficiency.allocate(1); + HeatingCoils::HeatingCoil(CoilNum).MSEfficiency(1) = 0.9; + HeatingCoils::HeatingCoil(CoilNum).AirInletNodeNum = 1; + HeatingCoils::HeatingCoil(CoilNum).AirOutletNodeNum = 2; + DataLoopNode::Node.allocate(2); + HeatingCoils::HeatingCoil(CoilNum).MSParasiticElecLoad.allocate(1); + HeatingCoils::HeatingCoil(CoilNum).MSParasiticElecLoad(1) = 0.0; + + HeatingCoils::HeatingCoil(CoilNum).InletAirMassFlowRate = OffMassFlowrate; + HeatingCoils::CalcMultiStageGasHeatingCoil(CoilNum, 0.0, 0.0, 1, 2); + Real64 HeatLoad00 = + HeatingCoils::HeatingCoil(CoilNum).InletAirMassFlowRate * + (Psychrometrics::PsyHFnTdbW(HeatingCoils::HeatingCoil(CoilNum).OutletAirTemp, HeatingCoils::HeatingCoil(CoilNum).OutletAirHumRat) - + HeatingCoils::HeatingCoil(CoilNum).InletAirEnthalpy); + EXPECT_NEAR(HeatLoad00, HeatingCoils::HeatingCoil(CoilNum).HeatingCoilLoad, 0.0001); + + HeatingCoils::HeatingCoil(CoilNum).InletAirMassFlowRate = 0.5 * OnMassFlowrate + (1.0 - 0.5) * OffMassFlowrate; + HeatingCoils::CalcMultiStageGasHeatingCoil(CoilNum, 0.0, 0.5, 1, 2); + Real64 HeatLoad05 = + HeatingCoils::HeatingCoil(CoilNum).InletAirMassFlowRate * + (Psychrometrics::PsyHFnTdbW(HeatingCoils::HeatingCoil(CoilNum).OutletAirTemp, HeatingCoils::HeatingCoil(CoilNum).OutletAirHumRat) - + HeatingCoils::HeatingCoil(CoilNum).InletAirEnthalpy); + EXPECT_NEAR(HeatLoad05, HeatingCoils::HeatingCoil(CoilNum).HeatingCoilLoad, 0.0001); + + HeatingCoils::HeatingCoil(CoilNum).InletAirMassFlowRate = OnMassFlowrate; + HeatingCoils::CalcMultiStageGasHeatingCoil(CoilNum, 0.0, 1.0, 1, 2); + Real64 HeatLoad10 = + HeatingCoils::HeatingCoil(CoilNum).InletAirMassFlowRate * + (Psychrometrics::PsyHFnTdbW(HeatingCoils::HeatingCoil(CoilNum).OutletAirTemp, HeatingCoils::HeatingCoil(CoilNum).OutletAirHumRat) - + HeatingCoils::HeatingCoil(CoilNum).InletAirEnthalpy); + EXPECT_NEAR(HeatLoad10, HeatingCoils::HeatingCoil(CoilNum).HeatingCoilLoad, 0.0001); + + // check linear relationship at PLR = 0.5 + EXPECT_NEAR(HeatLoad05, 0.5 * HeatingCoils::HeatingCoil(CoilNum).MSNominalCapacity(1), 0.0001); +} + } // namespace EnergyPlus diff --git a/tst/EnergyPlus/unit/OutputReportTabular.unit.cc b/tst/EnergyPlus/unit/OutputReportTabular.unit.cc index 01932cbb40c..94a10e3fe6f 100644 --- a/tst/EnergyPlus/unit/OutputReportTabular.unit.cc +++ b/tst/EnergyPlus/unit/OutputReportTabular.unit.cc @@ -7471,3 +7471,185 @@ TEST_F(EnergyPlusFixture, AzimuthToCardinal) i = i + 2; } } + + +TEST_F(SQLiteFixture, WriteSourceEnergyEndUseSummary_TestPerArea) { + + EnergyPlus::sqlite->sqliteBegin(); + EnergyPlus::sqlite->createSQLiteSimulationsRecord(1, "EnergyPlus Version", "Current Time"); + + OutputReportTabular::displaySourceEnergyEndUseSummary = true; + + + // DetermineBuildingFloorArea + + Latitude = 12.3; + Longitude = 45.6; + + TotSurfaces = 4; + Surface.allocate(TotSurfaces); + + // walls + Surface(1).Class = SurfaceClass_Wall; + Surface(1).HeatTransSurf = true; + Surface(1).ExtBoundCond = ExternalEnvironment; + Surface(1).Azimuth = 0.; + Surface(1).GrossArea = 200.; // 20 x 10 + Surface(1).Tilt = 90.; + Surface(1).Zone = 1; + + Surface(2).Class = SurfaceClass_Wall; + Surface(2).HeatTransSurf = true; + Surface(2).ExtBoundCond = ExternalEnvironment; + Surface(2).Azimuth = 90.; + Surface(2).GrossArea = 300.; // 30 x 10 + Surface(2).Tilt = 90.; + Surface(2).Zone = 2; + + // windows + Surface(3).Class = SurfaceClass_Window; + Surface(3).HeatTransSurf = true; + Surface(3).ExtBoundCond = ExternalEnvironment; + Surface(3).Azimuth = 0.; + Surface(3).GrossArea = 40.; + Surface(3).Height = 5; + Surface(3).Width = 8; + Surface(3).Tilt = 90.; + Surface(3).Zone = 1; + + Surface(4).Class = SurfaceClass_Window; + Surface(4).HeatTransSurf = true; + Surface(4).ExtBoundCond = ExternalEnvironment; + Surface(4).Azimuth = 90.; + Surface(4).GrossArea = 60.; + Surface(4).Height = 6; + Surface(4).Width = 10; + Surface(4).Tilt = 90.; + Surface(4).Zone = 2; + + // Loads + DataHeatBalance::TotLights = 3; + Lights.allocate(DataHeatBalance::TotLights); + + DataHeatBalance::TotPeople = 3; + People.allocate(DataHeatBalance::TotPeople); + + DataHeatBalance::TotElecEquip = 3; + ZoneElectric.allocate(DataHeatBalance::TotElecEquip); + + Lights(1).ZonePtr = 1; + Lights(1).DesignLevel = 1000.0; + Lights(2).ZonePtr = 2; + Lights(2).DesignLevel = 100.0; + Lights(3).ZonePtr = 3; + Lights(3).DesignLevel = 10.0; + + People(1).ZonePtr = 1; + People(1).NumberOfPeople = 10.0; + People(2).ZonePtr = 2; + People(2).NumberOfPeople = 5.0; + People(3).ZonePtr = 3; + People(3).NumberOfPeople = 1.0; + + ZoneElectric(1).ZonePtr = 1; + ZoneElectric(1).DesignLevel = 500.0; + ZoneElectric(2).ZonePtr = 2; + ZoneElectric(2).DesignLevel = 50.0; + ZoneElectric(3).ZonePtr = 3; + ZoneElectric(3).DesignLevel = 5.0; + + // zone + DataGlobals::NumOfZones = 3; + Zone.allocate(DataGlobals::NumOfZones); + Zone(1).Name = "PartofTot Conditioned Zone"; + Zone(1).SystemZoneNodeNumber = 1; // Conditioned + Zone(1).isPartOfTotalArea = true; + Zone(1).Multiplier = 1.; + Zone(1).ListMultiplier = 1.; + Zone(1).FloorArea = 1000.; + Zone(1).Volume = 2000.; + Zone(1).ExtGrossWallArea = 800.; + Zone(1).ExteriorTotalGroundSurfArea = 0; + Zone(1).ExtWindowArea = Surface(3).GrossArea + Surface(4).GrossArea; + + Zone(2).Name = "PartofTot Unconditioned Zone"; + Zone(2).SystemZoneNodeNumber = 0; // Unconditioned + Zone(2).isPartOfTotalArea = true; + Zone(2).Multiplier = 1.; + Zone(2).ListMultiplier = 1.; + Zone(2).FloorArea = 100.; + Zone(2).Volume = 200.; + Zone(2).ExtGrossWallArea = 80.; + Zone(2).ExteriorTotalGroundSurfArea = 0; + Zone(2).ExtWindowArea = 0.0; + + Zone(3).Name = "NOT PartofTot Conditioned Zone"; + Zone(3).SystemZoneNodeNumber = 1; // Conditioned + Zone(3).isPartOfTotalArea = false; + Zone(3).Multiplier = 1.; + Zone(3).ListMultiplier = 1.; + Zone(3).FloorArea = 10.; + Zone(3).Volume = 20.; + Zone(3).ExtGrossWallArea = 8.; + Zone(3).ExteriorTotalGroundSurfArea = 0; + Zone(3).ExtWindowArea = 0.0; + + // Gross takes all that are PartOfTot + Real64 expectedBuildingGrossFloorArea = Zone(1).FloorArea + Zone(2).FloorArea; + // Conditionned takes only PartOfTot AND COnditioned + Real64 expectedBuildingConditionedFloorArea = Zone(1).FloorArea; + + + // Assume that we only have electricity with a value of 3.6e6 * 1e4 J =10.000 kWh. + // And that this only comes for a single end use endUseHeating=1 + OutputReportTabular::gatherEndUseBySourceBEPS(1, DataGlobalConstants::endUseHeating) = 3.6e10; + OutputReportTabular::gatherTotalsBySourceBEPS(1) = 3.6e10; + Real64 eleckWh = 1e4; + + OutputReportTabular::unitsStyle = OutputReportTabular::unitsStyleJtoKWH; + + // Now we're ready to call the actual function of interest + OutputReportTabular::WriteSourceEnergyEndUseSummary(); + + + // Before we test the reporting itself, we check that DetermineBuildingFloorArea (called from WriteSourceEnergyEndUseSummary) + // actually did what we expected + EXPECT_EQ(expectedBuildingGrossFloorArea, OutputReportTabular::buildingGrossFloorArea); + EXPECT_EQ(expectedBuildingConditionedFloorArea, OutputReportTabular::buildingConditionedFloorArea); + + // Now we test the reporting itself: + // We consistently test in the same report (three different tables) and at the same column for fuel = Elec + const std::string reportName = "SourceEnergyEndUseComponentsSummary"; + const std::string columnName = "Source Electricity"; + + // We test for Heating and Total, since they should be the same + std::vector testRowNames = {"Heating", "Total Source Energy End Use Components"}; + + // TableName, value + std::vector> results({ + {"Source Energy End Use Components Summary", eleckWh}, + {"Source Energy End Use Component Per Conditioned Floor Area", 10000.0 / expectedBuildingConditionedFloorArea}, + {"Source Energy End Use Components Per Total Floor Area", 10000.0 / expectedBuildingGrossFloorArea}, + }); + + for (auto& v: results) { + + std::string tableName = std::get<0>(v); + Real64 expectedValue = std::get<1>(v); + + for (auto& rowName : testRowNames) { + std::string query("SELECT Value From TabularDataWithStrings" + " WHERE ReportName = '" + reportName + "'" + " AND TableName = '" + tableName + "'" + " AND RowName = '" + rowName + "'" + + " AND ColumnName = '" + columnName + "'"); + + Real64 return_val = execAndReturnFirstDouble(query); + + // Add informative message if failed + EXPECT_NEAR(expectedValue, return_val, 0.01) << "Failed for TableName=" << tableName << "; RowName=" << rowName; + } + } + + EnergyPlus::sqlite->sqliteCommit(); +} diff --git a/tst/EnergyPlus/unit/PlantPipingSystemsManager.unit.cc b/tst/EnergyPlus/unit/PlantPipingSystemsManager.unit.cc index 25217538b73..b003f8cfca4 100644 --- a/tst/EnergyPlus/unit/PlantPipingSystemsManager.unit.cc +++ b/tst/EnergyPlus/unit/PlantPipingSystemsManager.unit.cc @@ -58,6 +58,7 @@ #include "Fixtures/EnergyPlusFixture.hh" #include #include +#include #include @@ -1886,3 +1887,51 @@ TEST_F(EnergyPlusFixture, PipingSystem_Check_Correct_Pipe_Diameters) { EXPECT_TRUE(compare_err_stream(error_string, true)); } +TEST_F(EnergyPlusFixture, PipingSystem_SiteGroundDomainUsingNoMassMatTest) { + + bool TestResult; + bool ExpectedResult; + Real64 Thickness; + int MaterialIndex; + + DataHeatBalance::Material.allocate(1); + + // Test 1: Material has a valid thickness and is not R-only, result should be false + MaterialIndex = 1; + DataHeatBalance::Material(MaterialIndex).ROnly = false; + Thickness = 0.01; + ExpectedResult = false; + TestResult = SiteGroundDomainUsingNoMassMat(Thickness, MaterialIndex); + + EXPECT_EQ(TestResult, ExpectedResult); + + // Test 2a: Material has a valid thickness but is R-only, result should be true + // Note that generally this case would not be encountered in EnergyPlus + MaterialIndex = 1; + DataHeatBalance::Material(MaterialIndex).ROnly = true; + Thickness = 0.01; + ExpectedResult = true; + TestResult = SiteGroundDomainUsingNoMassMat(Thickness, MaterialIndex); + + EXPECT_EQ(TestResult, ExpectedResult); + + // Test 2b: Material does not have a valid thickness but is not R-only, result should be true + // Note that generally this case would not be encountered in EnergyPlus + MaterialIndex = 1; + DataHeatBalance::Material(MaterialIndex).ROnly = false; + Thickness = 0.0; + ExpectedResult = true; + TestResult = SiteGroundDomainUsingNoMassMat(Thickness, MaterialIndex); + + EXPECT_EQ(TestResult, ExpectedResult); + + // Test 3: Material does not have a valid thickness and is not R-only, result should be true + MaterialIndex = 1; + DataHeatBalance::Material(MaterialIndex).ROnly = true; + Thickness = 0.0; + ExpectedResult = true; + TestResult = SiteGroundDomainUsingNoMassMat(Thickness, MaterialIndex); + + EXPECT_EQ(TestResult, ExpectedResult); + +} diff --git a/tst/EnergyPlus/unit/Psychrometrics.unit.cc b/tst/EnergyPlus/unit/Psychrometrics.unit.cc new file mode 100644 index 00000000000..255196e1ad5 --- /dev/null +++ b/tst/EnergyPlus/unit/Psychrometrics.unit.cc @@ -0,0 +1,98 @@ +// EnergyPlus, Copyright (c) 1996-2019, The Board of Trustees of the University of Illinois, +// The Regents of the University of California, through Lawrence Berkeley National Laboratory +// (subject to receipt of any required approvals from the U.S. Dept. of Energy), Oak Ridge +// National Laboratory, managed by UT-Battelle, Alliance for Sustainable Energy, LLC, and other +// contributors. All rights reserved. +// +// NOTICE: This Software was developed under funding from the U.S. Department of Energy and the +// U.S. Government consequently retains certain rights. As such, the U.S. Government has been +// granted for itself and others acting on its behalf a paid-up, nonexclusive, irrevocable, +// worldwide license in the Software to reproduce, distribute copies to the public, prepare +// derivative works, and perform publicly and display publicly, and to permit others to do so. +// +// Redistribution and use in source and binary forms, with or without modification, are permitted +// provided that the following conditions are met: +// +// (1) Redistributions of source code must retain the above copyright notice, this list of +// conditions and the following disclaimer. +// +// (2) Redistributions in binary form must reproduce the above copyright notice, this list of +// conditions and the following disclaimer in the documentation and/or other materials +// provided with the distribution. +// +// (3) Neither the name of the University of California, Lawrence Berkeley National Laboratory, +// the University of Illinois, U.S. Dept. of Energy nor the names of its contributors may be +// used to endorse or promote products derived from this software without specific prior +// written permission. +// +// (4) Use of EnergyPlus(TM) Name. If Licensee (i) distributes the software in stand-alone form +// without changes from the version obtained under this License, or (ii) Licensee makes a +// reference solely to the software portion of its product, Licensee must refer to the +// software as "EnergyPlus version X" software, where "X" is the version number Licensee +// obtained under this License and may not use a different name for the software. Except as +// specifically required in this Section (4), Licensee shall not use in a company name, a +// product name, in advertising, publicity, or other promotional activities any name, trade +// name, trademark, logo, or other designation of "EnergyPlus", "E+", "e+" or confusingly +// similar designation, without the U.S. Department of Energy's prior written consent. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR +// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY +// AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +// EnergyPlus::Pumps Unit Tests + +// Google Test Headers +#include + +#include "Fixtures/EnergyPlusFixture.hh" +#include + +namespace EnergyPlus { + +TEST_F(EnergyPlusFixture, Psychrometrics_PsyWFnTdpPb_Test) +{ + + Real64 TDP; + // Sea level pressure + Real64 PB = 101325.0; + Real64 W; + + TDP = 99.0; + W = Psychrometrics::PsyWFnTdpPb(TDP, PB); + + EXPECT_NEAR(17.5250143, W, 0.0001); + + std::string const error_string = delimited_string({ + " ** Warning ** Calculated partial vapor pressure is greater than the barometric pressure, so that calculated humidity ratio is invalid (PsyWFnTdpPb).", + " ** ~~~ ** Routine=Unknown, Environment=, at Simulation time= 00:00 - 00:00", + " ** ~~~ ** Dew-Point= 100.00 Barometric Pressure= 101325.00", + " ** ~~~ ** Instead, calculated Humidity Ratio at 99.0 (1 degree less) = 17.5250 will be used. Simulation continues.", + }); + + TDP = 100.0; + W = Psychrometrics::PsyWFnTdpPb(TDP, PB); + EXPECT_NEAR(17.5250143, W, 0.0001); + EXPECT_TRUE(compare_err_stream(error_string, true)); + + // Denver barometric pressure + PB = 81000.0; + std::string const error_string1 = delimited_string({ + " ** Warning ** Calculated partial vapor pressure is greater than the barometric pressure, so that calculated humidity ratio is invalid " + "(PsyWFnTdpPb).", + " ** ~~~ ** Routine=Unknown, Environment=, at Simulation time= 00:00 - 00:00", + " ** ~~~ ** Dew-Point= 100.00 Barometric Pressure= 81000.00", + " ** ~~~ ** Instead, calculated Humidity Ratio at 93.0 (7 degree less) = 20.0794 will be used. Simulation continues.", + }); + Psychrometrics::iPsyErrIndex(5) = 0; + W = Psychrometrics::PsyWFnTdpPb(TDP, PB); + EXPECT_NEAR(20.07942181, W, 0.0001); + EXPECT_TRUE(compare_err_stream(error_string1, true)); + +} +} // namespace EnergyPlus diff --git a/tst/EnergyPlus/unit/PurchasedAirManager.unit.cc b/tst/EnergyPlus/unit/PurchasedAirManager.unit.cc index 49c7bd4d30f..181f582ef23 100644 --- a/tst/EnergyPlus/unit/PurchasedAirManager.unit.cc +++ b/tst/EnergyPlus/unit/PurchasedAirManager.unit.cc @@ -149,14 +149,11 @@ TEST_F(EnergyPlusFixture, SizePurchasedAirTest_Test1) DataEnvironment::StdRhoAir = 1.0; // Prevent divide by zero in ReportSizingManager ZoneEqSizing(CurZoneEqNum).SizingMethod.allocate(24); CurSysNum = 0; - ZoneHVACSizing.allocate(1); - ZoneHVACSizing(1).CoolingSAFMethod = SupplyAirFlowRate; - ZoneHVACSizing(1).HeatingSAFMethod = SupplyAirFlowRate; - ZoneEqSizing(CurZoneEqNum).AirVolFlow = 0.0; FinalZoneSizing.allocate(1); + FinalZoneSizing(CurZoneEqNum).MinOA = 0.0; + FinalZoneSizing(CurZoneEqNum).OutTempAtHeatPeak = 5.0; FinalZoneSizing(CurZoneEqNum).DesHeatVolFlow = 1.0; - ZoneEqSizing(CurZoneEqNum).HeatingAirVolFlow = 1.0; FinalZoneSizing(CurZoneEqNum).DesHeatCoilInTemp = 30.0; FinalZoneSizing(CurZoneEqNum).ZoneTempAtHeatPeak = 30.0; FinalZoneSizing(CurZoneEqNum).HeatDesTemp = 80.0; @@ -164,8 +161,8 @@ TEST_F(EnergyPlusFixture, SizePurchasedAirTest_Test1) FinalZoneSizing(CurZoneEqNum).DesHeatMassFlow = FinalZoneSizing(CurZoneEqNum).DesHeatVolFlow * DataEnvironment::StdRhoAir; FinalZoneSizing(CurZoneEqNum).DesCoolVolFlow = 2.0; - ZoneEqSizing(CurZoneEqNum).CoolingAirVolFlow = 2.0; FinalZoneSizing(CurZoneEqNum).DesCoolCoilInTemp = 60.0; + FinalZoneSizing(CurZoneEqNum).OutTempAtCoolPeak = 70.0; FinalZoneSizing(CurZoneEqNum).CoolDesTemp = 50.0; FinalZoneSizing(CurZoneEqNum).CoolDesHumRat = 0.008; FinalZoneSizing(CurZoneEqNum).DesCoolCoilInHumRat = 0.010; @@ -179,7 +176,6 @@ TEST_F(EnergyPlusFixture, SizePurchasedAirTest_Test1) PurchAirNumericFields(PurchAirNum).FieldNames(7) = "Maximum Cooling Air Flow Rate"; PurchAirNumericFields(PurchAirNum).FieldNames(8) = "Maximum Total Cooling Capacity"; - ZoneEqSizing(CurZoneEqNum).SizingMethod(HeatingAirflowSizing) = SupplyAirFlowRate; ZoneSizingRunDone = true; PurchAir(PurchAirNum).HeatingLimit = LimitFlowRateAndCapacity; @@ -191,22 +187,65 @@ TEST_F(EnergyPlusFixture, SizePurchasedAirTest_Test1) PurchAir(PurchAirNum).cObjectName = "ZONEHVAC:IDEALLOADSAIRSYSTEM"; PurchAir(PurchAirNum).Name = "Ideal Loads 1"; - // Need this to prevent crash in RequestSizing - UnitarySysEqSizing.allocate(10); - SizePurchasedAir(PurchAirNum); EXPECT_DOUBLE_EQ(1.0, PurchAir(PurchAirNum).MaxHeatVolFlowRate); EXPECT_NEAR(50985.58, PurchAir(PurchAirNum).MaxHeatSensCap, 0.1); EXPECT_DOUBLE_EQ(2.0, PurchAir(PurchAirNum).MaxCoolVolFlowRate); EXPECT_NEAR(30844.14, PurchAir(PurchAirNum).MaxCoolTotCap, 0.1); +} + +TEST_F(EnergyPlusFixture, SizePurchasedAirTest_Test2) +{ + + int PurchAirNum = 1; + ZoneEqSizing.allocate(1); + CurZoneEqNum = 1; + DataEnvironment::StdRhoAir = 1.0; // Prevent divide by zero in ReportSizingManager + ZoneEqSizing(CurZoneEqNum).SizingMethod.allocate(24); + CurSysNum = 0; + + FinalZoneSizing.allocate(1); + FinalZoneSizing(CurZoneEqNum).MinOA = 0.5; + FinalZoneSizing(CurZoneEqNum).OutTempAtHeatPeak = 5.0; + FinalZoneSizing(CurZoneEqNum).DesHeatVolFlow = 1.0; + FinalZoneSizing(CurZoneEqNum).DesHeatCoilInTemp = 30.0; // this isn't used so don't change it + FinalZoneSizing(CurZoneEqNum).ZoneTempAtHeatPeak = 30.0; + FinalZoneSizing(CurZoneEqNum).HeatDesTemp = 80.0; + FinalZoneSizing(CurZoneEqNum).HeatDesHumRat = 0.008; + FinalZoneSizing(CurZoneEqNum).DesHeatMassFlow = FinalZoneSizing(CurZoneEqNum).DesHeatVolFlow * DataEnvironment::StdRhoAir; + + FinalZoneSizing(CurZoneEqNum).DesCoolVolFlow = 2.0; + FinalZoneSizing(CurZoneEqNum).DesCoolCoilInTemp = 65.0; // this is used, so make it higher + FinalZoneSizing(CurZoneEqNum).OutTempAtCoolPeak = 70.0; // this is not currently used for cooling + FinalZoneSizing(CurZoneEqNum).CoolDesTemp = 50.0; + FinalZoneSizing(CurZoneEqNum).CoolDesHumRat = 0.008; + FinalZoneSizing(CurZoneEqNum).DesCoolCoilInHumRat = 0.010; + FinalZoneSizing(CurZoneEqNum).DesCoolMassFlow = FinalZoneSizing(CurZoneEqNum).DesCoolVolFlow * DataEnvironment::StdRhoAir; + + PurchAir.allocate(10); + PurchAirNumericFields.allocate(10); + PurchAirNumericFields(PurchAirNum).FieldNames.allocate(8); + PurchAirNumericFields(PurchAirNum).FieldNames(5) = "Maximum Heating Air Flow Rate"; + PurchAirNumericFields(PurchAirNum).FieldNames(6) = "Maximum Sensible Heating Capacity"; + PurchAirNumericFields(PurchAirNum).FieldNames(7) = "Maximum Cooling Air Flow Rate"; + PurchAirNumericFields(PurchAirNum).FieldNames(8) = "Maximum Total Cooling Capacity"; - ZoneEqSizing(CurZoneEqNum).SizingMethod.deallocate(); - ZoneEqSizing.deallocate(); - ZoneHVACSizing.deallocate(); - FinalZoneSizing.deallocate(); - PurchAir.deallocate(); - PurchAirNumericFields.deallocate(); - UnitarySysEqSizing.deallocate(); + ZoneSizingRunDone = true; + + PurchAir(PurchAirNum).HeatingLimit = LimitFlowRateAndCapacity; + PurchAir(PurchAirNum).MaxHeatVolFlowRate = AutoSize; + PurchAir(PurchAirNum).MaxHeatSensCap = AutoSize; + PurchAir(PurchAirNum).CoolingLimit = LimitFlowRateAndCapacity; + PurchAir(PurchAirNum).MaxCoolVolFlowRate = AutoSize; + PurchAir(PurchAirNum).MaxCoolTotCap = AutoSize; + PurchAir(PurchAirNum).cObjectName = "ZONEHVAC:IDEALLOADSAIRSYSTEM"; + PurchAir(PurchAirNum).Name = "Ideal Loads 1"; + + SizePurchasedAir(PurchAirNum); + EXPECT_DOUBLE_EQ(1.0, PurchAir(PurchAirNum).MaxHeatVolFlowRate); + EXPECT_NEAR(63731.97, PurchAir(PurchAirNum).MaxHeatSensCap, 0.1); // larger than test 1 above + EXPECT_DOUBLE_EQ(2.0, PurchAir(PurchAirNum).MaxCoolVolFlowRate); + EXPECT_NEAR(41078.43, PurchAir(PurchAirNum).MaxCoolTotCap, 0.1); // larger than test1 above } TEST_F(EnergyPlusFixture, IdealLoadsAirSystem_GetInput) diff --git a/tst/EnergyPlus/unit/ReportSizingManager.unit.cc b/tst/EnergyPlus/unit/ReportSizingManager.unit.cc index 1197e9411bd..17eeb036a84 100644 --- a/tst/EnergyPlus/unit/ReportSizingManager.unit.cc +++ b/tst/EnergyPlus/unit/ReportSizingManager.unit.cc @@ -66,6 +66,7 @@ #include #include #include +#include #include #include @@ -185,7 +186,6 @@ TEST_F(EnergyPlusFixture, ReportSizingManager_GetCoilDesFlowT) EXPECT_FALSE(has_err_output(true)); EXPECT_DOUBLE_EQ(10, designExitTemp); EXPECT_NEAR(0.119823, designFlowValue, 0.0001); - } TEST_F(EnergyPlusFixture, ReportSizingManager_GetCoilDesFlowT_NoPeak) { @@ -322,7 +322,6 @@ TEST_F(EnergyPlusFixture, ReportSizingManager_RequestSizingSystem) // chilled water cooling coil capacity sizing ReportSizingManager::RequestSizing(CompType, CompName, SizingType, SizingString, SizingResult, PrintWarning, CallingRoutine); EXPECT_NEAR(19234.6, SizingResult, 0.1); - } TEST_F(EnergyPlusFixture, ReportSizingManager_RequestSizingSystemWithFans) @@ -520,7 +519,6 @@ TEST_F(EnergyPlusFixture, ReportSizingManager_RequestSizingSystemWithFans) // dx cooling coil capacity sizing ReportSizingManager::RequestSizing(CompType, CompName, SizingType, SizingString, SizingResult, PrintWarning, CallingRoutine); EXPECT_NEAR(expectedDXCoilSize, SizingResult, 0.1); - } TEST_F(EnergyPlusFixture, ReportSizingManager_RequestSizingZone) @@ -585,7 +583,6 @@ TEST_F(EnergyPlusFixture, ReportSizingManager_RequestSizingZone) // chilled water cooling coil capacity sizing ReportSizingManager::RequestSizing(CompType, CompName, SizingType, SizingString, SizingResult, PrintWarning, CallingRoutine); EXPECT_NEAR(5770.4, SizingResult, 0.1); - } TEST_F(SQLiteFixture, ReportSizingManager_SQLiteRecordReportSizingOutputTest) @@ -928,3 +925,504 @@ TEST_F(EnergyPlusFixture, ReportSizingManager_FanPeak) // Bonus test for #6949 EXPECT_EQ("End Use Subcategory", OutputReportPredefined::columnTag(OutputReportPredefined::pdchFanEndUse).heading); } +TEST_F(EnergyPlusFixture, ReportSizingManager_SupplyAirTempLessThanZoneTStatTest) +{ + // GitHub issue 7039 + std::string const idf_objects = delimited_string({ + + " Version,9.2;", + + " Timestep,1;", + + " Building,", + " Simple One Zone, !- Name", + " 0, !- North Axis {deg}", + " Suburbs, !- Terrain", + " 0.04, !- Loads Convergence Tolerance Value", + " 0.004, !- Temperature Convergence Tolerance Value {deltaC}", + " MinimalShadowing, !- Solar Distribution", + " 30, !- Maximum Number of Warmup Days", + " 6; !- Minimum Number of Warmup Days", + + " HeatBalanceAlgorithm,ConductionTransferFunction;", + + " SurfaceConvectionAlgorithm:Inside,TARP;", + + " SurfaceConvectionAlgorithm:Outside,DOE-2;", + + " SimulationControl,", + " Yes, !- Do Zone Sizing Calculation", + " No, !- Do System Sizing Calculation", + " No, !- Do Plant Sizing Calculation", + " No, !- Run Simulation for Sizing Periods", + " No; !- Run Simulation for Weather File Run Periods", + + " Site:Location,", + " Phoenix Sky Harbor Intl Ap_AZ_USA, !- Name", + " 33.45, !- Latitude {deg}", + " -111.98, !- Longitude {deg}", + " -7, !- Time Zone {hr}", + " 337; !- Elevation {m}", + + " Site:GroundTemperature:BuildingSurface,20.83,20.81,20.88,20.96,21.03,23.32,23.68,23.74,23.75,21.42,21.09,20.9;", + + " SizingPeriod:DesignDay,", + " Phoenix Sky Harbor Intl Ap Ann Clg .4% Condns DB=>MWB, !- Name", + " 7, !- Month", + " 21, !- Day of Month", + " SummerDesignDay, !- Day Type", + " 43.4, !- Maximum Dry-Bulb Temperature {C}", + " 12, !- Daily Dry-Bulb Temperature Range {deltaC}", + " DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type", + " , !- Dry-Bulb Temperature Range Modifier Day Schedule Name", + " Wetbulb, !- Humidity Condition Type", + " 21.1, !- Wetbulb or DewPoint at Maximum Dry-Bulb {C}", + " , !- Humidity Condition Day Schedule Name", + " , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir}", + " , !- Enthalpy at Maximum Dry-Bulb {J/kg}", + " , !- Daily Wet-Bulb Temperature Range {deltaC}", + " 97342, !- Barometric Pressure {Pa}", + " 4.1, !- Wind Speed {m/s}", + " 260, !- Wind Direction {deg}", + " No, !- Rain Indicator", + " No, !- Snow Indicator", + " No, !- Daylight Saving Time Indicator", + " ASHRAETau, !- Solar Model Indicator", + " , !- Beam Solar Day Schedule Name", + " , !- Diffuse Solar Day Schedule Name", + " 0.588, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) {dimensionless}", + " 1.653; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) {dimensionless}", + " ", + " SizingPeriod:DesignDay,", + " Phoenix Sky Harbor Intl Ap Ann Htg 99.6% Condns DB, !- Name", + " 12, !- Month", + " 21, !- Day of Month", + " WinterDesignDay, !- Day Type", + " 3.7, !- Maximum Dry-Bulb Temperature {C}", + " 0, !- Daily Dry-Bulb Temperature Range {deltaC}", + " DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type", + " , !- Dry-Bulb Temperature Range Modifier Day Schedule Name", + " Wetbulb, !- Humidity Condition Type", + " 3.7, !- Wetbulb or DewPoint at Maximum Dry-Bulb {C}", + " , !- Humidity Condition Day Schedule Name", + " , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir}", + " , !- Enthalpy at Maximum Dry-Bulb {J/kg}", + " , !- Daily Wet-Bulb Temperature Range {deltaC}", + " 97342, !- Barometric Pressure {Pa}", + " 1.7, !- Wind Speed {m/s}", + " 100, !- Wind Direction {deg}", + " No, !- Rain Indicator", + " No, !- Snow Indicator", + " No, !- Daylight Saving Time Indicator", + " ASHRAEClearSky, !- Solar Model Indicator", + " , !- Beam Solar Day Schedule Name", + " , !- Diffuse Solar Day Schedule Name", + " , !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) {dimensionless}", + " , !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) {dimensionless}", + " 0; !- Sky Clearness", + + " Material:NoMass,", + " R13LAYER, !- Name", + " Rough, !- Roughness", + " 2.290965, !- Thermal Resistance {m2-K/W}", + " 0.9000000, !- Thermal Absorptance", + " 0.7500000, !- Solar Absorptance", + " 0.7500000; !- Visible Absorptance", + + " Material:NoMass,", + " R31LAYER, !- Name", + " Rough, !- Roughness", + " 5.456, !- Thermal Resistance {m2-K/W}", + " 0.9000000, !- Thermal Absorptance", + " 0.7500000, !- Solar Absorptance", + " 0.7500000; !- Visible Absorptance", + + " Material,", + " C5 - 4 IN HW CONCRETE, !- Name", + " MediumRough, !- Roughness", + " 0.1014984, !- Thickness {m}", + " 1.729577, !- Conductivity {W/m-K}", + " 2242.585, !- Density {kg/m3}", + " 836.8000, !- Specific Heat {J/kg-K}", + " 0.9000000, !- Thermal Absorptance", + " 0.6500000, !- Solar Absorptance", + " 0.6500000; !- Visible Absorptance", + + " Construction,", + " R13WALL, !- Name", + " R13LAYER; !- Outside Layer", + + " Construction,", + " FLOOR, !- Name", + " C5 - 4 IN HW CONCRETE; !- Outside Layer", + + " Construction,", + " ROOF31, !- Name", + " R31LAYER; !- Outside Layer", + + " Zone,", + " ZONE ONE, !- Name", + " 0, !- Direction of Relative North {deg}", + " 0, !- X Origin {m}", + " 0, !- Y Origin {m}", + " 0, !- Z Origin {m}", + " 1, !- Type", + " 1, !- Multiplier", + " autocalculate, !- Ceiling Height {m}", + " autocalculate; !- Volume {m3}", + + " ScheduleTypeLimits,", + " Fraction, !- Name", + " 0.0, !- Lower Limit Value", + " 1.0, !- Upper Limit Value", + " CONTINUOUS; !- Numeric Type", + + " GlobalGeometryRules,", + " UpperLeftCorner, !- Starting Vertex Position", + " CounterClockWise, !- Vertex Entry Direction", + " World; !- Coordinate System", + + " BuildingSurface:Detailed,", + " Zn001:Wall001, !- Name", + " Wall, !- Surface Type", + " R13WALL, !- Construction Name", + " ZONE ONE, !- Zone Name", + " Outdoors, !- Outside Boundary Condition", + " , !- Outside Boundary Condition Object", + " SunExposed, !- Sun Exposure", + " WindExposed, !- Wind Exposure", + " 0.5000000, !- View Factor to Ground", + " 4, !- Number of Vertices", + " 0,0,4.572000, !- X,Y,Z ==> Vertex 1 {m}", + " 0,0,0, !- X,Y,Z ==> Vertex 2 {m}", + " 15.24000,0,0, !- X,Y,Z ==> Vertex 3 {m}", + " 15.24000,0,4.572000; !- X,Y,Z ==> Vertex 4 {m}", + + " BuildingSurface:Detailed,", + " Zn001:Wall002, !- Name", + " Wall, !- Surface Type", + " R13WALL, !- Construction Name", + " ZONE ONE, !- Zone Name", + " Outdoors, !- Outside Boundary Condition", + " , !- Outside Boundary Condition Object", + " SunExposed, !- Sun Exposure", + " WindExposed, !- Wind Exposure", + " 0.5000000, !- View Factor to Ground", + " 4, !- Number of Vertices", + " 15.24000,0,4.572000, !- X,Y,Z ==> Vertex 1 {m}", + " 15.24000,0,0, !- X,Y,Z ==> Vertex 2 {m}", + " 15.24000,15.24000,0, !- X,Y,Z ==> Vertex 3 {m}", + " 15.24000,15.24000,4.572000; !- X,Y,Z ==> Vertex 4 {m}", + + " BuildingSurface:Detailed,", + " Zn001:Wall003, !- Name", + " Wall, !- Surface Type", + " R13WALL, !- Construction Name", + " ZONE ONE, !- Zone Name", + " Outdoors, !- Outside Boundary Condition", + " , !- Outside Boundary Condition Object", + " SunExposed, !- Sun Exposure", + " WindExposed, !- Wind Exposure", + " 0.5000000, !- View Factor to Ground", + " 4, !- Number of Vertices", + " 15.24000,15.24000,4.572000, !- X,Y,Z ==> Vertex 1 {m}", + " 15.24000,15.24000,0, !- X,Y,Z ==> Vertex 2 {m}", + " 0,15.24000,0, !- X,Y,Z ==> Vertex 3 {m}", + " 0,15.24000,4.572000; !- X,Y,Z ==> Vertex 4 {m}", + + " BuildingSurface:Detailed,", + " Zn001:Wall004, !- Name", + " Wall, !- Surface Type", + " R13WALL, !- Construction Name", + " ZONE ONE, !- Zone Name", + " Outdoors, !- Outside Boundary Condition", + " , !- Outside Boundary Condition Object", + " SunExposed, !- Sun Exposure", + " WindExposed, !- Wind Exposure", + " 0.5000000, !- View Factor to Ground", + " 4, !- Number of Vertices", + " 0,15.24000,4.572000, !- X,Y,Z ==> Vertex 1 {m}", + " 0,15.24000,0, !- X,Y,Z ==> Vertex 2 {m}", + " 0,0,0, !- X,Y,Z ==> Vertex 3 {m}", + " 0,0,4.572000; !- X,Y,Z ==> Vertex 4 {m}", + + " BuildingSurface:Detailed,", + " Zn001:Flr001, !- Name", + " Floor, !- Surface Type", + " FLOOR, !- Construction Name", + " ZONE ONE, !- Zone Name", + " Surface, !- Outside Boundary Condition", + " Zn001:Flr001, !- Outside Boundary Condition Object", + " NoSun, !- Sun Exposure", + " NoWind, !- Wind Exposure", + " 1.000000, !- View Factor to Ground", + " 4, !- Number of Vertices", + " 15.24000,0.000000,0.0, !- X,Y,Z ==> Vertex 1 {m}", + " 0.000000,0.000000,0.0, !- X,Y,Z ==> Vertex 2 {m}", + " 0.000000,15.24000,0.0, !- X,Y,Z ==> Vertex 3 {m}", + " 15.24000,15.24000,0.0; !- X,Y,Z ==> Vertex 4 {m}", + + " BuildingSurface:Detailed,", + " Zn001:Roof001, !- Name", + " Roof, !- Surface Type", + " ROOF31, !- Construction Name", + " ZONE ONE, !- Zone Name", + " Outdoors, !- Outside Boundary Condition", + " , !- Outside Boundary Condition Object", + " SunExposed, !- Sun Exposure", + " WindExposed, !- Wind Exposure", + " 0, !- View Factor to Ground", + " 4, !- Number of Vertices", + " 0.000000,15.24000,4.572, !- X,Y,Z ==> Vertex 1 {m}", + " 0.000000,0.000000,4.572, !- X,Y,Z ==> Vertex 2 {m}", + " 15.24000,0.000000,4.572, !- X,Y,Z ==> Vertex 3 {m}", + " 15.24000,15.24000,4.572; !- X,Y,Z ==> Vertex 4 {m}", + + " FenestrationSurface:Detailed,", + " Zn001:Wall001:Win001, !- Name", + " Window, !- Surface Type", + " SimpleWindowConstruct, !- Construction Name", + " Zn001:Wall001, !- Building Surface Name", + " , !- Outside Boundary Condition Object", + " 0.5000000, !- View Factor to Ground", + " , !- Frame and Divider Name", + " 1.0, !- Multiplier", + " 4, !- Number of Vertices", + " 0.548000,0,2.5000, !- X,Y,Z ==> Vertex 1 {m}", + " 0.548000,0,0.5000, !- X,Y,Z ==> Vertex 2 {m}", + " 5.548000,0,0.5000, !- X,Y,Z ==> Vertex 3 {m}", + " 5.548000,0,2.5000; !- X,Y,Z ==> Vertex 4 {m}", + + " Construction,", + " SimpleWindowConstruct, !- Name", + " SimpleWindowTest; !- Outside Layer", + + " WindowMaterial:SimpleGlazingSystem,", + " SimpleWindowTest, !- Name", + " 0.600, !- U-Factor {W/m2-K}", + " 0.700, !- Solar Heat Gain Coefficient", + " 0.700; !- Visible Transmittance", + + " Sizing:Zone,", + " ZONE ONE, !- Zone or ZoneList Name", + " SupplyAirTemperature, !- Zone Cooling Design Supply Air Temperature Input Method", + " 12.0, !- Zone Cooling Design Supply Air Temperature {C}", + " , !- Zone Cooling Design Supply Air Temperature Difference {deltaC}", + " SupplyAirTemperature, !- Zone Heating Design Supply Air Temperature Input Method", + " 12.0, !- Zone Heating Design Supply Air Temperature {C}", + " , !- Zone Heating Design Supply Air Temperature Difference {deltaC}", + " 0.0075, !- Zone Cooling Design Supply Air Humidity Ratio {kgWater/kgDryAir}", + " 0.004, !- Zone Heating Design Supply Air Humidity Ratio {kgWater/kgDryAir}", + " SZ DSOA Zone One, !- Design Specification Outdoor Air Object Name", + " 0.0, !- Zone Heating Sizing Factor", + " 0.0, !- Zone Cooling Sizing Factor", + " DesignDay, !- Cooling Design Air Flow Method", + " 0, !- Cooling Design Air Flow Rate {m3/s}", + " , !- Cooling Minimum Air Flow per Zone Floor Area {m3/s-m2}", + " , !- Cooling Minimum Air Flow {m3/s}", + " , !- Cooling Minimum Air Flow Fraction", + " DesignDay, !- Heating Design Air Flow Method", + " 0, !- Heating Design Air Flow Rate {m3/s}", + " , !- Heating Maximum Air Flow per Zone Floor Area {m3/s-m2}", + " , !- Heating Maximum Air Flow {m3/s}", + " ; !- Heating Maximum Air Flow Fraction", + + " DesignSpecification:OutdoorAir,", + " SZ DSOA Zone One, !- Name", + " Sum, !- Outdoor Air Method", + " 0.0, !- Outdoor Air Flow per Person {m3/s-person}", + " 0.0, !- Outdoor Air Flow per Zone Floor Area {m3/s-m2}", + " 0.0; !- Outdoor Air Flow per Zone {m3/s}", + + " ZoneControl:Thermostat,", + " Zone Thermostat, !- Name", + " ZONE ONE, !- Zone or ZoneList Name", + " Zone Control Type Sched, !- Control Type Schedule Name", + " ThermostatSetpoint:DualSetpoint, !- Control 1 Object Type", + " Temperature Setpoints; !- Control 1 Name", + + " Schedule:Compact,", + " Zone Control Type Sched, !- Name", + " Control Type, !- Schedule Type Limits Name", + " Through: 12/31, !- Field 1", + " For: AllDays, !- Field 2", + " Until: 24:00,4; !- Field 3", + + " ThermostatSetpoint:DualSetpoint,", + " Temperature Setpoints, !- Name", + " Heating Setpoints, !- Heating Setpoint Temperature Schedule Name", + " Cooling Setpoints; !- Cooling Setpoint Temperature Schedule Name", + + " Schedule:Compact,", + " Heating Setpoints, !- Name", + " Temperature, !- Schedule Type Limits Name", + " Through: 12/31, !- Field 1", + " For: AllDays, !- Field 2", + " Until: 24:00,21.0; !- Field 3", + + " Schedule:Compact,", + " Cooling Setpoints, !- Name", + " Temperature, !- Schedule Type Limits Name", + " Through: 12/31, !- Field 1", + " For: AllDays, !- Field 2", + " Until: 24:00,24.0; !- Field 3", + + " ScheduleTypeLimits,", + " Control Type, !- Name", + " 0, !- Lower Limit Value", + " 4, !- Upper Limit Value", + " DISCRETE; !- Numeric Type", + + " ScheduleTypeLimits,", + " Temperature, !- Name", + " -60, !- Lower Limit Value", + " 200, !- Upper Limit Value", + " CONTINUOUS, !- Numeric Type", + " Temperature; !- Unit Type", + + " ZoneHVAC:EquipmentConnections,", + " ZONE ONE, !- Zone Name", + " ZONE 1 EQUIPMENT, !- Zone Conditioning Equipment List Name", + " ZONE 1 INLETS, !- Zone Air Inlet Node or NodeList Name", + " , !- Zone Air Exhaust Node or NodeList Name", + " ZONE 1 NODE, !- Zone Air Node Name", + " ZONE 1 OUTLET; !- Zone Return Air Node or NodeList Name", + + " ZoneHVAC:EquipmentList,", + " ZONE 1 EQUIPMENT, !- Name", + " SequentialLoad, !- Load Distribution Scheme", + " ZoneHVAC:IdealLoadsAirSystem, !- Zone Equipment 1 Object Type", + " ZONE 1 Ideal Loads, !- Zone Equipment 1 Name", + " 1, !- Zone Equipment 1 Cooling Sequence", + " 1, !- Zone Equipment 1 Heating or No-Load Sequence", + " , !- Zone Equipment 1 Sequential Cooling Load Fraction", + " ; !- Zone Equipment 1 Sequential Heating Load Fraction", + + " ZoneHVAC:IdealLoadsAirSystem,", + " ZONE 1 Ideal Loads, !- Name", + " , !- Availability Schedule Name", + " ZONE 1 INLETS, !- Zone Supply Air Node Name", + " , !- Zone Exhaust Air Node Name", + " , !- System Inlet Air Node Name", + " 50, !- Maximum Heating Supply Air Temperature {C}", + " 13, !- Minimum Cooling Supply Air Temperature {C}", + " 0.015, !- Maximum Heating Supply Air Humidity Ratio {kgWater/kgDryAir}", + " 0.009, !- Minimum Cooling Supply Air Humidity Ratio {kgWater/kgDryAir}", + " NoLimit, !- Heating Limit", + " autosize, !- Maximum Heating Air Flow Rate {m3/s}", + " , !- Maximum Sensible Heating Capacity {W}", + " NoLimit, !- Cooling Limit", + " autosize, !- Maximum Cooling Air Flow Rate {m3/s}", + " , !- Maximum Total Cooling Capacity {W}", + " , !- Heating Availability Schedule Name", + " , !- Cooling Availability Schedule Name", + " ConstantSupplyHumidityRatio, !- Dehumidification Control Type", + " , !- Cooling Sensible Heat Ratio {dimensionless}", + " ConstantSupplyHumidityRatio, !- Humidification Control Type", + " , !- Design Specification Outdoor Air Object Name", + " , !- Outdoor Air Inlet Node Name", + " , !- Demand Controlled Ventilation Type", + " , !- Outdoor Air Economizer Type", + " , !- Heat Recovery Type", + " , !- Sensible Heat Recovery Effectiveness {dimensionless}", + " ; !- Latent Heat Recovery Effectiveness {dimensionless}", + + " NodeList,", + " ZONE 1 INLETS, !- Name", + " ZONE 1 INLET; !- Node 1 Name", + + " People,", + " OpenOffice People, !- Name", + " ZONE ONE, !- Zone or ZoneList Name", + " BLDG_OCC_SCH, !- Number of People Schedule Name", + " People/Area, !- Number of People Calculation Method", + " , !- Number of People", + " 0.010, !- People per Zone Floor Area {person/m2}", + " , !- Zone Floor Area per Person {m2/person}", + " 0.3, !- Fraction Radiant", + " , !- Sensible Heat Fraction", + " ACTIVITY_SCH; !- Activity Level Schedule Name", + + " Lights,", + " OfficeLights, !- Name", + " ZONE ONE, !- Zone or ZoneList Name", + " BLDG_LIGHT_SCH, !- Schedule Name", + " Watts/Area, !- Design Level Calculation Method", + " , !- Lighting Level {W}", + " 8.0, !- Watts per Zone Floor Area {W/m2}", + " , !- Watts per Person {W/person}", + " , !- Return Air Fraction", + " , !- Fraction Radiant", + " , !- Fraction Visible", + " ; !- Fraction Replaceable", + + " ElectricEquipment,", + " ElectricEquipment, !- Name", + " ZONE ONE, !- Zone or ZoneList Name", + " BLDG_EQUIP_SCH, !- Schedule Name", + " Watts/Area, !- Design Level Calculation Method", + " , !- Design Level {W}", + " 8.0, !- Watts per Zone Floor Area {W/m2}", + " , !- Watts per Person {W/person}", + " , !- Fraction Latent", + " , !- Fraction Radiant", + " ; !- Fraction Lost", + + " Schedule:Compact,", + " BLDG_EQUIP_SCH, !- Name", + " Fraction, !- Schedule Type Limits Name", + " Through: 12/31, !- Field 1", + " For: AllDays, !- Field 2", + " Until: 24:00, !- Field 3", + " 0.7; !- Field 4", + + " Schedule:Compact,", + " BLDG_LIGHT_SCH, !- Name", + " Fraction, !- Schedule Type Limits Name", + " Through: 12/31, !- Field 1", + " For: AllDays, !- Field 2", + " Until: 24:00, !- Field 3", + " 0.5; !- Field 4", + + " Schedule:Compact,", + " BLDG_OCC_SCH, !- Name", + " Fraction, !- Schedule Type Limits Name", + " Through: 12/31, !- Field 1", + " For: AllDays, !- Field 2", + " Until: 24:00, !- Field 3", + " 0.5; !- Field 4", + + " Schedule:Compact,", + " ACTIVITY_SCH, !- Name", + " Any Number, !- Schedule Type Limits Name", + " Through: 12/31, !- Field 1", + " For: AllDays, !- Field 2", + " Until: 24:00, !- Field 3", + " 120.; !- Field 4", + + " ScheduleTypeLimits,", + " Any Number; !- Name", + + }); + + ASSERT_TRUE(process_idf(idf_objects)); + + SimulationManager::ManageSimulation(); + + int CtrlZoneNum(1); + // design peak load conditons and design supply air temperature + EXPECT_EQ(DataSizing::CalcFinalZoneSizing(CtrlZoneNum).HeatTstatTemp, 21.0); // expects specified value + EXPECT_EQ(DataSizing::CalcFinalZoneSizing(CtrlZoneNum).HeatDesTemp, 12.0); // less than zone air Temp + EXPECT_EQ(DataSizing::CalcFinalZoneSizing(CtrlZoneNum).HeatDesDay, "PHOENIX SKY HARBOR INTL AP ANN HTG 99.6% CONDNS DB"); + // actual zone air temperature at peak load + EXPECT_NEAR(DataSizing::CalcFinalZoneSizing(CtrlZoneNum).ZoneTempAtHeatPeak, 17.08, 0.01); + EXPECT_NEAR(DataSizing::FinalZoneSizing(CtrlZoneNum).ZoneTempAtHeatPeak, 17.08, 0.01); + // Check heating design flow rates, expected to be zero due the above conditions + EXPECT_EQ(DataSizing::CalcFinalZoneSizing(CtrlZoneNum).DesHeatVolFlow, 0.0); // expects zero + EXPECT_EQ(DataSizing::CalcFinalZoneSizing(CtrlZoneNum).DesHeatMassFlow, 0.0); // expects zero + EXPECT_EQ(DataSizing::FinalZoneSizing(CtrlZoneNum).DesHeatVolFlow, 0.0); // expects zero + EXPECT_EQ(DataSizing::FinalZoneSizing(CtrlZoneNum).DesHeatMassFlow, 0.0); // expects zero + // expects non-zero peak heating load + EXPECT_NEAR(DataSizing::CalcFinalZoneSizing(CtrlZoneNum).DesHeatLoad, 6911.42, 0.01); + EXPECT_NEAR(DataSizing::FinalZoneSizing(CtrlZoneNum).DesHeatLoad, 6911.42, 0.01); +} diff --git a/tst/EnergyPlus/unit/StandardRatings.unit.cc b/tst/EnergyPlus/unit/StandardRatings.unit.cc index 8bc94796926..8dacd2427c4 100644 --- a/tst/EnergyPlus/unit/StandardRatings.unit.cc +++ b/tst/EnergyPlus/unit/StandardRatings.unit.cc @@ -57,12 +57,15 @@ #include #include #include +#include +#include using namespace EnergyPlus; using namespace EnergyPlus::StandardRatings; using namespace EnergyPlus::CurveManager; using namespace EnergyPlus::DataHVACGlobals; using namespace EnergyPlus::DXCoils; +using namespace EnergyPlus::ChillerElectricEIR; namespace EnergyPlus { @@ -236,4 +239,94 @@ TEST_F(EnergyPlusFixture, SingleSpeedHeatingCoilCurveTest) // if one of the CAP or EIR curves value is less than zero, then HSPF is set to zero EXPECT_DOUBLE_EQ(HSPF, 0.0); } + +TEST_F(EnergyPlusFixture, ChillerIPLVTest) +{ + + using CurveManager::Cubic; + using CurveManager::BiQuadratic; + using CurveManager::NumCurves; + using StandardRatings::CalcChillerIPLV; + using DataPlant::TypeOf_Chiller_ElectricEIR; + + // Setup an air-cooled Chiller:Electric:EIR chiller + ChillerElectricEIR::ElectricEIRChiller.allocate(1); + ChillerElectricEIR::ElectricEIRChiller(1).Name = "Air Cooled Chiller"; + ChillerElectricEIR::ElectricEIRChiller(1).RefCap = 216000; // W + ChillerElectricEIR::ElectricEIRChiller(1).RefCOP = 2.81673861898309; // W/W + ChillerElectricEIR::ElectricEIRChiller(1).CondenserType = ChillerElectricEIR::AirCooled; + ChillerElectricEIR::ElectricEIRChiller(1).MinUnloadRat = 0.15; + + int CurveNum; + NumCurves = 3; + PerfCurve.allocate(NumCurves); + + // Cap=f(T) + CurveNum = 1; + PerfCurve(CurveNum).CurveType = BiQuadratic; + PerfCurve(CurveNum).NumDims = 2; + PerfCurve(CurveNum).ObjectType = "Curve:BiQuadratic"; + PerfCurve(CurveNum).InterpolationType = EvaluateCurveToLimits; + PerfCurve(CurveNum).Name = "AirCooledChillerScrewCmpCapfT"; + PerfCurve(CurveNum).Coeff1 = 0.98898813; + PerfCurve(CurveNum).Coeff2 = 0.036832851; + PerfCurve(CurveNum).Coeff3 = 0.000174006; + PerfCurve(CurveNum).Coeff4 = -0.000275634; + PerfCurve(CurveNum).Coeff5 = -0.000143667; + PerfCurve(CurveNum).Coeff6 = -0.000246286; + PerfCurve(CurveNum).Var1Min = 4.44; + PerfCurve(CurveNum).Var1Max = 10; + PerfCurve(CurveNum).Var2Min = 23.89; + PerfCurve(CurveNum).Var2Max = 46.11; + ChillerElectricEIR::ElectricEIRChiller(1).ChillerCapFT = 1; + + // EIR=f(T) + CurveNum = 2; + PerfCurve(CurveNum).CurveType = BiQuadratic; + PerfCurve(CurveNum).NumDims = 2; + PerfCurve(CurveNum).ObjectType = "Curve:BiQuadratic"; + PerfCurve(CurveNum).InterpolationType = EvaluateCurveToLimits; + PerfCurve(CurveNum).Name = "AirCooledChillerScrewCmpEIRfT"; + PerfCurve(CurveNum).Coeff1 = 0.814058418; + PerfCurve(CurveNum).Coeff2 = 0.002335553; + PerfCurve(CurveNum).Coeff3 = 0.000817786; + PerfCurve(CurveNum).Coeff4 = -0.017129784; + PerfCurve(CurveNum).Coeff5 = 0.000773288; + PerfCurve(CurveNum).Coeff6 = -0.000922024; + PerfCurve(CurveNum).Var1Min = 4.44; + PerfCurve(CurveNum).Var1Max = 10; + PerfCurve(CurveNum).Var2Min = 10; + PerfCurve(CurveNum).Var2Max = 46.11; + ChillerElectricEIR::ElectricEIRChiller(1).ChillerEIRFT = 2; + + // EIR=f(PLR) + CurveNum = 3; + PerfCurve(CurveNum).CurveType = Cubic; + PerfCurve(CurveNum).NumDims = 1; + PerfCurve(CurveNum).ObjectType = "Curve:Cubic"; + PerfCurve(CurveNum).InterpolationType = EvaluateCurveToLimits; + PerfCurve(CurveNum).Name = "AirCooledChillerScrewCmpEIRfPLR"; + PerfCurve(CurveNum).Coeff1 = -0.08117804; + PerfCurve(CurveNum).Coeff2 = 1.433532026; + PerfCurve(CurveNum).Coeff3 = -0.762289434; + PerfCurve(CurveNum).Coeff4 = 0.412199944; + PerfCurve(CurveNum).Var1Min = 0; + PerfCurve(CurveNum).Var1Max = 1; + ChillerElectricEIR::ElectricEIRChiller(1).ChillerEIRFPLR = 3; + + Real64 IPLV; + CalcChillerIPLV(ChillerElectricEIR::ElectricEIRChiller(1).Name, + TypeOf_Chiller_ElectricEIR, + ChillerElectricEIR::ElectricEIRChiller(1).RefCap, + ChillerElectricEIR::ElectricEIRChiller(1).RefCOP, + ChillerElectricEIR::ElectricEIRChiller(1).CondenserType, + ChillerElectricEIR::ElectricEIRChiller(1).ChillerCapFT, + ChillerElectricEIR::ElectricEIRChiller(1).ChillerEIRFT, + ChillerElectricEIR::ElectricEIRChiller(1).ChillerEIRFPLR, + ChillerElectricEIR::ElectricEIRChiller(1).MinUnloadRat, + IPLV); + + EXPECT_DOUBLE_EQ(round(IPLV * 100) / 100, 3.87); // 13.20 IPLV + +} } // namespace EnergyPlus diff --git a/tst/EnergyPlus/unit/WindowEquivalentLayer.unit.cc b/tst/EnergyPlus/unit/WindowEquivalentLayer.unit.cc index 5aafb8d6304..174d7d0f4d8 100644 --- a/tst/EnergyPlus/unit/WindowEquivalentLayer.unit.cc +++ b/tst/EnergyPlus/unit/WindowEquivalentLayer.unit.cc @@ -915,6 +915,7 @@ TEST_F(EnergyPlusFixture, WindowEquivalentLayer_VBBlockBeamSolar) Real64 SlateAngleBlockBeamSolar = VB_CriticalSlatAngle(DataGlobals::RadToDeg * ProfAngVer); EXPECT_NEAR(SlateAngleBlockBeamSolar, DataSurfaces::SurfaceWindow(SurfNum).SlatAngThisTSDeg, 0.0001); } + TEST_F(EnergyPlusFixture, WindowEquivalentLayer_InvalidLayerTest) { @@ -948,3 +949,1044 @@ TEST_F(EnergyPlusFixture, WindowEquivalentLayer_InvalidLayerTest) EXPECT_TRUE(DataHeatBalance::Construct(1).WindowTypeEQL); EXPECT_TRUE(ErrorsFound); // error found due to invalid layer } + +TEST_F(EnergyPlusFixture, WindowEquivalentLayer_AirGapOutdoorVentedTest) +{ + // GitHub issue 7345 + std::string const idf_objects = delimited_string({ + + " Version,9.2;", + + " Timestep,1;", + + " Building,", + " Simple One Zone w Windows, !- Name", + " 0, !- North Axis {deg}", + " Suburbs, !- Terrain", + " 0.04, !- Loads Convergence Tolerance Value", + " 0.004, !- Temperature Convergence Tolerance Value {deltaC}", + " MinimalShadowing, !- Solar Distribution", + " 30, !- Maximum Number of Warmup Days", + " 6; !- Minimum Number of Warmup Days", + + " HeatBalanceAlgorithm,ConductionTransferFunction;", + + " SurfaceConvectionAlgorithm:Inside,TARP;", + + " SurfaceConvectionAlgorithm:Outside,DOE-2;", + + " SimulationControl,", + " No, !- Do Zone Sizing Calculation", + " No, !- Do System Sizing Calculation", + " No, !- Do Plant Sizing Calculation", + " Yes, !- Run Simulation for Sizing Periods", + " No; !- Run Simulation for Weather File Run Periods", + + " SizingPeriod:DesignDay,", + " Denver Stapleton Intl Arpt Ann Clg 1% Condns DB=>MWB, !- Name", + " 7, !- Month", + " 21, !- Day of Month", + " SummerDesignDay, !- Day Type", + " 32.6, !- Maximum Dry-Bulb Temperature {C}", + " 15.2, !- Daily Dry-Bulb Temperature Range {deltaC}", + " , !- Dry-Bulb Temperature Range Modifier Type", + " , !- Dry-Bulb Temperature Range Modifier Day Schedule Name", + " Wetbulb, !- Humidity Condition Type", + " 15.6, !- Wetbulb or DewPoint at Maximum Dry-Bulb {C}", + " , !- Humidity Condition Day Schedule Name", + " , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir}", + " , !- Enthalpy at Maximum Dry-Bulb {J/kg}", + " , !- Daily Wet-Bulb Temperature Range {deltaC}", + " 83411., !- Barometric Pressure {Pa}", + " 4, !- Wind Speed {m/s}", + " 120, !- Wind Direction {deg}", + " No, !- Rain Indicator", + " No, !- Snow Indicator", + " No, !- Daylight Saving Time Indicator", + " ASHRAEClearSky, !- Solar Model Indicator", + " , !- Beam Solar Day Schedule Name", + " , !- Diffuse Solar Day Schedule Name", + " , !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) {dimensionless}", + " , !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) {dimensionless}", + " 1.00; !- Sky Clearness", + + " Site:Location,", + " Denver Stapleton Intl Arpt CO USA WMO=724690, !- Name", + " 39.77, !- Latitude {deg}", + " -104.87, !- Longitude {deg}", + " -7.00, !- Time Zone {hr}", + " 1611.00; !- Elevation {m}", + + " Material:NoMass,", + " R13LAYER, !- Name", + " Rough, !- Roughness", + " 2.290965, !- Thermal Resistance {m2-K/W}", + " 0.9000000, !- Thermal Absorptance", + " 0.7500000, !- Solar Absorptance", + " 0.7500000; !- Visible Absorptance", + + " Material:NoMass,", + " R31LAYER, !- Name", + " Rough, !- Roughness", + " 5.456, !- Thermal Resistance {m2-K/W}", + " 0.9000000, !- Thermal Absorptance", + " 0.7500000, !- Solar Absorptance", + " 0.7500000; !- Visible Absorptance", + + " Material,", + " C5 - 4 IN HW CONCRETE, !- Name", + " MediumRough, !- Roughness", + " 0.1014984, !- Thickness {m}", + " 1.729577, !- Conductivity {W/m-K}", + " 2242.585, !- Density {kg/m3}", + " 836.8000, !- Specific Heat {J/kg-K}", + " 0.9000000, !- Thermal Absorptance", + " 0.6500000, !- Solar Absorptance", + " 0.6500000; !- Visible Absorptance", + + " Construction,", + " R13WALL, !- Name", + " R13LAYER; !- Outside Layer", + + " Construction,", + " FLOOR, !- Name", + " C5 - 4 IN HW CONCRETE; !- Outside Layer", + + " Construction,", + " ROOF31, !- Name", + " R31LAYER; !- Outside Layer", + + " Site:GroundTemperature:BuildingSurface,18.89,18.92,19.02,19.12,19.21,19.23,19.07,19.32,19.09,19.21,19.13,18.96;", + + " Zone,", + " ZONE ONE, !- Name", + " 0, !- Direction of Relative North {deg}", + " 0, !- X Origin {m}", + " 0, !- Y Origin {m}", + " 0, !- Z Origin {m}", + " 1, !- Type", + " 1, !- Multiplier", + " autocalculate, !- Ceiling Height {m}", + " autocalculate; !- Volume {m3}", + + " ScheduleTypeLimits,", + " Fraction, !- Name", + " 0.0, !- Lower Limit Value", + " 1.0, !- Upper Limit Value", + " CONTINUOUS; !- Numeric Type", + + " GlobalGeometryRules,", + " UpperLeftCorner, !- Starting Vertex Position", + " CounterClockWise, !- Vertex Entry Direction", + " World; !- Coordinate System", + + " BuildingSurface:Detailed,", + " Zn001:Wall001, !- Name", + " Wall, !- Surface Type", + " R13WALL, !- Construction Name", + " ZONE ONE, !- Zone Name", + " Outdoors, !- Outside Boundary Condition", + " , !- Outside Boundary Condition Object", + " SunExposed, !- Sun Exposure", + " WindExposed, !- Wind Exposure", + " 0.5000000, !- View Factor to Ground", + " 4, !- Number of Vertices", + " 0,0,4.572000, !- X,Y,Z ==> Vertex 1 {m}", + " 0,0,0, !- X,Y,Z ==> Vertex 2 {m}", + " 15.24000,0,0, !- X,Y,Z ==> Vertex 3 {m}", + " 15.24000,0,4.572000; !- X,Y,Z ==> Vertex 4 {m}", + + " BuildingSurface:Detailed,", + " Zn001:Wall002, !- Name", + " Wall, !- Surface Type", + " R13WALL, !- Construction Name", + " ZONE ONE, !- Zone Name", + " Outdoors, !- Outside Boundary Condition", + " , !- Outside Boundary Condition Object", + " SunExposed, !- Sun Exposure", + " WindExposed, !- Wind Exposure", + " 0.5000000, !- View Factor to Ground", + " 4, !- Number of Vertices", + " 15.24000,0,4.572000, !- X,Y,Z ==> Vertex 1 {m}", + " 15.24000,0,0, !- X,Y,Z ==> Vertex 2 {m}", + " 15.24000,15.24000,0, !- X,Y,Z ==> Vertex 3 {m}", + " 15.24000,15.24000,4.572000; !- X,Y,Z ==> Vertex 4 {m}", + + " BuildingSurface:Detailed,", + " Zn001:Wall003, !- Name", + " Wall, !- Surface Type", + " R13WALL, !- Construction Name", + " ZONE ONE, !- Zone Name", + " Outdoors, !- Outside Boundary Condition", + " , !- Outside Boundary Condition Object", + " SunExposed, !- Sun Exposure", + " WindExposed, !- Wind Exposure", + " 0.5000000, !- View Factor to Ground", + " 4, !- Number of Vertices", + " 15.24000,15.24000,4.572000, !- X,Y,Z ==> Vertex 1 {m}", + " 15.24000,15.24000,0, !- X,Y,Z ==> Vertex 2 {m}", + " 0,15.24000,0, !- X,Y,Z ==> Vertex 3 {m}", + " 0,15.24000,4.572000; !- X,Y,Z ==> Vertex 4 {m}", + + " BuildingSurface:Detailed,", + " Zn001:Wall004, !- Name", + " Wall, !- Surface Type", + " R13WALL, !- Construction Name", + " ZONE ONE, !- Zone Name", + " Outdoors, !- Outside Boundary Condition", + " , !- Outside Boundary Condition Object", + " SunExposed, !- Sun Exposure", + " WindExposed, !- Wind Exposure", + " 0.5000000, !- View Factor to Ground", + " 4, !- Number of Vertices", + " 0,15.24000,4.572000, !- X,Y,Z ==> Vertex 1 {m}", + " 0,15.24000,0, !- X,Y,Z ==> Vertex 2 {m}", + " 0,0,0, !- X,Y,Z ==> Vertex 3 {m}", + " 0,0,4.572000; !- X,Y,Z ==> Vertex 4 {m}", + + " BuildingSurface:Detailed,", + " Zn001:Flr001, !- Name", + " Floor, !- Surface Type", + " FLOOR, !- Construction Name", + " ZONE ONE, !- Zone Name", + " Surface, !- Outside Boundary Condition", + " Zn001:Flr001, !- Outside Boundary Condition Object", + " NoSun, !- Sun Exposure", + " NoWind, !- Wind Exposure", + " 1.000000, !- View Factor to Ground", + " 4, !- Number of Vertices", + " 15.24000,0.000000,0.0, !- X,Y,Z ==> Vertex 1 {m}", + " 0.000000,0.000000,0.0, !- X,Y,Z ==> Vertex 2 {m}", + " 0.000000,15.24000,0.0, !- X,Y,Z ==> Vertex 3 {m}", + " 15.24000,15.24000,0.0; !- X,Y,Z ==> Vertex 4 {m}", + + " BuildingSurface:Detailed,", + " Zn001:Roof001, !- Name", + " Roof, !- Surface Type", + " ROOF31, !- Construction Name", + " ZONE ONE, !- Zone Name", + " Outdoors, !- Outside Boundary Condition", + " , !- Outside Boundary Condition Object", + " SunExposed, !- Sun Exposure", + " WindExposed, !- Wind Exposure", + " 0, !- View Factor to Ground", + " 4, !- Number of Vertices", + " 0.000000,15.24000,4.572, !- X,Y,Z ==> Vertex 1 {m}", + " 0.000000,0.000000,4.572, !- X,Y,Z ==> Vertex 2 {m}", + " 15.24000,0.000000,4.572, !- X,Y,Z ==> Vertex 3 {m}", + " 15.24000,15.24000,4.572; !- X,Y,Z ==> Vertex 4 {m}", + + " FenestrationSurface:Detailed,", + " Zn001:Wall001:Win001, !- Name", + " Window, !- Surface Type", + " CLR AIRGAP CLR, !- Construction Name", + " Zn001:Wall001, !- Building Surface Name", + " , !- Outside Boundary Condition Object", + " 0.5000000, !- View Factor to Ground", + " , !- Frame and Divider Name", + " 1.0, !- Multiplier", + " 4, !- Number of Vertices", + " 0.548000,0,2.5000, !- X,Y,Z ==> Vertex 1 {m}", + " 0.548000,0,0.5000, !- X,Y,Z ==> Vertex 2 {m}", + " 5.548000,0,0.5000, !- X,Y,Z ==> Vertex 3 {m}", + " 5.548000,0,2.5000; !- X,Y,Z ==> Vertex 4 {m}", + + " Construction:WindowEquivalentLayer,", + " CLR AIRGAP CLR, !- Name", + " GLZCLR, !- Outside Layer", + " Air GAP 12mm, !- Layer 2", + " GLZCLR; !- Layer 3", + + " WindowMaterial:Glazing:EquivalentLayer,", + " GLZCLR, !- Name", + " SpectralAverage, !- Optical Data Type", + " , !- Window Glass Spectral Data Set Name", + " 0.77, !- Front Side Beam-Beam Solar Transmittance {dimensionless}", + " 0.77, !- Back Side Beam-Beam Solar Transmittance {dimensionless}", + " 0.07, !- Front Side Beam-Beam Solar Reflectance {dimensionless}", + " 0.07, !- Back Side Beam-Beam Solar Reflectance {dimensionless}", + " 0.0, !- Front Side Beam-Beam Visible Solar Transmittance {dimensionless}", + " 0.0, !- Back Side Beam-Beam Visible Solar Transmittance {dimensionless}", + " 0.0, !- Front Side Beam-Beam Visible Solar Reflectance {dimensionless}", + " 0.0, !- Back Side Beam-Beam Visible Solar Reflectance {dimensionless}", + " 0.0, !- Front Side Beam-Diffuse Solar Transmittance {dimensionless}", + " 0.0, !- Back Side Beam-Diffuse Solar Transmittance {dimensionless}", + " 0.0, !- Front Side Beam-Diffuse Solar Reflectance {dimensionless}", + " 0.0, !- Back Side Beam-Diffuse Solar Reflectance {dimensionless}", + " 0.0, !- Front Side Beam-Diffuse Visible Solar Transmittance {dimensionless}", + " 0.0, !- Back Side Beam-Diffuse Visible Solar Transmittance {dimensionless}", + " 0.0, !- Front Side Beam-Diffuse Visible Solar Reflectance {dimensionless}", + " 0.0, !- Back Side Beam-Diffuse Visible Solar Reflectance {dimensionless}", + " 0.695, !- Diffuse-Diffuse Solar Transmittance {dimensionless}", + " 0.16, !- Front Side Diffuse-Diffuse Solar Reflectance {dimensionless}", + " 0.16, !- Back Side Diffuse-Diffuse Solar Reflectance {dimensionless}", + " 0.0, !- Diffuse-Diffuse Visible Solar Transmittance {dimensionless}", + " 0.0, !- Front Side Diffuse-Diffuse Visible Solar Reflectance {dimensionless}", + " 0.0, !- Back Side Diffuse-Diffuse Visible Solar Reflectance {dimensionless}", + " 0.0, !- Infrared Transmittance (applies to front and back) {dimensionless}", + " 0.84, !- Front Side Infrared Emissivity {dimensionless}", + " 0.84; !- Back Side Infrared Emissivity {dimensionless}", + + " WindowMaterial:Gap:EquivalentLayer,", + " Air GAP 12mm, !- Name", + " Air, !- Gas Type", + " 0.0120, !- Thickness {m}", + " VentedOutdoor; !- Gap Vent Type", + + }); + ASSERT_TRUE(process_idf(idf_objects)); + + SimulationManager::ManageSimulation(); + + int EQLNum(1); + Array1D T({1, CFSMAXNL}, 0.0); + Array1D Q({0, CFSMAXNL}, 0.0); + Array1D JB({0, CFSMAXNL}, 0.0); + Array1D QOCF({1, CFSMAXNL}, 0.0); + Array1D H({0, CFSMAXNL + 1}, 0.0); + Array1D JF({1, CFSMAXNL + 1}, 0.0); + Array1D Source({1, CFSMAXNL + 1}, 0.0); + + Real64 HcIn = 1.5; + Real64 HcOut = 6.0; + Real64 TOL = 0.001; + Real64 TIN = 301.5; + Real64 Tout = 310.0; + Real64 TRMIN = 301.5; + Real64 TRMOUT = 308.0; + Real64 QOCFRoom = 0.0; + H(0) = HcOut; + H(1) = 0.0; + H(2) = HcIn; + + // check the window air gap vent type: vented to outdoor + EXPECT_EQ(CFS(EQLNum).G(1).GTYPE, gtyOPENout); + // zero solar absorbed on glazing layers or no solar input + Source = 0.0; + ASHWAT_ThermalCalc(CFS(EQLNum), TIN, Tout, HcIn, HcOut, TRMOUT, TRMIN, Source, TOL, QOCF, QOCFRoom, T, Q, JF, JB, H); + EXPECT_NEAR(T(1), 308.610, 0.001); + EXPECT_NEAR(T(2), 306.231, 0.001); + + // with solar absrobed on glazing layers + Source(1) = 100.0; // outside glass layer + Source(2) = 50.0; // inside glass layer + ASHWAT_ThermalCalc(CFS(EQLNum), TIN, Tout, HcIn, HcOut, TRMOUT, TRMIN, Source, TOL, QOCF, QOCFRoom, T, Q, JF, JB, H); + EXPECT_NEAR(T(1), 313.886, 0.001); + EXPECT_NEAR(T(2), 310.559, 0.001); +} +TEST_F(EnergyPlusFixture, WindowEquivalentLayer_AirGapIndoorVentedTest) +{ + // GitHub issue 7345 + std::string const idf_objects = delimited_string({ + + " Version,9.2;", + + " Timestep,1;", + + " Building,", + " Simple One Zone w Windows, !- Name", + " 0, !- North Axis {deg}", + " Suburbs, !- Terrain", + " 0.04, !- Loads Convergence Tolerance Value", + " 0.004, !- Temperature Convergence Tolerance Value {deltaC}", + " MinimalShadowing, !- Solar Distribution", + " 30, !- Maximum Number of Warmup Days", + " 6; !- Minimum Number of Warmup Days", + + " HeatBalanceAlgorithm,ConductionTransferFunction;", + + " SurfaceConvectionAlgorithm:Inside,TARP;", + + " SurfaceConvectionAlgorithm:Outside,DOE-2;", + + " SimulationControl,", + " No, !- Do Zone Sizing Calculation", + " No, !- Do System Sizing Calculation", + " No, !- Do Plant Sizing Calculation", + " Yes, !- Run Simulation for Sizing Periods", + " No; !- Run Simulation for Weather File Run Periods", + + " SizingPeriod:DesignDay,", + " Denver Stapleton Intl Arpt Ann Clg 1% Condns DB=>MWB, !- Name", + " 7, !- Month", + " 21, !- Day of Month", + " SummerDesignDay, !- Day Type", + " 32.6, !- Maximum Dry-Bulb Temperature {C}", + " 15.2, !- Daily Dry-Bulb Temperature Range {deltaC}", + " , !- Dry-Bulb Temperature Range Modifier Type", + " , !- Dry-Bulb Temperature Range Modifier Day Schedule Name", + " Wetbulb, !- Humidity Condition Type", + " 15.6, !- Wetbulb or DewPoint at Maximum Dry-Bulb {C}", + " , !- Humidity Condition Day Schedule Name", + " , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir}", + " , !- Enthalpy at Maximum Dry-Bulb {J/kg}", + " , !- Daily Wet-Bulb Temperature Range {deltaC}", + " 83411., !- Barometric Pressure {Pa}", + " 4, !- Wind Speed {m/s}", + " 120, !- Wind Direction {deg}", + " No, !- Rain Indicator", + " No, !- Snow Indicator", + " No, !- Daylight Saving Time Indicator", + " ASHRAEClearSky, !- Solar Model Indicator", + " , !- Beam Solar Day Schedule Name", + " , !- Diffuse Solar Day Schedule Name", + " , !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) {dimensionless}", + " , !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) {dimensionless}", + " 1.00; !- Sky Clearness", + + " Site:Location,", + " Denver Stapleton Intl Arpt CO USA WMO=724690, !- Name", + " 39.77, !- Latitude {deg}", + " -104.87, !- Longitude {deg}", + " -7.00, !- Time Zone {hr}", + " 1611.00; !- Elevation {m}", + + " Material:NoMass,", + " R13LAYER, !- Name", + " Rough, !- Roughness", + " 2.290965, !- Thermal Resistance {m2-K/W}", + " 0.9000000, !- Thermal Absorptance", + " 0.7500000, !- Solar Absorptance", + " 0.7500000; !- Visible Absorptance", + + " Material:NoMass,", + " R31LAYER, !- Name", + " Rough, !- Roughness", + " 5.456, !- Thermal Resistance {m2-K/W}", + " 0.9000000, !- Thermal Absorptance", + " 0.7500000, !- Solar Absorptance", + " 0.7500000; !- Visible Absorptance", + + " Material,", + " C5 - 4 IN HW CONCRETE, !- Name", + " MediumRough, !- Roughness", + " 0.1014984, !- Thickness {m}", + " 1.729577, !- Conductivity {W/m-K}", + " 2242.585, !- Density {kg/m3}", + " 836.8000, !- Specific Heat {J/kg-K}", + " 0.9000000, !- Thermal Absorptance", + " 0.6500000, !- Solar Absorptance", + " 0.6500000; !- Visible Absorptance", + + " Construction,", + " R13WALL, !- Name", + " R13LAYER; !- Outside Layer", + + " Construction,", + " FLOOR, !- Name", + " C5 - 4 IN HW CONCRETE; !- Outside Layer", + + " Construction,", + " ROOF31, !- Name", + " R31LAYER; !- Outside Layer", + + " Site:GroundTemperature:BuildingSurface,18.89,18.92,19.02,19.12,19.21,19.23,19.07,19.32,19.09,19.21,19.13,18.96;", + + " Zone,", + " ZONE ONE, !- Name", + " 0, !- Direction of Relative North {deg}", + " 0, !- X Origin {m}", + " 0, !- Y Origin {m}", + " 0, !- Z Origin {m}", + " 1, !- Type", + " 1, !- Multiplier", + " autocalculate, !- Ceiling Height {m}", + " autocalculate; !- Volume {m3}", + + " ScheduleTypeLimits,", + " Fraction, !- Name", + " 0.0, !- Lower Limit Value", + " 1.0, !- Upper Limit Value", + " CONTINUOUS; !- Numeric Type", + + " GlobalGeometryRules,", + " UpperLeftCorner, !- Starting Vertex Position", + " CounterClockWise, !- Vertex Entry Direction", + " World; !- Coordinate System", + + " BuildingSurface:Detailed,", + " Zn001:Wall001, !- Name", + " Wall, !- Surface Type", + " R13WALL, !- Construction Name", + " ZONE ONE, !- Zone Name", + " Outdoors, !- Outside Boundary Condition", + " , !- Outside Boundary Condition Object", + " SunExposed, !- Sun Exposure", + " WindExposed, !- Wind Exposure", + " 0.5000000, !- View Factor to Ground", + " 4, !- Number of Vertices", + " 0,0,4.572000, !- X,Y,Z ==> Vertex 1 {m}", + " 0,0,0, !- X,Y,Z ==> Vertex 2 {m}", + " 15.24000,0,0, !- X,Y,Z ==> Vertex 3 {m}", + " 15.24000,0,4.572000; !- X,Y,Z ==> Vertex 4 {m}", + + " BuildingSurface:Detailed,", + " Zn001:Wall002, !- Name", + " Wall, !- Surface Type", + " R13WALL, !- Construction Name", + " ZONE ONE, !- Zone Name", + " Outdoors, !- Outside Boundary Condition", + " , !- Outside Boundary Condition Object", + " SunExposed, !- Sun Exposure", + " WindExposed, !- Wind Exposure", + " 0.5000000, !- View Factor to Ground", + " 4, !- Number of Vertices", + " 15.24000,0,4.572000, !- X,Y,Z ==> Vertex 1 {m}", + " 15.24000,0,0, !- X,Y,Z ==> Vertex 2 {m}", + " 15.24000,15.24000,0, !- X,Y,Z ==> Vertex 3 {m}", + " 15.24000,15.24000,4.572000; !- X,Y,Z ==> Vertex 4 {m}", + + " BuildingSurface:Detailed,", + " Zn001:Wall003, !- Name", + " Wall, !- Surface Type", + " R13WALL, !- Construction Name", + " ZONE ONE, !- Zone Name", + " Outdoors, !- Outside Boundary Condition", + " , !- Outside Boundary Condition Object", + " SunExposed, !- Sun Exposure", + " WindExposed, !- Wind Exposure", + " 0.5000000, !- View Factor to Ground", + " 4, !- Number of Vertices", + " 15.24000,15.24000,4.572000, !- X,Y,Z ==> Vertex 1 {m}", + " 15.24000,15.24000,0, !- X,Y,Z ==> Vertex 2 {m}", + " 0,15.24000,0, !- X,Y,Z ==> Vertex 3 {m}", + " 0,15.24000,4.572000; !- X,Y,Z ==> Vertex 4 {m}", + + " BuildingSurface:Detailed,", + " Zn001:Wall004, !- Name", + " Wall, !- Surface Type", + " R13WALL, !- Construction Name", + " ZONE ONE, !- Zone Name", + " Outdoors, !- Outside Boundary Condition", + " , !- Outside Boundary Condition Object", + " SunExposed, !- Sun Exposure", + " WindExposed, !- Wind Exposure", + " 0.5000000, !- View Factor to Ground", + " 4, !- Number of Vertices", + " 0,15.24000,4.572000, !- X,Y,Z ==> Vertex 1 {m}", + " 0,15.24000,0, !- X,Y,Z ==> Vertex 2 {m}", + " 0,0,0, !- X,Y,Z ==> Vertex 3 {m}", + " 0,0,4.572000; !- X,Y,Z ==> Vertex 4 {m}", + + " BuildingSurface:Detailed,", + " Zn001:Flr001, !- Name", + " Floor, !- Surface Type", + " FLOOR, !- Construction Name", + " ZONE ONE, !- Zone Name", + " Surface, !- Outside Boundary Condition", + " Zn001:Flr001, !- Outside Boundary Condition Object", + " NoSun, !- Sun Exposure", + " NoWind, !- Wind Exposure", + " 1.000000, !- View Factor to Ground", + " 4, !- Number of Vertices", + " 15.24000,0.000000,0.0, !- X,Y,Z ==> Vertex 1 {m}", + " 0.000000,0.000000,0.0, !- X,Y,Z ==> Vertex 2 {m}", + " 0.000000,15.24000,0.0, !- X,Y,Z ==> Vertex 3 {m}", + " 15.24000,15.24000,0.0; !- X,Y,Z ==> Vertex 4 {m}", + + " BuildingSurface:Detailed,", + " Zn001:Roof001, !- Name", + " Roof, !- Surface Type", + " ROOF31, !- Construction Name", + " ZONE ONE, !- Zone Name", + " Outdoors, !- Outside Boundary Condition", + " , !- Outside Boundary Condition Object", + " SunExposed, !- Sun Exposure", + " WindExposed, !- Wind Exposure", + " 0, !- View Factor to Ground", + " 4, !- Number of Vertices", + " 0.000000,15.24000,4.572, !- X,Y,Z ==> Vertex 1 {m}", + " 0.000000,0.000000,4.572, !- X,Y,Z ==> Vertex 2 {m}", + " 15.24000,0.000000,4.572, !- X,Y,Z ==> Vertex 3 {m}", + " 15.24000,15.24000,4.572; !- X,Y,Z ==> Vertex 4 {m}", + + " FenestrationSurface:Detailed,", + " Zn001:Wall001:Win001, !- Name", + " Window, !- Surface Type", + " CLR AIRGAP CLR, !- Construction Name", + " Zn001:Wall001, !- Building Surface Name", + " , !- Outside Boundary Condition Object", + " 0.5000000, !- View Factor to Ground", + " , !- Frame and Divider Name", + " 1.0, !- Multiplier", + " 4, !- Number of Vertices", + " 0.548000,0,2.5000, !- X,Y,Z ==> Vertex 1 {m}", + " 0.548000,0,0.5000, !- X,Y,Z ==> Vertex 2 {m}", + " 5.548000,0,0.5000, !- X,Y,Z ==> Vertex 3 {m}", + " 5.548000,0,2.5000; !- X,Y,Z ==> Vertex 4 {m}", + + " Construction:WindowEquivalentLayer,", + " CLR AIRGAP CLR, !- Name", + " GLZCLR, !- Outside Layer", + " Air GAP 12mm, !- Layer 2", + " GLZCLR; !- Layer 3", + + " WindowMaterial:Glazing:EquivalentLayer,", + " GLZCLR, !- Name", + " SpectralAverage, !- Optical Data Type", + " , !- Window Glass Spectral Data Set Name", + " 0.77, !- Front Side Beam-Beam Solar Transmittance {dimensionless}", + " 0.77, !- Back Side Beam-Beam Solar Transmittance {dimensionless}", + " 0.07, !- Front Side Beam-Beam Solar Reflectance {dimensionless}", + " 0.07, !- Back Side Beam-Beam Solar Reflectance {dimensionless}", + " 0.0, !- Front Side Beam-Beam Visible Solar Transmittance {dimensionless}", + " 0.0, !- Back Side Beam-Beam Visible Solar Transmittance {dimensionless}", + " 0.0, !- Front Side Beam-Beam Visible Solar Reflectance {dimensionless}", + " 0.0, !- Back Side Beam-Beam Visible Solar Reflectance {dimensionless}", + " 0.0, !- Front Side Beam-Diffuse Solar Transmittance {dimensionless}", + " 0.0, !- Back Side Beam-Diffuse Solar Transmittance {dimensionless}", + " 0.0, !- Front Side Beam-Diffuse Solar Reflectance {dimensionless}", + " 0.0, !- Back Side Beam-Diffuse Solar Reflectance {dimensionless}", + " 0.0, !- Front Side Beam-Diffuse Visible Solar Transmittance {dimensionless}", + " 0.0, !- Back Side Beam-Diffuse Visible Solar Transmittance {dimensionless}", + " 0.0, !- Front Side Beam-Diffuse Visible Solar Reflectance {dimensionless}", + " 0.0, !- Back Side Beam-Diffuse Visible Solar Reflectance {dimensionless}", + " 0.695, !- Diffuse-Diffuse Solar Transmittance {dimensionless}", + " 0.16, !- Front Side Diffuse-Diffuse Solar Reflectance {dimensionless}", + " 0.16, !- Back Side Diffuse-Diffuse Solar Reflectance {dimensionless}", + " 0.0, !- Diffuse-Diffuse Visible Solar Transmittance {dimensionless}", + " 0.0, !- Front Side Diffuse-Diffuse Visible Solar Reflectance {dimensionless}", + " 0.0, !- Back Side Diffuse-Diffuse Visible Solar Reflectance {dimensionless}", + " 0.0, !- Infrared Transmittance (applies to front and back) {dimensionless}", + " 0.84, !- Front Side Infrared Emissivity {dimensionless}", + " 0.84; !- Back Side Infrared Emissivity {dimensionless}", + + " WindowMaterial:Gap:EquivalentLayer,", + " Air GAP 12mm, !- Name", + " Air, !- Gas Type", + " 0.0120, !- Thickness {m}", + " VentedIndoor; !- Gap Vent Type", + + }); + ASSERT_TRUE(process_idf(idf_objects)); + + SimulationManager::ManageSimulation(); + + int EQLNum(1); + Array1D T({1, CFSMAXNL}, 0.0); + Array1D Q({0, CFSMAXNL}, 0.0); + Array1D JB({0, CFSMAXNL}, 0.0); + Array1D QOCF({1, CFSMAXNL}, 0.0); + Array1D H({0, CFSMAXNL + 1}, 0.0); + Array1D JF({1, CFSMAXNL + 1}, 0.0); + Array1D Source({1, CFSMAXNL + 1}, 0.0); + + Real64 HcIn = 1.5; + Real64 HcOut = 6.0; + Real64 TOL = 0.001; + Real64 TIN = 301.5; + Real64 Tout = 310.0; + Real64 TRMIN = 301.5; + Real64 TRMOUT = 308.0; + Real64 QOCFRoom = 0.0; + H(0) = HcOut; + H(1) = 0.0; + H(2) = HcIn; + + // check the window air gap vent type: vented to outdoor + EXPECT_EQ(CFS(EQLNum).G(1).GTYPE, gtyOPENin); + // zero solar absorbed on glazing layers or no solar input + Source = 0.0; + ASHWAT_ThermalCalc(CFS(EQLNum), TIN, Tout, HcIn, HcOut, TRMOUT, TRMIN, Source, TOL, QOCF, QOCFRoom, T, Q, JF, JB, H); + EXPECT_NEAR(T(1), 307.054, 0.001); + EXPECT_NEAR(T(2), 304.197, 0.001); + + // with solar absrobed on glazing layers + Source(1) = 100.0; // outside glass layer + Source(2) = 50.0; // inside glass layer + ASHWAT_ThermalCalc(CFS(EQLNum), TIN, Tout, HcIn, HcOut, TRMOUT, TRMIN, Source, TOL, QOCF, QOCFRoom, T, Q, JF, JB, H); + EXPECT_NEAR(T(1), 314.666, 0.001); + EXPECT_NEAR(T(2), 311.282, 0.001); +} +TEST_F(EnergyPlusFixture, WindowEquivalentLayer_VBEffectiveEmissivityTest) +{ + // GitHub issue 7345 + std::string const idf_objects = delimited_string({ + + " Version,9.2;", + + " Timestep,1;", + + " Building,", + " Simple One Zone w Windows, !- Name", + " 0, !- North Axis {deg}", + " Suburbs, !- Terrain", + " 0.04, !- Loads Convergence Tolerance Value", + " 0.004, !- Temperature Convergence Tolerance Value {deltaC}", + " MinimalShadowing, !- Solar Distribution", + " 30, !- Maximum Number of Warmup Days", + " 6; !- Minimum Number of Warmup Days", + + " HeatBalanceAlgorithm,ConductionTransferFunction;", + + " SurfaceConvectionAlgorithm:Inside,TARP;", + + " SurfaceConvectionAlgorithm:Outside,DOE-2;", + + " SimulationControl,", + " No, !- Do Zone Sizing Calculation", + " No, !- Do System Sizing Calculation", + " No, !- Do Plant Sizing Calculation", + " Yes, !- Run Simulation for Sizing Periods", + " No; !- Run Simulation for Weather File Run Periods", + + " SizingPeriod:DesignDay,", + " Denver Stapleton Intl Arpt Ann Clg 1% Condns DB=>MWB, !- Name", + " 7, !- Month", + " 21, !- Day of Month", + " SummerDesignDay, !- Day Type", + " 32.6, !- Maximum Dry-Bulb Temperature {C}", + " 15.2, !- Daily Dry-Bulb Temperature Range {deltaC}", + " , !- Dry-Bulb Temperature Range Modifier Type", + " , !- Dry-Bulb Temperature Range Modifier Day Schedule Name", + " Wetbulb, !- Humidity Condition Type", + " 15.6, !- Wetbulb or DewPoint at Maximum Dry-Bulb {C}", + " , !- Humidity Condition Day Schedule Name", + " , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir}", + " , !- Enthalpy at Maximum Dry-Bulb {J/kg}", + " , !- Daily Wet-Bulb Temperature Range {deltaC}", + " 83411., !- Barometric Pressure {Pa}", + " 4, !- Wind Speed {m/s}", + " 120, !- Wind Direction {deg}", + " No, !- Rain Indicator", + " No, !- Snow Indicator", + " No, !- Daylight Saving Time Indicator", + " ASHRAEClearSky, !- Solar Model Indicator", + " , !- Beam Solar Day Schedule Name", + " , !- Diffuse Solar Day Schedule Name", + " , !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) {dimensionless}", + " , !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) {dimensionless}", + " 1.00; !- Sky Clearness", + + " Site:Location,", + " Denver Stapleton Intl Arpt CO USA WMO=724690, !- Name", + " 39.77, !- Latitude {deg}", + " -104.87, !- Longitude {deg}", + " -7.00, !- Time Zone {hr}", + " 1611.00; !- Elevation {m}", + + " Material:NoMass,", + " R13LAYER, !- Name", + " Rough, !- Roughness", + " 2.290965, !- Thermal Resistance {m2-K/W}", + " 0.9000000, !- Thermal Absorptance", + " 0.7500000, !- Solar Absorptance", + " 0.7500000; !- Visible Absorptance", + + " Material:NoMass,", + " R31LAYER, !- Name", + " Rough, !- Roughness", + " 5.456, !- Thermal Resistance {m2-K/W}", + " 0.9000000, !- Thermal Absorptance", + " 0.7500000, !- Solar Absorptance", + " 0.7500000; !- Visible Absorptance", + + " Material,", + " C5 - 4 IN HW CONCRETE, !- Name", + " MediumRough, !- Roughness", + " 0.1014984, !- Thickness {m}", + " 1.729577, !- Conductivity {W/m-K}", + " 2242.585, !- Density {kg/m3}", + " 836.8000, !- Specific Heat {J/kg-K}", + " 0.9000000, !- Thermal Absorptance", + " 0.6500000, !- Solar Absorptance", + " 0.6500000; !- Visible Absorptance", + + " Construction,", + " R13WALL, !- Name", + " R13LAYER; !- Outside Layer", + + " Construction,", + " FLOOR, !- Name", + " C5 - 4 IN HW CONCRETE; !- Outside Layer", + + " Construction,", + " ROOF31, !- Name", + " R31LAYER; !- Outside Layer", + + " Site:GroundTemperature:BuildingSurface,18.89,18.92,19.02,19.12,19.21,19.23,19.07,19.32,19.09,19.21,19.13,18.96;", + + " Zone,", + " ZONE ONE, !- Name", + " 0, !- Direction of Relative North {deg}", + " 0, !- X Origin {m}", + " 0, !- Y Origin {m}", + " 0, !- Z Origin {m}", + " 1, !- Type", + " 1, !- Multiplier", + " autocalculate, !- Ceiling Height {m}", + " autocalculate; !- Volume {m3}", + + " ScheduleTypeLimits,", + " Fraction, !- Name", + " 0.0, !- Lower Limit Value", + " 1.0, !- Upper Limit Value", + " CONTINUOUS; !- Numeric Type", + + " GlobalGeometryRules,", + " UpperLeftCorner, !- Starting Vertex Position", + " CounterClockWise, !- Vertex Entry Direction", + " World; !- Coordinate System", + + " BuildingSurface:Detailed,", + " Zn001:Wall001, !- Name", + " Wall, !- Surface Type", + " R13WALL, !- Construction Name", + " ZONE ONE, !- Zone Name", + " Outdoors, !- Outside Boundary Condition", + " , !- Outside Boundary Condition Object", + " SunExposed, !- Sun Exposure", + " WindExposed, !- Wind Exposure", + " 0.5000000, !- View Factor to Ground", + " 4, !- Number of Vertices", + " 0,0,4.572000, !- X,Y,Z ==> Vertex 1 {m}", + " 0,0,0, !- X,Y,Z ==> Vertex 2 {m}", + " 15.24000,0,0, !- X,Y,Z ==> Vertex 3 {m}", + " 15.24000,0,4.572000; !- X,Y,Z ==> Vertex 4 {m}", + + " BuildingSurface:Detailed,", + " Zn001:Wall002, !- Name", + " Wall, !- Surface Type", + " R13WALL, !- Construction Name", + " ZONE ONE, !- Zone Name", + " Outdoors, !- Outside Boundary Condition", + " , !- Outside Boundary Condition Object", + " SunExposed, !- Sun Exposure", + " WindExposed, !- Wind Exposure", + " 0.5000000, !- View Factor to Ground", + " 4, !- Number of Vertices", + " 15.24000,0,4.572000, !- X,Y,Z ==> Vertex 1 {m}", + " 15.24000,0,0, !- X,Y,Z ==> Vertex 2 {m}", + " 15.24000,15.24000,0, !- X,Y,Z ==> Vertex 3 {m}", + " 15.24000,15.24000,4.572000; !- X,Y,Z ==> Vertex 4 {m}", + + " BuildingSurface:Detailed,", + " Zn001:Wall003, !- Name", + " Wall, !- Surface Type", + " R13WALL, !- Construction Name", + " ZONE ONE, !- Zone Name", + " Outdoors, !- Outside Boundary Condition", + " , !- Outside Boundary Condition Object", + " SunExposed, !- Sun Exposure", + " WindExposed, !- Wind Exposure", + " 0.5000000, !- View Factor to Ground", + " 4, !- Number of Vertices", + " 15.24000,15.24000,4.572000, !- X,Y,Z ==> Vertex 1 {m}", + " 15.24000,15.24000,0, !- X,Y,Z ==> Vertex 2 {m}", + " 0,15.24000,0, !- X,Y,Z ==> Vertex 3 {m}", + " 0,15.24000,4.572000; !- X,Y,Z ==> Vertex 4 {m}", + + " BuildingSurface:Detailed,", + " Zn001:Wall004, !- Name", + " Wall, !- Surface Type", + " R13WALL, !- Construction Name", + " ZONE ONE, !- Zone Name", + " Outdoors, !- Outside Boundary Condition", + " , !- Outside Boundary Condition Object", + " SunExposed, !- Sun Exposure", + " WindExposed, !- Wind Exposure", + " 0.5000000, !- View Factor to Ground", + " 4, !- Number of Vertices", + " 0,15.24000,4.572000, !- X,Y,Z ==> Vertex 1 {m}", + " 0,15.24000,0, !- X,Y,Z ==> Vertex 2 {m}", + " 0,0,0, !- X,Y,Z ==> Vertex 3 {m}", + " 0,0,4.572000; !- X,Y,Z ==> Vertex 4 {m}", + + " BuildingSurface:Detailed,", + " Zn001:Flr001, !- Name", + " Floor, !- Surface Type", + " FLOOR, !- Construction Name", + " ZONE ONE, !- Zone Name", + " Surface, !- Outside Boundary Condition", + " Zn001:Flr001, !- Outside Boundary Condition Object", + " NoSun, !- Sun Exposure", + " NoWind, !- Wind Exposure", + " 1.000000, !- View Factor to Ground", + " 4, !- Number of Vertices", + " 15.24000,0.000000,0.0, !- X,Y,Z ==> Vertex 1 {m}", + " 0.000000,0.000000,0.0, !- X,Y,Z ==> Vertex 2 {m}", + " 0.000000,15.24000,0.0, !- X,Y,Z ==> Vertex 3 {m}", + " 15.24000,15.24000,0.0; !- X,Y,Z ==> Vertex 4 {m}", + + " BuildingSurface:Detailed,", + " Zn001:Roof001, !- Name", + " Roof, !- Surface Type", + " ROOF31, !- Construction Name", + " ZONE ONE, !- Zone Name", + " Outdoors, !- Outside Boundary Condition", + " , !- Outside Boundary Condition Object", + " SunExposed, !- Sun Exposure", + " WindExposed, !- Wind Exposure", + " 0, !- View Factor to Ground", + " 4, !- Number of Vertices", + " 0.000000,15.24000,4.572, !- X,Y,Z ==> Vertex 1 {m}", + " 0.000000,0.000000,4.572, !- X,Y,Z ==> Vertex 2 {m}", + " 15.24000,0.000000,4.572, !- X,Y,Z ==> Vertex 3 {m}", + " 15.24000,15.24000,4.572; !- X,Y,Z ==> Vertex 4 {m}", + + " FenestrationSurface:Detailed,", + " Zn001:Wall001:Win001, !- Name", + " Window, !- Surface Type", + " CON_WIN_EQL, !- Construction Name", + " Zn001:Wall001, !- Building Surface Name", + " , !- Outside Boundary Condition Object", + " 0.5000000, !- View Factor to Ground", + " , !- Frame and Divider Name", + " 1.0, !- Multiplier", + " 4, !- Number of Vertices", + " 0.548000,0,2.5000, !- X,Y,Z ==> Vertex 1 {m}", + " 0.548000,0,0.5000, !- X,Y,Z ==> Vertex 2 {m}", + " 5.548000,0,0.5000, !- X,Y,Z ==> Vertex 3 {m}", + " 5.548000,0,2.5000; !- X,Y,Z ==> Vertex 4 {m}", + + " Construction:WindowEquivalentLayer,", + " CON_WIN_EQL, !- Name", + " WMTEUQL_Glss_SC, !- Outside Layer", + " WMTEUQL_Gap_ARGON_16MM, !- Layer 2", + " WMTEUQL_Glss_Clr, !- Layer 3", + " WMTEUQL_Gap_AIR_65MM_VENTINDR, !- Layer 4", + " WMTEUQL_BLND_KINDV_RF80_T02_A18_Rb45; !- Layer 5", + + " WindowMaterial:Glazing:EquivalentLayer,", + " WMTEUQL_Glss_SC, !- Name", + " SpectralAverage, !- Optical Data Type", + " , !- Window Glass Spectral Data Set Name", + " 0.300379, !- Front Side Beam-Beam Solar Transmittance {dimensionless}", + " 0.300379, !- Back Side Beam-Beam Solar Transmittance {dimensionless}", + " 4.448762e-001, !- Front Side Beam-Beam Solar Reflectance {dimensionless}", + " 5.449085e-001, !- Back Side Beam-Beam Solar Reflectance {dimensionless}", + " 0, !- Front Side Beam-Beam Visible Solar Transmittance {dimensionless}", + " 0, !- Back Side Beam-Beam Visible Solar Transmittance {dimensionless}", + " 0, !- Front Side Beam-Beam Visible Solar Reflectance {dimensionless}", + " 0, !- Back Side Beam-Beam Visible Solar Reflectance {dimensionless}", + " 0.0, !- Front Side Beam-Diffuse Solar Transmittance {dimensionless}", + " 0.0, !- Back Side Beam-Diffuse Solar Transmittance {dimensionless}", + " 0.0, !- Front Side Beam-Diffuse Solar Reflectance {dimensionless}", + " 0.0, !- Back Side Beam-Diffuse Solar Reflectance {dimensionless}", + " 0.0, !- Front Side Beam-Diffuse Visible Solar Transmittance {dimensionless}", + " 0.0, !- Back Side Beam-Diffuse Visible Solar Transmittance {dimensionless}", + " 0.0, !- Front Side Beam-Diffuse Visible Solar Reflectance {dimensionless}", + " 0.0, !- Back Side Beam-Diffuse Visible Solar Reflectance {dimensionless}", + " 0.263, !- Diffuse-Diffuse Solar Transmittance {dimensionless}", + " 0.470, !- Front Side Diffuse-Diffuse Solar Reflectance {dimensionless}", + " 0.564, !- Back Side Diffuse-Diffuse Solar Reflectance {dimensionless}", + " 0.0, !- Diffuse-Diffuse Visible Solar Transmittance {dimensionless}", + " 0.0, !- Front Side Diffuse-Diffuse Visible Solar Reflectance {dimensionless}", + " 0.0, !- Back Side Diffuse-Diffuse Visible Solar Reflectance {dimensionless}", + " 0.0, !- Infrared Transmittance (applies to front and back) {dimensionless}", + " 0.840000, !- Front Side Infrared Emissivity {dimensionless}", + " 0.018410; !- Back Side Infrared Emissivity {dimensionless}", + + " WindowMaterial:Gap:EquivalentLayer,", + " WMTEUQL_Gap_ARGON_16MM, !- Name", + " Argon, !- Gas Type", + " 0.0160, !- Thickness {m}", + " Sealed; !- Gap Vent Type", + + " WindowMaterial:Glazing:EquivalentLayer,", + " WMTEUQL_Glss_Clr, !- Name", + " SpectralAverage, !- Optical Data Type", + " , !- Window Glass Spectral Data Set Name", + " 0.770675, !- Front Side Beam-Beam Solar Transmittance {dimensionless}", + " 0.770675, !- Back Side Beam-Beam Solar Transmittance {dimensionless}", + " 6.997562e-002, !- Front Side Beam-Beam Solar Reflectance {dimensionless}", + " 7.023712e-002, !- Back Side Beam-Beam Solar Reflectance {dimensionless}", + " 0, !- Front Side Beam-Beam Visible Solar Transmittance {dimensionless}", + " 0, !- Back Side Beam-Beam Visible Solar Transmittance {dimensionless}", + " 0, !- Front Side Beam-Beam Visible Solar Reflectance {dimensionless}", + " 0, !- Back Side Beam-Beam Visible Solar Reflectance {dimensionless}", + " 0.0, !- Front Side Beam-Diffuse Solar Transmittance {dimensionless}", + " 0.0, !- Back Side Beam-Diffuse Solar Transmittance {dimensionless}", + " 0.0, !- Front Side Beam-Diffuse Solar Reflectance {dimensionless}", + " 0.0, !- Back Side Beam-Diffuse Solar Reflectance {dimensionless}", + " 0.0, !- Front Side Beam-Diffuse Visible Solar Transmittance {dimensionless}", + " 0.0, !- Back Side Beam-Diffuse Visible Solar Transmittance {dimensionless}", + " 0.0, !- Front Side Beam-Diffuse Visible Solar Reflectance {dimensionless}", + " 0.0, !- Back Side Beam-Diffuse Visible Solar Reflectance {dimensionless}", + " 0.689, !- Diffuse-Diffuse Solar Transmittance {dimensionless}", + " 0.128, !- Front Side Diffuse-Diffuse Solar Reflectance {dimensionless}", + " 0.128, !- Back Side Diffuse-Diffuse Solar Reflectance {dimensionless}", + " 0.0, !- Diffuse-Diffuse Visible Solar Transmittance {dimensionless}", + " 0.0, !- Front Side Diffuse-Diffuse Visible Solar Reflectance {dimensionless}", + " 0.0, !- Back Side Diffuse-Diffuse Visible Solar Reflectance {dimensionless}", + " 0.0, !- Infrared Transmittance (applies to front and back) {dimensionless}", + " 0.840000, !- Front Side Infrared Emissivity {dimensionless}", + " 0.840000; !- Back Side Infrared Emissivity {dimensionless}", + + " WindowMaterial:Gap:EquivalentLayer,", + " WMTEUQL_Gap_AIR_65MM_VENTINDR, !- Name", + " Air, !- Gas Type", + " 0.065, !- Thickness {m}", + " VentedIndoor; !- Gap Vent Type", + + " WindowMaterial:Blind:EquivalentLayer,", + " WMTEUQL_BLND_KINDV_RF80_T02_A18_Rb45, !- Name", + " Vertical, !- Slat Orientation", + " 0.02, !- Slat Width {m}", + " 0.02, !- Slat Separation {m}", + " 0.0000, !- Slat Crown {m}", + " 45, !- Slat Angle {deg}", + " 0.02, !- Front Side Slat Beam-Diffuse Solar Transmittance", + " 0.02, !- Back Side Slat Beam-Diffuse Solar Transmittance {dimensionless}", + " 0.80, !- Front Side Slat Beam-Diffuse Solar Reflectance {dimensionless}", + " 0.45, !- Back Side Slat Beam-Diffuse Solar Reflectance {dimensionless}", + " , !- Front Side Slat Beam-Diffuse Visible Transmittance {dimensionless}", + " , !- Back Side Slat Beam-Diffuse Visible Transmittance {dimensionless}", + " , !- Front Side Slat Beam-Diffuse Visible Reflectance {dimensionless}", + " , !- Back Side Slat Beam-Diffuse Visible Reflectance {dimensionless}", + " 0.02, !- Slat Diffuse-Diffuse Solar Transmittance {dimensionless}", + " 0.80, !- Front Side Slat Diffuse-Diffuse Solar Reflectance {dimensionless}", + " 0.45, !- Back Side Slat Diffuse-Diffuse Solar Reflectance {dimensionless}", + " , !- Slat Diffuse-Diffuse Visible Transmittance", + " , !- Front Side Slat Diffuse-Diffuse Visible Reflectance {dimensionless}", + " , !- Back Side Slat Diffuse-Diffuse Visible Reflectance {dimensionless}", + " , !- Slat Infrared Transmittance", + " 0.9, !- Front Side Slat Infrared Emissivity {dimensionless}", + " 0.9, !- Back Side Slat Infrared Emissivity {dimensionless}", + " FixedSlatAngle; !- Slat Angle Control", + + }); + ASSERT_TRUE(process_idf(idf_objects)); + + SimulationManager::ManageSimulation(); + + int EQLNum(0); + int SurfNum(0); + int VBMatNum(0); + int ConstrNum(0); + + for (int iSurf = 1; iSurf <= DataSurfaces::TotSurfaces; iSurf++) { + if (DataSurfaces::SurfaceWindow(iSurf).WindowModelType == DataSurfaces::WindowEQLModel) { + SurfNum = iSurf; + break; + } + } + // get venetian blind material index + for (int i = 1; i <= DataHeatBalance::TotMaterials; i++) { + if (DataHeatBalance::Material(i).Group == DataHeatBalance::BlindEquivalentLayer) { + VBMatNum = i; + break; + } + } + // get equivalent layer window contruction index + for (int ConstrPtr = 1; ConstrPtr <= DataHeatBalance::TotConstructs; ++ConstrPtr) { + if (DataHeatBalance::Construct(ConstrPtr).WindowTypeEQL) { + ConstrNum = ConstrPtr; + } + } + // check VB slat angle control for FixedSlatAngle + EXPECT_EQ(DataHeatBalance::Material(VBMatNum).SlatAngleType, WindowEquivalentLayer::lscNONE); + + EQLNum = DataHeatBalance::Construct(ConstrNum).EQLConsPtr; + // check number of solid layers + EXPECT_EQ(CFS(EQLNum).NL, 3); + // check optical and thermal property of the VB layer (Inside Layer) + EXPECT_EQ(CFS(EQLNum).L(3).Name, "WMTEUQL_BLND_KINDV_RF80_T02_A18_RB45"); + EXPECT_EQ(CFS(EQLNum).L(3).LWP_MAT.TAUL, 0.0); + EXPECT_EQ(CFS(EQLNum).L(3).LWP_MAT.EPSLF, 0.90); + EXPECT_EQ(CFS(EQLNum).L(3).LWP_MAT.EPSLB, 0.90); + // check inside face effective emissivity + EXPECT_NEAR(DataHeatBalance::Construct(ConstrNum).InsideAbsorpThermal, 0.91024, 0.00001); + // for fixed slate angle the emissivity remains the same + EXPECT_NEAR(EQLWindowInsideEffectiveEmiss(ConstrNum), 0.91024, 0.00001); +}