LCOV - code coverage report
Current view: top level - EnergyPlus - UFADManager.cc (source / functions) Hit Total Coverage
Test: lcov.output.filtered Lines: 761 1191 63.9 %
Date: 2023-01-17 19:17:23 Functions: 8 8 100.0 %

          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 <cmath>
      50             : 
      51             : // ObjexxFCL Headers
      52             : #include <ObjexxFCL/Array1D.hh>
      53             : #include <ObjexxFCL/Fmath.hh>
      54             : #include <ObjexxFCL/member.functions.hh>
      55             : 
      56             : // EnergyPlus Headers
      57             : #include <EnergyPlus/Autosizing/Base.hh>
      58             : #include <EnergyPlus/ConvectionCoefficients.hh>
      59             : #include <EnergyPlus/Data/EnergyPlusData.hh>
      60             : #include <EnergyPlus/DataEnvironment.hh>
      61             : #include <EnergyPlus/DataHVACGlobals.hh>
      62             : #include <EnergyPlus/DataHeatBalFanSys.hh>
      63             : #include <EnergyPlus/DataHeatBalSurface.hh>
      64             : #include <EnergyPlus/DataHeatBalance.hh>
      65             : #include <EnergyPlus/DataLoopNode.hh>
      66             : #include <EnergyPlus/DataRoomAirModel.hh>
      67             : #include <EnergyPlus/DataSizing.hh>
      68             : #include <EnergyPlus/DataSurfaces.hh>
      69             : #include <EnergyPlus/DataUCSDSharedData.hh>
      70             : #include <EnergyPlus/DataZoneEquipment.hh>
      71             : #include <EnergyPlus/General.hh>
      72             : #include <EnergyPlus/InternalHeatGains.hh>
      73             : #include <EnergyPlus/Psychrometrics.hh>
      74             : #include <EnergyPlus/UFADManager.hh>
      75             : #include <EnergyPlus/UtilityRoutines.hh>
      76             : #include <EnergyPlus/ZoneTempPredictorCorrector.hh>
      77             : 
      78             : namespace EnergyPlus::UFADManager {
      79             : 
      80             : // Module containing the routines dealing with the UnderFloor Air
      81             : // Distribution zone model
      82             : 
      83             : // MODULE INFORMATION:
      84             : //       AUTHOR         Fred Buhl
      85             : //       DATE WRITTEN   August 2005
      86             : //       MODIFIED       na
      87             : //       RE-ENGINEERED  na
      88             : 
      89             : // PURPOSE OF THIS MODULE:
      90             : // Encapsulate the routines that do the simulation of the UCSD UFAD non-uniform
      91             : // zone models
      92             : 
      93             : // METHODOLOGY EMPLOYED:
      94             : // 2-node zone model with the node heights varying as a function of internal loads
      95             : // and supply air flow (and other factors)
      96             : 
      97             : // REFERENCES:
      98             : // See the EnergyPlus Engineering Reference and the PhD thesis of Anna Liu, UC San Diego
      99             : 
     100             : // OTHER NOTES:
     101             : // na
     102             : 
     103             : // Using/Aliasing
     104             : using namespace DataLoopNode;
     105             : using namespace DataEnvironment;
     106             : using namespace DataHeatBalance;
     107             : using namespace DataHeatBalSurface;
     108             : using namespace DataSurfaces;
     109             : using namespace DataRoomAirModel;
     110             : using ConvectionCoefficients::CalcDetailedHcInForDVModel;
     111             : 
     112       17580 : void ManageUCSDUFModels(EnergyPlusData &state,
     113             :                         int const ZoneNum,                                 // index number for the specified zone
     114             :                         DataRoomAirModel::RoomAirModel const ZoneModelType // type of zone model; UCSDUFI = 6
     115             : )
     116             : {
     117             : 
     118             :     // SUBROUTINE INFORMATION:
     119             :     //       AUTHOR         Fred Buhl
     120             :     //       DATE WRITTEN   August, 2005
     121             :     //       MODIFIED       na
     122             :     //       RE-ENGINEERED  na
     123             : 
     124             :     // PURPOSE OF THIS SUBROUTINE:
     125             :     // Manages the simulation of the 2-node nonuniform zone models for underfloor air
     126             :     // distribution systems (UFAD). Called from RoomAirManager, ManageAirModel
     127             : 
     128             :     // METHODOLOGY EMPLOYED:
     129             :     // uses Init and Calc routines in the standard EPlus manner to manage the calculation
     130             :     // Note that much of the initialization is done in RoomAirManager, SharedDVCVUFDataInit
     131             : 
     132             :     // Using/Aliasing
     133             :     using namespace DataLoopNode;
     134             :     using namespace DataEnvironment;
     135             :     using namespace DataHeatBalance;
     136             :     using namespace DataHeatBalSurface;
     137             :     using namespace DataSurfaces;
     138             :     using namespace DataRoomAirModel;
     139             :     using ConvectionCoefficients::CalcDetailedHcInForDVModel;
     140             : 
     141             :     // input was obtained in RoomAirManager, GetUFADIntZoneData
     142             : 
     143       17580 :     InitUCSDUF(state, ZoneNum, ZoneModelType); // initialize some module variables
     144             : 
     145       17580 :     switch (ZoneModelType) {
     146        3516 :     case DataRoomAirModel::RoomAirModel::UCSDUFI: { // UCSD UFAD interior zone model
     147             :         // simulate room airflow using the UCSDUFI model
     148        3516 :         CalcUCSDUI(state, ZoneNum);
     149        3516 :     } break;
     150       14064 :     case DataRoomAirModel::RoomAirModel::UCSDUFE: { // UCSD UFAD interior zone model
     151             :         // simulate room airflow using the UCSDUFI model
     152       14064 :         CalcUCSDUE(state, ZoneNum);
     153       14064 :     } break;
     154           0 :     default:
     155           0 :         break;
     156             :     }
     157       17580 : }
     158             : 
     159       17580 : void InitUCSDUF(EnergyPlusData &state,
     160             :                 int const ZoneNum,
     161             :                 DataRoomAirModel::RoomAirModel const ZoneModelType // type of zone model; UCSDUFI = 6
     162             : )
     163             : {
     164             : 
     165             :     // SUBROUTINE INFORMATION:
     166             :     //       AUTHOR         Fred Buhl
     167             :     //       DATE WRITTEN   August 2005
     168             :     //       MODIFIED       na
     169             :     //       RE-ENGINEERED  na
     170             : 
     171             :     // PURPOSE OF THIS SUBROUTINE:
     172             :     // initialize arrays & variables used by the UCSD UFAD zone models
     173             : 
     174             :     // METHODOLOGY EMPLOYED:
     175             :     // Note that much of the initialization is done in RoomAirManager, SharedDVCVUFDataInit
     176             : 
     177       17580 :     Real64 NumShadesDown(0.0);
     178             :     int UINum; // index to underfloor interior zone model data
     179             : 
     180             :     // Do the one time initializations
     181       17580 :     if (state.dataUFADManager->MyOneTimeFlag) {
     182           1 :         state.dataUFADManager->HeightFloorSubzoneTop = 0.2;
     183           1 :         state.dataUFADManager->ThickOccupiedSubzoneMin = 0.2;
     184           1 :         state.dataUFADManager->HeightIntMassDefault = 2.0;
     185           1 :         state.dataUFADManager->MyOneTimeFlag = false;
     186           1 :         state.dataUFADManager->MySizeFlag.dimension(state.dataGlobal->NumOfZones, true);
     187             :     }
     188             : 
     189       17580 :     if (state.dataUFADManager->MySizeFlag(ZoneNum)) {
     190           5 :         SizeUCSDUF(state, ZoneNum, ZoneModelType);
     191           5 :         state.dataUFADManager->MySizeFlag(ZoneNum) = false;
     192             :     }
     193             : 
     194             :     // initialize these variables every timestep
     195             : 
     196       17580 :     state.dataUFADManager->HeightIntMass = state.dataUFADManager->HeightIntMassDefault;
     197       17580 :     state.dataRoomAirMod->ZoneUFGamma(ZoneNum) = 0.0;
     198       17580 :     state.dataRoomAirMod->ZoneUFPowInPlumes(ZoneNum) = 0.0;
     199       17580 :     NumShadesDown = 0.0;
     200       38676 :     for (int Ctd = state.dataUCSDShared->PosZ_Window((ZoneNum - 1) * 2 + 1); Ctd <= state.dataUCSDShared->PosZ_Window((ZoneNum - 1) * 2 + 2); ++Ctd) {
     201       21096 :         int SurfNum = state.dataUCSDShared->APos_Window(Ctd);
     202       21096 :         if (SurfNum == 0) continue;
     203       42192 :         if (state.dataSurface->Surface(SurfNum).ExtBoundCond == ExternalEnvironment ||
     204           0 :             state.dataSurface->Surface(SurfNum).ExtBoundCond == OtherSideCoefNoCalcExt ||
     205       21096 :             state.dataSurface->Surface(SurfNum).ExtBoundCond == OtherSideCoefCalcExt ||
     206           0 :             state.dataSurface->Surface(SurfNum).ExtBoundCond == OtherSideCondModeledExt) {
     207       21096 :             if (ANY_INTERIOR_SHADE_BLIND(state.dataSurface->SurfWinShadingFlag(SurfNum))) {
     208           0 :                 ++NumShadesDown;
     209             :             }
     210             :         }
     211             :     }
     212       17580 :     if (ZoneModelType == DataRoomAirModel::RoomAirModel::UCSDUFE) {
     213       14064 :         UINum = state.dataRoomAirMod->ZoneUFPtr(ZoneNum);
     214       14064 :         if (state.dataRoomAirMod->ZoneUCSDUE(UINum).NumExtWin > 1.0) {
     215        7032 :             if (NumShadesDown / state.dataRoomAirMod->ZoneUCSDUE(UINum).NumExtWin >= 0.5) {
     216           0 :                 state.dataRoomAirMod->ZoneUCSDUE(UINum).ShadeDown = true;
     217             :             } else {
     218        7032 :                 state.dataRoomAirMod->ZoneUCSDUE(UINum).ShadeDown = false;
     219             :             }
     220             :         } else {
     221        7032 :             state.dataRoomAirMod->ZoneUCSDUE(UINum).ShadeDown = false;
     222             :         }
     223             :     }
     224       17580 : }
     225             : 
     226           5 : void SizeUCSDUF(EnergyPlusData &state,
     227             :                 int const ZoneNum,
     228             :                 DataRoomAirModel::RoomAirModel const ZoneModelType // type of zone model; UCSDUFI = 6
     229             : )
     230             : {
     231             : 
     232             :     // SUBROUTINE INFORMATION:
     233             :     //       AUTHOR         Fred Buhl
     234             :     //       DATE WRITTEN   August 2005
     235             :     //       MODIFIED       na
     236             :     //       RE-ENGINEERED  na
     237             : 
     238             :     // PURPOSE OF THIS SUBROUTINE:
     239             :     // set some smart defaults for UFAD systems
     240             : 
     241             :     // METHODOLOGY EMPLOYED:
     242             :     // use data from Center for Built Environment
     243             : 
     244             :     using DataSizing::AutoSize;
     245             : 
     246             :     int UINum;                     // index to underfloor interior zone model data
     247           5 :     Real64 NumberOfOccupants(0.0); // design number of occupants in the zone
     248           5 :     Real64 NumberOfPlumes(0.0);    // design number of plumes in the zone
     249           5 :     Real64 ZoneElecConv(0.0);      // zone elec equip design convective gain [W]
     250           5 :     Real64 ZoneGasConv(0.0);       // zone gas equip design convective gain [W]
     251           5 :     Real64 ZoneOthEqConv(0.0);     // zone other equip design convective gain [W]
     252           5 :     Real64 ZoneHWEqConv(0.0);      // zone hot water equip design convective gain [W]
     253           5 :     Real64 ZoneSteamEqConv(0.0);   // zone steam equip design convective gain [W]
     254             : 
     255           5 :     if (ZoneModelType == DataRoomAirModel::RoomAirModel::UCSDUFI) {
     256           1 :         UINum = state.dataRoomAirMod->ZoneUFPtr(ZoneNum);
     257           1 :         NumberOfOccupants = 0.0;
     258           6 :         for (int Ctd = 1; Ctd <= state.dataHeatBal->TotPeople; ++Ctd) {
     259           5 :             if (state.dataHeatBal->People(Ctd).ZonePtr == ZoneNum) {
     260           1 :                 NumberOfOccupants += state.dataHeatBal->People(Ctd).NumberOfPeople;
     261             :             }
     262             :         }
     263           1 :         if (state.dataRoomAirMod->ZoneUCSDUI(UINum).DiffArea == AutoSize) {
     264           1 :             if (state.dataRoomAirMod->ZoneUCSDUI(UINum).DiffuserType == Diffuser::Swirl) {
     265           1 :                 state.dataRoomAirMod->ZoneUCSDUI(UINum).DiffArea = 0.0075;
     266           0 :             } else if (state.dataRoomAirMod->ZoneUCSDUI(UINum).DiffuserType == Diffuser::VarArea) {
     267           0 :                 state.dataRoomAirMod->ZoneUCSDUI(UINum).DiffArea = 0.035;
     268           0 :             } else if (state.dataRoomAirMod->ZoneUCSDUI(UINum).DiffuserType == Diffuser::DisplVent) {
     269           0 :                 state.dataRoomAirMod->ZoneUCSDUI(UINum).DiffArea = 0.0060;
     270           0 :             } else if (state.dataRoomAirMod->ZoneUCSDUI(UINum).DiffuserType == Diffuser::LinBarGrille) {
     271             :                 // 4 ft x 4 inches; 75 cfm per linear foot; area is .025 m2/m
     272           0 :                 state.dataRoomAirMod->ZoneUCSDUI(UINum).DiffArea = 0.03;
     273             :             } else {
     274           0 :                 state.dataRoomAirMod->ZoneUCSDUI(UINum).DiffArea = 0.0075;
     275             :             }
     276           4 :             BaseSizer::reportSizerOutput(state,
     277             :                                          "RoomAirSettings:UnderFloorAirDistributionInterior",
     278           1 :                                          state.dataRoomAirMod->ZoneUCSDUI(UINum).ZoneName,
     279             :                                          "Design effective area of diffuser",
     280           3 :                                          state.dataRoomAirMod->ZoneUCSDUI(UINum).DiffArea);
     281             :         }
     282           1 :         if (state.dataRoomAirMod->ZoneUCSDUI(UINum).DiffAngle == AutoSize) {
     283           1 :             if (state.dataRoomAirMod->ZoneUCSDUI(UINum).DiffuserType == Diffuser::Swirl) {
     284           1 :                 state.dataRoomAirMod->ZoneUCSDUI(UINum).DiffAngle = 28.0;
     285           0 :             } else if (state.dataRoomAirMod->ZoneUCSDUI(UINum).DiffuserType == Diffuser::VarArea) {
     286           0 :                 state.dataRoomAirMod->ZoneUCSDUI(UINum).DiffAngle = 45.0;
     287           0 :             } else if (state.dataRoomAirMod->ZoneUCSDUI(UINum).DiffuserType == Diffuser::DisplVent) {
     288           0 :                 state.dataRoomAirMod->ZoneUCSDUI(UINum).DiffAngle = 73.0;
     289           0 :             } else if (state.dataRoomAirMod->ZoneUCSDUI(UINum).DiffuserType == Diffuser::LinBarGrille) {
     290           0 :                 state.dataRoomAirMod->ZoneUCSDUI(UINum).DiffAngle = 15.0;
     291             :             } else {
     292           0 :                 state.dataRoomAirMod->ZoneUCSDUI(UINum).DiffAngle = 28.0;
     293             :             }
     294           4 :             BaseSizer::reportSizerOutput(state,
     295             :                                          "RoomAirSettings:UnderFloorAirDistributionInterior",
     296           1 :                                          state.dataRoomAirMod->ZoneUCSDUI(UINum).ZoneName,
     297             :                                          "Angle between diffuser slots and the vertical",
     298           3 :                                          state.dataRoomAirMod->ZoneUCSDUI(UINum).DiffAngle);
     299             :         }
     300           1 :         if (state.dataRoomAirMod->ZoneUCSDUI(UINum).TransHeight == AutoSize) {
     301           0 :             state.dataRoomAirMod->ZoneUCSDUI(UINum).CalcTransHeight = true;
     302           0 :             state.dataRoomAirMod->ZoneUCSDUI(UINum).TransHeight = 0.0;
     303             :         } else {
     304           1 :             state.dataRoomAirMod->ZoneUCSDUI(UINum).CalcTransHeight = false;
     305             :         }
     306           1 :         if (state.dataRoomAirMod->ZoneUCSDUI(UINum).DiffuserType == Diffuser::Swirl) {
     307           3 :             if (state.dataRoomAirMod->ZoneUCSDUI(UINum).A_Kc != DataGlobalConstants::AutoCalculate ||
     308           2 :                 state.dataRoomAirMod->ZoneUCSDUI(UINum).B_Kc != DataGlobalConstants::AutoCalculate ||
     309           2 :                 state.dataRoomAirMod->ZoneUCSDUI(UINum).C_Kc != DataGlobalConstants::AutoCalculate ||
     310           3 :                 state.dataRoomAirMod->ZoneUCSDUI(UINum).D_Kc != DataGlobalConstants::AutoCalculate ||
     311           1 :                 state.dataRoomAirMod->ZoneUCSDUI(UINum).E_Kc != DataGlobalConstants::AutoCalculate) {
     312           0 :                 ShowWarningError(state,
     313           0 :                                  "For RoomAirSettings:UnderFloorAirDistributionInterior for Zone " +
     314           0 :                                      state.dataRoomAirMod->ZoneUCSDUI(UINum).ZoneName +
     315             :                                      ", input for Coefficients A - E will be ignored when Floor Diffuser Type = Swirl.");
     316           0 :                 ShowContinueError(state, "  To input these Coefficients, use Floor Diffuser Type = Custom.");
     317             :             }
     318           1 :             state.dataRoomAirMod->ZoneUCSDUI(UINum).A_Kc = 0.0;
     319           1 :             state.dataRoomAirMod->ZoneUCSDUI(UINum).B_Kc = 0.0;
     320           1 :             state.dataRoomAirMod->ZoneUCSDUI(UINum).C_Kc = 0.6531;
     321           1 :             state.dataRoomAirMod->ZoneUCSDUI(UINum).D_Kc = 0.0069;
     322           1 :             state.dataRoomAirMod->ZoneUCSDUI(UINum).E_Kc = -0.00004;
     323           0 :         } else if (state.dataRoomAirMod->ZoneUCSDUI(UINum).DiffuserType == Diffuser::VarArea) {
     324           0 :             if (state.dataRoomAirMod->ZoneUCSDUI(UINum).A_Kc != DataGlobalConstants::AutoCalculate ||
     325           0 :                 state.dataRoomAirMod->ZoneUCSDUI(UINum).B_Kc != DataGlobalConstants::AutoCalculate ||
     326           0 :                 state.dataRoomAirMod->ZoneUCSDUI(UINum).C_Kc != DataGlobalConstants::AutoCalculate ||
     327           0 :                 state.dataRoomAirMod->ZoneUCSDUI(UINum).D_Kc != DataGlobalConstants::AutoCalculate ||
     328           0 :                 state.dataRoomAirMod->ZoneUCSDUI(UINum).E_Kc != DataGlobalConstants::AutoCalculate) {
     329           0 :                 ShowWarningError(state,
     330           0 :                                  "For RoomAirSettings:UnderFloorAirDistributionInterior for Zone " +
     331           0 :                                      state.dataRoomAirMod->ZoneUCSDUI(UINum).ZoneName +
     332             :                                      ", input for Coefficients A - E will be ignored when Floor Diffuser Type = VariableArea.");
     333           0 :                 ShowContinueError(state, "  To input these Coefficients, use Floor Diffuser Type = Custom.");
     334             :             }
     335           0 :             state.dataRoomAirMod->ZoneUCSDUI(UINum).A_Kc = 0.0;
     336           0 :             state.dataRoomAirMod->ZoneUCSDUI(UINum).B_Kc = 0.0;
     337           0 :             state.dataRoomAirMod->ZoneUCSDUI(UINum).C_Kc = 0.88;
     338           0 :             state.dataRoomAirMod->ZoneUCSDUI(UINum).D_Kc = 0.0;
     339           0 :             state.dataRoomAirMod->ZoneUCSDUI(UINum).E_Kc = 0.0;
     340           0 :         } else if (state.dataRoomAirMod->ZoneUCSDUI(UINum).DiffuserType == Diffuser::DisplVent) {
     341           0 :             if (state.dataRoomAirMod->ZoneUCSDUI(UINum).A_Kc != DataGlobalConstants::AutoCalculate ||
     342           0 :                 state.dataRoomAirMod->ZoneUCSDUI(UINum).B_Kc != DataGlobalConstants::AutoCalculate ||
     343           0 :                 state.dataRoomAirMod->ZoneUCSDUI(UINum).C_Kc != DataGlobalConstants::AutoCalculate ||
     344           0 :                 state.dataRoomAirMod->ZoneUCSDUI(UINum).D_Kc != DataGlobalConstants::AutoCalculate ||
     345           0 :                 state.dataRoomAirMod->ZoneUCSDUI(UINum).E_Kc != DataGlobalConstants::AutoCalculate) {
     346           0 :                 ShowWarningError(state,
     347           0 :                                  "For RoomAirSettings:UnderFloorAirDistributionInterior for Zone " +
     348           0 :                                      state.dataRoomAirMod->ZoneUCSDUI(UINum).ZoneName +
     349             :                                      ", input for Coefficients A - E will be ignored when Floor Diffuser Type = HorizontalDisplacement.");
     350           0 :                 ShowContinueError(state, "  To input these Coefficients, use Floor Diffuser Type = Custom.");
     351             :             }
     352           0 :             state.dataRoomAirMod->ZoneUCSDUI(UINum).A_Kc = 0.0;
     353           0 :             state.dataRoomAirMod->ZoneUCSDUI(UINum).B_Kc = 0.0;
     354           0 :             state.dataRoomAirMod->ZoneUCSDUI(UINum).C_Kc = 0.67;
     355           0 :             state.dataRoomAirMod->ZoneUCSDUI(UINum).D_Kc = 0.0;
     356           0 :             state.dataRoomAirMod->ZoneUCSDUI(UINum).E_Kc = 0.0;
     357           0 :         } else if (state.dataRoomAirMod->ZoneUCSDUI(UINum).DiffuserType == Diffuser::LinBarGrille) {
     358           0 :             if (state.dataRoomAirMod->ZoneUCSDUI(UINum).A_Kc != DataGlobalConstants::AutoCalculate ||
     359           0 :                 state.dataRoomAirMod->ZoneUCSDUI(UINum).B_Kc != DataGlobalConstants::AutoCalculate ||
     360           0 :                 state.dataRoomAirMod->ZoneUCSDUI(UINum).C_Kc != DataGlobalConstants::AutoCalculate ||
     361           0 :                 state.dataRoomAirMod->ZoneUCSDUI(UINum).D_Kc != DataGlobalConstants::AutoCalculate ||
     362           0 :                 state.dataRoomAirMod->ZoneUCSDUI(UINum).E_Kc != DataGlobalConstants::AutoCalculate) {
     363           0 :                 ShowWarningError(state,
     364           0 :                                  "For RoomAirSettings:UnderFloorAirDistributionInterior for Zone " +
     365           0 :                                      state.dataRoomAirMod->ZoneUCSDUI(UINum).ZoneName +
     366             :                                      ", input for Coefficients A - E will be ignored when Floor Diffuser Type = LinearBarGrille.");
     367           0 :                 ShowContinueError(state, "  To input these Coefficients, use Floor Diffuser Type = Custom.");
     368             :             }
     369           0 :             state.dataRoomAirMod->ZoneUCSDUI(UINum).A_Kc = 0.0;
     370           0 :             state.dataRoomAirMod->ZoneUCSDUI(UINum).B_Kc = 0.0;
     371           0 :             state.dataRoomAirMod->ZoneUCSDUI(UINum).C_Kc = 0.8;
     372           0 :             state.dataRoomAirMod->ZoneUCSDUI(UINum).D_Kc = 0.0;
     373           0 :             state.dataRoomAirMod->ZoneUCSDUI(UINum).E_Kc = 0.0;
     374             :         } else {
     375           0 :             if (state.dataRoomAirMod->ZoneUCSDUI(UINum).A_Kc == DataGlobalConstants::AutoCalculate ||
     376           0 :                 state.dataRoomAirMod->ZoneUCSDUI(UINum).B_Kc == DataGlobalConstants::AutoCalculate ||
     377           0 :                 state.dataRoomAirMod->ZoneUCSDUI(UINum).C_Kc == DataGlobalConstants::AutoCalculate ||
     378           0 :                 state.dataRoomAirMod->ZoneUCSDUI(UINum).D_Kc == DataGlobalConstants::AutoCalculate ||
     379           0 :                 state.dataRoomAirMod->ZoneUCSDUI(UINum).E_Kc == DataGlobalConstants::AutoCalculate) {
     380           0 :                 ShowFatalError(state,
     381           0 :                                "For RoomAirSettings:UnderFloorAirDistributionInterior for Zone " + state.dataRoomAirMod->ZoneUCSDUI(UINum).ZoneName +
     382             :                                    ", input for Coefficients A - E must be specified when Floor Diffuser Type = Custom.");
     383             :             }
     384             :         }
     385           1 :         if (state.dataRoomAirMod->ZoneUCSDUI(UINum).PowerPerPlume == DataGlobalConstants::AutoCalculate) {
     386           1 :             NumberOfPlumes = 0.0;
     387           1 :             if (NumberOfOccupants > 0.0) {
     388           1 :                 NumberOfPlumes = NumberOfOccupants;
     389             :             } else {
     390           0 :                 NumberOfPlumes = 1.0;
     391             :             }
     392           1 :             ZoneElecConv = 0.0;
     393           6 :             for (int Ctd = 1; Ctd <= state.dataHeatBal->TotElecEquip; ++Ctd) {
     394           5 :                 if (state.dataHeatBal->ZoneElectric(Ctd).ZonePtr == ZoneNum) {
     395           1 :                     ZoneElecConv += state.dataHeatBal->ZoneElectric(Ctd).DesignLevel * state.dataHeatBal->ZoneElectric(Ctd).FractionConvected;
     396             :                 }
     397             :             }
     398           1 :             ZoneGasConv = 0.0;
     399           1 :             for (int Ctd = 1; Ctd <= state.dataHeatBal->TotGasEquip; ++Ctd) {
     400           0 :                 if (state.dataHeatBal->ZoneGas(Ctd).ZonePtr == ZoneNum) {
     401           0 :                     ZoneGasConv += state.dataHeatBal->ZoneGas(Ctd).DesignLevel * state.dataHeatBal->ZoneGas(Ctd).FractionConvected;
     402             :                 }
     403             :             }
     404           1 :             ZoneOthEqConv = 0.0;
     405           1 :             for (int Ctd = 1; Ctd <= state.dataHeatBal->TotOthEquip; ++Ctd) {
     406           0 :                 if (state.dataHeatBal->ZoneOtherEq(Ctd).ZonePtr == ZoneNum) {
     407           0 :                     ZoneOthEqConv += state.dataHeatBal->ZoneOtherEq(Ctd).DesignLevel * state.dataHeatBal->ZoneOtherEq(Ctd).FractionConvected;
     408             :                 }
     409             :             }
     410           1 :             ZoneHWEqConv = 0.0;
     411           1 :             for (int Ctd = 1; Ctd <= state.dataHeatBal->TotHWEquip; ++Ctd) {
     412           0 :                 if (state.dataHeatBal->ZoneHWEq(Ctd).ZonePtr == ZoneNum) {
     413           0 :                     ZoneHWEqConv += state.dataHeatBal->ZoneHWEq(Ctd).DesignLevel * state.dataHeatBal->ZoneHWEq(Ctd).FractionConvected;
     414             :                 }
     415             :             }
     416           1 :             for (int Ctd = 1; Ctd <= state.dataHeatBal->TotStmEquip; ++Ctd) {
     417           0 :                 ZoneSteamEqConv = 0.0;
     418           0 :                 if (state.dataHeatBal->ZoneSteamEq(Ctd).ZonePtr == ZoneNum) {
     419           0 :                     ZoneSteamEqConv += state.dataHeatBal->ZoneSteamEq(Ctd).DesignLevel * state.dataHeatBal->ZoneSteamEq(Ctd).FractionConvected;
     420             :                 }
     421             :             }
     422           1 :             state.dataRoomAirMod->ZoneUCSDUI(UINum).PowerPerPlume =
     423           1 :                 (NumberOfOccupants * 73.0 + ZoneElecConv + ZoneGasConv + ZoneOthEqConv + ZoneHWEqConv + ZoneSteamEqConv) / NumberOfPlumes;
     424           4 :             BaseSizer::reportSizerOutput(state,
     425             :                                          "RoomAirSettings:UnderFloorAirDistributionInterior",
     426           1 :                                          state.dataRoomAirMod->ZoneUCSDUI(UINum).ZoneName,
     427             :                                          "Power per plume [W]",
     428           3 :                                          state.dataRoomAirMod->ZoneUCSDUI(UINum).PowerPerPlume);
     429             :         }
     430           1 :         if (state.dataRoomAirMod->ZoneUCSDUI(UINum).DiffusersPerZone == AutoSize) {
     431           1 :             if (NumberOfOccupants > 0.0) {
     432           1 :                 state.dataRoomAirMod->ZoneUCSDUI(UINum).DiffusersPerZone = NumberOfOccupants;
     433             :             } else {
     434           0 :                 state.dataRoomAirMod->ZoneUCSDUI(UINum).DiffusersPerZone = 1.0;
     435             :             }
     436           4 :             BaseSizer::reportSizerOutput(state,
     437             :                                          "RoomAirSettings:UnderFloorAirDistributionInterior",
     438           1 :                                          state.dataRoomAirMod->ZoneUCSDUI(UINum).ZoneName,
     439             :                                          "Number of diffusers per zone",
     440           3 :                                          state.dataRoomAirMod->ZoneUCSDUI(UINum).DiffusersPerZone);
     441             :         }
     442             :     }
     443             : 
     444           5 :     if (ZoneModelType == DataRoomAirModel::RoomAirModel::UCSDUFE) {
     445           4 :         UINum = state.dataRoomAirMod->ZoneUFPtr(ZoneNum);
     446             :         // calculate total window width in zone
     447          10 :         for (int Ctd = state.dataUCSDShared->PosZ_Window((ZoneNum - 1) * 2 + 1); Ctd <= state.dataUCSDShared->PosZ_Window((ZoneNum - 1) * 2 + 2);
     448             :              ++Ctd) {
     449           6 :             int SurfNum = state.dataUCSDShared->APos_Window(Ctd);
     450           6 :             if (SurfNum == 0) continue;
     451          12 :             if (state.dataSurface->Surface(SurfNum).ExtBoundCond == ExternalEnvironment ||
     452           0 :                 state.dataSurface->Surface(SurfNum).ExtBoundCond == OtherSideCoefNoCalcExt ||
     453           6 :                 state.dataSurface->Surface(SurfNum).ExtBoundCond == OtherSideCoefCalcExt ||
     454           0 :                 state.dataSurface->Surface(SurfNum).ExtBoundCond == OtherSideCondModeledExt) {
     455           6 :                 state.dataRoomAirMod->ZoneUCSDUE(UINum).WinWidth += state.dataSurface->Surface(SurfNum).Width;
     456           6 :                 ++state.dataRoomAirMod->ZoneUCSDUE(UINum).NumExtWin;
     457             :             }
     458             :         }
     459           4 :         if (state.dataRoomAirMod->ZoneUCSDUE(UINum).WinWidth <= 0.0) {
     460           0 :             ShowWarningError(state,
     461           0 :                              "For RoomAirSettings:UnderFloorAirDistributionExterior for Zone " + state.dataRoomAirMod->ZoneUCSDUE(UINum).ZoneName +
     462             :                                  " there are no exterior windows.");
     463           0 :             ShowContinueError(state, "  The zone will be treated as a UFAD interior zone");
     464             :         }
     465           4 :         NumberOfOccupants = 0.0;
     466          24 :         for (int Ctd = 1; Ctd <= state.dataHeatBal->TotPeople; ++Ctd) {
     467          20 :             if (state.dataHeatBal->People(Ctd).ZonePtr == ZoneNum) {
     468           4 :                 NumberOfOccupants += state.dataHeatBal->People(Ctd).NumberOfPeople;
     469             :             }
     470             :         }
     471           4 :         if (state.dataRoomAirMod->ZoneUCSDUE(UINum).DiffArea == AutoSize) {
     472           4 :             if (state.dataRoomAirMod->ZoneUCSDUE(UINum).DiffuserType == Diffuser::Swirl) {
     473           0 :                 state.dataRoomAirMod->ZoneUCSDUE(UINum).DiffArea = 0.0075;
     474           4 :             } else if (state.dataRoomAirMod->ZoneUCSDUE(UINum).DiffuserType == Diffuser::VarArea) {
     475           0 :                 state.dataRoomAirMod->ZoneUCSDUE(UINum).DiffArea = 0.035;
     476           4 :             } else if (state.dataRoomAirMod->ZoneUCSDUE(UINum).DiffuserType == Diffuser::DisplVent) {
     477           0 :                 state.dataRoomAirMod->ZoneUCSDUE(UINum).DiffArea = 0.0060;
     478           4 :             } else if (state.dataRoomAirMod->ZoneUCSDUE(UINum).DiffuserType == Diffuser::LinBarGrille) {
     479             :                 // 4 ft x 4 inches; eff area is 50% of total area; 75 cfm per linear foot.
     480           4 :                 state.dataRoomAirMod->ZoneUCSDUE(UINum).DiffArea = 0.03;
     481             :             } else {
     482           0 :                 state.dataRoomAirMod->ZoneUCSDUE(UINum).DiffArea = 0.0075;
     483             :             }
     484          16 :             BaseSizer::reportSizerOutput(state,
     485             :                                          "RoomAirSettings:UnderFloorAirDistributionExterior",
     486           4 :                                          state.dataRoomAirMod->ZoneUCSDUE(UINum).ZoneName,
     487             :                                          "Design effective area of diffuser",
     488          12 :                                          state.dataRoomAirMod->ZoneUCSDUE(UINum).DiffArea);
     489             :         }
     490           4 :         if (state.dataRoomAirMod->ZoneUCSDUE(UINum).DiffAngle == AutoSize) {
     491           4 :             if (state.dataRoomAirMod->ZoneUCSDUE(UINum).DiffuserType == Diffuser::Swirl) {
     492           0 :                 state.dataRoomAirMod->ZoneUCSDUE(UINum).DiffAngle = 28.0;
     493           4 :             } else if (state.dataRoomAirMod->ZoneUCSDUE(UINum).DiffuserType == Diffuser::VarArea) {
     494           0 :                 state.dataRoomAirMod->ZoneUCSDUE(UINum).DiffAngle = 45.0;
     495           4 :             } else if (state.dataRoomAirMod->ZoneUCSDUE(UINum).DiffuserType == Diffuser::DisplVent) {
     496           0 :                 state.dataRoomAirMod->ZoneUCSDUE(UINum).DiffAngle = 73.0;
     497           4 :             } else if (state.dataRoomAirMod->ZoneUCSDUE(UINum).DiffuserType == Diffuser::LinBarGrille) {
     498           4 :                 state.dataRoomAirMod->ZoneUCSDUE(UINum).DiffAngle = 15.0;
     499             :             } else {
     500           0 :                 state.dataRoomAirMod->ZoneUCSDUE(UINum).DiffAngle = 28.0;
     501             :             }
     502          16 :             BaseSizer::reportSizerOutput(state,
     503             :                                          "RoomAirSettings:UnderFloorAirDistributionExterior",
     504           4 :                                          state.dataRoomAirMod->ZoneUCSDUE(UINum).ZoneName,
     505             :                                          "Angle between diffuser slots and the vertical",
     506          12 :                                          state.dataRoomAirMod->ZoneUCSDUE(UINum).DiffAngle);
     507             :         }
     508           4 :         if (state.dataRoomAirMod->ZoneUCSDUE(UINum).TransHeight == AutoSize) {
     509           0 :             state.dataRoomAirMod->ZoneUCSDUE(UINum).CalcTransHeight = true;
     510           0 :             state.dataRoomAirMod->ZoneUCSDUE(UINum).TransHeight = 0.0;
     511             :         } else {
     512           4 :             state.dataRoomAirMod->ZoneUCSDUE(UINum).CalcTransHeight = false;
     513             :         }
     514           4 :         if (state.dataRoomAirMod->ZoneUCSDUE(UINum).DiffuserType == Diffuser::Swirl) {
     515           0 :             if (state.dataRoomAirMod->ZoneUCSDUE(UINum).A_Kc != DataGlobalConstants::AutoCalculate ||
     516           0 :                 state.dataRoomAirMod->ZoneUCSDUE(UINum).B_Kc != DataGlobalConstants::AutoCalculate ||
     517           0 :                 state.dataRoomAirMod->ZoneUCSDUE(UINum).C_Kc != DataGlobalConstants::AutoCalculate ||
     518           0 :                 state.dataRoomAirMod->ZoneUCSDUE(UINum).D_Kc != DataGlobalConstants::AutoCalculate ||
     519           0 :                 state.dataRoomAirMod->ZoneUCSDUE(UINum).E_Kc != DataGlobalConstants::AutoCalculate) {
     520           0 :                 ShowWarningError(state,
     521           0 :                                  "For RoomAirSettings:UnderFloorAirDistributionExterior for Zone " +
     522           0 :                                      state.dataRoomAirMod->ZoneUCSDUE(UINum).ZoneName +
     523             :                                      ", input for Coefficients A - E will be ignored when Floor Diffuser Type = Swirl.");
     524           0 :                 ShowContinueError(state, "  To input these Coefficients, use Floor Diffuser Type = Custom.");
     525             :             }
     526           0 :             state.dataRoomAirMod->ZoneUCSDUE(UINum).A_Kc = 0.0;
     527           0 :             state.dataRoomAirMod->ZoneUCSDUE(UINum).B_Kc = 0.0;
     528           0 :             state.dataRoomAirMod->ZoneUCSDUE(UINum).C_Kc = 0.6531;
     529           0 :             state.dataRoomAirMod->ZoneUCSDUE(UINum).D_Kc = 0.0069;
     530           0 :             state.dataRoomAirMod->ZoneUCSDUE(UINum).E_Kc = -0.00004;
     531           4 :         } else if (state.dataRoomAirMod->ZoneUCSDUE(UINum).DiffuserType == Diffuser::VarArea) {
     532           0 :             if (state.dataRoomAirMod->ZoneUCSDUE(UINum).A_Kc != DataGlobalConstants::AutoCalculate ||
     533           0 :                 state.dataRoomAirMod->ZoneUCSDUE(UINum).B_Kc != DataGlobalConstants::AutoCalculate ||
     534           0 :                 state.dataRoomAirMod->ZoneUCSDUE(UINum).C_Kc != DataGlobalConstants::AutoCalculate ||
     535           0 :                 state.dataRoomAirMod->ZoneUCSDUE(UINum).D_Kc != DataGlobalConstants::AutoCalculate ||
     536           0 :                 state.dataRoomAirMod->ZoneUCSDUE(UINum).E_Kc != DataGlobalConstants::AutoCalculate) {
     537           0 :                 ShowWarningError(state,
     538           0 :                                  "For RoomAirSettings:UnderFloorAirDistributionExterior for Zone " +
     539           0 :                                      state.dataRoomAirMod->ZoneUCSDUE(UINum).ZoneName +
     540             :                                      ", input for Coefficients A - E will be ignored when Floor Diffuser Type = VariableArea.");
     541           0 :                 ShowContinueError(state, "  To input these Coefficients, use Floor Diffuser Type = Custom.");
     542             :             }
     543           0 :             state.dataRoomAirMod->ZoneUCSDUE(UINum).A_Kc = 0.0;
     544           0 :             state.dataRoomAirMod->ZoneUCSDUE(UINum).B_Kc = 0.0;
     545           0 :             state.dataRoomAirMod->ZoneUCSDUE(UINum).C_Kc = 0.83;
     546           0 :             state.dataRoomAirMod->ZoneUCSDUE(UINum).D_Kc = 0.0;
     547           0 :             state.dataRoomAirMod->ZoneUCSDUE(UINum).E_Kc = 0.0;
     548           4 :         } else if (state.dataRoomAirMod->ZoneUCSDUE(UINum).DiffuserType == Diffuser::DisplVent) {
     549           0 :             if (state.dataRoomAirMod->ZoneUCSDUE(UINum).A_Kc != DataGlobalConstants::AutoCalculate ||
     550           0 :                 state.dataRoomAirMod->ZoneUCSDUE(UINum).B_Kc != DataGlobalConstants::AutoCalculate ||
     551           0 :                 state.dataRoomAirMod->ZoneUCSDUE(UINum).C_Kc != DataGlobalConstants::AutoCalculate ||
     552           0 :                 state.dataRoomAirMod->ZoneUCSDUE(UINum).D_Kc != DataGlobalConstants::AutoCalculate ||
     553           0 :                 state.dataRoomAirMod->ZoneUCSDUE(UINum).E_Kc != DataGlobalConstants::AutoCalculate) {
     554           0 :                 ShowWarningError(state,
     555           0 :                                  "For RoomAirSettings:UnderFloorAirDistributionExterior for Zone " +
     556           0 :                                      state.dataRoomAirMod->ZoneUCSDUE(UINum).ZoneName +
     557             :                                      ", input for Coefficients A - E will be ignored when Floor Diffuser Type = HorizontalDisplacement.");
     558           0 :                 ShowContinueError(state, "  To input these Coefficients, use Floor Diffuser Type = Custom.");
     559             :             }
     560           0 :             state.dataRoomAirMod->ZoneUCSDUE(UINum).A_Kc = 0.0;
     561           0 :             state.dataRoomAirMod->ZoneUCSDUE(UINum).B_Kc = 0.0;
     562           0 :             state.dataRoomAirMod->ZoneUCSDUE(UINum).C_Kc = 0.67;
     563           0 :             state.dataRoomAirMod->ZoneUCSDUE(UINum).D_Kc = 0.0;
     564           0 :             state.dataRoomAirMod->ZoneUCSDUE(UINum).E_Kc = 0.0;
     565           4 :         } else if (state.dataRoomAirMod->ZoneUCSDUE(UINum).DiffuserType == Diffuser::LinBarGrille) {
     566          12 :             if (state.dataRoomAirMod->ZoneUCSDUE(UINum).A_Kc != DataGlobalConstants::AutoCalculate ||
     567           8 :                 state.dataRoomAirMod->ZoneUCSDUE(UINum).B_Kc != DataGlobalConstants::AutoCalculate ||
     568           8 :                 state.dataRoomAirMod->ZoneUCSDUE(UINum).C_Kc != DataGlobalConstants::AutoCalculate ||
     569          12 :                 state.dataRoomAirMod->ZoneUCSDUE(UINum).D_Kc != DataGlobalConstants::AutoCalculate ||
     570           4 :                 state.dataRoomAirMod->ZoneUCSDUE(UINum).E_Kc != DataGlobalConstants::AutoCalculate) {
     571           0 :                 ShowWarningError(state,
     572           0 :                                  "For RoomAirSettings:UnderFloorAirDistributionExterior for Zone " +
     573           0 :                                      state.dataRoomAirMod->ZoneUCSDUE(UINum).ZoneName +
     574             :                                      ", input for Coefficients A - E will be ignored when Floor Diffuser Type = LinearBarGrille.");
     575           0 :                 ShowContinueError(state, "  To input these Coefficients, use Floor Diffuser Type = Custom.");
     576             :             }
     577           4 :             state.dataRoomAirMod->ZoneUCSDUE(UINum).A_Kc = 0.0;
     578           4 :             state.dataRoomAirMod->ZoneUCSDUE(UINum).B_Kc = 0.0;
     579           4 :             state.dataRoomAirMod->ZoneUCSDUE(UINum).C_Kc = 0.8214;
     580           4 :             state.dataRoomAirMod->ZoneUCSDUE(UINum).D_Kc = -0.0263;
     581           4 :             state.dataRoomAirMod->ZoneUCSDUE(UINum).E_Kc = 0.0014;
     582             :         } else {
     583           0 :             if (state.dataRoomAirMod->ZoneUCSDUE(UINum).A_Kc == DataGlobalConstants::AutoCalculate ||
     584           0 :                 state.dataRoomAirMod->ZoneUCSDUE(UINum).B_Kc == DataGlobalConstants::AutoCalculate ||
     585           0 :                 state.dataRoomAirMod->ZoneUCSDUE(UINum).C_Kc == DataGlobalConstants::AutoCalculate ||
     586           0 :                 state.dataRoomAirMod->ZoneUCSDUE(UINum).D_Kc == DataGlobalConstants::AutoCalculate ||
     587           0 :                 state.dataRoomAirMod->ZoneUCSDUE(UINum).E_Kc == DataGlobalConstants::AutoCalculate) {
     588           0 :                 ShowFatalError(state,
     589           0 :                                "For RoomAirSettings:UnderFloorAirDistributionExterior for Zone " + state.dataRoomAirMod->ZoneUCSDUE(UINum).ZoneName +
     590             :                                    ", input for Coefficients A - E must be specified when Floor Diffuser Type = Custom.");
     591             :             }
     592             :         }
     593           4 :         if (state.dataRoomAirMod->ZoneUCSDUE(UINum).PowerPerPlume == DataGlobalConstants::AutoCalculate) {
     594           4 :             if (NumberOfOccupants > 0) {
     595           4 :                 NumberOfPlumes = NumberOfOccupants;
     596             :             } else {
     597           0 :                 NumberOfPlumes = 1.0;
     598             :             }
     599           4 :             ZoneElecConv = 0.0;
     600          24 :             for (int Ctd = 1; Ctd <= state.dataHeatBal->TotElecEquip; ++Ctd) {
     601          20 :                 if (state.dataHeatBal->ZoneElectric(Ctd).ZonePtr == ZoneNum) {
     602           4 :                     ZoneElecConv += state.dataHeatBal->ZoneElectric(Ctd).DesignLevel;
     603             :                 }
     604             :             }
     605           4 :             ZoneGasConv = 0.0;
     606           4 :             for (int Ctd = 1; Ctd <= state.dataHeatBal->TotGasEquip; ++Ctd) {
     607           0 :                 if (state.dataHeatBal->ZoneGas(Ctd).ZonePtr == ZoneNum) {
     608           0 :                     ZoneGasConv += state.dataHeatBal->ZoneGas(Ctd).DesignLevel;
     609             :                 }
     610             :             }
     611           4 :             ZoneOthEqConv = 0.0;
     612           4 :             for (int Ctd = 1; Ctd <= state.dataHeatBal->TotOthEquip; ++Ctd) {
     613           0 :                 if (state.dataHeatBal->ZoneOtherEq(Ctd).ZonePtr == ZoneNum) {
     614           0 :                     ZoneOthEqConv += state.dataHeatBal->ZoneOtherEq(Ctd).DesignLevel;
     615             :                 }
     616             :             }
     617           4 :             ZoneHWEqConv = 0.0;
     618           4 :             for (int Ctd = 1; Ctd <= state.dataHeatBal->TotHWEquip; ++Ctd) {
     619           0 :                 if (state.dataHeatBal->ZoneHWEq(Ctd).ZonePtr == ZoneNum) {
     620           0 :                     ZoneHWEqConv += state.dataHeatBal->ZoneHWEq(Ctd).DesignLevel;
     621             :                 }
     622             :             }
     623           4 :             for (int Ctd = 1; Ctd <= state.dataHeatBal->TotStmEquip; ++Ctd) {
     624           0 :                 ZoneSteamEqConv = 0.0;
     625           0 :                 if (state.dataHeatBal->ZoneSteamEq(Ctd).ZonePtr == ZoneNum) {
     626           0 :                     ZoneSteamEqConv += state.dataHeatBal->ZoneSteamEq(Ctd).DesignLevel;
     627             :                 }
     628             :             }
     629           4 :             state.dataRoomAirMod->ZoneUCSDUE(UINum).PowerPerPlume =
     630           4 :                 (NumberOfOccupants * 73.0 + ZoneElecConv + ZoneGasConv + ZoneOthEqConv + ZoneHWEqConv + ZoneSteamEqConv) / NumberOfPlumes;
     631          16 :             BaseSizer::reportSizerOutput(state,
     632             :                                          "RoomAirSettings:UnderFloorAirDistributionExterior",
     633           4 :                                          state.dataRoomAirMod->ZoneUCSDUE(UINum).ZoneName,
     634             :                                          "Power per plume [W]",
     635          12 :                                          state.dataRoomAirMod->ZoneUCSDUE(UINum).PowerPerPlume);
     636             :         }
     637           4 :         if (state.dataRoomAirMod->ZoneUCSDUE(UINum).DiffusersPerZone == AutoSize) {
     638           4 :             if (NumberOfOccupants > 0.0) {
     639           4 :                 state.dataRoomAirMod->ZoneUCSDUE(UINum).DiffusersPerZone = NumberOfOccupants;
     640             :             } else {
     641           0 :                 state.dataRoomAirMod->ZoneUCSDUE(UINum).DiffusersPerZone = 1.0;
     642             :             }
     643          16 :             BaseSizer::reportSizerOutput(state,
     644             :                                          "RoomAirSettings:UnderFloorAirDistributionExterior",
     645           4 :                                          state.dataRoomAirMod->ZoneUCSDUE(UINum).ZoneName,
     646             :                                          "Number of diffusers per zone",
     647          12 :                                          state.dataRoomAirMod->ZoneUCSDUE(UINum).DiffusersPerZone);
     648             :         }
     649             :     }
     650           5 : }
     651             : 
     652       79562 : void HcUCSDUF(EnergyPlusData &state, int const ZoneNum, Real64 const FractionHeight)
     653             : {
     654             : 
     655             :     // SUBROUTINE INFORMATION:
     656             :     //       AUTHOR         G. Carrilho da Graca
     657             :     //       DATE WRITTEN   February 2004
     658             :     //       MODIFIED       -
     659             :     //       RE-ENGINEERED  -
     660             : 
     661             :     // PURPOSE OF THIS SUBROUTINE:
     662             :     // Main subroutine for convection calculation in the UCSD Displacement Ventilation model.
     663             :     // It calls CalcDetailedHcInForDVModel for convection coefficient
     664             :     // initial calculations and averages the final result comparing the position of the surface with
     665             :     // the interface subzone height.
     666             : 
     667             :     // Using/Aliasing
     668             :     using namespace DataEnvironment;
     669             :     using namespace DataHeatBalance;
     670             : 
     671             :     // SUBROUTINE LOCAL VARIABLE DECLARATIONS:
     672             :     int Ctd;         // DO loop counter for surfaces
     673             :     Real64 HLD;      // Convection coefficient for the lower area of surface
     674             :     Real64 TmedDV;   // Average temperature for DV
     675             :     Real64 Z1;       // auxiliary var for lowest height
     676             :     Real64 Z2;       // auxiliary var for highest height
     677             :     Real64 ZSupSurf; // highest height for this surface
     678             :     Real64 ZInfSurf; // lowest height for this surface
     679             :     Real64 HLU;      // Convection coefficient for the upper area of surface
     680             :     Real64 LayH;     // Height of the Occupied/Mixed subzone interface
     681             :     Real64 LayFrac;  // Fraction height of the Occupied/Mixed subzone interface
     682             :     int SurfNum;     // Surface number
     683             :     // Initialize HAT and HA
     684             : 
     685       79562 :     state.dataUFADManager->HAT_MX = 0.0;
     686       79562 :     state.dataUFADManager->HAT_OC = 0.0;
     687       79562 :     state.dataUFADManager->HA_MX = 0.0;
     688       79562 :     state.dataUFADManager->HA_OC = 0.0;
     689       79562 :     state.dataUFADManager->HAT_FLOOR = 0.0;
     690       79562 :     state.dataUFADManager->HA_FLOOR = 0.0;
     691       79562 :     state.dataUFADManager->HAT_MXWin = 0.0;
     692       79562 :     state.dataUFADManager->HAT_OCWin = 0.0;
     693       79562 :     state.dataUFADManager->HA_MXWin = 0.0;
     694       79562 :     state.dataUFADManager->HA_OCWin = 0.0;
     695             : 
     696             :     // Is the air flow model for this zone set to UCSDDV Displacement Ventilation?
     697       79562 :     if (state.dataRoomAirMod->IsZoneUI(ZoneNum)) {
     698       79562 :         LayFrac = FractionHeight;
     699       79562 :         LayH = FractionHeight *
     700       79562 :                (state.dataRoomAirMod->ZoneCeilingHeight((ZoneNum - 1) * 2 + 2) - state.dataRoomAirMod->ZoneCeilingHeight((ZoneNum - 1) * 2 + 1));
     701             :         // WALL Hc, HA and HAT calculation
     702      397810 :         for (Ctd = state.dataUCSDShared->PosZ_Wall((ZoneNum - 1) * 2 + 1); Ctd <= state.dataUCSDShared->PosZ_Wall((ZoneNum - 1) * 2 + 2); ++Ctd) {
     703      318248 :             SurfNum = state.dataUCSDShared->APos_Wall(Ctd);
     704      318248 :             state.dataSurface->SurfTAirRef(SurfNum) = DataSurfaces::RefAirTemp::AdjacentAirTemp;
     705      318248 :             state.dataSurface->SurfTAirRefRpt(SurfNum) = DataSurfaces::SurfTAirRefReportVals[state.dataSurface->SurfTAirRef(SurfNum)];
     706      318248 :             if (SurfNum == 0) continue;
     707      318248 :             Z1 = minval(state.dataSurface->Surface(SurfNum).Vertex({1, state.dataSurface->Surface(SurfNum).Sides}), &Vector::z);
     708      318248 :             Z2 = maxval(state.dataSurface->Surface(SurfNum).Vertex({1, state.dataSurface->Surface(SurfNum).Sides}), &Vector::z);
     709      318248 :             ZSupSurf = Z2 - state.dataRoomAirMod->ZoneCeilingHeight((ZoneNum - 1) * 2 + 1);
     710      318248 :             ZInfSurf = Z1 - state.dataRoomAirMod->ZoneCeilingHeight((ZoneNum - 1) * 2 + 1);
     711             : 
     712             :             // The Wall surface is in the upper subzone
     713      318248 :             if (ZInfSurf > LayH) {
     714           0 :                 state.dataHeatBal->SurfTempEffBulkAir(SurfNum) = state.dataRoomAirMod->ZTMX(ZoneNum);
     715           0 :                 CalcDetailedHcInForDVModel(state, SurfNum, state.dataHeatBalSurf->SurfTempIn, state.dataRoomAirMod->UFHcIn);
     716           0 :                 state.dataUCSDShared->HWall(Ctd) = state.dataRoomAirMod->UFHcIn(SurfNum);
     717           0 :                 state.dataUFADManager->HAT_MX +=
     718           0 :                     state.dataSurface->Surface(SurfNum).Area * state.dataHeatBalSurf->SurfTempIn(SurfNum) * state.dataUCSDShared->HWall(Ctd);
     719           0 :                 state.dataUFADManager->HA_MX += state.dataSurface->Surface(SurfNum).Area * state.dataUCSDShared->HWall(Ctd);
     720             :             }
     721             : 
     722             :             // The Wall surface is in the lower subzone
     723      318248 :             if (ZSupSurf < LayH) {
     724           0 :                 state.dataHeatBal->SurfTempEffBulkAir(SurfNum) = state.dataRoomAirMod->ZTOC(ZoneNum);
     725           0 :                 CalcDetailedHcInForDVModel(state, SurfNum, state.dataHeatBalSurf->SurfTempIn, state.dataRoomAirMod->UFHcIn);
     726           0 :                 state.dataUCSDShared->HWall(Ctd) = state.dataRoomAirMod->UFHcIn(SurfNum);
     727           0 :                 state.dataUFADManager->HAT_OC +=
     728           0 :                     state.dataSurface->Surface(SurfNum).Area * state.dataHeatBalSurf->SurfTempIn(SurfNum) * state.dataUCSDShared->HWall(Ctd);
     729           0 :                 state.dataUFADManager->HA_OC += state.dataSurface->Surface(SurfNum).Area * state.dataUCSDShared->HWall(Ctd);
     730             :             }
     731             : 
     732      318248 :             if (std::abs(ZInfSurf - ZSupSurf) < 1.e-10) {
     733           0 :                 ShowSevereError(state, "RoomAirModelUFAD:HcUCSDUF: Surface values will cause divide by zero.");
     734           0 :                 ShowContinueError(state,
     735           0 :                                   "Zone=\"" + state.dataHeatBal->Zone(state.dataSurface->Surface(SurfNum).Zone).Name + "\", Surface=\"" +
     736           0 :                                       state.dataSurface->Surface(SurfNum).Name + "\".");
     737           0 :                 ShowContinueError(state, format("ZInfSurf=[{:.4R}], LayH=[{:.4R}].", ZInfSurf, LayH));
     738           0 :                 ShowContinueError(state, format("ZSupSurf=[{:.4R}], LayH=[{:.4R}].", ZSupSurf, LayH));
     739           0 :                 ShowFatalError(state, "...Previous condition causes termination.");
     740             :             }
     741             : 
     742             :             // The Wall surface is partially in upper and partially in lower subzone
     743      318248 :             if (ZInfSurf <= LayH && ZSupSurf >= LayH) {
     744      318248 :                 state.dataHeatBal->SurfTempEffBulkAir(SurfNum) = state.dataRoomAirMod->ZTMX(ZoneNum);
     745      318248 :                 CalcDetailedHcInForDVModel(state, SurfNum, state.dataHeatBalSurf->SurfTempIn, state.dataRoomAirMod->UFHcIn);
     746      318248 :                 HLU = state.dataRoomAirMod->UFHcIn(SurfNum);
     747      318248 :                 state.dataHeatBal->SurfTempEffBulkAir(SurfNum) = state.dataRoomAirMod->ZTOC(ZoneNum);
     748      318248 :                 CalcDetailedHcInForDVModel(state, SurfNum, state.dataHeatBalSurf->SurfTempIn, state.dataRoomAirMod->UFHcIn);
     749      318248 :                 HLD = state.dataRoomAirMod->UFHcIn(SurfNum);
     750      636496 :                 TmedDV = ((ZSupSurf - LayH) * state.dataRoomAirMod->ZTMX(ZoneNum) + (LayH - ZInfSurf) * state.dataRoomAirMod->ZTOC(ZoneNum)) /
     751      318248 :                          (ZSupSurf - ZInfSurf);
     752      318248 :                 state.dataUCSDShared->HWall(Ctd) = ((LayH - ZInfSurf) * HLD + (ZSupSurf - LayH) * HLU) / (ZSupSurf - ZInfSurf);
     753      954744 :                 state.dataUFADManager->HAT_MX += state.dataSurface->Surface(SurfNum).Area * (ZSupSurf - LayH) / (ZSupSurf - ZInfSurf) *
     754      636496 :                                                  state.dataHeatBalSurf->SurfTempIn(SurfNum) * HLU;
     755      318248 :                 state.dataUFADManager->HA_MX += state.dataSurface->Surface(SurfNum).Area * (ZSupSurf - LayH) / (ZSupSurf - ZInfSurf) * HLU;
     756      954744 :                 state.dataUFADManager->HAT_OC += state.dataSurface->Surface(SurfNum).Area * (LayH - ZInfSurf) / (ZSupSurf - ZInfSurf) *
     757      636496 :                                                  state.dataHeatBalSurf->SurfTempIn(SurfNum) * HLD;
     758      318248 :                 state.dataUFADManager->HA_OC += state.dataSurface->Surface(SurfNum).Area * (LayH - ZInfSurf) / (ZSupSurf - ZInfSurf) * HLD;
     759      318248 :                 state.dataHeatBal->SurfTempEffBulkAir(SurfNum) = TmedDV;
     760             :             }
     761             : 
     762      318248 :             state.dataRoomAirMod->UFHcIn(SurfNum) = state.dataUCSDShared->HWall(Ctd);
     763             : 
     764             :         } // END WALL
     765             : 
     766             :         // WINDOW Hc, HA and HAT CALCULATION
     767      175238 :         for (Ctd = state.dataUCSDShared->PosZ_Window((ZoneNum - 1) * 2 + 1); Ctd <= state.dataUCSDShared->PosZ_Window((ZoneNum - 1) * 2 + 2); ++Ctd) {
     768       95676 :             SurfNum = state.dataUCSDShared->APos_Window(Ctd);
     769       95676 :             state.dataSurface->SurfTAirRef(SurfNum) = DataSurfaces::RefAirTemp::AdjacentAirTemp;
     770       95676 :             state.dataSurface->SurfTAirRefRpt(SurfNum) = DataSurfaces::SurfTAirRefReportVals[state.dataSurface->SurfTAirRef(SurfNum)];
     771       95676 :             if (SurfNum == 0) continue;
     772       95676 :             if (state.dataSurface->Surface(SurfNum).Tilt > 10.0 && state.dataSurface->Surface(SurfNum).Tilt < 170.0) { // Window Wall
     773       95676 :                 Z1 = minval(state.dataSurface->Surface(SurfNum).Vertex({1, state.dataSurface->Surface(SurfNum).Sides}), &Vector::z);
     774       95676 :                 Z2 = maxval(state.dataSurface->Surface(SurfNum).Vertex({1, state.dataSurface->Surface(SurfNum).Sides}), &Vector::z);
     775       95676 :                 ZSupSurf = Z2 - state.dataRoomAirMod->ZoneCeilingHeight((ZoneNum - 1) * 2 + 1);
     776       95676 :                 ZInfSurf = Z1 - state.dataRoomAirMod->ZoneCeilingHeight((ZoneNum - 1) * 2 + 1);
     777             : 
     778       95676 :                 if (ZInfSurf > LayH) {
     779       21735 :                     state.dataHeatBal->SurfTempEffBulkAir(SurfNum) = state.dataRoomAirMod->ZTMX(ZoneNum);
     780       21735 :                     CalcDetailedHcInForDVModel(state, SurfNum, state.dataHeatBalSurf->SurfTempIn, state.dataRoomAirMod->UFHcIn);
     781       21735 :                     state.dataUCSDShared->HWindow(Ctd) = state.dataRoomAirMod->UFHcIn(SurfNum);
     782       21735 :                     state.dataUFADManager->HAT_MX +=
     783       21735 :                         state.dataSurface->Surface(SurfNum).Area * state.dataHeatBalSurf->SurfTempIn(SurfNum) * state.dataUCSDShared->HWindow(Ctd);
     784       21735 :                     state.dataUFADManager->HA_MX += state.dataSurface->Surface(SurfNum).Area * state.dataUCSDShared->HWindow(Ctd);
     785       21735 :                     state.dataUFADManager->HAT_MXWin +=
     786       21735 :                         state.dataSurface->Surface(SurfNum).Area * state.dataHeatBalSurf->SurfTempIn(SurfNum) * state.dataUCSDShared->HWindow(Ctd);
     787       21735 :                     state.dataUFADManager->HA_MXWin += state.dataSurface->Surface(SurfNum).Area * state.dataUCSDShared->HWindow(Ctd);
     788             :                 }
     789             : 
     790       95676 :                 if (ZSupSurf < LayH) {
     791           0 :                     state.dataHeatBal->SurfTempEffBulkAir(SurfNum) = state.dataRoomAirMod->ZTOC(ZoneNum);
     792           0 :                     CalcDetailedHcInForDVModel(state, SurfNum, state.dataHeatBalSurf->SurfTempIn, state.dataRoomAirMod->UFHcIn);
     793           0 :                     state.dataUCSDShared->HWindow(Ctd) = state.dataRoomAirMod->UFHcIn(SurfNum);
     794           0 :                     state.dataUFADManager->HAT_OC +=
     795           0 :                         state.dataSurface->Surface(SurfNum).Area * state.dataHeatBalSurf->SurfTempIn(SurfNum) * state.dataUCSDShared->HWindow(Ctd);
     796           0 :                     state.dataUFADManager->HA_OC += state.dataSurface->Surface(SurfNum).Area * state.dataUCSDShared->HWindow(Ctd);
     797           0 :                     state.dataUFADManager->HAT_OCWin +=
     798           0 :                         state.dataSurface->Surface(SurfNum).Area * state.dataHeatBalSurf->SurfTempIn(SurfNum) * state.dataUCSDShared->HWindow(Ctd);
     799           0 :                     state.dataUFADManager->HA_OCWin += state.dataSurface->Surface(SurfNum).Area * state.dataUCSDShared->HWindow(Ctd);
     800             :                 }
     801             : 
     802       95676 :                 if (ZInfSurf <= LayH && ZSupSurf >= LayH) {
     803       73941 :                     state.dataHeatBal->SurfTempEffBulkAir(SurfNum) = state.dataRoomAirMod->ZTMX(ZoneNum);
     804       73941 :                     CalcDetailedHcInForDVModel(state, SurfNum, state.dataHeatBalSurf->SurfTempIn, state.dataRoomAirMod->UFHcIn);
     805       73941 :                     HLU = state.dataRoomAirMod->UFHcIn(SurfNum);
     806       73941 :                     state.dataHeatBal->SurfTempEffBulkAir(SurfNum) = state.dataRoomAirMod->ZTOC(ZoneNum);
     807       73941 :                     CalcDetailedHcInForDVModel(state, SurfNum, state.dataHeatBalSurf->SurfTempIn, state.dataRoomAirMod->UFHcIn);
     808       73941 :                     HLD = state.dataRoomAirMod->UFHcIn(SurfNum);
     809      147882 :                     TmedDV = ((ZSupSurf - LayH) * state.dataRoomAirMod->ZTMX(ZoneNum) + (LayH - ZInfSurf) * state.dataRoomAirMod->ZTOC(ZoneNum)) /
     810       73941 :                              (ZSupSurf - ZInfSurf);
     811       73941 :                     state.dataUCSDShared->HWindow(Ctd) = ((LayH - ZInfSurf) * HLD + (ZSupSurf - LayH) * HLU) / (ZSupSurf - ZInfSurf);
     812      221823 :                     state.dataUFADManager->HAT_MX += state.dataSurface->Surface(SurfNum).Area * (ZSupSurf - LayH) / (ZSupSurf - ZInfSurf) *
     813      147882 :                                                      state.dataHeatBalSurf->SurfTempIn(SurfNum) * HLU;
     814       73941 :                     state.dataUFADManager->HA_MX += state.dataSurface->Surface(SurfNum).Area * (ZSupSurf - LayH) / (ZSupSurf - ZInfSurf) * HLU;
     815      221823 :                     state.dataUFADManager->HAT_MXWin += state.dataSurface->Surface(SurfNum).Area * (ZSupSurf - LayH) / (ZSupSurf - ZInfSurf) *
     816      147882 :                                                         state.dataHeatBalSurf->SurfTempIn(SurfNum) * HLU;
     817       73941 :                     state.dataUFADManager->HA_MXWin += state.dataSurface->Surface(SurfNum).Area * (ZSupSurf - LayH) / (ZSupSurf - ZInfSurf) * HLU;
     818      221823 :                     state.dataUFADManager->HAT_OC += state.dataSurface->Surface(SurfNum).Area * (LayH - ZInfSurf) / (ZSupSurf - ZInfSurf) *
     819      147882 :                                                      state.dataHeatBalSurf->SurfTempIn(SurfNum) * HLD;
     820       73941 :                     state.dataUFADManager->HA_OC += state.dataSurface->Surface(SurfNum).Area * (LayH - ZInfSurf) / (ZSupSurf - ZInfSurf) * HLD;
     821      221823 :                     state.dataUFADManager->HAT_OCWin += state.dataSurface->Surface(SurfNum).Area * (LayH - ZInfSurf) / (ZSupSurf - ZInfSurf) *
     822      147882 :                                                         state.dataHeatBalSurf->SurfTempIn(SurfNum) * HLD;
     823       73941 :                     state.dataUFADManager->HA_OCWin += state.dataSurface->Surface(SurfNum).Area * (LayH - ZInfSurf) / (ZSupSurf - ZInfSurf) * HLD;
     824       73941 :                     state.dataHeatBal->SurfTempEffBulkAir(SurfNum) = TmedDV;
     825             :                 }
     826             :             }
     827             : 
     828       95676 :             if (state.dataSurface->Surface(SurfNum).Tilt <= 10.0) { // Window Ceiling
     829           0 :                 state.dataHeatBal->SurfTempEffBulkAir(SurfNum) = state.dataRoomAirMod->ZTMX(ZoneNum);
     830           0 :                 CalcDetailedHcInForDVModel(state, SurfNum, state.dataHeatBalSurf->SurfTempIn, state.dataRoomAirMod->UFHcIn);
     831           0 :                 state.dataUCSDShared->HWindow(Ctd) = state.dataRoomAirMod->UFHcIn(SurfNum);
     832           0 :                 state.dataUFADManager->HAT_MX +=
     833           0 :                     state.dataSurface->Surface(SurfNum).Area * state.dataHeatBalSurf->SurfTempIn(SurfNum) * state.dataUCSDShared->HWindow(Ctd);
     834           0 :                 state.dataUFADManager->HA_MX += state.dataSurface->Surface(SurfNum).Area * state.dataUCSDShared->HWindow(Ctd);
     835             :             }
     836             : 
     837       95676 :             if (state.dataSurface->Surface(SurfNum).Tilt >= 170.0) { // Window Floor
     838           0 :                 state.dataHeatBal->SurfTempEffBulkAir(SurfNum) = state.dataRoomAirMod->ZTOC(ZoneNum);
     839           0 :                 CalcDetailedHcInForDVModel(state, SurfNum, state.dataHeatBalSurf->SurfTempIn, state.dataRoomAirMod->UFHcIn);
     840           0 :                 state.dataUCSDShared->HWindow(Ctd) = state.dataRoomAirMod->UFHcIn(SurfNum);
     841           0 :                 state.dataUFADManager->HAT_OC +=
     842           0 :                     state.dataSurface->Surface(SurfNum).Area * state.dataHeatBalSurf->SurfTempIn(SurfNum) * state.dataUCSDShared->HWindow(Ctd);
     843           0 :                 state.dataUFADManager->HA_OC += state.dataSurface->Surface(SurfNum).Area * state.dataUCSDShared->HWindow(Ctd);
     844             :             }
     845             : 
     846       95676 :             state.dataRoomAirMod->UFHcIn(SurfNum) = state.dataUCSDShared->HWindow(Ctd);
     847             : 
     848             :         } // END WINDOW
     849             : 
     850             :         // DOOR Hc, HA and HAT CALCULATION
     851       79562 :         for (Ctd = state.dataUCSDShared->PosZ_Door((ZoneNum - 1) * 2 + 1); Ctd <= state.dataUCSDShared->PosZ_Door((ZoneNum - 1) * 2 + 2);
     852             :              ++Ctd) { // DOOR
     853           0 :             SurfNum = state.dataUCSDShared->APos_Door(Ctd);
     854           0 :             state.dataSurface->SurfTAirRef(SurfNum) = DataSurfaces::RefAirTemp::AdjacentAirTemp;
     855           0 :             state.dataSurface->SurfTAirRefRpt(SurfNum) = DataSurfaces::SurfTAirRefReportVals[state.dataSurface->SurfTAirRef(SurfNum)];
     856           0 :             if (SurfNum == 0) continue;
     857           0 :             Z1 = minval(state.dataSurface->Surface(SurfNum).Vertex({1, state.dataSurface->Surface(SurfNum).Sides}), &Vector::z);
     858           0 :             Z2 = maxval(state.dataSurface->Surface(SurfNum).Vertex({1, state.dataSurface->Surface(SurfNum).Sides}), &Vector::z);
     859           0 :             ZSupSurf = Z2 - state.dataRoomAirMod->ZoneCeilingHeight((ZoneNum - 1) * 2 + 1);
     860           0 :             ZInfSurf = Z1 - state.dataRoomAirMod->ZoneCeilingHeight((ZoneNum - 1) * 2 + 1);
     861             : 
     862           0 :             if (ZInfSurf > LayH) {
     863           0 :                 state.dataHeatBal->SurfTempEffBulkAir(SurfNum) = state.dataRoomAirMod->ZTMX(ZoneNum);
     864           0 :                 CalcDetailedHcInForDVModel(state, SurfNum, state.dataHeatBalSurf->SurfTempIn, state.dataRoomAirMod->UFHcIn);
     865           0 :                 state.dataUCSDShared->HDoor(Ctd) = state.dataRoomAirMod->UFHcIn(SurfNum);
     866           0 :                 state.dataUFADManager->HAT_MX +=
     867           0 :                     state.dataSurface->Surface(SurfNum).Area * state.dataHeatBalSurf->SurfTempIn(SurfNum) * state.dataUCSDShared->HDoor(Ctd);
     868           0 :                 state.dataUFADManager->HA_MX += state.dataSurface->Surface(SurfNum).Area * state.dataUCSDShared->HDoor(Ctd);
     869             :             }
     870             : 
     871           0 :             if (ZSupSurf < LayH) {
     872           0 :                 state.dataHeatBal->SurfTempEffBulkAir(SurfNum) = state.dataRoomAirMod->ZTOC(ZoneNum);
     873           0 :                 CalcDetailedHcInForDVModel(state, SurfNum, state.dataHeatBalSurf->SurfTempIn, state.dataRoomAirMod->UFHcIn);
     874           0 :                 state.dataUCSDShared->HDoor(Ctd) = state.dataRoomAirMod->UFHcIn(SurfNum);
     875           0 :                 state.dataUFADManager->HAT_OC +=
     876           0 :                     state.dataSurface->Surface(SurfNum).Area * state.dataHeatBalSurf->SurfTempIn(SurfNum) * state.dataUCSDShared->HDoor(Ctd);
     877           0 :                 state.dataUFADManager->HA_OC += state.dataSurface->Surface(SurfNum).Area * state.dataUCSDShared->HDoor(Ctd);
     878             :             }
     879             : 
     880           0 :             if (ZInfSurf <= LayH && ZSupSurf >= LayH) {
     881           0 :                 state.dataHeatBal->SurfTempEffBulkAir(SurfNum) = state.dataRoomAirMod->ZTMX(ZoneNum);
     882           0 :                 CalcDetailedHcInForDVModel(state, SurfNum, state.dataHeatBalSurf->SurfTempIn, state.dataRoomAirMod->UFHcIn);
     883           0 :                 HLU = state.dataRoomAirMod->UFHcIn(SurfNum);
     884           0 :                 state.dataHeatBal->SurfTempEffBulkAir(SurfNum) = state.dataRoomAirMod->ZTOC(ZoneNum);
     885           0 :                 CalcDetailedHcInForDVModel(state, SurfNum, state.dataHeatBalSurf->SurfTempIn, state.dataRoomAirMod->UFHcIn);
     886           0 :                 HLD = state.dataRoomAirMod->UFHcIn(SurfNum);
     887           0 :                 TmedDV = ((ZSupSurf - LayH) * state.dataRoomAirMod->ZTMX(ZoneNum) + (LayH - ZInfSurf) * state.dataRoomAirMod->ZTOC(ZoneNum)) /
     888           0 :                          (ZSupSurf - ZInfSurf);
     889           0 :                 state.dataUCSDShared->HDoor(Ctd) = ((LayH - ZInfSurf) * HLD + (ZSupSurf - LayH) * HLU) / (ZSupSurf - ZInfSurf);
     890           0 :                 state.dataUFADManager->HAT_MX += state.dataSurface->Surface(SurfNum).Area * (ZSupSurf - LayH) / (ZSupSurf - ZInfSurf) *
     891           0 :                                                  state.dataHeatBalSurf->SurfTempIn(SurfNum) * HLU;
     892           0 :                 state.dataUFADManager->HA_MX += state.dataSurface->Surface(SurfNum).Area * (ZSupSurf - LayH) / (ZSupSurf - ZInfSurf) * HLU;
     893           0 :                 state.dataUFADManager->HAT_OC += state.dataSurface->Surface(SurfNum).Area * (LayH - ZInfSurf) / (ZSupSurf - ZInfSurf) *
     894           0 :                                                  state.dataHeatBalSurf->SurfTempIn(SurfNum) * HLD;
     895           0 :                 state.dataUFADManager->HA_OC += state.dataSurface->Surface(SurfNum).Area * (LayH - ZInfSurf) / (ZSupSurf - ZInfSurf) * HLD;
     896           0 :                 state.dataHeatBal->SurfTempEffBulkAir(SurfNum) = TmedDV;
     897             :             }
     898             : 
     899           0 :             state.dataRoomAirMod->UFHcIn(SurfNum) = state.dataUCSDShared->HDoor(Ctd);
     900             : 
     901             :         } // END DOOR
     902             : 
     903             :         // INTERNAL Hc, HA and HAT CALCULATION
     904       79562 :         state.dataUFADManager->HeightIntMass =
     905       79562 :             min(state.dataUFADManager->HeightIntMassDefault,
     906       79562 :                 (state.dataRoomAirMod->ZoneCeilingHeight((ZoneNum - 1) * 2 + 2) - state.dataRoomAirMod->ZoneCeilingHeight((ZoneNum - 1) * 2 + 1)));
     907       79562 :         for (Ctd = state.dataUCSDShared->PosZ_Internal((ZoneNum - 1) * 2 + 1); Ctd <= state.dataUCSDShared->PosZ_Internal((ZoneNum - 1) * 2 + 2);
     908             :              ++Ctd) {
     909           0 :             SurfNum = state.dataUCSDShared->APos_Internal(Ctd);
     910           0 :             state.dataSurface->SurfTAirRef(SurfNum) = DataSurfaces::RefAirTemp::AdjacentAirTemp;
     911           0 :             state.dataSurface->SurfTAirRefRpt(SurfNum) = DataSurfaces::SurfTAirRefReportVals[state.dataSurface->SurfTAirRef(SurfNum)];
     912           0 :             if (SurfNum == 0) continue;
     913           0 :             ZSupSurf = state.dataUFADManager->HeightIntMass;
     914           0 :             ZInfSurf = 0.0;
     915             : 
     916           0 :             if (ZSupSurf < LayH) {
     917           0 :                 state.dataHeatBal->SurfTempEffBulkAir(SurfNum) = state.dataRoomAirMod->ZTOC(ZoneNum);
     918           0 :                 CalcDetailedHcInForDVModel(state, SurfNum, state.dataHeatBalSurf->SurfTempIn, state.dataRoomAirMod->UFHcIn);
     919           0 :                 state.dataUCSDShared->HInternal(Ctd) = state.dataRoomAirMod->UFHcIn(SurfNum);
     920           0 :                 state.dataUFADManager->HAT_OC +=
     921           0 :                     state.dataSurface->Surface(SurfNum).Area * state.dataHeatBalSurf->SurfTempIn(SurfNum) * state.dataUCSDShared->HInternal(Ctd);
     922           0 :                 state.dataUFADManager->HA_OC += state.dataSurface->Surface(SurfNum).Area * state.dataUCSDShared->HInternal(Ctd);
     923             :             }
     924             : 
     925           0 :             if (ZInfSurf <= LayH && ZSupSurf >= LayH) {
     926           0 :                 state.dataHeatBal->SurfTempEffBulkAir(SurfNum) = state.dataRoomAirMod->ZTMX(ZoneNum);
     927           0 :                 CalcDetailedHcInForDVModel(state, SurfNum, state.dataHeatBalSurf->SurfTempIn, state.dataRoomAirMod->UFHcIn);
     928           0 :                 HLU = state.dataRoomAirMod->UFHcIn(SurfNum);
     929           0 :                 state.dataHeatBal->SurfTempEffBulkAir(SurfNum) = state.dataRoomAirMod->ZTOC(ZoneNum);
     930           0 :                 CalcDetailedHcInForDVModel(state, SurfNum, state.dataHeatBalSurf->SurfTempIn, state.dataRoomAirMod->UFHcIn);
     931           0 :                 HLD = state.dataRoomAirMod->UFHcIn(SurfNum);
     932           0 :                 TmedDV = ((ZSupSurf - LayH) * state.dataRoomAirMod->ZTMX(ZoneNum) + (LayH - ZInfSurf) * state.dataRoomAirMod->ZTOC(ZoneNum)) /
     933           0 :                          (ZSupSurf - ZInfSurf);
     934           0 :                 state.dataUCSDShared->HInternal(Ctd) = ((LayH - ZInfSurf) * HLD + (ZSupSurf - LayH) * HLU) / (ZSupSurf - ZInfSurf);
     935           0 :                 state.dataUFADManager->HAT_MX += state.dataSurface->Surface(SurfNum).Area * (ZSupSurf - LayH) / (ZSupSurf - ZInfSurf) *
     936           0 :                                                  state.dataHeatBalSurf->SurfTempIn(SurfNum) * HLU;
     937           0 :                 state.dataUFADManager->HA_MX += state.dataSurface->Surface(SurfNum).Area * (ZSupSurf - LayH) / (ZSupSurf - ZInfSurf) * HLU;
     938           0 :                 state.dataUFADManager->HAT_OC += state.dataSurface->Surface(SurfNum).Area * (LayH - ZInfSurf) / (ZSupSurf - ZInfSurf) *
     939           0 :                                                  state.dataHeatBalSurf->SurfTempIn(SurfNum) * HLD;
     940           0 :                 state.dataUFADManager->HA_OC += state.dataSurface->Surface(SurfNum).Area * (LayH - ZInfSurf) / (ZSupSurf - ZInfSurf) * HLD;
     941           0 :                 state.dataHeatBal->SurfTempEffBulkAir(SurfNum) = TmedDV;
     942             :             }
     943             : 
     944           0 :             state.dataRoomAirMod->UFHcIn(SurfNum) = state.dataUCSDShared->HInternal(Ctd);
     945             :         } // END INTERNAL
     946             : 
     947             :         // CEILING Hc, HA and HAT CALCULATION
     948      159124 :         for (Ctd = state.dataUCSDShared->PosZ_Ceiling((ZoneNum - 1) * 2 + 1); Ctd <= state.dataUCSDShared->PosZ_Ceiling((ZoneNum - 1) * 2 + 2);
     949             :              ++Ctd) {
     950       79562 :             SurfNum = state.dataUCSDShared->APos_Ceiling(Ctd);
     951       79562 :             state.dataSurface->SurfTAirRef(SurfNum) = DataSurfaces::RefAirTemp::AdjacentAirTemp;
     952       79562 :             state.dataSurface->SurfTAirRefRpt(SurfNum) = DataSurfaces::SurfTAirRefReportVals[state.dataSurface->SurfTAirRef(SurfNum)];
     953       79562 :             if (SurfNum == 0) continue;
     954       79562 :             state.dataHeatBal->SurfTempEffBulkAir(SurfNum) = state.dataRoomAirMod->ZTMX(ZoneNum);
     955       79562 :             CalcDetailedHcInForDVModel(state, SurfNum, state.dataHeatBalSurf->SurfTempIn, state.dataRoomAirMod->UFHcIn);
     956       79562 :             state.dataUCSDShared->HCeiling(Ctd) = state.dataRoomAirMod->UFHcIn(SurfNum);
     957       79562 :             state.dataUFADManager->HAT_MX +=
     958       79562 :                 state.dataSurface->Surface(SurfNum).Area * state.dataHeatBalSurf->SurfTempIn(SurfNum) * state.dataUCSDShared->HCeiling(Ctd);
     959       79562 :             state.dataUFADManager->HA_MX += state.dataSurface->Surface(SurfNum).Area * state.dataUCSDShared->HCeiling(Ctd);
     960       79562 :             state.dataRoomAirMod->UFHcIn(SurfNum) = state.dataUCSDShared->HCeiling(Ctd);
     961             :         } // END CEILING
     962             : 
     963             :         // FLOOR Hc, HA and HAT CALCULATION
     964      159124 :         for (Ctd = state.dataUCSDShared->PosZ_Floor((ZoneNum - 1) * 2 + 1); Ctd <= state.dataUCSDShared->PosZ_Floor((ZoneNum - 1) * 2 + 2); ++Ctd) {
     965       79562 :             SurfNum = state.dataUCSDShared->APos_Floor(Ctd);
     966       79562 :             state.dataSurface->SurfTAirRef(SurfNum) = DataSurfaces::RefAirTemp::AdjacentAirTemp;
     967       79562 :             state.dataSurface->SurfTAirRefRpt(SurfNum) = DataSurfaces::SurfTAirRefReportVals[state.dataSurface->SurfTAirRef(SurfNum)];
     968       79562 :             if (SurfNum == 0) continue;
     969       79562 :             state.dataHeatBal->SurfTempEffBulkAir(SurfNum) = state.dataRoomAirMod->ZTFloor(ZoneNum);
     970       79562 :             CalcDetailedHcInForDVModel(state, SurfNum, state.dataHeatBalSurf->SurfTempIn, state.dataRoomAirMod->UFHcIn);
     971       79562 :             state.dataUCSDShared->HFloor(Ctd) = state.dataRoomAirMod->UFHcIn(SurfNum);
     972       79562 :             state.dataUFADManager->HAT_OC +=
     973       79562 :                 state.dataSurface->Surface(SurfNum).Area * state.dataHeatBalSurf->SurfTempIn(SurfNum) * state.dataUCSDShared->HFloor(Ctd);
     974       79562 :             state.dataUFADManager->HA_OC += state.dataSurface->Surface(SurfNum).Area * state.dataUCSDShared->HFloor(Ctd);
     975       79562 :             state.dataHeatBal->SurfTempEffBulkAir(SurfNum) = state.dataRoomAirMod->ZTFloor(ZoneNum);
     976       79562 :             state.dataRoomAirMod->UFHcIn(SurfNum) = state.dataUCSDShared->HFloor(Ctd);
     977             :         } // END FLOOR
     978             :     }
     979       79562 : }
     980             : 
     981        3516 : void CalcUCSDUI(EnergyPlusData &state, int const ZoneNum) // index number for the specified zone
     982             : {
     983             : 
     984             :     // SUBROUTINE INFORMATION:
     985             :     //       AUTHOR         Fred Buhl
     986             :     //       DATE WRITTEN   August 2005
     987             :     //       MODIFIED       Brent Griffith June 2008 for new interpolation and time history
     988             :     //       RE-ENGINEERED  na
     989             : 
     990             :     // PURPOSE OF THIS SUBROUTINE:
     991             :     // Using the UCSD UFAD interior zone model, this subroutine calculates the  occupied subzone height,
     992             :     // surface heat transfer coefficients, the occupied subzone temperature, and the upper subzone temperature.
     993             : 
     994             :     // METHODOLOGY EMPLOYED:
     995             :     // The zone is divided into 2 subzones with a variable transition height.
     996             : 
     997             :     // REFERENCES:
     998             :     // The model is described in the EnergyPlus Engineering Reference in Anna Liu's UCSD PhD thesis.
     999             : 
    1000             :     // Using/Aliasing
    1001             :     using Psychrometrics::PsyCpAirFnW;
    1002             :     using Psychrometrics::PsyRhoAirFnPbTdbW;
    1003        3516 :     auto &TimeStepSys = state.dataHVACGlobal->TimeStepSys;
    1004             :     using InternalHeatGains::SumInternalConvectionGainsByTypes;
    1005             :     using InternalHeatGains::SumReturnAirConvectionGainsByTypes;
    1006             : 
    1007             :     // Locals
    1008             :     // SUBROUTINE ARGUMENT DEFINITIONS:
    1009             : 
    1010             :     // SUBROUTINE PARAMETER DEFINITIONS:
    1011             :     // na
    1012             : 
    1013             :     // INTERFACE BLOCK SPECIFICATIONS:
    1014             :     // na
    1015             : 
    1016             :     // DERIVED TYPE DEFINITIONS:
    1017             :     // na
    1018             : 
    1019             :     // SUBROUTINE LOCAL VARIABLE DECLARATIONS:
    1020        3516 :     bool MIXFLAG(false);  // if true treat as a mixed zone
    1021             :     Real64 CeilingHeight; // zone ceiling height above floor [m]
    1022             :     int UINum;            // index to underfloor interior zone model data
    1023             :     Real64 GainsFrac;     // fraction of occupied subzone heat gains that remain in the subzone;
    1024             :     // that is, don't go into the plumes
    1025             :     // REAL(r64)   :: NumPLPP            ! number of plumes per person
    1026             :     Real64 HeightThermostat;    // height of the thermostat above the floor [m]
    1027             :     Real64 HeightComfort;       // height at which comfort temperature is calculated
    1028             :     Real64 TempDiffCritRep;     // Minimum temperature difference between upper and occupied subzones for reporting
    1029             :     Real64 ConvGainsOccSubzone; // convective heat gains into the lower (occupied) subzone [W]
    1030             :     Real64 ConvGainsUpSubzone;  // convective heat gains into the upper subzone [W]
    1031             :     Real64 ConvGains;           // total zone convective gains (excluding surfaces) [W]
    1032             :     int ZoneEquipConfigNum;     // ZoneEquipConfig index for this UFAD zone
    1033             :     Real64 SumSysMCp;           // Sum of system mass flow rate * specific heat for this zone [W/K]
    1034             :     Real64 SumSysMCpT;          // Sum of system mass flow rate * specific heat * temperature for this zone [W]
    1035             :     Real64 SumSysM;             // Sum of systems mass flow rate [kg/s]
    1036             :     Real64 NodeTemp;            // inlet node temperature [K]
    1037             :     Real64 MassFlowRate;        // system mass flow rate [kg/s]
    1038             :     Real64 CpAir;               // specific heat of air [J/kgK]
    1039             :     int InNodeIndex;            // inlet node index in ZoneEquipConfig
    1040             :     Real64 SumMCp;              // mass flow rate * specific heat for this zone for infiltration, ventilation, mixing [W/K]
    1041             :     Real64 SumMCpT;             // mass flow rate * specific heat* temp for this zone for infiltration, ventilation, mixing [W]
    1042             :     Real64 MCp_Total;           // total mass flow rate * specific heat for this zone [W/K]
    1043             :     Real64 MCpT_Total;          // total mass flow rate * specific heat* temp for this zone [W]
    1044             :     Real64 NumberOfPlumes;
    1045             :     Real64 PowerInPlumes;      // [W]
    1046        3516 :     Real64 PowerPerPlume(0.0); // power generating each plume [W]
    1047             :     Real64 HeightFrac;         // Fractional height of transition between occupied and upper subzones
    1048             :     Real64 TotSysFlow;         // [m3/s]
    1049             :     Real64 NumDiffusersPerPlume;
    1050             :     Real64 NumDiffusers;
    1051             :     Real64 TSupK; // supply yemperature [K]
    1052             :     Real64 Gamma; // dimensionless height parameter; higher gamma means interface height will be
    1053             :     // higher, smaller gamma means interface height will be lower.
    1054             :     Real64 DiffArea;     // diffuser effective area [m2]
    1055             :     Real64 ThrowAngle;   // diffuser slot angle relative to vertical [radians]
    1056             :     Real64 SourceHeight; // height of plume sources above the floor [m]
    1057             :     int Ctd;
    1058             :     Real64 TempHistTerm;
    1059             :     Real64 ZTAveraged;
    1060             :     Real64 HeightUpSubzoneAve;       // Height of center of upper air subzone
    1061             :     Real64 HeightOccupiedSubzoneAve; // Height of center of occupied air subzone
    1062             :     Real64 ZoneMult;                 // total zone multiplier
    1063             :     int ZoneNodeNum;                 // node number of the HVAC zone node
    1064             :     static constexpr std::array<DataHeatBalance::IntGainType, 30> IntGainTypesOccupied = {
    1065             :         DataHeatBalance::IntGainType::People,
    1066             :         DataHeatBalance::IntGainType::WaterHeaterMixed,
    1067             :         DataHeatBalance::IntGainType::WaterHeaterStratified,
    1068             :         DataHeatBalance::IntGainType::ThermalStorageChilledWaterMixed,
    1069             :         DataHeatBalance::IntGainType::ThermalStorageChilledWaterStratified,
    1070             :         DataHeatBalance::IntGainType::ElectricEquipment,
    1071             :         DataHeatBalance::IntGainType::ElectricEquipmentITEAirCooled,
    1072             :         DataHeatBalance::IntGainType::GasEquipment,
    1073             :         DataHeatBalance::IntGainType::HotWaterEquipment,
    1074             :         DataHeatBalance::IntGainType::SteamEquipment,
    1075             :         DataHeatBalance::IntGainType::OtherEquipment,
    1076             :         DataHeatBalance::IntGainType::ZoneBaseboardOutdoorTemperatureControlled,
    1077             :         DataHeatBalance::IntGainType::GeneratorFuelCell,
    1078             :         DataHeatBalance::IntGainType::WaterUseEquipment,
    1079             :         DataHeatBalance::IntGainType::GeneratorMicroCHP,
    1080             :         DataHeatBalance::IntGainType::ElectricLoadCenterTransformer,
    1081             :         DataHeatBalance::IntGainType::ElectricLoadCenterInverterSimple,
    1082             :         DataHeatBalance::IntGainType::ElectricLoadCenterInverterFunctionOfPower,
    1083             :         DataHeatBalance::IntGainType::ElectricLoadCenterInverterLookUpTable,
    1084             :         DataHeatBalance::IntGainType::ElectricLoadCenterStorageLiIonNmcBattery,
    1085             :         DataHeatBalance::IntGainType::ElectricLoadCenterStorageBattery,
    1086             :         DataHeatBalance::IntGainType::ElectricLoadCenterStorageSimple,
    1087             :         DataHeatBalance::IntGainType::PipeIndoor,
    1088             :         DataHeatBalance::IntGainType::RefrigerationCase,
    1089             :         DataHeatBalance::IntGainType::RefrigerationCompressorRack,
    1090             :         DataHeatBalance::IntGainType::RefrigerationSystemAirCooledCondenser,
    1091             :         DataHeatBalance::IntGainType::RefrigerationSystemSuctionPipe,
    1092             :         DataHeatBalance::IntGainType::RefrigerationSecondaryReceiver,
    1093             :         DataHeatBalance::IntGainType::RefrigerationSecondaryPipe,
    1094             :         DataHeatBalance::IntGainType::RefrigerationWalkIn};
    1095             : 
    1096             :     static constexpr std::array<DataHeatBalance::IntGainType, 2> IntGainTypesUpSubzone = {DataHeatBalance::IntGainType::DaylightingDeviceTubular,
    1097             :                                                                                           DataHeatBalance::IntGainType::Lights};
    1098             :     Real64 RetAirGains;
    1099             : 
    1100             :     // Exact solution or Euler method
    1101        3516 :     if (state.dataHeatBal->ZoneAirSolutionAlgo != DataHeatBalance::SolutionAlgo::ThirdOrder) {
    1102           0 :         if (state.dataHVACGlobal->ShortenTimeStepSysRoomAir && TimeStepSys < state.dataGlobal->TimeStepZone) {
    1103           0 :             if (state.dataHVACGlobal->PreviousTimeStep < state.dataGlobal->TimeStepZone) {
    1104           0 :                 state.dataRoomAirMod->Zone1OC(ZoneNum) = state.dataRoomAirMod->ZoneM2OC(ZoneNum);
    1105           0 :                 state.dataRoomAirMod->Zone1MX(ZoneNum) = state.dataRoomAirMod->ZoneM2MX(ZoneNum);
    1106             :             } else {
    1107           0 :                 state.dataRoomAirMod->Zone1OC(ZoneNum) = state.dataRoomAirMod->ZoneMXOC(ZoneNum);
    1108           0 :                 state.dataRoomAirMod->Zone1MX(ZoneNum) = state.dataRoomAirMod->ZoneMXMX(ZoneNum);
    1109             :             }
    1110             :         } else {
    1111           0 :             state.dataRoomAirMod->Zone1OC(ZoneNum) = state.dataRoomAirMod->ZTOC(ZoneNum);
    1112           0 :             state.dataRoomAirMod->Zone1MX(ZoneNum) = state.dataRoomAirMod->ZTMX(ZoneNum);
    1113             :         }
    1114             :     }
    1115             : 
    1116        3516 :     auto &thisZoneHB = state.dataZoneTempPredictorCorrector->zoneHeatBalance(ZoneNum);
    1117        3516 :     MIXFLAG = false;
    1118        3516 :     state.dataRoomAirMod->UFHcIn = state.dataHeatBalSurf->SurfHConvInt;
    1119        3516 :     SumSysMCp = 0.0;
    1120        3516 :     SumSysMCpT = 0.0;
    1121        3516 :     TotSysFlow = 0.0;
    1122        3516 :     TSupK = 0.0;
    1123        3516 :     SumSysM = 0.0;
    1124        3516 :     ZoneMult = state.dataHeatBal->Zone(ZoneNum).Multiplier * state.dataHeatBal->Zone(ZoneNum).ListMultiplier;
    1125        3516 :     CeilingHeight = state.dataRoomAirMod->ZoneCeilingHeight((ZoneNum - 1) * 2 + 2) - state.dataRoomAirMod->ZoneCeilingHeight((ZoneNum - 1) * 2 + 1);
    1126        3516 :     UINum = state.dataRoomAirMod->ZoneUFPtr(ZoneNum);
    1127        3516 :     HeightThermostat = state.dataRoomAirMod->ZoneUCSDUI(UINum).ThermostatHeight;
    1128        3516 :     HeightComfort = state.dataRoomAirMod->ZoneUCSDUI(UINum).ComfortHeight;
    1129        3516 :     TempDiffCritRep = state.dataRoomAirMod->ZoneUCSDUI(UINum).TempTrigger;
    1130        3516 :     DiffArea = state.dataRoomAirMod->ZoneUCSDUI(UINum).DiffArea;
    1131        3516 :     ThrowAngle = DataGlobalConstants::DegToRadians * state.dataRoomAirMod->ZoneUCSDUI(UINum).DiffAngle;
    1132        3516 :     SourceHeight = 0.0;
    1133        3516 :     NumDiffusers = state.dataRoomAirMod->ZoneUCSDUI(UINum).DiffusersPerZone;
    1134        3516 :     PowerPerPlume = state.dataRoomAirMod->ZoneUCSDUI(UINum).PowerPerPlume;
    1135             :     // gains from occupants, task lighting, elec equip, gas equip, other equip, hot water equip, steam equip,
    1136             :     // baseboards (nonthermostatic), water heater skin loss
    1137        3516 :     ConvGainsOccSubzone = SumInternalConvectionGainsByTypes(state, ZoneNum, IntGainTypesOccupied);
    1138             : 
    1139             :     // Add heat to return air if zonal system (no return air) or cycling system (return air frequently very
    1140             :     // low or zero)
    1141        3516 :     if (state.dataHeatBal->Zone(ZoneNum).NoHeatToReturnAir) {
    1142           0 :         RetAirGains = SumReturnAirConvectionGainsByTypes(state, ZoneNum, IntGainTypesOccupied);
    1143           0 :         ConvGainsOccSubzone += RetAirGains;
    1144             :     }
    1145             : 
    1146             :     // Add convection from pool cover to occupied region
    1147        3516 :     ConvGainsOccSubzone += state.dataHeatBalFanSys->SumConvPool(ZoneNum);
    1148             : 
    1149             :     // gains from lights (ceiling), tubular daylighting devices, high temp radiant heaters
    1150             : 
    1151        3516 :     ConvGainsUpSubzone = SumInternalConvectionGainsByTypes(state, ZoneNum, IntGainTypesUpSubzone);
    1152        3516 :     ConvGainsUpSubzone += state.dataHeatBalFanSys->SumConvHTRadSys(ZoneNum);
    1153        3516 :     if (state.dataHeatBal->Zone(ZoneNum).NoHeatToReturnAir) {
    1154           0 :         RetAirGains = SumReturnAirConvectionGainsByTypes(state, ZoneNum, IntGainTypesUpSubzone);
    1155           0 :         ConvGainsUpSubzone += RetAirGains;
    1156             :     }
    1157        3516 :     ConvGains = ConvGainsOccSubzone + ConvGainsUpSubzone + thisZoneHB.SysDepZoneLoadsLagged;
    1158        3516 :     ZoneEquipConfigNum = state.dataRoomAirMod->ZoneUCSDUI(UINum).ZoneEquipPtr;
    1159        3516 :     if (ZoneEquipConfigNum > 0) {
    1160        7032 :         for (InNodeIndex = 1; InNodeIndex <= state.dataZoneEquip->ZoneEquipConfig(ZoneEquipConfigNum).NumInletNodes; ++InNodeIndex) {
    1161        3516 :             NodeTemp = state.dataLoopNodes->Node(state.dataZoneEquip->ZoneEquipConfig(ZoneEquipConfigNum).InletNode(InNodeIndex)).Temp;
    1162        3516 :             MassFlowRate = state.dataLoopNodes->Node(state.dataZoneEquip->ZoneEquipConfig(ZoneEquipConfigNum).InletNode(InNodeIndex)).MassFlowRate;
    1163        3516 :             CpAir = PsyCpAirFnW(thisZoneHB.ZoneAirHumRat);
    1164        3516 :             SumSysMCp += MassFlowRate * CpAir;
    1165        3516 :             SumSysMCpT += MassFlowRate * CpAir * NodeTemp;
    1166        3516 :             TotSysFlow += MassFlowRate / PsyRhoAirFnPbTdbW(state, state.dataEnvrn->OutBaroPress, NodeTemp, thisZoneHB.ZoneAirHumRat);
    1167        3516 :             TSupK += MassFlowRate * NodeTemp;
    1168        3516 :             SumSysM += MassFlowRate;
    1169             :         }
    1170        3516 :         if (TotSysFlow > 0.0) {
    1171        3088 :             TSupK = TSupK / SumSysM + DataGlobalConstants::KelvinConv;
    1172             :         } else {
    1173         428 :             TSupK = 0.0;
    1174             :         }
    1175             :     }
    1176             :     // mass flow times specific heat for infiltration, ventilation, mixing, earth tube
    1177        3516 :     SumMCp = thisZoneHB.MCPI + thisZoneHB.MCPV + thisZoneHB.MCPM + thisZoneHB.MCPE + thisZoneHB.MCPC + thisZoneHB.MDotCPOA;
    1178             :     // mass flow times specific heat times temperature for infiltration, ventilation, mixing, earth tube
    1179        7032 :     SumMCpT = thisZoneHB.MCPTI + thisZoneHB.MCPTV + thisZoneHB.MCPTM + thisZoneHB.MCPTE + thisZoneHB.MCPTC +
    1180        3516 :               thisZoneHB.MDotCPOA * state.dataHeatBal->Zone(ZoneNum).OutDryBulbTemp;
    1181        3516 :     MCp_Total = SumMCp + SumSysMCp;
    1182        3516 :     MCpT_Total = SumMCpT + SumSysMCpT;
    1183             :     // For the York MIT diffusers (variable area) the area varies with the flow rate. Assume 400 ft/min velocity
    1184             :     // at the diffuser, and a design flow rate of 150 cfm (.0708 m3/s). Then the design area for each diffuser is
    1185             :     // 150 ft3/min / 400 ft/min = .375 ft2 = .035 m2. This is adjusted each time step by
    1186             :     //               (TotSysFlow/(NumDiffusers*.0708))*.035
    1187        3516 :     if (state.dataRoomAirMod->ZoneUCSDUI(UINum).DiffuserType == Diffuser::VarArea) {
    1188           0 :         DiffArea = 0.035 * TotSysFlow / (0.0708 * NumDiffusers);
    1189             :     }
    1190             :     // initial estimate of convective transfer from surfaces; assume HeightFrac is 0.5.
    1191        3516 :     HcUCSDUF(state, ZoneNum, 0.5);
    1192       10548 :     PowerInPlumes = ConvGains + state.dataUFADManager->HAT_OC - state.dataUFADManager->HA_OC * state.dataRoomAirMod->ZTOC(ZoneNum) +
    1193        7032 :                     state.dataUFADManager->HAT_MX - state.dataUFADManager->HA_MX * state.dataRoomAirMod->ZTMX(ZoneNum);
    1194        3516 :     if (PowerPerPlume > 0.0 && PowerInPlumes > 0.0) {
    1195        1950 :         NumberOfPlumes = PowerInPlumes / PowerPerPlume;
    1196        1950 :         NumDiffusersPerPlume = NumDiffusers / NumberOfPlumes;
    1197             :     } else {
    1198        1566 :         NumberOfPlumes = 1.0;
    1199        1566 :         NumDiffusersPerPlume = 1.0;
    1200             :     }
    1201        3516 :     if ((PowerInPlumes <= 0.0) || (TotSysFlow == 0.0) || (TSupK - DataGlobalConstants::KelvinConv) > thisZoneHB.MAT) {
    1202             :         // The system will mix
    1203        1782 :         HeightFrac = 0.0;
    1204             :     } else {
    1205        3468 :         Gamma = std::pow(TotSysFlow * std::cos(ThrowAngle), 1.5) /
    1206        1734 :                 (NumberOfPlumes * std::pow(NumDiffusersPerPlume * DiffArea, 1.25) * std::sqrt(0.0281 * 0.001 * PowerInPlumes));
    1207        1734 :         if (state.dataRoomAirMod->ZoneUCSDUI(UINum).CalcTransHeight) {
    1208           0 :             HeightFrac = (std::sqrt(NumDiffusersPerPlume * DiffArea) * (7.43 * std::log(Gamma) - 1.35) + 0.5 * SourceHeight) / CeilingHeight;
    1209             :         } else {
    1210        1734 :             HeightFrac = state.dataRoomAirMod->ZoneUCSDUI(UINum).TransHeight / CeilingHeight;
    1211             :         }
    1212        1734 :         HeightFrac = max(0.0, min(1.0, HeightFrac));
    1213        8658 :         for (Ctd = 1; Ctd <= 4; ++Ctd) {
    1214        6928 :             HcUCSDUF(state, ZoneNum, HeightFrac);
    1215       20784 :             PowerInPlumes = ConvGains + state.dataUFADManager->HAT_OC - state.dataUFADManager->HA_OC * state.dataRoomAirMod->ZTOC(ZoneNum) +
    1216       13856 :                             state.dataUFADManager->HAT_MX - state.dataUFADManager->HA_MX * state.dataRoomAirMod->ZTMX(ZoneNum);
    1217        6928 :             if (PowerPerPlume > 0.0 && PowerInPlumes > 0.0) {
    1218        6924 :                 NumberOfPlumes = PowerInPlumes / PowerPerPlume;
    1219        6924 :                 NumDiffusersPerPlume = NumDiffusers / NumberOfPlumes;
    1220             :             } else {
    1221           4 :                 NumberOfPlumes = 1.0;
    1222           4 :                 NumDiffusersPerPlume = 1.0;
    1223             :             }
    1224        6928 :             if (PowerInPlumes <= 0.0) break;
    1225       13848 :             Gamma = std::pow(TotSysFlow * std::cos(ThrowAngle), 1.5) /
    1226        6924 :                     (NumberOfPlumes * std::pow(NumDiffusersPerPlume * DiffArea, 1.25) * std::sqrt(0.0281 * 0.001 * PowerInPlumes));
    1227        6924 :             if (state.dataRoomAirMod->ZoneUCSDUI(UINum).CalcTransHeight) {
    1228           0 :                 HeightFrac = (std::sqrt(NumDiffusersPerPlume * DiffArea) * (7.43 * std::log(Gamma) - 1.35) + 0.5 * SourceHeight) / CeilingHeight;
    1229             :             } else {
    1230        6924 :                 HeightFrac = state.dataRoomAirMod->ZoneUCSDUI(UINum).TransHeight / CeilingHeight;
    1231             :             }
    1232        6924 :             HeightFrac = max(0.0, min(1.0, HeightFrac));
    1233        6924 :             state.dataRoomAirMod->HeightTransition(ZoneNum) = HeightFrac * CeilingHeight;
    1234       20772 :             GainsFrac = state.dataRoomAirMod->ZoneUCSDUI(UINum).A_Kc * std::pow(Gamma, state.dataRoomAirMod->ZoneUCSDUI(UINum).B_Kc) +
    1235       13848 :                         state.dataRoomAirMod->ZoneUCSDUI(UINum).C_Kc + state.dataRoomAirMod->ZoneUCSDUI(UINum).D_Kc * Gamma +
    1236        6924 :                         state.dataRoomAirMod->ZoneUCSDUI(UINum).E_Kc * pow_2(Gamma);
    1237        6924 :             GainsFrac = max(0.6, min(GainsFrac, 1.0));
    1238        6924 :             state.dataRoomAirMod->AIRRATOC(ZoneNum) =
    1239       13848 :                 state.dataHeatBal->Zone(ZoneNum).Volume *
    1240       20772 :                 (state.dataRoomAirMod->HeightTransition(ZoneNum) - min(state.dataRoomAirMod->HeightTransition(ZoneNum), 0.2)) / CeilingHeight *
    1241       13848 :                 state.dataHeatBal->Zone(ZoneNum).ZoneVolCapMultpSens *
    1242       20772 :                 PsyRhoAirFnPbTdbW(state, state.dataEnvrn->OutBaroPress, state.dataRoomAirMod->MATOC(ZoneNum), thisZoneHB.ZoneAirHumRat) *
    1243       13848 :                 PsyCpAirFnW(thisZoneHB.ZoneAirHumRat) / (TimeStepSys * DataGlobalConstants::SecInHour);
    1244        6924 :             state.dataRoomAirMod->AIRRATMX(ZoneNum) =
    1245       13848 :                 state.dataHeatBal->Zone(ZoneNum).Volume * (CeilingHeight - state.dataRoomAirMod->HeightTransition(ZoneNum)) / CeilingHeight *
    1246       13848 :                 state.dataHeatBal->Zone(ZoneNum).ZoneVolCapMultpSens *
    1247       20772 :                 PsyRhoAirFnPbTdbW(state, state.dataEnvrn->OutBaroPress, state.dataRoomAirMod->MATMX(ZoneNum), thisZoneHB.ZoneAirHumRat) *
    1248       13848 :                 PsyCpAirFnW(thisZoneHB.ZoneAirHumRat) / (TimeStepSys * DataGlobalConstants::SecInHour);
    1249             : 
    1250        6924 :             if (state.dataHVACGlobal->UseZoneTimeStepHistory) {
    1251        4428 :                 state.dataRoomAirMod->ZTM3OC(ZoneNum) = state.dataRoomAirMod->XM3TOC(ZoneNum);
    1252        4428 :                 state.dataRoomAirMod->ZTM2OC(ZoneNum) = state.dataRoomAirMod->XM2TOC(ZoneNum);
    1253        4428 :                 state.dataRoomAirMod->ZTM1OC(ZoneNum) = state.dataRoomAirMod->XMATOC(ZoneNum);
    1254             : 
    1255        4428 :                 state.dataRoomAirMod->ZTM3MX(ZoneNum) = state.dataRoomAirMod->XM3TMX(ZoneNum);
    1256        4428 :                 state.dataRoomAirMod->ZTM2MX(ZoneNum) = state.dataRoomAirMod->XM2TMX(ZoneNum);
    1257        4428 :                 state.dataRoomAirMod->ZTM1MX(ZoneNum) = state.dataRoomAirMod->XMATMX(ZoneNum);
    1258             : 
    1259             :             } else {
    1260        2496 :                 state.dataRoomAirMod->ZTM3OC(ZoneNum) = state.dataRoomAirMod->DSXM3TOC(ZoneNum);
    1261        2496 :                 state.dataRoomAirMod->ZTM2OC(ZoneNum) = state.dataRoomAirMod->DSXM2TOC(ZoneNum);
    1262        2496 :                 state.dataRoomAirMod->ZTM1OC(ZoneNum) = state.dataRoomAirMod->DSXMATOC(ZoneNum);
    1263             : 
    1264        2496 :                 state.dataRoomAirMod->ZTM3MX(ZoneNum) = state.dataRoomAirMod->DSXM3TMX(ZoneNum);
    1265        2496 :                 state.dataRoomAirMod->ZTM2MX(ZoneNum) = state.dataRoomAirMod->DSXM2TMX(ZoneNum);
    1266        2496 :                 state.dataRoomAirMod->ZTM1MX(ZoneNum) = state.dataRoomAirMod->DSXMATMX(ZoneNum);
    1267             :             }
    1268             : 
    1269        6924 :             Real64 AirCap = state.dataRoomAirMod->AIRRATOC(ZoneNum);
    1270       13848 :             TempHistTerm = AirCap * (3.0 * state.dataRoomAirMod->ZTM1OC(ZoneNum) - (3.0 / 2.0) * state.dataRoomAirMod->ZTM2OC(ZoneNum) +
    1271        6924 :                                      (1.0 / 3.0) * state.dataRoomAirMod->ZTM3OC(ZoneNum));
    1272             :             // Formerly CoefSumha, coef in zone temp equation with dimensions of h*A
    1273        6924 :             Real64 TempDepCoef = GainsFrac * state.dataUFADManager->HA_OC + MCp_Total;
    1274       13848 :             Real64 TempIndCoef = GainsFrac * (ConvGains + state.dataUFADManager->HAT_OC + state.dataUFADManager->HAT_MX -
    1275       13848 :                                               state.dataUFADManager->HA_MX * state.dataRoomAirMod->ZTMX(ZoneNum)) +
    1276        6924 :                                  MCpT_Total + thisZoneHB.NonAirSystemResponse / ZoneMult;
    1277        6924 :             switch (state.dataHeatBal->ZoneAirSolutionAlgo) {
    1278        6924 :             case DataHeatBalance::SolutionAlgo::ThirdOrder: {
    1279       13848 :                 state.dataRoomAirMod->ZTOC(ZoneNum) = (TempHistTerm +
    1280       13848 :                                                        GainsFrac * (ConvGains + state.dataUFADManager->HAT_OC + state.dataUFADManager->HAT_MX -
    1281       13848 :                                                                     state.dataUFADManager->HA_MX * state.dataRoomAirMod->ZTMX(ZoneNum)) +
    1282       13848 :                                                        MCpT_Total + thisZoneHB.NonAirSystemResponse / ZoneMult) /
    1283        6924 :                                                       ((11.0 / 6.0) * AirCap + GainsFrac * state.dataUFADManager->HA_OC + MCp_Total);
    1284        6924 :             } break;
    1285           0 :             case DataHeatBalance::SolutionAlgo::AnalyticalSolution: {
    1286           0 :                 if (TempDepCoef == 0.0) { // B=0
    1287           0 :                     state.dataRoomAirMod->ZTOC(ZoneNum) = state.dataRoomAirMod->Zone1OC(ZoneNum) + TempIndCoef / AirCap;
    1288             :                 } else {
    1289           0 :                     state.dataRoomAirMod->ZTOC(ZoneNum) =
    1290           0 :                         (state.dataRoomAirMod->Zone1OC(ZoneNum) - TempIndCoef / TempDepCoef) * std::exp(min(700.0, -TempDepCoef / AirCap)) +
    1291           0 :                         TempIndCoef / TempDepCoef;
    1292             :                 }
    1293           0 :             } break;
    1294           0 :             case DataHeatBalance::SolutionAlgo::EulerMethod: {
    1295           0 :                 state.dataRoomAirMod->ZTOC(ZoneNum) = (AirCap * state.dataRoomAirMod->Zone1OC(ZoneNum) + TempIndCoef) / (AirCap + TempDepCoef);
    1296           0 :             } break;
    1297           0 :             default:
    1298           0 :                 break;
    1299             :             }
    1300        6924 :             AirCap = state.dataRoomAirMod->AIRRATMX(ZoneNum);
    1301       13848 :             TempHistTerm = AirCap * (3.0 * state.dataRoomAirMod->ZTM1MX(ZoneNum) - (3.0 / 2.0) * state.dataRoomAirMod->ZTM2MX(ZoneNum) +
    1302        6924 :                                      (1.0 / 3.0) * state.dataRoomAirMod->ZTM3MX(ZoneNum));
    1303        6924 :             TempDepCoef = (1.0 - GainsFrac) * state.dataUFADManager->HA_MX + MCp_Total;
    1304       20772 :             TempIndCoef = (1.0 - GainsFrac) * (ConvGains + state.dataUFADManager->HAT_OC + state.dataUFADManager->HAT_MX -
    1305        6924 :                                                state.dataUFADManager->HA_OC * state.dataRoomAirMod->ZTOC(ZoneNum)) +
    1306        6924 :                           state.dataRoomAirMod->ZTOC(ZoneNum) * MCp_Total;
    1307        6924 :             switch (state.dataHeatBal->ZoneAirSolutionAlgo) {
    1308        6924 :             case DataHeatBalance::SolutionAlgo::ThirdOrder: {
    1309        6924 :                 state.dataRoomAirMod->ZTMX(ZoneNum) =
    1310        6924 :                     (TempHistTerm +
    1311       13848 :                      (1.0 - GainsFrac) * (ConvGains + state.dataUFADManager->HAT_OC + state.dataUFADManager->HAT_MX -
    1312       13848 :                                           state.dataUFADManager->HA_OC * state.dataRoomAirMod->ZTOC(ZoneNum)) +
    1313       13848 :                      state.dataRoomAirMod->ZTOC(ZoneNum) * MCp_Total) /
    1314        6924 :                     ((11.0 / 6.0) * AirCap + (1.0 - GainsFrac) * state.dataUFADManager->HA_MX + MCp_Total);
    1315        6924 :             } break;
    1316           0 :             case DataHeatBalance::SolutionAlgo::AnalyticalSolution: {
    1317           0 :                 if (TempDepCoef == 0.0) { // B=0
    1318           0 :                     state.dataRoomAirMod->ZTMX(ZoneNum) = state.dataRoomAirMod->Zone1MX(ZoneNum) + TempIndCoef / AirCap;
    1319             :                 } else {
    1320           0 :                     state.dataRoomAirMod->ZTMX(ZoneNum) =
    1321           0 :                         (state.dataRoomAirMod->Zone1MX(ZoneNum) - TempIndCoef / TempDepCoef) * std::exp(min(700.0, -TempDepCoef / AirCap)) +
    1322           0 :                         TempIndCoef / TempDepCoef;
    1323             :                 }
    1324           0 :             } break;
    1325           0 :             case DataHeatBalance::SolutionAlgo::EulerMethod: {
    1326           0 :                 state.dataRoomAirMod->ZTMX(ZoneNum) = (AirCap * state.dataRoomAirMod->Zone1MX(ZoneNum) + TempIndCoef) / (AirCap + TempDepCoef);
    1327           0 :             } break;
    1328           0 :             default:
    1329           0 :                 break;
    1330             :             }
    1331        6924 :             state.dataRoomAirMod->ZTFloor(ZoneNum) = state.dataRoomAirMod->ZTOC(ZoneNum);
    1332             :         }
    1333        1734 :         if (PowerInPlumes <= 0.0) {
    1334           4 :             HeightFrac = 0.0;
    1335           4 :             state.dataRoomAirMod->AirModel(ZoneNum).SimAirModel = false;
    1336           4 :             state.dataRoomAirMod->ZoneUFGamma(ZoneNum) = 0.0;
    1337           4 :             state.dataRoomAirMod->ZoneUFPowInPlumes(ZoneNum) = 0.0;
    1338             :         } else {
    1339        1730 :             state.dataRoomAirMod->AirModel(ZoneNum).SimAirModel = true;
    1340        1730 :             state.dataRoomAirMod->ZoneUFGamma(ZoneNum) = Gamma;
    1341        1730 :             state.dataRoomAirMod->ZoneUFPowInPlumes(ZoneNum) = PowerInPlumes;
    1342             :         }
    1343             :     }
    1344             : 
    1345             :     //=============================== M I X E D  Calculation ==============================================
    1346        6630 :     if (state.dataRoomAirMod->ZTMX(ZoneNum) < state.dataRoomAirMod->ZTOC(ZoneNum) || MCp_Total <= 0.0 ||
    1347        3114 :         HeightFrac * CeilingHeight < state.dataUFADManager->ThickOccupiedSubzoneMin) {
    1348        1797 :         MIXFLAG = true;
    1349        1797 :         HeightFrac = 0.0;
    1350        1797 :         state.dataRoomAirMod->AvgTempGrad(ZoneNum) = 0.0;
    1351        1797 :         state.dataRoomAirMod->MaxTempGrad(ZoneNum) = 0.0;
    1352        1797 :         state.dataRoomAirMod->AirModel(ZoneNum).SimAirModel = false;
    1353        1797 :         Real64 AirCap = thisZoneHB.AirPowerCap;
    1354        1797 :         TempHistTerm = AirCap * (3.0 * thisZoneHB.ZTM[0] - (3.0 / 2.0) * thisZoneHB.ZTM[1] + (1.0 / 3.0) * thisZoneHB.ZTM[2]);
    1355             : 
    1356        7188 :         for (Ctd = 1; Ctd <= 3; ++Ctd) {
    1357        5391 :             Real64 TempDepCoef = state.dataUFADManager->HA_MX + state.dataUFADManager->HA_OC + MCp_Total;
    1358        5391 :             Real64 const thisZoneT1 = thisZoneHB.ZoneT1;
    1359             :             // Formerly CoefSumhat, coef in zone temp equation with dimensions of h*A(T1
    1360        5391 :             Real64 TempIndCoef = ConvGains + state.dataUFADManager->HAT_MX + state.dataUFADManager->HAT_OC + MCpT_Total;
    1361        5391 :             switch (state.dataHeatBal->ZoneAirSolutionAlgo) {
    1362        5391 :             case DataHeatBalance::SolutionAlgo::ThirdOrder: {
    1363       10782 :                 ZTAveraged = (TempHistTerm + ConvGains + state.dataUFADManager->HAT_MX + state.dataUFADManager->HAT_OC + MCpT_Total) /
    1364        5391 :                              ((11.0 / 6.0) * AirCap + state.dataUFADManager->HA_MX + state.dataUFADManager->HA_OC + MCp_Total);
    1365        5391 :             } break;
    1366           0 :             case DataHeatBalance::SolutionAlgo::AnalyticalSolution: {
    1367           0 :                 if (TempDepCoef == 0.0) { // B=0
    1368           0 :                     ZTAveraged = thisZoneT1 + TempIndCoef / AirCap;
    1369             :                 } else {
    1370           0 :                     ZTAveraged = (thisZoneT1 - TempIndCoef / TempDepCoef) * std::exp(min(700.0, -TempDepCoef / AirCap)) + TempIndCoef / TempDepCoef;
    1371             :                 }
    1372           0 :             } break;
    1373           0 :             case DataHeatBalance::SolutionAlgo::EulerMethod: {
    1374           0 :                 ZTAveraged = (AirCap * thisZoneT1 + TempIndCoef) / (AirCap + TempDepCoef);
    1375           0 :             } break;
    1376           0 :             default:
    1377           0 :                 break;
    1378             :             }
    1379        5391 :             state.dataRoomAirMod->ZTOC(ZoneNum) = ZTAveraged;
    1380        5391 :             state.dataRoomAirMod->ZTMX(ZoneNum) = ZTAveraged;
    1381        5391 :             state.dataRoomAirMod->ZTFloor(ZoneNum) = ZTAveraged;
    1382        5391 :             HcUCSDUF(state, ZoneNum, HeightFrac);
    1383        5391 :             TempDepCoef = state.dataUFADManager->HA_MX + state.dataUFADManager->HA_OC + MCp_Total;
    1384        5391 :             TempIndCoef = ConvGains + state.dataUFADManager->HAT_MX + state.dataUFADManager->HAT_OC + MCpT_Total;
    1385        5391 :             switch (state.dataHeatBal->ZoneAirSolutionAlgo) {
    1386        5391 :             case DataHeatBalance::SolutionAlgo::ThirdOrder: {
    1387       10782 :                 ZTAveraged = (TempHistTerm + ConvGains + state.dataUFADManager->HAT_MX + state.dataUFADManager->HAT_OC + MCpT_Total) /
    1388        5391 :                              ((11.0 / 6.0) * AirCap + state.dataUFADManager->HA_MX + state.dataUFADManager->HA_OC + MCp_Total);
    1389        5391 :             } break;
    1390           0 :             case DataHeatBalance::SolutionAlgo::AnalyticalSolution: {
    1391           0 :                 if (TempDepCoef == 0.0) { // B=0
    1392           0 :                     ZTAveraged = thisZoneT1 + TempIndCoef / AirCap;
    1393             :                 } else {
    1394           0 :                     ZTAveraged = (thisZoneT1 - TempIndCoef / TempDepCoef) * std::exp(min(700.0, -TempDepCoef / AirCap)) + TempIndCoef / TempDepCoef;
    1395             :                 }
    1396           0 :             } break;
    1397           0 :             case DataHeatBalance::SolutionAlgo::EulerMethod: {
    1398           0 :                 ZTAveraged = (AirCap * thisZoneT1 + TempIndCoef) / (AirCap + TempDepCoef);
    1399           0 :             } break;
    1400           0 :             default:
    1401           0 :                 break;
    1402             :             }
    1403        5391 :             state.dataRoomAirMod->ZTOC(ZoneNum) = ZTAveraged;
    1404        5391 :             state.dataRoomAirMod->ZTMX(ZoneNum) = ZTAveraged;
    1405        5391 :             state.dataRoomAirMod->ZTFloor(ZoneNum) = ZTAveraged;
    1406             :         }
    1407             :     }
    1408             :     //=========================================================================================
    1409             : 
    1410             :     // Comfort temperature and temperature at the thermostat/temperature control sensor
    1411             : 
    1412        3516 :     state.dataRoomAirMod->HeightTransition(ZoneNum) = HeightFrac * CeilingHeight;
    1413        3516 :     HeightUpSubzoneAve = (CeilingHeight + state.dataRoomAirMod->HeightTransition(ZoneNum)) / 2.0;
    1414        3516 :     HeightOccupiedSubzoneAve = state.dataRoomAirMod->HeightTransition(ZoneNum) / 2.0;
    1415             :     // Comfort temperature
    1416             : 
    1417        3516 :     if (MIXFLAG) {
    1418        1797 :         state.dataRoomAirMod->TCMF(ZoneNum) = ZTAveraged;
    1419             :     } else {
    1420        1719 :         if (HeightComfort < HeightOccupiedSubzoneAve) {
    1421           0 :             state.dataRoomAirMod->TCMF(ZoneNum) = state.dataRoomAirMod->ZTOC(ZoneNum);
    1422        1719 :         } else if (HeightComfort >= HeightOccupiedSubzoneAve && HeightComfort < HeightUpSubzoneAve) {
    1423        5157 :             state.dataRoomAirMod->TCMF(ZoneNum) = (state.dataRoomAirMod->ZTOC(ZoneNum) * (HeightUpSubzoneAve - HeightComfort) +
    1424        3438 :                                                    state.dataRoomAirMod->ZTMX(ZoneNum) * (HeightComfort - HeightOccupiedSubzoneAve)) /
    1425        1719 :                                                   (HeightUpSubzoneAve - HeightOccupiedSubzoneAve);
    1426           0 :         } else if (HeightComfort >= HeightUpSubzoneAve && HeightComfort <= CeilingHeight) {
    1427           0 :             state.dataRoomAirMod->TCMF(ZoneNum) = state.dataRoomAirMod->ZTMX(ZoneNum);
    1428             :         } else {
    1429           0 :             ShowFatalError(state, "UFAD comfort height is above ceiling or below floor in Zone: " + state.dataHeatBal->Zone(ZoneNum).Name);
    1430             :         }
    1431             :     }
    1432             : 
    1433             :     // Temperature at the thermostat/temperature control sensor
    1434             : 
    1435        3516 :     if (MIXFLAG) {
    1436        1797 :         state.dataHeatBalFanSys->TempTstatAir(ZoneNum) = ZTAveraged;
    1437             :     } else {
    1438        1719 :         if (HeightThermostat < HeightOccupiedSubzoneAve) {
    1439           0 :             state.dataHeatBalFanSys->TempTstatAir(ZoneNum) = state.dataRoomAirMod->ZTOC(ZoneNum);
    1440        1719 :         } else if (HeightThermostat >= HeightOccupiedSubzoneAve && HeightThermostat < HeightUpSubzoneAve) {
    1441        5157 :             state.dataHeatBalFanSys->TempTstatAir(ZoneNum) = (state.dataRoomAirMod->ZTOC(ZoneNum) * (HeightUpSubzoneAve - HeightThermostat) +
    1442        3438 :                                                               state.dataRoomAirMod->ZTMX(ZoneNum) * (HeightThermostat - HeightOccupiedSubzoneAve)) /
    1443        1719 :                                                              (HeightUpSubzoneAve - HeightOccupiedSubzoneAve);
    1444           0 :         } else if (HeightThermostat >= HeightUpSubzoneAve && HeightThermostat <= CeilingHeight) {
    1445           0 :             state.dataHeatBalFanSys->TempTstatAir(ZoneNum) = state.dataRoomAirMod->ZTMX(ZoneNum);
    1446             :         } else {
    1447           0 :             ShowFatalError(state,
    1448           0 :                            "Underfloor air distribution thermostat height is above ceiling or below floor in Zone: " +
    1449           0 :                                state.dataHeatBal->Zone(ZoneNum).Name);
    1450             :         }
    1451             :     }
    1452             : 
    1453             :     // Temperature gradients
    1454        3516 :     if ((HeightUpSubzoneAve - HeightOccupiedSubzoneAve) > 0.1) {
    1455        3516 :         state.dataRoomAirMod->AvgTempGrad(ZoneNum) =
    1456        3516 :             (state.dataRoomAirMod->ZTMX(ZoneNum) - state.dataRoomAirMod->ZTOC(ZoneNum)) / (HeightUpSubzoneAve - HeightOccupiedSubzoneAve);
    1457             :     } else {
    1458           0 :         state.dataRoomAirMod->AvgTempGrad(ZoneNum) = 0.0;
    1459             :     }
    1460             : 
    1461        3516 :     if (MIXFLAG) {
    1462        1797 :         state.dataRoomAirMod->ZoneUFMixedFlag(ZoneNum) = 1;
    1463        1797 :         state.dataRoomAirMod->AirModel(ZoneNum).SimAirModel = false;
    1464             :     } else {
    1465        1719 :         state.dataRoomAirMod->ZoneUFMixedFlag(ZoneNum) = 0;
    1466        1719 :         state.dataRoomAirMod->AirModel(ZoneNum).SimAirModel = true;
    1467             :     }
    1468             : 
    1469        3516 :     if (ZoneEquipConfigNum > 0) {
    1470        3516 :         ZoneNodeNum = state.dataHeatBal->Zone(ZoneNum).SystemZoneNodeNumber;
    1471        3516 :         state.dataLoopNodes->Node(ZoneNodeNum).Temp = state.dataRoomAirMod->ZTMX(ZoneNum);
    1472             :     }
    1473             : 
    1474        3516 :     if (MIXFLAG) {
    1475        1797 :         state.dataRoomAirMod->Phi(ZoneNum) = 1.0;
    1476             :     } else {
    1477        3438 :         state.dataRoomAirMod->Phi(ZoneNum) = (state.dataRoomAirMod->ZTOC(ZoneNum) - (TSupK - DataGlobalConstants::KelvinConv)) /
    1478        1719 :                                              (state.dataRoomAirMod->ZTMX(ZoneNum) - (TSupK - DataGlobalConstants::KelvinConv));
    1479             :     }
    1480             : 
    1481             :     // Mixed for reporting purposes
    1482        3516 :     if ((MIXFLAG) || ((state.dataRoomAirMod->ZTMX(ZoneNum) - state.dataRoomAirMod->ZTOC(ZoneNum)) < TempDiffCritRep)) {
    1483        1797 :         state.dataRoomAirMod->ZoneUFMixedFlagRep(ZoneNum) = 1.0;
    1484        1797 :         state.dataRoomAirMod->HeightTransition(ZoneNum) = 0.0;
    1485        1797 :         state.dataRoomAirMod->AvgTempGrad(ZoneNum) = 0.0;
    1486             :     } else {
    1487        1719 :         state.dataRoomAirMod->ZoneUFMixedFlagRep(ZoneNum) = 0.0;
    1488             :     }
    1489        3516 : }
    1490             : 
    1491       14064 : void CalcUCSDUE(EnergyPlusData &state, int const ZoneNum) // index number for the specified zone
    1492             : {
    1493             : 
    1494             :     // SUBROUTINE INFORMATION:
    1495             :     //       AUTHOR         Fred Buhl
    1496             :     //       DATE WRITTEN   January 2006
    1497             :     //       MODIFIED       Brent Griffith June 2008 for new interpolation and time history
    1498             :     //       RE-ENGINEERED  na
    1499             : 
    1500             :     // PURPOSE OF THIS SUBROUTINE:
    1501             :     // Using the UCSD UFAD exterior zone model, this subroutine calculates the  occupied subzone height,
    1502             :     // surface heat transfer coefficients, the occupied subzone temperature, and the upper subzone temperature.
    1503             : 
    1504             :     // METHODOLOGY EMPLOYED:
    1505             :     // The zone is divided into 2 subzones with a variable transition height.
    1506             : 
    1507             :     // REFERENCES:
    1508             :     // The model is described in the EnergyPlus Engineering Reference in Anna Liu's UCSD PhD thesis.
    1509             : 
    1510             :     // Using/Aliasing
    1511             :     using Psychrometrics::PsyCpAirFnW;
    1512             :     using Psychrometrics::PsyRhoAirFnPbTdbW;
    1513       14064 :     auto &TimeStepSys = state.dataHVACGlobal->TimeStepSys;
    1514             :     using InternalHeatGains::SumInternalConvectionGainsByTypes;
    1515             :     using InternalHeatGains::SumReturnAirConvectionGainsByTypes;
    1516             : 
    1517             :     // Locals
    1518             :     // SUBROUTINE ARGUMENT DEFINITIONS:
    1519             : 
    1520             :     // SUBROUTINE PARAMETER DEFINITIONS:
    1521             :     // na
    1522             : 
    1523             :     // INTERFACE BLOCK SPECIFICATIONS:
    1524             :     // na
    1525             : 
    1526             :     // DERIVED TYPE DEFINITIONS:
    1527             :     // na
    1528             : 
    1529             :     // SUBROUTINE LOCAL VARIABLE DECLARATIONS:
    1530       14064 :     bool MIXFLAG(false);  // if true treat as a mixed zone
    1531             :     Real64 CeilingHeight; // zone ceiling height above floor [m]
    1532             :     int UINum;            // index to underfloor interior zone model data
    1533             :     Real64 GainsFrac;     // fraction of occupied subzone heat gains that remain in the subzone;
    1534             :     // that is, don't go into the plumes
    1535             :     Real64 HeightThermostat;    // height of the thermostat above the floor [m]
    1536             :     Real64 HeightComfort;       // height at which comfort temperature is calculated
    1537             :     Real64 TempDiffCritRep;     // Minimum temperature difference between upper and occupied subzones for reporting
    1538             :     Real64 ConvGainsOccSubzone; // convective heat gains into the lower (occupied) subzone [W]
    1539             :     Real64 ConvGainsUpSubzone;  // convective heat gains into the upper subzone [W]
    1540             :     Real64 ConvGains;           // total zone convective gains (excluding surfaces) [W]
    1541             :     Real64 ConvGainsWindows;    // convective gain from windows [W]
    1542             :     int ZoneEquipConfigNum;     // ZoneEquipConfig index for this UFAD zone
    1543             :     Real64 SumSysMCp;           // Sum of system mass flow rate * specific heat for this zone [W/K]
    1544             :     Real64 SumSysMCpT;          // Sum of system mass flow rate * specific heat * temperature for this zone [W]
    1545             :     Real64 SumSysM;             // Sum of systems mass flow rate [kg/s]
    1546             :     Real64 NodeTemp;            // inlet node temperature [K]
    1547             :     Real64 MassFlowRate;        // system mass flow rate [kg/s]
    1548             :     Real64 CpAir;               // specific heat of air [J/kgK]
    1549             :     int InNodeIndex;            // inlet node index in ZoneEquipConfig
    1550             :     Real64 SumMCp;              // mass flow rate * specific heat for this zone for infiltration, ventilation, mixing [W/K]
    1551             :     Real64 SumMCpT;             // mass flow rate * specific heat* temp for this zone for infiltration, ventilation, mixing [W]
    1552             :     Real64 MCp_Total;           // total mass flow rate * specific heat for this zone [W/K]
    1553             :     Real64 MCpT_Total;          // total mass flow rate * specific heat* temp for this zone [W]
    1554             :     Real64 NumberOfPlumes;
    1555             :     Real64 PowerInPlumes;         // [W]
    1556       14064 :     Real64 PowerPerPlume(0.0);    // power carried by each plume [W]
    1557             :     Real64 PowerInPlumesPerMeter; // Power in Plumes per meter of window length [W/m]
    1558       14064 :     Real64 NumDiffusersPerPlume(0.0);
    1559             :     Real64 HeightFrac; // Fractional height of transition between occupied and upper subzones
    1560             :     Real64 TotSysFlow; // [m3/s]
    1561             :     Real64 NumDiffusers;
    1562             :     Real64 TSupK; // supply yemperature [K]
    1563             :     Real64 Gamma; // dimensionless height parameter; higher gamma means interface height will be
    1564             :     // higher, smaller gamma means interface height will be lower.
    1565             :     Real64 DiffArea;     // diffuser effective area [m2]
    1566             :     Real64 ThrowAngle;   // diffuser slot angle relative to vertical [radians]
    1567             :     Real64 SourceHeight; // height of plume sources above the floor [m]
    1568             :     int Ctd;
    1569             :     Real64 AirCap;
    1570             :     Real64 TempHistTerm;
    1571             :     Real64 ZTAveraged;
    1572             :     Real64 HeightUpSubzoneAve;       // Height of center of upper air subzone
    1573             :     Real64 HeightOccupiedSubzoneAve; // Height of center of occupied air subzone
    1574             :     Real64 ZoneMult;                 // total zone multiplier
    1575             :     int ZoneNodeNum;                 // node number of the HVAC zone node
    1576       14064 :     Real64 TempDepCoef(0.0);         // Formerly CoefSumha, coef in zone temp equation with dimensions of h*A
    1577       14064 :     Real64 TempIndCoef(0.0);         // Formerly CoefSumhat, coef in zone temp equation with dimensions of h*A(T1
    1578             :     static constexpr std::array<DataHeatBalance::IntGainType, 30> IntGainTypesOccupied = {
    1579             :         DataHeatBalance::IntGainType::People,
    1580             :         DataHeatBalance::IntGainType::WaterHeaterMixed,
    1581             :         DataHeatBalance::IntGainType::WaterHeaterStratified,
    1582             :         DataHeatBalance::IntGainType::ThermalStorageChilledWaterMixed,
    1583             :         DataHeatBalance::IntGainType::ThermalStorageChilledWaterStratified,
    1584             :         DataHeatBalance::IntGainType::ElectricEquipment,
    1585             :         DataHeatBalance::IntGainType::ElectricEquipmentITEAirCooled,
    1586             :         DataHeatBalance::IntGainType::GasEquipment,
    1587             :         DataHeatBalance::IntGainType::HotWaterEquipment,
    1588             :         DataHeatBalance::IntGainType::SteamEquipment,
    1589             :         DataHeatBalance::IntGainType::OtherEquipment,
    1590             :         DataHeatBalance::IntGainType::ZoneBaseboardOutdoorTemperatureControlled,
    1591             :         DataHeatBalance::IntGainType::GeneratorFuelCell,
    1592             :         DataHeatBalance::IntGainType::WaterUseEquipment,
    1593             :         DataHeatBalance::IntGainType::GeneratorMicroCHP,
    1594             :         DataHeatBalance::IntGainType::ElectricLoadCenterTransformer,
    1595             :         DataHeatBalance::IntGainType::ElectricLoadCenterInverterSimple,
    1596             :         DataHeatBalance::IntGainType::ElectricLoadCenterInverterFunctionOfPower,
    1597             :         DataHeatBalance::IntGainType::ElectricLoadCenterInverterLookUpTable,
    1598             :         DataHeatBalance::IntGainType::ElectricLoadCenterStorageBattery,
    1599             :         DataHeatBalance::IntGainType::ElectricLoadCenterStorageLiIonNmcBattery,
    1600             :         DataHeatBalance::IntGainType::ElectricLoadCenterStorageSimple,
    1601             :         DataHeatBalance::IntGainType::PipeIndoor,
    1602             :         DataHeatBalance::IntGainType::RefrigerationCase,
    1603             :         DataHeatBalance::IntGainType::RefrigerationCompressorRack,
    1604             :         DataHeatBalance::IntGainType::RefrigerationSystemAirCooledCondenser,
    1605             :         DataHeatBalance::IntGainType::RefrigerationSystemSuctionPipe,
    1606             :         DataHeatBalance::IntGainType::RefrigerationSecondaryReceiver,
    1607             :         DataHeatBalance::IntGainType::RefrigerationSecondaryPipe,
    1608             :         DataHeatBalance::IntGainType::RefrigerationWalkIn};
    1609             : 
    1610             :     static constexpr std::array<DataHeatBalance::IntGainType, 2> IntGainTypesUpSubzone = {DataHeatBalance::IntGainType::DaylightingDeviceTubular,
    1611             :                                                                                           DataHeatBalance::IntGainType::Lights};
    1612             :     Real64 RetAirGains;
    1613             : 
    1614             :     // Exact solution or Euler method
    1615       14064 :     if (state.dataHeatBal->ZoneAirSolutionAlgo != DataHeatBalance::SolutionAlgo::ThirdOrder) {
    1616           0 :         if (state.dataHVACGlobal->ShortenTimeStepSysRoomAir && TimeStepSys < state.dataGlobal->TimeStepZone) {
    1617           0 :             if (state.dataHVACGlobal->PreviousTimeStep < state.dataGlobal->TimeStepZone) {
    1618           0 :                 state.dataRoomAirMod->Zone1OC(ZoneNum) = state.dataRoomAirMod->ZoneM2OC(ZoneNum);
    1619           0 :                 state.dataRoomAirMod->Zone1MX(ZoneNum) = state.dataRoomAirMod->ZoneM2MX(ZoneNum);
    1620             :             } else {
    1621           0 :                 state.dataRoomAirMod->Zone1OC(ZoneNum) = state.dataRoomAirMod->ZoneMXOC(ZoneNum);
    1622           0 :                 state.dataRoomAirMod->Zone1MX(ZoneNum) = state.dataRoomAirMod->ZoneMXMX(ZoneNum);
    1623             :             }
    1624             :         } else {
    1625           0 :             state.dataRoomAirMod->Zone1OC(ZoneNum) = state.dataRoomAirMod->ZTOC(ZoneNum);
    1626           0 :             state.dataRoomAirMod->Zone1MX(ZoneNum) = state.dataRoomAirMod->ZTMX(ZoneNum);
    1627             :         }
    1628             :     }
    1629             : 
    1630       14064 :     auto &thisZoneHB = state.dataZoneTempPredictorCorrector->zoneHeatBalance(ZoneNum);
    1631       14064 :     HeightFrac = 0.0;
    1632       14064 :     MIXFLAG = false;
    1633       14064 :     state.dataRoomAirMod->UFHcIn = state.dataHeatBalSurf->SurfHConvInt;
    1634       14064 :     SumSysMCp = 0.0;
    1635       14064 :     SumSysMCpT = 0.0;
    1636       14064 :     TotSysFlow = 0.0;
    1637       14064 :     TSupK = 0.0;
    1638       14064 :     SumSysM = 0.0;
    1639       14064 :     PowerInPlumes = 0.0;
    1640       14064 :     ConvGainsWindows = 0.0;
    1641       14064 :     Gamma = 0.0;
    1642       14064 :     ZoneMult = state.dataHeatBal->Zone(ZoneNum).Multiplier * state.dataHeatBal->Zone(ZoneNum).ListMultiplier;
    1643       14064 :     CeilingHeight = state.dataRoomAirMod->ZoneCeilingHeight((ZoneNum - 1) * 2 + 2) - state.dataRoomAirMod->ZoneCeilingHeight((ZoneNum - 1) * 2 + 1);
    1644       14064 :     UINum = state.dataRoomAirMod->ZoneUFPtr(ZoneNum);
    1645       14064 :     HeightThermostat = state.dataRoomAirMod->ZoneUCSDUE(UINum).ThermostatHeight;
    1646       14064 :     HeightComfort = state.dataRoomAirMod->ZoneUCSDUE(UINum).ComfortHeight;
    1647       14064 :     TempDiffCritRep = state.dataRoomAirMod->ZoneUCSDUE(UINum).TempTrigger;
    1648       14064 :     DiffArea = state.dataRoomAirMod->ZoneUCSDUE(UINum).DiffArea;
    1649       14064 :     ThrowAngle = DataGlobalConstants::DegToRadians * state.dataRoomAirMod->ZoneUCSDUE(UINum).DiffAngle;
    1650       14064 :     SourceHeight = state.dataRoomAirMod->ZoneUCSDUE(UINum).HeatSrcHeight;
    1651       14064 :     NumDiffusers = state.dataRoomAirMod->ZoneUCSDUE(UINum).DiffusersPerZone;
    1652       14064 :     PowerPerPlume = state.dataRoomAirMod->ZoneUCSDUE(UINum).PowerPerPlume;
    1653             :     // gains from occupants, task lighting, elec equip, gas equip, other equip, hot water equip, steam equip,
    1654             :     // baseboards (nonthermostatic), water heater skin loss
    1655       14064 :     ConvGainsOccSubzone = SumInternalConvectionGainsByTypes(state, ZoneNum, IntGainTypesOccupied);
    1656             : 
    1657             :     // Add heat to return air if zonal system (no return air) or cycling system (return air frequently very
    1658             :     // low or zero)
    1659       14064 :     if (state.dataHeatBal->Zone(ZoneNum).NoHeatToReturnAir) {
    1660           0 :         RetAirGains = SumReturnAirConvectionGainsByTypes(state, ZoneNum, IntGainTypesOccupied);
    1661           0 :         ConvGainsOccSubzone += RetAirGains;
    1662             :     }
    1663             : 
    1664             :     // Add convection from pool cover to occupied region
    1665       14064 :     ConvGainsOccSubzone += state.dataHeatBalFanSys->SumConvPool(ZoneNum);
    1666             : 
    1667             :     // gains from lights (ceiling), tubular daylighting devices, high temp radiant heaters
    1668       14064 :     ConvGainsUpSubzone = SumInternalConvectionGainsByTypes(state, ZoneNum, IntGainTypesUpSubzone);
    1669       14064 :     ConvGainsUpSubzone += state.dataHeatBalFanSys->SumConvHTRadSys(ZoneNum);
    1670       14064 :     if (state.dataHeatBal->Zone(ZoneNum).NoHeatToReturnAir) {
    1671           0 :         RetAirGains = SumReturnAirConvectionGainsByTypes(state, ZoneNum, IntGainTypesUpSubzone);
    1672           0 :         ConvGainsUpSubzone += RetAirGains;
    1673             :     }
    1674       14064 :     ConvGains = ConvGainsOccSubzone + ConvGainsUpSubzone + thisZoneHB.SysDepZoneLoadsLagged;
    1675       14064 :     ZoneEquipConfigNum = state.dataRoomAirMod->ZoneUCSDUE(UINum).ZoneEquipPtr;
    1676       14064 :     if (ZoneEquipConfigNum > 0) {
    1677       28128 :         for (InNodeIndex = 1; InNodeIndex <= state.dataZoneEquip->ZoneEquipConfig(ZoneEquipConfigNum).NumInletNodes; ++InNodeIndex) {
    1678       14064 :             NodeTemp = state.dataLoopNodes->Node(state.dataZoneEquip->ZoneEquipConfig(ZoneEquipConfigNum).InletNode(InNodeIndex)).Temp;
    1679       14064 :             MassFlowRate = state.dataLoopNodes->Node(state.dataZoneEquip->ZoneEquipConfig(ZoneEquipConfigNum).InletNode(InNodeIndex)).MassFlowRate;
    1680       14064 :             CpAir = PsyCpAirFnW(thisZoneHB.ZoneAirHumRat);
    1681       14064 :             SumSysMCp += MassFlowRate * CpAir;
    1682       14064 :             SumSysMCpT += MassFlowRate * CpAir * NodeTemp;
    1683       14064 :             TotSysFlow += MassFlowRate / PsyRhoAirFnPbTdbW(state, state.dataEnvrn->OutBaroPress, NodeTemp, thisZoneHB.ZoneAirHumRat);
    1684       14064 :             TSupK += MassFlowRate * NodeTemp;
    1685       14064 :             SumSysM += MassFlowRate;
    1686             :         }
    1687       14064 :         if (TotSysFlow > 0.0) {
    1688       12856 :             TSupK = TSupK / SumSysM + DataGlobalConstants::KelvinConv;
    1689             :         } else {
    1690        1208 :             TSupK = 0.0;
    1691             :         }
    1692             :     }
    1693             :     // mass flow times specific heat for infiltration, ventilation, mixing
    1694       14064 :     SumMCp = thisZoneHB.MCPI + thisZoneHB.MCPV + thisZoneHB.MCPM + thisZoneHB.MDotCPOA;
    1695             :     // mass flow times specific heat times temperature for infiltration, ventilation, mixing
    1696       14064 :     SumMCpT = thisZoneHB.MCPTI + thisZoneHB.MCPTV + thisZoneHB.MCPTM + thisZoneHB.MDotCPOA * state.dataHeatBal->Zone(ZoneNum).OutDryBulbTemp;
    1697             : 
    1698       14064 :     MCp_Total = SumMCp + SumSysMCp;
    1699       14064 :     MCpT_Total = SumMCpT + SumSysMCpT;
    1700             : 
    1701             :     // For the York MIT diffusers (variable area) the area varies with the flow rate. Assume 400 ft/min velocity
    1702             :     // at the diffuser, and a design flow rate of 150 cfm (.0708 m3/s). Then the design area for each diffuser is
    1703             :     // 150 ft3/min / 400 ft/min = .375 ft2 = .035 m2. This is adjusted each time step by
    1704             :     //               (TotSysFlow/(NumDiffusers*.0708))*.035
    1705       14064 :     if (state.dataRoomAirMod->ZoneUCSDUE(UINum).DiffuserType == Diffuser::VarArea) {
    1706           0 :         DiffArea = 0.035 * TotSysFlow / (0.0708 * NumDiffusers);
    1707             :     }
    1708             :     // initial estimate of convective transfer from surfaces; assume HeightFrac is 0.5.
    1709       14064 :     HcUCSDUF(state, ZoneNum, 0.5);
    1710       42192 :     ConvGainsWindows = state.dataUFADManager->HAT_MXWin + state.dataUFADManager->HAT_OCWin -
    1711       14064 :                        state.dataUFADManager->HA_MXWin * state.dataRoomAirMod->ZTMX(ZoneNum) -
    1712       14064 :                        state.dataUFADManager->HA_OCWin * state.dataRoomAirMod->ZTOC(ZoneNum);
    1713       42192 :     PowerInPlumes = ConvGains + state.dataUFADManager->HAT_OC - state.dataUFADManager->HA_OC * state.dataRoomAirMod->ZTOC(ZoneNum) +
    1714       28128 :                     state.dataUFADManager->HAT_MX - state.dataUFADManager->HA_MX * state.dataRoomAirMod->ZTMX(ZoneNum);
    1715             :     // NumberOfPlumes = PowerInPlumes / PowerPerPlume
    1716       14064 :     if (PowerPerPlume > 0.0 && PowerInPlumes > 0.0) {
    1717        7571 :         NumberOfPlumes = PowerInPlumes / PowerPerPlume;
    1718        7571 :         NumDiffusersPerPlume = NumDiffusers / NumberOfPlumes;
    1719             :     } else {
    1720        6493 :         NumberOfPlumes = 1.0;
    1721        6493 :         NumDiffusersPerPlume = 1.0;
    1722             :     }
    1723       14064 :     if ((PowerInPlumes <= 0.0) || (TotSysFlow == 0.0) || (TSupK - DataGlobalConstants::KelvinConv) > thisZoneHB.MAT) {
    1724             :         // The system will mix
    1725        7038 :         HeightFrac = 0.0;
    1726             :     } else {
    1727        7026 :         if (PowerInPlumes > 0.0) {
    1728        7026 :             if (state.dataRoomAirMod->ZoneUCSDUE(UINum).WinWidth > 0.0) { // exterior zone formula
    1729        7026 :                 PowerInPlumesPerMeter = PowerInPlumes / state.dataRoomAirMod->ZoneUCSDUE(UINum).WinWidth;
    1730        7026 :                 Gamma = (TotSysFlow * std::cos(ThrowAngle)) / (NumDiffusers * DiffArea * std::pow(0.0281 * 0.001 * PowerInPlumesPerMeter, 0.333333));
    1731             :             } else { // interior zone formula
    1732           0 :                 Gamma = std::pow(TotSysFlow * std::cos(ThrowAngle), 1.5) /
    1733           0 :                         (NumberOfPlumes * std::pow(NumDiffusersPerPlume * DiffArea, 1.25) * std::sqrt(0.0281 * 0.001 * PowerInPlumes));
    1734             :             }
    1735             :         } else {
    1736           0 :             Gamma = 1000.0;
    1737             :         }
    1738        7026 :         if (state.dataRoomAirMod->ZoneUCSDUE(UINum).CalcTransHeight) {
    1739           0 :             if (state.dataRoomAirMod->ZoneUCSDUE(UINum).WinWidth > 0.0) { // use exterior zone formula
    1740           0 :                 HeightFrac = (std::sqrt(DiffArea) * (11.03 * std::log(Gamma) - 10.73) + 0.5 * SourceHeight) / CeilingHeight;
    1741             :             } else { // use interior zone formula
    1742           0 :                 HeightFrac = (std::sqrt(NumDiffusersPerPlume * DiffArea) * (7.43 * std::log(Gamma) - 1.35) + 0.5 * SourceHeight) / CeilingHeight;
    1743             :             }
    1744             :         } else {
    1745        7026 :             HeightFrac = state.dataRoomAirMod->ZoneUCSDUE(UINum).TransHeight / CeilingHeight;
    1746             :         }
    1747        7026 :         HeightFrac = max(0.0, min(1.0, HeightFrac));
    1748       21078 :         GainsFrac = state.dataRoomAirMod->ZoneUCSDUE(UINum).A_Kc * std::pow(Gamma, state.dataRoomAirMod->ZoneUCSDUE(UINum).B_Kc) +
    1749       14052 :                     state.dataRoomAirMod->ZoneUCSDUE(UINum).C_Kc + state.dataRoomAirMod->ZoneUCSDUE(UINum).D_Kc * Gamma +
    1750        7026 :                     state.dataRoomAirMod->ZoneUCSDUE(UINum).E_Kc * pow_2(Gamma);
    1751        7026 :         GainsFrac = max(0.7, min(GainsFrac, 1.0));
    1752        7026 :         if (state.dataRoomAirMod->ZoneUCSDUE(UINum).ShadeDown) {
    1753           0 :             GainsFrac -= 0.2;
    1754             :         }
    1755        7026 :         state.dataRoomAirMod->ZoneUFPowInPlumes(ZoneNum) = PowerInPlumes;
    1756       34866 :         for (Ctd = 1; Ctd <= 4; ++Ctd) {
    1757       27928 :             HcUCSDUF(state, ZoneNum, HeightFrac);
    1758       83784 :             ConvGainsWindows = state.dataUFADManager->HAT_MXWin + state.dataUFADManager->HAT_OCWin -
    1759       27928 :                                state.dataUFADManager->HA_MXWin * state.dataRoomAirMod->ZTMX(ZoneNum) -
    1760       27928 :                                state.dataUFADManager->HA_OCWin * state.dataRoomAirMod->ZTOC(ZoneNum);
    1761       27928 :             ConvGainsWindows = max(ConvGainsWindows, 0.0);
    1762       83784 :             PowerInPlumes = ConvGains + state.dataUFADManager->HAT_OC - state.dataUFADManager->HA_OC * state.dataRoomAirMod->ZTOC(ZoneNum) +
    1763       55856 :                             state.dataUFADManager->HAT_MX - state.dataUFADManager->HA_MX * state.dataRoomAirMod->ZTMX(ZoneNum);
    1764             :             // NumberOfPlumes = PowerInPlumes / PowerPerPlume
    1765       27928 :             NumberOfPlumes = 1.0;
    1766       27928 :             if (PowerInPlumes <= 0.0) break;
    1767       27840 :             if (state.dataRoomAirMod->ZoneUCSDUE(UINum).WinWidth > 0.0) { // use exterior zone formula
    1768       27840 :                 PowerInPlumesPerMeter = PowerInPlumes / state.dataRoomAirMod->ZoneUCSDUE(UINum).WinWidth;
    1769       27840 :                 Gamma = (TotSysFlow * std::cos(ThrowAngle)) / (NumDiffusers * DiffArea * std::pow(0.0281 * 0.001 * PowerInPlumesPerMeter, 0.333333));
    1770             :             } else { // use interior zone formula
    1771           0 :                 Gamma = std::pow(TotSysFlow * std::cos(ThrowAngle), 1.5) /
    1772           0 :                         (NumberOfPlumes * std::pow(NumDiffusersPerPlume * DiffArea, 1.25) * std::sqrt(0.0281 * 0.001 * PowerInPlumes));
    1773             :             }
    1774       27840 :             if (state.dataRoomAirMod->ZoneUCSDUE(UINum).CalcTransHeight) {
    1775           0 :                 if (state.dataRoomAirMod->ZoneUCSDUE(UINum).WinWidth > 0.0) { // exterior zone formula
    1776           0 :                     HeightFrac = (std::sqrt(DiffArea) * (11.03 * std::log(Gamma) - 10.73) + 0.5 * SourceHeight) / CeilingHeight;
    1777             :                 } else { // interior zone formula
    1778           0 :                     HeightFrac = (std::sqrt(NumDiffusersPerPlume * DiffArea) * (7.43 * std::log(Gamma) - 1.35) + 0.5 * SourceHeight) / CeilingHeight;
    1779             :                 }
    1780             :             } else {
    1781       27840 :                 HeightFrac = state.dataRoomAirMod->ZoneUCSDUE(UINum).TransHeight / CeilingHeight;
    1782             :             }
    1783       27840 :             HeightFrac = min(1.0, HeightFrac);
    1784       27840 :             state.dataRoomAirMod->HeightTransition(ZoneNum) = HeightFrac * CeilingHeight;
    1785       83520 :             GainsFrac = state.dataRoomAirMod->ZoneUCSDUE(UINum).A_Kc * std::pow(Gamma, state.dataRoomAirMod->ZoneUCSDUE(UINum).B_Kc) +
    1786       55680 :                         state.dataRoomAirMod->ZoneUCSDUE(UINum).C_Kc + state.dataRoomAirMod->ZoneUCSDUE(UINum).D_Kc * Gamma +
    1787       27840 :                         state.dataRoomAirMod->ZoneUCSDUE(UINum).E_Kc * pow_2(Gamma);
    1788       27840 :             GainsFrac = max(0.7, min(GainsFrac, 1.0));
    1789       27840 :             if (state.dataRoomAirMod->ZoneUCSDUE(UINum).ShadeDown) {
    1790           0 :                 GainsFrac -= 0.2;
    1791             :             }
    1792       27840 :             state.dataRoomAirMod->AIRRATOC(ZoneNum) =
    1793       55680 :                 state.dataHeatBal->Zone(ZoneNum).Volume *
    1794       83520 :                 (state.dataRoomAirMod->HeightTransition(ZoneNum) - min(state.dataRoomAirMod->HeightTransition(ZoneNum), 0.2)) / CeilingHeight *
    1795       55680 :                 state.dataHeatBal->Zone(ZoneNum).ZoneVolCapMultpSens *
    1796       83520 :                 PsyRhoAirFnPbTdbW(state, state.dataEnvrn->OutBaroPress, state.dataRoomAirMod->MATOC(ZoneNum), thisZoneHB.ZoneAirHumRat) *
    1797       55680 :                 PsyCpAirFnW(thisZoneHB.ZoneAirHumRat) / (TimeStepSys * DataGlobalConstants::SecInHour);
    1798       27840 :             state.dataRoomAirMod->AIRRATMX(ZoneNum) =
    1799       55680 :                 state.dataHeatBal->Zone(ZoneNum).Volume * (CeilingHeight - state.dataRoomAirMod->HeightTransition(ZoneNum)) / CeilingHeight *
    1800       55680 :                 state.dataHeatBal->Zone(ZoneNum).ZoneVolCapMultpSens *
    1801       83520 :                 PsyRhoAirFnPbTdbW(state, state.dataEnvrn->OutBaroPress, state.dataRoomAirMod->MATMX(ZoneNum), thisZoneHB.ZoneAirHumRat) *
    1802       55680 :                 PsyCpAirFnW(thisZoneHB.ZoneAirHumRat) / (TimeStepSys * DataGlobalConstants::SecInHour);
    1803             : 
    1804       27840 :             if (state.dataHVACGlobal->UseZoneTimeStepHistory) {
    1805       17692 :                 state.dataRoomAirMod->ZTM3OC(ZoneNum) = state.dataRoomAirMod->XM3TOC(ZoneNum);
    1806       17692 :                 state.dataRoomAirMod->ZTM2OC(ZoneNum) = state.dataRoomAirMod->XM2TOC(ZoneNum);
    1807       17692 :                 state.dataRoomAirMod->ZTM1OC(ZoneNum) = state.dataRoomAirMod->XMATOC(ZoneNum);
    1808             : 
    1809       17692 :                 state.dataRoomAirMod->ZTM3MX(ZoneNum) = state.dataRoomAirMod->XM3TMX(ZoneNum);
    1810       17692 :                 state.dataRoomAirMod->ZTM2MX(ZoneNum) = state.dataRoomAirMod->XM2TMX(ZoneNum);
    1811       17692 :                 state.dataRoomAirMod->ZTM1MX(ZoneNum) = state.dataRoomAirMod->XMATMX(ZoneNum);
    1812             : 
    1813             :             } else {
    1814       10148 :                 state.dataRoomAirMod->ZTM3OC(ZoneNum) = state.dataRoomAirMod->DSXM3TOC(ZoneNum);
    1815       10148 :                 state.dataRoomAirMod->ZTM2OC(ZoneNum) = state.dataRoomAirMod->DSXM2TOC(ZoneNum);
    1816       10148 :                 state.dataRoomAirMod->ZTM1OC(ZoneNum) = state.dataRoomAirMod->DSXMATOC(ZoneNum);
    1817             : 
    1818       10148 :                 state.dataRoomAirMod->ZTM3MX(ZoneNum) = state.dataRoomAirMod->DSXM3TMX(ZoneNum);
    1819       10148 :                 state.dataRoomAirMod->ZTM2MX(ZoneNum) = state.dataRoomAirMod->DSXM2TMX(ZoneNum);
    1820       10148 :                 state.dataRoomAirMod->ZTM1MX(ZoneNum) = state.dataRoomAirMod->DSXMATMX(ZoneNum);
    1821             :             }
    1822             : 
    1823       27840 :             AirCap = state.dataRoomAirMod->AIRRATOC(ZoneNum);
    1824       55680 :             TempHistTerm = AirCap * (3.0 * state.dataRoomAirMod->ZTM1OC(ZoneNum) - (3.0 / 2.0) * state.dataRoomAirMod->ZTM2OC(ZoneNum) +
    1825       27840 :                                      (1.0 / 3.0) * state.dataRoomAirMod->ZTM3OC(ZoneNum));
    1826       27840 :             TempDepCoef = GainsFrac * state.dataUFADManager->HA_OC + MCp_Total;
    1827       83520 :             TempIndCoef = GainsFrac * (ConvGains + state.dataUFADManager->HAT_OC + state.dataUFADManager->HAT_MX -
    1828       55680 :                                        state.dataUFADManager->HA_MX * state.dataRoomAirMod->ZTMX(ZoneNum)) +
    1829       27840 :                           MCpT_Total + thisZoneHB.NonAirSystemResponse / ZoneMult;
    1830       27840 :             switch (state.dataHeatBal->ZoneAirSolutionAlgo) {
    1831       27840 :             case DataHeatBalance::SolutionAlgo::ThirdOrder: {
    1832       55680 :                 state.dataRoomAirMod->ZTOC(ZoneNum) = (TempHistTerm +
    1833       55680 :                                                        GainsFrac * (ConvGains + state.dataUFADManager->HAT_OC + state.dataUFADManager->HAT_MX -
    1834       55680 :                                                                     state.dataUFADManager->HA_MX * state.dataRoomAirMod->ZTMX(ZoneNum)) +
    1835       55680 :                                                        MCpT_Total + thisZoneHB.NonAirSystemResponse / ZoneMult) /
    1836       27840 :                                                       ((11.0 / 6.0) * AirCap + GainsFrac * state.dataUFADManager->HA_OC + MCp_Total);
    1837       27840 :             } break;
    1838           0 :             case DataHeatBalance::SolutionAlgo::AnalyticalSolution: {
    1839           0 :                 if (TempDepCoef == 0.0) { // B=0
    1840           0 :                     state.dataRoomAirMod->ZTOC(ZoneNum) = state.dataRoomAirMod->Zone1OC(ZoneNum) + TempIndCoef / AirCap;
    1841             :                 } else {
    1842           0 :                     state.dataRoomAirMod->ZTOC(ZoneNum) =
    1843           0 :                         (state.dataRoomAirMod->Zone1OC(ZoneNum) - TempIndCoef / TempDepCoef) * std::exp(min(700.0, -TempDepCoef / AirCap)) +
    1844           0 :                         TempIndCoef / TempDepCoef;
    1845             :                 }
    1846           0 :             } break;
    1847           0 :             case DataHeatBalance::SolutionAlgo::EulerMethod: {
    1848           0 :                 state.dataRoomAirMod->ZTOC(ZoneNum) = (AirCap * state.dataRoomAirMod->Zone1OC(ZoneNum) + TempIndCoef) / (AirCap + TempDepCoef);
    1849           0 :             } break;
    1850           0 :             default:
    1851           0 :                 break;
    1852             :             }
    1853       27840 :             AirCap = state.dataRoomAirMod->AIRRATMX(ZoneNum);
    1854       55680 :             TempHistTerm = AirCap * (3.0 * state.dataRoomAirMod->ZTM1MX(ZoneNum) - (3.0 / 2.0) * state.dataRoomAirMod->ZTM2MX(ZoneNum) +
    1855       27840 :                                      (1.0 / 3.0) * state.dataRoomAirMod->ZTM3MX(ZoneNum));
    1856       27840 :             TempDepCoef = (1.0 - GainsFrac) * state.dataUFADManager->HA_MX + MCp_Total;
    1857       83520 :             TempIndCoef = (1.0 - GainsFrac) * (ConvGains + state.dataUFADManager->HAT_OC + state.dataUFADManager->HAT_MX -
    1858       27840 :                                                state.dataUFADManager->HA_OC * state.dataRoomAirMod->ZTOC(ZoneNum)) +
    1859       27840 :                           state.dataRoomAirMod->ZTOC(ZoneNum) * MCp_Total;
    1860       27840 :             switch (state.dataHeatBal->ZoneAirSolutionAlgo) {
    1861       27840 :             case DataHeatBalance::SolutionAlgo::ThirdOrder: {
    1862       27840 :                 state.dataRoomAirMod->ZTMX(ZoneNum) =
    1863       27840 :                     (TempHistTerm +
    1864       55680 :                      (1.0 - GainsFrac) * (ConvGains + state.dataUFADManager->HAT_OC + state.dataUFADManager->HAT_MX -
    1865       55680 :                                           state.dataUFADManager->HA_OC * state.dataRoomAirMod->ZTOC(ZoneNum)) +
    1866       55680 :                      state.dataRoomAirMod->ZTOC(ZoneNum) * MCp_Total) /
    1867       27840 :                     ((11.0 / 6.0) * AirCap + (1.0 - GainsFrac) * state.dataUFADManager->HA_MX + MCp_Total);
    1868       27840 :             } break;
    1869           0 :             case DataHeatBalance::SolutionAlgo::AnalyticalSolution: {
    1870           0 :                 if (TempDepCoef == 0.0) { // B=0
    1871           0 :                     state.dataRoomAirMod->ZTMX(ZoneNum) = state.dataRoomAirMod->Zone1MX(ZoneNum) + TempIndCoef / AirCap;
    1872             :                 } else {
    1873           0 :                     state.dataRoomAirMod->ZTMX(ZoneNum) =
    1874           0 :                         (state.dataRoomAirMod->Zone1MX(ZoneNum) - TempIndCoef / TempDepCoef) * std::exp(min(700.0, -TempDepCoef / AirCap)) +
    1875           0 :                         TempIndCoef / TempDepCoef;
    1876             :                 }
    1877           0 :             } break;
    1878           0 :             case DataHeatBalance::SolutionAlgo::EulerMethod: {
    1879           0 :                 state.dataRoomAirMod->ZTMX(ZoneNum) = (AirCap * state.dataRoomAirMod->Zone1MX(ZoneNum) + TempIndCoef) / (AirCap + TempDepCoef);
    1880           0 :             } break;
    1881           0 :             default:
    1882           0 :                 break;
    1883             :             }
    1884       27840 :             state.dataRoomAirMod->ZTFloor(ZoneNum) = state.dataRoomAirMod->ZTOC(ZoneNum);
    1885             :         }
    1886        7026 :         if (PowerInPlumes <= 0.0) {
    1887          88 :             HeightFrac = 0.0;
    1888          88 :             state.dataRoomAirMod->AirModel(ZoneNum).SimAirModel = false;
    1889          88 :             state.dataRoomAirMod->ZoneUFGamma(ZoneNum) = 0.0;
    1890          88 :             state.dataRoomAirMod->ZoneUFPowInPlumes(ZoneNum) = 0.0;
    1891          88 :             state.dataRoomAirMod->ZoneUFPowInPlumesfromWindows(ZoneNum) = 0.0;
    1892             :         } else {
    1893        6938 :             state.dataRoomAirMod->AirModel(ZoneNum).SimAirModel = true;
    1894        6938 :             state.dataRoomAirMod->ZoneUFGamma(ZoneNum) = Gamma;
    1895        6938 :             state.dataRoomAirMod->ZoneUFPowInPlumes(ZoneNum) = PowerInPlumes;
    1896        6938 :             state.dataRoomAirMod->ZoneUFPowInPlumesfromWindows(ZoneNum) = ConvGainsWindows;
    1897             :         }
    1898             :     }
    1899             : 
    1900             :     //=============================== M I X E D  Calculation ==============================================
    1901       26854 :     if (state.dataRoomAirMod->ZTMX(ZoneNum) < state.dataRoomAirMod->ZTOC(ZoneNum) || MCp_Total <= 0.0 ||
    1902       12790 :         HeightFrac * CeilingHeight < state.dataUFADManager->ThickOccupiedSubzoneMin) {
    1903        7245 :         MIXFLAG = true;
    1904        7245 :         HeightFrac = 0.0;
    1905        7245 :         Real64 const thisZoneT1 = thisZoneHB.ZoneT1;
    1906             : 
    1907        7245 :         state.dataRoomAirMod->AvgTempGrad(ZoneNum) = 0.0;
    1908        7245 :         state.dataRoomAirMod->MaxTempGrad(ZoneNum) = 0.0;
    1909        7245 :         state.dataRoomAirMod->AirModel(ZoneNum).SimAirModel = false;
    1910        7245 :         Real64 AirCap = thisZoneHB.AirPowerCap;
    1911        7245 :         TempHistTerm = AirCap * (3.0 * thisZoneHB.ZTM[0] - (3.0 / 2.0) * thisZoneHB.ZTM[1] + (1.0 / 3.0) * thisZoneHB.ZTM[2]);
    1912             : 
    1913       28980 :         for (Ctd = 1; Ctd <= 3; ++Ctd) {
    1914       21735 :             TempDepCoef = state.dataUFADManager->HA_MX + state.dataUFADManager->HA_OC + MCp_Total;
    1915       21735 :             TempIndCoef = ConvGains + state.dataUFADManager->HAT_MX + state.dataUFADManager->HAT_OC + MCpT_Total;
    1916       21735 :             switch (state.dataHeatBal->ZoneAirSolutionAlgo) {
    1917       21735 :             case DataHeatBalance::SolutionAlgo::ThirdOrder: {
    1918       43470 :                 ZTAveraged = (TempHistTerm + ConvGains + state.dataUFADManager->HAT_MX + state.dataUFADManager->HAT_OC + MCpT_Total) /
    1919       21735 :                              ((11.0 / 6.0) * AirCap + state.dataUFADManager->HA_MX + state.dataUFADManager->HA_OC + MCp_Total);
    1920       21735 :             } break;
    1921           0 :             case DataHeatBalance::SolutionAlgo::AnalyticalSolution: {
    1922           0 :                 if (TempDepCoef == 0.0) { // B=0
    1923           0 :                     ZTAveraged = thisZoneT1 + TempIndCoef / AirCap;
    1924             :                 } else {
    1925           0 :                     ZTAveraged = (thisZoneT1 - TempIndCoef / TempDepCoef) * std::exp(min(700.0, -TempDepCoef / AirCap)) + TempIndCoef / TempDepCoef;
    1926             :                 }
    1927           0 :             } break;
    1928           0 :             case DataHeatBalance::SolutionAlgo::EulerMethod: {
    1929           0 :                 ZTAveraged = (AirCap * thisZoneT1 + TempIndCoef) / (AirCap + TempDepCoef);
    1930           0 :             } break;
    1931           0 :             default:
    1932           0 :                 break;
    1933             :             }
    1934       21735 :             state.dataRoomAirMod->ZTOC(ZoneNum) = ZTAveraged;
    1935       21735 :             state.dataRoomAirMod->ZTMX(ZoneNum) = ZTAveraged;
    1936       21735 :             state.dataRoomAirMod->ZTFloor(ZoneNum) = ZTAveraged;
    1937       21735 :             HcUCSDUF(state, ZoneNum, HeightFrac);
    1938       21735 :             TempDepCoef = state.dataUFADManager->HA_MX + state.dataUFADManager->HA_OC + MCp_Total;
    1939       21735 :             TempIndCoef = ConvGains + state.dataUFADManager->HAT_MX + state.dataUFADManager->HAT_OC + MCpT_Total;
    1940       21735 :             switch (state.dataHeatBal->ZoneAirSolutionAlgo) {
    1941       21735 :             case DataHeatBalance::SolutionAlgo::ThirdOrder: {
    1942       43470 :                 ZTAveraged = (TempHistTerm + ConvGains + state.dataUFADManager->HAT_MX + state.dataUFADManager->HAT_OC + MCpT_Total) /
    1943       21735 :                              ((11.0 / 6.0) * AirCap + state.dataUFADManager->HA_MX + state.dataUFADManager->HA_OC + MCp_Total);
    1944       21735 :             } break;
    1945           0 :             case DataHeatBalance::SolutionAlgo::AnalyticalSolution: {
    1946           0 :                 if (TempDepCoef == 0.0) { // B=0
    1947           0 :                     ZTAveraged = thisZoneT1 + TempIndCoef / AirCap;
    1948             :                 } else {
    1949           0 :                     ZTAveraged = (thisZoneT1 - TempIndCoef / TempDepCoef) * std::exp(min(700.0, -TempDepCoef / AirCap)) + TempIndCoef / TempDepCoef;
    1950             :                 }
    1951           0 :             } break;
    1952           0 :             case DataHeatBalance::SolutionAlgo::EulerMethod: {
    1953           0 :                 ZTAveraged = (AirCap * thisZoneT1 + TempIndCoef) / (AirCap + TempDepCoef);
    1954           0 :             } break;
    1955           0 :             default:
    1956           0 :                 break;
    1957             :             }
    1958       21735 :             state.dataRoomAirMod->ZTOC(ZoneNum) = ZTAveraged;
    1959       21735 :             state.dataRoomAirMod->ZTMX(ZoneNum) = ZTAveraged;
    1960       21735 :             state.dataRoomAirMod->ZTFloor(ZoneNum) = ZTAveraged;
    1961             :         }
    1962             :     }
    1963             :     //=========================================================================================
    1964             : 
    1965             :     // Comfort temperature and temperature at the thermostat/temperature control sensor
    1966             : 
    1967       14064 :     HeightUpSubzoneAve = (CeilingHeight + state.dataRoomAirMod->HeightTransition(ZoneNum)) / 2.0;
    1968       14064 :     HeightOccupiedSubzoneAve = state.dataRoomAirMod->HeightTransition(ZoneNum) / 2.0;
    1969             :     // Comfort temperature
    1970             : 
    1971       14064 :     if (MIXFLAG) {
    1972        7245 :         state.dataRoomAirMod->TCMF(ZoneNum) = ZTAveraged;
    1973             :     } else {
    1974        6819 :         if (HeightComfort < HeightOccupiedSubzoneAve) {
    1975           0 :             state.dataRoomAirMod->TCMF(ZoneNum) = state.dataRoomAirMod->ZTOC(ZoneNum);
    1976        6819 :         } else if (HeightComfort >= HeightOccupiedSubzoneAve && HeightComfort < HeightUpSubzoneAve) {
    1977       20457 :             state.dataRoomAirMod->TCMF(ZoneNum) = (state.dataRoomAirMod->ZTOC(ZoneNum) * (HeightUpSubzoneAve - HeightComfort) +
    1978       13638 :                                                    state.dataRoomAirMod->ZTMX(ZoneNum) * (HeightComfort - HeightOccupiedSubzoneAve)) /
    1979        6819 :                                                   (HeightUpSubzoneAve - HeightOccupiedSubzoneAve);
    1980           0 :         } else if (HeightComfort >= HeightUpSubzoneAve && HeightComfort <= CeilingHeight) {
    1981           0 :             state.dataRoomAirMod->TCMF(ZoneNum) = state.dataRoomAirMod->ZTMX(ZoneNum);
    1982             :         } else {
    1983           0 :             ShowFatalError(state, "UFAD comfort height is above ceiling or below floor in Zone: " + state.dataHeatBal->Zone(ZoneNum).Name);
    1984             :         }
    1985             :     }
    1986             : 
    1987             :     // Temperature at the thermostat/temperature control sensor
    1988             : 
    1989       14064 :     if (MIXFLAG) {
    1990        7245 :         state.dataHeatBalFanSys->TempTstatAir(ZoneNum) = ZTAveraged;
    1991             :     } else {
    1992        6819 :         if (HeightThermostat < HeightOccupiedSubzoneAve) {
    1993           0 :             state.dataHeatBalFanSys->TempTstatAir(ZoneNum) = state.dataRoomAirMod->ZTOC(ZoneNum);
    1994        6819 :         } else if (HeightThermostat >= HeightOccupiedSubzoneAve && HeightThermostat < HeightUpSubzoneAve) {
    1995       20457 :             state.dataHeatBalFanSys->TempTstatAir(ZoneNum) = (state.dataRoomAirMod->ZTOC(ZoneNum) * (HeightUpSubzoneAve - HeightThermostat) +
    1996       13638 :                                                               state.dataRoomAirMod->ZTMX(ZoneNum) * (HeightThermostat - HeightOccupiedSubzoneAve)) /
    1997        6819 :                                                              (HeightUpSubzoneAve - HeightOccupiedSubzoneAve);
    1998           0 :         } else if (HeightThermostat >= HeightUpSubzoneAve && HeightThermostat <= CeilingHeight) {
    1999           0 :             state.dataHeatBalFanSys->TempTstatAir(ZoneNum) = state.dataRoomAirMod->ZTMX(ZoneNum);
    2000             :         } else {
    2001           0 :             ShowFatalError(state,
    2002           0 :                            "Underfloor air distribution thermostat height is above ceiling or below floor in Zone: " +
    2003           0 :                                state.dataHeatBal->Zone(ZoneNum).Name);
    2004             :         }
    2005             :     }
    2006             : 
    2007             :     // Temperature gradients
    2008       14064 :     if ((HeightUpSubzoneAve - HeightOccupiedSubzoneAve) > 0.1) {
    2009       14064 :         state.dataRoomAirMod->AvgTempGrad(ZoneNum) =
    2010       14064 :             (state.dataRoomAirMod->ZTMX(ZoneNum) - state.dataRoomAirMod->ZTOC(ZoneNum)) / (HeightUpSubzoneAve - HeightOccupiedSubzoneAve);
    2011             :     } else {
    2012           0 :         state.dataRoomAirMod->AvgTempGrad(ZoneNum) = 0.0;
    2013             :     }
    2014             : 
    2015       14064 :     if (MIXFLAG) {
    2016        7245 :         state.dataRoomAirMod->ZoneUFMixedFlag(ZoneNum) = 1;
    2017        7245 :         state.dataRoomAirMod->AirModel(ZoneNum).SimAirModel = false;
    2018             :     } else {
    2019        6819 :         state.dataRoomAirMod->ZoneUFMixedFlag(ZoneNum) = 0;
    2020        6819 :         state.dataRoomAirMod->AirModel(ZoneNum).SimAirModel = true;
    2021             :     }
    2022             : 
    2023       14064 :     if (ZoneEquipConfigNum > 0) {
    2024       14064 :         ZoneNodeNum = state.dataHeatBal->Zone(ZoneNum).SystemZoneNodeNumber;
    2025       14064 :         state.dataLoopNodes->Node(ZoneNodeNum).Temp = state.dataRoomAirMod->ZTMX(ZoneNum);
    2026             :     }
    2027             : 
    2028       14064 :     if (MIXFLAG) {
    2029        7245 :         state.dataRoomAirMod->Phi(ZoneNum) = 1.0;
    2030             :     } else {
    2031       13638 :         state.dataRoomAirMod->Phi(ZoneNum) = (state.dataRoomAirMod->ZTOC(ZoneNum) - (TSupK - DataGlobalConstants::KelvinConv)) /
    2032        6819 :                                              (state.dataRoomAirMod->ZTMX(ZoneNum) - (TSupK - DataGlobalConstants::KelvinConv));
    2033             :     }
    2034             : 
    2035             :     // Mixed for reporting purposes
    2036       14064 :     if ((MIXFLAG) || ((state.dataRoomAirMod->ZTMX(ZoneNum) - state.dataRoomAirMod->ZTOC(ZoneNum)) < TempDiffCritRep)) {
    2037        7246 :         state.dataRoomAirMod->ZoneUFMixedFlagRep(ZoneNum) = 1.0;
    2038        7246 :         state.dataRoomAirMod->HeightTransition(ZoneNum) = 0.0;
    2039        7246 :         state.dataRoomAirMod->AvgTempGrad(ZoneNum) = 0.0;
    2040             :     } else {
    2041        6818 :         state.dataRoomAirMod->ZoneUFMixedFlagRep(ZoneNum) = 0.0;
    2042             :     }
    2043       14064 : }
    2044             : 
    2045        2313 : } // namespace EnergyPlus::UFADManager

Generated by: LCOV version 1.13