Line data Source code
1 : // EnergyPlus, Copyright (c) 1996-2024, 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/Plant/Enums.hh>
52 : #include <EnergyPlus/Plant/LoopSide.hh>
53 :
54 : namespace EnergyPlus {
55 :
56 : // Forward declarations
57 : struct EnergyPlusData;
58 :
59 : namespace DataPlant {
60 :
61 : // "Both" is used as a special flag and is never assigned to the loop's TypeOfLoop member
62 : enum class LoopType
63 : {
64 : Invalid = -1,
65 : Plant,
66 : Condenser,
67 : Both,
68 : Num
69 : };
70 :
71 : constexpr std::array<std::string_view, (int)LoopType::Num> loopTypeNames = {"PlantLoop", "CondenserLoop", "Both"};
72 :
73 : // This needs to go, it's not helping
74 :
75 : struct HalfLoopContainer : std::array<HalfLoopData, static_cast<int>(DataPlant::LoopSideLocation::Num)>
76 : {
77 2708144524 : HalfLoopData &operator()(LoopSideLocation ls)
78 : {
79 2708144524 : return this->at(static_cast<int>(ls));
80 : }
81 : };
82 :
83 : constexpr std::array<DataPlant::LoopSideLocation, static_cast<int>(DataPlant::LoopSideLocation::Num)> LoopSideKeys = {
84 : DataPlant::LoopSideLocation::Demand, DataPlant::LoopSideLocation::Supply};
85 :
86 : struct PlantLoopData
87 : {
88 : // Members
89 : std::string Name; // Name of the component list
90 : std::string FluidName; // Name of the fluid specified for this loop
91 : DataLoopNode::NodeFluidType FluidType; // Type of fluid in the loop
92 : int FluidIndex; // Index for Fluid in FluidProperties
93 : int MFErrIndex; // for recurring mass flow errors
94 : int MFErrIndex1; // for recurring mass flow errors
95 : int MFErrIndex2; // for recurring mass flow errors
96 : // (see CheckPlantMixerSplitterConsistency)
97 : // Loop Operating Setpoints and Limits
98 : int TempSetPointNodeNum; // Node Number for Loop Temp SP associated with SP manager
99 : int MaxBranch; // Max branches in the loop
100 : Real64 MinTemp; // Minimum temperature allowed in the loop
101 : Real64 MaxTemp; // Maximum temperature allowed in the loop
102 : int MinTempErrIndex; // for recurring too cold errors
103 : int MaxTempErrIndex; // for recurring too hot errors
104 : Real64 MinVolFlowRate; // Minimum flow rate allowed in the loop
105 : Real64 MaxVolFlowRate; // Maximum flow rate allowed in the loop
106 : bool MaxVolFlowRateWasAutoSized; // true if previous was set to autosized in the input
107 : Real64 MinMassFlowRate; // Minimum flow rate allowed in the loop
108 : Real64 MaxMassFlowRate; // Maximum flow rate allowed in the loop
109 : Real64 Volume; // Volume of the fluid in the loop
110 : bool VolumeWasAutoSized; // true if Volume was set to autocalculate
111 : Real64 CirculationTime; // Loop circulation time [minutes] used to autocalculate loop volume, default is 2 minutes
112 : Real64 Mass; // Mass of the fluid in the loop
113 : bool EMSCtrl;
114 : Real64 EMSValue;
115 : // Loop Inlet and Outlet Nodes
116 : HalfLoopContainer LoopSide; // Half loop data (Demand side or Supply Side)
117 : std::string OperationScheme; // Operation scheme name for the loop
118 : int NumOpSchemes; // Number of items in list identified by "OpScheme"
119 : Array1D<OperationData> OpScheme; // Operation scheme data
120 : DataPlant::LoadingScheme LoadDistribution; // Load distribution scheme 1 for optimal, 2 for overloading
121 : int PlantSizNum; // index to corresponding plant sizing data array
122 : DataPlant::LoopDemandCalcScheme LoopDemandCalcScheme; // Load distribution scheme 1 SingleSetPoint,
123 : // 2 DualSetPointWithDeadBand
124 : DataPlant::CommonPipeType CommonPipeType;
125 : int EconPlantSideSensedNodeNum;
126 : int EconCondSideSensedNodeNum;
127 : int EconPlacement;
128 : int EconBranch;
129 : int EconComp;
130 : Real64 EconControlTempDiff;
131 : bool LoopHasConnectionComp;
132 : LoopType TypeOfLoop;
133 : DataPlant::PressSimType PressureSimType;
134 : bool HasPressureComponents;
135 : Real64 PressureDrop;
136 : bool UsePressureForPumpCalcs;
137 : Real64 PressureEffectiveK;
138 : // report variables
139 : Real64 CoolingDemand; // Plant Loop Cooling Demand, W
140 : Real64 HeatingDemand; // Plant Loop Heating Demand[W]
141 : Real64 DemandNotDispatched; // Plant Loop Demand that was not distributed [W]
142 : Real64 UnmetDemand; // Plant Loop Unmet Demand [W]
143 : Real64 BypassFrac;
144 : Real64 InletNodeFlowrate;
145 : Real64 InletNodeTemperature;
146 : Real64 OutletNodeFlowrate;
147 : Real64 OutletNodeTemperature;
148 : int LastLoopSideSimulated;
149 :
150 : // Default Constructor
151 796 : PlantLoopData()
152 1592 : : FluidType(DataLoopNode::NodeFluidType::Blank), FluidIndex(1), // default to water
153 796 : MFErrIndex(0), MFErrIndex1(0), MFErrIndex2(0), TempSetPointNodeNum(0), MaxBranch(0), MinTemp(0.0), MaxTemp(0.0), MinTempErrIndex(0),
154 796 : MaxTempErrIndex(0), MinVolFlowRate(0.0), MaxVolFlowRate(0.0), MaxVolFlowRateWasAutoSized(false), MinMassFlowRate(0.0),
155 796 : MaxMassFlowRate(0.0), Volume(0.0), VolumeWasAutoSized(false), CirculationTime(2.0), Mass(0.0), EMSCtrl(false), EMSValue(0.0),
156 1592 : NumOpSchemes(0), LoadDistribution(DataPlant::LoadingScheme::Invalid), PlantSizNum(0),
157 796 : LoopDemandCalcScheme(DataPlant::LoopDemandCalcScheme::Invalid), CommonPipeType(DataPlant::CommonPipeType::No),
158 796 : EconPlantSideSensedNodeNum(0), EconCondSideSensedNodeNum(0), EconPlacement(0), EconBranch(0), EconComp(0), EconControlTempDiff(0.0),
159 796 : LoopHasConnectionComp(false), TypeOfLoop(LoopType::Invalid), PressureSimType(DataPlant::PressSimType::NoPressure),
160 796 : HasPressureComponents(false), PressureDrop(0.0), UsePressureForPumpCalcs(false), PressureEffectiveK(0.0), CoolingDemand(0.0),
161 796 : HeatingDemand(0.0), DemandNotDispatched(0.0), UnmetDemand(0.0), BypassFrac(0.0), InletNodeFlowrate(0.0), InletNodeTemperature(0.0),
162 796 : OutletNodeFlowrate(0.0), OutletNodeTemperature(0.0), LastLoopSideSimulated(0)
163 : {
164 796 : }
165 :
166 : void UpdateLoopSideReportVars(EnergyPlusData &state, Real64 OtherSideDemand, Real64 LocalRemLoopDemand);
167 :
168 : void CheckLoopExitNode(EnergyPlusData &state, bool FirstHVACIteration);
169 :
170 : void CalcUnmetPlantDemand(EnergyPlusData &state);
171 : };
172 : } // namespace DataPlant
173 : } // namespace EnergyPlus
174 :
175 : #endif
|