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

Generated by: LCOV version 1.13