Line data Source code
1 : // EnergyPlus, Copyright (c) 1996-2023, 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 : // ObjexxFCL Headers
49 : #include <ObjexxFCL/Array1D.hh>
50 : #include <ObjexxFCL/Fmath.hh>
51 :
52 : // EnergyPlus Headers
53 : #include <EnergyPlus/AirTerminalUnit.hh>
54 : #include <EnergyPlus/BranchNodeConnections.hh>
55 : #include <EnergyPlus/Data/EnergyPlusData.hh>
56 : #include <EnergyPlus/DataAirLoop.hh>
57 : #include <EnergyPlus/DataDefineEquip.hh>
58 : #include <EnergyPlus/DataHeatBalance.hh>
59 : #include <EnergyPlus/DataLoopNode.hh>
60 : #include <EnergyPlus/DataSizing.hh>
61 : #include <EnergyPlus/DataZoneEquipment.hh>
62 : #include <EnergyPlus/DualDuct.hh>
63 : #include <EnergyPlus/GeneralRoutines.hh>
64 : #include <EnergyPlus/HVACCooledBeam.hh>
65 : #include <EnergyPlus/HVACFourPipeBeam.hh>
66 : #include <EnergyPlus/HVACSingleDuctInduc.hh>
67 : #include <EnergyPlus/InputProcessing/InputProcessor.hh>
68 : #include <EnergyPlus/NodeInputManager.hh>
69 : #include <EnergyPlus/OutputProcessor.hh>
70 : #include <EnergyPlus/PoweredInductionUnits.hh>
71 : #include <EnergyPlus/Psychrometrics.hh>
72 : #include <EnergyPlus/SingleDuct.hh>
73 : #include <EnergyPlus/UserDefinedComponents.hh>
74 : #include <EnergyPlus/UtilityRoutines.hh>
75 : #include <EnergyPlus/ZoneAirLoopEquipmentManager.hh>
76 :
77 : namespace EnergyPlus {
78 :
79 : namespace ZoneAirLoopEquipmentManager {
80 : // Module containing the routines dealing with the ZoneAirLoopEquipmentManager
81 :
82 : // MODULE INFORMATION:
83 : // AUTHOR Russ Taylor
84 : // DATE WRITTEN May 1997
85 :
86 : using namespace DataDefineEquip;
87 :
88 33630410 : void ManageZoneAirLoopEquipment(EnergyPlusData &state,
89 : std::string const &ZoneAirLoopEquipName,
90 : bool const FirstHVACIteration,
91 : Real64 &SysOutputProvided,
92 : Real64 &NonAirSysOutput,
93 : Real64 &LatOutputProvided, // Latent add/removal supplied by air dist unit (kg/s), dehumid = negative
94 : int const ControlledZoneNum,
95 : int &CompIndex)
96 : {
97 : // SUBROUTINE INFORMATION:
98 : // AUTHOR Russ Taylor
99 : // DATE WRITTEN May 1997
100 : // MODIFIED Don Shirey, Aug 2009 (LatOutputProvided)
101 :
102 : // PURPOSE OF THIS SUBROUTINE:
103 : // Calls the zone thermal control simulations and the interfaces
104 : // (water-air, refrigerant-air, steam-air, electric-electric,
105 : // water-water, etc)
106 :
107 : int AirDistUnitNum;
108 :
109 : // Beginning of Code
110 :
111 : // make sure the input data is read in only once
112 33630410 : if (state.dataZoneAirLoopEquipmentManager->GetAirDistUnitsFlag) {
113 519 : GetZoneAirLoopEquipment(state);
114 519 : state.dataZoneAirLoopEquipmentManager->GetAirDistUnitsFlag = false;
115 : }
116 :
117 : // Find the correct Zone Air Distribution Unit Equipment
118 33630410 : if (CompIndex == 0) {
119 3460 : AirDistUnitNum = UtilityRoutines::FindItemInList(ZoneAirLoopEquipName, state.dataDefineEquipment->AirDistUnit);
120 3460 : if (AirDistUnitNum == 0) {
121 0 : ShowFatalError(state, "ManageZoneAirLoopEquipment: Unit not found=" + ZoneAirLoopEquipName);
122 : }
123 3460 : CompIndex = AirDistUnitNum;
124 : } else {
125 33626950 : AirDistUnitNum = CompIndex;
126 33626950 : if (AirDistUnitNum > (int)state.dataDefineEquipment->AirDistUnit.size() || AirDistUnitNum < 1) {
127 0 : ShowFatalError(state,
128 0 : format("ManageZoneAirLoopEquipment: Invalid CompIndex passed={}, Number of Units={}, Entered Unit name={}",
129 : AirDistUnitNum,
130 0 : (int)state.dataDefineEquipment->AirDistUnit.size(),
131 0 : ZoneAirLoopEquipName));
132 : }
133 33626950 : if (ZoneAirLoopEquipName != state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).Name) {
134 0 : ShowFatalError(state,
135 0 : format("ManageZoneAirLoopEquipment: Invalid CompIndex passed={}, Unit name={}, stored Unit Name for that index={}",
136 : AirDistUnitNum,
137 : ZoneAirLoopEquipName,
138 0 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).Name));
139 : }
140 : }
141 33630410 : state.dataSize->CurTermUnitSizingNum = state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).TermUnitSizingNum;
142 33630410 : InitZoneAirLoopEquipment(state, AirDistUnitNum, ControlledZoneNum);
143 33630410 : InitZoneAirLoopEquipmentTimeStep(state, AirDistUnitNum);
144 :
145 33630410 : SimZoneAirLoopEquipment(state, AirDistUnitNum, SysOutputProvided, NonAirSysOutput, LatOutputProvided, FirstHVACIteration, ControlledZoneNum);
146 :
147 : // Call one-time init to fill termunit sizing and other data for the ADU - can't do this until the actual terminal unit nodes have been
148 : // matched to zone euqip config nodes
149 33630410 : InitZoneAirLoopEquipment(state, AirDistUnitNum, ControlledZoneNum);
150 33630410 : }
151 :
152 560 : void GetZoneAirLoopEquipment(EnergyPlusData &state)
153 : {
154 :
155 : // SUBROUTINE INFORMATION:
156 : // AUTHOR Russ Taylor
157 : // DATE WRITTEN June 1997
158 : // MODIFIED na
159 : // RE-ENGINEERED na
160 :
161 : // PURPOSE OF THIS SUBROUTINE:
162 : // Get all the system related equipment which may be attached to
163 : // a zone
164 :
165 : // METHODOLOGY EMPLOYED:
166 : // Needs description, as appropriate.
167 :
168 : // REFERENCES:
169 : // na
170 :
171 : // Using/Aliasing
172 : using NodeInputManager::GetOnlySingleNode;
173 : using namespace DataLoopNode;
174 : using BranchNodeConnections::SetUpCompSets;
175 : using DualDuct::GetDualDuctOutdoorAirRecircUse;
176 :
177 : // SUBROUTINE PARAMETER DEFINITIONS:
178 : static constexpr std::string_view RoutineName("GetZoneAirLoopEquipment: "); // include trailing blank space
179 560 : static std::string const CurrentModuleObject("ZoneHVAC:AirDistributionUnit"); // Object type for getting and error messages
180 :
181 : // SUBROUTINE LOCAL VARIABLE DECLARATIONS:
182 : int AirDistUnitNum;
183 : int AirDistCompUnitNum;
184 : int NumAlphas;
185 : int NumNums;
186 : int IOStat;
187 560 : bool ErrorsFound(false); // If errors detected in input
188 : bool IsNotOK; // Flag to verify name
189 1120 : Array1D_string AlphArray(5);
190 1120 : Array1D<Real64> NumArray(2);
191 1120 : Array1D_string cAlphaFields(5); // Alpha field names
192 1120 : Array1D_string cNumericFields(2); // Numeric field names
193 1120 : Array1D_bool lAlphaBlanks(5); // Logical array, alpha field input BLANK = .TRUE.
194 1120 : Array1D_bool lNumericBlanks(2); // Logical array, numeric field input BLANK = .TRUE.
195 : bool DualDuctRecircIsUsed; // local temporary for deciding if recirc side used by dual duct terminal
196 :
197 560 : int NumAirDistUnits = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, CurrentModuleObject);
198 :
199 560 : state.dataDefineEquipment->AirDistUnit.allocate(NumAirDistUnits);
200 :
201 560 : if (NumAirDistUnits > 0) {
202 :
203 3984 : for (AirDistUnitNum = 1; AirDistUnitNum <= NumAirDistUnits; ++AirDistUnitNum) {
204 3460 : state.dataInputProcessing->inputProcessor->getObjectItem(state,
205 : CurrentModuleObject,
206 : AirDistUnitNum,
207 : AlphArray,
208 : NumAlphas,
209 : NumArray,
210 : NumNums,
211 : IOStat,
212 : lNumericBlanks,
213 : lAlphaBlanks,
214 : cAlphaFields,
215 : cNumericFields); // data for one zone
216 3460 : UtilityRoutines::IsNameEmpty(state, AlphArray(1), CurrentModuleObject, ErrorsFound);
217 :
218 3460 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).Name = AlphArray(1);
219 : // Input Outlet Node Num
220 3460 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).OutletNodeNum =
221 6920 : GetOnlySingleNode(state,
222 3460 : AlphArray(2),
223 : ErrorsFound,
224 : DataLoopNode::ConnectionObjectType::ZoneHVACAirDistributionUnit,
225 3460 : AlphArray(1),
226 : DataLoopNode::NodeFluidType::Air,
227 : DataLoopNode::ConnectionType::Outlet,
228 : NodeInputManager::CompFluidStream::Primary,
229 3460 : ObjectIsParent);
230 3460 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).InletNodeNum = 0;
231 3460 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).NumComponents = 1;
232 3460 : AirDistCompUnitNum = 1;
233 : // Load the air Distribution Unit Equip and Name
234 3460 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipType(AirDistCompUnitNum) = AlphArray(3);
235 3460 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipName(AirDistCompUnitNum) = AlphArray(4);
236 3460 : ValidateComponent(state, AlphArray(3), AlphArray(4), IsNotOK, CurrentModuleObject);
237 3460 : if (IsNotOK) {
238 0 : ShowContinueError(state, "In " + CurrentModuleObject + " = " + AlphArray(1));
239 0 : ErrorsFound = true;
240 : }
241 3460 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).UpStreamLeakFrac = NumArray(1);
242 3460 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).DownStreamLeakFrac = NumArray(2);
243 3460 : if (state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).DownStreamLeakFrac <= 0.0) {
244 3410 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).LeakLoadMult = 1.0;
245 100 : } else if (state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).DownStreamLeakFrac < 1.0 &&
246 50 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).DownStreamLeakFrac > 0.0) {
247 50 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).LeakLoadMult =
248 50 : 1.0 / (1.0 - state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).DownStreamLeakFrac);
249 : } else {
250 0 : ShowSevereError(state,
251 0 : "Error found in " + CurrentModuleObject + " = " + state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).Name);
252 0 : ShowContinueError(state, cNumericFields(2) + " must be less than 1.0");
253 0 : ErrorsFound = true;
254 : }
255 3460 : if (state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).UpStreamLeakFrac > 0.0) {
256 50 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).UpStreamLeak = true;
257 : } else {
258 3410 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).UpStreamLeak = false;
259 : }
260 3460 : if (state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).DownStreamLeakFrac > 0.0) {
261 50 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).DownStreamLeak = true;
262 : } else {
263 3410 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).DownStreamLeak = false;
264 : }
265 :
266 : // DesignSpecification:AirTerminal:Sizing name
267 3460 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).AirTerminalSizingSpecIndex = 0;
268 3460 : if (!lAlphaBlanks(5)) {
269 40 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).AirTerminalSizingSpecIndex =
270 40 : UtilityRoutines::FindItemInList(AlphArray(5), state.dataSize->AirTerminalSizingSpec);
271 40 : if (state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).AirTerminalSizingSpecIndex == 0) {
272 0 : ShowSevereError(state, cAlphaFields(5) + " = " + AlphArray(5) + " not found.");
273 0 : ShowContinueError(state,
274 0 : "Occurs in " + CurrentModuleObject + " = " + state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).Name);
275 0 : ErrorsFound = true;
276 : }
277 : }
278 : // Validate EquipType for Air Distribution Unit
279 3460 : if (UtilityRoutines::SameString(state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipType(AirDistCompUnitNum),
280 3460 : "AirTerminal:DualDuct:ConstantVolume")) {
281 20 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipTypeEnum(AirDistCompUnitNum) =
282 : DataDefineEquip::ZnAirLoopEquipType::DualDuctConstVolume;
283 40 : if (state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).UpStreamLeak ||
284 20 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).DownStreamLeak) {
285 0 : ShowSevereError(
286 0 : state, "Error found in " + CurrentModuleObject + " = " + state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).Name);
287 0 : ShowContinueError(state,
288 0 : "Simple duct leakage model not available for " + cAlphaFields(3) + " = " +
289 0 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipType(AirDistCompUnitNum));
290 0 : ErrorsFound = true;
291 : }
292 3440 : } else if (UtilityRoutines::SameString(state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipType(AirDistCompUnitNum),
293 3440 : "AirTerminal:DualDuct:VAV")) {
294 3 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipTypeEnum(AirDistCompUnitNum) =
295 : DataDefineEquip::ZnAirLoopEquipType::DualDuctVAV;
296 6 : if (state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).UpStreamLeak ||
297 3 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).DownStreamLeak) {
298 0 : ShowSevereError(
299 0 : state, "Error found in " + CurrentModuleObject + " = " + state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).Name);
300 0 : ShowContinueError(state,
301 0 : "Simple duct leakage model not available for " + cAlphaFields(3) + " = " +
302 0 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipType(AirDistCompUnitNum));
303 0 : ErrorsFound = true;
304 : }
305 3437 : } else if (UtilityRoutines::SameString(state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipType(AirDistCompUnitNum),
306 3437 : "AirTerminal:DualDuct:VAV:OutdoorAir")) {
307 11 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipTypeEnum(AirDistCompUnitNum) =
308 : DataDefineEquip::ZnAirLoopEquipType::DualDuctVAVOutdoorAir;
309 22 : if (state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).UpStreamLeak ||
310 11 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).DownStreamLeak) {
311 0 : ShowSevereError(
312 0 : state, "Error found in " + CurrentModuleObject + " = " + state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).Name);
313 0 : ShowContinueError(state,
314 0 : "Simple duct leakage model not available for " + cAlphaFields(3) + " = " +
315 0 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipType(AirDistCompUnitNum));
316 0 : ErrorsFound = true;
317 : }
318 3426 : } else if (UtilityRoutines::SameString(state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipType(AirDistCompUnitNum),
319 3426 : "AirTerminal:SingleDuct:ConstantVolume:Reheat")) {
320 265 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipTypeEnum(AirDistCompUnitNum) =
321 : DataDefineEquip::ZnAirLoopEquipType::SingleDuctConstVolReheat;
322 3161 : } else if (UtilityRoutines::SameString(state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipType(AirDistCompUnitNum),
323 3161 : "AirTerminal:SingleDuct:ConstantVolume:NoReheat")) {
324 838 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipTypeEnum(AirDistCompUnitNum) =
325 : DataDefineEquip::ZnAirLoopEquipType::SingleDuctConstVolNoReheat;
326 2323 : } else if (UtilityRoutines::SameString(state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipType(AirDistCompUnitNum),
327 2323 : "AirTerminal:SingleDuct:VAV:Reheat")) {
328 2100 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipTypeEnum(AirDistCompUnitNum) =
329 : DataDefineEquip::ZnAirLoopEquipType::SingleDuctVAVReheat;
330 223 : } else if (UtilityRoutines::SameString(state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipType(AirDistCompUnitNum),
331 223 : "AirTerminal:SingleDuct:VAV:NoReheat")) {
332 85 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipTypeEnum(AirDistCompUnitNum) =
333 : DataDefineEquip::ZnAirLoopEquipType::SingleDuctVAVNoReheat;
334 138 : } else if (UtilityRoutines::SameString(state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipType(AirDistCompUnitNum),
335 138 : "AirTerminal:SingleDuct:VAV:HeatAndCool:Reheat")) {
336 9 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipTypeEnum(AirDistCompUnitNum) =
337 : DataDefineEquip::ZnAirLoopEquipType::SingleDuctCBVAVReheat;
338 129 : } else if (UtilityRoutines::SameString(state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipType(AirDistCompUnitNum),
339 129 : "AirTerminal:SingleDuct:VAV:HeatAndCool:NoReheat")) {
340 4 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipTypeEnum(AirDistCompUnitNum) =
341 : DataDefineEquip::ZnAirLoopEquipType::SingleDuctCBVAVNoReheat;
342 125 : } else if (UtilityRoutines::SameString(state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipType(AirDistCompUnitNum),
343 125 : "AirTerminal:SingleDuct:SeriesPIU:Reheat")) {
344 30 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipTypeEnum(AirDistCompUnitNum) =
345 : DataDefineEquip::ZnAirLoopEquipType::SingleDuct_SeriesPIU_Reheat;
346 60 : if (state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).UpStreamLeak ||
347 30 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).DownStreamLeak) {
348 0 : ShowSevereError(
349 0 : state, "Error found in " + CurrentModuleObject + " = " + state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).Name);
350 0 : ShowContinueError(state,
351 0 : "Simple duct leakage model not available for " + cAlphaFields(3) + " = " +
352 0 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipType(AirDistCompUnitNum));
353 0 : ErrorsFound = true;
354 : }
355 95 : } else if (UtilityRoutines::SameString(state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipType(AirDistCompUnitNum),
356 95 : "AirTerminal:SingleDuct:ParallelPIU:Reheat")) {
357 4 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipTypeEnum(AirDistCompUnitNum) =
358 : DataDefineEquip::ZnAirLoopEquipType::SingleDuct_ParallelPIU_Reheat;
359 8 : if (state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).UpStreamLeak ||
360 4 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).DownStreamLeak) {
361 0 : ShowSevereError(
362 0 : state, "Error found in " + CurrentModuleObject + " = " + state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).Name);
363 0 : ShowContinueError(state,
364 0 : "Simple duct leakage model not available for " + cAlphaFields(3) + " = " +
365 0 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipType(AirDistCompUnitNum));
366 0 : ErrorsFound = true;
367 : }
368 91 : } else if (UtilityRoutines::SameString(state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipType(AirDistCompUnitNum),
369 91 : "AirTerminal:SingleDuct:ConstantVolume:FourPipeInduction")) {
370 4 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipTypeEnum(AirDistCompUnitNum) =
371 : DataDefineEquip::ZnAirLoopEquipType::SingleDuct_ConstVol_4PipeInduc;
372 8 : if (state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).UpStreamLeak ||
373 4 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).DownStreamLeak) {
374 0 : ShowSevereError(
375 0 : state, "Error found in " + CurrentModuleObject + " = " + state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).Name);
376 0 : ShowContinueError(state,
377 0 : "Simple duct leakage model not available for " + cAlphaFields(3) + " = " +
378 0 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipType(AirDistCompUnitNum));
379 0 : ErrorsFound = true;
380 : }
381 87 : } else if (UtilityRoutines::SameString(state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipType(AirDistCompUnitNum),
382 87 : "AirTerminal:SingleDuct:VAV:Reheat:VariableSpeedFan")) {
383 8 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipTypeEnum(AirDistCompUnitNum) =
384 : DataDefineEquip::ZnAirLoopEquipType::SingleDuctVAVReheatVSFan;
385 16 : if (state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).UpStreamLeak ||
386 8 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).DownStreamLeak) {
387 0 : ShowSevereError(
388 0 : state, "Error found in " + CurrentModuleObject + " = " + state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).Name);
389 0 : ShowContinueError(state,
390 0 : "Simple duct leakage model not available for " + cAlphaFields(3) + " = " +
391 0 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipType(AirDistCompUnitNum));
392 0 : ErrorsFound = true;
393 : }
394 79 : } else if (UtilityRoutines::SameString(state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipType(AirDistCompUnitNum),
395 79 : "AirTerminal:SingleDuct:ConstantVolume:CooledBeam")) {
396 5 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipTypeEnum(AirDistCompUnitNum) =
397 : DataDefineEquip::ZnAirLoopEquipType::SingleDuctConstVolCooledBeam;
398 10 : if (state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).UpStreamLeak ||
399 5 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).DownStreamLeak) {
400 0 : ShowSevereError(
401 0 : state, "Error found in " + CurrentModuleObject + " = " + state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).Name);
402 0 : ShowContinueError(state,
403 0 : "Simple duct leakage model not available for " + cAlphaFields(3) + " = " +
404 0 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipType(AirDistCompUnitNum));
405 0 : ErrorsFound = true;
406 : }
407 74 : } else if (UtilityRoutines::SameString(state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipType(AirDistCompUnitNum),
408 74 : "AirTerminal:SingleDuct:ConstantVolume:FourPipeBeam")) {
409 15 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipTypeEnum(AirDistCompUnitNum) =
410 : DataDefineEquip::ZnAirLoopEquipType::SingleDuctConstVolFourPipeBeam;
411 30 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).airTerminalPtr = FourPipeBeam::HVACFourPipeBeam::fourPipeBeamFactory(
412 30 : state, state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipName(1));
413 30 : if (state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).UpStreamLeak ||
414 15 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).DownStreamLeak) {
415 0 : ShowSevereError(
416 0 : state, "Error found in " + CurrentModuleObject + " = " + state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).Name);
417 0 : ShowContinueError(state,
418 0 : "Simple duct leakage model not available for " + cAlphaFields(3) + " = " +
419 0 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipType(AirDistCompUnitNum));
420 0 : ErrorsFound = true;
421 : }
422 59 : } else if (UtilityRoutines::SameString(state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipType(AirDistCompUnitNum),
423 59 : "AirTerminal:SingleDuct:UserDefined")) {
424 10 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipTypeEnum(AirDistCompUnitNum) =
425 : DataDefineEquip::ZnAirLoopEquipType::SingleDuctUserDefined;
426 49 : } else if (UtilityRoutines::SameString(state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipType(AirDistCompUnitNum),
427 49 : "AirTerminal:SingleDuct:Mixer")) {
428 49 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipTypeEnum(AirDistCompUnitNum) =
429 : DataDefineEquip::ZnAirLoopEquipType::SingleDuctATMixer;
430 98 : if (state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).UpStreamLeak ||
431 49 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).DownStreamLeak) {
432 0 : ShowSevereError(
433 0 : state, "Error found in " + CurrentModuleObject + " = " + state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).Name);
434 0 : ShowContinueError(state,
435 0 : "Simple duct leakage model not available for " + cAlphaFields(3) + " = " +
436 0 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipType(AirDistCompUnitNum));
437 0 : ErrorsFound = true;
438 : }
439 : } else {
440 0 : ShowSevereError(state,
441 0 : "Error found in " + CurrentModuleObject + " = " + state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).Name);
442 0 : ShowContinueError(state,
443 0 : "Invalid " + cAlphaFields(3) + " = " +
444 0 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipType(AirDistCompUnitNum));
445 0 : ErrorsFound = true;
446 : }
447 :
448 : // Set up component set for air terminal unit
449 6920 : if ((state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipTypeEnum(AirDistCompUnitNum) ==
450 6900 : DataDefineEquip::ZnAirLoopEquipType::DualDuctConstVolume) ||
451 3440 : (state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipTypeEnum(AirDistCompUnitNum) ==
452 : DataDefineEquip::ZnAirLoopEquipType::DualDuctVAV)) {
453 : // For dual duct units, set up two component sets, one for heat and one for cool
454 115 : SetUpCompSets(state,
455 : CurrentModuleObject,
456 23 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).Name,
457 46 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipType(AirDistCompUnitNum) + ":HEAT",
458 23 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipName(AirDistCompUnitNum),
459 : "UNDEFINED",
460 46 : AlphArray(2));
461 115 : SetUpCompSets(state,
462 : CurrentModuleObject,
463 23 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).Name,
464 46 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipType(AirDistCompUnitNum) + ":COOL",
465 23 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipName(AirDistCompUnitNum),
466 : "UNDEFINED",
467 46 : AlphArray(2));
468 : // For dual duct units with decoupled OA and RA, set up two component sets, one for OA (Outdoor Air)
469 : // and one for RA (Recirculated Air)
470 3437 : } else if (state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipTypeEnum(AirDistCompUnitNum) ==
471 : DataDefineEquip::ZnAirLoopEquipType::DualDuctVAVOutdoorAir) {
472 55 : SetUpCompSets(state,
473 : CurrentModuleObject,
474 11 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).Name,
475 22 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipType(AirDistCompUnitNum) + ":OutdoorAir",
476 11 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipName(AirDistCompUnitNum),
477 : "UNDEFINED",
478 22 : AlphArray(2));
479 22 : GetDualDuctOutdoorAirRecircUse(state,
480 11 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipType(AirDistCompUnitNum),
481 11 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipName(AirDistCompUnitNum),
482 : DualDuctRecircIsUsed);
483 11 : if (DualDuctRecircIsUsed) {
484 30 : SetUpCompSets(state,
485 : CurrentModuleObject,
486 6 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).Name,
487 12 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipType(AirDistCompUnitNum) + ":RecirculatedAir",
488 6 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipName(AirDistCompUnitNum),
489 : "UNDEFINED",
490 12 : AlphArray(2));
491 : }
492 : } else {
493 13704 : SetUpCompSets(state,
494 : CurrentModuleObject,
495 3426 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).Name,
496 3426 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipType(AirDistCompUnitNum),
497 3426 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipName(AirDistCompUnitNum),
498 : "UNDEFINED",
499 6852 : AlphArray(2));
500 : }
501 :
502 : } // End of Air Dist Do Loop
503 3984 : for (AirDistUnitNum = 1; AirDistUnitNum <= (int)state.dataDefineEquipment->AirDistUnit.size(); ++AirDistUnitNum) {
504 13840 : SetupOutputVariable(state,
505 : "Zone Air Terminal Sensible Heating Energy",
506 : OutputProcessor::Unit::J,
507 3460 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).HeatGain,
508 : OutputProcessor::SOVTimeStepType::System,
509 : OutputProcessor::SOVStoreType::Summed,
510 6920 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).Name);
511 13840 : SetupOutputVariable(state,
512 : "Zone Air Terminal Sensible Cooling Energy",
513 : OutputProcessor::Unit::J,
514 3460 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).CoolGain,
515 : OutputProcessor::SOVTimeStepType::System,
516 : OutputProcessor::SOVStoreType::Summed,
517 6920 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).Name);
518 13840 : SetupOutputVariable(state,
519 : "Zone Air Terminal Sensible Heating Rate",
520 : OutputProcessor::Unit::W,
521 3460 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).HeatRate,
522 : OutputProcessor::SOVTimeStepType::System,
523 : OutputProcessor::SOVStoreType::Average,
524 6920 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).Name);
525 13840 : SetupOutputVariable(state,
526 : "Zone Air Terminal Sensible Cooling Rate",
527 : OutputProcessor::Unit::W,
528 3460 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).CoolRate,
529 : OutputProcessor::SOVTimeStepType::System,
530 : OutputProcessor::SOVStoreType::Average,
531 6920 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).Name);
532 : }
533 : }
534 560 : if (ErrorsFound) {
535 0 : ShowFatalError(state, std::string{RoutineName} + "Errors found in getting " + CurrentModuleObject + " Input");
536 : }
537 560 : }
538 :
539 67260820 : void InitZoneAirLoopEquipment(EnergyPlusData &state, int const AirDistUnitNum, int const ControlledZoneNum)
540 : {
541 : // SUBROUTINE INFORMATION:
542 : // AUTHOR Russ Taylor
543 : // DATE WRITTEN Nov 1997
544 :
545 : // PURPOSE OF THIS SUBROUTINE:
546 : // This subroutine is left for Module format consistency -- not needed in this module.
547 :
548 : // Do the Begin Simulation initializations
549 67260820 : if (!state.dataZoneAirLoopEquipmentManager->InitAirDistUnitsFlag) {
550 67015049 : return;
551 : }
552 489088 : if (state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EachOnceFlag &&
553 243317 : (state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).TermUnitSizingNum > 0)) {
554 :
555 : {
556 3450 : auto &thisADU(state.dataDefineEquipment->AirDistUnit(AirDistUnitNum));
557 : {
558 3450 : auto &thisZoneEqConfig(state.dataZoneEquip->ZoneEquipConfig(ControlledZoneNum));
559 3450 : thisADU.ZoneNum = ControlledZoneNum;
560 7135 : for (int inletNum = 1; inletNum <= thisZoneEqConfig.NumInletNodes; ++inletNum) {
561 3685 : if (thisZoneEqConfig.InletNode(inletNum) == thisADU.OutletNodeNum)
562 3423 : thisZoneEqConfig.InletNodeADUNum(inletNum) = AirDistUnitNum;
563 : }
564 : }
565 :
566 : // Fill TermUnitSizing with specs from DesignSpecification:AirTerminal:Sizing
567 : {
568 3450 : auto &thisTermUnitSizingData(state.dataSize->TermUnitSizing(thisADU.TermUnitSizingNum));
569 3450 : thisTermUnitSizingData.ADUName = thisADU.Name;
570 3450 : if (thisADU.AirTerminalSizingSpecIndex > 0) {
571 : {
572 40 : auto const &thisAirTermSizingSpec(state.dataSize->AirTerminalSizingSpec(thisADU.AirTerminalSizingSpecIndex));
573 40 : thisTermUnitSizingData.SpecDesCoolSATRatio = thisAirTermSizingSpec.DesCoolSATRatio;
574 40 : thisTermUnitSizingData.SpecDesHeatSATRatio = thisAirTermSizingSpec.DesHeatSATRatio;
575 40 : thisTermUnitSizingData.SpecDesSensCoolingFrac = thisAirTermSizingSpec.DesSensCoolingFrac;
576 40 : thisTermUnitSizingData.SpecDesSensHeatingFrac = thisAirTermSizingSpec.DesSensHeatingFrac;
577 40 : thisTermUnitSizingData.SpecMinOAFrac = thisAirTermSizingSpec.MinOAFrac;
578 : }
579 : }
580 : }
581 : }
582 :
583 6900 : if (state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).ZoneNum != 0 &&
584 3450 : state.dataHeatBal->Zone(state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).ZoneNum).HasAdjustedReturnTempByITE) {
585 8 : for (int AirDistCompNum = 1; AirDistCompNum <= state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).NumComponents;
586 : ++AirDistCompNum) {
587 8 : if (state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipTypeEnum(AirDistCompNum) !=
588 8 : DataDefineEquip::ZnAirLoopEquipType::SingleDuctVAVReheat &&
589 4 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipTypeEnum(AirDistCompNum) !=
590 : DataDefineEquip::ZnAirLoopEquipType::SingleDuctVAVNoReheat) {
591 0 : ShowSevereError(state,
592 : "The FlowControlWithApproachTemperatures only works with ITE zones with single duct VAV terminal unit.");
593 0 : ShowContinueError(state, "The return air temperature of the ITE will not be overwritten.");
594 0 : ShowFatalError(state, "Preceding condition causes termination.");
595 : }
596 : }
597 : }
598 3450 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EachOnceFlag = false;
599 3450 : ++state.dataZoneAirLoopEquipmentManager->numADUInitialized;
600 3450 : if (state.dataZoneAirLoopEquipmentManager->numADUInitialized == (int)state.dataDefineEquipment->AirDistUnit.size()) {
601 : // If all ADUs are initialized, set InitAirDistUnitsFlag to false
602 522 : state.dataZoneAirLoopEquipmentManager->InitAirDistUnitsFlag = false;
603 : }
604 : }
605 : }
606 :
607 33630410 : void InitZoneAirLoopEquipmentTimeStep(EnergyPlusData &state, int const AirDistUnitNum)
608 : {
609 : // every time step
610 33630410 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).MassFlowRateDnStrLk = 0.0;
611 33630410 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).MassFlowRateUpStrLk = 0.0;
612 33630410 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).MassFlowRateTU = 0.0;
613 33630410 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).MassFlowRateZSup = 0.0;
614 33630410 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).MassFlowRateSup = 0.0;
615 33630410 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).HeatRate = 0.0;
616 33630410 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).CoolRate = 0.0;
617 33630410 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).HeatGain = 0.0;
618 33630410 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).CoolGain = 0.0;
619 33630410 : }
620 :
621 33630410 : void SimZoneAirLoopEquipment(EnergyPlusData &state,
622 : int const AirDistUnitNum,
623 : Real64 &SysOutputProvided,
624 : Real64 &NonAirSysOutput,
625 : Real64 &LatOutputProvided, // Latent add/removal provided by this unit (kg/s), dehumidify = negative
626 : bool const FirstHVACIteration,
627 : int const ControlledZoneNum)
628 : {
629 : // SUBROUTINE INFORMATION:
630 : // AUTHOR Russ Taylor
631 : // DATE WRITTEN May 1997
632 : // MODIFIED Don Shirey, Aug 2009 (LatOutputProvided)
633 :
634 : // PURPOSE OF THIS SUBROUTINE:
635 : // Simulates primary system air supplied to a zone and calculates
636 : // airflow requirements
637 :
638 : using DualDuct::SimulateDualDuct;
639 : using HVACCooledBeam::SimCoolBeam;
640 : using HVACSingleDuctInduc::SimIndUnit;
641 : using PoweredInductionUnits::SimPIU;
642 : using Psychrometrics::PsyCpAirFnW;
643 : using SingleDuct::GetATMixers;
644 : using SingleDuct::SimulateSingleDuct;
645 : using UserDefinedComponents::SimAirTerminalUserDefined;
646 :
647 : bool ProvideSysOutput;
648 : int AirDistCompNum;
649 : int InNodeNum; // air distribution unit inlet node
650 : int OutNodeNum; // air distribution unit outlet node
651 33630410 : int AirLoopNum(0); // index of air loop
652 : Real64 MassFlowRateMaxAvail; // max avail mass flow rate excluding leaks [kg/s]
653 : Real64 MassFlowRateMinAvail; // min avail mass flow rate excluding leaks [kg/s]
654 : Real64 MassFlowRateUpStreamLeakMax; // max upstream leak flow rate [kg/s]
655 33630410 : Real64 DesFlowRatio(0.0); // ratio of system to sum of zones design flow rate
656 33630410 : Real64 SpecHumOut(0.0); // Specific humidity ratio of outlet air (kg moisture / kg moist air)
657 33630410 : Real64 SpecHumIn(0.0); // Specific humidity ratio of inlet air (kg moisture / kg moist air)
658 :
659 33630410 : ProvideSysOutput = true;
660 67260820 : for (AirDistCompNum = 1; AirDistCompNum <= state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).NumComponents; ++AirDistCompNum) {
661 33630410 : NonAirSysOutput = 0.0;
662 33630410 : InNodeNum = state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).InletNodeNum;
663 33630410 : OutNodeNum = state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).OutletNodeNum;
664 33630410 : MassFlowRateMaxAvail = 0.0;
665 33630410 : MassFlowRateMinAvail = 0.0;
666 : // check for no plenum
667 : // set the max and min avail flow rates taking into acount the upstream leak
668 33630410 : if (state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).UpStreamLeak) {
669 257380 : if (InNodeNum > 0) {
670 257370 : MassFlowRateMaxAvail = state.dataLoopNodes->Node(InNodeNum).MassFlowRateMaxAvail;
671 257370 : MassFlowRateMinAvail = state.dataLoopNodes->Node(InNodeNum).MassFlowRateMinAvail;
672 257370 : AirLoopNum = state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).AirLoopNum;
673 257370 : if (AirLoopNum > 0) {
674 257280 : DesFlowRatio = state.dataAirLoop->AirLoopFlow(AirLoopNum).SysToZoneDesFlowRatio;
675 : } else {
676 90 : DesFlowRatio = 1.0;
677 : }
678 514740 : MassFlowRateUpStreamLeakMax = max(state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).UpStreamLeakFrac *
679 257370 : state.dataLoopNodes->Node(InNodeNum).MassFlowRateMax * DesFlowRatio,
680 : 0.0);
681 257370 : if (MassFlowRateMaxAvail > MassFlowRateUpStreamLeakMax) {
682 256930 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).MassFlowRateUpStrLk = MassFlowRateUpStreamLeakMax;
683 256930 : state.dataLoopNodes->Node(InNodeNum).MassFlowRateMaxAvail = MassFlowRateMaxAvail - MassFlowRateUpStreamLeakMax;
684 : } else {
685 440 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).MassFlowRateUpStrLk = MassFlowRateMaxAvail;
686 440 : state.dataLoopNodes->Node(InNodeNum).MassFlowRateMaxAvail = 0.0;
687 : }
688 257370 : state.dataLoopNodes->Node(InNodeNum).MassFlowRateMinAvail =
689 257370 : max(0.0, MassFlowRateMinAvail - state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).MassFlowRateUpStrLk);
690 : }
691 : }
692 :
693 33630410 : switch (state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipTypeEnum(AirDistCompNum)) {
694 122805 : case DataDefineEquip::ZnAirLoopEquipType::DualDuctConstVolume: {
695 368415 : SimulateDualDuct(state,
696 122805 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipName(AirDistCompNum),
697 : FirstHVACIteration,
698 : ControlledZoneNum,
699 122805 : state.dataZoneEquip->ZoneEquipConfig(ControlledZoneNum).ZoneNode,
700 122805 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipIndex(AirDistCompNum));
701 122805 : } break;
702 16413 : case DataDefineEquip::ZnAirLoopEquipType::DualDuctVAV: {
703 49239 : SimulateDualDuct(state,
704 16413 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipName(AirDistCompNum),
705 : FirstHVACIteration,
706 : ControlledZoneNum,
707 16413 : state.dataZoneEquip->ZoneEquipConfig(ControlledZoneNum).ZoneNode,
708 16413 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipIndex(AirDistCompNum));
709 16413 : } break;
710 67628 : case DataDefineEquip::ZnAirLoopEquipType::DualDuctVAVOutdoorAir: {
711 202884 : SimulateDualDuct(state,
712 67628 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipName(AirDistCompNum),
713 : FirstHVACIteration,
714 : ControlledZoneNum,
715 67628 : state.dataZoneEquip->ZoneEquipConfig(ControlledZoneNum).ZoneNode,
716 67628 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipIndex(AirDistCompNum));
717 67628 : } break;
718 23070724 : case DataDefineEquip::ZnAirLoopEquipType::SingleDuctVAVReheat: {
719 69212172 : SimulateSingleDuct(state,
720 23070724 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipName(AirDistCompNum),
721 : FirstHVACIteration,
722 : ControlledZoneNum,
723 23070724 : state.dataZoneEquip->ZoneEquipConfig(ControlledZoneNum).ZoneNode,
724 23070724 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipIndex(AirDistCompNum));
725 23070724 : } break;
726 47067 : case DataDefineEquip::ZnAirLoopEquipType::SingleDuctCBVAVReheat: {
727 141201 : SimulateSingleDuct(state,
728 47067 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipName(AirDistCompNum),
729 : FirstHVACIteration,
730 : ControlledZoneNum,
731 47067 : state.dataZoneEquip->ZoneEquipConfig(ControlledZoneNum).ZoneNode,
732 47067 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipIndex(AirDistCompNum));
733 47067 : } break;
734 362004 : case DataDefineEquip::ZnAirLoopEquipType::SingleDuctVAVNoReheat: {
735 1086012 : SimulateSingleDuct(state,
736 362004 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipName(AirDistCompNum),
737 : FirstHVACIteration,
738 : ControlledZoneNum,
739 362004 : state.dataZoneEquip->ZoneEquipConfig(ControlledZoneNum).ZoneNode,
740 362004 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipIndex(AirDistCompNum));
741 362004 : } break;
742 21670 : case DataDefineEquip::ZnAirLoopEquipType::SingleDuctCBVAVNoReheat: {
743 65010 : SimulateSingleDuct(state,
744 21670 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipName(AirDistCompNum),
745 : FirstHVACIteration,
746 : ControlledZoneNum,
747 21670 : state.dataZoneEquip->ZoneEquipConfig(ControlledZoneNum).ZoneNode,
748 21670 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipIndex(AirDistCompNum));
749 21670 : } break;
750 1679042 : case DataDefineEquip::ZnAirLoopEquipType::SingleDuctConstVolReheat: {
751 5037126 : SimulateSingleDuct(state,
752 1679042 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipName(AirDistCompNum),
753 : FirstHVACIteration,
754 : ControlledZoneNum,
755 1679042 : state.dataZoneEquip->ZoneEquipConfig(ControlledZoneNum).ZoneNode,
756 1679042 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipIndex(AirDistCompNum));
757 1679042 : } break;
758 7471141 : case DataDefineEquip::ZnAirLoopEquipType::SingleDuctConstVolNoReheat: {
759 22413423 : SimulateSingleDuct(state,
760 7471141 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipName(AirDistCompNum),
761 : FirstHVACIteration,
762 : ControlledZoneNum,
763 7471141 : state.dataZoneEquip->ZoneEquipConfig(ControlledZoneNum).ZoneNode,
764 7471141 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipIndex(AirDistCompNum));
765 7471141 : } break;
766 106578 : case DataDefineEquip::ZnAirLoopEquipType::SingleDuct_SeriesPIU_Reheat: {
767 319734 : SimPIU(state,
768 106578 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipName(AirDistCompNum),
769 : FirstHVACIteration,
770 : ControlledZoneNum,
771 106578 : state.dataZoneEquip->ZoneEquipConfig(ControlledZoneNum).ZoneNode,
772 106578 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipIndex(AirDistCompNum));
773 106578 : } break;
774 14250 : case DataDefineEquip::ZnAirLoopEquipType::SingleDuct_ParallelPIU_Reheat: {
775 42750 : SimPIU(state,
776 14250 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipName(AirDistCompNum),
777 : FirstHVACIteration,
778 : ControlledZoneNum,
779 14250 : state.dataZoneEquip->ZoneEquipConfig(ControlledZoneNum).ZoneNode,
780 14250 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipIndex(AirDistCompNum));
781 14250 : } break;
782 12104 : case DataDefineEquip::ZnAirLoopEquipType::SingleDuct_ConstVol_4PipeInduc: {
783 36312 : SimIndUnit(state,
784 12104 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipName(AirDistCompNum),
785 : FirstHVACIteration,
786 : ControlledZoneNum,
787 12104 : state.dataZoneEquip->ZoneEquipConfig(ControlledZoneNum).ZoneNode,
788 12104 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipIndex(AirDistCompNum));
789 12104 : } break;
790 31064 : case DataDefineEquip::ZnAirLoopEquipType::SingleDuctVAVReheatVSFan: {
791 93192 : SimulateSingleDuct(state,
792 31064 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipName(AirDistCompNum),
793 : FirstHVACIteration,
794 : ControlledZoneNum,
795 31064 : state.dataZoneEquip->ZoneEquipConfig(ControlledZoneNum).ZoneNode,
796 31064 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipIndex(AirDistCompNum));
797 31064 : } break;
798 36725 : case DataDefineEquip::ZnAirLoopEquipType::SingleDuctConstVolCooledBeam: {
799 110175 : SimCoolBeam(state,
800 36725 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipName(AirDistCompNum),
801 : FirstHVACIteration,
802 : ControlledZoneNum,
803 36725 : state.dataZoneEquip->ZoneEquipConfig(ControlledZoneNum).ZoneNode,
804 36725 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipIndex(AirDistCompNum),
805 : NonAirSysOutput);
806 36725 : } break;
807 249285 : case DataDefineEquip::ZnAirLoopEquipType::SingleDuctConstVolFourPipeBeam: {
808 249285 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).airTerminalPtr->simulate(state, FirstHVACIteration, NonAirSysOutput);
809 249285 : } break;
810 119640 : case DataDefineEquip::ZnAirLoopEquipType::SingleDuctUserDefined: {
811 358920 : SimAirTerminalUserDefined(state,
812 119640 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipName(AirDistCompNum),
813 : FirstHVACIteration,
814 : ControlledZoneNum,
815 119640 : state.dataZoneEquip->ZoneEquipConfig(ControlledZoneNum).ZoneNode,
816 119640 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipIndex(AirDistCompNum));
817 119640 : } break;
818 202270 : case DataDefineEquip::ZnAirLoopEquipType::SingleDuctATMixer: {
819 202270 : GetATMixers(state); // Needed here if mixer used only with unitarysystem which gets its input late
820 202270 : ProvideSysOutput = false;
821 202270 : } break;
822 0 : default: {
823 0 : ShowSevereError(state, "Error found in ZoneHVAC:AirDistributionUnit=" + state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).Name);
824 0 : ShowContinueError(state, "Invalid Component=" + state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipType(AirDistCompNum));
825 0 : ShowFatalError(state, "Preceding condition causes termination.");
826 0 : } break;
827 : }
828 :
829 : // do leak mass flow calcs
830 33630410 : if (InNodeNum > 0) { // InNodeNum is not always known when this is called, eg FPIU
831 33498134 : InNodeNum = state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).InletNodeNum;
832 33498134 : if (state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).UpStreamLeak) {
833 257370 : state.dataLoopNodes->Node(InNodeNum).MassFlowRateMaxAvail = MassFlowRateMaxAvail;
834 257370 : state.dataLoopNodes->Node(InNodeNum).MassFlowRateMinAvail = MassFlowRateMinAvail;
835 : }
836 100237032 : if ((state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).UpStreamLeak ||
837 33755504 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).DownStreamLeak) &&
838 : MassFlowRateMaxAvail > 0.0) {
839 256930 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).MassFlowRateTU = state.dataLoopNodes->Node(InNodeNum).MassFlowRate;
840 256930 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).MassFlowRateZSup =
841 513860 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).MassFlowRateTU *
842 256930 : (1.0 - state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).DownStreamLeakFrac);
843 256930 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).MassFlowRateDnStrLk =
844 513860 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).MassFlowRateTU *
845 256930 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).DownStreamLeakFrac;
846 256930 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).MassFlowRateSup =
847 513860 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).MassFlowRateTU +
848 256930 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).MassFlowRateUpStrLk;
849 256930 : state.dataLoopNodes->Node(InNodeNum).MassFlowRate = state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).MassFlowRateSup;
850 256930 : state.dataLoopNodes->Node(OutNodeNum).MassFlowRate = state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).MassFlowRateZSup;
851 256930 : state.dataLoopNodes->Node(OutNodeNum).MassFlowRateMaxAvail =
852 256930 : max(0.0,
853 256930 : MassFlowRateMaxAvail - state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).MassFlowRateDnStrLk -
854 256930 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).MassFlowRateUpStrLk);
855 256930 : state.dataLoopNodes->Node(OutNodeNum).MassFlowRateMinAvail =
856 256930 : max(0.0,
857 256930 : MassFlowRateMinAvail - state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).MassFlowRateDnStrLk -
858 256930 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).MassFlowRateUpStrLk);
859 256930 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).MaxAvailDelta =
860 256930 : MassFlowRateMaxAvail - state.dataLoopNodes->Node(OutNodeNum).MassFlowRateMaxAvail;
861 256930 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).MinAvailDelta =
862 256930 : MassFlowRateMinAvail - state.dataLoopNodes->Node(OutNodeNum).MassFlowRateMinAvail;
863 : } else {
864 : // if no leaks, or a terminal unit type not supported for leaks
865 : DataDefineEquip::ZnAirLoopEquipType termUnitType =
866 33241204 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).EquipTypeEnum(AirDistCompNum);
867 33241204 : if ((termUnitType == DataDefineEquip::ZnAirLoopEquipType::DualDuctConstVolume) ||
868 33101993 : (termUnitType == DataDefineEquip::ZnAirLoopEquipType::DualDuctVAV) ||
869 : (termUnitType == DataDefineEquip::ZnAirLoopEquipType::DualDuctVAVOutdoorAir)) {
870 : // Use ADU outlet node flow for dual duct terminal units (which don't support leaks)
871 206838 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).MassFlowRateTU = state.dataLoopNodes->Node(OutNodeNum).MassFlowRate;
872 206838 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).MassFlowRateZSup = state.dataLoopNodes->Node(OutNodeNum).MassFlowRate;
873 206838 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).MassFlowRateSup = state.dataLoopNodes->Node(OutNodeNum).MassFlowRate;
874 : } else {
875 33034366 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).MassFlowRateTU = state.dataLoopNodes->Node(InNodeNum).MassFlowRate;
876 33034366 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).MassFlowRateZSup = state.dataLoopNodes->Node(InNodeNum).MassFlowRate;
877 33034366 : state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).MassFlowRateSup = state.dataLoopNodes->Node(InNodeNum).MassFlowRate;
878 : }
879 : }
880 : }
881 : }
882 33630410 : if (ProvideSysOutput) {
883 33428140 : int OutletNodeNum = state.dataDefineEquipment->AirDistUnit(AirDistUnitNum).OutletNodeNum;
884 33428140 : int ZoneAirNode = state.dataZoneEquip->ZoneEquipConfig(ControlledZoneNum).ZoneNode;
885 33428140 : SpecHumOut = state.dataLoopNodes->Node(OutletNodeNum).HumRat;
886 33428140 : SpecHumIn = state.dataLoopNodes->Node(ZoneAirNode).HumRat;
887 : // Sign convention: SysOutputProvided <0 Zone is cooled
888 : // SysOutputProvided >0 Zone is heated
889 66856280 : SysOutputProvided = state.dataLoopNodes->Node(OutletNodeNum).MassFlowRate *
890 33428140 : Psychrometrics::PsyDeltaHSenFnTdb2W2Tdb1W1(state.dataLoopNodes->Node(OutletNodeNum).Temp,
891 : SpecHumOut,
892 33428140 : state.dataLoopNodes->Node(ZoneAirNode).Temp,
893 : SpecHumIn); // sensible {W};
894 : // Sign convention: LatOutputProvided <0 Zone is dehumidified
895 : // LatOutputProvided >0 Zone is humidified
896 : // CR9155 Remove specific humidity calculations
897 33428140 : LatOutputProvided =
898 33428140 : state.dataLoopNodes->Node(OutletNodeNum).MassFlowRate * (SpecHumOut - SpecHumIn); // Latent rate (kg/s), dehumid = negative
899 : } else {
900 202270 : SysOutputProvided = 0.0;
901 202270 : LatOutputProvided = 0.0;
902 : }
903 33630410 : }
904 :
905 : } // namespace ZoneAirLoopEquipmentManager
906 :
907 2313 : } // namespace EnergyPlus
|