Line data Source code
1 : // EnergyPlus, Copyright (c) 1996-2025, The Board of Trustees of the University of Illinois,
2 : // The Regents of the University of California, through Lawrence Berkeley National Laboratory
3 : // (subject to receipt of any required approvals from the U.S. Dept. of Energy), Oak Ridge
4 : // National Laboratory, managed by UT-Battelle, Alliance for Sustainable Energy, LLC, and other
5 : // contributors. All rights reserved.
6 : //
7 : // NOTICE: This Software was developed under funding from the U.S. Department of Energy and the
8 : // U.S. Government consequently retains certain rights. As such, the U.S. Government has been
9 : // granted for itself and others acting on its behalf a paid-up, nonexclusive, irrevocable,
10 : // worldwide license in the Software to reproduce, distribute copies to the public, prepare
11 : // derivative works, and perform publicly and display publicly, and to permit others to do so.
12 : //
13 : // Redistribution and use in source and binary forms, with or without modification, are permitted
14 : // provided that the following conditions are met:
15 : //
16 : // (1) Redistributions of source code must retain the above copyright notice, this list of
17 : // conditions and the following disclaimer.
18 : //
19 : // (2) Redistributions in binary form must reproduce the above copyright notice, this list of
20 : // conditions and the following disclaimer in the documentation and/or other materials
21 : // provided with the distribution.
22 : //
23 : // (3) Neither the name of the University of California, Lawrence Berkeley National Laboratory,
24 : // the University of Illinois, U.S. Dept. of Energy nor the names of its contributors may be
25 : // used to endorse or promote products derived from this software without specific prior
26 : // written permission.
27 : //
28 : // (4) Use of EnergyPlus(TM) Name. If Licensee (i) distributes the software in stand-alone form
29 : // without changes from the version obtained under this License, or (ii) Licensee makes a
30 : // reference solely to the software portion of its product, Licensee must refer to the
31 : // software as "EnergyPlus version X" software, where "X" is the version number Licensee
32 : // obtained under this License and may not use a different name for the software. Except as
33 : // specifically required in this Section (4), Licensee shall not use in a company name, a
34 : // product name, in advertising, publicity, or other promotional activities any name, trade
35 : // name, trademark, logo, or other designation of "EnergyPlus", "E+", "e+" or confusingly
36 : // similar designation, without the U.S. Department of Energy's prior written consent.
37 : //
38 : // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
39 : // IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
40 : // AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
41 : // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
42 : // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
43 : // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
44 : // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
45 : // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
46 : // POSSIBILITY OF SUCH DAMAGE.
47 :
48 : #ifndef PlantTopologyLoop_hh_INCLUDED
49 : #define PlantTopologyLoop_hh_INCLUDED
50 :
51 : #include <EnergyPlus/FluidProperties.hh>
52 : #include <EnergyPlus/Plant/Enums.hh>
53 : #include <EnergyPlus/Plant/LoopSide.hh>
54 :
55 : namespace EnergyPlus {
56 :
57 : // Forward declarations
58 : struct EnergyPlusData;
59 :
60 : namespace DataPlant {
61 :
62 : // "Both" is used as a special flag and is never assigned to the loop's TypeOfLoop member
63 : enum class LoopType
64 : {
65 : Invalid = -1,
66 : Plant,
67 : Condenser,
68 : Both,
69 : Num
70 : };
71 :
72 : constexpr std::array<std::string_view, (int)LoopType::Num> loopTypeNames = {"PlantLoop", "CondenserLoop", "Both"};
73 :
74 : // This needs to go, it's not helping
75 :
76 : struct HalfLoopContainer : std::array<HalfLoopData, static_cast<int>(DataPlant::LoopSideLocation::Num)>
77 : {
78 9651716 : HalfLoopData &operator()(LoopSideLocation ls)
79 : {
80 9651716 : return this->at(static_cast<int>(ls));
81 : }
82 : };
83 :
84 : constexpr std::array<DataPlant::LoopSideLocation, static_cast<int>(DataPlant::LoopSideLocation::Num)> LoopSideKeys = {
85 : DataPlant::LoopSideLocation::Demand, DataPlant::LoopSideLocation::Supply};
86 :
87 : struct PlantLoopData
88 : {
89 : // Members
90 : std::string Name; // Name of the component list
91 : std::string FluidName; // Name of the fluid specified for this loop
92 : DataLoopNode::NodeFluidType FluidType; // Type of fluid in the loop
93 : int FluidIndex = 0;
94 :
95 : Fluid::GlycolProps *glycol = nullptr;
96 : Fluid::RefrigProps *steam = nullptr;
97 :
98 : int MFErrIndex; // for recurring mass flow errors
99 : int MFErrIndex1; // for recurring mass flow errors
100 : int MFErrIndex2; // for recurring mass flow errors
101 : // (see CheckPlantMixerSplitterConsistency)
102 : // Loop Operating Setpoints and Limits
103 : int TempSetPointNodeNum; // Node Number for Loop Temp SP associated with SP manager
104 : int MaxBranch; // Max branches in the loop
105 : Real64 MinTemp; // Minimum temperature allowed in the loop
106 : Real64 MaxTemp; // Maximum temperature allowed in the loop
107 : int MinTempErrIndex; // for recurring too cold errors
108 : int MaxTempErrIndex; // for recurring too hot errors
109 : Real64 MinVolFlowRate; // Minimum flow rate allowed in the loop
110 : Real64 MaxVolFlowRate; // Maximum flow rate allowed in the loop
111 : bool MaxVolFlowRateWasAutoSized; // true if previous was set to autosized in the input
112 : Real64 MinMassFlowRate; // Minimum flow rate allowed in the loop
113 : Real64 MaxMassFlowRate; // Maximum flow rate allowed in the loop
114 : Real64 Volume; // Volume of the fluid in the loop
115 : bool VolumeWasAutoSized; // true if Volume was set to autocalculate
116 : Real64 CirculationTime; // Loop circulation time [minutes] used to autocalculate loop volume, default is 2 minutes
117 : Real64 Mass; // Mass of the fluid in the loop
118 : bool EMSCtrl;
119 : Real64 EMSValue;
120 : // Loop Inlet and Outlet Nodes
121 : HalfLoopContainer LoopSide; // Half loop data (Demand side or Supply Side)
122 : std::string OperationScheme; // Operation scheme name for the loop
123 : int NumOpSchemes; // Number of items in list identified by "OpScheme"
124 : Array1D<OperationData> OpScheme; // Operation scheme data
125 : DataPlant::LoadingScheme LoadDistribution; // Load distribution scheme 1 for optimal, 2 for overloading
126 : int PlantSizNum; // index to corresponding plant sizing data array
127 : DataPlant::LoopDemandCalcScheme LoopDemandCalcScheme; // Load distribution scheme 1 SingleSetPoint,
128 : // 2 DualSetPointWithDeadBand
129 : DataPlant::CommonPipeType CommonPipeType;
130 : int EconPlantSideSensedNodeNum;
131 : int EconCondSideSensedNodeNum;
132 : int EconPlacement;
133 : int EconBranch;
134 : int EconComp;
135 : Real64 EconControlTempDiff;
136 : bool LoopHasConnectionComp;
137 : LoopType TypeOfLoop;
138 : DataPlant::PressSimType PressureSimType;
139 : bool HasPressureComponents;
140 : Real64 PressureDrop;
141 : bool UsePressureForPumpCalcs;
142 : Real64 PressureEffectiveK;
143 : // report variables
144 : Real64 CoolingDemand; // Plant Loop Cooling Demand, W
145 : Real64 HeatingDemand; // Plant Loop Heating Demand[W]
146 : Real64 DemandNotDispatched; // Plant Loop Demand that was not distributed [W]
147 : Real64 UnmetDemand; // Plant Loop Unmet Demand [W]
148 : Real64 BypassFrac;
149 : Real64 InletNodeFlowrate;
150 : Real64 InletNodeTemperature;
151 : Real64 OutletNodeFlowrate;
152 : Real64 OutletNodeTemperature;
153 : int LastLoopSideSimulated;
154 :
155 : // Default Constructor
156 453 : PlantLoopData()
157 906 : : FluidType(DataLoopNode::NodeFluidType::Blank), MFErrIndex(0), MFErrIndex1(0), MFErrIndex2(0), TempSetPointNodeNum(0), MaxBranch(0),
158 453 : MinTemp(0.0), MaxTemp(0.0), MinTempErrIndex(0), MaxTempErrIndex(0), MinVolFlowRate(0.0), MaxVolFlowRate(0.0),
159 453 : MaxVolFlowRateWasAutoSized(false), MinMassFlowRate(0.0), MaxMassFlowRate(0.0), Volume(0.0), VolumeWasAutoSized(false),
160 1359 : CirculationTime(2.0), Mass(0.0), EMSCtrl(false), EMSValue(0.0), NumOpSchemes(0), LoadDistribution(DataPlant::LoadingScheme::Invalid),
161 453 : PlantSizNum(0), LoopDemandCalcScheme(DataPlant::LoopDemandCalcScheme::Invalid), CommonPipeType(DataPlant::CommonPipeType::No),
162 453 : EconPlantSideSensedNodeNum(0), EconCondSideSensedNodeNum(0), EconPlacement(0), EconBranch(0), EconComp(0), EconControlTempDiff(0.0),
163 453 : LoopHasConnectionComp(false), TypeOfLoop(LoopType::Invalid), PressureSimType(DataPlant::PressSimType::NoPressure),
164 453 : HasPressureComponents(false), PressureDrop(0.0), UsePressureForPumpCalcs(false), PressureEffectiveK(0.0), CoolingDemand(0.0),
165 453 : HeatingDemand(0.0), DemandNotDispatched(0.0), UnmetDemand(0.0), BypassFrac(0.0), InletNodeFlowrate(0.0), InletNodeTemperature(0.0),
166 453 : OutletNodeFlowrate(0.0), OutletNodeTemperature(0.0), LastLoopSideSimulated(0)
167 : {
168 453 : }
169 :
170 : void UpdateLoopSideReportVars(EnergyPlusData &state, Real64 OtherSideDemand, Real64 LocalRemLoopDemand);
171 :
172 : void CheckLoopExitNode(EnergyPlusData &state, bool FirstHVACIteration);
173 :
174 : void CalcUnmetPlantDemand(EnergyPlusData &state);
175 : };
176 : } // namespace DataPlant
177 : } // namespace EnergyPlus
178 :
179 : #endif
|