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 : // C++ Headers
49 : #include <algorithm>
50 : #include <cmath>
51 : #include <limits>
52 :
53 : // ObjexxFCL Headers
54 : #include <ObjexxFCL/Array.functions.hh>
55 : #include <ObjexxFCL/Array1D.hh>
56 : #include <ObjexxFCL/Array2D.hh>
57 : #include <ObjexxFCL/Fmath.hh>
58 :
59 : // EnergyPlus Headers
60 : #include <AirflowNetwork/Solver.hpp>
61 : #include <EnergyPlus/CrossVentMgr.hh>
62 : #include <EnergyPlus/Data/EnergyPlusData.hh>
63 : #include <EnergyPlus/DataEnvironment.hh>
64 : #include <EnergyPlus/DataErrorTracking.hh>
65 : #include <EnergyPlus/DataHVACGlobals.hh>
66 : #include <EnergyPlus/DataHeatBalFanSys.hh>
67 : #include <EnergyPlus/DataHeatBalance.hh>
68 : #include <EnergyPlus/DataIPShortCuts.hh>
69 : #include <EnergyPlus/DataLoopNode.hh>
70 : #include <EnergyPlus/DataRoomAirModel.hh>
71 : #include <EnergyPlus/DataSurfaces.hh>
72 : #include <EnergyPlus/DataUCSDSharedData.hh>
73 : #include <EnergyPlus/DataZoneEquipment.hh>
74 : #include <EnergyPlus/DisplacementVentMgr.hh>
75 : #include <EnergyPlus/Fans.hh>
76 : #include <EnergyPlus/General.hh>
77 : #include <EnergyPlus/InputProcessing/InputProcessor.hh>
78 : #include <EnergyPlus/InternalHeatGains.hh>
79 : #include <EnergyPlus/MundtSimMgr.hh>
80 : #include <EnergyPlus/OutputProcessor.hh>
81 : #include <EnergyPlus/Psychrometrics.hh>
82 : #include <EnergyPlus/RoomAirModelAirflowNetwork.hh>
83 : #include <EnergyPlus/RoomAirModelManager.hh>
84 : #include <EnergyPlus/RoomAirModelUserTempPattern.hh>
85 : #include <EnergyPlus/ScheduleManager.hh>
86 : #include <EnergyPlus/UFADManager.hh>
87 : #include <EnergyPlus/UtilityRoutines.hh>
88 : #include <EnergyPlus/ZoneTempPredictorCorrector.hh>
89 :
90 : namespace EnergyPlus {
91 :
92 : namespace RoomAirModelManager {
93 :
94 : // MODULE INFORMATION
95 : // AUTHOR Weixiu Kong
96 : // DATE WRITTEN March 2003
97 : // MODIFIED July 2003, CC
98 : // Aug, 2005, BG
99 : // RE-ENGINEERED na
100 :
101 : // PURPOSE OF THIS MODULE:
102 : // Contains subroutines for managing the room air models
103 :
104 : // Using/Aliasing
105 : using namespace DataRoomAirModel;
106 :
107 27928091 : void ManageAirModel(EnergyPlusData &state, int const ZoneNum)
108 : {
109 :
110 : // SUBROUTINE INFORMATION:
111 : // AUTHOR Weixiu Kong
112 : // DATE WRITTEN April 2003
113 : // MODIFIED July 2003, CC
114 : // Jan 2004, CC
115 : // RE-ENGINEERED na
116 :
117 : // PURPOSE OF THIS SUBROUTINE:
118 : // manage room air models.
119 :
120 27928091 : if (state.dataRoomAirModelMgr->GetAirModelData) {
121 740 : GetAirModelDatas(state);
122 740 : state.dataRoomAirModelMgr->GetAirModelData = false;
123 : }
124 :
125 27928091 : if (!state.dataRoomAirMod->anyNonMixingRoomAirModel) return;
126 :
127 162216 : if (state.dataRoomAirMod->UCSDModelUsed) {
128 43671 : SharedDVCVUFDataInit(state, ZoneNum);
129 : }
130 :
131 162216 : switch (state.dataRoomAirMod->AirModel(ZoneNum).AirModelType) {
132 37512 : case DataRoomAirModel::RoomAirModel::UserDefined:
133 37512 : RoomAirModelUserTempPattern::ManageUserDefinedPatterns(state, ZoneNum);
134 37512 : break;
135 :
136 63250 : case DataRoomAirModel::RoomAirModel::Mixing: // Mixing air model
137 63250 : break; // do nothing
138 :
139 17126 : case DataRoomAirModel::RoomAirModel::Mundt: // Mundt air model
140 : // simulate room airflow using Mundt model
141 17126 : MundtSimMgr::ManageMundtModel(state, ZoneNum);
142 17126 : break;
143 :
144 15024 : case DataRoomAirModel::RoomAirModel::UCSDDV: // UCDV Displacement Ventilation model
145 : // simulate room airflow using UCSDDV model
146 15024 : DisplacementVentMgr::ManageUCSDDVModel(state, ZoneNum);
147 15024 : break;
148 :
149 4035 : case DataRoomAirModel::RoomAirModel::UCSDCV: // UCSD Cross Ventilation model
150 : // simulate room airflow using UCSDDV model
151 4035 : CrossVentMgr::ManageUCSDCVModel(state, ZoneNum);
152 4035 : break;
153 :
154 3516 : case DataRoomAirModel::RoomAirModel::UCSDUFI: // UCSD UFAD interior zone model
155 : // simulate room airflow using the UCSDUFI model
156 3516 : UFADManager::ManageUCSDUFModels(state, ZoneNum, DataRoomAirModel::RoomAirModel::UCSDUFI);
157 3516 : break;
158 :
159 14064 : case DataRoomAirModel::RoomAirModel::UCSDUFE: // UCSD UFAD exterior zone model
160 : // simulate room airflow using the UCSDUFE model
161 14064 : UFADManager::ManageUCSDUFModels(state, ZoneNum, DataRoomAirModel::RoomAirModel::UCSDUFE);
162 14064 : break;
163 :
164 7689 : case DataRoomAirModel::RoomAirModel::AirflowNetwork: // RoomAirflowNetwork zone model
165 : // simulate room airflow using the AirflowNetwork - based model
166 7689 : RoomAirModelAirflowNetwork::SimRoomAirModelAirflowNetwork(state, ZoneNum);
167 7689 : break;
168 :
169 0 : default: // mixing air model
170 0 : break; // do nothing
171 : }
172 : }
173 :
174 : //*****************************************************************************************
175 :
176 741 : void GetAirModelDatas(EnergyPlusData &state)
177 : {
178 :
179 : // SUBROUTINE INFORMATION:
180 : // AUTHOR Linda Lawrie
181 : // DATE WRITTEN March 2005
182 : // MODIFIED na
183 : // RE-ENGINEERED na
184 :
185 : // PURPOSE OF THIS SUBROUTINE:
186 : // This routine "gets" all the data for the "RoomAir" models by calling individual
187 : // routines.
188 :
189 : // SUBROUTINE LOCAL VARIABLE DECLARATIONS:
190 : bool ErrorsFound;
191 :
192 741 : ErrorsFound = false;
193 : // get air node input data for all zones
194 741 : GetAirNodeData(state, ErrorsFound);
195 :
196 : // get mundt model controls for all zones
197 741 : GetMundtData(state, ErrorsFound);
198 :
199 : // get airflow network model info for all zones
200 741 : GetRoomAirflowNetworkData(state, ErrorsFound);
201 :
202 : // get UCSDDV model controls for all zones
203 741 : GetDisplacementVentData(state, ErrorsFound);
204 :
205 : // get UCSDCV model controls for all zones
206 741 : GetCrossVentData(state, ErrorsFound);
207 :
208 : // get BTG's user-defined patterns for all zones
209 741 : GetUserDefinedPatternData(state, ErrorsFound);
210 :
211 : // get UCSD UFAD interior zone model controls for all zones
212 : // get UCSD UFAD exterior zone model controls for all zones
213 741 : GetUFADZoneData(state, ErrorsFound);
214 :
215 741 : if (ErrorsFound) {
216 0 : ShowFatalError(state, "GetAirModelData: Errors found getting air model input. Program terminates.");
217 : }
218 741 : }
219 :
220 741 : void GetUserDefinedPatternData(EnergyPlusData &state, bool &ErrorsFound) // True if errors found during this get input routine
221 : {
222 : // SUBROUTINE INFORMATION:
223 : // AUTHOR Brent Griffith
224 : // DATE WRITTEN Aug 2005
225 : // MODIFIED na
226 : // RE-ENGINEERED na
227 :
228 : // PURPOSE OF THIS SUBROUTINE:
229 : // This routine "gets" all the data for the "User-Defined RoomAir"
230 :
231 : // METHODOLOGY EMPLOYED:
232 : // usual energyplus input routines
233 : // for the actual patterns, a single structure array holds
234 : // different patterns in nested derived types.
235 :
236 : // Using/Aliasing
237 : using DataZoneEquipment::EquipConfiguration;
238 :
239 : using RoomAirModelUserTempPattern::FigureNDheightInZone;
240 : using ScheduleManager::GetScheduleIndex;
241 :
242 : // SUBROUTINE PARAMETER DEFINITIONS:
243 : static constexpr std::string_view RoutineName("GetUserDefinedPatternData: ");
244 :
245 : // SUBROUTINE LOCAL VARIABLE DECLARATIONS:
246 : int NumAlphas; // number of alphas
247 : int NumNumbers; // Number of numbers encountered
248 : int Status; // Notes if there was an error in processing the input
249 :
250 : int thisSurfinZone; // working variable for indexing surfaces within a ZoneRadiantInfo structure
251 : int thisPattern;
252 :
253 : int i; // do loop indexer
254 : int NumPairs; // number of zeta/deltaTai pairs
255 : int ObjNum; // loop indexer of input objects if the same type
256 : int ZoneNum; // zone number in heat balance domain
257 : int found; // test for UtilityRoutines::FindItemInList(
258 :
259 : // access input file and setup
260 741 : state.dataRoomAirMod->numTempDistContrldZones =
261 1482 : state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, cUserDefinedControlObject);
262 :
263 741 : state.dataRoomAirMod->NumConstantGradient =
264 1482 : state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, cTempPatternConstGradientObject);
265 741 : state.dataRoomAirMod->NumTwoGradientInterp =
266 1482 : state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, cTempPatternTwoGradientObject);
267 741 : state.dataRoomAirMod->NumNonDimensionalHeight =
268 1482 : state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, cTempPatternNDHeightObject);
269 741 : state.dataRoomAirMod->NumSurfaceMapping = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, cTempPatternSurfMapObject);
270 :
271 2223 : state.dataRoomAirMod->NumAirTempPatterns = state.dataRoomAirMod->NumConstantGradient + state.dataRoomAirMod->NumTwoGradientInterp +
272 1482 : state.dataRoomAirMod->NumNonDimensionalHeight + state.dataRoomAirMod->NumSurfaceMapping;
273 741 : auto &cCurrentModuleObject = state.dataIPShortCut->cCurrentModuleObject;
274 741 : cCurrentModuleObject = cUserDefinedControlObject;
275 741 : if (state.dataRoomAirMod->numTempDistContrldZones == 0) {
276 740 : if (state.dataRoomAirMod->NumAirTempPatterns != 0) { // user may have missed control object
277 0 : ShowWarningError(state, "Missing " + cCurrentModuleObject + " object needed to use roomair temperature patterns");
278 : // ErrorsFound = .TRUE.
279 : }
280 1480 : return;
281 : }
282 :
283 : // now allocate AirPatternZoneInfo to length of all zones for easy indexing
284 1 : if (!allocated(state.dataRoomAirMod->AirPatternZoneInfo)) {
285 1 : state.dataRoomAirMod->AirPatternZoneInfo.allocate(state.dataGlobal->NumOfZones);
286 : }
287 :
288 10 : for (ObjNum = 1; ObjNum <= state.dataRoomAirMod->numTempDistContrldZones; ++ObjNum) {
289 :
290 54 : state.dataInputProcessing->inputProcessor->getObjectItem(state,
291 : cCurrentModuleObject,
292 : ObjNum,
293 9 : state.dataIPShortCut->cAlphaArgs,
294 : NumAlphas,
295 9 : state.dataIPShortCut->rNumericArgs,
296 : NumNumbers,
297 : Status,
298 : _,
299 9 : state.dataIPShortCut->lAlphaFieldBlanks,
300 9 : state.dataIPShortCut->cAlphaFieldNames,
301 9 : state.dataIPShortCut->cNumericFieldNames);
302 : // first get zone ID
303 9 : ZoneNum = UtilityRoutines::FindItemInList(state.dataIPShortCut->cAlphaArgs(2), state.dataHeatBal->Zone);
304 9 : if (ZoneNum == 0) { // throw error
305 0 : ShowSevereError(state,
306 0 : std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + "\", invalid data.");
307 0 : ShowContinueError(
308 0 : state, "Invalid-not found " + state.dataIPShortCut->cAlphaFieldNames(2) + "=\"" + state.dataIPShortCut->cAlphaArgs(2) + "\".");
309 0 : ErrorsFound = true;
310 0 : return; // halt to avoid hard crash
311 : }
312 9 : state.dataRoomAirMod->AirPatternZoneInfo(ZoneNum).IsUsed = true;
313 9 : state.dataRoomAirMod->AirPatternZoneInfo(ZoneNum).Name = state.dataIPShortCut->cAlphaArgs(1); // Name of this Control Object
314 9 : state.dataRoomAirMod->AirPatternZoneInfo(ZoneNum).ZoneName = state.dataIPShortCut->cAlphaArgs(2); // Zone Name
315 :
316 9 : state.dataRoomAirMod->AirPatternZoneInfo(ZoneNum).AvailSched = state.dataIPShortCut->cAlphaArgs(3);
317 9 : if (state.dataIPShortCut->lAlphaFieldBlanks(3)) {
318 0 : state.dataRoomAirMod->AirPatternZoneInfo(ZoneNum).AvailSchedID = DataGlobalConstants::ScheduleAlwaysOn;
319 : } else {
320 9 : state.dataRoomAirMod->AirPatternZoneInfo(ZoneNum).AvailSchedID = GetScheduleIndex(state, state.dataIPShortCut->cAlphaArgs(3));
321 9 : if (state.dataRoomAirMod->AirPatternZoneInfo(ZoneNum).AvailSchedID == 0) {
322 0 : ShowSevereError(
323 0 : state, std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + "\", invalid data.");
324 0 : ShowContinueError(state,
325 0 : "Invalid-not found " + state.dataIPShortCut->cAlphaFieldNames(3) + "=\"" + state.dataIPShortCut->cAlphaArgs(3) +
326 : "\".");
327 0 : ErrorsFound = true;
328 : }
329 : }
330 :
331 18 : state.dataRoomAirMod->AirPatternZoneInfo(ZoneNum).PatternCntrlSched =
332 18 : state.dataIPShortCut->cAlphaArgs(4); // Schedule Name for Leading Pattern Control for this Zone
333 9 : state.dataRoomAirMod->AirPatternZoneInfo(ZoneNum).PatternSchedID = GetScheduleIndex(state, state.dataIPShortCut->cAlphaArgs(4));
334 9 : if (state.dataRoomAirMod->AirPatternZoneInfo(ZoneNum).PatternSchedID == 0) {
335 0 : ShowSevereError(state,
336 0 : std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + "\", invalid data.");
337 0 : ShowContinueError(
338 0 : state, "Invalid-not found " + state.dataIPShortCut->cAlphaFieldNames(4) + "=\"" + state.dataIPShortCut->cAlphaArgs(4) + "\".");
339 0 : ErrorsFound = true;
340 : }
341 :
342 9 : state.dataRoomAirMod->AirPatternZoneInfo(ZoneNum).ZoneID = ZoneNum;
343 :
344 : // figure number of surfaces for this zone
345 9 : state.dataRoomAirMod->AirPatternZoneInfo(ZoneNum).totNumSurfs = 0;
346 18 : for (int spaceNum : state.dataHeatBal->Zone(ZoneNum).spaceIndexes) {
347 9 : auto &thisSpace = state.dataHeatBal->space(spaceNum);
348 9 : state.dataRoomAirMod->AirPatternZoneInfo(ZoneNum).totNumSurfs += thisSpace.HTSurfaceLast - thisSpace.HTSurfaceFirst + 1;
349 : }
350 : // allocate nested derived type for surface info
351 9 : state.dataRoomAirMod->AirPatternZoneInfo(ZoneNum).Surf.allocate(state.dataRoomAirMod->AirPatternZoneInfo(ZoneNum).totNumSurfs);
352 :
353 : // Fill in what we know for nested structure for surfaces
354 9 : thisSurfinZone = 0;
355 18 : for (int spaceNum : state.dataHeatBal->Zone(ZoneNum).spaceIndexes) {
356 9 : auto &thisSpace = state.dataHeatBal->space(spaceNum);
357 420 : for (int thisHBsurfID = thisSpace.HTSurfaceFirst; thisHBsurfID <= thisSpace.HTSurfaceLast; ++thisHBsurfID) {
358 411 : ++thisSurfinZone;
359 420 : if (state.dataSurface->Surface(thisHBsurfID).Class == DataSurfaces::SurfaceClass::IntMass) {
360 9 : state.dataRoomAirMod->AirPatternZoneInfo(ZoneNum).Surf(thisSurfinZone).SurfID = thisHBsurfID;
361 9 : state.dataRoomAirMod->AirPatternZoneInfo(ZoneNum).Surf(thisSurfinZone).Zeta = 0.5;
362 9 : continue;
363 : }
364 :
365 402 : state.dataRoomAirMod->AirPatternZoneInfo(ZoneNum).Surf(thisSurfinZone).SurfID = thisHBsurfID;
366 :
367 402 : state.dataRoomAirMod->AirPatternZoneInfo(ZoneNum).Surf(thisSurfinZone).Zeta = FigureNDheightInZone(state, thisHBsurfID);
368 : }
369 : } // loop through surfaces in this zone
370 :
371 : } // loop through number of 'RoomAir:TemperaturePattern:UserDefined' objects
372 :
373 : // Check against AirModel. Make sure there is a match here.
374 12 : for (ZoneNum = 1; ZoneNum <= state.dataGlobal->NumOfZones; ++ZoneNum) {
375 11 : if (state.dataRoomAirMod->AirModel(ZoneNum).AirModelType != DataRoomAirModel::RoomAirModel::UserDefined) continue;
376 9 : if (state.dataRoomAirMod->AirPatternZoneInfo(ZoneNum).IsUsed) continue; // There is a Room Air Temperatures object for this zone
377 0 : ShowSevereError(state,
378 0 : std::string{RoutineName} + "AirModel for Zone=[" + state.dataHeatBal->Zone(ZoneNum).Name +
379 : "] is indicated as \"User Defined\".");
380 0 : ShowContinueError(state, "...but missing a " + cCurrentModuleObject + " object for control.");
381 0 : ErrorsFound = true;
382 : }
383 :
384 : // now get user defined temperature patterns
385 1 : if (!allocated(state.dataRoomAirMod->RoomAirPattern)) {
386 1 : state.dataRoomAirMod->RoomAirPattern.allocate(state.dataRoomAirMod->NumAirTempPatterns);
387 : }
388 :
389 : // Four different objects to get
390 1 : cCurrentModuleObject = cTempPatternConstGradientObject;
391 6 : for (ObjNum = 1; ObjNum <= state.dataRoomAirMod->NumConstantGradient; ++ObjNum) {
392 5 : thisPattern = ObjNum;
393 25 : state.dataInputProcessing->inputProcessor->getObjectItem(state,
394 : cCurrentModuleObject,
395 : ObjNum,
396 5 : state.dataIPShortCut->cAlphaArgs,
397 : NumAlphas,
398 5 : state.dataIPShortCut->rNumericArgs,
399 : NumNumbers,
400 : Status,
401 : _,
402 : _,
403 5 : state.dataIPShortCut->cAlphaFieldNames,
404 5 : state.dataIPShortCut->cNumericFieldNames);
405 :
406 5 : state.dataRoomAirMod->RoomAirPattern(thisPattern).Name = state.dataIPShortCut->cAlphaArgs(1);
407 5 : state.dataRoomAirMod->RoomAirPattern(thisPattern).PatrnID = state.dataIPShortCut->rNumericArgs(1);
408 5 : state.dataRoomAirMod->RoomAirPattern(thisPattern).PatternMode = DataRoomAirModel::UserDefinedPatternType::ConstGradTemp;
409 5 : state.dataRoomAirMod->RoomAirPattern(thisPattern).DeltaTstat = state.dataIPShortCut->rNumericArgs(2);
410 5 : state.dataRoomAirMod->RoomAirPattern(thisPattern).DeltaTleaving = state.dataIPShortCut->rNumericArgs(3);
411 5 : state.dataRoomAirMod->RoomAirPattern(thisPattern).DeltaTexhaust = state.dataIPShortCut->rNumericArgs(4);
412 5 : state.dataRoomAirMod->RoomAirPattern(thisPattern).GradPatrn.Gradient = state.dataIPShortCut->rNumericArgs(5);
413 : }
414 :
415 1 : cCurrentModuleObject = cTempPatternTwoGradientObject;
416 6 : for (ObjNum = 1; ObjNum <= state.dataRoomAirMod->NumTwoGradientInterp; ++ObjNum) {
417 5 : thisPattern = state.dataRoomAirMod->NumConstantGradient + ObjNum;
418 25 : state.dataInputProcessing->inputProcessor->getObjectItem(state,
419 : cCurrentModuleObject,
420 : ObjNum,
421 5 : state.dataIPShortCut->cAlphaArgs,
422 : NumAlphas,
423 5 : state.dataIPShortCut->rNumericArgs,
424 : NumNumbers,
425 : Status,
426 : _,
427 : _,
428 5 : state.dataIPShortCut->cAlphaFieldNames,
429 5 : state.dataIPShortCut->cNumericFieldNames);
430 5 : state.dataRoomAirMod->RoomAirPattern(thisPattern).PatternMode = DataRoomAirModel::UserDefinedPatternType::TwoGradInterp;
431 5 : state.dataRoomAirMod->RoomAirPattern(thisPattern).Name = state.dataIPShortCut->cAlphaArgs(1);
432 5 : state.dataRoomAirMod->RoomAirPattern(thisPattern).PatrnID = state.dataIPShortCut->rNumericArgs(1);
433 5 : state.dataRoomAirMod->RoomAirPattern(thisPattern).TwoGradPatrn.TstatHeight = state.dataIPShortCut->rNumericArgs(2);
434 5 : state.dataRoomAirMod->RoomAirPattern(thisPattern).TwoGradPatrn.TleavingHeight = state.dataIPShortCut->rNumericArgs(3);
435 5 : state.dataRoomAirMod->RoomAirPattern(thisPattern).TwoGradPatrn.TexhaustHeight = state.dataIPShortCut->rNumericArgs(4);
436 5 : state.dataRoomAirMod->RoomAirPattern(thisPattern).TwoGradPatrn.LowGradient = state.dataIPShortCut->rNumericArgs(5);
437 5 : state.dataRoomAirMod->RoomAirPattern(thisPattern).TwoGradPatrn.HiGradient = state.dataIPShortCut->rNumericArgs(6);
438 :
439 5 : if (UtilityRoutines::SameString(state.dataIPShortCut->cAlphaArgs(2), "OutdoorDryBulbTemperature")) {
440 1 : state.dataRoomAirMod->RoomAirPattern(thisPattern).TwoGradPatrn.InterpolationMode =
441 : DataRoomAirModel::UserDefinedPatternMode::OutdoorDryBulb;
442 4 : } else if (UtilityRoutines::SameString(state.dataIPShortCut->cAlphaArgs(2), "ZoneDryBulbTemperature")) {
443 1 : state.dataRoomAirMod->RoomAirPattern(thisPattern).TwoGradPatrn.InterpolationMode =
444 : DataRoomAirModel::UserDefinedPatternMode::ZoneAirTemp;
445 3 : } else if (UtilityRoutines::SameString(state.dataIPShortCut->cAlphaArgs(2), "ZoneAndOutdoorTemperatureDifference")) {
446 1 : state.dataRoomAirMod->RoomAirPattern(thisPattern).TwoGradPatrn.InterpolationMode =
447 : DataRoomAirModel::UserDefinedPatternMode::DeltaOutdoorZone;
448 2 : } else if (UtilityRoutines::SameString(state.dataIPShortCut->cAlphaArgs(2), "SensibleCoolingLoad")) {
449 1 : state.dataRoomAirMod->RoomAirPattern(thisPattern).TwoGradPatrn.InterpolationMode =
450 : DataRoomAirModel::UserDefinedPatternMode::SensibleCooling;
451 1 : } else if (UtilityRoutines::SameString(state.dataIPShortCut->cAlphaArgs(2), "SensibleHeatingLoad")) {
452 1 : state.dataRoomAirMod->RoomAirPattern(thisPattern).TwoGradPatrn.InterpolationMode =
453 : DataRoomAirModel::UserDefinedPatternMode::SensibleHeating;
454 : } else {
455 0 : ShowSevereError(state, "Invalid " + state.dataIPShortCut->cAlphaFieldNames(2) + " = " + state.dataIPShortCut->cAlphaArgs(2));
456 0 : ShowContinueError(state, "Entered in " + cCurrentModuleObject + " = " + state.dataIPShortCut->cAlphaArgs(1));
457 0 : ErrorsFound = true;
458 : }
459 :
460 5 : state.dataRoomAirMod->RoomAirPattern(thisPattern).TwoGradPatrn.UpperBoundTempScale = state.dataIPShortCut->rNumericArgs(7);
461 5 : state.dataRoomAirMod->RoomAirPattern(thisPattern).TwoGradPatrn.LowerBoundTempScale = state.dataIPShortCut->rNumericArgs(8);
462 :
463 5 : state.dataRoomAirMod->RoomAirPattern(thisPattern).TwoGradPatrn.UpperBoundHeatRateScale = state.dataIPShortCut->rNumericArgs(9);
464 5 : state.dataRoomAirMod->RoomAirPattern(thisPattern).TwoGradPatrn.LowerBoundHeatRateScale = state.dataIPShortCut->rNumericArgs(10);
465 :
466 : // now test the input some
467 10 : if (state.dataRoomAirMod->RoomAirPattern(thisPattern).TwoGradPatrn.HiGradient ==
468 5 : state.dataRoomAirMod->RoomAirPattern(thisPattern).TwoGradPatrn.LowGradient) {
469 0 : ShowWarningError(state, format("Upper and lower gradients equal, use {} instead ", cTempPatternConstGradientObject));
470 0 : ShowContinueError(state, "Entered in " + cCurrentModuleObject + " = " + state.dataIPShortCut->cAlphaArgs(1));
471 : }
472 10 : if ((state.dataRoomAirMod->RoomAirPattern(thisPattern).TwoGradPatrn.UpperBoundTempScale ==
473 7 : state.dataRoomAirMod->RoomAirPattern(thisPattern).TwoGradPatrn.LowerBoundTempScale) &&
474 2 : ((state.dataRoomAirMod->RoomAirPattern(thisPattern).TwoGradPatrn.InterpolationMode ==
475 2 : DataRoomAirModel::UserDefinedPatternMode::OutdoorDryBulb) ||
476 2 : (state.dataRoomAirMod->RoomAirPattern(thisPattern).TwoGradPatrn.InterpolationMode ==
477 2 : DataRoomAirModel::UserDefinedPatternMode::ZoneAirTemp) ||
478 2 : (state.dataRoomAirMod->RoomAirPattern(thisPattern).TwoGradPatrn.InterpolationMode ==
479 : DataRoomAirModel::UserDefinedPatternMode::DeltaOutdoorZone))) {
480 : // throw error, will cause divide by zero when used for scaling
481 0 : ShowSevereError(state, "Error in temperature scale in " + cCurrentModuleObject + ": " + state.dataIPShortCut->cAlphaArgs(1));
482 0 : ErrorsFound = true;
483 : }
484 10 : if ((state.dataRoomAirMod->RoomAirPattern(thisPattern).TwoGradPatrn.HiGradient ==
485 5 : state.dataRoomAirMod->RoomAirPattern(thisPattern).TwoGradPatrn.LowGradient) &&
486 0 : ((state.dataRoomAirMod->RoomAirPattern(thisPattern).TwoGradPatrn.InterpolationMode ==
487 0 : DataRoomAirModel::UserDefinedPatternMode::SensibleCooling) ||
488 0 : (state.dataRoomAirMod->RoomAirPattern(thisPattern).TwoGradPatrn.InterpolationMode ==
489 : DataRoomAirModel::UserDefinedPatternMode::SensibleHeating))) {
490 : // throw error, will cause divide by zero when used for scaling
491 0 : ShowSevereError(state, "Error in load scale in " + cCurrentModuleObject + ": " + state.dataIPShortCut->cAlphaArgs(1));
492 0 : ErrorsFound = true;
493 : }
494 : }
495 :
496 1 : cCurrentModuleObject = cTempPatternNDHeightObject;
497 2 : for (ObjNum = 1; ObjNum <= state.dataRoomAirMod->NumNonDimensionalHeight; ++ObjNum) {
498 1 : thisPattern = state.dataRoomAirMod->NumConstantGradient + state.dataRoomAirMod->NumTwoGradientInterp + ObjNum;
499 1 : state.dataRoomAirMod->RoomAirPattern(thisPattern).PatternMode = DataRoomAirModel::UserDefinedPatternType::NonDimenHeight;
500 :
501 5 : state.dataInputProcessing->inputProcessor->getObjectItem(state,
502 : cCurrentModuleObject,
503 : ObjNum,
504 1 : state.dataIPShortCut->cAlphaArgs,
505 : NumAlphas,
506 1 : state.dataIPShortCut->rNumericArgs,
507 : NumNumbers,
508 : Status,
509 : _,
510 : _,
511 1 : state.dataIPShortCut->cAlphaFieldNames,
512 1 : state.dataIPShortCut->cNumericFieldNames);
513 1 : state.dataRoomAirMod->RoomAirPattern(thisPattern).Name = state.dataIPShortCut->cAlphaArgs(1);
514 1 : state.dataRoomAirMod->RoomAirPattern(thisPattern).PatrnID = state.dataIPShortCut->rNumericArgs(1);
515 1 : state.dataRoomAirMod->RoomAirPattern(thisPattern).DeltaTstat = state.dataIPShortCut->rNumericArgs(2);
516 1 : state.dataRoomAirMod->RoomAirPattern(thisPattern).DeltaTleaving = state.dataIPShortCut->rNumericArgs(3);
517 1 : state.dataRoomAirMod->RoomAirPattern(thisPattern).DeltaTexhaust = state.dataIPShortCut->rNumericArgs(4);
518 :
519 1 : NumPairs = std::floor((double(NumNumbers) - 4.0) / 2.0);
520 :
521 : // TODO error checking
522 :
523 1 : state.dataRoomAirMod->RoomAirPattern(thisPattern).VertPatrn.ZetaPatrn.allocate(NumPairs);
524 1 : state.dataRoomAirMod->RoomAirPattern(thisPattern).VertPatrn.DeltaTaiPatrn.allocate(NumPairs);
525 :
526 : // init these since they can't be in derived type
527 1 : state.dataRoomAirMod->RoomAirPattern(thisPattern).VertPatrn.ZetaPatrn = 0.0;
528 1 : state.dataRoomAirMod->RoomAirPattern(thisPattern).VertPatrn.DeltaTaiPatrn = 0.0;
529 :
530 12 : for (i = 0; i <= NumPairs - 1; ++i) {
531 :
532 11 : state.dataRoomAirMod->RoomAirPattern(thisPattern).VertPatrn.ZetaPatrn(i + 1) = state.dataIPShortCut->rNumericArgs(2 * i + 5);
533 11 : state.dataRoomAirMod->RoomAirPattern(thisPattern).VertPatrn.DeltaTaiPatrn(i + 1) = state.dataIPShortCut->rNumericArgs(2 * i + 6);
534 : }
535 :
536 : // TODO check order (TODO sort ? )
537 11 : for (i = 2; i <= NumPairs; ++i) {
538 20 : if (state.dataRoomAirMod->RoomAirPattern(thisPattern).VertPatrn.ZetaPatrn(i) <
539 10 : state.dataRoomAirMod->RoomAirPattern(thisPattern).VertPatrn.ZetaPatrn(i - 1)) {
540 0 : ShowSevereError(state,
541 0 : "Zeta values not in increasing order in " + cCurrentModuleObject + ": " + state.dataIPShortCut->cAlphaArgs(1));
542 0 : ErrorsFound = true;
543 : }
544 : }
545 : }
546 :
547 1 : cCurrentModuleObject = cTempPatternSurfMapObject;
548 3 : for (ObjNum = 1; ObjNum <= state.dataRoomAirMod->NumSurfaceMapping; ++ObjNum) {
549 4 : thisPattern = state.dataRoomAirMod->NumConstantGradient + state.dataRoomAirMod->NumTwoGradientInterp +
550 2 : state.dataRoomAirMod->NumNonDimensionalHeight + ObjNum;
551 2 : state.dataRoomAirMod->RoomAirPattern(thisPattern).PatternMode = DataRoomAirModel::UserDefinedPatternType::SurfMapTemp;
552 :
553 10 : state.dataInputProcessing->inputProcessor->getObjectItem(state,
554 : cCurrentModuleObject,
555 : ObjNum,
556 2 : state.dataIPShortCut->cAlphaArgs,
557 : NumAlphas,
558 2 : state.dataIPShortCut->rNumericArgs,
559 : NumNumbers,
560 : Status,
561 : _,
562 : _,
563 2 : state.dataIPShortCut->cAlphaFieldNames,
564 2 : state.dataIPShortCut->cNumericFieldNames);
565 2 : state.dataRoomAirMod->RoomAirPattern(thisPattern).Name = state.dataIPShortCut->cAlphaArgs(1);
566 2 : state.dataRoomAirMod->RoomAirPattern(thisPattern).PatrnID = state.dataIPShortCut->rNumericArgs(1);
567 2 : state.dataRoomAirMod->RoomAirPattern(thisPattern).DeltaTstat = state.dataIPShortCut->rNumericArgs(2);
568 2 : state.dataRoomAirMod->RoomAirPattern(thisPattern).DeltaTleaving = state.dataIPShortCut->rNumericArgs(3);
569 2 : state.dataRoomAirMod->RoomAirPattern(thisPattern).DeltaTexhaust = state.dataIPShortCut->rNumericArgs(4);
570 :
571 2 : NumPairs = NumNumbers - 4;
572 :
573 2 : if (NumPairs != (NumAlphas - 1)) {
574 0 : ShowSevereError(state, "Error in number of entries in " + cCurrentModuleObject + " object: " + state.dataIPShortCut->cAlphaArgs(1));
575 0 : ErrorsFound = true;
576 : }
577 2 : state.dataRoomAirMod->RoomAirPattern(thisPattern).MapPatrn.SurfName.allocate(NumPairs);
578 2 : state.dataRoomAirMod->RoomAirPattern(thisPattern).MapPatrn.DeltaTai.allocate(NumPairs);
579 2 : state.dataRoomAirMod->RoomAirPattern(thisPattern).MapPatrn.SurfID.allocate(NumPairs);
580 :
581 : // init just allocated
582 2 : state.dataRoomAirMod->RoomAirPattern(thisPattern).MapPatrn.SurfName = "";
583 2 : state.dataRoomAirMod->RoomAirPattern(thisPattern).MapPatrn.DeltaTai = 0.0;
584 2 : state.dataRoomAirMod->RoomAirPattern(thisPattern).MapPatrn.SurfID = 0;
585 :
586 20 : for (i = 1; i <= NumPairs; ++i) {
587 18 : state.dataRoomAirMod->RoomAirPattern(thisPattern).MapPatrn.SurfName(i) = state.dataIPShortCut->cAlphaArgs(i + 1);
588 18 : state.dataRoomAirMod->RoomAirPattern(thisPattern).MapPatrn.DeltaTai(i) = state.dataIPShortCut->rNumericArgs(i + 4);
589 18 : found = UtilityRoutines::FindItemInList(state.dataIPShortCut->cAlphaArgs(i + 1), state.dataSurface->Surface);
590 18 : if (found != 0) {
591 18 : state.dataRoomAirMod->RoomAirPattern(thisPattern).MapPatrn.SurfID(i) = found;
592 : } else {
593 0 : ShowSevereError(state, "Surface name not found in " + cCurrentModuleObject + " object: " + state.dataIPShortCut->cAlphaArgs(1));
594 0 : ErrorsFound = true;
595 : }
596 : }
597 2 : state.dataRoomAirMod->RoomAirPattern(thisPattern).MapPatrn.NumSurfs = NumPairs;
598 : }
599 :
600 1 : if (state.dataErrTracking->TotalRoomAirPatternTooLow > 0) {
601 0 : ShowWarningError(state,
602 0 : format("GetUserDefinedPatternData: RoomAirModelUserTempPattern: {} problem(s) in non-dimensional height calculations, "
603 : "too low surface height(s) in relation to floor height of zone(s).",
604 0 : state.dataErrTracking->TotalRoomAirPatternTooLow));
605 0 : ShowContinueError(state, "...Use OutputDiagnostics,DisplayExtraWarnings; to see details.");
606 0 : state.dataErrTracking->TotalWarningErrors += state.dataErrTracking->TotalRoomAirPatternTooLow;
607 : }
608 1 : if (state.dataErrTracking->TotalRoomAirPatternTooHigh > 0) {
609 0 : ShowWarningError(state,
610 0 : format("GetUserDefinedPatternData: RoomAirModelUserTempPattern: {} problem(s) in non-dimensional height calculations, "
611 : "too high surface height(s) in relation to ceiling height of zone(s).",
612 0 : state.dataErrTracking->TotalRoomAirPatternTooHigh));
613 0 : ShowContinueError(state, "...Use OutputDiagnostics,DisplayExtraWarnings; to see details.");
614 0 : state.dataErrTracking->TotalWarningErrors += state.dataErrTracking->TotalRoomAirPatternTooHigh;
615 : }
616 :
617 : // now do one time setups from and checks on user data
618 :
619 : // Find and set return and exhaust node ids
620 :
621 12 : for (i = 1; i <= state.dataGlobal->NumOfZones; ++i) {
622 11 : if (state.dataRoomAirMod->AirPatternZoneInfo(i).IsUsed) {
623 : // first get return and exhaust air node index
624 18 : found = UtilityRoutines::FindItemInList(
625 18 : state.dataRoomAirMod->AirPatternZoneInfo(i).ZoneName, state.dataZoneEquip->ZoneEquipConfig, &EquipConfiguration::ZoneName);
626 9 : if (found != 0) {
627 :
628 9 : state.dataRoomAirMod->AirPatternZoneInfo(i).ZoneNodeID = state.dataZoneEquip->ZoneEquipConfig(found).ZoneNode;
629 9 : if (allocated(state.dataZoneEquip->ZoneEquipConfig(found).ExhaustNode)) {
630 18 : state.dataRoomAirMod->AirPatternZoneInfo(i).ExhaustAirNodeID.allocate(
631 18 : state.dataZoneEquip->ZoneEquipConfig(found).NumExhaustNodes);
632 9 : state.dataRoomAirMod->AirPatternZoneInfo(i).ExhaustAirNodeID = state.dataZoneEquip->ZoneEquipConfig(found).ExhaustNode;
633 : } // exhaust nodes present
634 : } // found ZoneEquipConf
635 :
636 : // second get zone height values
637 9 : state.dataRoomAirMod->AirPatternZoneInfo(i).ZoneHeight = state.dataHeatBal->Zone(i).CeilingHeight;
638 :
639 : } // air pattern is used
640 : }
641 : }
642 :
643 741 : void GetAirNodeData(EnergyPlusData &state, bool &ErrorsFound) // True if errors found during this get input routine
644 : {
645 :
646 : // SUBROUTINE INFORMATION:
647 : // AUTHOR Brent Griffith
648 : // DATE WRITTEN August 2001
649 : // RE-ENGINEERED April 2003, Weixiu Kong
650 : // MODIFIED July 2003, CC
651 : // Jan 2004, CC
652 :
653 : // PURPOSE OF THIS SUBROUTINE:
654 : // Get AirNode data for all zones at once
655 :
656 : // METHODOLOGY EMPLOYED:
657 : // Use input processer to get input from idf file
658 :
659 : // Using/Aliasing
660 :
661 : // SUBROUTINE LOCAL VARIABLE DECLARATIONS:
662 : int NumAlphas; // States which alpha value to read from a
663 : // "Number" line
664 : int NumNumbers; // Number of numbers encountered
665 : int Status; // Notes if there was an error in processing the input
666 : int AirNodeNum; // Index number for air nodes
667 : int ZoneNum; // Index number for zones
668 : int NumSurfsInvolved; // Number of surfaces involved with air nodes
669 : int SurfCount; // Number of surfaces involved with air nodes
670 : // (used for checking error)
671 : int NumOfSurfs; // Index number for last surface of zones
672 : bool SurfNeeded;
673 :
674 1480 : if (!state.dataRoomAirMod->MundtModelUsed) return;
675 :
676 : // Initialize default values for air nodes
677 2 : state.dataRoomAirMod->TotNumOfZoneAirNodes.allocate(state.dataGlobal->NumOfZones);
678 2 : state.dataRoomAirMod->TotNumOfAirNodes = 0;
679 2 : state.dataRoomAirMod->TotNumOfZoneAirNodes = 0;
680 2 : auto &cCurrentModuleObject = state.dataIPShortCut->cCurrentModuleObject;
681 2 : cCurrentModuleObject = "RoomAir:Node";
682 2 : state.dataRoomAirMod->TotNumOfAirNodes = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, cCurrentModuleObject);
683 :
684 2 : if (state.dataRoomAirMod->TotNumOfAirNodes <= 0) {
685 : // no air node object is found, terminate the program
686 0 : ShowSevereError(state, "No " + cCurrentModuleObject + " objects found in input.");
687 0 : ShowContinueError(state, "The OneNodeDisplacementVentilation model requires " + cCurrentModuleObject + " objects");
688 0 : ErrorsFound = true;
689 0 : return;
690 : } else {
691 : // air node objects are found so allocate airnode variable
692 2 : state.dataRoomAirMod->AirNode.allocate(state.dataRoomAirMod->TotNumOfAirNodes);
693 : }
694 :
695 38 : for (AirNodeNum = 1; AirNodeNum <= state.dataRoomAirMod->TotNumOfAirNodes; ++AirNodeNum) {
696 :
697 : // get air node objects
698 180 : state.dataInputProcessing->inputProcessor->getObjectItem(state,
699 : cCurrentModuleObject,
700 : AirNodeNum,
701 36 : state.dataIPShortCut->cAlphaArgs,
702 : NumAlphas,
703 36 : state.dataIPShortCut->rNumericArgs,
704 : NumNumbers,
705 : Status,
706 : _,
707 : _,
708 36 : state.dataIPShortCut->cAlphaFieldNames,
709 36 : state.dataIPShortCut->cNumericFieldNames);
710 36 : UtilityRoutines::IsNameEmpty(state, state.dataIPShortCut->cAlphaArgs(1), cCurrentModuleObject, ErrorsFound);
711 :
712 36 : state.dataRoomAirMod->AirNode(AirNodeNum).Name = state.dataIPShortCut->cAlphaArgs(1);
713 :
714 36 : state.dataRoomAirMod->AirNode(AirNodeNum).ZoneName = state.dataIPShortCut->cAlphaArgs(3); // Zone name
715 36 : state.dataRoomAirMod->AirNode(AirNodeNum).ZonePtr =
716 36 : UtilityRoutines::FindItemInList(state.dataRoomAirMod->AirNode(AirNodeNum).ZoneName, state.dataHeatBal->Zone);
717 36 : if (state.dataRoomAirMod->AirNode(AirNodeNum).ZonePtr == 0) {
718 0 : ShowSevereError(state, "Invalid " + state.dataIPShortCut->cAlphaFieldNames(3) + " = " + state.dataIPShortCut->cAlphaArgs(3));
719 0 : ShowContinueError(state, "Entered in " + cCurrentModuleObject + " = " + state.dataIPShortCut->cAlphaArgs(1));
720 0 : ErrorsFound = true;
721 : } else {
722 36 : ZoneNum = state.dataRoomAirMod->AirNode(AirNodeNum).ZonePtr;
723 36 : NumOfSurfs = 0;
724 72 : for (int spaceNum : state.dataHeatBal->Zone(ZoneNum).spaceIndexes) {
725 36 : auto &thisSpace = state.dataHeatBal->space(spaceNum);
726 36 : NumOfSurfs += thisSpace.HTSurfaceLast - thisSpace.HTSurfaceFirst + 1;
727 : }
728 36 : state.dataRoomAirMod->AirNode(AirNodeNum).SurfMask.allocate(NumOfSurfs);
729 : }
730 :
731 : {
732 72 : auto const nodeType(state.dataIPShortCut->cAlphaArgs(2));
733 36 : if (nodeType == "INLET") {
734 4 : state.dataRoomAirMod->AirNode(AirNodeNum).ClassType = AirNodeType::InletAir;
735 32 : } else if (nodeType == "FLOOR") {
736 4 : state.dataRoomAirMod->AirNode(AirNodeNum).ClassType = AirNodeType::FloorAir;
737 28 : } else if (nodeType == "CONTROL") {
738 4 : state.dataRoomAirMod->AirNode(AirNodeNum).ClassType = AirNodeType::ControlAir;
739 24 : } else if (nodeType == "CEILING") {
740 4 : state.dataRoomAirMod->AirNode(AirNodeNum).ClassType = AirNodeType::CeilingAir;
741 20 : } else if (nodeType == "MUNDTROOM") {
742 16 : state.dataRoomAirMod->AirNode(AirNodeNum).ClassType = AirNodeType::MundtRoomAir;
743 4 : } else if (nodeType == "RETURN") {
744 4 : state.dataRoomAirMod->AirNode(AirNodeNum).ClassType = AirNodeType::ReturnAir;
745 : } else {
746 0 : ShowSevereError(state, "Invalid " + state.dataIPShortCut->cAlphaFieldNames(2) + " = " + state.dataIPShortCut->cAlphaArgs(2));
747 0 : ShowContinueError(state, "Entered in " + cCurrentModuleObject + " = " + state.dataIPShortCut->cAlphaArgs(1));
748 0 : ErrorsFound = true;
749 : }
750 : }
751 :
752 36 : state.dataRoomAirMod->AirNode(AirNodeNum).Height = state.dataIPShortCut->rNumericArgs(1); // Air node height
753 36 : NumSurfsInvolved = NumAlphas - 3; // Number of surfaces involved with air nodes
754 :
755 : // Initialize
756 36 : state.dataRoomAirMod->AirNode(AirNodeNum).SurfMask = false;
757 :
758 36 : if (NumSurfsInvolved <= 0) {
759 :
760 : // report severe error since the following air nodes require surfaces associated with them
761 : {
762 24 : auto const nodeType(state.dataIPShortCut->cAlphaArgs(2));
763 48 : if (nodeType == "FLOOR" || nodeType == "CEILING" || nodeType == "MUNDTROOM" || nodeType == "PLUME4" || nodeType == "REESROOM1" ||
764 36 : nodeType == "REESROOM2" || nodeType == "REESROOM3" || nodeType == "REESROOM4") {
765 : // terminate the program due to a severe error in the specified input
766 0 : ShowSevereError(state,
767 0 : "GetAirNodeData: " + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) +
768 : "\" invalid air node specification.");
769 0 : ShowContinueError(state,
770 0 : "Mundt Room Air Model: No surface names specified. Air node=\"" +
771 0 : state.dataRoomAirMod->AirNode(AirNodeNum).Name + " requires name of surfaces associated with it.");
772 0 : ErrorsFound = true;
773 : } else {
774 : }
775 : }
776 :
777 : } else {
778 :
779 : // initialize
780 24 : SurfNeeded = true;
781 :
782 : // report warning error since the following air nodes do not require surfaces associated with them
783 : // and assign .FALSE. to 'SurfNeeded'
784 : {
785 48 : auto const nodeType(state.dataIPShortCut->cAlphaArgs(2));
786 48 : if (nodeType == "INLET" || nodeType == "CONTROL" || nodeType == "RETURN" || nodeType == "PLUME1" || nodeType == "PLUME2" ||
787 24 : nodeType == "PLUME3") {
788 0 : ShowWarningError(
789 0 : state, "GetAirNodeData: " + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + "\" invalid linkage");
790 0 : ShowContinueError(state,
791 0 : "Mundt Room Air Model: No surface names needed. Air node=\"" +
792 0 : state.dataRoomAirMod->AirNode(AirNodeNum).Name + " does not relate to any surfaces.");
793 0 : SurfNeeded = false;
794 : } else {
795 : }
796 : }
797 :
798 24 : if (SurfNeeded) {
799 :
800 : // this air node is in this zone; hence, first get name of all surfaces in this zone
801 24 : ZoneNum = state.dataRoomAirMod->AirNode(AirNodeNum).ZonePtr;
802 24 : NumOfSurfs = 0;
803 48 : for (int spaceNum : state.dataHeatBal->Zone(ZoneNum).spaceIndexes) {
804 24 : auto &thisSpace = state.dataHeatBal->space(spaceNum);
805 24 : NumOfSurfs += thisSpace.HTSurfaceLast - thisSpace.HTSurfaceFirst + 1;
806 : }
807 :
808 : // terminate the program due to a severe error in the specified input
809 24 : if ((NumSurfsInvolved) > NumOfSurfs) {
810 0 : ShowFatalError(state,
811 0 : "GetAirNodeData: Mundt Room Air Model: Number of surfaces connected to " +
812 0 : state.dataRoomAirMod->AirNode(AirNodeNum).Name + " is greater than number of surfaces in " +
813 0 : state.dataHeatBal->Zone(ZoneNum).Name);
814 0 : return;
815 : }
816 :
817 : // relate surfaces to this air node and check to see whether surface names are specified correctly or not
818 24 : SurfCount = 0;
819 112 : for (int ListSurfNum = 4; ListSurfNum <= NumAlphas; ++ListSurfNum) {
820 88 : int thisSurfinZone = 0;
821 88 : bool surfaceFound = false;
822 88 : for (int spaceNum : state.dataHeatBal->Zone(ZoneNum).spaceIndexes) {
823 88 : auto &thisSpace = state.dataHeatBal->space(spaceNum);
824 1012 : for (int SurfNum = thisSpace.HTSurfaceFirst; SurfNum <= thisSpace.HTSurfaceLast; ++SurfNum) {
825 1012 : ++thisSurfinZone;
826 1012 : if (state.dataIPShortCut->cAlphaArgs(ListSurfNum) == state.dataSurface->Surface(SurfNum).Name) {
827 : ;
828 88 : state.dataRoomAirMod->AirNode(AirNodeNum).SurfMask(thisSurfinZone) = true;
829 88 : ++SurfCount;
830 88 : surfaceFound = true;
831 88 : break;
832 : }
833 : }
834 88 : if (surfaceFound) break;
835 : }
836 : }
837 :
838 : // report warning error since surface names are specified correctly
839 24 : if ((NumSurfsInvolved) != SurfCount) {
840 0 : ShowWarningError(state,
841 0 : "GetAirNodeData: Mundt Room Air Model: Some surface names specified for " +
842 0 : state.dataRoomAirMod->AirNode(AirNodeNum).Name + " are not in " + state.dataHeatBal->Zone(ZoneNum).Name);
843 : }
844 : }
845 : }
846 : }
847 :
848 : // get number of air nodes in each zone
849 10 : for (ZoneNum = 1; ZoneNum <= state.dataGlobal->NumOfZones; ++ZoneNum) {
850 :
851 : // this zone uses other air model so skip the rest
852 8 : if (state.dataRoomAirMod->AirModel(ZoneNum).AirModelType != DataRoomAirModel::RoomAirModel::Mundt) continue;
853 :
854 : // this zone uses a nodal air model so get number of air nodes in each zone
855 76 : for (AirNodeNum = 1; AirNodeNum <= state.dataRoomAirMod->TotNumOfAirNodes; ++AirNodeNum) {
856 72 : if (state.dataRoomAirMod->AirNode(AirNodeNum).ZonePtr == ZoneNum) {
857 36 : ++state.dataRoomAirMod->TotNumOfZoneAirNodes(ZoneNum);
858 : }
859 : }
860 : }
861 : }
862 :
863 : //*****************************************************************************************
864 :
865 741 : void GetMundtData(EnergyPlusData &state, bool &ErrorsFound) // True if errors found during this get input routine
866 : {
867 :
868 : // SUBROUTINE INFORMATION:
869 : // AUTHOR Brent Griffith
870 : // DATE WRITTEN August 2001
871 : // MODIFIED na
872 : // RE-ENGINEERED April 2003, Weixiu Kong
873 : // July 2003, CC
874 :
875 : // PURPOSE OF THIS SUBROUTINE:
876 : // Get Mundt model controls for all zones at once
877 :
878 : // METHODOLOGY EMPLOYED:
879 : // Use input processer to get input from idf file
880 :
881 : // Using/Aliasing
882 :
883 : // SUBROUTINE LOCAL VARIABLE DECLARATIONS:
884 : int NumAlphas;
885 : int NumNumbers; // Number of numbers encountered
886 : int Status; // Notes if there was an error in processing the input
887 : int ControlNum; // Index number
888 : int NumOfMundtContrl; // Number of Mundt Model Controls
889 : int ZoneNum; // Index number for zones
890 :
891 1480 : if (!state.dataRoomAirMod->MundtModelUsed) return;
892 :
893 : // Initialize default values for Mundt model controls
894 2 : state.dataRoomAirMod->ConvectiveFloorSplit.allocate(state.dataGlobal->NumOfZones);
895 2 : state.dataRoomAirMod->InfiltratFloorSplit.allocate(state.dataGlobal->NumOfZones);
896 2 : state.dataRoomAirMod->ConvectiveFloorSplit = 0.0;
897 2 : state.dataRoomAirMod->InfiltratFloorSplit = 0.0;
898 2 : auto &cCurrentModuleObject = state.dataIPShortCut->cCurrentModuleObject;
899 2 : cCurrentModuleObject = "RoomAirSettings:OneNodeDisplacementVentilation";
900 2 : NumOfMundtContrl = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, cCurrentModuleObject);
901 2 : if (NumOfMundtContrl > state.dataGlobal->NumOfZones) {
902 0 : ShowSevereError(state, "Too many " + cCurrentModuleObject + " objects in input file");
903 0 : ShowContinueError(state, "There cannot be more " + cCurrentModuleObject + " objects than number of zones.");
904 0 : ErrorsFound = true;
905 : }
906 :
907 2 : if (NumOfMundtContrl == 0) {
908 0 : ShowWarningError(state, "No " + cCurrentModuleObject + " objects found, program assumes no convection or infiltration gains near floors");
909 0 : return;
910 : }
911 :
912 : // this zone uses Mundt model so get Mundt Model Control
913 : // loop through all 'RoomAirSettings:OneNodeDisplacementVentilation' objects
914 6 : for (ControlNum = 1; ControlNum <= NumOfMundtContrl; ++ControlNum) {
915 20 : state.dataInputProcessing->inputProcessor->getObjectItem(state,
916 : cCurrentModuleObject,
917 : ControlNum,
918 4 : state.dataIPShortCut->cAlphaArgs,
919 : NumAlphas,
920 4 : state.dataIPShortCut->rNumericArgs,
921 : NumNumbers,
922 : Status,
923 : _,
924 : _,
925 4 : state.dataIPShortCut->cAlphaFieldNames,
926 4 : state.dataIPShortCut->cNumericFieldNames);
927 4 : ZoneNum = UtilityRoutines::FindItemInList(state.dataIPShortCut->cAlphaArgs(1), state.dataHeatBal->Zone);
928 4 : if (ZoneNum == 0) {
929 0 : ShowSevereError(state, "Invalid " + state.dataIPShortCut->cAlphaFieldNames(1) + " = " + state.dataIPShortCut->cAlphaArgs(1));
930 0 : ShowContinueError(state, "Entered in " + cCurrentModuleObject + " = " + state.dataIPShortCut->cAlphaArgs(1));
931 0 : ShowContinueError(state, "Not a valid zone name.");
932 0 : ErrorsFound = true;
933 0 : continue;
934 : }
935 4 : if (state.dataRoomAirMod->AirModel(ZoneNum).AirModelType != DataRoomAirModel::RoomAirModel::Mundt) {
936 0 : ShowSevereError(
937 0 : state, "Zone specified=\"" + state.dataIPShortCut->cAlphaArgs(1) + "\", Air Model type is not OneNodeDisplacementVentilation.");
938 0 : ShowContinueError(
939 0 : state, format("Air Model Type for zone={}", ChAirModel[static_cast<int>(state.dataRoomAirMod->AirModel(ZoneNum).AirModelType)]));
940 0 : ErrorsFound = true;
941 0 : continue;
942 : }
943 4 : state.dataRoomAirMod->ConvectiveFloorSplit(ZoneNum) = state.dataIPShortCut->rNumericArgs(1);
944 4 : state.dataRoomAirMod->InfiltratFloorSplit(ZoneNum) = state.dataIPShortCut->rNumericArgs(2);
945 : }
946 : }
947 :
948 741 : void GetDisplacementVentData(EnergyPlusData &state, bool &ErrorsFound) // True if errors found during this get input routine
949 : {
950 :
951 : // SUBROUTINE INFORMATION:
952 : // AUTHOR G. Carrilho da Graca
953 : // DATE WRITTEN January 2004
954 : // MODIFIED
955 : // RE-ENGINEERED
956 :
957 : // PURPOSE OF THIS SUBROUTINE:
958 : // Get UCSD Displacement ventilation model controls for all zones at once
959 :
960 : // METHODOLOGY EMPLOYED:
961 : // Use input processor to get input from idf file
962 :
963 : // Using/Aliasing
964 : using namespace ScheduleManager;
965 :
966 : // SUBROUTINE LOCAL VARIABLE DECLARATIONS:
967 : int IOStat;
968 : int NumAlpha;
969 : int NumNumber;
970 : int Loop;
971 741 : auto &cCurrentModuleObject = state.dataIPShortCut->cCurrentModuleObject;
972 1478 : if (!state.dataRoomAirMod->UCSDModelUsed) return;
973 7 : cCurrentModuleObject = "RoomAirSettings:ThreeNodeDisplacementVentilation";
974 7 : state.dataRoomAirMod->TotUCSDDV = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, cCurrentModuleObject);
975 :
976 7 : if (state.dataRoomAirMod->TotUCSDDV <= 0) return;
977 :
978 4 : state.dataRoomAirMod->ZoneUCSDDV.allocate(state.dataRoomAirMod->TotUCSDDV);
979 :
980 8 : for (Loop = 1; Loop <= state.dataRoomAirMod->TotUCSDDV; ++Loop) {
981 :
982 24 : state.dataInputProcessing->inputProcessor->getObjectItem(state,
983 : cCurrentModuleObject,
984 : Loop,
985 4 : state.dataIPShortCut->cAlphaArgs,
986 : NumAlpha,
987 4 : state.dataIPShortCut->rNumericArgs,
988 : NumNumber,
989 : IOStat,
990 : _,
991 4 : state.dataIPShortCut->lAlphaFieldBlanks,
992 4 : state.dataIPShortCut->cAlphaFieldNames,
993 4 : state.dataIPShortCut->cNumericFieldNames);
994 : // First is Zone Name
995 4 : state.dataRoomAirMod->ZoneUCSDDV(Loop).ZoneName = state.dataIPShortCut->cAlphaArgs(1);
996 4 : state.dataRoomAirMod->ZoneUCSDDV(Loop).ZonePtr =
997 4 : UtilityRoutines::FindItemInList(state.dataIPShortCut->cAlphaArgs(1), state.dataHeatBal->Zone);
998 4 : if (state.dataRoomAirMod->ZoneUCSDDV(Loop).ZonePtr == 0) {
999 0 : ShowSevereError(state, "Invalid " + state.dataIPShortCut->cAlphaFieldNames(1) + " = " + state.dataIPShortCut->cAlphaArgs(1));
1000 0 : ShowContinueError(state, "Entered in " + cCurrentModuleObject + " = " + state.dataIPShortCut->cAlphaArgs(1));
1001 0 : ShowContinueError(state, "Zone Name not found.");
1002 0 : ErrorsFound = true;
1003 : } else {
1004 4 : state.dataRoomAirMod->IsZoneDV(state.dataRoomAirMod->ZoneUCSDDV(Loop).ZonePtr) = true;
1005 : }
1006 : // Second Alpha is Schedule Name
1007 4 : state.dataRoomAirMod->ZoneUCSDDV(Loop).SchedGainsName = state.dataIPShortCut->cAlphaArgs(2);
1008 4 : state.dataRoomAirMod->ZoneUCSDDV(Loop).SchedGainsPtr = GetScheduleIndex(state, state.dataIPShortCut->cAlphaArgs(2));
1009 4 : if (state.dataRoomAirMod->ZoneUCSDDV(Loop).SchedGainsPtr == 0) {
1010 0 : if (state.dataIPShortCut->lAlphaFieldBlanks(2)) {
1011 0 : ShowSevereError(state, "Invalid " + state.dataIPShortCut->cAlphaFieldNames(2) + " = " + state.dataIPShortCut->cAlphaArgs(2));
1012 0 : ShowContinueError(state, "Entered in " + cCurrentModuleObject + " = " + state.dataIPShortCut->cAlphaArgs(1));
1013 0 : ShowContinueError(state, " Schedule name must be input.");
1014 0 : ErrorsFound = true;
1015 : } else {
1016 0 : ShowSevereError(state, "Invalid " + state.dataIPShortCut->cAlphaFieldNames(2) + " = " + state.dataIPShortCut->cAlphaArgs(2));
1017 0 : ShowContinueError(state, "Entered in " + cCurrentModuleObject + " = " + state.dataIPShortCut->cAlphaArgs(1));
1018 0 : ShowContinueError(state, "Schedule name was not found.");
1019 0 : ErrorsFound = true;
1020 : }
1021 : }
1022 :
1023 4 : state.dataRoomAirMod->ZoneUCSDDV(Loop).NumPlumesPerOcc = state.dataIPShortCut->rNumericArgs(1);
1024 4 : state.dataRoomAirMod->ZoneUCSDDV(Loop).ThermostatHeight = state.dataIPShortCut->rNumericArgs(2);
1025 4 : state.dataRoomAirMod->ZoneUCSDDV(Loop).ComfortHeight = state.dataIPShortCut->rNumericArgs(3);
1026 4 : state.dataRoomAirMod->ZoneUCSDDV(Loop).TempTrigger = state.dataIPShortCut->rNumericArgs(4);
1027 : }
1028 : }
1029 :
1030 741 : void GetCrossVentData(EnergyPlusData &state, bool &ErrorsFound) // True if errors found during this get input routine
1031 : {
1032 :
1033 : // SUBROUTINE INFORMATION:
1034 : // AUTHOR G. Carrilho da Graca
1035 : // DATE WRITTEN October 2004
1036 : // MODIFIED
1037 : // RE-ENGINEERED
1038 :
1039 : // PURPOSE OF THIS SUBROUTINE:
1040 : // Get UCSD Cross ventilation model controls for all zones at once
1041 :
1042 : // METHODOLOGY EMPLOYED:
1043 : // Use input processor to get input from idf file
1044 :
1045 : // Using/Aliasing
1046 : using namespace ScheduleManager;
1047 :
1048 : // SUBROUTINE LOCAL VARIABLE DECLARATIONS:
1049 : int IOStat;
1050 : int NumAlpha;
1051 : int NumNumber;
1052 : int Loop;
1053 : int Loop2;
1054 : int ThisZone;
1055 741 : auto &cCurrentModuleObject = state.dataIPShortCut->cCurrentModuleObject;
1056 1480 : if (!state.dataRoomAirMod->UCSDModelUsed) return;
1057 7 : cCurrentModuleObject = "RoomAirSettings:CrossVentilation";
1058 7 : state.dataRoomAirMod->TotUCSDCV = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, cCurrentModuleObject);
1059 :
1060 7 : if (state.dataRoomAirMod->TotUCSDCV <= 0) return;
1061 :
1062 2 : state.dataRoomAirMod->ZoneUCSDCV.allocate(state.dataRoomAirMod->TotUCSDCV);
1063 :
1064 4 : for (Loop = 1; Loop <= state.dataRoomAirMod->TotUCSDCV; ++Loop) {
1065 :
1066 12 : state.dataInputProcessing->inputProcessor->getObjectItem(state,
1067 : cCurrentModuleObject,
1068 : Loop,
1069 2 : state.dataIPShortCut->cAlphaArgs,
1070 : NumAlpha,
1071 2 : state.dataIPShortCut->rNumericArgs,
1072 : NumNumber,
1073 : IOStat,
1074 : _,
1075 2 : state.dataIPShortCut->lAlphaFieldBlanks,
1076 2 : state.dataIPShortCut->cAlphaFieldNames,
1077 2 : state.dataIPShortCut->cNumericFieldNames);
1078 : // First is Zone Name
1079 2 : state.dataRoomAirMod->ZoneUCSDCV(Loop).ZoneName = state.dataIPShortCut->cAlphaArgs(1);
1080 2 : state.dataRoomAirMod->ZoneUCSDCV(Loop).ZonePtr =
1081 2 : UtilityRoutines::FindItemInList(state.dataIPShortCut->cAlphaArgs(1), state.dataHeatBal->Zone);
1082 2 : if (state.dataRoomAirMod->ZoneUCSDCV(Loop).ZonePtr == 0) {
1083 0 : ShowSevereError(state, "Invalid " + state.dataIPShortCut->cAlphaFieldNames(1) + " = " + state.dataIPShortCut->cAlphaArgs(1));
1084 0 : ShowContinueError(state, "Entered in " + cCurrentModuleObject + " = " + state.dataIPShortCut->cAlphaArgs(1));
1085 0 : ShowContinueError(state, "Zone name was not found.");
1086 0 : ErrorsFound = true;
1087 : } else {
1088 2 : state.dataRoomAirMod->IsZoneCV(state.dataRoomAirMod->ZoneUCSDCV(Loop).ZonePtr) = true;
1089 : }
1090 : // Second Alpha is Schedule Name
1091 2 : state.dataRoomAirMod->ZoneUCSDCV(Loop).SchedGainsName = state.dataIPShortCut->cAlphaArgs(2);
1092 2 : state.dataRoomAirMod->ZoneUCSDCV(Loop).SchedGainsPtr = GetScheduleIndex(state, state.dataIPShortCut->cAlphaArgs(2));
1093 2 : if (state.dataRoomAirMod->ZoneUCSDCV(Loop).SchedGainsPtr == 0) {
1094 0 : if (state.dataIPShortCut->lAlphaFieldBlanks(2)) {
1095 0 : ShowSevereError(state, "Invalid " + state.dataIPShortCut->cAlphaFieldNames(2) + " = " + state.dataIPShortCut->cAlphaArgs(2));
1096 0 : ShowContinueError(state, "Entered in " + cCurrentModuleObject + " = " + state.dataIPShortCut->cAlphaArgs(1));
1097 0 : ShowContinueError(state, "Schedule name field is blank.");
1098 0 : ErrorsFound = true;
1099 : } else {
1100 0 : ShowSevereError(state, "Invalid " + state.dataIPShortCut->cAlphaFieldNames(2) + " = " + state.dataIPShortCut->cAlphaArgs(2));
1101 0 : ShowContinueError(state, "Entered in " + cCurrentModuleObject + " = " + state.dataIPShortCut->cAlphaArgs(1));
1102 0 : ShowContinueError(state, "Schedule name was not found.");
1103 0 : ErrorsFound = true;
1104 : }
1105 : }
1106 :
1107 : // Third Alpha is a string: JET or RECIRCULATION
1108 2 : if (UtilityRoutines::SameString(state.dataIPShortCut->cAlphaArgs(3), "Jet")) {
1109 2 : state.dataRoomAirMod->ZoneUCSDCV(Loop).VforComfort = Comfort::Jet;
1110 0 : } else if (UtilityRoutines::SameString(state.dataIPShortCut->cAlphaArgs(3), "Recirculation")) {
1111 0 : state.dataRoomAirMod->ZoneUCSDCV(Loop).VforComfort = Comfort::Recirculation;
1112 : } else {
1113 0 : state.dataRoomAirMod->ZoneUCSDCV(Loop).VforComfort = Comfort::Invalid;
1114 : }
1115 :
1116 2 : for (Loop2 = 1; Loop2 <= state.dataHeatBal->TotPeople; ++Loop2) {
1117 0 : if (state.dataHeatBal->People(Loop2).ZonePtr != state.dataRoomAirMod->ZoneUCSDCV(Loop).ZonePtr) continue;
1118 0 : if (state.dataHeatBal->People(Loop2).Fanger) {
1119 0 : if (state.dataRoomAirMod->ZoneUCSDCV(Loop).VforComfort == Comfort::Invalid) {
1120 0 : if (state.dataIPShortCut->lAlphaFieldBlanks(3)) {
1121 0 : ShowSevereError(state,
1122 0 : "Invalid " + state.dataIPShortCut->cAlphaFieldNames(3) + " = " + state.dataIPShortCut->cAlphaArgs(3));
1123 0 : ShowContinueError(state, "Entered in " + cCurrentModuleObject + " = " + state.dataIPShortCut->cAlphaArgs(1));
1124 0 : ShowContinueError(state,
1125 0 : "Airflow region used for thermal comfort evaluation is required for Zone=" +
1126 0 : state.dataIPShortCut->cAlphaArgs(1));
1127 0 : ShowContinueError(state, "Field is blank, please choose Jet or Recirculation.");
1128 0 : ErrorsFound = true;
1129 : } else {
1130 0 : ShowSevereError(state,
1131 0 : "Invalid " + state.dataIPShortCut->cAlphaFieldNames(3) + " = " + state.dataIPShortCut->cAlphaArgs(3));
1132 0 : ShowContinueError(state, "Entered in " + cCurrentModuleObject + " = " + state.dataIPShortCut->cAlphaArgs(1));
1133 0 : ShowContinueError(state,
1134 0 : "Airflow region used for thermal comfort evaluation is required for Zone=" +
1135 0 : state.dataIPShortCut->cAlphaArgs(1));
1136 0 : ShowContinueError(state, "Please choose Jet or Recirculation.");
1137 0 : ErrorsFound = true;
1138 : }
1139 : }
1140 : }
1141 : }
1142 :
1143 2 : ThisZone = state.dataRoomAirMod->ZoneUCSDCV(Loop).ZonePtr;
1144 2 : if (ThisZone == 0) continue;
1145 :
1146 : // Following depend on valid zone
1147 :
1148 2 : Loop2 = UtilityRoutines::FindItemInList(state.dataHeatBal->Zone(state.dataRoomAirMod->ZoneUCSDCV(Loop).ZonePtr).Name,
1149 2 : state.afn->MultizoneZoneData,
1150 : &AirflowNetwork::MultizoneZoneProp::ZoneName);
1151 2 : if (Loop2 == 0) {
1152 0 : ShowSevereError(state, "Problem with " + cCurrentModuleObject + " = " + state.dataIPShortCut->cAlphaArgs(1));
1153 0 : ShowContinueError(state, "AirflowNetwork airflow model must be active in this zone");
1154 0 : ErrorsFound = true;
1155 : }
1156 :
1157 : // If a crack is used it must have an air flow coefficient = 0.5
1158 8 : for (Loop2 = 1; Loop2 <= state.afn->NumOfLinksMultiZone; ++Loop2) {
1159 6 : state.dataRoomAirModelMgr->NodeNum1 = state.afn->MultizoneSurfaceData(Loop2).NodeNums[0];
1160 6 : state.dataRoomAirModelMgr->NodeNum2 = state.afn->MultizoneSurfaceData(Loop2).NodeNums[1];
1161 12 : if (state.dataSurface->Surface(state.afn->MultizoneSurfaceData(Loop2).SurfNum).Zone == ThisZone ||
1162 0 : (state.afn->AirflowNetworkNodeData(state.dataRoomAirModelMgr->NodeNum2).EPlusZoneNum == ThisZone &&
1163 12 : state.afn->AirflowNetworkNodeData(state.dataRoomAirModelMgr->NodeNum1).EPlusZoneNum > 0) ||
1164 0 : (state.afn->AirflowNetworkNodeData(state.dataRoomAirModelMgr->NodeNum2).EPlusZoneNum > 0 &&
1165 0 : state.afn->AirflowNetworkNodeData(state.dataRoomAirModelMgr->NodeNum1).EPlusZoneNum == ThisZone)) {
1166 6 : state.dataRoomAirModelMgr->CompNum = state.afn->AirflowNetworkLinkageData(Loop2).CompNum;
1167 6 : state.dataRoomAirModelMgr->TypeNum = state.afn->AirflowNetworkCompData(state.dataRoomAirModelMgr->CompNum).TypeNum;
1168 6 : if (state.afn->AirflowNetworkCompData(state.dataRoomAirModelMgr->CompNum).CompTypeNum == AirflowNetwork::iComponentTypeNum::SCR) {
1169 0 : if (state.afn->MultizoneSurfaceCrackData(state.dataRoomAirModelMgr->TypeNum).exponent != 0.50) {
1170 0 : state.dataRoomAirMod->AirModel(ThisZone).AirModelType = DataRoomAirModel::RoomAirModel::Mixing;
1171 0 : ShowWarningError(state, "Problem with " + cCurrentModuleObject + " = " + state.dataIPShortCut->cAlphaArgs(1));
1172 0 : ShowWarningError(state, "Roomair model will not be applied for Zone=" + state.dataIPShortCut->cAlphaArgs(1) + '.');
1173 0 : ShowContinueError(
1174 : state,
1175 0 : format("AirflowNetwrok:Multizone:Surface crack object must have an air flow coefficient = 0.5, value was={:.2R}",
1176 0 : state.afn->MultizoneSurfaceCrackData(state.dataRoomAirModelMgr->TypeNum).exponent));
1177 : }
1178 : }
1179 : }
1180 : }
1181 : }
1182 : }
1183 :
1184 741 : void GetUFADZoneData(EnergyPlusData &state, bool &ErrorsFound) // True if errors found during this get input routine
1185 : {
1186 :
1187 : // SUBROUTINE INFORMATION:
1188 : // AUTHOR Fred Buhl
1189 : // DATE WRITTEN August 2005
1190 : // MODIFIED
1191 : // RE-ENGINEERED
1192 :
1193 : // PURPOSE OF THIS SUBROUTINE:
1194 : // Get UCSD UFAD interior zone model controls for all zones at once
1195 :
1196 : // METHODOLOGY EMPLOYED:
1197 : // Use input processor to get input from idf file
1198 :
1199 : // Using/Aliasing
1200 : using namespace ScheduleManager;
1201 :
1202 : // SUBROUTINE LOCAL VARIABLE DECLARATIONS:
1203 : int IOStat;
1204 : int NumAlpha;
1205 : int NumNumber;
1206 : int Loop;
1207 :
1208 741 : if (!state.dataRoomAirMod->UCSDModelUsed) {
1209 734 : state.dataRoomAirMod->TotUCSDUI = 0;
1210 734 : state.dataRoomAirMod->TotUCSDUE = 0;
1211 1474 : return;
1212 : }
1213 7 : auto &cCurrentModuleObject = state.dataIPShortCut->cCurrentModuleObject;
1214 7 : cCurrentModuleObject = "RoomAirSettings:UnderFloorAirDistributionInterior";
1215 7 : state.dataRoomAirMod->TotUCSDUI = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, cCurrentModuleObject);
1216 7 : cCurrentModuleObject = "RoomAirSettings:UnderFloorAirDistributionExterior";
1217 7 : state.dataRoomAirMod->TotUCSDUE = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, cCurrentModuleObject);
1218 :
1219 7 : if (state.dataRoomAirMod->TotUCSDUI <= 0 && state.dataRoomAirMod->TotUCSDUE <= 0) return;
1220 :
1221 1 : state.dataRoomAirMod->ZoneUCSDUI.allocate(state.dataRoomAirMod->TotUCSDUI);
1222 1 : state.dataRoomAirMod->ZoneUCSDUE.allocate(state.dataRoomAirMod->TotUCSDUE);
1223 1 : state.dataRoomAirMod->ZoneUFPtr.dimension(state.dataGlobal->NumOfZones, 0);
1224 :
1225 1 : cCurrentModuleObject = "RoomAirSettings:UnderFloorAirDistributionInterior";
1226 2 : for (Loop = 1; Loop <= state.dataRoomAirMod->TotUCSDUI; ++Loop) {
1227 6 : state.dataInputProcessing->inputProcessor->getObjectItem(state,
1228 : cCurrentModuleObject,
1229 : Loop,
1230 1 : state.dataIPShortCut->cAlphaArgs,
1231 : NumAlpha,
1232 1 : state.dataIPShortCut->rNumericArgs,
1233 : NumNumber,
1234 : IOStat,
1235 : _,
1236 1 : state.dataIPShortCut->lAlphaFieldBlanks,
1237 1 : state.dataIPShortCut->cAlphaFieldNames,
1238 1 : state.dataIPShortCut->cNumericFieldNames);
1239 : // First is Zone Name
1240 1 : state.dataRoomAirMod->ZoneUCSDUI(Loop).ZoneName = state.dataIPShortCut->cAlphaArgs(1);
1241 1 : state.dataRoomAirMod->ZoneUCSDUI(Loop).ZonePtr =
1242 1 : UtilityRoutines::FindItemInList(state.dataIPShortCut->cAlphaArgs(1), state.dataHeatBal->Zone);
1243 1 : state.dataRoomAirMod->ZoneUFPtr(state.dataRoomAirMod->ZoneUCSDUI(Loop).ZonePtr) = Loop;
1244 1 : if (state.dataRoomAirMod->ZoneUCSDUI(Loop).ZonePtr == 0) {
1245 0 : ShowSevereError(state, "Invalid " + state.dataIPShortCut->cAlphaFieldNames(1) + " = " + state.dataIPShortCut->cAlphaArgs(1));
1246 0 : ShowContinueError(state, "Entered in " + cCurrentModuleObject + " = " + state.dataIPShortCut->cAlphaArgs(1));
1247 0 : ShowContinueError(state, "Zone name was not found.");
1248 0 : ErrorsFound = true;
1249 : } else {
1250 1 : state.dataRoomAirMod->IsZoneUI(state.dataRoomAirMod->ZoneUCSDUI(Loop).ZonePtr) = true;
1251 : }
1252 : // 2nd alpha is diffuser type
1253 1 : if (UtilityRoutines::SameString(state.dataIPShortCut->cAlphaArgs(2), "Swirl")) {
1254 1 : state.dataRoomAirMod->ZoneUCSDUI(Loop).DiffuserType = Diffuser::Swirl;
1255 0 : } else if (UtilityRoutines::SameString(state.dataIPShortCut->cAlphaArgs(2), "VariableArea")) {
1256 0 : state.dataRoomAirMod->ZoneUCSDUI(Loop).DiffuserType = Diffuser::VarArea;
1257 0 : } else if (UtilityRoutines::SameString(state.dataIPShortCut->cAlphaArgs(2), "HorizontalSwirl")) {
1258 0 : state.dataRoomAirMod->ZoneUCSDUI(Loop).DiffuserType = Diffuser::DisplVent;
1259 0 : } else if (UtilityRoutines::SameString(state.dataIPShortCut->cAlphaArgs(2), "Custom")) {
1260 0 : state.dataRoomAirMod->ZoneUCSDUI(Loop).DiffuserType = Diffuser::Custom;
1261 0 : } else if (UtilityRoutines::SameString(state.dataIPShortCut->cAlphaArgs(2), "LinearBarGrille")) {
1262 0 : state.dataRoomAirMod->ZoneUCSDUI(Loop).DiffuserType = Diffuser::LinBarGrille;
1263 : } else {
1264 0 : ShowSevereError(state, "Invalid " + state.dataIPShortCut->cAlphaFieldNames(2) + " = " + state.dataIPShortCut->cAlphaArgs(2));
1265 0 : ShowContinueError(state, "Entered in " + cCurrentModuleObject + " = " + state.dataIPShortCut->cAlphaArgs(1));
1266 0 : ErrorsFound = true;
1267 : }
1268 : // 1st number is Number of Diffusers per Zone
1269 1 : state.dataRoomAirMod->ZoneUCSDUI(Loop).DiffusersPerZone = state.dataIPShortCut->rNumericArgs(1);
1270 : // 2nd number is Power per Plume
1271 1 : state.dataRoomAirMod->ZoneUCSDUI(Loop).PowerPerPlume = state.dataIPShortCut->rNumericArgs(2);
1272 : // 3rd number is Design Effective Area of Diffuser
1273 1 : state.dataRoomAirMod->ZoneUCSDUI(Loop).DiffArea = state.dataIPShortCut->rNumericArgs(3);
1274 : // 4th number is Diffuser Slot Angle from Vertical
1275 1 : state.dataRoomAirMod->ZoneUCSDUI(Loop).DiffAngle = state.dataIPShortCut->rNumericArgs(4);
1276 : // 5th number is Thermostat Height
1277 1 : state.dataRoomAirMod->ZoneUCSDUI(Loop).ThermostatHeight = state.dataIPShortCut->rNumericArgs(5);
1278 : // 6th number is Comfort Height
1279 1 : state.dataRoomAirMod->ZoneUCSDUI(Loop).ComfortHeight = state.dataIPShortCut->rNumericArgs(6);
1280 : // 7th number is Temperature Difference Threshold for Reporting
1281 1 : state.dataRoomAirMod->ZoneUCSDUI(Loop).TempTrigger = state.dataIPShortCut->rNumericArgs(7);
1282 : // 8th number user-specified transition height
1283 1 : state.dataRoomAirMod->ZoneUCSDUI(Loop).TransHeight = state.dataIPShortCut->rNumericArgs(8);
1284 : // 9th number is Coefficient A in formula Kc = A*Gamma**B + C + D*Gamma + E*Gamma**2
1285 1 : state.dataRoomAirMod->ZoneUCSDUI(Loop).A_Kc = state.dataIPShortCut->rNumericArgs(9);
1286 : // 10th number is Coefficient B in formula Kc = A*Gamma**B + C + D*Gamma + E*Gamma**2
1287 1 : state.dataRoomAirMod->ZoneUCSDUI(Loop).B_Kc = state.dataIPShortCut->rNumericArgs(10);
1288 : // 11th number is Coefficient C in formula Kc = A*Gamma**B + C + D*Gamma + E*Gamma**2
1289 1 : state.dataRoomAirMod->ZoneUCSDUI(Loop).C_Kc = state.dataIPShortCut->rNumericArgs(11);
1290 : // 12th number is Coefficient D in formula Kc = A*Gamma**B + C + D*Gamma + E*Gamma**2
1291 1 : state.dataRoomAirMod->ZoneUCSDUI(Loop).D_Kc = state.dataIPShortCut->rNumericArgs(12);
1292 : // 13th number is Coefficient E in formula Kc = A*Gamma**B + C + D*Gamma + E*Gamma**2
1293 1 : state.dataRoomAirMod->ZoneUCSDUI(Loop).E_Kc = state.dataIPShortCut->rNumericArgs(13);
1294 : }
1295 :
1296 1 : cCurrentModuleObject = "RoomAirSettings:UnderFloorAirDistributionExterior";
1297 5 : for (Loop = 1; Loop <= state.dataRoomAirMod->TotUCSDUE; ++Loop) {
1298 24 : state.dataInputProcessing->inputProcessor->getObjectItem(state,
1299 : cCurrentModuleObject,
1300 : Loop,
1301 4 : state.dataIPShortCut->cAlphaArgs,
1302 : NumAlpha,
1303 4 : state.dataIPShortCut->rNumericArgs,
1304 : NumNumber,
1305 : IOStat,
1306 : _,
1307 4 : state.dataIPShortCut->lAlphaFieldBlanks,
1308 4 : state.dataIPShortCut->cAlphaFieldNames,
1309 4 : state.dataIPShortCut->cNumericFieldNames);
1310 : // First is Zone Name
1311 4 : state.dataRoomAirMod->ZoneUCSDUE(Loop).ZoneName = state.dataIPShortCut->cAlphaArgs(1);
1312 4 : state.dataRoomAirMod->ZoneUCSDUE(Loop).ZonePtr =
1313 4 : UtilityRoutines::FindItemInList(state.dataIPShortCut->cAlphaArgs(1), state.dataHeatBal->Zone);
1314 4 : state.dataRoomAirMod->ZoneUFPtr(state.dataRoomAirMod->ZoneUCSDUE(Loop).ZonePtr) = Loop;
1315 4 : if (state.dataRoomAirMod->ZoneUCSDUE(Loop).ZonePtr == 0) {
1316 0 : ShowSevereError(state, "Invalid " + state.dataIPShortCut->cAlphaFieldNames(1) + " = " + state.dataIPShortCut->cAlphaArgs(1));
1317 0 : ShowContinueError(state, "Entered in " + cCurrentModuleObject + " = " + state.dataIPShortCut->cAlphaArgs(1));
1318 0 : ShowContinueError(state, "Zone name was not found.");
1319 0 : ErrorsFound = true;
1320 : } else {
1321 4 : state.dataRoomAirMod->IsZoneUI(state.dataRoomAirMod->ZoneUCSDUE(Loop).ZonePtr) = true;
1322 : }
1323 : // 2nd alpha is diffuser type
1324 4 : if (UtilityRoutines::SameString(state.dataIPShortCut->cAlphaArgs(2), "Swirl")) {
1325 0 : state.dataRoomAirMod->ZoneUCSDUE(Loop).DiffuserType = Diffuser::Swirl;
1326 4 : } else if (UtilityRoutines::SameString(state.dataIPShortCut->cAlphaArgs(2), "VariableArea")) {
1327 0 : state.dataRoomAirMod->ZoneUCSDUE(Loop).DiffuserType = Diffuser::VarArea;
1328 4 : } else if (UtilityRoutines::SameString(state.dataIPShortCut->cAlphaArgs(2), "HorizontalSwirl")) {
1329 0 : state.dataRoomAirMod->ZoneUCSDUE(Loop).DiffuserType = Diffuser::DisplVent;
1330 4 : } else if (UtilityRoutines::SameString(state.dataIPShortCut->cAlphaArgs(2), "Custom")) {
1331 0 : state.dataRoomAirMod->ZoneUCSDUE(Loop).DiffuserType = Diffuser::Custom;
1332 4 : } else if (UtilityRoutines::SameString(state.dataIPShortCut->cAlphaArgs(2), "LinearBarGrille")) {
1333 4 : state.dataRoomAirMod->ZoneUCSDUE(Loop).DiffuserType = Diffuser::LinBarGrille;
1334 : } else {
1335 0 : ShowSevereError(state, "Invalid " + state.dataIPShortCut->cAlphaFieldNames(2) + " = " + state.dataIPShortCut->cAlphaArgs(2));
1336 0 : ShowContinueError(state, "Entered in " + cCurrentModuleObject + " = " + state.dataIPShortCut->cAlphaArgs(1));
1337 0 : ErrorsFound = true;
1338 : }
1339 : // 1st number is Number of Diffusers per Zone
1340 4 : state.dataRoomAirMod->ZoneUCSDUE(Loop).DiffusersPerZone = state.dataIPShortCut->rNumericArgs(1);
1341 : // 2nd number is Power per Plume
1342 4 : state.dataRoomAirMod->ZoneUCSDUE(Loop).PowerPerPlume = state.dataIPShortCut->rNumericArgs(2);
1343 : // 3rd number is Design Effective Area of Diffuser
1344 4 : state.dataRoomAirMod->ZoneUCSDUE(Loop).DiffArea = state.dataIPShortCut->rNumericArgs(3);
1345 : // 4th number is Diffuser Slot Angle from Vertical
1346 4 : state.dataRoomAirMod->ZoneUCSDUE(Loop).DiffAngle = state.dataIPShortCut->rNumericArgs(4);
1347 : // 5th number is Thermostat Height
1348 4 : state.dataRoomAirMod->ZoneUCSDUE(Loop).ThermostatHeight = state.dataIPShortCut->rNumericArgs(5);
1349 : // 6th number is Comfort Height
1350 4 : state.dataRoomAirMod->ZoneUCSDUE(Loop).ComfortHeight = state.dataIPShortCut->rNumericArgs(6);
1351 : // 7th number is Temperature Difference Threshold for Reporting
1352 4 : state.dataRoomAirMod->ZoneUCSDUE(Loop).TempTrigger = state.dataIPShortCut->rNumericArgs(7);
1353 : // 8th number user-specified transition height
1354 4 : state.dataRoomAirMod->ZoneUCSDUE(Loop).TransHeight = state.dataIPShortCut->rNumericArgs(8);
1355 : // 9th number is Coefficient A in formula Kc = A*Gamma**B + C + D*Gamma + E*Gamma**2
1356 4 : state.dataRoomAirMod->ZoneUCSDUE(Loop).A_Kc = state.dataIPShortCut->rNumericArgs(9);
1357 : // 10th number is Coefficient B in formula Kc = A*Gamma**B + C + D*Gamma + E*Gamma**2
1358 4 : state.dataRoomAirMod->ZoneUCSDUE(Loop).B_Kc = state.dataIPShortCut->rNumericArgs(10);
1359 : // 11th number is Coefficient C in formula Kc = A*Gamma**B + C + D*Gamma + E*Gamma**2
1360 4 : state.dataRoomAirMod->ZoneUCSDUE(Loop).C_Kc = state.dataIPShortCut->rNumericArgs(11);
1361 : // 12th number is Coefficient D in formula Kc = A*Gamma**B + C + D*Gamma + E*Gamma**2
1362 4 : state.dataRoomAirMod->ZoneUCSDUE(Loop).D_Kc = state.dataIPShortCut->rNumericArgs(12);
1363 : // 13th number is Coefficient E in formula Kc = A*Gamma**B + C + D*Gamma + E*Gamma**2
1364 4 : state.dataRoomAirMod->ZoneUCSDUE(Loop).E_Kc = state.dataIPShortCut->rNumericArgs(13);
1365 : }
1366 : }
1367 :
1368 741 : void GetRoomAirflowNetworkData(EnergyPlusData &state, bool &ErrorsFound) // True if errors found during this get input routine
1369 : {
1370 :
1371 : // SUBROUTINE INFORMATION:
1372 : // AUTHOR Brent Griffith
1373 : // DATE WRITTEN November 2009
1374 : // MODIFIED na
1375 : // RE-ENGINEERED na
1376 :
1377 : // PURPOSE OF THIS SUBROUTINE:
1378 : // Get RoomAirflowNetwork data for all zones at once
1379 :
1380 : // METHODOLOGY EMPLOYED:
1381 : // Use input processor to get input from idf file
1382 :
1383 : // Using/Aliasing
1384 : using DataHVACGlobals::NumZoneHVACTerminalTypes;
1385 : using DataHVACGlobals::ZoneHVACTerminalTypes;
1386 : using InternalHeatGains::GetInternalGainDeviceIndex;
1387 : using ScheduleManager::GetScheduleIndex;
1388 :
1389 : // SUBROUTINE LOCAL VARIABLE DECLARATIONS:
1390 : int Loop; // local do loop index
1391 : int NumAlphas;
1392 : int NumNumbers;
1393 : int status;
1394 : int ZoneNum;
1395 : int thisAirNodeinZone;
1396 : int AlphaArgNum;
1397 : int AirCntrlNodeNum;
1398 : int TotNumOfRAFNNodeSurfLists;
1399 : int TotNumOfRAFNNodeGainsLists;
1400 : int TotNumOfRAFNNodeHVACLists;
1401 : int RAFNNodeNum;
1402 : bool foundList;
1403 : int NumSurfsThisNode;
1404 : int NumOfSurfs;
1405 : int gainsLoop;
1406 : int TypeNum;
1407 : int numEquip;
1408 : int EquipLoop;
1409 : int TotNumEquip;
1410 : bool IntEquipError;
1411 : Real64 SumFraction;
1412 742 : std::string Name;
1413 : int GainNum;
1414 : int RAFNNum;
1415 741 : auto &cCurrentModuleObject = state.dataIPShortCut->cCurrentModuleObject;
1416 741 : cCurrentModuleObject = "RoomAirSettings:AirflowNetwork";
1417 741 : state.dataRoomAirMod->NumOfRoomAirflowNetControl = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, cCurrentModuleObject);
1418 741 : if (state.dataRoomAirMod->NumOfRoomAirflowNetControl == 0) return;
1419 1 : if (state.dataRoomAirMod->NumOfRoomAirflowNetControl > state.dataGlobal->NumOfZones) {
1420 0 : ShowSevereError(state, "Too many " + cCurrentModuleObject + " objects in input file");
1421 0 : ShowContinueError(state, "There cannot be more " + cCurrentModuleObject + " objects than number of zones.");
1422 0 : ErrorsFound = true;
1423 : }
1424 :
1425 1 : if (!allocated(state.dataRoomAirMod->RoomAirflowNetworkZoneInfo)) {
1426 1 : state.dataRoomAirMod->RoomAirflowNetworkZoneInfo.allocate(state.dataGlobal->NumOfZones);
1427 : }
1428 :
1429 2 : for (Loop = 1; Loop <= state.dataRoomAirMod->NumOfRoomAirflowNetControl; ++Loop) {
1430 6 : state.dataInputProcessing->inputProcessor->getObjectItem(state,
1431 : cCurrentModuleObject,
1432 : Loop,
1433 1 : state.dataIPShortCut->cAlphaArgs,
1434 : NumAlphas,
1435 1 : state.dataIPShortCut->rNumericArgs,
1436 : NumNumbers,
1437 : status,
1438 : _,
1439 1 : state.dataIPShortCut->lAlphaFieldBlanks,
1440 1 : state.dataIPShortCut->cAlphaFieldNames,
1441 1 : state.dataIPShortCut->cNumericFieldNames);
1442 1 : ZoneNum = UtilityRoutines::FindItemInList(state.dataIPShortCut->cAlphaArgs(2), state.dataHeatBal->Zone, state.dataGlobal->NumOfZones);
1443 1 : if (ZoneNum == 0) {
1444 0 : ShowSevereError(state,
1445 0 : "GetRoomAirflowNetworkData: Invalid " + state.dataIPShortCut->cAlphaFieldNames(2) + " = " +
1446 0 : state.dataIPShortCut->cAlphaArgs(2));
1447 0 : ShowContinueError(state, "Entered in " + cCurrentModuleObject + " = " + state.dataIPShortCut->cAlphaArgs(2));
1448 0 : ShowContinueError(state, "Not a valid zone name.");
1449 0 : ErrorsFound = true;
1450 0 : continue;
1451 : }
1452 1 : if (state.dataRoomAirMod->AirModel(ZoneNum).AirModelType != DataRoomAirModel::RoomAirModel::AirflowNetwork) {
1453 0 : ShowSevereError(state,
1454 0 : "GetRoomAirflowNetworkData: Zone specified='" + state.dataIPShortCut->cAlphaArgs(1) +
1455 : "', Air Model type is not AirflowNetwork.");
1456 0 : ShowContinueError(
1457 0 : state, format("Air Model Type for zone ={}", ChAirModel[static_cast<int>(state.dataRoomAirMod->AirModel(ZoneNum).AirModelType)]));
1458 0 : ErrorsFound = true;
1459 0 : continue;
1460 : }
1461 1 : state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).ZoneID = ZoneNum;
1462 1 : state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).RAFNNum = Loop;
1463 1 : state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).IsUsed = true;
1464 1 : state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).Name = state.dataIPShortCut->cAlphaArgs(1);
1465 1 : state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).ZoneName = state.dataIPShortCut->cAlphaArgs(2); // Zone Name
1466 :
1467 1 : state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).NumOfAirNodes = (NumAlphas - 3);
1468 :
1469 1 : if (state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).NumOfAirNodes > 0) {
1470 2 : state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).Node.allocate(
1471 2 : state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).NumOfAirNodes);
1472 : } else {
1473 0 : ShowSevereError(
1474 0 : state, "GetRoomAirflowNetworkData: Incomplete input in " + cCurrentModuleObject + " = " + state.dataIPShortCut->cAlphaArgs(1));
1475 0 : ErrorsFound = true;
1476 : }
1477 :
1478 7 : for (thisAirNodeinZone = 1; thisAirNodeinZone <= state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).NumOfAirNodes;
1479 : ++thisAirNodeinZone) {
1480 6 : AlphaArgNum = thisAirNodeinZone + 3;
1481 12 : state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).Node(thisAirNodeinZone).Name =
1482 12 : state.dataIPShortCut->cAlphaArgs(AlphaArgNum);
1483 : }
1484 : // control point node
1485 2 : AirCntrlNodeNum = UtilityRoutines::FindItemInList(state.dataIPShortCut->cAlphaArgs(3),
1486 1 : state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).Node,
1487 1 : state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).NumOfAirNodes);
1488 1 : if (AirCntrlNodeNum == 0) {
1489 0 : ShowSevereError(state,
1490 0 : "GetRoomAirflowNetworkData: Invalid " + state.dataIPShortCut->cAlphaFieldNames(3) + " = " +
1491 0 : state.dataIPShortCut->cAlphaArgs(3));
1492 0 : ShowContinueError(state, "Entered in " + cCurrentModuleObject + " = " + state.dataIPShortCut->cAlphaArgs(1));
1493 0 : ShowContinueError(state, "Not a valid RoomAir:Node:AirflowNetwork name for this zone.");
1494 0 : ErrorsFound = true;
1495 0 : continue;
1496 : } else {
1497 1 : state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).ControlAirNodeID = AirCntrlNodeNum;
1498 : }
1499 1 : state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).totNumSurfs = 0;
1500 2 : for (int spaceNum : state.dataHeatBal->Zone(ZoneNum).spaceIndexes) {
1501 1 : auto &thisSpace = state.dataHeatBal->space(spaceNum);
1502 1 : state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).totNumSurfs += thisSpace.HTSurfaceLast - thisSpace.HTSurfaceFirst + 1;
1503 : }
1504 : } // loop thru NumOfRoomAirflowNetControl
1505 :
1506 1 : cCurrentModuleObject = "RoomAir:Node:AirflowNetwork";
1507 1 : state.dataRoomAirMod->TotNumOfRoomAFNNodes = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, cCurrentModuleObject);
1508 7 : for (Loop = 1; Loop <= state.dataRoomAirMod->TotNumOfRoomAFNNodes; ++Loop) {
1509 36 : state.dataInputProcessing->inputProcessor->getObjectItem(state,
1510 : cCurrentModuleObject,
1511 : Loop,
1512 6 : state.dataIPShortCut->cAlphaArgs,
1513 : NumAlphas,
1514 6 : state.dataIPShortCut->rNumericArgs,
1515 : NumNumbers,
1516 : status,
1517 : _,
1518 6 : state.dataIPShortCut->lAlphaFieldBlanks,
1519 6 : state.dataIPShortCut->cAlphaFieldNames,
1520 6 : state.dataIPShortCut->cNumericFieldNames);
1521 6 : ZoneNum = UtilityRoutines::FindItemInList(state.dataIPShortCut->cAlphaArgs(2), state.dataHeatBal->Zone, state.dataGlobal->NumOfZones);
1522 6 : if (ZoneNum == 0) {
1523 0 : ShowSevereError(state,
1524 0 : "GetRoomAirflowNetworkData: Invalid " + state.dataIPShortCut->cAlphaFieldNames(2) + " = " +
1525 0 : state.dataIPShortCut->cAlphaArgs(2));
1526 0 : ShowContinueError(state, "Entered in " + cCurrentModuleObject + " = " + state.dataIPShortCut->cAlphaArgs(1));
1527 0 : ShowContinueError(state, "Not a valid zone name.");
1528 0 : ErrorsFound = true;
1529 0 : continue;
1530 : }
1531 :
1532 12 : RAFNNodeNum = UtilityRoutines::FindItemInList(state.dataIPShortCut->cAlphaArgs(1),
1533 6 : state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).Node,
1534 6 : state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).NumOfAirNodes);
1535 6 : if (RAFNNodeNum == 0) {
1536 0 : ShowSevereError(state,
1537 0 : "GetRoomAirflowNetworkData: Invalid " + state.dataIPShortCut->cAlphaFieldNames(2) + " = " +
1538 0 : state.dataIPShortCut->cAlphaArgs(2));
1539 0 : ShowContinueError(state, "Entered in " + cCurrentModuleObject + " = " + state.dataIPShortCut->cAlphaArgs(1));
1540 0 : ShowContinueError(state, "Not a valid RoomAir:Node:AirflowNetwork name.");
1541 0 : ErrorsFound = true;
1542 0 : continue;
1543 : }
1544 :
1545 6 : state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).Node(RAFNNodeNum).ZoneVolumeFraction = state.dataIPShortCut->rNumericArgs(1);
1546 6 : if (!state.dataIPShortCut->lAlphaFieldBlanks(3)) {
1547 6 : state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).Node(RAFNNodeNum).NodeSurfListName = state.dataIPShortCut->cAlphaArgs(3);
1548 : } else {
1549 0 : state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).Node(RAFNNodeNum).HasSurfacesAssigned = false;
1550 : }
1551 6 : if (!state.dataIPShortCut->lAlphaFieldBlanks(4)) {
1552 12 : state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).Node(RAFNNodeNum).NodeIntGainsListName =
1553 12 : state.dataIPShortCut->cAlphaArgs(4);
1554 : } else {
1555 0 : state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).Node(RAFNNodeNum).HasIntGainsAssigned = false;
1556 : }
1557 6 : if (!state.dataIPShortCut->lAlphaFieldBlanks(5)) {
1558 6 : state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).Node(RAFNNodeNum).NodeHVACListName = state.dataIPShortCut->cAlphaArgs(5);
1559 : } else {
1560 0 : state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).Node(RAFNNodeNum).HasHVACAssigned = false;
1561 : }
1562 :
1563 : } // loop thru TotNumOfRoomAFNNodes
1564 :
1565 1 : cCurrentModuleObject = "RoomAir:Node:AirflowNetwork:AdjacentSurfaceList";
1566 1 : TotNumOfRAFNNodeSurfLists = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, cCurrentModuleObject);
1567 7 : for (Loop = 1; Loop <= TotNumOfRAFNNodeSurfLists; ++Loop) {
1568 6 : foundList = false;
1569 30 : state.dataInputProcessing->inputProcessor->getObjectItem(state,
1570 : cCurrentModuleObject,
1571 : Loop,
1572 6 : state.dataIPShortCut->cAlphaArgs,
1573 : NumAlphas,
1574 6 : state.dataIPShortCut->rNumericArgs,
1575 : NumNumbers,
1576 : status,
1577 : _,
1578 : _,
1579 6 : state.dataIPShortCut->cAlphaFieldNames,
1580 6 : state.dataIPShortCut->cNumericFieldNames);
1581 18 : for (ZoneNum = 1; ZoneNum <= state.dataGlobal->NumOfZones; ++ZoneNum) {
1582 : // find surface list
1583 18 : if (state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).NumOfAirNodes > 0) {
1584 12 : RAFNNodeNum = UtilityRoutines::FindItemInList(state.dataIPShortCut->cAlphaArgs(1),
1585 6 : state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).Node,
1586 : &RoomAirflowNetworkAirNodeNestedStruct::NodeSurfListName,
1587 6 : state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).NumOfAirNodes);
1588 : } else {
1589 12 : RAFNNodeNum = 0;
1590 : }
1591 18 : if (RAFNNodeNum > 0) { // found it
1592 6 : foundList = true;
1593 6 : NumSurfsThisNode = NumAlphas - 1;
1594 6 : NumOfSurfs = 0;
1595 12 : for (int spaceNum : state.dataHeatBal->Zone(ZoneNum).spaceIndexes) {
1596 6 : auto &thisSpace = state.dataHeatBal->space(spaceNum);
1597 6 : NumOfSurfs += thisSpace.HTSurfaceLast - thisSpace.HTSurfaceFirst + 1;
1598 : }
1599 6 : if (allocated(state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).Node(RAFNNodeNum).SurfMask)) {
1600 : // throw error found twice
1601 0 : ShowSevereError(state,
1602 0 : "GetRoomAirflowNetworkData: Invalid " + state.dataIPShortCut->cAlphaFieldNames(1) + " = " +
1603 0 : state.dataIPShortCut->cAlphaArgs(1));
1604 0 : ShowContinueError(state, "Entered in " + cCurrentModuleObject + " = " + state.dataIPShortCut->cAlphaArgs(1));
1605 0 : ShowContinueError(state, "Duplicate RoomAir:Node:AirflowNetwork:AdjacentSurfaceList name.");
1606 0 : ErrorsFound = true;
1607 : } else {
1608 6 : state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum)
1609 6 : .Node(RAFNNodeNum)
1610 6 : .SurfMask.allocate(state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).totNumSurfs);
1611 6 : state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).Node(RAFNNodeNum).SurfMask = false; // init
1612 6 : state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).Node(RAFNNodeNum).HasSurfacesAssigned = true;
1613 : // relate surfaces to this air node and check to see whether surface names are specified correctly or not
1614 6 : int SurfCount = 0;
1615 6 : int thisSurfinZone = 0;
1616 6 : bool surfaceFound = false;
1617 12 : for (int ListSurfNum = 2; ListSurfNum <= NumAlphas; ++ListSurfNum) {
1618 6 : for (int spaceNum : state.dataHeatBal->Zone(ZoneNum).spaceIndexes) {
1619 6 : auto &thisSpace = state.dataHeatBal->space(spaceNum);
1620 48 : for (int SurfNum = thisSpace.HTSurfaceFirst; SurfNum <= thisSpace.HTSurfaceLast; ++SurfNum) {
1621 48 : ++thisSurfinZone;
1622 48 : if (state.dataIPShortCut->cAlphaArgs(ListSurfNum) == state.dataSurface->Surface(SurfNum).Name) {
1623 6 : state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).Node(RAFNNodeNum).SurfMask(thisSurfinZone) = true;
1624 6 : ++SurfCount;
1625 6 : surfaceFound = true;
1626 6 : break;
1627 : }
1628 : }
1629 6 : if (surfaceFound) break;
1630 : }
1631 : }
1632 6 : if (NumSurfsThisNode != SurfCount) {
1633 0 : ShowSevereError(state,
1634 0 : "GetRoomAirflowNetworkData: Invalid " + state.dataIPShortCut->cAlphaFieldNames(1) + " = " +
1635 0 : state.dataIPShortCut->cAlphaArgs(1));
1636 0 : ShowContinueError(state, "Entered in " + cCurrentModuleObject + " = " + state.dataIPShortCut->cAlphaArgs(1));
1637 0 : ShowContinueError(state, "Some surface names were not found in the zone");
1638 0 : ErrorsFound = true;
1639 : }
1640 : }
1641 6 : break;
1642 : }
1643 : } // loop over zones
1644 6 : if (!foundList) { // throw error
1645 0 : ShowSevereError(state,
1646 0 : "GetRoomAirflowNetworkData: Invalid " + state.dataIPShortCut->cAlphaFieldNames(1) + " = " +
1647 0 : state.dataIPShortCut->cAlphaArgs(1));
1648 0 : ShowContinueError(state, "Entered in " + cCurrentModuleObject + " = " + state.dataIPShortCut->cAlphaArgs(1));
1649 0 : ShowContinueError(state, "Did not find a RoomAir:Node:AirflowNetwork object that references this object");
1650 0 : ErrorsFound = true;
1651 : }
1652 : } // loop thru TotNumOfRAFNNodeSurfLists
1653 :
1654 1 : cCurrentModuleObject = "RoomAir:Node:AirflowNetwork:InternalGains";
1655 1 : TotNumOfRAFNNodeGainsLists = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, cCurrentModuleObject);
1656 7 : for (Loop = 1; Loop <= TotNumOfRAFNNodeGainsLists; ++Loop) {
1657 6 : foundList = false;
1658 30 : state.dataInputProcessing->inputProcessor->getObjectItem(state,
1659 : cCurrentModuleObject,
1660 : Loop,
1661 6 : state.dataIPShortCut->cAlphaArgs,
1662 : NumAlphas,
1663 6 : state.dataIPShortCut->rNumericArgs,
1664 : NumNumbers,
1665 : status,
1666 : _,
1667 : _,
1668 6 : state.dataIPShortCut->cAlphaFieldNames,
1669 6 : state.dataIPShortCut->cNumericFieldNames);
1670 6 : if (mod((NumAlphas + NumNumbers - 1), 3) != 0) {
1671 0 : ShowSevereError(state, "GetRoomAirflowNetworkData: For " + cCurrentModuleObject + ": " + state.dataIPShortCut->cAlphaArgs(1));
1672 0 : ShowContinueError(state,
1673 0 : "Extensible field set are not evenly divisable by 3. Number of data entries = " +
1674 0 : fmt::to_string(NumAlphas + NumNumbers - 1));
1675 0 : ErrorsFound = true;
1676 0 : break;
1677 : }
1678 36 : for (ZoneNum = 1; ZoneNum <= state.dataGlobal->NumOfZones; ++ZoneNum) {
1679 : // find surface list
1680 30 : if (state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).NumOfAirNodes > 0) {
1681 12 : RAFNNodeNum = UtilityRoutines::FindItemInList(state.dataIPShortCut->cAlphaArgs(1),
1682 6 : state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).Node,
1683 : &RoomAirflowNetworkAirNodeNestedStruct::NodeIntGainsListName,
1684 6 : state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).NumOfAirNodes);
1685 : } else {
1686 24 : RAFNNodeNum = 0;
1687 : }
1688 30 : if (RAFNNodeNum > 0) { // found it
1689 6 : foundList = true;
1690 6 : int numInputGains = (NumAlphas + NumNumbers - 1) / 3;
1691 6 : int numSpacesInZone = state.dataHeatBal->Zone(ZoneNum).numSpaces;
1692 6 : int maxNumGains = numInputGains * numSpacesInZone;
1693 6 : if (allocated(state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).Node(RAFNNodeNum).IntGain)) {
1694 0 : ShowSevereError(state,
1695 0 : "GetRoomAirflowNetworkData: Invalid " + state.dataIPShortCut->cAlphaFieldNames(1) + " = " +
1696 0 : state.dataIPShortCut->cAlphaArgs(1));
1697 0 : ShowContinueError(state, "Entered in " + cCurrentModuleObject + " = " + state.dataIPShortCut->cAlphaArgs(1));
1698 0 : ShowContinueError(state, "Duplicate " + cCurrentModuleObject + " name.");
1699 0 : ErrorsFound = true;
1700 : } else {
1701 6 : state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).Node(RAFNNodeNum).IntGain.allocate(maxNumGains);
1702 6 : state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).Node(RAFNNodeNum).IntGainsDeviceIndices.allocate(maxNumGains);
1703 6 : state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).Node(RAFNNodeNum).intGainsDeviceSpaces.allocate(maxNumGains);
1704 6 : state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).Node(RAFNNodeNum).IntGainsFractions.allocate(maxNumGains);
1705 6 : state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).Node(RAFNNodeNum).HasIntGainsAssigned = true;
1706 6 : int numGainsFound = 0;
1707 24 : for (gainsLoop = 1; gainsLoop <= numInputGains; ++gainsLoop) {
1708 36 : TypeNum = getEnumerationValue(DataHeatBalance::IntGainTypeNamesUC,
1709 54 : UtilityRoutines::MakeUPPERCase(state.dataIPShortCut->cAlphaArgs(gainsLoop * 2)));
1710 18 : if (TypeNum >= 0) {
1711 18 : state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).Node(RAFNNodeNum).IntGain(gainsLoop).Type =
1712 : static_cast<DataHeatBalance::IntGainType>(TypeNum);
1713 : } else {
1714 0 : ShowSevereError(state,
1715 0 : "GetRoomAirflowNetworkData: Invalid " + state.dataIPShortCut->cAlphaFieldNames(gainsLoop * 2) +
1716 0 : " = " + state.dataIPShortCut->cAlphaArgs(gainsLoop * 2));
1717 0 : ShowContinueError(state, "Entered in " + cCurrentModuleObject + " = " + state.dataIPShortCut->cAlphaArgs(1));
1718 0 : ShowContinueError(state, "incorrect type of internal gain");
1719 0 : ErrorsFound = true;
1720 0 : continue;
1721 : }
1722 36 : state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).Node(RAFNNodeNum).IntGain(gainsLoop).Name =
1723 36 : state.dataIPShortCut->cAlphaArgs(gainsLoop * 2 + 1);
1724 :
1725 18 : bool gainFound = false;
1726 : // check all spaces in this zone for matching gains
1727 36 : for (int spaceNum : state.dataHeatBal->Zone(ZoneNum).spaceIndexes) {
1728 : // verify type and name and get pointer to device in internal gains structure array
1729 36 : int intGainIndex = GetInternalGainDeviceIndex(
1730 : state,
1731 : spaceNum,
1732 18 : state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).Node(RAFNNodeNum).IntGain(gainsLoop).Type,
1733 36 : state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).Node(RAFNNodeNum).IntGain(gainsLoop).Name);
1734 18 : if (intGainIndex >= 0) {
1735 18 : gainFound = true;
1736 18 : ++numGainsFound;
1737 18 : state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).Node(RAFNNodeNum).intGainsDeviceSpaces(numGainsFound) =
1738 : spaceNum;
1739 18 : state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).Node(RAFNNodeNum).IntGainsDeviceIndices(numGainsFound) =
1740 : intGainIndex;
1741 18 : state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).Node(RAFNNodeNum).IntGainsFractions(numGainsFound) =
1742 18 : state.dataIPShortCut->rNumericArgs(gainsLoop);
1743 : }
1744 : }
1745 18 : if (gainFound) {
1746 18 : state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).Node(RAFNNodeNum).NumIntGains = numGainsFound;
1747 : } else {
1748 0 : ShowSevereError(state,
1749 0 : "GetRoomAirflowNetworkData: Invalid " + state.dataIPShortCut->cAlphaFieldNames(gainsLoop * 2 + 1) +
1750 0 : " = " + state.dataIPShortCut->cAlphaArgs(gainsLoop * 2 + 1));
1751 0 : ShowContinueError(state, "Entered in " + cCurrentModuleObject + " = " + state.dataIPShortCut->cAlphaArgs(1));
1752 0 : ShowContinueError(state, "Internal gain did not match correctly");
1753 0 : ErrorsFound = true;
1754 : }
1755 : }
1756 : }
1757 : }
1758 : }
1759 : } // loop thru TotNumOfRAFNNodeGainsLists
1760 :
1761 : // Get data of HVAC equipment
1762 1 : cCurrentModuleObject = "RoomAir:Node:AirflowNetwork:HVACEquipment";
1763 1 : TotNumOfRAFNNodeHVACLists = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, cCurrentModuleObject);
1764 7 : for (Loop = 1; Loop <= TotNumOfRAFNNodeHVACLists; ++Loop) {
1765 30 : state.dataInputProcessing->inputProcessor->getObjectItem(state,
1766 : cCurrentModuleObject,
1767 : Loop,
1768 6 : state.dataIPShortCut->cAlphaArgs,
1769 : NumAlphas,
1770 6 : state.dataIPShortCut->rNumericArgs,
1771 : NumNumbers,
1772 : status,
1773 : _,
1774 : _,
1775 6 : state.dataIPShortCut->cAlphaFieldNames,
1776 6 : state.dataIPShortCut->cNumericFieldNames);
1777 6 : if (mod((NumAlphas + NumNumbers - 1), 4) != 0) {
1778 0 : ShowSevereError(state, "GetRoomAirflowNetworkData: For " + cCurrentModuleObject + ": " + state.dataIPShortCut->cAlphaArgs(1));
1779 0 : ShowContinueError(state,
1780 0 : "Extensible field set are not evenly divisable by 4. Number of data entries = " +
1781 0 : fmt::to_string(NumAlphas + NumNumbers - 1));
1782 0 : ErrorsFound = true;
1783 0 : break;
1784 : }
1785 36 : for (ZoneNum = 1; ZoneNum <= state.dataGlobal->NumOfZones; ++ZoneNum) {
1786 : // find surface list
1787 30 : if (state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).NumOfAirNodes > 0) {
1788 12 : RAFNNodeNum = UtilityRoutines::FindItemInList(state.dataIPShortCut->cAlphaArgs(1),
1789 6 : state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).Node,
1790 : &RoomAirflowNetworkAirNodeNestedStruct::NodeHVACListName,
1791 6 : state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).NumOfAirNodes);
1792 : } else {
1793 24 : RAFNNodeNum = 0;
1794 : }
1795 30 : if (RAFNNodeNum > 0) { // found it
1796 6 : foundList = true;
1797 6 : numEquip = (NumAlphas + NumNumbers - 1) / 4;
1798 6 : state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).Node(RAFNNodeNum).NumHVACs = numEquip;
1799 6 : if (allocated(state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).Node(RAFNNodeNum).HVAC)) {
1800 0 : ShowSevereError(state,
1801 0 : "GetRoomAirflowNetworkData: Invalid " + state.dataIPShortCut->cAlphaFieldNames(1) + " = " +
1802 0 : state.dataIPShortCut->cAlphaArgs(1));
1803 0 : ShowContinueError(state, "Entered in " + cCurrentModuleObject + " = " + state.dataIPShortCut->cAlphaArgs(1));
1804 0 : ShowContinueError(state, "Duplicate " + cCurrentModuleObject + " name.");
1805 0 : ErrorsFound = true;
1806 : } else {
1807 6 : state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).Node(RAFNNodeNum).HVAC.allocate(numEquip);
1808 6 : state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).Node(RAFNNodeNum).HasHVACAssigned = true;
1809 12 : for (EquipLoop = 1; EquipLoop <= numEquip; ++EquipLoop) {
1810 6 : TypeNum = UtilityRoutines::FindItemInList(
1811 6 : state.dataIPShortCut->cAlphaArgs(2 + (EquipLoop - 1) * 2), ZoneHVACTerminalTypes, NumZoneHVACTerminalTypes);
1812 6 : if (TypeNum > 0) {
1813 6 : state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).Node(RAFNNodeNum).HVAC(EquipLoop).TypeOfNum = TypeNum;
1814 : } else {
1815 0 : ShowSevereError(state,
1816 0 : "GetRoomAirflowNetworkData: Invalid " +
1817 0 : state.dataIPShortCut->cAlphaFieldNames(2 + (EquipLoop - 1) * 2) + " = " +
1818 0 : state.dataIPShortCut->cAlphaArgs(2 + (EquipLoop - 1) * 2));
1819 0 : ShowContinueError(state, "Entered in " + cCurrentModuleObject + " = " + state.dataIPShortCut->cAlphaArgs(1));
1820 0 : ShowContinueError(state, "incorrect type of HVACEquipment");
1821 0 : ErrorsFound = true;
1822 : }
1823 12 : state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).Node(RAFNNodeNum).HVAC(EquipLoop).ObjectTypeName =
1824 12 : state.dataIPShortCut->cAlphaArgs(2 + (EquipLoop - 1) * 2);
1825 12 : state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).Node(RAFNNodeNum).HVAC(EquipLoop).Name =
1826 12 : state.dataIPShortCut->cAlphaArgs(3 + (EquipLoop - 1) * 2);
1827 :
1828 : // verify type and name and get pointer to device in HVAC equipment type and name structure array
1829 6 : TotNumEquip = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, ZoneHVACTerminalTypes(TypeNum));
1830 6 : if (TotNumEquip == 0) {
1831 0 : ShowSevereError(state,
1832 0 : "GetRoomAirflowNetworkData: No such " +
1833 0 : state.dataIPShortCut->cAlphaFieldNames(2 + (EquipLoop - 1) * 2) + " = " +
1834 0 : state.dataIPShortCut->cAlphaArgs(2 + (EquipLoop - 1) * 2));
1835 0 : ShowContinueError(
1836 0 : state, "is available in the input file in " + cCurrentModuleObject + " = " + state.dataIPShortCut->cAlphaArgs(1));
1837 0 : ErrorsFound = true;
1838 : }
1839 6 : state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).Node(RAFNNodeNum).HVAC(EquipLoop).SupplyFraction =
1840 6 : state.dataIPShortCut->rNumericArgs(1 + (EquipLoop - 1) * 2);
1841 6 : state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).Node(RAFNNodeNum).HVAC(EquipLoop).ReturnFraction =
1842 6 : state.dataIPShortCut->rNumericArgs(2 + (EquipLoop - 1) * 2);
1843 :
1844 24 : IntEquipError = CheckEquipName(
1845 : state,
1846 6 : state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).Node(RAFNNodeNum).HVAC(EquipLoop).ObjectTypeName,
1847 6 : state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).Node(RAFNNodeNum).HVAC(EquipLoop).Name,
1848 6 : state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).Node(RAFNNodeNum).HVAC(EquipLoop).SupplyNodeName,
1849 6 : state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).Node(RAFNNodeNum).HVAC(EquipLoop).ReturnNodeName,
1850 : TotNumEquip,
1851 : TypeNum);
1852 :
1853 6 : if (!IntEquipError) {
1854 0 : ShowSevereError(state,
1855 0 : "GetRoomAirflowNetworkData: Invalid " +
1856 0 : state.dataIPShortCut->cAlphaFieldNames(3 + (EquipLoop - 1) * 2) + " = " +
1857 0 : state.dataIPShortCut->cAlphaArgs(2 + (EquipLoop - 1) * 2));
1858 0 : ShowContinueError(state, "Entered in " + cCurrentModuleObject + " = " + state.dataIPShortCut->cAlphaArgs(1));
1859 0 : ShowContinueError(state, "Internal gain did not match correctly");
1860 0 : ErrorsFound = true;
1861 : }
1862 : //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1863 : // TYPE RoomAirflowNetworkHVACStruct
1864 : // INTEGER::EquipConfigIndex = 0
1865 : }
1866 : }
1867 : }
1868 : }
1869 : } // loop thru TotNumOfRAFNNodeHVACLists
1870 :
1871 : // do some checks on input data
1872 6 : for (ZoneNum = 1; ZoneNum <= state.dataGlobal->NumOfZones; ++ZoneNum) {
1873 5 : if (state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).NumOfAirNodes > 0) {
1874 : // Check zone volume fraction
1875 1 : SumFraction = 0.0;
1876 7 : for (RAFNNodeNum = 1; RAFNNodeNum <= state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).NumOfAirNodes; ++RAFNNodeNum) {
1877 6 : SumFraction = SumFraction + state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).Node(RAFNNodeNum).ZoneVolumeFraction;
1878 : }
1879 1 : if (std::abs(SumFraction - 1.0) > 0.001) {
1880 0 : ShowSevereError(state, "GetRoomAirflowNetworkData: Invalid, zone volume fractions do not sum to 1.0");
1881 0 : ShowContinueError(state, "Entered in RoomAir:Node:AirflowNetwork with Zone Name = " + state.dataHeatBal->Zone(ZoneNum).Name);
1882 0 : ShowContinueError(state, "The Fraction of Zone Air Volume values across all the nodes needs to sum to 1.0.");
1883 0 : ShowContinueError(state, format("The sum of fractions entered = {:.3R}", SumFraction));
1884 0 : ErrorsFound = true;
1885 : }
1886 : // Check internal gain fraction
1887 7 : for (RAFNNodeNum = 1; RAFNNodeNum <= state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).NumOfAirNodes; ++RAFNNodeNum) {
1888 24 : for (gainsLoop = 1; gainsLoop <= state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).Node(RAFNNodeNum).NumIntGains;
1889 : ++gainsLoop) {
1890 18 : if (state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).Node(RAFNNodeNum).IntGain(gainsLoop).FractionCheck) continue;
1891 3 : SumFraction = state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).Node(RAFNNodeNum).IntGainsFractions(gainsLoop);
1892 3 : TypeNum =
1893 3 : static_cast<int>(state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).Node(RAFNNodeNum).IntGain(gainsLoop).Type);
1894 3 : Name = state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).Node(RAFNNodeNum).IntGain(gainsLoop).Name;
1895 3 : state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).Node(RAFNNodeNum).IntGain(gainsLoop).FractionCheck = true;
1896 21 : for (RAFNNum = 1; RAFNNum <= state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).NumOfAirNodes; ++RAFNNum) {
1897 72 : for (GainNum = 1; GainNum <= state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).Node(RAFNNum).NumIntGains;
1898 : ++GainNum) {
1899 54 : if (state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).Node(RAFNNum).IntGain(GainNum).FractionCheck) continue;
1900 33 : if (TypeNum == static_cast<int>(
1901 48 : state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).Node(RAFNNum).IntGain(GainNum).Type) &&
1902 15 : UtilityRoutines::SameString(
1903 15 : Name, state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).Node(RAFNNum).IntGain(GainNum).Name)) {
1904 15 : SumFraction += state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).Node(RAFNNum).IntGainsFractions(GainNum);
1905 15 : state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).Node(RAFNNum).IntGain(GainNum).FractionCheck = true;
1906 : }
1907 : }
1908 : }
1909 3 : if (std::abs(SumFraction - 1.0) > 0.001) {
1910 0 : ShowSevereError(state, "GetRoomAirflowNetworkData: Invalid, internal gain fractions do not sum to 1.0");
1911 0 : ShowContinueError(state,
1912 0 : "Entered in RoomAir:Node:AirflowNetwork with Zone Name = " + state.dataHeatBal->Zone(ZoneNum).Name +
1913 0 : ", Intrnal gain name = " + Name);
1914 0 : ShowContinueError(state, "The Fraction of internal gain across all the nodes needs to sum to 1.0.");
1915 0 : ShowContinueError(state, format("The sum of fractions entered = {:.3R}", SumFraction));
1916 0 : ErrorsFound = true;
1917 : }
1918 : }
1919 : }
1920 : }
1921 : }
1922 :
1923 1 : if (!ErrorsFound) {
1924 6 : for (ZoneNum = 1; ZoneNum <= state.dataGlobal->NumOfZones; ++ZoneNum) {
1925 5 : if (state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).IsUsed) {
1926 1 : if (state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).NumOfAirNodes > 0) {
1927 7 : for (Loop = 1; Loop <= state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).NumOfAirNodes; ++Loop) {
1928 24 : SetupOutputVariable(state,
1929 : "RoomAirflowNetwork Node Temperature",
1930 : OutputProcessor::Unit::C,
1931 6 : state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).Node(Loop).AirTemp,
1932 : OutputProcessor::SOVTimeStepType::HVAC,
1933 : OutputProcessor::SOVStoreType::Average,
1934 12 : state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).Node(Loop).Name);
1935 24 : SetupOutputVariable(state,
1936 : "RoomAirflowNetwork Node Humidity Ratio",
1937 : OutputProcessor::Unit::kgWater_kgDryAir,
1938 6 : state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).Node(Loop).HumRat,
1939 : OutputProcessor::SOVTimeStepType::HVAC,
1940 : OutputProcessor::SOVStoreType::Average,
1941 12 : state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).Node(Loop).Name);
1942 24 : SetupOutputVariable(state,
1943 : "RoomAirflowNetwork Node Relative Humidity",
1944 : OutputProcessor::Unit::Perc,
1945 6 : state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).Node(Loop).RelHumidity,
1946 : OutputProcessor::SOVTimeStepType::HVAC,
1947 : OutputProcessor::SOVStoreType::Average,
1948 12 : state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(ZoneNum).Node(Loop).Name);
1949 : }
1950 : }
1951 : }
1952 : }
1953 : }
1954 : }
1955 :
1956 43671 : void SharedDVCVUFDataInit(EnergyPlusData &state, int const ZoneNum)
1957 : {
1958 :
1959 : // SUBROUTINE INFORMATION:
1960 : // AUTHOR Linda Lawrie
1961 : // DATE WRITTEN March 2005
1962 : // MODIFIED Aug, 2013, Sam Brunswick -- for RoomAirCrossCrossVent modifications
1963 : // RE-ENGINEERED na
1964 :
1965 : // PURPOSE OF THIS SUBROUTINE:
1966 : // This routine allocates and initializes(?) the data that is shared between the
1967 : // UCSD models (DV and CV)
1968 :
1969 : // METHODOLOGY EMPLOYED:
1970 : // na
1971 :
1972 : // REFERENCES:
1973 : // na
1974 :
1975 : // Using/Aliasing
1976 : using namespace DataEnvironment;
1977 : using namespace DataSurfaces;
1978 : using Psychrometrics::PsyRhoAirFnPbTdbW;
1979 :
1980 : // Locals
1981 : // SUBROUTINE ARGUMENT DEFINITIONS:
1982 :
1983 : // SUBROUTINE PARAMETER DEFINITIONS:
1984 43671 : Real64 constexpr BaseDischargeCoef(0.62);
1985 :
1986 : // INTERFACE BLOCK SPECIFICATIONS:
1987 : // na
1988 :
1989 : // DERIVED TYPE DEFINITIONS:
1990 : // na
1991 :
1992 : // SUBROUTINE LOCAL VARIABLE DECLARATIONS:
1993 : bool SetZoneAux;
1994 87342 : Array1D_int AuxSurf;
1995 : int MaxSurf;
1996 87342 : Array2D_int AuxAirflowNetworkSurf;
1997 : Real64 WidthFactMax;
1998 : Real64 HeightFactMax;
1999 : Real64 WidthFact;
2000 : Real64 HeightFact;
2001 : int ZoneEquipConfigNum; // counter
2002 : Real64 AinCV;
2003 : int AirflowNetworkSurfPtr;
2004 : int NSides;
2005 :
2006 : // Do the one time initializations
2007 43671 : if (state.dataRoomAirModelMgr->MyOneTimeFlag) {
2008 :
2009 7 : state.dataRoomAirModelMgr->MyEnvrnFlag.allocate(state.dataGlobal->NumOfZones);
2010 :
2011 7 : state.dataUCSDShared->APos_Wall.allocate(state.dataSurface->TotSurfaces);
2012 7 : state.dataUCSDShared->APos_Floor.allocate(state.dataSurface->TotSurfaces);
2013 7 : state.dataUCSDShared->APos_Ceiling.allocate(state.dataSurface->TotSurfaces);
2014 7 : state.dataUCSDShared->PosZ_Wall.allocate(state.dataGlobal->NumOfZones * 2);
2015 7 : state.dataUCSDShared->PosZ_Floor.allocate(state.dataGlobal->NumOfZones * 2);
2016 7 : state.dataUCSDShared->PosZ_Ceiling.allocate(state.dataGlobal->NumOfZones * 2);
2017 7 : state.dataUCSDShared->APos_Window.allocate(state.dataSurface->TotSurfaces);
2018 7 : state.dataUCSDShared->APos_Door.allocate(state.dataSurface->TotSurfaces);
2019 7 : state.dataUCSDShared->APos_Internal.allocate(state.dataSurface->TotSurfaces);
2020 7 : state.dataUCSDShared->PosZ_Window.allocate(state.dataGlobal->NumOfZones * 2);
2021 7 : state.dataUCSDShared->PosZ_Door.allocate(state.dataGlobal->NumOfZones * 2);
2022 7 : state.dataUCSDShared->PosZ_Internal.allocate(state.dataGlobal->NumOfZones * 2);
2023 7 : state.dataUCSDShared->HCeiling.allocate(state.dataSurface->TotSurfaces);
2024 7 : state.dataUCSDShared->HWall.allocate(state.dataSurface->TotSurfaces);
2025 7 : state.dataUCSDShared->HFloor.allocate(state.dataSurface->TotSurfaces);
2026 7 : state.dataUCSDShared->HInternal.allocate(state.dataSurface->TotSurfaces);
2027 7 : state.dataUCSDShared->HWindow.allocate(state.dataSurface->TotSurfaces);
2028 7 : state.dataUCSDShared->HDoor.allocate(state.dataSurface->TotSurfaces);
2029 :
2030 7 : AuxSurf.allocate(state.dataGlobal->NumOfZones);
2031 :
2032 7 : state.dataRoomAirMod->ZoneCeilingHeight.allocate(state.dataGlobal->NumOfZones * 2);
2033 7 : state.dataRoomAirMod->ZoneCeilingHeight = 0.0;
2034 :
2035 : // Arrays initializations
2036 7 : state.dataUCSDShared->APos_Wall = 0;
2037 7 : state.dataUCSDShared->APos_Floor = 0;
2038 7 : state.dataUCSDShared->APos_Ceiling = 0;
2039 7 : state.dataUCSDShared->PosZ_Wall = 0;
2040 7 : state.dataUCSDShared->PosZ_Floor = 0;
2041 7 : state.dataUCSDShared->PosZ_Ceiling = 0;
2042 7 : state.dataUCSDShared->APos_Window = 0;
2043 7 : state.dataUCSDShared->APos_Door = 0;
2044 7 : state.dataUCSDShared->APos_Internal = 0;
2045 7 : state.dataUCSDShared->PosZ_Window = 0;
2046 7 : state.dataUCSDShared->PosZ_Door = 0;
2047 7 : state.dataUCSDShared->PosZ_Internal = 0;
2048 7 : state.dataUCSDShared->HCeiling = 0.0;
2049 7 : state.dataUCSDShared->HWall = 0.0;
2050 7 : state.dataUCSDShared->HFloor = 0.0;
2051 7 : state.dataUCSDShared->HInternal = 0.0;
2052 7 : state.dataUCSDShared->HWindow = 0.0;
2053 7 : state.dataUCSDShared->HDoor = 0.0;
2054 :
2055 : // Put the surface and zone information in Apos and PosZ arrays
2056 20 : for (int ZNum = 1; ZNum <= state.dataGlobal->NumOfZones; ++ZNum) {
2057 : // advance ONE position in the arrays PosZ because this is a new zone
2058 13 : state.dataRoomAirModelMgr->contWallBegin = state.dataRoomAirModelMgr->contWall + 1;
2059 13 : state.dataRoomAirModelMgr->contFloorBegin = state.dataRoomAirModelMgr->contFloor + 1;
2060 13 : state.dataRoomAirModelMgr->contCeilingBegin = state.dataRoomAirModelMgr->contCeiling + 1;
2061 13 : state.dataRoomAirModelMgr->contWindowBegin = state.dataRoomAirModelMgr->contWindow + 1;
2062 13 : state.dataRoomAirModelMgr->contInternalBegin = state.dataRoomAirModelMgr->contInternal + 1;
2063 13 : state.dataRoomAirModelMgr->contDoorBegin = state.dataRoomAirModelMgr->contDoor + 1;
2064 13 : SetZoneAux = true;
2065 :
2066 : // cycle in this zone for all the surfaces
2067 26 : for (int spaceNum : state.dataHeatBal->Zone(ZNum).spaceIndexes) {
2068 13 : auto &thisSpace = state.dataHeatBal->space(spaceNum);
2069 131 : for (int SurfNum = thisSpace.HTSurfaceFirst; SurfNum <= thisSpace.HTSurfaceLast; ++SurfNum) {
2070 118 : if (state.dataSurface->Surface(SurfNum).Class != DataSurfaces::SurfaceClass::IntMass) {
2071 : // Recalculate lowest and highest height for the zone
2072 113 : state.dataRoomAirModelMgr->Z1ofZone = std::numeric_limits<Real64>::max();
2073 113 : state.dataRoomAirModelMgr->Z2ofZone = std::numeric_limits<Real64>::lowest();
2074 565 : for (int i = 1, u = state.dataSurface->Surface(SurfNum).Sides; i <= u; ++i) {
2075 452 : Real64 const z_i(state.dataSurface->Surface(SurfNum).Vertex(i).z);
2076 452 : state.dataRoomAirModelMgr->Z1ofZone = std::min(state.dataRoomAirModelMgr->Z1ofZone, z_i);
2077 452 : state.dataRoomAirModelMgr->Z2ofZone = std::max(state.dataRoomAirModelMgr->Z2ofZone, z_i);
2078 : }
2079 : }
2080 :
2081 118 : if (SetZoneAux) {
2082 : // lowest height for the zone (for the first surface of the zone)
2083 13 : state.dataRoomAirModelMgr->Z1ofZoneAux = state.dataRoomAirModelMgr->Z1ofZone;
2084 : // highest height for the zone (for the first surface of the zone)
2085 13 : state.dataRoomAirModelMgr->Z2ofZoneAux = state.dataRoomAirModelMgr->Z2ofZone;
2086 13 : SetZoneAux = false;
2087 : }
2088 :
2089 118 : if (state.dataRoomAirModelMgr->Z1ofZone < state.dataRoomAirModelMgr->Z1ofZoneAux) {
2090 0 : state.dataRoomAirModelMgr->Z1ofZoneAux = state.dataRoomAirModelMgr->Z1ofZone;
2091 : }
2092 118 : if (state.dataRoomAirModelMgr->Z2ofZone > state.dataRoomAirModelMgr->Z2ofZoneAux) {
2093 0 : state.dataRoomAirModelMgr->Z2ofZoneAux = state.dataRoomAirModelMgr->Z2ofZone;
2094 : }
2095 118 : state.dataRoomAirModelMgr->Z1ofZone = state.dataRoomAirModelMgr->Z1ofZoneAux;
2096 118 : state.dataRoomAirModelMgr->Z2ofZone = state.dataRoomAirModelMgr->Z2ofZoneAux;
2097 :
2098 : // Put the reference to this surface in the appropriate array
2099 118 : if (state.dataSurface->Surface(SurfNum).Class == SurfaceClass::Floor) {
2100 17 : ++state.dataRoomAirModelMgr->contFloor;
2101 17 : state.dataUCSDShared->APos_Floor(state.dataRoomAirModelMgr->contFloor) = SurfNum;
2102 101 : } else if (state.dataSurface->Surface(SurfNum).Class == SurfaceClass::Wall) {
2103 52 : ++state.dataRoomAirModelMgr->contWall;
2104 52 : state.dataUCSDShared->APos_Wall(state.dataRoomAirModelMgr->contWall) = SurfNum;
2105 49 : } else if (state.dataSurface->Surface(SurfNum).Class == SurfaceClass::Window) {
2106 27 : ++state.dataRoomAirModelMgr->contWindow;
2107 27 : state.dataUCSDShared->APos_Window(state.dataRoomAirModelMgr->contWindow) = SurfNum;
2108 22 : } else if (state.dataSurface->Surface(SurfNum).Class == SurfaceClass::IntMass) {
2109 5 : ++state.dataRoomAirModelMgr->contInternal;
2110 5 : state.dataUCSDShared->APos_Internal(state.dataRoomAirModelMgr->contInternal) = SurfNum;
2111 17 : } else if (state.dataSurface->Surface(SurfNum).Class == SurfaceClass::Door) {
2112 0 : ++state.dataRoomAirModelMgr->contDoor;
2113 0 : state.dataUCSDShared->APos_Door(state.dataRoomAirModelMgr->contDoor) = SurfNum;
2114 : } else {
2115 17 : ++state.dataRoomAirModelMgr->contCeiling;
2116 17 : state.dataUCSDShared->APos_Ceiling(state.dataRoomAirModelMgr->contCeiling) = SurfNum;
2117 : }
2118 : }
2119 : } // Surfaces
2120 :
2121 13 : state.dataRoomAirModelMgr->contWallLast = state.dataRoomAirModelMgr->contWall;
2122 13 : state.dataRoomAirModelMgr->contFloorLast = state.dataRoomAirModelMgr->contFloor;
2123 13 : state.dataRoomAirModelMgr->contCeilingLast = state.dataRoomAirModelMgr->contCeiling;
2124 13 : state.dataRoomAirModelMgr->contWindowLast = state.dataRoomAirModelMgr->contWindow;
2125 13 : state.dataRoomAirModelMgr->contDoorLast = state.dataRoomAirModelMgr->contDoor;
2126 13 : state.dataRoomAirModelMgr->contInternalLast = state.dataRoomAirModelMgr->contInternal;
2127 : // PosZ_Wall (... + 1) has the Begin Wall reference in Apos_Wall for the ZNum
2128 : // PosZ_Wall (... + 2) has the End Wall reference in Apos_Wall for the ZNum
2129 13 : state.dataUCSDShared->PosZ_Wall((ZNum - 1) * 2 + 1) = state.dataRoomAirModelMgr->contWallBegin;
2130 13 : state.dataUCSDShared->PosZ_Wall((ZNum - 1) * 2 + 2) = state.dataRoomAirModelMgr->contWallLast;
2131 13 : state.dataUCSDShared->PosZ_Floor((ZNum - 1) * 2 + 1) = state.dataRoomAirModelMgr->contFloorBegin;
2132 13 : state.dataUCSDShared->PosZ_Floor((ZNum - 1) * 2 + 2) = state.dataRoomAirModelMgr->contFloorLast;
2133 13 : state.dataUCSDShared->PosZ_Ceiling((ZNum - 1) * 2 + 1) = state.dataRoomAirModelMgr->contCeilingBegin;
2134 13 : state.dataUCSDShared->PosZ_Ceiling((ZNum - 1) * 2 + 2) = state.dataRoomAirModelMgr->contCeilingLast;
2135 13 : state.dataUCSDShared->PosZ_Window((ZNum - 1) * 2 + 1) = state.dataRoomAirModelMgr->contWindowBegin;
2136 13 : state.dataUCSDShared->PosZ_Window((ZNum - 1) * 2 + 2) = state.dataRoomAirModelMgr->contWindowLast;
2137 13 : state.dataUCSDShared->PosZ_Door((ZNum - 1) * 2 + 1) = state.dataRoomAirModelMgr->contDoorBegin;
2138 13 : state.dataUCSDShared->PosZ_Door((ZNum - 1) * 2 + 2) = state.dataRoomAirModelMgr->contDoorLast;
2139 13 : state.dataUCSDShared->PosZ_Internal((ZNum - 1) * 2 + 1) = state.dataRoomAirModelMgr->contInternalBegin;
2140 13 : state.dataUCSDShared->PosZ_Internal((ZNum - 1) * 2 + 2) = state.dataRoomAirModelMgr->contInternalLast;
2141 : // Save the highest and lowest height for this zone
2142 13 : state.dataRoomAirMod->ZoneCeilingHeight((ZNum - 1) * 2 + 1) = state.dataRoomAirModelMgr->Z1ofZone;
2143 13 : state.dataRoomAirMod->ZoneCeilingHeight((ZNum - 1) * 2 + 2) = state.dataRoomAirModelMgr->Z2ofZone;
2144 :
2145 39 : if (std::abs((state.dataRoomAirModelMgr->Z2ofZone - state.dataRoomAirModelMgr->Z1ofZone) -
2146 26 : state.dataHeatBal->Zone(ZNum).CeilingHeight) > state.dataRoomAirModelMgr->CeilingHeightDiffMaximum) {
2147 0 : ShowWarningError(state, "RoomAirManager: Inconsistent ceiling heights in Zone: " + state.dataHeatBal->Zone(ZNum).Name);
2148 0 : ShowContinueError(state, format("Lowest height=[{:.3R}].", state.dataRoomAirModelMgr->Z1ofZone));
2149 0 : ShowContinueError(state, format("Highest height=[{:.3R}].", state.dataRoomAirModelMgr->Z2ofZone));
2150 0 : ShowContinueError(state, format("Ceiling height=[{:.3R}].", state.dataHeatBal->Zone(ZNum).CeilingHeight));
2151 : }
2152 : } // Zones
2153 :
2154 7 : AuxSurf = 0;
2155 7 : state.dataRoomAirMod->CVNumAirflowNetworkSurfaces = 0;
2156 :
2157 : // calculate maximum number of airflow network surfaces in each zone
2158 19 : for (state.dataRoomAirModelMgr->Loop = 1; state.dataRoomAirModelMgr->Loop <= state.afn->NumOfLinksMultiZone;
2159 12 : ++state.dataRoomAirModelMgr->Loop) {
2160 12 : ++AuxSurf(state.dataSurface->Surface(state.afn->MultizoneSurfaceData(state.dataRoomAirModelMgr->Loop).SurfNum).Zone);
2161 12 : ++state.dataRoomAirMod->CVNumAirflowNetworkSurfaces;
2162 : // Check if this is an interzone airflow network surface
2163 12 : if (state.dataSurface->Surface(state.afn->MultizoneSurfaceData(state.dataRoomAirModelMgr->Loop).SurfNum).ExtBoundCond > 0 &&
2164 0 : (state.afn->MultizoneSurfaceData(state.dataRoomAirModelMgr->Loop).SurfNum !=
2165 0 : state.dataSurface->Surface(state.afn->MultizoneSurfaceData(state.dataRoomAirModelMgr->Loop).SurfNum).ExtBoundCond)) {
2166 0 : ++AuxSurf(
2167 : state.dataSurface
2168 0 : ->Surface(
2169 0 : state.dataSurface->Surface(state.afn->MultizoneSurfaceData(state.dataRoomAirModelMgr->Loop).SurfNum).ExtBoundCond)
2170 0 : .Zone);
2171 0 : ++state.dataRoomAirMod->CVNumAirflowNetworkSurfaces;
2172 : }
2173 : }
2174 : // calculate maximum number of airflow network surfaces in a single zone
2175 7 : MaxSurf = AuxSurf(1);
2176 13 : for (state.dataRoomAirModelMgr->Loop = 2; state.dataRoomAirModelMgr->Loop <= state.dataGlobal->NumOfZones;
2177 6 : ++state.dataRoomAirModelMgr->Loop) {
2178 6 : if (AuxSurf(state.dataRoomAirModelMgr->Loop) > MaxSurf) MaxSurf = AuxSurf(state.dataRoomAirModelMgr->Loop);
2179 : }
2180 :
2181 7 : if (!allocated(state.dataRoomAirMod->AirflowNetworkSurfaceUCSDCV)) {
2182 7 : state.dataRoomAirMod->AirflowNetworkSurfaceUCSDCV.allocate({0, MaxSurf}, state.dataGlobal->NumOfZones);
2183 : }
2184 7 : if (!allocated(state.dataRoomAirMod->CVJetRecFlows)) {
2185 7 : state.dataRoomAirMod->CVJetRecFlows.allocate({0, MaxSurf}, state.dataGlobal->NumOfZones);
2186 : }
2187 7 : AuxAirflowNetworkSurf.allocate({0, MaxSurf}, state.dataGlobal->NumOfZones);
2188 : // Width and Height for airflow network surfaces
2189 7 : if (!allocated(state.dataRoomAirMod->SurfParametersCVDV)) {
2190 7 : state.dataRoomAirMod->SurfParametersCVDV.allocate(state.afn->NumOfLinksMultiZone);
2191 : }
2192 :
2193 7 : state.dataRoomAirMod->AirflowNetworkSurfaceUCSDCV = 0;
2194 : // Organize surfaces in vector AirflowNetworkSurfaceUCSDCV(Zone, surface indexes)
2195 20 : for (state.dataRoomAirModelMgr->Loop = 1; state.dataRoomAirModelMgr->Loop <= state.dataGlobal->NumOfZones;
2196 13 : ++state.dataRoomAirModelMgr->Loop) {
2197 : // the 0 component of the array has the number of relevant AirflowNetwork surfaces for the zone
2198 13 : state.dataRoomAirMod->AirflowNetworkSurfaceUCSDCV(0, state.dataRoomAirModelMgr->Loop) = AuxSurf(state.dataRoomAirModelMgr->Loop);
2199 13 : if (AuxSurf(state.dataRoomAirModelMgr->Loop) != 0) {
2200 4 : Real64 const ceilingHeight(state.dataRoomAirMod->ZoneCeilingHeight((state.dataRoomAirModelMgr->Loop - 1) * 2 + 1));
2201 4 : int SurfNum = 1;
2202 16 : for (state.dataRoomAirModelMgr->Loop2 = 1; state.dataRoomAirModelMgr->Loop2 <= state.afn->NumOfLinksMultiZone;
2203 12 : ++state.dataRoomAirModelMgr->Loop2) {
2204 24 : if (state.dataSurface->Surface(state.afn->MultizoneSurfaceData(state.dataRoomAirModelMgr->Loop2).SurfNum).Zone ==
2205 12 : state.dataRoomAirModelMgr->Loop) {
2206 : // SurfNum has the reference surface number relative to AirflowNetworkSurfaceData
2207 12 : state.dataRoomAirMod->AirflowNetworkSurfaceUCSDCV(SurfNum, state.dataRoomAirModelMgr->Loop) =
2208 12 : state.dataRoomAirModelMgr->Loop2;
2209 : // calculate the surface width and height
2210 12 : state.dataRoomAirModelMgr->CompNumber = state.afn->AirflowNetworkLinkageData(state.dataRoomAirModelMgr->Loop2).CompNum;
2211 12 : state.dataRoomAirModelMgr->TypeNumber = state.afn->AirflowNetworkCompData(state.dataRoomAirModelMgr->CompNumber).TypeNum;
2212 12 : if (state.afn->AirflowNetworkCompData(state.dataRoomAirModelMgr->CompNumber).CompTypeNum ==
2213 : AirflowNetwork::iComponentTypeNum::DOP) {
2214 10 : WidthFactMax = 0.0;
2215 10 : HeightFactMax = 0.0;
2216 30 : for (state.dataRoomAirModelMgr->Loop3 = 1;
2217 60 : state.dataRoomAirModelMgr->Loop3 <=
2218 30 : state.afn->MultizoneCompDetOpeningData(state.dataRoomAirModelMgr->TypeNumber).NumFac;
2219 20 : ++state.dataRoomAirModelMgr->Loop3) {
2220 20 : if (state.dataRoomAirModelMgr->Loop3 == 1) {
2221 10 : WidthFact = state.afn->MultizoneCompDetOpeningData(state.dataRoomAirModelMgr->TypeNumber).WidthFac1;
2222 10 : HeightFact = state.afn->MultizoneCompDetOpeningData(state.dataRoomAirModelMgr->TypeNumber).HeightFac1;
2223 : }
2224 20 : if (state.dataRoomAirModelMgr->Loop3 == 2) {
2225 10 : WidthFact = state.afn->MultizoneCompDetOpeningData(state.dataRoomAirModelMgr->TypeNumber).WidthFac2;
2226 10 : HeightFact = state.afn->MultizoneCompDetOpeningData(state.dataRoomAirModelMgr->TypeNumber).HeightFac2;
2227 : }
2228 20 : if (state.dataRoomAirModelMgr->Loop3 == 3) {
2229 0 : WidthFact = state.afn->MultizoneCompDetOpeningData(state.dataRoomAirModelMgr->TypeNumber).WidthFac3;
2230 0 : HeightFact = state.afn->MultizoneCompDetOpeningData(state.dataRoomAirModelMgr->TypeNumber).HeightFac3;
2231 : }
2232 20 : if (state.dataRoomAirModelMgr->Loop3 == 4) {
2233 0 : WidthFact = state.afn->MultizoneCompDetOpeningData(state.dataRoomAirModelMgr->TypeNumber).WidthFac4;
2234 0 : HeightFact = state.afn->MultizoneCompDetOpeningData(state.dataRoomAirModelMgr->TypeNumber).HeightFac4;
2235 : }
2236 20 : if (WidthFact > WidthFactMax) {
2237 10 : WidthFactMax = WidthFact;
2238 : }
2239 20 : if (HeightFact > HeightFactMax) {
2240 12 : HeightFactMax = HeightFact;
2241 : }
2242 : }
2243 10 : state.dataRoomAirMod->SurfParametersCVDV(state.dataRoomAirModelMgr->Loop2).Width =
2244 10 : WidthFactMax *
2245 10 : state.dataSurface->Surface(state.afn->MultizoneSurfaceData(state.dataRoomAirModelMgr->Loop2).SurfNum).Width;
2246 10 : state.dataRoomAirMod->SurfParametersCVDV(state.dataRoomAirModelMgr->Loop2).Height =
2247 10 : HeightFactMax *
2248 10 : state.dataSurface->Surface(state.afn->MultizoneSurfaceData(state.dataRoomAirModelMgr->Loop2).SurfNum).Height;
2249 2 : } else if (state.afn->AirflowNetworkCompData(state.dataRoomAirModelMgr->CompNumber).CompTypeNum ==
2250 : AirflowNetwork::iComponentTypeNum::SCR) { // surface type = CRACK
2251 2 : state.dataRoomAirMod->SurfParametersCVDV(state.dataRoomAirModelMgr->Loop2).Width =
2252 2 : state.dataSurface->Surface(state.afn->MultizoneSurfaceData(state.dataRoomAirModelMgr->Loop2).SurfNum).Width / 2;
2253 2 : AinCV =
2254 2 : state.afn->MultizoneSurfaceCrackData(state.dataRoomAirModelMgr->TypeNumber).coefficient /
2255 2 : (BaseDischargeCoef *
2256 2 : std::sqrt(
2257 : 2.0 /
2258 8 : PsyRhoAirFnPbTdbW(
2259 : state,
2260 2 : state.dataEnvrn->OutBaroPress,
2261 2 : state.dataZoneTempPredictorCorrector->zoneHeatBalance(state.dataRoomAirModelMgr->Loop).MAT,
2262 2 : state.dataZoneTempPredictorCorrector->zoneHeatBalance(state.dataRoomAirModelMgr->Loop).ZoneAirHumRat)));
2263 2 : state.dataRoomAirMod->SurfParametersCVDV(state.dataRoomAirModelMgr->Loop2).Height =
2264 2 : AinCV / state.dataRoomAirMod->SurfParametersCVDV(state.dataRoomAirModelMgr->Loop2).Width;
2265 : }
2266 : // calculate the surface Zmin and Zmax
2267 12 : if (state.afn->AirflowNetworkCompData(state.dataRoomAirModelMgr->CompNumber).CompTypeNum ==
2268 : AirflowNetwork::iComponentTypeNum::DOP) {
2269 10 : AirflowNetworkSurfPtr = state.afn->MultizoneSurfaceData(state.dataRoomAirModelMgr->Loop2).SurfNum;
2270 10 : NSides = state.dataSurface->Surface(state.afn->MultizoneSurfaceData(state.dataRoomAirModelMgr->Loop2).SurfNum).Sides;
2271 10 : Real64 z_min(std::numeric_limits<Real64>::max()), z_max(std::numeric_limits<Real64>::lowest());
2272 50 : for (int i = 1; i <= NSides; ++i) {
2273 40 : Real64 const z_i(state.dataSurface->Surface(AirflowNetworkSurfPtr).Vertex(i).z);
2274 40 : z_min = std::min(z_min, z_i);
2275 40 : z_max = std::max(z_max, z_i);
2276 : }
2277 10 : state.dataRoomAirMod->SurfParametersCVDV(state.dataRoomAirModelMgr->Loop2).Zmin = z_min - ceilingHeight;
2278 10 : state.dataRoomAirMod->SurfParametersCVDV(state.dataRoomAirModelMgr->Loop2).Zmax = z_max - ceilingHeight;
2279 2 : } else if (state.afn->AirflowNetworkCompData(state.dataRoomAirModelMgr->CompNumber).CompTypeNum ==
2280 : AirflowNetwork::iComponentTypeNum::SCR) { // surface type = CRACK
2281 2 : AirflowNetworkSurfPtr = state.afn->MultizoneSurfaceData(state.dataRoomAirModelMgr->Loop2).SurfNum;
2282 2 : NSides = state.dataSurface->Surface(state.afn->MultizoneSurfaceData(state.dataRoomAirModelMgr->Loop2).SurfNum).Sides;
2283 2 : Real64 z_min(std::numeric_limits<Real64>::max()), z_max(std::numeric_limits<Real64>::lowest());
2284 10 : for (int i = 1; i <= NSides; ++i) {
2285 8 : Real64 const z_i(state.dataSurface->Surface(AirflowNetworkSurfPtr).Vertex(i).z);
2286 8 : z_min = std::min(z_min, z_i);
2287 8 : z_max = std::max(z_max, z_i);
2288 : }
2289 2 : state.dataRoomAirMod->SurfParametersCVDV(state.dataRoomAirModelMgr->Loop2).Zmin = z_min - ceilingHeight;
2290 2 : state.dataRoomAirMod->SurfParametersCVDV(state.dataRoomAirModelMgr->Loop2).Zmax = z_max - ceilingHeight;
2291 : }
2292 :
2293 12 : ++SurfNum;
2294 : // Check if airflow network Surface is an interzone surface:
2295 : } else {
2296 0 : state.dataRoomAirModelMgr->NodeNumber1 = state.afn->MultizoneSurfaceData(state.dataRoomAirModelMgr->Loop2).NodeNums[0];
2297 0 : state.dataRoomAirModelMgr->NodeNumber2 = state.afn->MultizoneSurfaceData(state.dataRoomAirModelMgr->Loop2).NodeNums[1];
2298 0 : if ((state.afn->AirflowNetworkNodeData(state.dataRoomAirModelMgr->NodeNumber2).EPlusZoneNum ==
2299 0 : state.dataRoomAirModelMgr->Loop &&
2300 0 : state.afn->AirflowNetworkNodeData(state.dataRoomAirModelMgr->NodeNumber1).EPlusZoneNum > 0) ||
2301 0 : (state.afn->AirflowNetworkNodeData(state.dataRoomAirModelMgr->NodeNumber2).EPlusZoneNum > 0 &&
2302 0 : state.afn->AirflowNetworkNodeData(state.dataRoomAirModelMgr->NodeNumber1).EPlusZoneNum ==
2303 0 : state.dataRoomAirModelMgr->Loop)) {
2304 0 : state.dataRoomAirMod->AirflowNetworkSurfaceUCSDCV(SurfNum, state.dataRoomAirModelMgr->Loop) =
2305 0 : state.dataRoomAirModelMgr->Loop2;
2306 0 : ++SurfNum;
2307 : }
2308 : }
2309 : }
2310 : }
2311 : }
2312 :
2313 7 : AuxSurf.deallocate();
2314 :
2315 7 : if (any(state.dataRoomAirMod->IsZoneDV) || any(state.dataRoomAirMod->IsZoneUI)) {
2316 5 : state.dataRoomAirMod->MaxTempGrad.allocate(state.dataGlobal->NumOfZones);
2317 5 : state.dataRoomAirMod->AvgTempGrad.allocate(state.dataGlobal->NumOfZones);
2318 5 : state.dataRoomAirMod->TCMF.allocate(state.dataGlobal->NumOfZones);
2319 5 : state.dataRoomAirMod->FracMinFlow.allocate(state.dataGlobal->NumOfZones);
2320 5 : state.dataRoomAirMod->ZoneAirSystemON.allocate(state.dataGlobal->NumOfZones);
2321 : // Allocate histories of displacement ventilation temperatures PH 3/5/04
2322 5 : state.dataRoomAirMod->MATFloor.allocate(state.dataGlobal->NumOfZones);
2323 5 : state.dataRoomAirMod->XMATFloor.allocate(state.dataGlobal->NumOfZones);
2324 5 : state.dataRoomAirMod->XM2TFloor.allocate(state.dataGlobal->NumOfZones);
2325 5 : state.dataRoomAirMod->XM3TFloor.allocate(state.dataGlobal->NumOfZones);
2326 5 : state.dataRoomAirMod->XM4TFloor.allocate(state.dataGlobal->NumOfZones);
2327 5 : state.dataRoomAirMod->DSXMATFloor.allocate(state.dataGlobal->NumOfZones);
2328 5 : state.dataRoomAirMod->DSXM2TFloor.allocate(state.dataGlobal->NumOfZones);
2329 5 : state.dataRoomAirMod->DSXM3TFloor.allocate(state.dataGlobal->NumOfZones);
2330 5 : state.dataRoomAirMod->DSXM4TFloor.allocate(state.dataGlobal->NumOfZones);
2331 5 : state.dataRoomAirMod->MATOC.allocate(state.dataGlobal->NumOfZones);
2332 5 : state.dataRoomAirMod->XMATOC.allocate(state.dataGlobal->NumOfZones);
2333 5 : state.dataRoomAirMod->XM2TOC.allocate(state.dataGlobal->NumOfZones);
2334 5 : state.dataRoomAirMod->XM3TOC.allocate(state.dataGlobal->NumOfZones);
2335 5 : state.dataRoomAirMod->XM4TOC.allocate(state.dataGlobal->NumOfZones);
2336 5 : state.dataRoomAirMod->DSXMATOC.allocate(state.dataGlobal->NumOfZones);
2337 5 : state.dataRoomAirMod->DSXM2TOC.allocate(state.dataGlobal->NumOfZones);
2338 5 : state.dataRoomAirMod->DSXM3TOC.allocate(state.dataGlobal->NumOfZones);
2339 5 : state.dataRoomAirMod->DSXM4TOC.allocate(state.dataGlobal->NumOfZones);
2340 5 : state.dataRoomAirMod->MATMX.allocate(state.dataGlobal->NumOfZones);
2341 5 : state.dataRoomAirMod->XMATMX.allocate(state.dataGlobal->NumOfZones);
2342 5 : state.dataRoomAirMod->XM2TMX.allocate(state.dataGlobal->NumOfZones);
2343 5 : state.dataRoomAirMod->XM3TMX.allocate(state.dataGlobal->NumOfZones);
2344 5 : state.dataRoomAirMod->XM4TMX.allocate(state.dataGlobal->NumOfZones);
2345 5 : state.dataRoomAirMod->DSXMATMX.allocate(state.dataGlobal->NumOfZones);
2346 5 : state.dataRoomAirMod->DSXM2TMX.allocate(state.dataGlobal->NumOfZones);
2347 5 : state.dataRoomAirMod->DSXM3TMX.allocate(state.dataGlobal->NumOfZones);
2348 5 : state.dataRoomAirMod->DSXM4TMX.allocate(state.dataGlobal->NumOfZones);
2349 5 : state.dataRoomAirMod->ZTM1Floor.allocate(state.dataGlobal->NumOfZones);
2350 5 : state.dataRoomAirMod->ZTM2Floor.allocate(state.dataGlobal->NumOfZones);
2351 5 : state.dataRoomAirMod->ZTM3Floor.allocate(state.dataGlobal->NumOfZones);
2352 5 : state.dataRoomAirMod->ZTM1OC.allocate(state.dataGlobal->NumOfZones);
2353 5 : state.dataRoomAirMod->ZTM2OC.allocate(state.dataGlobal->NumOfZones);
2354 5 : state.dataRoomAirMod->ZTM3OC.allocate(state.dataGlobal->NumOfZones);
2355 5 : state.dataRoomAirMod->ZTM1MX.allocate(state.dataGlobal->NumOfZones);
2356 5 : state.dataRoomAirMod->ZTM2MX.allocate(state.dataGlobal->NumOfZones);
2357 5 : state.dataRoomAirMod->ZTM3MX.allocate(state.dataGlobal->NumOfZones);
2358 5 : state.dataRoomAirMod->AIRRATFloor.allocate(state.dataGlobal->NumOfZones);
2359 5 : state.dataRoomAirMod->AIRRATOC.allocate(state.dataGlobal->NumOfZones);
2360 5 : state.dataRoomAirMod->AIRRATMX.allocate(state.dataGlobal->NumOfZones);
2361 5 : state.dataRoomAirMod->ZTOC.allocate(state.dataGlobal->NumOfZones);
2362 5 : state.dataRoomAirMod->ZTMX.allocate(state.dataGlobal->NumOfZones);
2363 5 : state.dataRoomAirMod->ZTFloor.allocate(state.dataGlobal->NumOfZones);
2364 5 : state.dataRoomAirMod->HeightTransition.allocate(state.dataGlobal->NumOfZones);
2365 5 : state.dataRoomAirMod->Phi.allocate(state.dataGlobal->NumOfZones);
2366 5 : state.dataRoomAirMod->Zone1Floor.allocate(state.dataGlobal->NumOfZones);
2367 5 : state.dataRoomAirMod->ZoneMXFloor.allocate(state.dataGlobal->NumOfZones);
2368 5 : state.dataRoomAirMod->ZoneM2Floor.allocate(state.dataGlobal->NumOfZones);
2369 5 : state.dataRoomAirMod->Zone1OC.allocate(state.dataGlobal->NumOfZones);
2370 5 : state.dataRoomAirMod->ZoneMXOC.allocate(state.dataGlobal->NumOfZones);
2371 5 : state.dataRoomAirMod->ZoneM2OC.allocate(state.dataGlobal->NumOfZones);
2372 5 : state.dataRoomAirMod->Zone1MX.allocate(state.dataGlobal->NumOfZones);
2373 5 : state.dataRoomAirMod->ZoneMXMX.allocate(state.dataGlobal->NumOfZones);
2374 5 : state.dataRoomAirMod->ZoneM2MX.allocate(state.dataGlobal->NumOfZones);
2375 :
2376 5 : state.dataRoomAirMod->MaxTempGrad = 0.0;
2377 5 : state.dataRoomAirMod->AvgTempGrad = 0.0;
2378 5 : state.dataRoomAirMod->TCMF = 23.0;
2379 5 : state.dataRoomAirMod->FracMinFlow = 0.0;
2380 : // ZoneDVMixedFlagRep = 0.0
2381 5 : state.dataRoomAirMod->ZoneAirSystemON = false;
2382 : // ZoneDVMixedFlag=0
2383 5 : state.dataRoomAirMod->MATFloor = 23.0;
2384 5 : state.dataRoomAirMod->XMATFloor = 23.0;
2385 5 : state.dataRoomAirMod->XM2TFloor = 23.0;
2386 5 : state.dataRoomAirMod->XM3TFloor = 23.0;
2387 5 : state.dataRoomAirMod->XM4TFloor = 23.0;
2388 5 : state.dataRoomAirMod->DSXMATFloor = 23.0;
2389 5 : state.dataRoomAirMod->DSXM2TFloor = 23.0;
2390 5 : state.dataRoomAirMod->DSXM3TFloor = 23.0;
2391 5 : state.dataRoomAirMod->DSXM4TFloor = 23.0;
2392 5 : state.dataRoomAirMod->MATOC = 23.0;
2393 5 : state.dataRoomAirMod->XMATOC = 23.0;
2394 5 : state.dataRoomAirMod->XM2TOC = 23.0;
2395 5 : state.dataRoomAirMod->XM3TOC = 23.0;
2396 5 : state.dataRoomAirMod->XM4TOC = 23.0;
2397 5 : state.dataRoomAirMod->DSXMATOC = 23.0;
2398 5 : state.dataRoomAirMod->DSXM2TOC = 23.0;
2399 5 : state.dataRoomAirMod->DSXM3TOC = 23.0;
2400 5 : state.dataRoomAirMod->DSXM4TOC = 23.0;
2401 5 : state.dataRoomAirMod->MATMX = 23.0;
2402 5 : state.dataRoomAirMod->XMATMX = 23.0;
2403 5 : state.dataRoomAirMod->XM2TMX = 23.0;
2404 5 : state.dataRoomAirMod->XM3TMX = 23.0;
2405 5 : state.dataRoomAirMod->XM4TMX = 23.0;
2406 5 : state.dataRoomAirMod->DSXMATMX = 23.0;
2407 5 : state.dataRoomAirMod->DSXM2TMX = 23.0;
2408 5 : state.dataRoomAirMod->DSXM3TMX = 23.0;
2409 5 : state.dataRoomAirMod->DSXM4TMX = 23.0;
2410 5 : state.dataRoomAirMod->ZTM1Floor = 23.0;
2411 5 : state.dataRoomAirMod->ZTM2Floor = 23.0;
2412 5 : state.dataRoomAirMod->ZTM3Floor = 23.0;
2413 5 : state.dataRoomAirMod->ZTM1OC = 23.0;
2414 5 : state.dataRoomAirMod->ZTM2OC = 23.0;
2415 5 : state.dataRoomAirMod->ZTM3OC = 23.0;
2416 5 : state.dataRoomAirMod->ZTM1MX = 23.0;
2417 5 : state.dataRoomAirMod->ZTM2MX = 23.0;
2418 5 : state.dataRoomAirMod->ZTM3MX = 23.0;
2419 5 : state.dataRoomAirMod->Zone1Floor = 23.0;
2420 5 : state.dataRoomAirMod->ZoneMXFloor = 23.0;
2421 5 : state.dataRoomAirMod->ZoneM2Floor = 23.0;
2422 5 : state.dataRoomAirMod->Zone1OC = 23.0;
2423 5 : state.dataRoomAirMod->ZoneMXOC = 23.0;
2424 5 : state.dataRoomAirMod->ZoneM2OC = 23.0;
2425 5 : state.dataRoomAirMod->Zone1MX = 23.0;
2426 5 : state.dataRoomAirMod->ZoneMXMX = 23.0;
2427 5 : state.dataRoomAirMod->ZoneM2MX = 23.0;
2428 5 : state.dataRoomAirMod->AIRRATFloor = 0.0;
2429 5 : state.dataRoomAirMod->AIRRATOC = 0.0;
2430 5 : state.dataRoomAirMod->AIRRATMX = 0.0;
2431 5 : state.dataRoomAirMod->ZTOC = 23.0;
2432 5 : state.dataRoomAirMod->ZTMX = 23.0;
2433 5 : state.dataRoomAirMod->ZTFloor = 23.0;
2434 5 : state.dataRoomAirMod->HeightTransition = 0.0;
2435 5 : state.dataRoomAirMod->Phi = 0.0;
2436 5 : state.dataUCSDShared->HCeiling = 0.0;
2437 5 : state.dataUCSDShared->HWall = 0.0;
2438 5 : state.dataUCSDShared->HFloor = 0.0;
2439 5 : state.dataUCSDShared->HInternal = 0.0;
2440 5 : state.dataUCSDShared->HWindow = 0.0;
2441 5 : state.dataUCSDShared->HDoor = 0.0;
2442 : }
2443 :
2444 7 : if (any(state.dataRoomAirMod->IsZoneDV)) {
2445 :
2446 4 : state.dataRoomAirMod->DVHcIn.allocate(state.dataSurface->TotSurfaces);
2447 4 : state.dataRoomAirMod->ZoneDVMixedFlagRep.allocate(state.dataGlobal->NumOfZones);
2448 4 : state.dataRoomAirMod->ZoneDVMixedFlag.allocate(state.dataGlobal->NumOfZones);
2449 4 : state.dataRoomAirMod->DVHcIn = 0.0;
2450 4 : state.dataRoomAirMod->ZoneDVMixedFlagRep = 0.0;
2451 4 : state.dataRoomAirMod->ZoneDVMixedFlag = 0;
2452 : // Output variables and DV zone flag
2453 8 : for (state.dataRoomAirModelMgr->Loop = 1; state.dataRoomAirModelMgr->Loop <= state.dataGlobal->NumOfZones;
2454 4 : ++state.dataRoomAirModelMgr->Loop) {
2455 4 : if (state.dataRoomAirMod->AirModel(state.dataRoomAirModelMgr->Loop).AirModelType != DataRoomAirModel::RoomAirModel::UCSDDV)
2456 0 : continue; // don't set these up if they don't make sense
2457 : // CurrentModuleObject='RoomAirSettings:ThreeNodeDisplacementVentilation'
2458 12 : SetupOutputVariable(state,
2459 : "Room Air Zone Mixed Subzone Temperature",
2460 : OutputProcessor::Unit::C,
2461 4 : state.dataRoomAirMod->ZTMX(state.dataRoomAirModelMgr->Loop),
2462 : OutputProcessor::SOVTimeStepType::HVAC,
2463 : OutputProcessor::SOVStoreType::State,
2464 8 : state.dataHeatBal->Zone(state.dataRoomAirModelMgr->Loop).Name);
2465 12 : SetupOutputVariable(state,
2466 : "Room Air Zone Occupied Subzone Temperature",
2467 : OutputProcessor::Unit::C,
2468 4 : state.dataRoomAirMod->ZTOC(state.dataRoomAirModelMgr->Loop),
2469 : OutputProcessor::SOVTimeStepType::HVAC,
2470 : OutputProcessor::SOVStoreType::State,
2471 8 : state.dataHeatBal->Zone(state.dataRoomAirModelMgr->Loop).Name);
2472 12 : SetupOutputVariable(state,
2473 : "Room Air Zone Floor Subzone Temperature",
2474 : OutputProcessor::Unit::C,
2475 4 : state.dataRoomAirMod->ZTFloor(state.dataRoomAirModelMgr->Loop),
2476 : OutputProcessor::SOVTimeStepType::HVAC,
2477 : OutputProcessor::SOVStoreType::State,
2478 8 : state.dataHeatBal->Zone(state.dataRoomAirModelMgr->Loop).Name);
2479 12 : SetupOutputVariable(state,
2480 : "Room Air Zone Transition Height",
2481 : OutputProcessor::Unit::m,
2482 4 : state.dataRoomAirMod->HeightTransition(state.dataRoomAirModelMgr->Loop),
2483 : OutputProcessor::SOVTimeStepType::HVAC,
2484 : OutputProcessor::SOVStoreType::State,
2485 8 : state.dataHeatBal->Zone(state.dataRoomAirModelMgr->Loop).Name);
2486 12 : SetupOutputVariable(state,
2487 : "Room Air Zone Recommended Minimum Flow Fraction",
2488 : OutputProcessor::Unit::None,
2489 4 : state.dataRoomAirMod->FracMinFlow(state.dataRoomAirModelMgr->Loop),
2490 : OutputProcessor::SOVTimeStepType::HVAC,
2491 : OutputProcessor::SOVStoreType::State,
2492 8 : state.dataHeatBal->Zone(state.dataRoomAirModelMgr->Loop).Name);
2493 12 : SetupOutputVariable(state,
2494 : "Room Air Zone Is Mixed Status",
2495 : OutputProcessor::Unit::None,
2496 4 : state.dataRoomAirMod->ZoneDVMixedFlagRep(state.dataRoomAirModelMgr->Loop),
2497 : OutputProcessor::SOVTimeStepType::HVAC,
2498 : OutputProcessor::SOVStoreType::State,
2499 8 : state.dataHeatBal->Zone(state.dataRoomAirModelMgr->Loop).Name);
2500 12 : SetupOutputVariable(state,
2501 : "Room Air Zone Average Temperature Gradient",
2502 : OutputProcessor::Unit::K_m,
2503 4 : state.dataRoomAirMod->AvgTempGrad(state.dataRoomAirModelMgr->Loop),
2504 : OutputProcessor::SOVTimeStepType::HVAC,
2505 : OutputProcessor::SOVStoreType::State,
2506 8 : state.dataHeatBal->Zone(state.dataRoomAirModelMgr->Loop).Name);
2507 12 : SetupOutputVariable(state,
2508 : "Room Air Zone Maximum Temperature Gradient",
2509 : OutputProcessor::Unit::K_m,
2510 4 : state.dataRoomAirMod->MaxTempGrad(state.dataRoomAirModelMgr->Loop),
2511 : OutputProcessor::SOVTimeStepType::HVAC,
2512 : OutputProcessor::SOVStoreType::State,
2513 8 : state.dataHeatBal->Zone(state.dataRoomAirModelMgr->Loop).Name);
2514 12 : SetupOutputVariable(state,
2515 : "Room Air Zone Thermal Comfort Effective Air Temperature",
2516 : OutputProcessor::Unit::C,
2517 4 : state.dataRoomAirMod->TCMF(state.dataRoomAirModelMgr->Loop),
2518 : OutputProcessor::SOVTimeStepType::HVAC,
2519 : OutputProcessor::SOVStoreType::State,
2520 8 : state.dataHeatBal->Zone(state.dataRoomAirModelMgr->Loop).Name);
2521 12 : SetupOutputVariable(state,
2522 : "Room Air Zone Thermostat Temperature",
2523 : OutputProcessor::Unit::C,
2524 4 : state.dataHeatBalFanSys->TempTstatAir(state.dataRoomAirModelMgr->Loop),
2525 : OutputProcessor::SOVTimeStepType::HVAC,
2526 : OutputProcessor::SOVStoreType::State,
2527 8 : state.dataHeatBal->Zone(state.dataRoomAirModelMgr->Loop).Name);
2528 : }
2529 : }
2530 :
2531 7 : if (any(state.dataRoomAirMod->IsZoneUI)) {
2532 1 : state.dataRoomAirMod->ZoneUFMixedFlag.allocate(state.dataGlobal->NumOfZones);
2533 1 : state.dataRoomAirMod->ZoneUFMixedFlagRep.allocate(state.dataGlobal->NumOfZones);
2534 1 : state.dataRoomAirMod->UFHcIn.allocate(state.dataSurface->TotSurfaces);
2535 1 : state.dataRoomAirMod->ZoneUFGamma.allocate(state.dataGlobal->NumOfZones);
2536 1 : state.dataRoomAirMod->ZoneUFPowInPlumes.allocate(state.dataGlobal->NumOfZones);
2537 1 : state.dataRoomAirMod->ZoneUFPowInPlumesfromWindows.allocate(state.dataGlobal->NumOfZones);
2538 1 : state.dataRoomAirMod->ZoneUFMixedFlag = 0;
2539 1 : state.dataRoomAirMod->ZoneUFMixedFlagRep = 0.0;
2540 1 : state.dataRoomAirMod->UFHcIn = 0.0;
2541 1 : state.dataRoomAirMod->ZoneUFGamma = 0.0;
2542 1 : state.dataRoomAirMod->ZoneUFPowInPlumes = 0.0;
2543 1 : state.dataRoomAirMod->ZoneUFPowInPlumesfromWindows = 0.0;
2544 : // Output variables and UF zone flag
2545 8 : for (state.dataRoomAirModelMgr->Loop = 1; state.dataRoomAirModelMgr->Loop <= state.dataGlobal->NumOfZones;
2546 7 : ++state.dataRoomAirModelMgr->Loop) {
2547 7 : if (state.dataRoomAirMod->AirModel(state.dataRoomAirModelMgr->Loop).AirModelType != DataRoomAirModel::RoomAirModel::UCSDUFI)
2548 6 : continue; // don't set these up if they don't make sense
2549 : // CurrentModuleObject='RoomAirSettings:UnderFloorAirDistributionInterior'
2550 3 : SetupOutputVariable(state,
2551 : "Room Air Zone Mixed Subzone Temperature",
2552 : OutputProcessor::Unit::C,
2553 1 : state.dataRoomAirMod->ZTMX(state.dataRoomAirModelMgr->Loop),
2554 : OutputProcessor::SOVTimeStepType::HVAC,
2555 : OutputProcessor::SOVStoreType::State,
2556 2 : state.dataHeatBal->Zone(state.dataRoomAirModelMgr->Loop).Name);
2557 3 : SetupOutputVariable(state,
2558 : "Room Air Zone Occupied Subzone Temperature",
2559 : OutputProcessor::Unit::C,
2560 1 : state.dataRoomAirMod->ZTOC(state.dataRoomAirModelMgr->Loop),
2561 : OutputProcessor::SOVTimeStepType::HVAC,
2562 : OutputProcessor::SOVStoreType::State,
2563 2 : state.dataHeatBal->Zone(state.dataRoomAirModelMgr->Loop).Name);
2564 3 : SetupOutputVariable(state,
2565 : "Room Air Zone Transition Height",
2566 : OutputProcessor::Unit::m,
2567 1 : state.dataRoomAirMod->HeightTransition(state.dataRoomAirModelMgr->Loop),
2568 : OutputProcessor::SOVTimeStepType::HVAC,
2569 : OutputProcessor::SOVStoreType::State,
2570 2 : state.dataHeatBal->Zone(state.dataRoomAirModelMgr->Loop).Name);
2571 3 : SetupOutputVariable(state,
2572 : "Room Air Zone Is Mixed Status",
2573 : OutputProcessor::Unit::None,
2574 1 : state.dataRoomAirMod->ZoneUFMixedFlagRep(state.dataRoomAirModelMgr->Loop),
2575 : OutputProcessor::SOVTimeStepType::HVAC,
2576 : OutputProcessor::SOVStoreType::State,
2577 2 : state.dataHeatBal->Zone(state.dataRoomAirModelMgr->Loop).Name);
2578 3 : SetupOutputVariable(state,
2579 : "Room Air Zone Average Temperature Gradient",
2580 : OutputProcessor::Unit::K_m,
2581 1 : state.dataRoomAirMod->AvgTempGrad(state.dataRoomAirModelMgr->Loop),
2582 : OutputProcessor::SOVTimeStepType::HVAC,
2583 : OutputProcessor::SOVStoreType::State,
2584 2 : state.dataHeatBal->Zone(state.dataRoomAirModelMgr->Loop).Name);
2585 3 : SetupOutputVariable(state,
2586 : "Room Air Zone Effective Comfort Air Temperature",
2587 : OutputProcessor::Unit::C,
2588 1 : state.dataRoomAirMod->TCMF(state.dataRoomAirModelMgr->Loop),
2589 : OutputProcessor::SOVTimeStepType::HVAC,
2590 : OutputProcessor::SOVStoreType::State,
2591 2 : state.dataHeatBal->Zone(state.dataRoomAirModelMgr->Loop).Name);
2592 3 : SetupOutputVariable(state,
2593 : "Room Air Zone Thermostat Temperature",
2594 : OutputProcessor::Unit::C,
2595 1 : state.dataHeatBalFanSys->TempTstatAir(state.dataRoomAirModelMgr->Loop),
2596 : OutputProcessor::SOVTimeStepType::HVAC,
2597 : OutputProcessor::SOVStoreType::State,
2598 2 : state.dataHeatBal->Zone(state.dataRoomAirModelMgr->Loop).Name);
2599 3 : SetupOutputVariable(state,
2600 : "Room Air Zone Transition Height Gamma Value",
2601 : OutputProcessor::Unit::None,
2602 1 : state.dataRoomAirMod->ZoneUFGamma(state.dataRoomAirModelMgr->Loop),
2603 : OutputProcessor::SOVTimeStepType::HVAC,
2604 : OutputProcessor::SOVStoreType::State,
2605 2 : state.dataHeatBal->Zone(state.dataRoomAirModelMgr->Loop).Name);
2606 3 : SetupOutputVariable(state,
2607 : "Room Air Zone Plume Heat Transfer Rate",
2608 : OutputProcessor::Unit::W,
2609 1 : state.dataRoomAirMod->ZoneUFPowInPlumes(state.dataRoomAirModelMgr->Loop),
2610 : OutputProcessor::SOVTimeStepType::HVAC,
2611 : OutputProcessor::SOVStoreType::State,
2612 2 : state.dataHeatBal->Zone(state.dataRoomAirModelMgr->Loop).Name);
2613 3 : SetupOutputVariable(state,
2614 : "Room Air Zone Temperature Stratification Fraction",
2615 : OutputProcessor::Unit::None,
2616 1 : state.dataRoomAirMod->Phi(state.dataRoomAirModelMgr->Loop),
2617 : OutputProcessor::SOVTimeStepType::HVAC,
2618 : OutputProcessor::SOVStoreType::State,
2619 2 : state.dataHeatBal->Zone(state.dataRoomAirModelMgr->Loop).Name);
2620 :
2621 : // set zone equip pointer in the UCSDUI data structure
2622 1 : state.dataRoomAirMod->ZoneUCSDUI(state.dataRoomAirMod->ZoneUFPtr(state.dataRoomAirModelMgr->Loop)).ZoneEquipPtr =
2623 1 : state.dataRoomAirModelMgr->Loop;
2624 : }
2625 8 : for (state.dataRoomAirModelMgr->Loop = 1; state.dataRoomAirModelMgr->Loop <= state.dataGlobal->NumOfZones;
2626 7 : ++state.dataRoomAirModelMgr->Loop) {
2627 7 : if (state.dataRoomAirMod->AirModel(state.dataRoomAirModelMgr->Loop).AirModelType != DataRoomAirModel::RoomAirModel::UCSDUFE)
2628 3 : continue; // don't set these up if they don't make sense
2629 : // CurrentModuleObject='RoomAirSettings:UnderFloorAirDistributionExterior'
2630 12 : SetupOutputVariable(state,
2631 : "Room Air Zone Mixed Subzone Temperature",
2632 : OutputProcessor::Unit::C,
2633 4 : state.dataRoomAirMod->ZTMX(state.dataRoomAirModelMgr->Loop),
2634 : OutputProcessor::SOVTimeStepType::HVAC,
2635 : OutputProcessor::SOVStoreType::State,
2636 8 : state.dataHeatBal->Zone(state.dataRoomAirModelMgr->Loop).Name);
2637 12 : SetupOutputVariable(state,
2638 : "Room Air Zone Occupied Subzone Temperature",
2639 : OutputProcessor::Unit::C,
2640 4 : state.dataRoomAirMod->ZTOC(state.dataRoomAirModelMgr->Loop),
2641 : OutputProcessor::SOVTimeStepType::HVAC,
2642 : OutputProcessor::SOVStoreType::State,
2643 8 : state.dataHeatBal->Zone(state.dataRoomAirModelMgr->Loop).Name);
2644 12 : SetupOutputVariable(state,
2645 : "Room Air Zone Transition Height",
2646 : OutputProcessor::Unit::m,
2647 4 : state.dataRoomAirMod->HeightTransition(state.dataRoomAirModelMgr->Loop),
2648 : OutputProcessor::SOVTimeStepType::HVAC,
2649 : OutputProcessor::SOVStoreType::State,
2650 8 : state.dataHeatBal->Zone(state.dataRoomAirModelMgr->Loop).Name);
2651 12 : SetupOutputVariable(state,
2652 : "Room Air Zone Is Mixed Status",
2653 : OutputProcessor::Unit::None,
2654 4 : state.dataRoomAirMod->ZoneUFMixedFlagRep(state.dataRoomAirModelMgr->Loop),
2655 : OutputProcessor::SOVTimeStepType::HVAC,
2656 : OutputProcessor::SOVStoreType::State,
2657 8 : state.dataHeatBal->Zone(state.dataRoomAirModelMgr->Loop).Name);
2658 12 : SetupOutputVariable(state,
2659 : "Room Air Zone Average Temperature Gradient",
2660 : OutputProcessor::Unit::K_m,
2661 4 : state.dataRoomAirMod->AvgTempGrad(state.dataRoomAirModelMgr->Loop),
2662 : OutputProcessor::SOVTimeStepType::HVAC,
2663 : OutputProcessor::SOVStoreType::State,
2664 8 : state.dataHeatBal->Zone(state.dataRoomAirModelMgr->Loop).Name);
2665 12 : SetupOutputVariable(state,
2666 : "Room Air Zone Effective Comfort Air Temperature",
2667 : OutputProcessor::Unit::C,
2668 4 : state.dataRoomAirMod->TCMF(state.dataRoomAirModelMgr->Loop),
2669 : OutputProcessor::SOVTimeStepType::HVAC,
2670 : OutputProcessor::SOVStoreType::State,
2671 8 : state.dataHeatBal->Zone(state.dataRoomAirModelMgr->Loop).Name);
2672 12 : SetupOutputVariable(state,
2673 : "Room Air Zone Thermostat Temperature",
2674 : OutputProcessor::Unit::C,
2675 4 : state.dataHeatBalFanSys->TempTstatAir(state.dataRoomAirModelMgr->Loop),
2676 : OutputProcessor::SOVTimeStepType::HVAC,
2677 : OutputProcessor::SOVStoreType::State,
2678 8 : state.dataHeatBal->Zone(state.dataRoomAirModelMgr->Loop).Name);
2679 12 : SetupOutputVariable(state,
2680 : "Room Air Zone Transition Height Gamma Value",
2681 : OutputProcessor::Unit::None,
2682 4 : state.dataRoomAirMod->ZoneUFGamma(state.dataRoomAirModelMgr->Loop),
2683 : OutputProcessor::SOVTimeStepType::HVAC,
2684 : OutputProcessor::SOVStoreType::State,
2685 8 : state.dataHeatBal->Zone(state.dataRoomAirModelMgr->Loop).Name);
2686 12 : SetupOutputVariable(state,
2687 : "Room Air Zone Plume Heat Transfer Rate",
2688 : OutputProcessor::Unit::W,
2689 4 : state.dataRoomAirMod->ZoneUFPowInPlumes(state.dataRoomAirModelMgr->Loop),
2690 : OutputProcessor::SOVTimeStepType::HVAC,
2691 : OutputProcessor::SOVStoreType::State,
2692 8 : state.dataHeatBal->Zone(state.dataRoomAirModelMgr->Loop).Name);
2693 12 : SetupOutputVariable(state,
2694 : "Room Air Zone Window Plume Heat Transfer Rate",
2695 : OutputProcessor::Unit::W,
2696 4 : state.dataRoomAirMod->ZoneUFPowInPlumesfromWindows(state.dataRoomAirModelMgr->Loop),
2697 : OutputProcessor::SOVTimeStepType::HVAC,
2698 : OutputProcessor::SOVStoreType::State,
2699 8 : state.dataHeatBal->Zone(state.dataRoomAirModelMgr->Loop).Name);
2700 12 : SetupOutputVariable(state,
2701 : "Room Air Zone Temperature Stratification Fraction",
2702 : OutputProcessor::Unit::None,
2703 4 : state.dataRoomAirMod->Phi(state.dataRoomAirModelMgr->Loop),
2704 : OutputProcessor::SOVTimeStepType::HVAC,
2705 : OutputProcessor::SOVStoreType::State,
2706 8 : state.dataHeatBal->Zone(state.dataRoomAirModelMgr->Loop).Name);
2707 : // set zone equip pointer in the UCSDUE data structure
2708 4 : state.dataRoomAirMod->ZoneUCSDUE(state.dataRoomAirMod->ZoneUFPtr(state.dataRoomAirModelMgr->Loop)).ZoneEquipPtr =
2709 4 : state.dataRoomAirModelMgr->Loop;
2710 : }
2711 : }
2712 :
2713 7 : if (any(state.dataRoomAirMod->IsZoneCV)) {
2714 2 : state.dataRoomAirMod->CVHcIn.allocate(state.dataSurface->TotSurfaces);
2715 2 : state.dataRoomAirMod->ZTJET.allocate(state.dataGlobal->NumOfZones);
2716 : // Most ZTJet takes defaults
2717 2 : state.dataRoomAirMod->ZTREC.allocate(state.dataGlobal->NumOfZones);
2718 2 : state.dataRoomAirMod->RoomOutflowTemp.allocate(state.dataGlobal->NumOfZones);
2719 : // Most ZTREC takes defaults
2720 2 : state.dataRoomAirMod->JetRecAreaRatio.allocate(state.dataGlobal->NumOfZones);
2721 2 : state.dataRoomAirMod->Urec.allocate(state.dataGlobal->NumOfZones);
2722 2 : state.dataRoomAirMod->Ujet.allocate(state.dataGlobal->NumOfZones);
2723 2 : state.dataRoomAirMod->Qrec.allocate(state.dataGlobal->NumOfZones);
2724 2 : state.dataRoomAirMod->Qtot.allocate(state.dataGlobal->NumOfZones);
2725 2 : state.dataRoomAirMod->RecInflowRatio.allocate(state.dataGlobal->NumOfZones);
2726 2 : state.dataRoomAirMod->Uhc.allocate(state.dataGlobal->NumOfZones);
2727 2 : state.dataRoomAirMod->Ain.allocate(state.dataGlobal->NumOfZones);
2728 2 : state.dataRoomAirMod->Tin.allocate(state.dataGlobal->NumOfZones);
2729 2 : state.dataRoomAirMod->Droom.allocate(state.dataGlobal->NumOfZones);
2730 2 : state.dataRoomAirMod->Dstar.allocate(state.dataGlobal->NumOfZones);
2731 2 : state.dataRoomAirMod->ZoneCVisMixing.allocate(state.dataGlobal->NumOfZones);
2732 2 : state.dataRoomAirMod->Rfr.allocate(state.dataGlobal->NumOfZones);
2733 2 : state.dataRoomAirMod->ZoneCVhasREC.allocate(state.dataGlobal->NumOfZones);
2734 :
2735 2 : state.dataRoomAirMod->ZTJET = 23.0;
2736 2 : state.dataRoomAirMod->RoomOutflowTemp = 23.0;
2737 2 : state.dataRoomAirMod->ZTREC = 23.0;
2738 2 : state.dataRoomAirMod->CVHcIn = 0.0;
2739 2 : state.dataRoomAirMod->JetRecAreaRatio = 0.2;
2740 2 : state.dataRoomAirMod->Urec = 0.2;
2741 2 : state.dataRoomAirMod->Ujet = 0.2;
2742 2 : state.dataRoomAirMod->Qrec = 0.2;
2743 2 : state.dataRoomAirMod->Uhc = 0.2;
2744 2 : state.dataRoomAirMod->Ain = 1.0;
2745 2 : state.dataRoomAirMod->Tin = 23.0;
2746 2 : state.dataRoomAirMod->Droom = 6.0;
2747 2 : state.dataRoomAirMod->ZoneCVisMixing = 0.0;
2748 2 : state.dataRoomAirMod->Rfr = 10.0;
2749 2 : state.dataRoomAirMod->ZoneCVhasREC = 1.0;
2750 2 : state.dataUCSDShared->HCeiling = 0.0;
2751 2 : state.dataUCSDShared->HWall = 0.0;
2752 2 : state.dataUCSDShared->HFloor = 0.0;
2753 2 : state.dataUCSDShared->HInternal = 0.0;
2754 2 : state.dataUCSDShared->HWindow = 0.0;
2755 2 : state.dataUCSDShared->HDoor = 0.0;
2756 :
2757 4 : for (state.dataRoomAirModelMgr->Loop = 1; state.dataRoomAirModelMgr->Loop <= state.dataGlobal->NumOfZones;
2758 2 : ++state.dataRoomAirModelMgr->Loop) {
2759 2 : if (state.dataRoomAirMod->AirModel(state.dataRoomAirModelMgr->Loop).AirModelType != DataRoomAirModel::RoomAirModel::UCSDCV)
2760 0 : continue; // don't set these up if they don't make sense
2761 2 : ZoneEquipConfigNum = ZoneNum;
2762 : // check whether this zone is a controlled zone or not
2763 2 : if (state.dataZoneEquip->ZoneEquipConfig(ZoneEquipConfigNum).IsControlled) {
2764 0 : state.dataRoomAirMod->IsZoneCV(state.dataRoomAirModelMgr->Loop) = false;
2765 0 : state.dataRoomAirMod->AirModel(state.dataRoomAirModelMgr->Loop).SimAirModel = false;
2766 0 : ShowSevereError(state,
2767 0 : "Unmixed Flow: Cross Ventilation cannot be applied for Zone=" +
2768 0 : state.dataHeatBal->Zone(state.dataRoomAirModelMgr->Loop).Name);
2769 0 : ShowContinueError(state,
2770 0 : "An HVAC system is present in the zone. Fully mixed airflow model will be used for Zone=" +
2771 0 : state.dataHeatBal->Zone(state.dataRoomAirModelMgr->Loop).Name);
2772 0 : continue;
2773 : }
2774 : // CurrentModuleObject='RoomAirSettings:CrossVentilation'
2775 6 : SetupOutputVariable(state,
2776 : "Room Air Zone Jet Region Temperature",
2777 : OutputProcessor::Unit::C,
2778 2 : state.dataRoomAirMod->ZTJET(state.dataRoomAirModelMgr->Loop),
2779 : OutputProcessor::SOVTimeStepType::Zone,
2780 : OutputProcessor::SOVStoreType::Average,
2781 4 : state.dataHeatBal->Zone(state.dataRoomAirModelMgr->Loop).Name);
2782 6 : SetupOutputVariable(state,
2783 : "Room Air Zone Recirculation Region Temperature",
2784 : OutputProcessor::Unit::C,
2785 2 : state.dataRoomAirMod->ZTREC(state.dataRoomAirModelMgr->Loop),
2786 : OutputProcessor::SOVTimeStepType::Zone,
2787 : OutputProcessor::SOVStoreType::Average,
2788 4 : state.dataHeatBal->Zone(state.dataRoomAirModelMgr->Loop).Name);
2789 6 : SetupOutputVariable(state,
2790 : "Room Air Zone Jet Region Average Air Velocity",
2791 : OutputProcessor::Unit::m_s,
2792 2 : state.dataRoomAirMod->Ujet(state.dataRoomAirModelMgr->Loop),
2793 : OutputProcessor::SOVTimeStepType::Zone,
2794 : OutputProcessor::SOVStoreType::Average,
2795 4 : state.dataHeatBal->Zone(state.dataRoomAirModelMgr->Loop).Name);
2796 6 : SetupOutputVariable(state,
2797 : "Room Air Zone Recirculation Region Average Air Velocity",
2798 : OutputProcessor::Unit::m_s,
2799 2 : state.dataRoomAirMod->Urec(state.dataRoomAirModelMgr->Loop),
2800 : OutputProcessor::SOVTimeStepType::Zone,
2801 : OutputProcessor::SOVStoreType::Average,
2802 4 : state.dataHeatBal->Zone(state.dataRoomAirModelMgr->Loop).Name);
2803 6 : SetupOutputVariable(state,
2804 : "Room Air Zone Recirculation and Inflow Rate Ratio",
2805 : OutputProcessor::Unit::None,
2806 2 : state.dataRoomAirMod->RecInflowRatio(state.dataRoomAirModelMgr->Loop),
2807 : OutputProcessor::SOVTimeStepType::Zone,
2808 : OutputProcessor::SOVStoreType::Average,
2809 4 : state.dataHeatBal->Zone(state.dataRoomAirModelMgr->Loop).Name);
2810 6 : SetupOutputVariable(state,
2811 : "Room Air Zone Inflow Opening Area",
2812 : OutputProcessor::Unit::m2,
2813 2 : state.dataRoomAirMod->Ain(state.dataRoomAirModelMgr->Loop),
2814 : OutputProcessor::SOVTimeStepType::Zone,
2815 : OutputProcessor::SOVStoreType::Average,
2816 4 : state.dataHeatBal->Zone(state.dataRoomAirModelMgr->Loop).Name);
2817 6 : SetupOutputVariable(state,
2818 : "Room Air Zone Room Length",
2819 : OutputProcessor::Unit::m,
2820 2 : state.dataRoomAirMod->Dstar(state.dataRoomAirModelMgr->Loop),
2821 : OutputProcessor::SOVTimeStepType::Zone,
2822 : OutputProcessor::SOVStoreType::Average,
2823 4 : state.dataHeatBal->Zone(state.dataRoomAirModelMgr->Loop).Name);
2824 6 : SetupOutputVariable(state,
2825 : "Room Air Zone Is Mixing Status",
2826 : OutputProcessor::Unit::None,
2827 2 : state.dataRoomAirMod->ZoneCVisMixing(state.dataRoomAirModelMgr->Loop),
2828 : OutputProcessor::SOVTimeStepType::Zone,
2829 : OutputProcessor::SOVStoreType::State,
2830 4 : state.dataHeatBal->Zone(state.dataRoomAirModelMgr->Loop).Name);
2831 6 : SetupOutputVariable(state,
2832 : "Room Air Zone Is Recirculating Status",
2833 : OutputProcessor::Unit::None,
2834 2 : state.dataRoomAirMod->ZoneCVhasREC(state.dataRoomAirModelMgr->Loop),
2835 : OutputProcessor::SOVTimeStepType::Zone,
2836 : OutputProcessor::SOVStoreType::State,
2837 4 : state.dataHeatBal->Zone(state.dataRoomAirModelMgr->Loop).Name);
2838 8 : for (state.dataRoomAirModelMgr->i = 1;
2839 8 : state.dataRoomAirModelMgr->i <= state.dataRoomAirMod->AirflowNetworkSurfaceUCSDCV(0, ZoneNum);
2840 6 : ++state.dataRoomAirModelMgr->i) {
2841 6 : state.dataRoomAirModelMgr->N = state.afn->AirflowNetworkLinkageData(state.dataRoomAirModelMgr->i).CompNum;
2842 6 : if (state.afn->AirflowNetworkCompData(state.dataRoomAirModelMgr->N).CompTypeNum == AirflowNetwork::iComponentTypeNum::DOP) {
2843 24 : SetupOutputVariable(
2844 : state,
2845 : "Room Air Window Jet Region Average Air Velocity",
2846 : OutputProcessor::Unit::m_s,
2847 6 : state.dataRoomAirMod->CVJetRecFlows(state.dataRoomAirModelMgr->i, state.dataRoomAirModelMgr->Loop).Ujet,
2848 : OutputProcessor::SOVTimeStepType::Zone,
2849 : OutputProcessor::SOVStoreType::Average,
2850 12 : state.afn->MultizoneSurfaceData(state.dataRoomAirModelMgr->i).SurfName);
2851 : }
2852 : }
2853 : }
2854 : }
2855 :
2856 7 : state.dataRoomAirModelMgr->MyEnvrnFlag = true;
2857 :
2858 7 : state.dataRoomAirModelMgr->MyOneTimeFlag = false;
2859 : }
2860 :
2861 : // Do the Begin Environment initializations
2862 43671 : if (state.dataGlobal->BeginEnvrnFlag && state.dataRoomAirModelMgr->MyEnvrnFlag(ZoneNum)) {
2863 :
2864 110 : if (state.dataRoomAirMod->IsZoneDV(ZoneNum) || state.dataRoomAirMod->IsZoneUI(ZoneNum)) {
2865 :
2866 78 : state.dataRoomAirMod->MaxTempGrad(ZoneNum) = 0.0;
2867 78 : state.dataRoomAirMod->AvgTempGrad(ZoneNum) = 0.0;
2868 78 : state.dataRoomAirMod->TCMF(ZoneNum) = 23.0;
2869 78 : state.dataRoomAirMod->FracMinFlow(ZoneNum) = 0.0;
2870 78 : state.dataRoomAirMod->ZoneAirSystemON(ZoneNum) = false;
2871 78 : state.dataRoomAirMod->MATFloor(ZoneNum) = 23.0;
2872 78 : state.dataRoomAirMod->XMATFloor(ZoneNum) = 23.0;
2873 78 : state.dataRoomAirMod->XM2TFloor(ZoneNum) = 23.0;
2874 78 : state.dataRoomAirMod->XM3TFloor(ZoneNum) = 23.0;
2875 78 : state.dataRoomAirMod->XM4TFloor(ZoneNum) = 23.0;
2876 78 : state.dataRoomAirMod->DSXMATFloor(ZoneNum) = 23.0;
2877 78 : state.dataRoomAirMod->DSXM2TFloor(ZoneNum) = 23.0;
2878 78 : state.dataRoomAirMod->DSXM3TFloor(ZoneNum) = 23.0;
2879 78 : state.dataRoomAirMod->DSXM4TFloor(ZoneNum) = 23.0;
2880 78 : state.dataRoomAirMod->MATOC(ZoneNum) = 23.0;
2881 78 : state.dataRoomAirMod->XMATOC(ZoneNum) = 23.0;
2882 78 : state.dataRoomAirMod->XM2TOC(ZoneNum) = 23.0;
2883 78 : state.dataRoomAirMod->XM3TOC(ZoneNum) = 23.0;
2884 78 : state.dataRoomAirMod->XM4TOC(ZoneNum) = 23.0;
2885 78 : state.dataRoomAirMod->DSXMATOC(ZoneNum) = 23.0;
2886 78 : state.dataRoomAirMod->DSXM2TOC(ZoneNum) = 23.0;
2887 78 : state.dataRoomAirMod->DSXM3TOC(ZoneNum) = 23.0;
2888 78 : state.dataRoomAirMod->DSXM4TOC(ZoneNum) = 23.0;
2889 78 : state.dataRoomAirMod->MATMX(ZoneNum) = 23.0;
2890 78 : state.dataRoomAirMod->XMATMX(ZoneNum) = 23.0;
2891 78 : state.dataRoomAirMod->XM2TMX(ZoneNum) = 23.0;
2892 78 : state.dataRoomAirMod->XM3TMX(ZoneNum) = 23.0;
2893 78 : state.dataRoomAirMod->XM4TMX(ZoneNum) = 23.0;
2894 78 : state.dataRoomAirMod->DSXMATMX(ZoneNum) = 23.0;
2895 78 : state.dataRoomAirMod->DSXM2TMX(ZoneNum) = 23.0;
2896 78 : state.dataRoomAirMod->DSXM3TMX(ZoneNum) = 23.0;
2897 78 : state.dataRoomAirMod->DSXM4TMX(ZoneNum) = 23.0;
2898 78 : state.dataRoomAirMod->ZTM1Floor(ZoneNum) = 23.0;
2899 78 : state.dataRoomAirMod->ZTM2Floor(ZoneNum) = 23.0;
2900 78 : state.dataRoomAirMod->ZTM3Floor(ZoneNum) = 23.0;
2901 78 : state.dataRoomAirMod->Zone1Floor(ZoneNum) = 23.0;
2902 78 : state.dataRoomAirMod->ZoneMXFloor(ZoneNum) = 23.0;
2903 78 : state.dataRoomAirMod->ZoneM2Floor(ZoneNum) = 23.0;
2904 78 : state.dataRoomAirMod->ZTM1OC(ZoneNum) = 23.0;
2905 78 : state.dataRoomAirMod->ZTM2OC(ZoneNum) = 23.0;
2906 78 : state.dataRoomAirMod->ZTM3OC(ZoneNum) = 23.0;
2907 78 : state.dataRoomAirMod->Zone1OC(ZoneNum) = 23.0;
2908 78 : state.dataRoomAirMod->ZoneMXOC(ZoneNum) = 23.0;
2909 78 : state.dataRoomAirMod->ZoneM2OC(ZoneNum) = 23.0;
2910 78 : state.dataRoomAirMod->ZTM1MX(ZoneNum) = 23.0;
2911 78 : state.dataRoomAirMod->ZTM2MX(ZoneNum) = 23.0;
2912 78 : state.dataRoomAirMod->ZTM3MX(ZoneNum) = 23.0;
2913 78 : state.dataRoomAirMod->Zone1MX(ZoneNum) = 23.0;
2914 78 : state.dataRoomAirMod->ZoneMXMX(ZoneNum) = 23.0;
2915 78 : state.dataRoomAirMod->ZoneM2MX(ZoneNum) = 23.0;
2916 78 : state.dataRoomAirMod->AIRRATFloor(ZoneNum) = 0.0;
2917 78 : state.dataRoomAirMod->AIRRATOC(ZoneNum) = 0.0;
2918 78 : state.dataRoomAirMod->AIRRATMX(ZoneNum) = 0.0;
2919 78 : state.dataRoomAirMod->ZTOC(ZoneNum) = 23.0;
2920 78 : state.dataRoomAirMod->ZTMX(ZoneNum) = 23.0;
2921 78 : state.dataRoomAirMod->ZTFloor(ZoneNum) = 23.0;
2922 78 : state.dataRoomAirMod->HeightTransition(ZoneNum) = 0.0;
2923 78 : state.dataRoomAirMod->Phi(ZoneNum) = 0.0;
2924 78 : state.dataUCSDShared->HCeiling = 0.0;
2925 78 : state.dataUCSDShared->HWall = 0.0;
2926 78 : state.dataUCSDShared->HFloor = 0.0;
2927 78 : state.dataUCSDShared->HInternal = 0.0;
2928 78 : state.dataUCSDShared->HWindow = 0.0;
2929 78 : state.dataUCSDShared->HDoor = 0.0;
2930 : }
2931 :
2932 110 : if (state.dataRoomAirMod->IsZoneDV(ZoneNum)) {
2933 :
2934 28 : state.dataRoomAirMod->DVHcIn = 0.0;
2935 28 : state.dataRoomAirMod->ZoneDVMixedFlagRep(ZoneNum) = 0.0;
2936 28 : state.dataRoomAirMod->ZoneDVMixedFlag(ZoneNum) = 0;
2937 : }
2938 :
2939 110 : if (state.dataRoomAirMod->IsZoneUI(ZoneNum)) {
2940 :
2941 50 : state.dataRoomAirMod->UFHcIn = 0.0;
2942 50 : state.dataRoomAirMod->ZoneUFMixedFlag(ZoneNum) = 0;
2943 50 : state.dataRoomAirMod->ZoneUFMixedFlagRep(ZoneNum) = 0.0;
2944 50 : state.dataRoomAirMod->ZoneUFGamma(ZoneNum) = 0.0;
2945 50 : state.dataRoomAirMod->ZoneUFPowInPlumes(ZoneNum) = 0.0;
2946 50 : state.dataRoomAirMod->ZoneUFPowInPlumesfromWindows(ZoneNum) = 0.0;
2947 : }
2948 :
2949 110 : if (state.dataRoomAirMod->IsZoneCV(ZoneNum)) {
2950 12 : state.dataRoomAirMod->ZTJET(ZoneNum) = 23.0;
2951 12 : state.dataRoomAirMod->RoomOutflowTemp(ZoneNum) = 23.0;
2952 12 : state.dataRoomAirMod->ZTREC(ZoneNum) = 23.0;
2953 12 : state.dataRoomAirMod->CVHcIn = 0.0;
2954 12 : state.dataRoomAirMod->JetRecAreaRatio(ZoneNum) = 0.2;
2955 12 : state.dataRoomAirMod->Urec(ZoneNum) = 0.2;
2956 12 : state.dataRoomAirMod->Ujet(ZoneNum) = 0.2;
2957 12 : state.dataRoomAirMod->Uhc(ZoneNum) = 0.2;
2958 12 : state.dataRoomAirMod->Ain(ZoneNum) = 1.0;
2959 12 : state.dataRoomAirMod->Tin(ZoneNum) = 23.0;
2960 12 : state.dataRoomAirMod->Droom(ZoneNum) = 6.0;
2961 12 : state.dataRoomAirMod->Dstar(ZoneNum) = 6.0;
2962 12 : state.dataRoomAirMod->ZoneCVisMixing(ZoneNum) = 0.0;
2963 12 : state.dataRoomAirMod->Rfr(ZoneNum) = 10.0;
2964 12 : state.dataRoomAirMod->ZoneCVhasREC(ZoneNum) = 1.0;
2965 12 : state.dataUCSDShared->HCeiling = 0.0;
2966 12 : state.dataUCSDShared->HWall = 0.0;
2967 12 : state.dataUCSDShared->HFloor = 0.0;
2968 12 : state.dataUCSDShared->HInternal = 0.0;
2969 12 : state.dataUCSDShared->HWindow = 0.0;
2970 12 : state.dataUCSDShared->HDoor = 0.0;
2971 : }
2972 :
2973 110 : state.dataRoomAirModelMgr->MyEnvrnFlag(ZoneNum) = false;
2974 : } // end one time inits
2975 :
2976 43671 : if (!state.dataGlobal->BeginEnvrnFlag) {
2977 43363 : state.dataRoomAirModelMgr->MyEnvrnFlag(ZoneNum) = true;
2978 : }
2979 43671 : }
2980 :
2981 6 : void GetRAFNNodeNum(EnergyPlusData &state,
2982 : std::string const &RAFNNodeName, // Name of RoomAir:Node:AirflowNetwork
2983 : int &ZoneNum, // The zone number associate with the node name
2984 : int &RAFNNodeNum, // RoomAir:Node:AirflowNetwork Number
2985 : bool &Errorfound // true if an error is found (TODO: Useless, RAFNodeNum is 0 when Errorfound is true)
2986 : )
2987 : {
2988 :
2989 : // FUNCTION INFORMATION:
2990 : // AUTHOR Lixing Gu
2991 : // DATE WRITTEN November 2014
2992 : // MODIFIED na
2993 : // RE-ENGINEERED na
2994 :
2995 : // PURPOSE OF THIS FUNCTION:
2996 : // This function looks up the given RoomAirNode name and returns the Zone number and RoomAir node
2997 : // number. If incorrect name is given, errorsfound is returned as true and value is returned
2998 : // as zero.
2999 :
3000 : // FUNCTION LOCAL VARIABLE DECLARATIONS:
3001 : int I; // Zone index
3002 :
3003 : // Obtains and Allocates RoomAirSettings : AirflowNetwork
3004 6 : if (state.dataRoomAirModelMgr->GetAirModelData) {
3005 1 : GetAirModelDatas(state);
3006 1 : state.dataRoomAirModelMgr->GetAirModelData = false;
3007 : }
3008 :
3009 6 : Errorfound = false;
3010 6 : RAFNNodeNum = 0;
3011 18 : for (I = 1; I <= state.dataGlobal->NumOfZones; ++I) {
3012 18 : if (state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(I).NumOfAirNodes > 0) {
3013 12 : RAFNNodeNum = UtilityRoutines::FindItemInList(RAFNNodeName,
3014 6 : state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(I).Node,
3015 6 : state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(I).NumOfAirNodes);
3016 6 : if (RAFNNodeNum > 0) {
3017 6 : ZoneNum = I;
3018 6 : break;
3019 : }
3020 : }
3021 : }
3022 :
3023 6 : if (RAFNNodeNum == 0) {
3024 0 : Errorfound = true;
3025 0 : ShowSevereError(state, "Could not find RoomAir:Node:AirflowNetwork number with AirflowNetwork:IntraZone:Node Name='" + RAFNNodeName);
3026 : }
3027 6 : }
3028 :
3029 6 : bool CheckEquipName(EnergyPlusData &state,
3030 : std::string const &EquipType, // Equipment type
3031 : std::string const &EquipName, // Equipment Name
3032 : std::string &SupplyNodeName, // Supply node name
3033 : std::string &ReturnNodeName, // Return node name
3034 : int TotNumEquip, // how many of this equipment type
3035 : int TypeNum // equipment type number
3036 : )
3037 : {
3038 :
3039 : // FUNCTION INFORMATION:
3040 : // AUTHOR Lixing Gu
3041 : // DATE WRITTEN March 2014
3042 : // MODIFIED na
3043 : // RE-ENGINEERED na
3044 :
3045 : // PURPOSE OF THIS FUNCTION:
3046 : // This function looks up the given RoomAirNode name and returns the Zone number and RoomAir node
3047 : // number.If incorrect name is given, errorsfound is returned as true and value is returned
3048 : // as zero.
3049 :
3050 : // Using/Aliasing
3051 : using Fans::GetFanOutletNode;
3052 :
3053 : // Return value
3054 : bool EquipFind; // True if an error is found
3055 :
3056 : // FUNCTION LOCAL VARIABLE DECLARATIONS:
3057 : int NumAlphas;
3058 : int NumNumbers;
3059 : int I;
3060 : int Status; // Used in GetObjectItem
3061 6 : int MaxNums = 0; // Maximum number of numeric input fields
3062 6 : int MaxAlphas = 0; // Maximum number of alpha input fields
3063 6 : int TotalArgs = 0; // Total number of alpha and numeric arguments(max) for a
3064 12 : Array1D_string Alphas; // Alpha input items for object
3065 12 : Array1D<Real64> Numbers; // Numeric input items for object
3066 : bool errorfound;
3067 :
3068 6 : NumAlphas = 1;
3069 6 : NumNumbers = 1;
3070 6 : EquipFind = false;
3071 :
3072 6 : SupplyNodeName = "";
3073 :
3074 6 : if (TypeNum == 0) return EquipFind;
3075 :
3076 6 : state.dataInputProcessing->inputProcessor->getObjectDefMaxArgs(state, EquipType, TotalArgs, NumAlphas, NumNumbers);
3077 :
3078 6 : MaxNums = max(MaxNums, NumNumbers);
3079 6 : MaxAlphas = max(MaxAlphas, NumAlphas);
3080 :
3081 6 : if (MaxNums > NumNumbers) {
3082 0 : Numbers.allocate(MaxNums);
3083 0 : Numbers = 0.0;
3084 6 : } else if (!allocated(Numbers)) {
3085 6 : Numbers.allocate(MaxNums);
3086 : }
3087 :
3088 6 : if (MaxAlphas > NumAlphas) {
3089 0 : Alphas.allocate(MaxAlphas);
3090 0 : Alphas = "";
3091 6 : } else if (!allocated(Alphas)) {
3092 6 : Alphas.allocate(NumAlphas);
3093 : }
3094 :
3095 6 : for (I = 1; I <= TotNumEquip; ++I) {
3096 6 : state.dataInputProcessing->inputProcessor->getObjectItem(state, EquipType, I, Alphas, NumAlphas, Numbers, NumNumbers, Status);
3097 6 : if (UtilityRoutines::SameString(Alphas(1), EquipName)) {
3098 6 : EquipFind = true;
3099 6 : break;
3100 : }
3101 : }
3102 :
3103 6 : if (TypeNum == DataHVACGlobals::ZoneEquipTypeOf_VariableRefrigerantFlow) { // ZoneHVAC:TerminalUnit : VariableRefrigerantFlow
3104 0 : SupplyNodeName = Alphas(4);
3105 0 : ReturnNodeName = ""; // Zone return node
3106 6 : } else if (TypeNum == DataHVACGlobals::ZoneEquipTypeOf_EnergyRecoveryVentilator) { // ZoneHVAC : EnergyRecoveryVentilator
3107 0 : I = GetFanOutletNode(state, "Fan:OnOff", Alphas(4), errorfound);
3108 0 : if (errorfound) {
3109 : }
3110 0 : SupplyNodeName = state.dataLoopNodes->NodeID(I); // ?????
3111 0 : ReturnNodeName = ""; // Zone exhaust node
3112 6 : } else if (TypeNum == DataHVACGlobals::ZoneEquipTypeOf_FourPipeFanCoil) { // ZoneHVAC : FourPipeFanCoil
3113 0 : SupplyNodeName = Alphas(6);
3114 0 : ReturnNodeName = Alphas(5);
3115 6 : } else if (TypeNum == DataHVACGlobals::ZoneEquipTypeOf_OutdoorAirUnit) { // ZoneHVAC : OutdoorAirUnit
3116 0 : SupplyNodeName = Alphas(13);
3117 0 : ReturnNodeName = Alphas(14);
3118 6 : } else if (TypeNum == DataHVACGlobals::ZoneEquipTypeOf_PackagedTerminalAirConditioner) { // ZoneHVAC : PackagedTerminalAirConditioner
3119 6 : SupplyNodeName = Alphas(4);
3120 6 : ReturnNodeName = Alphas(3);
3121 0 : } else if (TypeNum == DataHVACGlobals::ZoneEquipTypeOf_PackagedTerminalHeatPump) { // ZoneHVAC : PackagedTerminalHeatPump
3122 0 : SupplyNodeName = Alphas(4);
3123 0 : ReturnNodeName = Alphas(3);
3124 0 : } else if (TypeNum == DataHVACGlobals::ZoneEquipTypeOf_UnitHeater) { // ZoneHVAC : UnitHeater
3125 0 : SupplyNodeName = Alphas(4);
3126 0 : ReturnNodeName = Alphas(3);
3127 0 : } else if (TypeNum == DataHVACGlobals::ZoneEquipTypeOf_UnitVentilator) { // ZoneHVAC : UnitVentilator
3128 0 : SupplyNodeName = Alphas(7);
3129 0 : ReturnNodeName = Alphas(6);
3130 0 : } else if (TypeNum == DataHVACGlobals::ZoneEquipTypeOf_VentilatedSlab) { // ZoneHVAC : VentilatedSlab
3131 0 : SupplyNodeName = Alphas(20);
3132 0 : ReturnNodeName = Alphas(18);
3133 0 : } else if (TypeNum == DataHVACGlobals::ZoneEquipTypeOf_WaterToAirHeatPump) { // ZoneHVAC : WaterToAirHeatPump
3134 0 : SupplyNodeName = Alphas(4);
3135 0 : ReturnNodeName = Alphas(3);
3136 0 : } else if (TypeNum == DataHVACGlobals::ZoneEquipTypeOf_WindowAirConditioner) { // ZoneHVAC : WindowAirConditioner
3137 0 : SupplyNodeName = Alphas(4);
3138 0 : ReturnNodeName = Alphas(3);
3139 0 : } else if (TypeNum ==
3140 : DataHVACGlobals::ZoneEquipTypeOf_BaseboardRadiantConvectiveElectric) { // ZoneHVAC : Baseboard : RadiantConvective : Electric
3141 0 : SupplyNodeName = ""; // convection only
3142 0 : } else if (TypeNum == DataHVACGlobals::ZoneEquipTypeOf_BaseboardRadiantConvectiveWater) { // ZoneHVAC : Baseboard : RadiantConvective : Water
3143 0 : SupplyNodeName = "";
3144 0 : } else if (TypeNum == DataHVACGlobals::ZoneEquipTypeOf_BaseboardRadiantConvectiveSteam) { // ZoneHVAC : Baseboard : RadiantConvective : Steam
3145 0 : SupplyNodeName = "";
3146 0 : } else if (TypeNum == DataHVACGlobals::ZoneEquipTypeOf_BaseboardConvectiveElectric) { // ZoneHVAC : Baseboard : Convective : Electric
3147 0 : SupplyNodeName = "";
3148 0 : } else if (TypeNum == DataHVACGlobals::ZoneEquipTypeOf_BaseboardConvectiveWater) { // ZoneHVAC : Baseboard : Convective : Water
3149 0 : SupplyNodeName = "";
3150 0 : } else if (TypeNum == DataHVACGlobals::ZoneEquipTypeOf_HighTemperatureRadiant) { // ZoneHVAC : HighTemperatureRadiant
3151 0 : SupplyNodeName = "";
3152 0 : } else if (TypeNum == DataHVACGlobals::ZoneEquipTypeOf_DehumidifierDX) { // ZoneHVAC : Dehumidifier : DX
3153 0 : SupplyNodeName = Alphas(4);
3154 0 : ReturnNodeName = Alphas(3);
3155 0 : } else if (TypeNum == DataHVACGlobals::ZoneEquipTypeOf_IdealLoadsAirSystem) { // ZoneHVAC : IdealLoadsAirSystem
3156 0 : SupplyNodeName = Alphas(3);
3157 0 : ReturnNodeName = Alphas(4);
3158 0 : } else if (TypeNum == DataHVACGlobals::ZoneEquipTypeOf_RefrigerationChillerSet) { // ZoneHVAC : RefrigerationChillerSet
3159 0 : SupplyNodeName = Alphas(5);
3160 0 : ReturnNodeName = Alphas(4);
3161 0 : } else if (TypeNum == DataHVACGlobals::ZoneEquipTypeOf_HybridUnitaryAirConditioners) { // ZoneHVAC : HybridUnitaryAirConditioners
3162 0 : SupplyNodeName = Alphas(11);
3163 0 : ReturnNodeName = Alphas(9);
3164 0 : } else if (TypeNum == DataHVACGlobals::ZoneEquipTypeOf_FanZoneExhaust) { // Fan : ZoneExhaust
3165 0 : SupplyNodeName = ""; // ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? May not use
3166 0 : } else if (TypeNum == DataHVACGlobals::ZoneEquipTypeOf_WaterHeaterHeatPump) { // WaterHeater : HeatPump
3167 0 : SupplyNodeName = Alphas(8);
3168 0 : ReturnNodeName = Alphas(7);
3169 : // For AirTerminals, find matching return node later
3170 0 : } else if (TypeNum == DataHVACGlobals::ZoneEquipTypeOf_AirTerminalDualDuctConstantVolume) { // AirTerminal : DualDuct : ConstantVolume
3171 0 : SupplyNodeName = Alphas(1);
3172 0 : ReturnNodeName = "";
3173 0 : } else if (TypeNum == DataHVACGlobals::ZoneEquipTypeOf_AirTerminalDualDuctVAV) { // AirTerminal : DualDuct : VAV
3174 0 : SupplyNodeName = Alphas(1);
3175 0 : ReturnNodeName = "";
3176 0 : } else if (TypeNum ==
3177 : DataHVACGlobals::ZoneEquipTypeOf_AirTerminalSingleDuctConstantVolumeReheat) { // AirTerminal : SingleDuct : ConstantVolume : Reheat
3178 0 : SupplyNodeName = Alphas(1);
3179 0 : ReturnNodeName = "";
3180 0 : } else if (TypeNum == DataHVACGlobals::ZoneEquipTypeOf_AirTerminalSingleDuctConstantVolumeNoReheat) { // AirTerminal : SingleDuct :
3181 : // ConstantVolume : NoReheat
3182 0 : SupplyNodeName = Alphas(4);
3183 0 : ReturnNodeName = "";
3184 0 : } else if (TypeNum == DataHVACGlobals::ZoneEquipTypeOf_AirTerminalSingleDuctVAVReheat) { // AirTerminal : SingleDuct : VAV : Reheat
3185 0 : SupplyNodeName = Alphas(1);
3186 0 : ReturnNodeName = "";
3187 0 : } else if (TypeNum == DataHVACGlobals::ZoneEquipTypeOf_AirTerminalSingleDuctVAVNoReheat) { // AirTerminal : SingleDuct : VAV : NoReheat
3188 0 : SupplyNodeName = Alphas(1);
3189 0 : ReturnNodeName = "";
3190 0 : } else if (TypeNum ==
3191 : DataHVACGlobals::ZoneEquipTypeOf_AirTerminalSingleDuctSeriesPIUReheat) { // AirTerminal : SingleDuct : SeriesPIU : Reheat
3192 0 : SupplyNodeName = Alphas(1);
3193 0 : ReturnNodeName = "";
3194 0 : } else if (TypeNum ==
3195 : DataHVACGlobals::ZoneEquipTypeOf_AirTerminalSingleDuctParallelPIUReheat) { // AirTerminal : SingleDuct : ParallelPIU : Reheat
3196 0 : SupplyNodeName = Alphas(1);
3197 0 : ReturnNodeName = "";
3198 0 : } else if (TypeNum == DataHVACGlobals::ZoneEquipTypeOf_AirTerminalSingleDuctCAVFourPipeInduction) { // AirTerminal : SingleDuct :
3199 : // ConstantVolume : FourPipeInduction
3200 0 : SupplyNodeName = Alphas(1);
3201 0 : ReturnNodeName = "";
3202 0 : } else if (TypeNum == DataHVACGlobals::ZoneEquipTypeOf_AirTerminalSingleDuctVAVReheatVariableSpeedFan) { // AirTerminal : SingleDuct : VAV
3203 : // : Reheat : VariableSpeedFan
3204 0 : SupplyNodeName = Alphas(1);
3205 0 : ReturnNodeName = "";
3206 0 : } else if (TypeNum == DataHVACGlobals::ZoneEquipTypeOf_AirTerminalSingleDuctVAVHeatAndCoolReheat) { // AirTerminal : SingleDuct : VAV :
3207 : // HeatAndCool : Reheat
3208 0 : SupplyNodeName = Alphas(1);
3209 0 : ReturnNodeName = "";
3210 0 : } else if (TypeNum == DataHVACGlobals::ZoneEquipTypeOf_AirTerminalSingleDuctVAVHeatAndCoolNoReheat) { // AirTerminal : SingleDuct : VAV :
3211 : // HeatAndCool : NoReheat
3212 0 : SupplyNodeName = Alphas(1);
3213 0 : ReturnNodeName = "";
3214 0 : } else if (TypeNum == DataHVACGlobals::ZoneEquipTypeOf_AirTerminalSingleDuctConstantVolumeCooledBeam) { // AirTerminal : SingleDuct :
3215 : // ConstantVolume : CooledBeam
3216 0 : SupplyNodeName = Alphas(5);
3217 0 : ReturnNodeName = "";
3218 0 : } else if (TypeNum == DataHVACGlobals::ZoneEquipTypeOf_AirTerminalDualDuctVAVOutdoorAir) { // AirTerminal : DualDuct : VAV : OutdoorAir
3219 0 : SupplyNodeName = Alphas(3);
3220 0 : ReturnNodeName = "";
3221 0 : } else if (TypeNum == DataHVACGlobals::ZoneEquipTypeOf_AirLoopHVACReturnAir) { // AirLoopHVACReturnAir
3222 0 : SupplyNodeName = Alphas(4); //
3223 0 : ReturnNodeName = ""; //
3224 : }
3225 :
3226 : // Need to find a better to handle allocate and deallocate
3227 6 : if (MaxAlphas > NumAlphas) {
3228 6 : Alphas.deallocate();
3229 : }
3230 6 : if (MaxNums > NumNumbers) {
3231 6 : Numbers.deallocate();
3232 : }
3233 :
3234 6 : return EquipFind;
3235 : }
3236 :
3237 : //*****************************************************************************************
3238 :
3239 : } // namespace RoomAirModelManager
3240 :
3241 2313 : } // namespace EnergyPlus
|