LCOV - code coverage report
Current view: top level - EnergyPlus - VariableSpeedCoils.cc (source / functions) Coverage Total Hit
Test: lcov.output.filtered Lines: 65.4 % 4546 2974
Test Date: 2025-06-02 12:03:30 Functions: 84.0 % 25 21

            Line data    Source code
       1              : // EnergyPlus, Copyright (c) 1996-2025, 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              : 
      50              : // ObjexxFCL Headers
      51              : #include <ObjexxFCL/Array.functions.hh>
      52              : 
      53              : // EnergyPlus Headers
      54              : #include <EnergyPlus/Autosizing/Base.hh>
      55              : #include <EnergyPlus/BranchNodeConnections.hh>
      56              : #include <EnergyPlus/CurveManager.hh>
      57              : #include <EnergyPlus/DXCoils.hh>
      58              : #include <EnergyPlus/Data/EnergyPlusData.hh>
      59              : #include <EnergyPlus/DataAirSystems.hh>
      60              : #include <EnergyPlus/DataContaminantBalance.hh>
      61              : #include <EnergyPlus/DataEnvironment.hh>
      62              : #include <EnergyPlus/DataHVACGlobals.hh>
      63              : #include <EnergyPlus/DataHeatBalance.hh>
      64              : #include <EnergyPlus/DataSizing.hh>
      65              : #include <EnergyPlus/DataWater.hh>
      66              : #include <EnergyPlus/EMSManager.hh>
      67              : #include <EnergyPlus/Fans.hh>
      68              : #include <EnergyPlus/FluidProperties.hh>
      69              : #include <EnergyPlus/General.hh>
      70              : #include <EnergyPlus/GeneralRoutines.hh>
      71              : #include <EnergyPlus/GlobalNames.hh>
      72              : #include <EnergyPlus/InputProcessing/InputProcessor.hh>
      73              : #include <EnergyPlus/NodeInputManager.hh>
      74              : #include <EnergyPlus/OutAirNodeManager.hh>
      75              : #include <EnergyPlus/OutputProcessor.hh>
      76              : #include <EnergyPlus/OutputReportPredefined.hh>
      77              : #include <EnergyPlus/PlantUtilities.hh>
      78              : #include <EnergyPlus/Psychrometrics.hh>
      79              : #include <EnergyPlus/ReportCoilSelection.hh>
      80              : #include <EnergyPlus/ScheduleManager.hh>
      81              : #include <EnergyPlus/UnitarySystem.hh>
      82              : #include <EnergyPlus/VariableSpeedCoils.hh>
      83              : #include <EnergyPlus/WaterManager.hh>
      84              : 
      85              : namespace EnergyPlus {
      86              : 
      87              : namespace VariableSpeedCoils {
      88              : 
      89              :     Real64 constexpr RatedInletAirTemp = 26.6667;       // 26.6667C or 80F
      90              :     Real64 constexpr RatedInletWetBulbTemp = 19.4444;   // 19.44 or 67F, cooling mode
      91              :     Real64 constexpr RatedInletAirHumRat = 0.0111847;   // Humidity ratio corresponding to 80F dry bulb/67F wet bulb
      92              :     Real64 constexpr RatedInletWaterTemp = 29.4444;     // 85 F cooling mode
      93              :     Real64 constexpr RatedAmbAirTemp = 35.0;            // 95 F cooling mode
      94              :     Real64 constexpr RatedInletAirTempHeat = 21.1111;   // 21.11C or 70F, heating mode
      95              :     Real64 constexpr RatedInletWaterTempHeat = 21.1111; // 21.11C or 70F, heating mode
      96              :     Real64 constexpr RatedAmbAirTempHeat = 8.3333;      // 8.33 or 47F, heating mode
      97              :     Real64 constexpr RatedAmbAirWBHeat = 6.1111;        // 8.33 or 43F, heating mode, rated wet bulb temperature
      98              :                                                         // Water Systems
      99              :     int constexpr CondensateDiscarded = 1001;           // default mode where water is "lost"
     100              :     int constexpr CondensateToTank = 1002;              // collect coil condensate from air and store in water storage tank
     101              : 
     102              :     int constexpr WaterSupplyFromMains = 101;
     103              :     int constexpr WaterSupplyFromTank = 102;
     104              : 
     105              :     // Defrost strategy (heat pump only)
     106              :     int constexpr ReverseCycle = 1; // uses reverse cycle defrost strategy
     107              :     int constexpr Resistive = 2;    // uses electric resistance heater for defrost
     108              :                                     // Defrost control  (heat pump only)
     109              :     int constexpr Timed = 1;        // defrost cycle is timed
     110              :     int constexpr OnDemand = 2;     // defrost cycle occurs only when required
     111              : 
     112        67677 :     void SimVariableSpeedCoils(EnergyPlusData &state,
     113              :                                std::string_view CompName,             // Coil Name
     114              :                                int &CompIndex,                        // Index for Component name
     115              :                                HVAC::FanOp const fanOp,               // Continuous fan OR cycling compressor
     116              :                                HVAC::CompressorOp const compressorOp, // compressor on/off. 0 = off; 1= on
     117              :                                Real64 const PartLoadFrac,
     118              :                                int const SpeedNum,            // compressor speed number
     119              :                                Real64 const SpeedRatio,       // compressor speed ratio
     120              :                                Real64 const SensLoad,         // Sensible demand load [W]
     121              :                                Real64 const LatentLoad,       // Latent demand load [W]
     122              :                                const Real64 OnOffAirFlowRatio // ratio of comp on to comp off air flow rate
     123              :     )
     124              :     {
     125              : 
     126              :         //       AUTHOR         Bo Shen, ORNL
     127              :         //       DATE WRITTEN   March 2012
     128              :         //       MODIFIED       Bo Shen, 12/2014, add variable-speed HPWH
     129              : 
     130              :         // PURPOSE OF THIS SUBROUTINE:
     131              :         // This subroutine manages variable-speed Water to Air Heat Pump component simulation.
     132              : 
     133              :         // SUBROUTINE LOCAL VARIABLE DECLARATIONS:
     134              :         int DXCoilNum; // The WatertoAirHP that you are currently loading input into
     135              :         int SpeedCal;  // variable for error proof speed input
     136              : 
     137              :         // Obtains and Allocates WatertoAirHP related parameters from input file
     138        67677 :         if (state.dataVariableSpeedCoils->GetCoilsInputFlag) { // First time subroutine has been entered
     139            0 :             GetVarSpeedCoilInput(state);
     140            0 :             state.dataVariableSpeedCoils->GetCoilsInputFlag = false;
     141              :         }
     142              : 
     143        67677 :         if (CompIndex == 0) {
     144            3 :             DXCoilNum = Util::FindItemInList(CompName, state.dataVariableSpeedCoils->VarSpeedCoil);
     145            3 :             if (DXCoilNum == 0) {
     146            0 :                 ShowFatalError(state, format("WaterToAirHPVSWEquationFit not found={}", CompName));
     147              :             }
     148            3 :             CompIndex = DXCoilNum;
     149              :         } else {
     150        67674 :             DXCoilNum = CompIndex;
     151        67674 :             if (DXCoilNum > state.dataVariableSpeedCoils->NumVarSpeedCoils || DXCoilNum < 1) {
     152            0 :                 ShowFatalError(state,
     153            0 :                                format("SimVariableSpeedCoils: Invalid CompIndex passed={}, Number of Water to Air HPs={}, WaterToAir HP name={}",
     154              :                                       DXCoilNum,
     155            0 :                                       state.dataVariableSpeedCoils->NumVarSpeedCoils,
     156              :                                       CompName));
     157              :             }
     158        67674 :             if (!CompName.empty() && CompName != state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name) {
     159            0 :                 ShowFatalError(
     160              :                     state,
     161            0 :                     format("SimVariableSpeedCoils: Invalid CompIndex passed={}, WaterToAir HP name={}, stored WaterToAir HP Name for that index={}",
     162              :                            DXCoilNum,
     163              :                            CompName,
     164            0 :                            state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
     165              :             }
     166              :         }
     167              : 
     168              :         // ERROR PROOF
     169        67677 :         if (SpeedNum < 1) {
     170        37143 :             SpeedCal = 1;
     171              :         } else {
     172        30534 :             SpeedCal = SpeedNum;
     173              :         }
     174              : 
     175       101717 :         if ((state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_CoolingWaterToAirHPVSEquationFit) ||
     176        34040 :             (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed)) {
     177              :             // Cooling mode
     178        34010 :             InitVarSpeedCoil(state, DXCoilNum, SensLoad, LatentLoad, fanOp, OnOffAirFlowRatio, SpeedRatio, SpeedCal);
     179        34010 :             CalcVarSpeedCoilCooling(
     180              :                 state, DXCoilNum, fanOp, SensLoad, LatentLoad, compressorOp, PartLoadFrac, OnOffAirFlowRatio, SpeedRatio, SpeedCal);
     181        34010 :             UpdateVarSpeedCoil(state, DXCoilNum);
     182        33698 :         } else if ((state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_HeatingWaterToAirHPVSEquationFit) ||
     183           31 :                    (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_HeatingAirToAirVariableSpeed)) {
     184              :             // Heating mode
     185        33667 :             InitVarSpeedCoil(state, DXCoilNum, SensLoad, LatentLoad, fanOp, OnOffAirFlowRatio, SpeedRatio, SpeedCal);
     186        33667 :             CalcVarSpeedCoilHeating(state, DXCoilNum, fanOp, SensLoad, compressorOp, PartLoadFrac, OnOffAirFlowRatio, SpeedRatio, SpeedCal);
     187        33667 :             UpdateVarSpeedCoil(state, DXCoilNum);
     188            0 :         } else if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::CoilDX_HeatPumpWaterHeaterVariableSpeed) {
     189              :             // Heating mode
     190            0 :             InitVarSpeedCoil(state, DXCoilNum, SensLoad, LatentLoad, fanOp, OnOffAirFlowRatio, SpeedRatio, SpeedCal);
     191            0 :             CalcVarSpeedHPWH(state, DXCoilNum, PartLoadFrac, SpeedRatio, SpeedNum, fanOp);
     192            0 :             UpdateVarSpeedCoil(state, DXCoilNum);
     193              :         } else {
     194            0 :             ShowFatalError(state, "SimVariableSpeedCoils: WatertoAir heatpump not in either HEATING or COOLING mode");
     195              :         }
     196              : 
     197              :         // two additional output variables
     198        67677 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SpeedNumReport = SpeedCal;
     199        67677 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SpeedRatioReport = SpeedRatio;
     200        67677 :     }
     201              : 
     202           49 :     void GetVarSpeedCoilInput(EnergyPlusData &state)
     203              :     {
     204              : 
     205              :         // SUBROUTINE INFORMATION:
     206              :         //       AUTHOR         Bo Shen
     207              :         //       DATE WRITTEN   March, 2012
     208              :         //       MODIFIED       Bo Shen, 12/2014, add variable-speed HPWH
     209              : 
     210              :         // PURPOSE OF THIS SUBROUTINE:
     211              :         // Obtains input data for HPs and stores it in HP data structures
     212              : 
     213              :         // METHODOLOGY EMPLOYED:
     214              :         // Uses "Get" routines to read in data.
     215              : 
     216              :         // SUBROUTINE PARAMETER DEFINITIONS:
     217              :         static constexpr std::string_view RoutineName("GetVarSpeedCoilInput: "); // include trailing blank space
     218              :         static constexpr std::string_view routineName = "GetVarSpeedCoilInput";
     219              : 
     220              :         // SUBROUTINE LOCAL VARIABLE DECLARATIONS:
     221              :         int NumAlphas;    // Number of variables in String format
     222              :         int NumNums;      // Number of variables in Numeric format
     223              :         int NumParams;    // Total number of input fields
     224           49 :         int MaxNums(0);   // Maximum number of numeric input fields
     225           49 :         int MaxAlphas(0); // Maximum number of alpha input fields
     226              :         int IOStat;
     227              :         int AlfaFieldIncre;              // increment number of Alfa field
     228           49 :         bool ErrorsFound(false);         // If errors detected in input
     229              :         Real64 CurveVal;                 // Used to verify modifier curves equal 1 at rated conditions
     230              :         Real64 WHInletAirTemp;           // Used to pass proper inlet air temp to HPWH DX coil performance curves
     231              :         Real64 WHInletWaterTemp;         // Used to pass proper inlet water temp to HPWH DX coil performance curves
     232           49 :         std::string CurrentModuleObject; // for ease in getting objects
     233           49 :         Array1D_string AlphArray;        // Alpha input items for object
     234           49 :         Array1D_string cAlphaFields;     // Alpha field names
     235           49 :         Array1D_string cNumericFields;   // Numeric field names
     236           49 :         Array1D<Real64> NumArray;        // Numeric input items for object
     237           49 :         Array1D_bool lAlphaBlanks;       // Logical array, alpha field input BLANK = .TRUE.
     238           49 :         Array1D_bool lNumericBlanks;     // Logical array, numeric field input BLANK = .TRUE.
     239              : 
     240              :         int NumCool =
     241           49 :             state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "COIL:COOLING:WATERTOAIRHEATPUMP:VARIABLESPEEDEQUATIONFIT");
     242              :         int NumHeat =
     243           49 :             state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "COIL:HEATING:WATERTOAIRHEATPUMP:VARIABLESPEEDEQUATIONFIT");
     244           49 :         int NumCoolAS = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "COIL:COOLING:DX:VARIABLESPEED");
     245           49 :         int NumHeatAS = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "COIL:HEATING:DX:VARIABLESPEED");
     246              :         int NumHPWHAirToWater =
     247           49 :             state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "COIL:WATERHEATING:AIRTOWATERHEATPUMP:VARIABLESPEED");
     248           49 :         state.dataVariableSpeedCoils->NumVarSpeedCoils = NumCool + NumHeat + NumCoolAS + NumHeatAS + NumHPWHAirToWater;
     249           49 :         int DXCoilNum = 0;
     250              : 
     251           49 :         if (state.dataVariableSpeedCoils->NumVarSpeedCoils <= 0) {
     252            0 :             ShowSevereError(state, "No Equipment found in GetVarSpeedCoilInput");
     253            0 :             ErrorsFound = true;
     254              :         }
     255              : 
     256              :         // Allocate Arrays
     257           49 :         if (state.dataVariableSpeedCoils->NumVarSpeedCoils > 0) {
     258           49 :             state.dataVariableSpeedCoils->VarSpeedCoil.allocate(state.dataVariableSpeedCoils->NumVarSpeedCoils);
     259           49 :             state.dataHeatBal->HeatReclaimVS_Coil.allocate(state.dataVariableSpeedCoils->NumVarSpeedCoils);
     260              :         }
     261              : 
     262           49 :         state.dataInputProcessing->inputProcessor->getObjectDefMaxArgs(
     263              :             state, "COIL:COOLING:WATERTOAIRHEATPUMP:VARIABLESPEEDEQUATIONFIT", NumParams, NumAlphas, NumNums);
     264           49 :         MaxNums = max(MaxNums, NumNums);
     265           49 :         MaxAlphas = max(MaxAlphas, NumAlphas);
     266           49 :         state.dataInputProcessing->inputProcessor->getObjectDefMaxArgs(
     267              :             state, "COIL:HEATING:WATERTOAIRHEATPUMP:VARIABLESPEEDEQUATIONFIT", NumParams, NumAlphas, NumNums);
     268           49 :         MaxNums = max(MaxNums, NumNums);
     269           49 :         MaxAlphas = max(MaxAlphas, NumAlphas);
     270              : 
     271           49 :         state.dataInputProcessing->inputProcessor->getObjectDefMaxArgs(state, "COIL:COOLING:DX:VARIABLESPEED", NumParams, NumAlphas, NumNums);
     272           49 :         MaxNums = max(MaxNums, NumNums);
     273           49 :         MaxAlphas = max(MaxAlphas, NumAlphas);
     274           49 :         state.dataInputProcessing->inputProcessor->getObjectDefMaxArgs(state, "COIL:HEATING:DX:VARIABLESPEED", NumParams, NumAlphas, NumNums);
     275           49 :         MaxNums = max(MaxNums, NumNums);
     276           49 :         MaxAlphas = max(MaxAlphas, NumAlphas);
     277              : 
     278              :         // variable speed air-source HPWH
     279           49 :         state.dataInputProcessing->inputProcessor->getObjectDefMaxArgs(
     280              :             state, "COIL:WATERHEATING:AIRTOWATERHEATPUMP:VARIABLESPEED", NumParams, NumAlphas, NumNums);
     281           49 :         MaxNums = max(MaxNums, NumNums);
     282           49 :         MaxAlphas = max(MaxAlphas, NumAlphas);
     283              : 
     284           49 :         AlphArray.allocate(MaxAlphas);
     285           49 :         cAlphaFields.allocate(MaxAlphas);
     286           49 :         lAlphaBlanks.dimension(MaxAlphas, true);
     287           49 :         cNumericFields.allocate(MaxNums);
     288           49 :         lNumericBlanks.dimension(MaxNums, true);
     289           49 :         NumArray.dimension(MaxNums, 0.0);
     290              : 
     291              :         // Get the data for cooling coil, WATER SOURCE
     292           49 :         CurrentModuleObject = "Coil:Cooling:WaterToAirHeatPump:VariableSpeedEquationFit"; // for reporting
     293              : 
     294           54 :         for (int CoilCounter = 1; CoilCounter <= NumCool; ++CoilCounter) {
     295              : 
     296            5 :             ++DXCoilNum;
     297            5 :             AlfaFieldIncre = 1;
     298              : 
     299            5 :             state.dataInputProcessing->inputProcessor->getObjectItem(state,
     300              :                                                                      CurrentModuleObject,
     301              :                                                                      CoilCounter,
     302              :                                                                      AlphArray,
     303              :                                                                      NumAlphas,
     304              :                                                                      NumArray,
     305              :                                                                      NumNums,
     306              :                                                                      IOStat,
     307              :                                                                      lNumericBlanks,
     308              :                                                                      lAlphaBlanks,
     309              :                                                                      cAlphaFields,
     310              :                                                                      cNumericFields);
     311              : 
     312              :             // ErrorsFound will be set to True if problem was found, left untouched otherwise
     313            5 :             GlobalNames::VerifyUniqueCoilName(state, CurrentModuleObject, AlphArray(1), ErrorsFound, CurrentModuleObject + " Name");
     314              : 
     315            5 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).bIsDesuperheater = false;
     316            5 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name = AlphArray(1);
     317            5 :             state.dataHeatBal->HeatReclaimVS_Coil(DXCoilNum).Name = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name;
     318            5 :             state.dataHeatBal->HeatReclaimVS_Coil(DXCoilNum).SourceType = CurrentModuleObject;
     319            5 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CoolHeatType = "COOLING";
     320            5 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType = HVAC::Coil_CoolingWaterToAirHPVSEquationFit;
     321            5 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VarSpeedCoilType =
     322           10 :                 HVAC::cAllCoilTypes(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType);
     323            5 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds = int(NumArray(1));
     324            5 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel = int(NumArray(2));
     325            5 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedCapCoolTotal = NumArray(3);
     326            5 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedAirVolFlowRate = NumArray(4);
     327            5 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedWaterVolFlowRate = NumArray(5);
     328            5 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Twet_Rated = NumArray(6);
     329            5 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Gamma_Rated = NumArray(7);
     330            5 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MaxONOFFCyclesperHour = NumArray(8);
     331            5 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).LatentCapacityTimeConstant = NumArray(9);
     332            5 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).FanDelayTime = NumArray(10);
     333            5 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HOTGASREHEATFLG = int(NumArray(11));
     334            5 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserType = DataHeatBalance::RefrigCondenserType::Water;
     335              : 
     336            5 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterInletNodeNum =
     337           10 :                 GetOnlySingleNode(state,
     338            5 :                                   AlphArray(2),
     339              :                                   ErrorsFound,
     340              :                                   DataLoopNode::ConnectionObjectType::CoilCoolingWaterToAirHeatPumpVariableSpeedEquationFit,
     341            5 :                                   AlphArray(1),
     342              :                                   DataLoopNode::NodeFluidType::Water,
     343              :                                   DataLoopNode::ConnectionType::Inlet,
     344              :                                   NodeInputManager::CompFluidStream::Secondary,
     345              :                                   DataLoopNode::ObjectIsNotParent);
     346            5 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterOutletNodeNum =
     347           10 :                 GetOnlySingleNode(state,
     348            5 :                                   AlphArray(3),
     349              :                                   ErrorsFound,
     350              :                                   DataLoopNode::ConnectionObjectType::CoilCoolingWaterToAirHeatPumpVariableSpeedEquationFit,
     351            5 :                                   AlphArray(1),
     352              :                                   DataLoopNode::NodeFluidType::Water,
     353              :                                   DataLoopNode::ConnectionType::Outlet,
     354              :                                   NodeInputManager::CompFluidStream::Secondary,
     355              :                                   DataLoopNode::ObjectIsNotParent);
     356            5 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirInletNodeNum =
     357           10 :                 GetOnlySingleNode(state,
     358            5 :                                   AlphArray(4),
     359              :                                   ErrorsFound,
     360              :                                   DataLoopNode::ConnectionObjectType::CoilCoolingWaterToAirHeatPumpVariableSpeedEquationFit,
     361            5 :                                   AlphArray(1),
     362              :                                   DataLoopNode::NodeFluidType::Air,
     363              :                                   DataLoopNode::ConnectionType::Inlet,
     364              :                                   NodeInputManager::CompFluidStream::Primary,
     365              :                                   DataLoopNode::ObjectIsNotParent);
     366            5 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirOutletNodeNum =
     367           15 :                 GetOnlySingleNode(state,
     368            5 :                                   AlphArray(5),
     369              :                                   ErrorsFound,
     370              :                                   DataLoopNode::ConnectionObjectType::CoilCoolingWaterToAirHeatPumpVariableSpeedEquationFit,
     371            5 :                                   AlphArray(1),
     372              :                                   DataLoopNode::NodeFluidType::Air,
     373              :                                   DataLoopNode::ConnectionType::Outlet,
     374              :                                   NodeInputManager::CompFluidStream::Primary,
     375              :                                   DataLoopNode::ObjectIsNotParent);
     376              : 
     377           10 :             BranchNodeConnections::TestCompSet(state, CurrentModuleObject, AlphArray(1), AlphArray(2), AlphArray(3), "Water Nodes");
     378            5 :             BranchNodeConnections::TestCompSet(state, CurrentModuleObject, AlphArray(1), AlphArray(4), AlphArray(5), "Air Nodes");
     379              : 
     380              :             //   If (VarSpeedCoil(DXCoilNum)%NumOfSpeeds .LT. 2) Then
     381            5 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds < 1) {
     382            0 :                 ShowSevereError(
     383              :                     state,
     384            0 :                     format("{}{}=\"{}\", invalid", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
     385            0 :                 ShowContinueError(state, format("...{} must be >= 1. entered number is {:.0T}", cNumericFields(1), NumArray(1)));
     386            0 :                 ErrorsFound = true;
     387              :             }
     388              : 
     389            5 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel >
     390            5 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds) {
     391            0 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel =
     392            0 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds;
     393              :             }
     394              : 
     395            5 :             if ((state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel >
     396           10 :                  state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds) ||
     397            5 :                 (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel <= 0)) {
     398            0 :                 ShowSevereError(
     399              :                     state,
     400            0 :                     format("{}{}=\"{}\", invalid", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
     401            0 :                 ShowContinueError(state, format("...{} must be valid speed level entered number is {:.0T}", cNumericFields(2), NumArray(2)));
     402            0 :                 ErrorsFound = true;
     403              :             }
     404              : 
     405              :             // part load curve
     406            5 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PLFFPLR = Curve::GetCurveIndex(state, AlphArray(6)); // convert curve name to number
     407            5 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PLFFPLR == 0) {
     408            0 :                 if (lAlphaBlanks(6)) {
     409            0 :                     ShowSevereError(
     410              :                         state,
     411            0 :                         format("{}{}=\"{}\", missing", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
     412            0 :                     ShowContinueError(state, format("...required {} is blank.", cAlphaFields(6)));
     413              :                 } else {
     414            0 :                     ShowSevereError(
     415              :                         state,
     416            0 :                         format("{}{}=\"{}\", invalid", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
     417            0 :                     ShowContinueError(state, format("...not found {}=\"{}\".", cAlphaFields(6), AlphArray(6)));
     418              :                 }
     419            0 :                 ErrorsFound = true;
     420              :             } else {
     421            5 :                 CurveVal = Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PLFFPLR, 1.0);
     422            5 :                 if (CurveVal > 1.10 || CurveVal < 0.90) {
     423            0 :                     ShowWarningError(state,
     424            0 :                                      format("{}{}=\"{}\", curve values",
     425              :                                             RoutineName,
     426              :                                             CurrentModuleObject,
     427            0 :                                             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
     428            0 :                     ShowContinueError(state, format("...{} output is not equal to 1.0 (+ or - 10%) at rated conditions.", cAlphaFields(6)));
     429            0 :                     ShowContinueError(state, format("...Curve output at rated conditions = {:.3T}", CurveVal));
     430              :                 }
     431              :             }
     432              : 
     433           45 :             for (int I = 1; I <= state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds; ++I) {
     434           40 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(I) = NumArray(12 + (I - 1) * 6);
     435           40 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedSHR(I) = NumArray(13 + (I - 1) * 6);
     436           40 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedCOP(I) = NumArray(14 + (I - 1) * 6);
     437           40 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirVolFlowRate(I) = NumArray(15 + (I - 1) * 6);
     438           40 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedWaterVolFlowRate(I) = NumArray(16 + (I - 1) * 6);
     439           40 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWasteHeatFrac(I) = NumArray(17 + (I - 1) * 6);
     440              : 
     441           40 :                 AlfaFieldIncre = 7 + (I - 1) * 7;
     442           40 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(I) =
     443           40 :                     Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
     444           40 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(I) == 0) {
     445            0 :                     if (lAlphaBlanks(AlfaFieldIncre)) {
     446            0 :                         ShowSevereError(state,
     447            0 :                                         format("{}{}=\"{}\", missing",
     448              :                                                RoutineName,
     449              :                                                CurrentModuleObject,
     450            0 :                                                state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
     451            0 :                         ShowContinueError(state, format("...required {} is blank.", cAlphaFields(AlfaFieldIncre)));
     452              :                     } else {
     453            0 :                         ShowSevereError(state,
     454            0 :                                         format("{}{}=\"{}\", invalid",
     455              :                                                RoutineName,
     456              :                                                CurrentModuleObject,
     457            0 :                                                state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
     458            0 :                         ShowContinueError(state, format("...not found {}=\"{}\".", cAlphaFields(AlfaFieldIncre), AlphArray(AlfaFieldIncre)));
     459              :                     }
     460            0 :                     ErrorsFound = true;
     461              :                 } else {
     462              :                     // Verify Curve Object, only legal type is BiQuadratic
     463          120 :                     ErrorsFound |= Curve::CheckCurveDims(state,
     464           40 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(I), // Curve index
     465              :                                                          {2},                                                                  // Valid dimensions
     466              :                                                          RoutineName,                                                          // Routine name
     467              :                                                          CurrentModuleObject,                                                  // Object Type
     468           40 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,           // Object Name
     469           40 :                                                          cAlphaFields(AlfaFieldIncre));                                        // Field Name
     470              : 
     471           40 :                     if (!ErrorsFound) {
     472           80 :                         CurveVal = Curve::CurveValue(
     473           40 :                             state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(I), RatedInletWetBulbTemp, RatedInletWaterTemp);
     474           40 :                         if (CurveVal > 1.10 || CurveVal < 0.90) {
     475            0 :                             ShowWarningError(state,
     476            0 :                                              format("{}{}=\"{}\", curve values",
     477              :                                                     RoutineName,
     478              :                                                     CurrentModuleObject,
     479            0 :                                                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
     480            0 :                             ShowContinueError(
     481            0 :                                 state, format("...{} output is not equal to 1.0 (+ or - 10%) at rated conditions.", cAlphaFields(AlfaFieldIncre)));
     482            0 :                             ShowContinueError(state, format("...Curve output at rated conditions = {:.3T}", CurveVal));
     483              :                         }
     484              :                     }
     485              :                 }
     486              : 
     487           40 :                 AlfaFieldIncre = 8 + (I - 1) * 7;
     488           40 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(I) =
     489           40 :                     Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
     490           40 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(I) == 0) {
     491            0 :                     if (lAlphaBlanks(AlfaFieldIncre)) {
     492            0 :                         ShowSevereError(state,
     493            0 :                                         format("{}{}=\"{}\", missing",
     494              :                                                RoutineName,
     495              :                                                CurrentModuleObject,
     496            0 :                                                state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
     497            0 :                         ShowContinueError(state, format("...required {} is blank.", cAlphaFields(AlfaFieldIncre)));
     498              :                     } else {
     499            0 :                         ShowSevereError(state,
     500            0 :                                         format("{}{}=\"{}\", invalid",
     501              :                                                RoutineName,
     502              :                                                CurrentModuleObject,
     503            0 :                                                state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
     504            0 :                         ShowContinueError(state, format("...not found {}=\"{}\".", cAlphaFields(AlfaFieldIncre), AlphArray(AlfaFieldIncre)));
     505              :                     }
     506            0 :                     ErrorsFound = true;
     507              :                 } else {
     508              :                     // Verify Curve Object, only legal type is Quadratic
     509          120 :                     ErrorsFound |= Curve::CheckCurveDims(state,
     510           40 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(I), // Curve index
     511              :                                                          {1},                                                                     // Valid dimensions
     512              :                                                          RoutineName,                                                             // Routine name
     513              :                                                          CurrentModuleObject,                                                     // Object Type
     514           40 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,              // Object Name
     515           40 :                                                          cAlphaFields(AlfaFieldIncre));                                           // Field Name
     516              : 
     517           40 :                     if (!ErrorsFound) {
     518           40 :                         CurveVal = Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(I), 1.0);
     519           40 :                         if (CurveVal > 1.10 || CurveVal < 0.90) {
     520            0 :                             ShowWarningError(state,
     521            0 :                                              format("{}{}=\"{}\", curve values",
     522              :                                                     RoutineName,
     523              :                                                     CurrentModuleObject,
     524            0 :                                                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
     525            0 :                             ShowContinueError(
     526            0 :                                 state, format("...{} output is not equal to 1.0 (+ or - 10%) at rated conditions.", cAlphaFields(AlfaFieldIncre)));
     527            0 :                             ShowContinueError(state, format("...Curve output at rated conditions = {:.3T}", CurveVal));
     528              :                         }
     529              :                     }
     530              :                 }
     531              : 
     532           40 :                 AlfaFieldIncre = 9 + (I - 1) * 7;
     533           40 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapWaterFFlow(I) =
     534           40 :                     Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
     535           40 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapWaterFFlow(I) == 0) {
     536            0 :                     if (lAlphaBlanks(AlfaFieldIncre)) {
     537            0 :                         ShowSevereError(state,
     538            0 :                                         format("{}{}=\"{}\", missing",
     539              :                                                RoutineName,
     540              :                                                CurrentModuleObject,
     541            0 :                                                state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
     542            0 :                         ShowContinueError(state, format("...required {} is blank.", cAlphaFields(AlfaFieldIncre)));
     543              :                     } else {
     544            0 :                         ShowSevereError(state,
     545            0 :                                         format("{}{}=\"{}\", invalid",
     546              :                                                RoutineName,
     547              :                                                CurrentModuleObject,
     548            0 :                                                state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
     549            0 :                         ShowContinueError(state, format("...not found {}=\"{}\".", cAlphaFields(AlfaFieldIncre), AlphArray(AlfaFieldIncre)));
     550              :                     }
     551            0 :                     ErrorsFound = true;
     552              :                 } else {
     553              :                     // Verify Curve Object, only legal type is Quadratic
     554          120 :                     ErrorsFound |= Curve::CheckCurveDims(state,
     555           40 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapWaterFFlow(I), // Curve index
     556              :                                                          {1},                                                        // Valid dimensions
     557              :                                                          RoutineName,                                                // Routine name
     558              :                                                          CurrentModuleObject,                                        // Object Type
     559           40 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name, // Object Name
     560           40 :                                                          cAlphaFields(AlfaFieldIncre));                              // Field Name
     561              : 
     562           40 :                     if (!ErrorsFound) {
     563           40 :                         CurveVal = Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapWaterFFlow(I), 1.0);
     564           40 :                         if (CurveVal > 1.10 || CurveVal < 0.90) {
     565            0 :                             ShowWarningError(state,
     566            0 :                                              format("{}{}=\"{}\", curve values",
     567              :                                                     RoutineName,
     568              :                                                     CurrentModuleObject,
     569            0 :                                                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
     570            0 :                             ShowContinueError(
     571            0 :                                 state, format("...{} output is not equal to 1.0 (+ or - 10%) at rated conditions.", cAlphaFields(AlfaFieldIncre)));
     572            0 :                             ShowContinueError(state, format("...Curve output at rated conditions = {:.3T}", CurveVal));
     573              :                         }
     574              :                     }
     575              :                 }
     576              : 
     577           40 :                 AlfaFieldIncre = 10 + (I - 1) * 7;
     578           40 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(I) =
     579           40 :                     Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
     580           40 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(I) == 0) {
     581            0 :                     if (lAlphaBlanks(AlfaFieldIncre)) {
     582            0 :                         ShowSevereError(state,
     583            0 :                                         format("{}{}=\"{}\", missing",
     584              :                                                RoutineName,
     585              :                                                CurrentModuleObject,
     586            0 :                                                state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
     587            0 :                         ShowContinueError(state, format("...required {} is blank.", cAlphaFields(AlfaFieldIncre)));
     588              :                     } else {
     589            0 :                         ShowSevereError(state,
     590            0 :                                         format("{}{}=\"{}\", invalid",
     591              :                                                RoutineName,
     592              :                                                CurrentModuleObject,
     593            0 :                                                state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
     594            0 :                         ShowContinueError(state, format("...not found {}=\"{}\".", cAlphaFields(AlfaFieldIncre), AlphArray(AlfaFieldIncre)));
     595              :                     }
     596            0 :                     ErrorsFound = true;
     597              :                 } else {
     598              :                     // Verify Curve Object, only legal type is BiQuadratic
     599          120 :                     ErrorsFound |= Curve::CheckCurveDims(state,
     600           40 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(I), // Curve index
     601              :                                                          {2},                                                                 // Valid dimensions
     602              :                                                          RoutineName,                                                         // Routine name
     603              :                                                          CurrentModuleObject,                                                 // Object Type
     604           40 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,          // Object Name
     605           40 :                                                          cAlphaFields(AlfaFieldIncre));                                       // Field Name
     606              : 
     607           40 :                     if (!ErrorsFound) {
     608           80 :                         CurveVal = Curve::CurveValue(
     609           40 :                             state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(I), RatedInletWetBulbTemp, RatedInletWaterTemp);
     610           40 :                         if (CurveVal > 1.10 || CurveVal < 0.90) {
     611            0 :                             ShowWarningError(state,
     612            0 :                                              format("{}{}=\"{}\", curve values",
     613              :                                                     RoutineName,
     614              :                                                     CurrentModuleObject,
     615            0 :                                                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
     616            0 :                             ShowContinueError(
     617            0 :                                 state, format("...{} output is not equal to 1.0 (+ or - 10%) at rated conditions.", cAlphaFields(AlfaFieldIncre)));
     618            0 :                             ShowContinueError(state, format("...Curve output at rated conditions = {:.3T}", CurveVal));
     619              :                         }
     620              :                     }
     621              :                 }
     622              : 
     623           40 :                 AlfaFieldIncre = 11 + (I - 1) * 7;
     624           40 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(I) =
     625           40 :                     Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
     626           40 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(I) == 0) {
     627            0 :                     if (lAlphaBlanks(AlfaFieldIncre)) {
     628            0 :                         ShowSevereError(state,
     629            0 :                                         format("{}{}=\"{}\", missing",
     630              :                                                RoutineName,
     631              :                                                CurrentModuleObject,
     632            0 :                                                state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
     633            0 :                         ShowContinueError(state, format("...required {} is blank.", cAlphaFields(AlfaFieldIncre)));
     634              :                     } else {
     635            0 :                         ShowSevereError(state,
     636            0 :                                         format("{}{}=\"{}\", invalid",
     637              :                                                RoutineName,
     638              :                                                CurrentModuleObject,
     639            0 :                                                state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
     640            0 :                         ShowContinueError(state, format("...not found {}=\"{}\".", cAlphaFields(AlfaFieldIncre), AlphArray(AlfaFieldIncre)));
     641              :                     }
     642            0 :                     ErrorsFound = true;
     643              :                 } else {
     644              :                     // Verify Curve Object, only legal type is Quadratic
     645          120 :                     ErrorsFound |= Curve::CheckCurveDims(state,
     646           40 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(I), // Curve index
     647              :                                                          {1},                                                                    // Valid dimensions
     648              :                                                          RoutineName,                                                            // Routine name
     649              :                                                          CurrentModuleObject,                                                    // Object Type
     650           40 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,             // Object Name
     651           40 :                                                          cAlphaFields(AlfaFieldIncre));                                          // Field Name
     652              : 
     653           40 :                     if (!ErrorsFound) {
     654           40 :                         CurveVal = Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(I), 1.0);
     655           40 :                         if (CurveVal > 1.10 || CurveVal < 0.90) {
     656            0 :                             ShowWarningError(state,
     657            0 :                                              format("{}{}=\"{}\", curve values",
     658              :                                                     RoutineName,
     659              :                                                     CurrentModuleObject,
     660            0 :                                                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
     661            0 :                             ShowContinueError(
     662            0 :                                 state, format("...{} output is not equal to 1.0 (+ or - 10%) at rated conditions.", cAlphaFields(AlfaFieldIncre)));
     663            0 :                             ShowContinueError(state, format("...Curve output at rated conditions = {:.3T}", CurveVal));
     664              :                         }
     665              :                     }
     666              :                 }
     667              : 
     668           40 :                 AlfaFieldIncre = 12 + (I - 1) * 7;
     669           40 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRWaterFFlow(I) =
     670           40 :                     Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
     671           40 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRWaterFFlow(I) == 0) {
     672            0 :                     if (lAlphaBlanks(AlfaFieldIncre)) {
     673            0 :                         ShowSevereError(state,
     674            0 :                                         format("{}{}=\"{}\", missing",
     675              :                                                RoutineName,
     676              :                                                CurrentModuleObject,
     677            0 :                                                state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
     678            0 :                         ShowContinueError(state, format("...required {} is blank.", cAlphaFields(AlfaFieldIncre)));
     679              :                     } else {
     680            0 :                         ShowSevereError(state,
     681            0 :                                         format("{}{}=\"{}\", invalid",
     682              :                                                RoutineName,
     683              :                                                CurrentModuleObject,
     684            0 :                                                state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
     685            0 :                         ShowContinueError(state, format("...not found {}=\"{}\".", cAlphaFields(AlfaFieldIncre), AlphArray(AlfaFieldIncre)));
     686              :                     }
     687            0 :                     ErrorsFound = true;
     688              :                 } else {
     689              :                     // Verify Curve Object, only legal type is Quadratic
     690          120 :                     ErrorsFound |= Curve::CheckCurveDims(state,
     691           40 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRWaterFFlow(I), // Curve index
     692              :                                                          {1},                                                                      // Valid dimensions
     693              :                                                          RoutineName,                                                              // Routine name
     694              :                                                          CurrentModuleObject,                                                      // Object Type
     695           40 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,               // Object Name
     696           40 :                                                          cAlphaFields(AlfaFieldIncre));                                            // Field Name
     697              : 
     698           40 :                     if (!ErrorsFound) {
     699           40 :                         CurveVal = Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRWaterFFlow(I), 1.0);
     700           40 :                         if (CurveVal > 1.10 || CurveVal < 0.90) {
     701            0 :                             ShowWarningError(state,
     702            0 :                                              format("{}{}=\"{}\", curve values",
     703              :                                                     RoutineName,
     704              :                                                     CurrentModuleObject,
     705            0 :                                                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
     706            0 :                             ShowContinueError(
     707            0 :                                 state, format("...{} output is not equal to 1.0 (+ or - 10%) at rated conditions.", cAlphaFields(AlfaFieldIncre)));
     708            0 :                             ShowContinueError(state, format("...Curve output at rated conditions = {:.3T}", CurveVal));
     709              :                         }
     710              :                     }
     711              :                 }
     712              : 
     713           40 :                 AlfaFieldIncre = 13 + (I - 1) * 7;
     714              :                 // Read waste heat modifier curve name
     715           40 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWasteHeat(I) =
     716           40 :                     Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
     717           40 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWasteHeat(I) == 0) {
     718            0 :                     if (lAlphaBlanks(AlfaFieldIncre)) {
     719            0 :                         ShowSevereError(state,
     720            0 :                                         format("{}{}=\"{}\", missing",
     721              :                                                RoutineName,
     722              :                                                CurrentModuleObject,
     723            0 :                                                state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
     724            0 :                         ShowContinueError(state, format("...required {} is blank.", cAlphaFields(AlfaFieldIncre)));
     725              :                     } else {
     726            0 :                         ShowSevereError(state,
     727            0 :                                         format("{}{}=\"{}\", invalid",
     728              :                                                RoutineName,
     729              :                                                CurrentModuleObject,
     730            0 :                                                state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
     731            0 :                         ShowContinueError(state, format("...not found {}=\"{}\".", cAlphaFields(AlfaFieldIncre), AlphArray(AlfaFieldIncre)));
     732              :                     }
     733            0 :                     ErrorsFound = true;
     734              :                 } else {
     735              :                     // Verify Curve Object, only legal types are BiQuadratic
     736          120 :                     ErrorsFound |= Curve::CheckCurveDims(state,
     737           40 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWasteHeat(I), // Curve index
     738              :                                                          {2},                                                                  // Valid dimensions
     739              :                                                          RoutineName,                                                          // Routine name
     740              :                                                          CurrentModuleObject,                                                  // Object Type
     741           40 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,           // Object Name
     742           40 :                                                          cAlphaFields(AlfaFieldIncre));                                        // Field Name
     743              : 
     744           40 :                     if (!ErrorsFound) {
     745           80 :                         CurveVal = Curve::CurveValue(
     746           40 :                             state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWasteHeat(I), RatedInletWaterTemp, RatedInletAirTemp);
     747           40 :                         if (CurveVal > 1.10 || CurveVal < 0.90) {
     748            0 :                             ShowWarningError(state,
     749            0 :                                              format("{}{}=\"{}\", curve values",
     750              :                                                     RoutineName,
     751              :                                                     CurrentModuleObject,
     752            0 :                                                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
     753            0 :                             ShowContinueError(
     754            0 :                                 state, format("...{} output is not equal to 1.0 (+ or - 10%) at rated conditions.", cAlphaFields(AlfaFieldIncre)));
     755            0 :                             ShowContinueError(state, format("...Curve output at rated conditions = {:.3T}", CurveVal));
     756              :                         }
     757              :                     }
     758              :                 }
     759              :             }
     760              : 
     761           45 :             for (int I = 1; I <= state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds; ++I) {
     762           40 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedPercentTotCap(I) =
     763           40 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(I) /
     764           80 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(
     765           40 :                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds);
     766           40 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirVolFlowPerRatedTotCap(I) =
     767           40 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirVolFlowRate(I) /
     768           40 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(I);
     769           40 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedWaterVolFlowPerRatedTotCap(I) =
     770           40 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedWaterVolFlowRate(I) /
     771           40 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(I);
     772              :             }
     773              : 
     774              :             // CurrentModuleObject = "Coil:Cooling:WaterToAirHeatPump:VariableSpeedEquationFit"
     775           10 :             SetupOutputVariable(state,
     776              :                                 "Cooling Coil Electricity Energy",
     777              :                                 Constant::Units::J,
     778            5 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Energy,
     779              :                                 OutputProcessor::TimeStepType::System,
     780              :                                 OutputProcessor::StoreType::Sum,
     781            5 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
     782              :                                 Constant::eResource::Electricity,
     783              :                                 OutputProcessor::Group::HVAC,
     784              :                                 OutputProcessor::EndUseCat::Cooling);
     785           10 :             SetupOutputVariable(state,
     786              :                                 "Cooling Coil Total Cooling Energy",
     787              :                                 Constant::Units::J,
     788            5 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergyLoadTotal,
     789              :                                 OutputProcessor::TimeStepType::System,
     790              :                                 OutputProcessor::StoreType::Sum,
     791            5 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
     792              :                                 Constant::eResource::EnergyTransfer,
     793              :                                 OutputProcessor::Group::HVAC,
     794              :                                 OutputProcessor::EndUseCat::CoolingCoils);
     795           10 :             SetupOutputVariable(state,
     796              :                                 "Cooling Coil Sensible Cooling Energy",
     797              :                                 Constant::Units::J,
     798            5 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergySensible,
     799              :                                 OutputProcessor::TimeStepType::System,
     800              :                                 OutputProcessor::StoreType::Sum,
     801            5 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
     802           10 :             SetupOutputVariable(state,
     803              :                                 "Cooling Coil Latent Cooling Energy",
     804              :                                 Constant::Units::J,
     805            5 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergyLatent,
     806              :                                 OutputProcessor::TimeStepType::System,
     807              :                                 OutputProcessor::StoreType::Sum,
     808            5 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
     809           10 :             SetupOutputVariable(state,
     810              :                                 "Cooling Coil Source Side Heat Transfer Energy",
     811              :                                 Constant::Units::J,
     812            5 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergySource,
     813              :                                 OutputProcessor::TimeStepType::System,
     814              :                                 OutputProcessor::StoreType::Sum,
     815            5 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
     816              :                                 Constant::eResource::PlantLoopCoolingDemand,
     817              :                                 OutputProcessor::Group::HVAC,
     818              :                                 OutputProcessor::EndUseCat::CoolingCoils);
     819              : 
     820            5 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedCapCoolSens =
     821              :                 DataSizing::AutoSize; // always auto-sized, to be determined in the sizing calculation
     822              :         }
     823              : 
     824              :         //-------------------------AIR SOURCE, COOLING---BEGIN
     825              :         // Get the data for cooling coil, AIR SOURCE
     826           49 :         CurrentModuleObject = "Coil:Cooling:DX:VariableSpeed"; // for reporting
     827              : 
     828           87 :         for (int CoilCounter = 1; CoilCounter <= NumCoolAS; ++CoilCounter) {
     829              : 
     830           38 :             ++DXCoilNum;
     831           38 :             AlfaFieldIncre = 1;
     832              : 
     833           38 :             state.dataInputProcessing->inputProcessor->getObjectItem(state,
     834              :                                                                      CurrentModuleObject,
     835              :                                                                      CoilCounter,
     836              :                                                                      AlphArray,
     837              :                                                                      NumAlphas,
     838              :                                                                      NumArray,
     839              :                                                                      NumNums,
     840              :                                                                      IOStat,
     841              :                                                                      lNumericBlanks,
     842              :                                                                      lAlphaBlanks,
     843              :                                                                      cAlphaFields,
     844              :                                                                      cNumericFields);
     845              : 
     846           38 :             ErrorObjectHeader eoh{routineName, CurrentModuleObject, AlphArray(1)};
     847              : 
     848              :             // ErrorsFound will be set to True if problem was found, left untouched otherwise
     849           38 :             GlobalNames::VerifyUniqueCoilName(state, CurrentModuleObject, AlphArray(1), ErrorsFound, CurrentModuleObject + " Name");
     850              : 
     851           38 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).bIsDesuperheater = false;
     852           38 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name = AlphArray(1);
     853              :             // Initialize DataHeatBalance heat reclaim variable name for use by heat reclaim coils
     854           38 :             state.dataHeatBal->HeatReclaimVS_Coil(DXCoilNum).Name = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name;
     855           38 :             state.dataHeatBal->HeatReclaimVS_Coil(DXCoilNum).SourceType = CurrentModuleObject;
     856           38 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CoolHeatType = "COOLING";
     857           38 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType = HVAC::Coil_CoolingAirToAirVariableSpeed;
     858           38 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VarSpeedCoilType = HVAC::cAllCoilTypes(HVAC::Coil_CoolingAirToAirVariableSpeed);
     859           38 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds = int(NumArray(1));
     860           38 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel = int(NumArray(2));
     861           38 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedCapCoolTotal = NumArray(3);
     862           38 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedAirVolFlowRate = NumArray(4);
     863           38 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Twet_Rated = NumArray(5);
     864           38 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Gamma_Rated = NumArray(6);
     865           38 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MaxONOFFCyclesperHour = NumArray(7);
     866           38 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).LatentCapacityTimeConstant = NumArray(8);
     867           38 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).FanDelayTime = NumArray(9);
     868              : 
     869           38 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirInletNodeNum =
     870           76 :                 GetOnlySingleNode(state,
     871           38 :                                   AlphArray(2),
     872              :                                   ErrorsFound,
     873              :                                   DataLoopNode::ConnectionObjectType::CoilCoolingDXVariableSpeed,
     874           38 :                                   AlphArray(1),
     875              :                                   DataLoopNode::NodeFluidType::Air,
     876              :                                   DataLoopNode::ConnectionType::Inlet,
     877              :                                   NodeInputManager::CompFluidStream::Primary,
     878              :                                   DataLoopNode::ObjectIsNotParent);
     879           38 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirOutletNodeNum =
     880          114 :                 GetOnlySingleNode(state,
     881           38 :                                   AlphArray(3),
     882              :                                   ErrorsFound,
     883              :                                   DataLoopNode::ConnectionObjectType::CoilCoolingDXVariableSpeed,
     884           38 :                                   AlphArray(1),
     885              :                                   DataLoopNode::NodeFluidType::Air,
     886              :                                   DataLoopNode::ConnectionType::Outlet,
     887              :                                   NodeInputManager::CompFluidStream::Primary,
     888              :                                   DataLoopNode::ObjectIsNotParent);
     889              : 
     890           38 :             BranchNodeConnections::TestCompSet(state, CurrentModuleObject, AlphArray(1), AlphArray(2), AlphArray(3), "Air Nodes");
     891              : 
     892           38 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds < 1) {
     893            0 :                 ShowSevereError(
     894              :                     state,
     895            0 :                     format("{}{}=\"{}\", invalid", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
     896            0 :                 ShowContinueError(state, format("...{} must be >= 1. entered number is {:.0T}", cNumericFields(1), NumArray(1)));
     897            0 :                 ErrorsFound = true;
     898              :             }
     899              : 
     900           38 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel >
     901           38 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds) {
     902            0 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel =
     903            0 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds;
     904              :             }
     905              : 
     906           38 :             if ((state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel >
     907           76 :                  state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds) ||
     908           38 :                 (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel <= 0)) {
     909            0 :                 ShowSevereError(
     910              :                     state,
     911            0 :                     format("{}{}=\"{}\", invalid", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
     912            0 :                 ShowContinueError(state, format("...{} must be valid speed level entered number is {:.0T}", cNumericFields(2), NumArray(2)));
     913            0 :                 ErrorsFound = true;
     914              :             }
     915              : 
     916              :             // part load curve
     917           38 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PLFFPLR = Curve::GetCurveIndex(state, AlphArray(4)); // convert curve name to number
     918           38 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PLFFPLR == 0) {
     919            0 :                 if (lAlphaBlanks(4)) {
     920            0 :                     ShowSevereError(
     921              :                         state,
     922            0 :                         format("{}{}=\"{}\", missing", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
     923            0 :                     ShowContinueError(state, format("...required {} is blank.", cAlphaFields(6)));
     924              :                 } else {
     925            0 :                     ShowSevereError(
     926              :                         state,
     927            0 :                         format("{}{}=\"{}\", invalid", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
     928            0 :                     ShowContinueError(state, format("...not found {}=\"{}\".", cAlphaFields(4), AlphArray(4)));
     929              :                 }
     930            0 :                 ErrorsFound = true;
     931              :             } else {
     932           38 :                 CurveVal = Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PLFFPLR, 1.0);
     933           38 :                 if (CurveVal > 1.10 || CurveVal < 0.90) {
     934            0 :                     ShowWarningError(state,
     935            0 :                                      format("{}{}=\"{}\", curve values",
     936              :                                             RoutineName,
     937              :                                             CurrentModuleObject,
     938            0 :                                             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
     939            0 :                     ShowContinueError(state, format("...{} output is not equal to 1.0 (+ or - 10%) at rated conditions.", cAlphaFields(4)));
     940            0 :                     ShowContinueError(state, format("...Curve output at rated conditions = {:.3T}", CurveVal));
     941              :                 }
     942              :             }
     943              : 
     944              :             // outdoor condenser node
     945           38 :             if (lAlphaBlanks(5)) {
     946           34 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserInletNodeNum = 0;
     947              :             } else {
     948            4 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserInletNodeNum =
     949            8 :                     GetOnlySingleNode(state,
     950            4 :                                       AlphArray(5),
     951              :                                       ErrorsFound,
     952              :                                       DataLoopNode::ConnectionObjectType::CoilCoolingDXVariableSpeed,
     953            4 :                                       state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
     954              :                                       DataLoopNode::NodeFluidType::Air,
     955              :                                       DataLoopNode::ConnectionType::OutsideAirReference,
     956              :                                       NodeInputManager::CompFluidStream::Primary,
     957              :                                       DataLoopNode::ObjectIsNotParent);
     958              : 
     959            4 :                 if (!OutAirNodeManager::CheckOutAirNodeNumber(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserInletNodeNum)) {
     960            4 :                     ShowWarningError(state,
     961            4 :                                      format("{}{}=\"{}\", may be invalid",
     962              :                                             RoutineName,
     963              :                                             CurrentModuleObject,
     964            2 :                                             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
     965            4 :                     ShowContinueError(state,
     966            4 :                                       format("{}=\"{}\", node does not appear in an OutdoorAir:NodeList or as an OutdoorAir:Node.",
     967              :                                              cAlphaFields(10),
     968              :                                              AlphArray(5)));
     969            6 :                     ShowContinueError(
     970              :                         state, "This node needs to be included in an air system or the coil model will not be valid, and the simulation continues");
     971              :                 }
     972              :             }
     973              : 
     974           38 :             if ((Util::SameString(AlphArray(6), "AirCooled")) || lAlphaBlanks(6)) {
     975           37 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserType = DataHeatBalance::RefrigCondenserType::Air;
     976            1 :             } else if (Util::SameString(AlphArray(6), "EvaporativelyCooled")) {
     977            1 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserType = DataHeatBalance::RefrigCondenserType::Evap;
     978            1 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).ReportEvapCondVars = true;
     979              :             } else {
     980            0 :                 ShowSevereError(
     981              :                     state,
     982            0 :                     format("{}{}=\"{}\", invalid", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
     983            0 :                 ShowContinueError(state, format("...{}=\"{}\":", cAlphaFields(6), AlphArray(6)));
     984            0 :                 ShowContinueError(state, "...must be AirCooled or EvaporativelyCooled.");
     985            0 :                 ErrorsFound = true;
     986              :             }
     987              : 
     988           38 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapCondPumpElecNomPower = NumArray(10);
     989              : 
     990           38 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapCondPumpElecNomPower != DataSizing::AutoSize) {
     991           37 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapCondPumpElecNomPower < 0.0) {
     992            0 :                     ShowSevereError(
     993              :                         state,
     994            0 :                         format("{}{}=\"{}\", invalid", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
     995            0 :                     ShowContinueError(state, format("...{} cannot be < 0.0.", cNumericFields(10)));
     996            0 :                     ShowContinueError(state, format("...entered value=[{:.2T}].", NumArray(10)));
     997            0 :                     ErrorsFound = true;
     998              :                 }
     999              :             }
    1000              : 
    1001              :             // Set crankcase heater capacity
    1002           38 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterCapacity = NumArray(11);
    1003           38 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterCapacity < 0.0) {
    1004            0 :                 ShowSevereError(
    1005              :                     state,
    1006            0 :                     format("{}{}=\"{}\", invalid", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    1007            0 :                 ShowContinueError(state, format("...{} cannot be < 0.0.", cNumericFields(11)));
    1008            0 :                 ShowContinueError(state, format("...entered value=[{:.2T}].", NumArray(11)));
    1009            0 :                 ErrorsFound = true;
    1010              :             }
    1011              : 
    1012              :             // Set crankcase heater cutout temperature
    1013           38 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MaxOATCrankcaseHeater = NumArray(12);
    1014              : 
    1015              :             // Set crankcase heater cutout temperature
    1016           38 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MinOATCompressor = NumArray(13);
    1017              : 
    1018              :             // A7; \field Crankcase Heater Capacity Function of Outdoor Temperature Curve Name
    1019           38 :             if (!lAlphaBlanks(7)) {
    1020            2 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterCapacityCurveIndex = Curve::GetCurveIndex(state, AlphArray(7));
    1021            2 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterCapacityCurveIndex == 0) { // can't find the curve
    1022            0 :                     ShowSevereError(state,
    1023            0 :                                     format("{} = {}:  {} not found = {}",
    1024              :                                            CurrentModuleObject,
    1025            0 :                                            state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
    1026              :                                            cAlphaFields(7),
    1027              :                                            AlphArray(7)));
    1028            0 :                     ErrorsFound = true;
    1029              :                 } else {
    1030            2 :                     ErrorsFound |=
    1031            8 :                         Curve::CheckCurveDims(state,
    1032            2 :                                               state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterCapacityCurveIndex, // Curve index
    1033              :                                               {1},                                                        // Valid dimensions
    1034              :                                               RoutineName,                                                // Routine name
    1035              :                                               CurrentModuleObject,                                        // Object Type
    1036            2 :                                               state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name, // Object Name
    1037            2 :                                               cAlphaFields(7));                                           // Field Name
    1038              :                 }
    1039              :             }
    1040              : 
    1041              :             // Get Water System tank connections
    1042              :             //  A8, \field Name of Water Storage Tank for Supply
    1043           38 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapWaterSupplyName = AlphArray(8);
    1044           38 :             if (lAlphaBlanks(8)) {
    1045           38 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapWaterSupplyMode = WaterSupplyFromMains;
    1046              :             } else {
    1047            0 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapWaterSupplyMode = WaterSupplyFromTank;
    1048            0 :                 WaterManager::SetupTankDemandComponent(state,
    1049            0 :                                                        state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
    1050              :                                                        CurrentModuleObject,
    1051            0 :                                                        state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapWaterSupplyName,
    1052              :                                                        ErrorsFound,
    1053            0 :                                                        state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapWaterSupTankID,
    1054            0 :                                                        state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapWaterTankDemandARRID);
    1055              :             }
    1056              : 
    1057              :             // A9; \field Name of Water Storage Tank for Condensate Collection
    1058           38 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondensateCollectName = AlphArray(9);
    1059           38 :             if (lAlphaBlanks(9)) {
    1060           38 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondensateCollectMode = CondensateDiscarded;
    1061              :             } else {
    1062            0 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondensateCollectMode = CondensateToTank;
    1063            0 :                 WaterManager::SetupTankSupplyComponent(state,
    1064            0 :                                                        state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
    1065              :                                                        CurrentModuleObject,
    1066            0 :                                                        state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondensateCollectName,
    1067              :                                                        ErrorsFound,
    1068            0 :                                                        state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondensateTankID,
    1069            0 :                                                        state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondensateTankSupplyARRID);
    1070              :             }
    1071              : 
    1072              :             //   Basin heater power as a function of temperature must be greater than or equal to 0
    1073           38 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).BasinHeaterPowerFTempDiff = NumArray(14);
    1074           38 :             if (NumArray(14) < 0.0) {
    1075            0 :                 ShowSevereError(
    1076              :                     state,
    1077            0 :                     format("{}{}=\"{}\", invalid", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    1078            0 :                 ShowContinueError(state, format("...{} must be >= 0.0.", cNumericFields(14)));
    1079            0 :                 ShowContinueError(state, format("...entered value=[{:.2T}].", NumArray(14)));
    1080            0 :                 ErrorsFound = true;
    1081              :             }
    1082              : 
    1083           38 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).BasinHeaterSetPointTemp = NumArray(15);
    1084           38 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).BasinHeaterPowerFTempDiff > 0.0) {
    1085            0 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).BasinHeaterSetPointTemp < 2.0) {
    1086            0 :                     ShowWarningError(state,
    1087            0 :                                      format("{}{}=\"{}\", freeze possible",
    1088              :                                             RoutineName,
    1089              :                                             CurrentModuleObject,
    1090            0 :                                             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    1091            0 :                     ShowContinueError(state, format("...{} is < 2 {{C}}. Freezing could occur.", cNumericFields(15)));
    1092            0 :                     ShowContinueError(state, format("...entered value=[{:.2T}].", NumArray(15)));
    1093              :                 }
    1094              :             }
    1095              : 
    1096           38 :             if (lAlphaBlanks(10)) {
    1097              :                 // Should this be ScheduleAlwaysOff?
    1098            0 :             } else if ((state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).basinHeaterSched = Sched::GetSchedule(state, AlphArray(10))) ==
    1099              :                        nullptr) {
    1100            0 :                 ShowWarningItemNotFound(
    1101            0 :                     state, eoh, cAlphaFields(10), AlphArray(10), "Basin heater will be available to operate throughout the simulation.");
    1102              :             }
    1103              : 
    1104          234 :             for (int I = 1; I <= state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds; ++I) {
    1105          196 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(I) = NumArray(16 + (I - 1) * 8);
    1106          196 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedSHR(I) = NumArray(17 + (I - 1) * 8);
    1107          196 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedCOP(I) = NumArray(18 + (I - 1) * 8);
    1108          196 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirVolFlowRate(I) = NumArray(19 + (I - 1) * 8);
    1109          196 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedEvaporatorFanPowerPerVolumeFlowRate2017(I) = NumArray(20 + (I - 1) * 8);
    1110          196 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedEvaporatorFanPowerPerVolumeFlowRate2023(I) = NumArray(21 + (I - 1) * 8);
    1111          196 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapCondAirFlow(I) = NumArray(22 + (I - 1) * 8);
    1112          196 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapCondEffect(I) = NumArray(23 + (I - 1) * 8);
    1113          392 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapCondEffect(I) < 0.0 ||
    1114          196 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapCondEffect(I) > 1.0) {
    1115            0 :                     ShowSevereError(
    1116              :                         state,
    1117            0 :                         format("{}{}=\"{}\", invalid", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    1118            0 :                     ShowContinueError(state, format("...{} cannot be < 0.0 or > 1.0.", cNumericFields(23 + (I - 1) * 8)));
    1119            0 :                     ShowContinueError(state, format("...entered value=[{:.2T}].", NumArray(23 + (I - 1) * 8)));
    1120            0 :                     ErrorsFound = true;
    1121              :                 }
    1122              : 
    1123          196 :                 AlfaFieldIncre = 11 + (I - 1) * 4;
    1124          196 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(I) =
    1125          196 :                     Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
    1126          196 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(I) == 0) {
    1127            0 :                     if (lAlphaBlanks(AlfaFieldIncre)) {
    1128            0 :                         ShowSevereError(state,
    1129            0 :                                         format("{}{}=\"{}\", missing",
    1130              :                                                RoutineName,
    1131              :                                                CurrentModuleObject,
    1132            0 :                                                state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    1133            0 :                         ShowContinueError(state, format("...required {} is blank.", cAlphaFields(AlfaFieldIncre)));
    1134              :                     } else {
    1135            0 :                         ShowSevereError(state,
    1136            0 :                                         format("{}{}=\"{}\", invalid",
    1137              :                                                RoutineName,
    1138              :                                                CurrentModuleObject,
    1139            0 :                                                state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    1140            0 :                         ShowContinueError(state, format("...not found {}=\"{}\".", cAlphaFields(AlfaFieldIncre), AlphArray(AlfaFieldIncre)));
    1141              :                     }
    1142            0 :                     ErrorsFound = true;
    1143              :                 } else {
    1144              :                     // Verify Curve Object, only legal type is BiQuadratic
    1145          588 :                     ErrorsFound |= Curve::CheckCurveDims(state,
    1146          196 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(I), // Curve index
    1147              :                                                          {2},                                                                  // Valid dimensions
    1148              :                                                          RoutineName,                                                          // Routine name
    1149              :                                                          CurrentModuleObject,                                                  // Object Type
    1150          196 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,           // Object Name
    1151          196 :                                                          cAlphaFields(AlfaFieldIncre));                                        // Field Name
    1152              : 
    1153          196 :                     if (!ErrorsFound) {
    1154          392 :                         CurveVal = Curve::CurveValue(
    1155          196 :                             state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(I), RatedInletWetBulbTemp, RatedAmbAirTemp);
    1156          196 :                         if (CurveVal > 1.10 || CurveVal < 0.90) {
    1157            4 :                             ShowWarningError(state,
    1158            4 :                                              format("{}{}=\"{}\", curve values",
    1159              :                                                     RoutineName,
    1160              :                                                     CurrentModuleObject,
    1161            2 :                                                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    1162            4 :                             ShowContinueError(
    1163            4 :                                 state, format("...{} output is not equal to 1.0 (+ or - 10%) at rated conditions.", cAlphaFields(AlfaFieldIncre)));
    1164            2 :                             ShowContinueError(state, format("...Curve output at rated conditions = {:.3T}", CurveVal));
    1165              :                         }
    1166              :                     }
    1167              :                 }
    1168              : 
    1169          196 :                 AlfaFieldIncre = 12 + (I - 1) * 4;
    1170          196 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(I) =
    1171          196 :                     Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
    1172          196 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(I) == 0) {
    1173            0 :                     if (lAlphaBlanks(AlfaFieldIncre)) {
    1174            0 :                         ShowSevereError(state,
    1175            0 :                                         format("{}{}=\"{}\", missing",
    1176              :                                                RoutineName,
    1177              :                                                CurrentModuleObject,
    1178            0 :                                                state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    1179            0 :                         ShowContinueError(state, format("...required {} is blank.", cAlphaFields(AlfaFieldIncre)));
    1180              :                     } else {
    1181            0 :                         ShowSevereError(state,
    1182            0 :                                         format("{}{}=\"{}\", invalid",
    1183              :                                                RoutineName,
    1184              :                                                CurrentModuleObject,
    1185            0 :                                                state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    1186            0 :                         ShowContinueError(state, format("...not found {}=\"{}\".", cAlphaFields(AlfaFieldIncre), AlphArray(AlfaFieldIncre)));
    1187              :                     }
    1188            0 :                     ErrorsFound = true;
    1189              :                 } else {
    1190              :                     // Verify Curve Object, only legal type is Quadratic
    1191          588 :                     ErrorsFound |= Curve::CheckCurveDims(state,
    1192          196 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(I), // Curve index
    1193              :                                                          {1},                                                                     // Valid dimensions
    1194              :                                                          RoutineName,                                                             // Routine name
    1195              :                                                          CurrentModuleObject,                                                     // Object Type
    1196          196 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,              // Object Name
    1197          196 :                                                          cAlphaFields(AlfaFieldIncre));                                           // Field Name
    1198              : 
    1199          196 :                     if (!ErrorsFound) {
    1200          196 :                         CurveVal = Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(I), 1.0);
    1201          196 :                         if (CurveVal > 1.10 || CurveVal < 0.90) {
    1202            0 :                             ShowWarningError(state,
    1203            0 :                                              format("{}{}=\"{}\", curve values",
    1204              :                                                     RoutineName,
    1205              :                                                     CurrentModuleObject,
    1206            0 :                                                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    1207            0 :                             ShowContinueError(
    1208            0 :                                 state, format("...{} output is not equal to 1.0 (+ or - 10%) at rated conditions.", cAlphaFields(AlfaFieldIncre)));
    1209            0 :                             ShowContinueError(state, format("...Curve output at rated conditions = {:.3T}", CurveVal));
    1210              :                         }
    1211              :                     }
    1212              :                 }
    1213              : 
    1214          196 :                 AlfaFieldIncre = 13 + (I - 1) * 4;
    1215          196 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(I) =
    1216          196 :                     Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
    1217          196 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(I) == 0) {
    1218            0 :                     if (lAlphaBlanks(AlfaFieldIncre)) {
    1219            0 :                         ShowSevereError(state,
    1220            0 :                                         format("{}{}=\"{}\", missing",
    1221              :                                                RoutineName,
    1222              :                                                CurrentModuleObject,
    1223            0 :                                                state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    1224            0 :                         ShowContinueError(state, format("...required {} is blank.", cAlphaFields(AlfaFieldIncre)));
    1225              :                     } else {
    1226            0 :                         ShowSevereError(state,
    1227            0 :                                         format("{}{}=\"{}\", invalid",
    1228              :                                                RoutineName,
    1229              :                                                CurrentModuleObject,
    1230            0 :                                                state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    1231            0 :                         ShowContinueError(state, format("...not found {}=\"{}\".", cAlphaFields(AlfaFieldIncre), AlphArray(AlfaFieldIncre)));
    1232              :                     }
    1233            0 :                     ErrorsFound = true;
    1234              :                 } else {
    1235              :                     // Verify Curve Object, only legal type is BiQuadratic
    1236          588 :                     ErrorsFound |= Curve::CheckCurveDims(state,
    1237          196 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(I), // Curve index
    1238              :                                                          {2},                                                                 // Valid dimensions
    1239              :                                                          RoutineName,                                                         // Routine name
    1240              :                                                          CurrentModuleObject,                                                 // Object Type
    1241          196 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,          // Object Name
    1242          196 :                                                          cAlphaFields(AlfaFieldIncre));                                       // Field Name
    1243              : 
    1244          196 :                     if (!ErrorsFound) {
    1245          392 :                         CurveVal = Curve::CurveValue(
    1246          196 :                             state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(I), RatedInletWetBulbTemp, RatedAmbAirTemp);
    1247          196 :                         if (CurveVal > 1.10 || CurveVal < 0.90) {
    1248            4 :                             ShowWarningError(state,
    1249            4 :                                              format("{}{}=\"{}\", curve values",
    1250              :                                                     RoutineName,
    1251              :                                                     CurrentModuleObject,
    1252            2 :                                                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    1253            4 :                             ShowContinueError(
    1254            4 :                                 state, format("...{} output is not equal to 1.0 (+ or - 10%) at rated conditions.", cAlphaFields(AlfaFieldIncre)));
    1255            2 :                             ShowContinueError(state, format("...Curve output at rated conditions = {:.3T}", CurveVal));
    1256              :                         }
    1257              :                     }
    1258              :                 }
    1259              : 
    1260          196 :                 AlfaFieldIncre = 14 + (I - 1) * 4;
    1261          196 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(I) =
    1262          196 :                     Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
    1263          196 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(I) == 0) {
    1264            0 :                     if (lAlphaBlanks(AlfaFieldIncre)) {
    1265            0 :                         ShowSevereError(state,
    1266            0 :                                         format("{}{}=\"{}\", missing",
    1267              :                                                RoutineName,
    1268              :                                                CurrentModuleObject,
    1269            0 :                                                state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    1270            0 :                         ShowContinueError(state, format("...required {} is blank.", cAlphaFields(AlfaFieldIncre)));
    1271              :                     } else {
    1272            0 :                         ShowSevereError(state,
    1273            0 :                                         format("{}{}=\"{}\", invalid",
    1274              :                                                RoutineName,
    1275              :                                                CurrentModuleObject,
    1276            0 :                                                state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    1277            0 :                         ShowContinueError(state, format("...not found {}=\"{}\".", cAlphaFields(AlfaFieldIncre), AlphArray(AlfaFieldIncre)));
    1278              :                     }
    1279            0 :                     ErrorsFound = true;
    1280              :                 } else {
    1281              :                     // Verify Curve Object, only legal type is Quadratic
    1282          588 :                     ErrorsFound |= Curve::CheckCurveDims(state,
    1283          196 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(I), // Curve index
    1284              :                                                          {1},                                                                    // Valid dimensions
    1285              :                                                          RoutineName,                                                            // Routine name
    1286              :                                                          CurrentModuleObject,                                                    // Object Type
    1287          196 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,             // Object Name
    1288          196 :                                                          cAlphaFields(AlfaFieldIncre));                                          // Field Name
    1289              : 
    1290          196 :                     if (!ErrorsFound) {
    1291          196 :                         CurveVal = Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(I), 1.0);
    1292          196 :                         if (CurveVal > 1.10 || CurveVal < 0.90) {
    1293            0 :                             ShowWarningError(state,
    1294            0 :                                              format("{}{}=\"{}\", curve values",
    1295              :                                                     RoutineName,
    1296              :                                                     CurrentModuleObject,
    1297            0 :                                                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    1298            0 :                             ShowContinueError(
    1299            0 :                                 state, format("...{} output is not equal to 1.0 (+ or - 10%) at rated conditions.", cAlphaFields(AlfaFieldIncre)));
    1300            0 :                             ShowContinueError(state, format("...Curve output at rated conditions = {:.3T}", CurveVal));
    1301              :                         }
    1302              :                     }
    1303              :                 }
    1304              :             }
    1305              : 
    1306          234 :             for (int I = 1; I <= state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds; ++I) {
    1307          196 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedPercentTotCap(I) =
    1308          196 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(I) /
    1309          392 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(
    1310          196 :                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds);
    1311          196 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirVolFlowPerRatedTotCap(I) =
    1312          196 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirVolFlowRate(I) /
    1313          196 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(I);
    1314          196 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedEvapCondVolFlowPerRatedTotCap(I) =
    1315          196 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapCondAirFlow(I) /
    1316          196 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(I);
    1317              :             }
    1318              : 
    1319              :             // CurrentModuleObject = "Coil:Cooling:DX:VariableSpeed"
    1320           76 :             SetupOutputVariable(state,
    1321              :                                 "Cooling Coil Electricity Energy",
    1322              :                                 Constant::Units::J,
    1323           38 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Energy,
    1324              :                                 OutputProcessor::TimeStepType::System,
    1325              :                                 OutputProcessor::StoreType::Sum,
    1326           38 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
    1327              :                                 Constant::eResource::Electricity,
    1328              :                                 OutputProcessor::Group::HVAC,
    1329              :                                 OutputProcessor::EndUseCat::Cooling);
    1330           76 :             SetupOutputVariable(state,
    1331              :                                 "Cooling Coil Total Cooling Energy",
    1332              :                                 Constant::Units::J,
    1333           38 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergyLoadTotal,
    1334              :                                 OutputProcessor::TimeStepType::System,
    1335              :                                 OutputProcessor::StoreType::Sum,
    1336           38 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
    1337              :                                 Constant::eResource::EnergyTransfer,
    1338              :                                 OutputProcessor::Group::HVAC,
    1339              :                                 OutputProcessor::EndUseCat::CoolingCoils);
    1340           76 :             SetupOutputVariable(state,
    1341              :                                 "Cooling Coil Sensible Cooling Energy",
    1342              :                                 Constant::Units::J,
    1343           38 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergySensible,
    1344              :                                 OutputProcessor::TimeStepType::System,
    1345              :                                 OutputProcessor::StoreType::Sum,
    1346           38 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    1347           76 :             SetupOutputVariable(state,
    1348              :                                 "Cooling Coil Latent Cooling Energy",
    1349              :                                 Constant::Units::J,
    1350           38 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergyLatent,
    1351              :                                 OutputProcessor::TimeStepType::System,
    1352              :                                 OutputProcessor::StoreType::Sum,
    1353           38 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    1354           76 :             SetupOutputVariable(state,
    1355              :                                 "Cooling Coil Source Side Heat Transfer Energy",
    1356              :                                 Constant::Units::J,
    1357           38 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergySource,
    1358              :                                 OutputProcessor::TimeStepType::System,
    1359              :                                 OutputProcessor::StoreType::Sum,
    1360           38 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    1361              : 
    1362           38 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedCapCoolSens =
    1363              :                 DataSizing::AutoSize; // always auto-sized, to be determined in the sizing calculation
    1364              :         }
    1365              : 
    1366              :         //-------------------------AIR SOURCE COOLING---END
    1367              : 
    1368              :         // Get the data for heating coil, WATER SOURCE
    1369           49 :         CurrentModuleObject = "Coil:Heating:WaterToAirHeatPump:VariableSpeedEquationFit";
    1370              : 
    1371           53 :         for (int CoilCounter = 1; CoilCounter <= NumHeat; ++CoilCounter) {
    1372              : 
    1373            4 :             ++DXCoilNum;
    1374              : 
    1375            4 :             state.dataInputProcessing->inputProcessor->getObjectItem(state,
    1376              :                                                                      CurrentModuleObject,
    1377              :                                                                      CoilCounter,
    1378              :                                                                      AlphArray,
    1379              :                                                                      NumAlphas,
    1380              :                                                                      NumArray,
    1381              :                                                                      NumNums,
    1382              :                                                                      IOStat,
    1383              :                                                                      lNumericBlanks,
    1384              :                                                                      lAlphaBlanks,
    1385              :                                                                      cAlphaFields,
    1386              :                                                                      cNumericFields);
    1387              :             // ErrorsFound will be set to True if problem was found, left untouched otherwise
    1388            4 :             GlobalNames::VerifyUniqueCoilName(state, CurrentModuleObject, AlphArray(1), ErrorsFound, CurrentModuleObject + " Name");
    1389              : 
    1390            4 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).bIsDesuperheater = false;
    1391            4 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name = AlphArray(1);
    1392            4 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CoolHeatType = "HEATING";
    1393            4 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType = HVAC::Coil_HeatingWaterToAirHPVSEquationFit; // fix coil type
    1394              : 
    1395            4 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VarSpeedCoilType =
    1396            8 :                 HVAC::cAllCoilTypes(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType);
    1397            4 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds = int(NumArray(1));
    1398            4 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel = int(NumArray(2));
    1399            4 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedCapHeat = NumArray(3);
    1400            4 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedAirVolFlowRate = NumArray(4);
    1401            4 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedWaterVolFlowRate = NumArray(5);
    1402            4 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserType = DataHeatBalance::RefrigCondenserType::Water;
    1403              : 
    1404              :             // Previously set by parent objects, but not user-definable
    1405            4 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MaxONOFFCyclesperHour = 4;
    1406            4 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).LatentCapacityTimeConstant = 0.;
    1407            4 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).FanDelayTime = 0.;
    1408              : 
    1409            4 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterInletNodeNum =
    1410            8 :                 GetOnlySingleNode(state,
    1411            4 :                                   AlphArray(2),
    1412              :                                   ErrorsFound,
    1413              :                                   DataLoopNode::ConnectionObjectType::CoilHeatingWaterToAirHeatPumpVariableSpeedEquationFit,
    1414            4 :                                   AlphArray(1),
    1415              :                                   DataLoopNode::NodeFluidType::Water,
    1416              :                                   DataLoopNode::ConnectionType::Inlet,
    1417              :                                   NodeInputManager::CompFluidStream::Secondary,
    1418              :                                   DataLoopNode::ObjectIsNotParent);
    1419            4 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterOutletNodeNum =
    1420            8 :                 GetOnlySingleNode(state,
    1421            4 :                                   AlphArray(3),
    1422              :                                   ErrorsFound,
    1423              :                                   DataLoopNode::ConnectionObjectType::CoilHeatingWaterToAirHeatPumpVariableSpeedEquationFit,
    1424            4 :                                   AlphArray(1),
    1425              :                                   DataLoopNode::NodeFluidType::Water,
    1426              :                                   DataLoopNode::ConnectionType::Outlet,
    1427              :                                   NodeInputManager::CompFluidStream::Secondary,
    1428              :                                   DataLoopNode::ObjectIsNotParent);
    1429            4 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirInletNodeNum =
    1430            8 :                 GetOnlySingleNode(state,
    1431            4 :                                   AlphArray(4),
    1432              :                                   ErrorsFound,
    1433              :                                   DataLoopNode::ConnectionObjectType::CoilHeatingWaterToAirHeatPumpVariableSpeedEquationFit,
    1434            4 :                                   AlphArray(1),
    1435              :                                   DataLoopNode::NodeFluidType::Air,
    1436              :                                   DataLoopNode::ConnectionType::Inlet,
    1437              :                                   NodeInputManager::CompFluidStream::Primary,
    1438              :                                   DataLoopNode::ObjectIsNotParent);
    1439            4 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirOutletNodeNum =
    1440           12 :                 GetOnlySingleNode(state,
    1441            4 :                                   AlphArray(5),
    1442              :                                   ErrorsFound,
    1443              :                                   DataLoopNode::ConnectionObjectType::CoilHeatingWaterToAirHeatPumpVariableSpeedEquationFit,
    1444            4 :                                   AlphArray(1),
    1445              :                                   DataLoopNode::NodeFluidType::Air,
    1446              :                                   DataLoopNode::ConnectionType::Outlet,
    1447              :                                   NodeInputManager::CompFluidStream::Primary,
    1448              :                                   DataLoopNode::ObjectIsNotParent);
    1449              : 
    1450            8 :             BranchNodeConnections::TestCompSet(state, CurrentModuleObject, AlphArray(1), AlphArray(2), AlphArray(3), "Water Nodes");
    1451            4 :             BranchNodeConnections::TestCompSet(state, CurrentModuleObject, AlphArray(1), AlphArray(4), AlphArray(5), "Air Nodes");
    1452              : 
    1453              :             //       If (VarSpeedCoil(DXCoilNum)%NumOfSpeeds .LT. 2) Then
    1454            4 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds < 1) {
    1455            0 :                 ShowSevereError(
    1456              :                     state,
    1457            0 :                     format("{}{}=\"{}\", invalid", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    1458            0 :                 ShowContinueError(state, format("...{} must be >= 1. entered number is {:.0T}", cNumericFields(1), NumArray(1)));
    1459            0 :                 ErrorsFound = true;
    1460              :             }
    1461              : 
    1462            4 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel >
    1463            4 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds) {
    1464            0 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel =
    1465            0 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds;
    1466              :             }
    1467              : 
    1468            4 :             if ((state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel >
    1469            8 :                  state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds) ||
    1470            4 :                 (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel <= 0)) {
    1471            0 :                 ShowSevereError(
    1472              :                     state,
    1473            0 :                     format("{}{}=\"{}\", invalid", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    1474            0 :                 ShowContinueError(state, format("...{} must be valid speed level entered number is {:.0T}", cNumericFields(2), NumArray(2)));
    1475            0 :                 ErrorsFound = true;
    1476              :             }
    1477              : 
    1478              :             // part load curve
    1479            4 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PLFFPLR = Curve::GetCurveIndex(state, AlphArray(6)); // convert curve name to number
    1480            4 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PLFFPLR == 0) {
    1481            0 :                 if (lAlphaBlanks(6)) {
    1482            0 :                     ShowSevereError(
    1483              :                         state,
    1484            0 :                         format("{}{}=\"{}\", missing", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    1485            0 :                     ShowContinueError(state, format("...required {} is blank.", cAlphaFields(6)));
    1486              :                 } else {
    1487            0 :                     ShowSevereError(
    1488              :                         state,
    1489            0 :                         format("{}{}=\"{}\", invalid", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    1490            0 :                     ShowContinueError(state, format("...not found {}=\"{}\".", cAlphaFields(6), AlphArray(6)));
    1491              :                 }
    1492            0 :                 ErrorsFound = true;
    1493              :             } else {
    1494            4 :                 CurveVal = Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PLFFPLR, 1.0);
    1495            4 :                 if (CurveVal > 1.10 || CurveVal < 0.90) {
    1496            0 :                     ShowWarningError(state,
    1497            0 :                                      format("{}{}=\"{}\", curve values",
    1498              :                                             RoutineName,
    1499              :                                             CurrentModuleObject,
    1500            0 :                                             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    1501            0 :                     ShowContinueError(state, format("...{} output is not equal to 1.0 (+ or - 10%) at rated conditions.", cAlphaFields(6)));
    1502            0 :                     ShowContinueError(state, format("...Curve output at rated conditions = {:.3T}", CurveVal));
    1503              :                 }
    1504              :             }
    1505              : 
    1506           42 :             for (int I = 1; I <= state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds; ++I) {
    1507           38 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(I) = NumArray(6 + (I - 1) * 5);
    1508           38 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedCOP(I) = NumArray(7 + (I - 1) * 5);
    1509           38 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirVolFlowRate(I) = NumArray(8 + (I - 1) * 5);
    1510           38 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedWaterVolFlowRate(I) = NumArray(9 + (I - 1) * 5);
    1511           38 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWasteHeatFrac(I) = NumArray(10 + (I - 1) * 5);
    1512              : 
    1513           38 :                 AlfaFieldIncre = 7 + (I - 1) * 7;
    1514           38 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(I) =
    1515           38 :                     Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
    1516           38 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(I) == 0) {
    1517            0 :                     if (lAlphaBlanks(AlfaFieldIncre)) {
    1518            0 :                         ShowSevereError(state,
    1519            0 :                                         format("{}{}=\"{}\", missing",
    1520              :                                                RoutineName,
    1521              :                                                CurrentModuleObject,
    1522            0 :                                                state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    1523            0 :                         ShowContinueError(state, format("...required {} is blank.", cAlphaFields(AlfaFieldIncre)));
    1524              :                     } else {
    1525            0 :                         ShowSevereError(state,
    1526            0 :                                         format("{}{}=\"{}\", invalid",
    1527              :                                                RoutineName,
    1528              :                                                CurrentModuleObject,
    1529            0 :                                                state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    1530            0 :                         ShowContinueError(state, format("...not found {}=\"{}\".", cAlphaFields(AlfaFieldIncre), AlphArray(AlfaFieldIncre)));
    1531              :                     }
    1532            0 :                     ErrorsFound = true;
    1533              :                 } else {
    1534              :                     // Verify Curve Object, only legal type is BiQuadratic
    1535          114 :                     ErrorsFound |= Curve::CheckCurveDims(state,
    1536           38 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(I), // Curve index
    1537              :                                                          {2},                                                                  // Valid dimensions
    1538              :                                                          RoutineName,                                                          // Routine name
    1539              :                                                          CurrentModuleObject,                                                  // Object Type
    1540           38 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,           // Object Name
    1541           38 :                                                          cAlphaFields(AlfaFieldIncre));                                        // Field Name
    1542              : 
    1543           38 :                     if (!ErrorsFound) {
    1544           76 :                         CurveVal = Curve::CurveValue(state,
    1545           38 :                                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(I),
    1546              :                                                      RatedInletAirTempHeat,
    1547              :                                                      RatedInletWaterTempHeat);
    1548           38 :                         if (CurveVal > 1.10 || CurveVal < 0.90) {
    1549            0 :                             ShowWarningError(state,
    1550            0 :                                              format("{}{}=\"{}\", curve values",
    1551              :                                                     RoutineName,
    1552              :                                                     CurrentModuleObject,
    1553            0 :                                                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    1554            0 :                             ShowContinueError(
    1555            0 :                                 state, format("...{} output is not equal to 1.0 (+ or - 10%) at rated conditions.", cAlphaFields(AlfaFieldIncre)));
    1556            0 :                             ShowContinueError(state, format("...Curve output at rated conditions = {:.3T}", CurveVal));
    1557              :                         }
    1558              :                     }
    1559              :                 }
    1560              : 
    1561           38 :                 AlfaFieldIncre = 8 + (I - 1) * 7;
    1562           38 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(I) =
    1563           38 :                     Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
    1564           38 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(I) == 0) {
    1565            0 :                     if (lAlphaBlanks(AlfaFieldIncre)) {
    1566            0 :                         ShowSevereError(state,
    1567            0 :                                         format("{}{}=\"{}\", missing",
    1568              :                                                RoutineName,
    1569              :                                                CurrentModuleObject,
    1570            0 :                                                state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    1571            0 :                         ShowContinueError(state, format("...required {} is blank.", cAlphaFields(AlfaFieldIncre)));
    1572              :                     } else {
    1573            0 :                         ShowSevereError(state,
    1574            0 :                                         format("{}{}=\"{}\", invalid",
    1575              :                                                RoutineName,
    1576              :                                                CurrentModuleObject,
    1577            0 :                                                state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    1578            0 :                         ShowContinueError(state, format("...not found {}=\"{}\".", cAlphaFields(AlfaFieldIncre), AlphArray(AlfaFieldIncre)));
    1579              :                     }
    1580            0 :                     ErrorsFound = true;
    1581              :                 } else {
    1582              :                     // Verify Curve Object, only legal type is Quadratic
    1583          114 :                     ErrorsFound |= Curve::CheckCurveDims(state,
    1584           38 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(I), // Curve index
    1585              :                                                          {1},                                                                     // Valid dimensions
    1586              :                                                          RoutineName,                                                             // Routine name
    1587              :                                                          CurrentModuleObject,                                                     // Object Type
    1588           38 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,              // Object Name
    1589           38 :                                                          cAlphaFields(AlfaFieldIncre));                                           // Field Name
    1590              : 
    1591           38 :                     if (!ErrorsFound) {
    1592           38 :                         CurveVal = Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(I), 1.0);
    1593           38 :                         if (CurveVal > 1.10 || CurveVal < 0.90) {
    1594            0 :                             ShowWarningError(state,
    1595            0 :                                              format("{}{}=\"{}\", curve values",
    1596              :                                                     RoutineName,
    1597              :                                                     CurrentModuleObject,
    1598            0 :                                                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    1599            0 :                             ShowContinueError(
    1600            0 :                                 state, format("...{} output is not equal to 1.0 (+ or - 10%) at rated conditions.", cAlphaFields(AlfaFieldIncre)));
    1601            0 :                             ShowContinueError(state, format("...Curve output at rated conditions = {:.3T}", CurveVal));
    1602              :                         }
    1603              :                     }
    1604              :                 }
    1605              : 
    1606           38 :                 AlfaFieldIncre = 9 + (I - 1) * 7;
    1607           38 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapWaterFFlow(I) =
    1608           38 :                     Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
    1609           38 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapWaterFFlow(I) == 0) {
    1610            0 :                     if (lAlphaBlanks(AlfaFieldIncre)) {
    1611            0 :                         ShowSevereError(state,
    1612            0 :                                         format("{}{}=\"{}\", missing",
    1613              :                                                RoutineName,
    1614              :                                                CurrentModuleObject,
    1615            0 :                                                state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    1616            0 :                         ShowContinueError(state, format("...required {} is blank.", cAlphaFields(AlfaFieldIncre)));
    1617              :                     } else {
    1618            0 :                         ShowSevereError(state,
    1619            0 :                                         format("{}{}=\"{}\", invalid",
    1620              :                                                RoutineName,
    1621              :                                                CurrentModuleObject,
    1622            0 :                                                state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    1623            0 :                         ShowContinueError(state, format("...not found {}=\"{}\".", cAlphaFields(AlfaFieldIncre), AlphArray(AlfaFieldIncre)));
    1624              :                     }
    1625            0 :                     ErrorsFound = true;
    1626              :                 } else {
    1627              :                     // Verify Curve Object, only legal type is Quadratic
    1628          114 :                     ErrorsFound |= Curve::CheckCurveDims(state,
    1629           38 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapWaterFFlow(I), // Curve index
    1630              :                                                          {1},                                                        // Valid dimensions
    1631              :                                                          RoutineName,                                                // Routine name
    1632              :                                                          CurrentModuleObject,                                        // Object Type
    1633           38 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name, // Object Name
    1634           38 :                                                          cAlphaFields(AlfaFieldIncre));                              // Field Name
    1635              : 
    1636           38 :                     if (!ErrorsFound) {
    1637           38 :                         CurveVal = Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapWaterFFlow(I), 1.0);
    1638           38 :                         if (CurveVal > 1.10 || CurveVal < 0.90) {
    1639            0 :                             ShowWarningError(state,
    1640            0 :                                              format("{}{}=\"{}\", curve values",
    1641              :                                                     RoutineName,
    1642              :                                                     CurrentModuleObject,
    1643            0 :                                                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    1644            0 :                             ShowContinueError(
    1645            0 :                                 state, format("...{} output is not equal to 1.0 (+ or - 10%) at rated conditions.", cAlphaFields(AlfaFieldIncre)));
    1646            0 :                             ShowContinueError(state, format("...Curve output at rated conditions = {:.3T}", CurveVal));
    1647              :                         }
    1648              :                     }
    1649              :                 }
    1650              : 
    1651           38 :                 AlfaFieldIncre = 10 + (I - 1) * 7;
    1652           38 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(I) =
    1653           38 :                     Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
    1654           38 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(I) == 0) {
    1655            0 :                     if (lAlphaBlanks(AlfaFieldIncre)) {
    1656            0 :                         ShowSevereError(state,
    1657            0 :                                         format("{}{}=\"{}\", missing",
    1658              :                                                RoutineName,
    1659              :                                                CurrentModuleObject,
    1660            0 :                                                state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    1661            0 :                         ShowContinueError(state, format("...required {} is blank.", cAlphaFields(AlfaFieldIncre)));
    1662              :                     } else {
    1663            0 :                         ShowSevereError(state,
    1664            0 :                                         format("{}{}=\"{}\", invalid",
    1665              :                                                RoutineName,
    1666              :                                                CurrentModuleObject,
    1667            0 :                                                state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    1668            0 :                         ShowContinueError(state, format("...not found {}=\"{}\".", cAlphaFields(AlfaFieldIncre), AlphArray(AlfaFieldIncre)));
    1669              :                     }
    1670            0 :                     ErrorsFound = true;
    1671              :                 } else {
    1672              :                     // Verify Curve Object, only legal type is BiQuadratic
    1673          114 :                     ErrorsFound |= Curve::CheckCurveDims(state,
    1674           38 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(I), // Curve index
    1675              :                                                          {2},                                                                 // Valid dimensions
    1676              :                                                          RoutineName,                                                         // Routine name
    1677              :                                                          CurrentModuleObject,                                                 // Object Type
    1678           38 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,          // Object Name
    1679           38 :                                                          cAlphaFields(AlfaFieldIncre));                                       // Field Name
    1680              : 
    1681           38 :                     if (!ErrorsFound) {
    1682           76 :                         CurveVal = Curve::CurveValue(state,
    1683           38 :                                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(I),
    1684              :                                                      RatedInletAirTempHeat,
    1685              :                                                      RatedInletWaterTempHeat);
    1686           38 :                         if (CurveVal > 1.10 || CurveVal < 0.90) {
    1687            0 :                             ShowWarningError(state,
    1688            0 :                                              format("{}{}=\"{}\", curve values",
    1689              :                                                     RoutineName,
    1690              :                                                     CurrentModuleObject,
    1691            0 :                                                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    1692            0 :                             ShowContinueError(
    1693            0 :                                 state, format("...{} output is not equal to 1.0 (+ or - 10%) at rated conditions.", cAlphaFields(AlfaFieldIncre)));
    1694            0 :                             ShowContinueError(state, format("...Curve output at rated conditions = {:.3T}", CurveVal));
    1695              :                         }
    1696              :                     }
    1697              :                 }
    1698              : 
    1699           38 :                 AlfaFieldIncre = 11 + (I - 1) * 7;
    1700           38 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(I) =
    1701           38 :                     Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
    1702           38 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(I) == 0) {
    1703            0 :                     if (lAlphaBlanks(AlfaFieldIncre)) {
    1704            0 :                         ShowSevereError(state,
    1705            0 :                                         format("{}{}=\"{}\", missing",
    1706              :                                                RoutineName,
    1707              :                                                CurrentModuleObject,
    1708            0 :                                                state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    1709            0 :                         ShowContinueError(state, format("...required {} is blank.", cAlphaFields(AlfaFieldIncre)));
    1710              :                     } else {
    1711            0 :                         ShowSevereError(state,
    1712            0 :                                         format("{}{}=\"{}\", invalid",
    1713              :                                                RoutineName,
    1714              :                                                CurrentModuleObject,
    1715            0 :                                                state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    1716            0 :                         ShowContinueError(state, format("...not found {}=\"{}\".", cAlphaFields(AlfaFieldIncre), AlphArray(AlfaFieldIncre)));
    1717              :                     }
    1718            0 :                     ErrorsFound = true;
    1719              :                 } else {
    1720              :                     // Verify Curve Object, only legal type is Quadratic
    1721          114 :                     ErrorsFound |= Curve::CheckCurveDims(state,
    1722           38 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(I), // Curve index
    1723              :                                                          {1},                                                                    // Valid dimensions
    1724              :                                                          RoutineName,                                                            // Routine name
    1725              :                                                          CurrentModuleObject,                                                    // Object Type
    1726           38 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,             // Object Name
    1727           38 :                                                          cAlphaFields(AlfaFieldIncre));                                          // Field Name
    1728              : 
    1729           38 :                     if (!ErrorsFound) {
    1730           38 :                         CurveVal = Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(I), 1.0);
    1731           38 :                         if (CurveVal > 1.10 || CurveVal < 0.90) {
    1732            0 :                             ShowWarningError(state,
    1733            0 :                                              format("{}{}=\"{}\", curve values",
    1734              :                                                     RoutineName,
    1735              :                                                     CurrentModuleObject,
    1736            0 :                                                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    1737            0 :                             ShowContinueError(
    1738            0 :                                 state, format("...{} output is not equal to 1.0 (+ or - 10%) at rated conditions.", cAlphaFields(AlfaFieldIncre)));
    1739            0 :                             ShowContinueError(state, format("...Curve output at rated conditions = {:.3T}", CurveVal));
    1740              :                         }
    1741              :                     }
    1742              :                 }
    1743              : 
    1744           38 :                 AlfaFieldIncre = 12 + (I - 1) * 7;
    1745           38 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRWaterFFlow(I) =
    1746           38 :                     Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
    1747           38 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRWaterFFlow(I) == 0) {
    1748            0 :                     if (lAlphaBlanks(AlfaFieldIncre)) {
    1749            0 :                         ShowSevereError(state,
    1750            0 :                                         format("{}{}=\"{}\", missing",
    1751              :                                                RoutineName,
    1752              :                                                CurrentModuleObject,
    1753            0 :                                                state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    1754            0 :                         ShowContinueError(state, format("...required {} is blank.", cAlphaFields(AlfaFieldIncre)));
    1755              :                     } else {
    1756            0 :                         ShowSevereError(state,
    1757            0 :                                         format("{}{}=\"{}\", invalid",
    1758              :                                                RoutineName,
    1759              :                                                CurrentModuleObject,
    1760            0 :                                                state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    1761            0 :                         ShowContinueError(state, format("...not found {}=\"{}\".", cAlphaFields(AlfaFieldIncre), AlphArray(AlfaFieldIncre)));
    1762              :                     }
    1763            0 :                     ErrorsFound = true;
    1764              :                 } else {
    1765              :                     // Verify Curve Object, only legal type is Quadratic
    1766          114 :                     ErrorsFound |= Curve::CheckCurveDims(state,
    1767           38 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRWaterFFlow(I), // Curve index
    1768              :                                                          {1},                                                                      // Valid dimensions
    1769              :                                                          RoutineName,                                                              // Routine name
    1770              :                                                          CurrentModuleObject,                                                      // Object Type
    1771           38 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,               // Object Name
    1772           38 :                                                          cAlphaFields(AlfaFieldIncre));                                            // Field Name
    1773              : 
    1774           38 :                     if (!ErrorsFound) {
    1775           38 :                         CurveVal = Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRWaterFFlow(I), 1.0);
    1776           38 :                         if (CurveVal > 1.10 || CurveVal < 0.90) {
    1777            0 :                             ShowWarningError(state,
    1778            0 :                                              format("{}{}=\"{}\", curve values",
    1779              :                                                     RoutineName,
    1780              :                                                     CurrentModuleObject,
    1781            0 :                                                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    1782            0 :                             ShowContinueError(
    1783            0 :                                 state, format("...{} output is not equal to 1.0 (+ or - 10%) at rated conditions.", cAlphaFields(AlfaFieldIncre)));
    1784            0 :                             ShowContinueError(state, format("...Curve output at rated conditions = {:.3T}", CurveVal));
    1785              :                         }
    1786              :                     }
    1787              :                 }
    1788              : 
    1789           38 :                 AlfaFieldIncre = 13 + (I - 1) * 7;
    1790              :                 // Read waste heat modifier curve name
    1791           38 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWasteHeat(I) =
    1792           38 :                     Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
    1793           38 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWasteHeat(I) == 0) {
    1794            0 :                     if (lAlphaBlanks(AlfaFieldIncre)) {
    1795            0 :                         ShowSevereError(state,
    1796            0 :                                         format("{}{}=\"{}\", missing",
    1797              :                                                RoutineName,
    1798              :                                                CurrentModuleObject,
    1799            0 :                                                state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    1800            0 :                         ShowContinueError(state, format("...required {} is blank.", cAlphaFields(AlfaFieldIncre)));
    1801              :                     } else {
    1802            0 :                         ShowSevereError(state,
    1803            0 :                                         format("{}{}=\"{}\", invalid",
    1804              :                                                RoutineName,
    1805              :                                                CurrentModuleObject,
    1806            0 :                                                state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    1807            0 :                         ShowContinueError(state, format("...not found {}=\"{}\".", cAlphaFields(AlfaFieldIncre), AlphArray(AlfaFieldIncre)));
    1808              :                     }
    1809            0 :                     ErrorsFound = true;
    1810              :                 } else {
    1811              :                     // Verify Curve Object, only legal types are BiQuadratic
    1812          114 :                     ErrorsFound |= Curve::CheckCurveDims(state,
    1813           38 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWasteHeat(I), // Curve index
    1814              :                                                          {2},                                                                  // Valid dimensions
    1815              :                                                          RoutineName,                                                          // Routine name
    1816              :                                                          CurrentModuleObject,                                                  // Object Type
    1817           38 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,           // Object Name
    1818           38 :                                                          cAlphaFields(AlfaFieldIncre));                                        // Field Name
    1819              : 
    1820           38 :                     if (!ErrorsFound) {
    1821           76 :                         CurveVal = Curve::CurveValue(state,
    1822           38 :                                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWasteHeat(I),
    1823              :                                                      RatedInletAirTempHeat,
    1824              :                                                      RatedInletWaterTempHeat);
    1825           38 :                         if (CurveVal > 1.10 || CurveVal < 0.90) {
    1826            0 :                             ShowWarningError(state,
    1827            0 :                                              format("{}{}=\"{}\", curve values",
    1828              :                                                     RoutineName,
    1829              :                                                     CurrentModuleObject,
    1830            0 :                                                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    1831            0 :                             ShowContinueError(
    1832            0 :                                 state, format("...{} output is not equal to 1.0 (+ or - 10%) at rated conditions.", cAlphaFields(AlfaFieldIncre)));
    1833            0 :                             ShowContinueError(state, format("...Curve output at rated conditions = {:.3T}", CurveVal));
    1834              :                         }
    1835              :                     }
    1836              :                 }
    1837              :             }
    1838              : 
    1839           42 :             for (int I = 1; I <= state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds; ++I) {
    1840           38 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedPercentTotCap(I) =
    1841           38 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(I) /
    1842           76 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(
    1843           38 :                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds);
    1844           38 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirVolFlowPerRatedTotCap(I) =
    1845           38 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirVolFlowRate(I) /
    1846           38 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(I);
    1847           38 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedWaterVolFlowPerRatedTotCap(I) =
    1848           38 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedWaterVolFlowRate(I) /
    1849           38 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(I);
    1850              :             }
    1851              : 
    1852              :             // CurrentModuleObject = "Coil:Heating:WaterToAirHeatPump:VariableSpeedEquationFit"
    1853            8 :             SetupOutputVariable(state,
    1854              :                                 "Heating Coil Electricity Energy",
    1855              :                                 Constant::Units::J,
    1856            4 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Energy,
    1857              :                                 OutputProcessor::TimeStepType::System,
    1858              :                                 OutputProcessor::StoreType::Sum,
    1859            4 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
    1860              :                                 Constant::eResource::Electricity,
    1861              :                                 OutputProcessor::Group::HVAC,
    1862              :                                 OutputProcessor::EndUseCat::Heating);
    1863            8 :             SetupOutputVariable(state,
    1864              :                                 "Heating Coil Heating Energy",
    1865              :                                 Constant::Units::J,
    1866            4 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergyLoadTotal,
    1867              :                                 OutputProcessor::TimeStepType::System,
    1868              :                                 OutputProcessor::StoreType::Sum,
    1869            4 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
    1870              :                                 Constant::eResource::EnergyTransfer,
    1871              :                                 OutputProcessor::Group::HVAC,
    1872              :                                 OutputProcessor::EndUseCat::HeatingCoils);
    1873            8 :             SetupOutputVariable(state,
    1874              :                                 "Heating Coil Source Side Heat Transfer Energy",
    1875              :                                 Constant::Units::J,
    1876            4 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergySource,
    1877              :                                 OutputProcessor::TimeStepType::System,
    1878              :                                 OutputProcessor::StoreType::Sum,
    1879            4 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
    1880              :                                 Constant::eResource::PlantLoopHeatingDemand,
    1881              :                                 OutputProcessor::Group::HVAC,
    1882              :                                 OutputProcessor::EndUseCat::HeatingCoils);
    1883              : 
    1884              :             // create predefined report entries
    1885            8 :             OutputReportPredefined::PreDefTableEntry(
    1886            4 :                 state, state.dataOutRptPredefined->pdchHeatCoilType, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name, CurrentModuleObject);
    1887            8 :             OutputReportPredefined::PreDefTableEntry(state,
    1888            4 :                                                      state.dataOutRptPredefined->pdchHeatCoilNomCap,
    1889            4 :                                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
    1890            4 :                                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedCapHeat);
    1891            8 :             OutputReportPredefined::PreDefTableEntry(state,
    1892            4 :                                                      state.dataOutRptPredefined->pdchHeatCoilNomEff,
    1893            4 :                                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
    1894            8 :                                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedCOP(
    1895            4 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel));
    1896              :         }
    1897              : 
    1898              :         //-------------------------AIR SOURCE, HEATING---BEGIN
    1899              :         // Get the data for heating coil, AIR SOURCE
    1900           49 :         CurrentModuleObject = "COIL:HEATING:DX:VARIABLESPEED";
    1901              : 
    1902           62 :         for (int CoilCounter = 1; CoilCounter <= NumHeatAS; ++CoilCounter) {
    1903              : 
    1904           13 :             ++DXCoilNum;
    1905              : 
    1906           13 :             state.dataInputProcessing->inputProcessor->getObjectItem(state,
    1907              :                                                                      CurrentModuleObject,
    1908              :                                                                      CoilCounter,
    1909              :                                                                      AlphArray,
    1910              :                                                                      NumAlphas,
    1911              :                                                                      NumArray,
    1912              :                                                                      NumNums,
    1913              :                                                                      IOStat,
    1914              :                                                                      lNumericBlanks,
    1915              :                                                                      lAlphaBlanks,
    1916              :                                                                      cAlphaFields,
    1917              :                                                                      cNumericFields);
    1918              :             // ErrorsFound will be set to True if problem was found, left untouched otherwise
    1919           13 :             GlobalNames::VerifyUniqueCoilName(state, CurrentModuleObject, AlphArray(1), ErrorsFound, CurrentModuleObject + " Name");
    1920              : 
    1921           13 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).bIsDesuperheater = false;
    1922           13 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name = AlphArray(1);
    1923           13 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CoolHeatType = "HEATING";
    1924           13 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType = HVAC::Coil_HeatingAirToAirVariableSpeed;
    1925           13 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VarSpeedCoilType = HVAC::cAllCoilTypes(HVAC::Coil_HeatingAirToAirVariableSpeed);
    1926           13 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds = int(NumArray(1));
    1927           13 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel = int(NumArray(2));
    1928           13 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedCapHeat = NumArray(3);
    1929           13 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedAirVolFlowRate = NumArray(4);
    1930              : 
    1931              :             // Previously set by parent objects, but not user-definable
    1932           13 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MaxONOFFCyclesperHour = 4;
    1933           13 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).LatentCapacityTimeConstant = 0.;
    1934           13 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).FanDelayTime = 0.;
    1935              : 
    1936           13 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirInletNodeNum =
    1937           26 :                 GetOnlySingleNode(state,
    1938           13 :                                   AlphArray(2),
    1939              :                                   ErrorsFound,
    1940              :                                   DataLoopNode::ConnectionObjectType::CoilHeatingDXVariableSpeed,
    1941           13 :                                   AlphArray(1),
    1942              :                                   DataLoopNode::NodeFluidType::Air,
    1943              :                                   DataLoopNode::ConnectionType::Inlet,
    1944              :                                   NodeInputManager::CompFluidStream::Primary,
    1945              :                                   DataLoopNode::ObjectIsNotParent);
    1946           13 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirOutletNodeNum =
    1947           39 :                 GetOnlySingleNode(state,
    1948           13 :                                   AlphArray(3),
    1949              :                                   ErrorsFound,
    1950              :                                   DataLoopNode::ConnectionObjectType::CoilHeatingDXVariableSpeed,
    1951           13 :                                   AlphArray(1),
    1952              :                                   DataLoopNode::NodeFluidType::Air,
    1953              :                                   DataLoopNode::ConnectionType::Outlet,
    1954              :                                   NodeInputManager::CompFluidStream::Primary,
    1955              :                                   DataLoopNode::ObjectIsNotParent);
    1956              : 
    1957           13 :             BranchNodeConnections::TestCompSet(state, CurrentModuleObject, AlphArray(1), AlphArray(2), AlphArray(3), "Air Nodes");
    1958              : 
    1959           13 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds < 1) {
    1960            0 :                 ShowSevereError(
    1961              :                     state,
    1962            0 :                     format("{}{}=\"{}\", invalid", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    1963            0 :                 ShowContinueError(state, format("...{} must be >= 1. entered number is {:.0T}", cNumericFields(1), NumArray(1)));
    1964            0 :                 ErrorsFound = true;
    1965              :             }
    1966              : 
    1967           13 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel >
    1968           13 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds) {
    1969            0 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel =
    1970            0 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds;
    1971              :             }
    1972              : 
    1973           13 :             if ((state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel >
    1974           26 :                  state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds) ||
    1975           13 :                 (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel <= 0)) {
    1976            0 :                 ShowSevereError(
    1977              :                     state,
    1978            0 :                     format("{}{}=\"{}\", invalid", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    1979            0 :                 ShowContinueError(state, format("...{} must be valid speed level entered number is {:.0T}", cNumericFields(2), NumArray(2)));
    1980            0 :                 ErrorsFound = true;
    1981              :             }
    1982              : 
    1983              :             // part load curve
    1984           13 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PLFFPLR = Curve::GetCurveIndex(state, AlphArray(4)); // convert curve name to number
    1985           13 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PLFFPLR == 0) {
    1986            0 :                 if (lAlphaBlanks(4)) {
    1987            0 :                     ShowSevereError(
    1988              :                         state,
    1989            0 :                         format("{}{}=\"{}\", missing", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    1990            0 :                     ShowContinueError(state, format("...required {} is blank.", cAlphaFields(4)));
    1991              :                 } else {
    1992            0 :                     ShowSevereError(
    1993              :                         state,
    1994            0 :                         format("{}{}=\"{}\", invalid", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    1995            0 :                     ShowContinueError(state, format("...not found {}=\"{}\".", cAlphaFields(4), AlphArray(4)));
    1996              :                 }
    1997            0 :                 ErrorsFound = true;
    1998              :             } else {
    1999           13 :                 CurveVal = Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PLFFPLR, 1.0);
    2000           13 :                 if (CurveVal > 1.10 || CurveVal < 0.90) {
    2001            4 :                     ShowWarningError(state,
    2002            4 :                                      format("{}{}=\"{}\", curve values",
    2003              :                                             RoutineName,
    2004              :                                             CurrentModuleObject,
    2005            2 :                                             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    2006            2 :                     ShowContinueError(state, format("...{} output is not equal to 1.0 (+ or - 10%) at rated conditions.", cAlphaFields(4)));
    2007            2 :                     ShowContinueError(state, format("...Curve output at rated conditions = {:.3T}", CurveVal));
    2008              :                 }
    2009              :             }
    2010              : 
    2011           13 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostEIRFT =
    2012           13 :                 Curve::GetCurveIndex(state, AlphArray(5)); // convert curve name to number
    2013              : 
    2014           13 :             if (!lAlphaBlanks(6)) {
    2015            2 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterCapacityCurveIndex = Curve::GetCurveIndex(state, AlphArray(6));
    2016              : 
    2017            2 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterCapacityCurveIndex == 0) { // can't find the curve
    2018            0 :                     ShowSevereError(state,
    2019            0 :                                     format("{} = {}:  {} not found = {}",
    2020              :                                            CurrentModuleObject,
    2021            0 :                                            state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
    2022              :                                            cAlphaFields(6),
    2023              :                                            AlphArray(6)));
    2024            0 :                     ErrorsFound = true;
    2025              :                 } else {
    2026            2 :                     ErrorsFound |=
    2027            8 :                         Curve::CheckCurveDims(state,
    2028            2 :                                               state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterCapacityCurveIndex, // Curve index
    2029              :                                               {1},                                                        // Valid dimensions
    2030              :                                               RoutineName,                                                // Routine name
    2031              :                                               CurrentModuleObject,                                        // Object Type
    2032            2 :                                               state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name, // Object Name
    2033            2 :                                               cAlphaFields(6));                                           // Field Name
    2034              :                 }
    2035              :             }
    2036              : 
    2037           13 :             if (Util::SameString(AlphArray(7), "ReverseCycle")) {
    2038            0 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostEIRFT == 0) {
    2039            0 :                     if (lAlphaBlanks(5)) {
    2040            0 :                         ShowSevereError(state,
    2041            0 :                                         format("{}{}=\"{}\", missing",
    2042              :                                                RoutineName,
    2043              :                                                CurrentModuleObject,
    2044            0 :                                                state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    2045            0 :                         ShowContinueError(state, format("...required {} is blank.", cAlphaFields(5)));
    2046            0 :                         ShowContinueError(state, format("...field is required because {} is \"ReverseCycle\".", cAlphaFields(7)));
    2047              :                     } else {
    2048            0 :                         ShowSevereError(state,
    2049            0 :                                         format("{}{}=\"{}\", invalid",
    2050              :                                                RoutineName,
    2051              :                                                CurrentModuleObject,
    2052            0 :                                                state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    2053            0 :                         ShowContinueError(state, format("...not found {}=\"{}\".", cAlphaFields(5), AlphArray(5)));
    2054              :                     }
    2055            0 :                     ErrorsFound = true;
    2056              :                 } else {
    2057              :                     // Verify Curve Object, only legal type is BiQuadratic
    2058            0 :                     ErrorsFound |= Curve::CheckCurveDims(state,
    2059            0 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostEIRFT, // Curve index
    2060              :                                                          {2},                                                                // Valid dimensions
    2061              :                                                          RoutineName,                                                        // Routine name
    2062              :                                                          CurrentModuleObject,                                                // Object Type
    2063            0 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,         // Object Name
    2064            0 :                                                          cAlphaFields(AlfaFieldIncre));                                      // Field Name
    2065              :                 }
    2066              :             }
    2067              : 
    2068           13 :             if (Util::SameString(AlphArray(7), "ReverseCycle")) {
    2069            0 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostStrategy = ReverseCycle;
    2070              :             }
    2071           13 :             if (Util::SameString(AlphArray(7), "Resistive")) {
    2072           13 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostStrategy = Resistive;
    2073              :             }
    2074           13 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostStrategy == 0) {
    2075            0 :                 ShowSevereError(
    2076              :                     state,
    2077            0 :                     format("{}{}=\"{}\", invalid", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    2078            0 :                 ShowContinueError(state, format("...illegal {}=\"{}\".", cAlphaFields(7), AlphArray(7)));
    2079            0 :                 ShowContinueError(state, "...valid values for this field are ReverseCycle or Resistive.");
    2080            0 :                 ErrorsFound = true;
    2081              :             }
    2082              : 
    2083           13 :             if (Util::SameString(AlphArray(8), "Timed")) {
    2084           12 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostControl = Timed;
    2085              :             }
    2086           13 :             if (Util::SameString(AlphArray(8), "OnDemand")) {
    2087            1 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostControl = OnDemand;
    2088              :             }
    2089           13 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostControl == 0) {
    2090            0 :                 ShowSevereError(
    2091              :                     state,
    2092            0 :                     format("{}{}=\"{}\", invalid", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    2093            0 :                 ShowContinueError(state, format("...illegal {}=\"{}\".", cAlphaFields(8), AlphArray(8)));
    2094            0 :                 ShowContinueError(state, "...valid values for this field are Timed or OnDemand.");
    2095            0 :                 ErrorsFound = true;
    2096              :             }
    2097              : 
    2098              :             // Set minimum OAT for heat pump compressor operation
    2099           13 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MinOATCompressor = NumArray(5);
    2100              : 
    2101              :             // reserved for HSPF calculation
    2102           13 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OATempCompressorOn = NumArray(6);
    2103              : 
    2104              :             // Set maximum outdoor temp for defrost to occur
    2105           13 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MaxOATDefrost = NumArray(7);
    2106              : 
    2107              :             // Set crankcase heater capacity
    2108           13 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterCapacity = NumArray(8);
    2109           13 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterCapacity < 0.0) {
    2110            0 :                 ShowSevereError(
    2111              :                     state,
    2112            0 :                     format("{}{}=\"{}\", invalid", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    2113            0 :                 ShowContinueError(state, format("...{} cannot be < 0.0.", cNumericFields(9)));
    2114            0 :                 ShowContinueError(state, format("...entered value=[{:.2T}].", NumArray(9)));
    2115            0 :                 ErrorsFound = true;
    2116              :             }
    2117              : 
    2118              :             // Set crankcase heater cutout temperature
    2119           13 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MaxOATCrankcaseHeater = NumArray(9);
    2120              : 
    2121              :             // Set defrost time period
    2122           13 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostTime = NumArray(10);
    2123           13 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostTime == 0.0 &&
    2124            0 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostControl == 1) {
    2125            0 :                 ShowWarningError(
    2126            0 :                     state, format("{}{}=\"{}\", ", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    2127            0 :                 ShowContinueError(state, format("...{} = 0.0 for defrost control = TIMED.", cNumericFields(5)));
    2128              :             }
    2129              : 
    2130              :             // Set defrost capacity (for resistive defrost)
    2131           13 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostCapacity = NumArray(11);
    2132           13 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostCapacity == 0.0 &&
    2133            0 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostStrategy == 2) {
    2134            0 :                 ShowWarningError(
    2135            0 :                     state, format("{}{}=\"{}\", ", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    2136            0 :                 ShowContinueError(state, format("...{} = 0.0 for defrost strategy = RESISTIVE.", cNumericFields(6)));
    2137              :             }
    2138              : 
    2139          133 :             for (int I = 1; I <= state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds; ++I) {
    2140          120 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(I) = NumArray(12 + (I - 1) * 5);
    2141          120 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedCOP(I) = NumArray(13 + (I - 1) * 5);
    2142          120 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirVolFlowRate(I) = NumArray(14 + (I - 1) * 5);
    2143          120 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedEvaporatorFanPowerPerVolumeFlowRate2017(I) = NumArray(15 + (I - 1) * 5);
    2144          120 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedEvaporatorFanPowerPerVolumeFlowRate2023(I) = NumArray(16 + (I - 1) * 5);
    2145              : 
    2146          120 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(I) < 1.e-10) {
    2147            0 :                     ShowSevereError(state,
    2148            0 :                                     format("{}{}=\"{}\", invalid value",
    2149              :                                            RoutineName,
    2150              :                                            CurrentModuleObject,
    2151            0 :                                            state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    2152            0 :                     ShowContinueError(state,
    2153            0 :                                       format("...too small {}=[{:.2R}].",
    2154            0 :                                              cNumericFields(12 + (I - 1) * 3),
    2155            0 :                                              state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(I)));
    2156            0 :                     ErrorsFound = true;
    2157              :                 }
    2158              : 
    2159          120 :                 AlfaFieldIncre = 9 + (I - 1) * 4;
    2160          120 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(I) =
    2161          120 :                     Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
    2162          120 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(I) == 0) {
    2163            0 :                     if (lAlphaBlanks(AlfaFieldIncre)) {
    2164            0 :                         ShowSevereError(state,
    2165            0 :                                         format("{}{}=\"{}\", missing",
    2166              :                                                RoutineName,
    2167              :                                                CurrentModuleObject,
    2168            0 :                                                state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    2169            0 :                         ShowContinueError(state, format("...required {} is blank.", cAlphaFields(AlfaFieldIncre)));
    2170              :                     } else {
    2171            0 :                         ShowSevereError(state,
    2172            0 :                                         format("{}{}=\"{}\", invalid",
    2173              :                                                RoutineName,
    2174              :                                                CurrentModuleObject,
    2175            0 :                                                state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    2176            0 :                         ShowContinueError(state, format("...not found {}=\"{}\".", cAlphaFields(AlfaFieldIncre), AlphArray(AlfaFieldIncre)));
    2177              :                     }
    2178            0 :                     ErrorsFound = true;
    2179              :                 } else {
    2180              :                     // Verify Curve Object, only legal type is BiQuadratic
    2181          360 :                     ErrorsFound |= Curve::CheckCurveDims(state,
    2182          120 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(I), // Curve index
    2183              :                                                          {2},                                                                  // Valid dimensions
    2184              :                                                          RoutineName,                                                          // Routine name
    2185              :                                                          CurrentModuleObject,                                                  // Object Type
    2186          120 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,           // Object Name
    2187          120 :                                                          cAlphaFields(AlfaFieldIncre));                                        // Field Name
    2188              : 
    2189          120 :                     if (!ErrorsFound) {
    2190          240 :                         CurveVal = Curve::CurveValue(
    2191          120 :                             state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(I), RatedInletAirTempHeat, RatedAmbAirTempHeat);
    2192          120 :                         if (CurveVal > 1.10 || CurveVal < 0.90) {
    2193           60 :                             ShowWarningError(state,
    2194           60 :                                              format("{}{}=\"{}\", curve values",
    2195              :                                                     RoutineName,
    2196              :                                                     CurrentModuleObject,
    2197           30 :                                                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    2198           60 :                             ShowContinueError(
    2199           60 :                                 state, format("...{} output is not equal to 1.0 (+ or - 10%) at rated conditions.", cAlphaFields(AlfaFieldIncre)));
    2200           30 :                             ShowContinueError(state, format("...Curve output at rated conditions = {:.3T}", CurveVal));
    2201              :                         }
    2202              :                     }
    2203              :                 }
    2204              : 
    2205          120 :                 AlfaFieldIncre = 10 + (I - 1) * 4;
    2206          120 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(I) =
    2207          120 :                     Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
    2208          120 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(I) == 0) {
    2209            0 :                     if (lAlphaBlanks(AlfaFieldIncre)) {
    2210            0 :                         ShowSevereError(state,
    2211            0 :                                         format("{}{}=\"{}\", missing",
    2212              :                                                RoutineName,
    2213              :                                                CurrentModuleObject,
    2214            0 :                                                state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    2215            0 :                         ShowContinueError(state, format("...required {} is blank.", cAlphaFields(AlfaFieldIncre)));
    2216              :                     } else {
    2217            0 :                         ShowSevereError(state,
    2218            0 :                                         format("{}{}=\"{}\", invalid",
    2219              :                                                RoutineName,
    2220              :                                                CurrentModuleObject,
    2221            0 :                                                state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    2222            0 :                         ShowContinueError(state, format("...not found {}=\"{}\".", cAlphaFields(AlfaFieldIncre), AlphArray(AlfaFieldIncre)));
    2223              :                     }
    2224            0 :                     ErrorsFound = true;
    2225              :                 } else {
    2226              :                     // Verify Curve Object, only legal type is Quadratic
    2227          360 :                     ErrorsFound |= Curve::CheckCurveDims(state,
    2228          120 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(I), // Curve index
    2229              :                                                          {1},                                                                     // Valid dimensions
    2230              :                                                          RoutineName,                                                             // Routine name
    2231              :                                                          CurrentModuleObject,                                                     // Object Type
    2232          120 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,              // Object Name
    2233          120 :                                                          cAlphaFields(AlfaFieldIncre));                                           // Field Name
    2234              : 
    2235          120 :                     if (!ErrorsFound) {
    2236          120 :                         CurveVal = Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(I), 1.0);
    2237          120 :                         if (CurveVal > 1.10 || CurveVal < 0.90) {
    2238            0 :                             ShowWarningError(state,
    2239            0 :                                              format("{}{}=\"{}\", curve values",
    2240              :                                                     RoutineName,
    2241              :                                                     CurrentModuleObject,
    2242            0 :                                                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    2243            0 :                             ShowContinueError(
    2244            0 :                                 state, format("...{} output is not equal to 1.0 (+ or - 10%) at rated conditions.", cAlphaFields(AlfaFieldIncre)));
    2245            0 :                             ShowContinueError(state, format("...Curve output at rated conditions = {:.3T}", CurveVal));
    2246              :                         }
    2247              :                     }
    2248              :                 }
    2249              : 
    2250          120 :                 AlfaFieldIncre = 11 + (I - 1) * 4;
    2251          120 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(I) =
    2252          120 :                     Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
    2253          120 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(I) == 0) {
    2254            0 :                     if (lAlphaBlanks(AlfaFieldIncre)) {
    2255            0 :                         ShowSevereError(state,
    2256            0 :                                         format("{}{}=\"{}\", missing",
    2257              :                                                RoutineName,
    2258              :                                                CurrentModuleObject,
    2259            0 :                                                state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    2260            0 :                         ShowContinueError(state, format("...required {} is blank.", cAlphaFields(AlfaFieldIncre)));
    2261              :                     } else {
    2262            0 :                         ShowSevereError(state,
    2263            0 :                                         format("{}{}=\"{}\", invalid",
    2264              :                                                RoutineName,
    2265              :                                                CurrentModuleObject,
    2266            0 :                                                state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    2267            0 :                         ShowContinueError(state, format("...not found {}=\"{}\".", cAlphaFields(AlfaFieldIncre), AlphArray(AlfaFieldIncre)));
    2268              :                     }
    2269            0 :                     ErrorsFound = true;
    2270              :                 } else {
    2271              :                     // Verify Curve Object, only legal type is BiQuadratic
    2272          360 :                     ErrorsFound |= Curve::CheckCurveDims(state,
    2273          120 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(I), // Curve index
    2274              :                                                          {2},                                                                 // Valid dimensions
    2275              :                                                          RoutineName,                                                         // Routine name
    2276              :                                                          CurrentModuleObject,                                                 // Object Type
    2277          120 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,          // Object Name
    2278          120 :                                                          cAlphaFields(AlfaFieldIncre));                                       // Field Name
    2279              : 
    2280          120 :                     if (!ErrorsFound) {
    2281          240 :                         CurveVal = Curve::CurveValue(
    2282          120 :                             state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(I), RatedInletAirTempHeat, RatedAmbAirTempHeat);
    2283          120 :                         if (CurveVal > 1.10 || CurveVal < 0.90) {
    2284           60 :                             ShowWarningError(state,
    2285           60 :                                              format("{}{}=\"{}\", curve values",
    2286              :                                                     RoutineName,
    2287              :                                                     CurrentModuleObject,
    2288           30 :                                                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    2289           60 :                             ShowContinueError(
    2290           60 :                                 state, format("...{} output is not equal to 1.0 (+ or - 10%) at rated conditions.", cAlphaFields(AlfaFieldIncre)));
    2291           30 :                             ShowContinueError(state, format("...Curve output at rated conditions = {:.3T}", CurveVal));
    2292              :                         }
    2293              :                     }
    2294              :                 }
    2295              : 
    2296          120 :                 AlfaFieldIncre = 12 + (I - 1) * 4;
    2297          120 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(I) =
    2298          120 :                     Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
    2299          120 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(I) == 0) {
    2300            0 :                     if (lAlphaBlanks(AlfaFieldIncre)) {
    2301            0 :                         ShowSevereError(state,
    2302            0 :                                         format("{}{}=\"{}\", missing",
    2303              :                                                RoutineName,
    2304              :                                                CurrentModuleObject,
    2305            0 :                                                state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    2306            0 :                         ShowContinueError(state, format("...required {} is blank.", cAlphaFields(AlfaFieldIncre)));
    2307              :                     } else {
    2308            0 :                         ShowSevereError(state,
    2309            0 :                                         format("{}{}=\"{}\", invalid",
    2310              :                                                RoutineName,
    2311              :                                                CurrentModuleObject,
    2312            0 :                                                state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    2313            0 :                         ShowContinueError(state, format("...not found {}=\"{}\".", cAlphaFields(AlfaFieldIncre), AlphArray(AlfaFieldIncre)));
    2314              :                     }
    2315            0 :                     ErrorsFound = true;
    2316              :                 } else {
    2317              :                     // Verify Curve Object, only legal type is Quadratic
    2318          360 :                     ErrorsFound |= Curve::CheckCurveDims(state,
    2319          120 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(I), // Curve index
    2320              :                                                          {1},                                                                    // Valid dimensions
    2321              :                                                          RoutineName,                                                            // Routine name
    2322              :                                                          CurrentModuleObject,                                                    // Object Type
    2323          120 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,             // Object Name
    2324          120 :                                                          cAlphaFields(AlfaFieldIncre));                                          // Field Name
    2325              : 
    2326          120 :                     if (!ErrorsFound) {
    2327          120 :                         CurveVal = Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(I), 1.0);
    2328          120 :                         if (CurveVal > 1.10 || CurveVal < 0.90) {
    2329            0 :                             ShowWarningError(state,
    2330            0 :                                              format("{}{}=\"{}\", curve values",
    2331              :                                                     RoutineName,
    2332              :                                                     CurrentModuleObject,
    2333            0 :                                                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    2334            0 :                             ShowContinueError(
    2335            0 :                                 state, format("...{} output is not equal to 1.0 (+ or - 10%) at rated conditions.", cAlphaFields(AlfaFieldIncre)));
    2336            0 :                             ShowContinueError(state, format("...Curve output at rated conditions = {:.3T}", CurveVal));
    2337              :                         }
    2338              :                     }
    2339              :                 }
    2340              :             }
    2341              : 
    2342           13 :             if (ErrorsFound) {
    2343            0 :                 continue;
    2344              :             }
    2345              : 
    2346          133 :             for (int I = 1; I <= state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds; ++I) {
    2347          120 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedPercentTotCap(I) =
    2348          120 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(I) /
    2349          240 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(
    2350          120 :                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds);
    2351          120 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirVolFlowPerRatedTotCap(I) =
    2352          120 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirVolFlowRate(I) /
    2353          120 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(I);
    2354              :             }
    2355              : 
    2356              :             // CurrentModuleObject = "Coil:Heating:DX:Variablespeed "
    2357           26 :             SetupOutputVariable(state,
    2358              :                                 "Heating Coil Electricity Energy",
    2359              :                                 Constant::Units::J,
    2360           13 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Energy,
    2361              :                                 OutputProcessor::TimeStepType::System,
    2362              :                                 OutputProcessor::StoreType::Sum,
    2363           13 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
    2364              :                                 Constant::eResource::Electricity,
    2365              :                                 OutputProcessor::Group::HVAC,
    2366              :                                 OutputProcessor::EndUseCat::Heating);
    2367           26 :             SetupOutputVariable(state,
    2368              :                                 "Heating Coil Heating Energy",
    2369              :                                 Constant::Units::J,
    2370           13 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergyLoadTotal,
    2371              :                                 OutputProcessor::TimeStepType::System,
    2372              :                                 OutputProcessor::StoreType::Sum,
    2373           13 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
    2374              :                                 Constant::eResource::EnergyTransfer,
    2375              :                                 OutputProcessor::Group::HVAC,
    2376              :                                 OutputProcessor::EndUseCat::HeatingCoils);
    2377           26 :             SetupOutputVariable(state,
    2378              :                                 "Heating Coil Source Side Heat Transfer Energy",
    2379              :                                 Constant::Units::J,
    2380           13 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergySource,
    2381              :                                 OutputProcessor::TimeStepType::System,
    2382              :                                 OutputProcessor::StoreType::Sum,
    2383           13 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    2384              : 
    2385              :             // create predefined report entries
    2386           26 :             OutputReportPredefined::PreDefTableEntry(
    2387           13 :                 state, state.dataOutRptPredefined->pdchHeatCoilType, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name, CurrentModuleObject);
    2388           26 :             OutputReportPredefined::PreDefTableEntry(state,
    2389           13 :                                                      state.dataOutRptPredefined->pdchHeatCoilNomCap,
    2390           13 :                                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
    2391           13 :                                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedCapHeat);
    2392           26 :             OutputReportPredefined::PreDefTableEntry(state,
    2393           13 :                                                      state.dataOutRptPredefined->pdchHeatCoilNomEff,
    2394           13 :                                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
    2395           26 :                                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedCOP(
    2396           13 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel));
    2397              :         }
    2398              : 
    2399              :         //-------------------------AIR SOURCE HEATING---END
    2400              : 
    2401              :         //------------------------VARIABLE-SPEED AIR SOURCE HPWH---BEGIN
    2402           49 :         CurrentModuleObject = "COIL:WATERHEATING:AIRTOWATERHEATPUMP:VARIABLESPEED"; // for reporting
    2403              : 
    2404           56 :         for (int CoilCounter = 1; CoilCounter <= NumHPWHAirToWater; ++CoilCounter) {
    2405              : 
    2406            7 :             ++DXCoilNum;
    2407              : 
    2408            7 :             state.dataInputProcessing->inputProcessor->getObjectItem(state,
    2409              :                                                                      CurrentModuleObject,
    2410              :                                                                      CoilCounter,
    2411              :                                                                      AlphArray,
    2412              :                                                                      NumAlphas,
    2413              :                                                                      NumArray,
    2414              :                                                                      NumNums,
    2415              :                                                                      IOStat,
    2416              :                                                                      lNumericBlanks,
    2417              :                                                                      lAlphaBlanks,
    2418              :                                                                      cAlphaFields,
    2419              :                                                                      cNumericFields);
    2420              :             // ErrorsFound will be set to True if problem was found, left untouched otherwise
    2421            7 :             GlobalNames::VerifyUniqueCoilName(state, CurrentModuleObject, AlphArray(1), ErrorsFound, CurrentModuleObject + " Name");
    2422              : 
    2423            7 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).bIsDesuperheater = false;
    2424            7 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserType = DataHeatBalance::RefrigCondenserType::WaterHeater;
    2425            7 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CoolHeatType = "WATERHEATING";
    2426            7 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType = HVAC::CoilDX_HeatPumpWaterHeaterVariableSpeed;
    2427            7 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VarSpeedCoilType =
    2428           14 :                 HVAC::cAllCoilTypes(HVAC::CoilDX_HeatPumpWaterHeaterVariableSpeed);
    2429              : 
    2430            7 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name = AlphArray(1);
    2431            7 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds = int(NumArray(1));
    2432            7 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel = int(NumArray(2));
    2433              : 
    2434            7 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds < 1) {
    2435            0 :                 ShowSevereError(
    2436              :                     state,
    2437            0 :                     format("{}{}=\"{}\", invalid", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    2438            0 :                 ShowContinueError(state, format("...{} must be >= 1. entered number is {:.0T}", cNumericFields(1), NumArray(1)));
    2439            0 :                 ErrorsFound = true;
    2440              :             }
    2441              : 
    2442            7 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel >
    2443            7 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds) {
    2444            0 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel =
    2445            0 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds;
    2446              :             }
    2447              : 
    2448            7 :             if ((state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel >
    2449           14 :                  state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds) ||
    2450            7 :                 (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel <= 0)) {
    2451            0 :                 ShowSevereError(
    2452              :                     state,
    2453            0 :                     format("{}{}=\"{}\", invalid", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    2454            0 :                 ShowContinueError(state, format("...{} must be valid speed level entered number is {:.0T}", cNumericFields(2), NumArray(2)));
    2455            0 :                 ErrorsFound = true;
    2456              :             }
    2457              : 
    2458            7 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedCapWH = NumArray(3);
    2459            7 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedCapWH <= 0.0) {
    2460            0 :                 ShowSevereError(
    2461              :                     state,
    2462            0 :                     format("{}{}=\"{}\", invalid", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    2463            0 :                 ShowContinueError(state, format("...{} must be > 0.0, entered value=[{:.2T}].", cNumericFields(3), NumArray(3)));
    2464            0 :                 ErrorsFound = true;
    2465              :             }
    2466              : 
    2467            7 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WHRatedInletDBTemp = NumArray(4);
    2468            7 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WHRatedInletWBTemp = NumArray(5);
    2469            7 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WHRatedInletWaterTemp = NumArray(6);
    2470              : 
    2471            7 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedAirVolFlowRate = NumArray(7);
    2472            7 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedWaterVolFlowRate = NumArray(8);
    2473              : 
    2474            7 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedAirVolFlowRate != Constant::AutoCalculate) {
    2475            5 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedAirVolFlowRate <= 0.0) {
    2476            0 :                     ShowSevereError(
    2477              :                         state,
    2478            0 :                         format("{}{}=\"{}\", invalid", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    2479            0 :                     ShowContinueError(state, format("...{} must be > 0.0.  entered value=[{:.3T}].", cNumericFields(7), NumArray(7)));
    2480            0 :                     ErrorsFound = true;
    2481              :                 }
    2482              :             }
    2483              : 
    2484            7 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedWaterVolFlowRate != Constant::AutoCalculate) {
    2485            5 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedWaterVolFlowRate <= 0.0) {
    2486            0 :                     ShowSevereError(
    2487              :                         state,
    2488            0 :                         format("{}{}=\"{}\", invalid", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    2489            0 :                     ShowContinueError(state, format("...{} must be > 0.0  entered value=[{:.3T}].", cNumericFields(8), NumArray(8)));
    2490            0 :                     ErrorsFound = true;
    2491              :                 }
    2492              :             }
    2493              : 
    2494            7 :             if (Util::SameString(AlphArray(2), "Yes") || Util::SameString(AlphArray(2), "No")) {
    2495              :                 //  initialized to TRUE on allocate
    2496            7 :                 if (Util::SameString(AlphArray(2), "No")) {
    2497            7 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).FanPowerIncludedInCOP = false;
    2498              :                 } else {
    2499            0 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).FanPowerIncludedInCOP = true;
    2500              :                 }
    2501              :             } else {
    2502            0 :                 ShowSevereError(
    2503              :                     state,
    2504            0 :                     format("{}{}=\"{}\", invalid", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    2505            0 :                 ShowContinueError(state, format(",,,invalid choice for {}.  Entered choice = {}", cAlphaFields(2), AlphArray(2)));
    2506            0 :                 ShowContinueError(state, "Valid choices are Yes or No.");
    2507            0 :                 ErrorsFound = true;
    2508              :             }
    2509              : 
    2510            7 :             if (Util::SameString(AlphArray(3), "Yes") || Util::SameString(AlphArray(3), "No")) {
    2511              :                 //  initialized to FALSE on allocate
    2512            7 :                 if (Util::SameString(AlphArray(3), "Yes")) {
    2513            0 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondPumpPowerInCOP = true;
    2514              :                 } else {
    2515            7 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondPumpPowerInCOP = false;
    2516              :                 }
    2517              :             } else {
    2518            0 :                 ShowSevereError(
    2519              :                     state,
    2520            0 :                     format("{}{}=\"{}\", invalid", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    2521            0 :                 ShowContinueError(state, format(",,,invalid choice for {}.  Entered choice = {}", cAlphaFields(3), AlphArray(3)));
    2522            0 :                 ShowContinueError(state, "Valid choices are Yes or No.");
    2523            0 :                 ErrorsFound = true;
    2524              :             }
    2525              : 
    2526            7 :             if (Util::SameString(AlphArray(4), "Yes") || Util::SameString(AlphArray(4), "No")) {
    2527              :                 //  initialized to FALSE on allocate
    2528            7 :                 if (Util::SameString(AlphArray(4), "Yes")) {
    2529            0 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondPumpHeatInCapacity = true;
    2530              :                 } else {
    2531            7 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondPumpHeatInCapacity = false;
    2532              :                 }
    2533              :             } else {
    2534            0 :                 ShowSevereError(
    2535              :                     state,
    2536            0 :                     format("{}{}=\"{}\", invalid", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    2537            0 :                 ShowContinueError(state, format(",,,invalid choice for {}.  Entered choice = {}", cAlphaFields(4), AlphArray(4)));
    2538            0 :                 ShowContinueError(state, "Valid choices are Yes or No.");
    2539            0 :                 ErrorsFound = true;
    2540              :             }
    2541              : 
    2542            7 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpFracToWater = NumArray(9);
    2543           14 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpFracToWater <= 0.0 ||
    2544            7 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpFracToWater > 1.0) {
    2545            0 :                 ShowSevereError(
    2546              :                     state,
    2547            0 :                     format("{}{}=\"{}\", invalid", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    2548            0 :                 ShowContinueError(state, format("...{} must be >= 0 and <= 1.  entered value=[{:.3T}].", cNumericFields(10), NumArray(9)));
    2549            0 :                 ErrorsFound = true;
    2550              :             }
    2551              : 
    2552            7 :             if (!state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondPumpHeatInCapacity) {
    2553            7 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpFracToWater = 0.0;
    2554              :             }
    2555              : 
    2556              :             // Air nodes
    2557            7 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirInletNodeNum =
    2558           14 :                 GetOnlySingleNode(state,
    2559            7 :                                   AlphArray(5),
    2560              :                                   ErrorsFound,
    2561              :                                   DataLoopNode::ConnectionObjectType::CoilWaterHeatingAirToWaterHeatPumpVariableSpeed,
    2562            7 :                                   AlphArray(1),
    2563              :                                   DataLoopNode::NodeFluidType::Air,
    2564              :                                   DataLoopNode::ConnectionType::Inlet,
    2565              :                                   NodeInputManager::CompFluidStream::Primary,
    2566              :                                   DataLoopNode::ObjectIsNotParent);
    2567              : 
    2568            7 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirOutletNodeNum =
    2569           21 :                 GetOnlySingleNode(state,
    2570            7 :                                   AlphArray(6),
    2571              :                                   ErrorsFound,
    2572              :                                   DataLoopNode::ConnectionObjectType::CoilWaterHeatingAirToWaterHeatPumpVariableSpeed,
    2573            7 :                                   AlphArray(1),
    2574              :                                   DataLoopNode::NodeFluidType::Air,
    2575              :                                   DataLoopNode::ConnectionType::Outlet,
    2576              :                                   NodeInputManager::CompFluidStream::Primary,
    2577              :                                   DataLoopNode::ObjectIsNotParent);
    2578              : 
    2579            7 :             BranchNodeConnections::TestCompSet(state, CurrentModuleObject, AlphArray(1), AlphArray(5), AlphArray(6), "Air Nodes");
    2580              : 
    2581              :             // Check if the air inlet node is OA node, to justify whether the coil is placed in zone or not
    2582            7 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).IsDXCoilInZone =
    2583            7 :                 !OutAirNodeManager::CheckOutAirNodeNumber(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirInletNodeNum);
    2584              : 
    2585              :             // Water nodes
    2586            7 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterInletNodeNum =
    2587           14 :                 GetOnlySingleNode(state,
    2588            7 :                                   AlphArray(7),
    2589              :                                   ErrorsFound,
    2590              :                                   DataLoopNode::ConnectionObjectType::CoilWaterHeatingAirToWaterHeatPumpVariableSpeed,
    2591            7 :                                   AlphArray(1),
    2592              :                                   DataLoopNode::NodeFluidType::Water,
    2593              :                                   DataLoopNode::ConnectionType::Inlet,
    2594              :                                   NodeInputManager::CompFluidStream::Secondary,
    2595              :                                   DataLoopNode::ObjectIsNotParent);
    2596              : 
    2597            7 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterOutletNodeNum =
    2598           21 :                 GetOnlySingleNode(state,
    2599            7 :                                   AlphArray(8),
    2600              :                                   ErrorsFound,
    2601              :                                   DataLoopNode::ConnectionObjectType::CoilWaterHeatingAirToWaterHeatPumpVariableSpeed,
    2602            7 :                                   AlphArray(1),
    2603              :                                   DataLoopNode::NodeFluidType::Water,
    2604              :                                   DataLoopNode::ConnectionType::Outlet,
    2605              :                                   NodeInputManager::CompFluidStream::Secondary,
    2606              :                                   DataLoopNode::ObjectIsNotParent);
    2607              : 
    2608            7 :             BranchNodeConnections::TestCompSet(state, CurrentModuleObject, AlphArray(1), AlphArray(7), AlphArray(8), "Water Nodes");
    2609              : 
    2610            7 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterCapacity = NumArray(10);
    2611            7 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterCapacity < 0.0) {
    2612            0 :                 ShowSevereError(
    2613              :                     state,
    2614            0 :                     format("{}{}=\"{}\", invalid", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    2615            0 :                 ShowContinueError(state, format("...{} must be >= 0.0  entered value=[{:.1T}].", cNumericFields(10), NumArray(10)));
    2616            0 :                 ErrorsFound = true;
    2617              :             }
    2618              : 
    2619            7 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MaxOATCrankcaseHeater = NumArray(11);
    2620            7 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MaxOATCrankcaseHeater < 0.0) {
    2621            0 :                 ShowSevereError(
    2622              :                     state,
    2623            0 :                     format("{}{}=\"{}\", invalid", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    2624            0 :                 ShowContinueError(state, format("...{} must be >= 0 {{C}}.  entered value=[{:.1T}].", cNumericFields(11), NumArray(11)));
    2625            0 :                 ErrorsFound = true;
    2626              :             }
    2627              : 
    2628            7 :             if (!lAlphaBlanks(9)) {
    2629            2 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterCapacityCurveIndex = Curve::GetCurveIndex(state, AlphArray(9));
    2630            2 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterCapacityCurveIndex == 0) { // can't find the curve
    2631            0 :                     ShowSevereError(state,
    2632            0 :                                     format("{} = {}:  {} not found = {}",
    2633              :                                            CurrentModuleObject,
    2634            0 :                                            state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
    2635              :                                            cAlphaFields(9),
    2636              :                                            AlphArray(9)));
    2637            0 :                     ErrorsFound = true;
    2638              :                 } else {
    2639            2 :                     ErrorsFound |=
    2640            8 :                         Curve::CheckCurveDims(state,
    2641            2 :                                               state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterCapacityCurveIndex, // Curve index
    2642              :                                               {1},                                                        // Valid dimensions
    2643              :                                               RoutineName,                                                // Routine name
    2644              :                                               CurrentModuleObject,                                        // Object Type
    2645            2 :                                               state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name, // Object Name
    2646            2 :                                               cAlphaFields(9));                                           // Field Name
    2647              :                 }
    2648              :             }
    2649              : 
    2650            7 :             if (Util::SameString(AlphArray(10), "DryBulbTemperature")) {
    2651            0 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirTemperatureType = HVAC::OATType::DryBulb;
    2652            7 :             } else if (Util::SameString(AlphArray(10), "WetBulbTemperature")) {
    2653            7 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirTemperatureType = HVAC::OATType::WetBulb;
    2654              :             } else {
    2655              :                 //   wrong temperature type selection
    2656            0 :                 ShowSevereError(
    2657              :                     state,
    2658            0 :                     format("{}{}=\"{}\", invalid", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    2659            0 :                 ShowContinueError(state, format("...{} must be DryBulbTemperature or WetBulbTemperature.", cAlphaFields(10)));
    2660            0 :                 ShowContinueError(state, format("...entered value=\"{}\".", AlphArray(10)));
    2661            0 :                 ErrorsFound = true;
    2662              :             }
    2663              : 
    2664              :             // set rated inlet air temperature for curve object verification
    2665            7 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirTemperatureType == HVAC::OATType::WetBulb) {
    2666            7 :                 WHInletAirTemp = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WHRatedInletWBTemp;
    2667              :             } else {
    2668            0 :                 WHInletAirTemp = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WHRatedInletDBTemp;
    2669              :             }
    2670              :             // set rated water temperature for curve object verification
    2671            7 :             WHInletWaterTemp = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WHRatedInletWaterTemp;
    2672              : 
    2673              :             // part load curve
    2674            7 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PLFFPLR =
    2675            7 :                 Curve::GetCurveIndex(state, AlphArray(11)); // convert curve name to number
    2676            7 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PLFFPLR == 0) {
    2677            0 :                 if (lAlphaBlanks(11)) {
    2678            0 :                     ShowSevereError(
    2679              :                         state,
    2680            0 :                         format("{}{}=\"{}\", missing", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    2681            0 :                     ShowContinueError(state, format("...required {} is blank.", cAlphaFields(11)));
    2682              :                 } else {
    2683            0 :                     ShowSevereError(
    2684              :                         state,
    2685            0 :                         format("{}{}=\"{}\", invalid", RoutineName, CurrentModuleObject, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    2686            0 :                     ShowContinueError(state, format("...not found {}=\"{}\".", cAlphaFields(11), AlphArray(11)));
    2687              :                 }
    2688            0 :                 ErrorsFound = true;
    2689              :             } else {
    2690            7 :                 CurveVal = Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PLFFPLR, 1.0);
    2691            7 :                 if (CurveVal > 1.10 || CurveVal < 0.90) {
    2692            4 :                     ShowWarningError(state,
    2693            4 :                                      format("{}{}=\"{}\", curve values",
    2694              :                                             RoutineName,
    2695              :                                             CurrentModuleObject,
    2696            2 :                                             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    2697            2 :                     ShowContinueError(state, format("...{} output is not equal to 1.0 (+ or - 10%) at rated conditions.", cAlphaFields(11)));
    2698            2 :                     ShowContinueError(state, format("...Curve output at rated conditions = {:.3T}", CurveVal));
    2699              :                 }
    2700              :             }
    2701              : 
    2702           77 :             for (int I = 1; I <= state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds; ++I) {
    2703           70 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(I) = NumArray(12 + (I - 1) * 6);
    2704           70 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedCOP(I) = NumArray(13 + (I - 1) * 6);
    2705           70 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedSHR(I) = NumArray(14 + (I - 1) * 6);
    2706           70 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirVolFlowRate(I) = NumArray(15 + (I - 1) * 6);
    2707           70 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedWaterVolFlowRate(I) = NumArray(16 + (I - 1) * 6);
    2708           70 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWHPumpPower(I) = NumArray(17 + (I - 1) * 6);
    2709              : 
    2710           70 :                 AlfaFieldIncre = 12 + (I - 1) * 6;
    2711           70 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(I) =
    2712           70 :                     Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
    2713           70 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(I) == 0) {
    2714            0 :                     if (lAlphaBlanks(AlfaFieldIncre)) {
    2715            0 :                         ShowSevereError(state,
    2716            0 :                                         format("{}{}=\"{}\", missing",
    2717              :                                                RoutineName,
    2718              :                                                CurrentModuleObject,
    2719            0 :                                                state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    2720            0 :                         ShowContinueError(state, format("...required {} is blank.", cAlphaFields(AlfaFieldIncre)));
    2721              :                     } else {
    2722            0 :                         ShowSevereError(state,
    2723            0 :                                         format("{}{}=\"{}\", invalid",
    2724              :                                                RoutineName,
    2725              :                                                CurrentModuleObject,
    2726            0 :                                                state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    2727            0 :                         ShowContinueError(state, format("...not found {}=\"{}\".", cAlphaFields(AlfaFieldIncre), AlphArray(AlfaFieldIncre)));
    2728              :                     }
    2729            0 :                     ErrorsFound = true;
    2730              :                 } else {
    2731              :                     // Verify Curve Object, only legal type is BiQuadratic
    2732          210 :                     ErrorsFound |= Curve::CheckCurveDims(state,
    2733           70 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(I), // Curve index
    2734              :                                                          {2},                                                                  // Valid dimensions
    2735              :                                                          RoutineName,                                                          // Routine name
    2736              :                                                          CurrentModuleObject,                                                  // Object Type
    2737           70 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,           // Object Name
    2738           70 :                                                          cAlphaFields(AlfaFieldIncre));                                        // Field Name
    2739              : 
    2740           70 :                     if (!ErrorsFound) {
    2741          140 :                         CurveVal = Curve::CurveValue(
    2742           70 :                             state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(I), WHInletAirTemp, WHInletWaterTemp);
    2743           70 :                         if (CurveVal > 1.10 || CurveVal < 0.90) {
    2744           40 :                             ShowWarningError(state,
    2745           40 :                                              format("{}{}=\"{}\", curve values",
    2746              :                                                     RoutineName,
    2747              :                                                     CurrentModuleObject,
    2748           20 :                                                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    2749           40 :                             ShowContinueError(
    2750           40 :                                 state, format("...{} output is not equal to 1.0 (+ or - 10%) at rated conditions.", cAlphaFields(AlfaFieldIncre)));
    2751           20 :                             ShowContinueError(state, format("...Curve output at rated conditions = {:.3T}", CurveVal));
    2752              :                         }
    2753              :                     }
    2754              :                 }
    2755              : 
    2756           70 :                 AlfaFieldIncre = 13 + (I - 1) * 6;
    2757           70 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(I) =
    2758           70 :                     Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
    2759           70 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(I) == 0) {
    2760            0 :                     if (lAlphaBlanks(AlfaFieldIncre)) {
    2761            0 :                         ShowSevereError(state,
    2762            0 :                                         format("{}{}=\"{}\", missing",
    2763              :                                                RoutineName,
    2764              :                                                CurrentModuleObject,
    2765            0 :                                                state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    2766            0 :                         ShowContinueError(state, format("...required {} is blank.", cAlphaFields(AlfaFieldIncre)));
    2767              :                     } else {
    2768            0 :                         ShowSevereError(state,
    2769            0 :                                         format("{}{}=\"{}\", invalid",
    2770              :                                                RoutineName,
    2771              :                                                CurrentModuleObject,
    2772            0 :                                                state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    2773            0 :                         ShowContinueError(state, format("...not found {}=\"{}\".", cAlphaFields(AlfaFieldIncre), AlphArray(AlfaFieldIncre)));
    2774              :                     }
    2775            0 :                     ErrorsFound = true;
    2776              :                 } else {
    2777              :                     // Verify Curve Object, only legal type is Quadratic
    2778          210 :                     ErrorsFound |= Curve::CheckCurveDims(state,
    2779           70 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(I), // Curve index
    2780              :                                                          {1},                                                                     // Valid dimensions
    2781              :                                                          RoutineName,                                                             // Routine name
    2782              :                                                          CurrentModuleObject,                                                     // Object Type
    2783           70 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,              // Object Name
    2784           70 :                                                          cAlphaFields(AlfaFieldIncre));                                           // Field Name
    2785              : 
    2786           70 :                     if (!ErrorsFound) {
    2787           70 :                         CurveVal = Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(I), 1.0);
    2788           70 :                         if (CurveVal > 1.10 || CurveVal < 0.90) {
    2789            0 :                             ShowWarningError(state,
    2790            0 :                                              format("{}{}=\"{}\", curve values",
    2791              :                                                     RoutineName,
    2792              :                                                     CurrentModuleObject,
    2793            0 :                                                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    2794            0 :                             ShowContinueError(
    2795            0 :                                 state, format("...{} output is not equal to 1.0 (+ or - 10%) at rated conditions.", cAlphaFields(AlfaFieldIncre)));
    2796            0 :                             ShowContinueError(state, format("...Curve output at rated conditions = {:.3T}", CurveVal));
    2797              :                         }
    2798              :                     }
    2799              :                 }
    2800              : 
    2801           70 :                 AlfaFieldIncre = 14 + (I - 1) * 6;
    2802           70 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapWaterFFlow(I) =
    2803           70 :                     Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
    2804           70 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapWaterFFlow(I) == 0) {
    2805            0 :                     if (lAlphaBlanks(AlfaFieldIncre)) {
    2806            0 :                         ShowSevereError(state,
    2807            0 :                                         format("{}{}=\"{}\", missing",
    2808              :                                                RoutineName,
    2809              :                                                CurrentModuleObject,
    2810            0 :                                                state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    2811            0 :                         ShowContinueError(state, format("...required {} is blank.", cAlphaFields(AlfaFieldIncre)));
    2812              :                     } else {
    2813            0 :                         ShowSevereError(state,
    2814            0 :                                         format("{}{}=\"{}\", invalid",
    2815              :                                                RoutineName,
    2816              :                                                CurrentModuleObject,
    2817            0 :                                                state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    2818            0 :                         ShowContinueError(state, format("...not found {}=\"{}\".", cAlphaFields(AlfaFieldIncre), AlphArray(AlfaFieldIncre)));
    2819              :                     }
    2820            0 :                     ErrorsFound = true;
    2821              :                 } else {
    2822              :                     // Verify Curve Object, only legal type is Quadratic
    2823          210 :                     ErrorsFound |= Curve::CheckCurveDims(state,
    2824           70 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapWaterFFlow(I), // Curve index
    2825              :                                                          {1},                                                        // Valid dimensions
    2826              :                                                          RoutineName,                                                // Routine name
    2827              :                                                          CurrentModuleObject,                                        // Object Type
    2828           70 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name, // Object Name
    2829           70 :                                                          cAlphaFields(AlfaFieldIncre));                              // Field Name
    2830              : 
    2831           70 :                     if (!ErrorsFound) {
    2832           70 :                         CurveVal = Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapWaterFFlow(I), 1.0);
    2833           70 :                         if (CurveVal > 1.10 || CurveVal < 0.90) {
    2834            0 :                             ShowWarningError(state,
    2835            0 :                                              format("{}{}=\"{}\", curve values",
    2836              :                                                     RoutineName,
    2837              :                                                     CurrentModuleObject,
    2838            0 :                                                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    2839            0 :                             ShowContinueError(
    2840            0 :                                 state, format("...{} output is not equal to 1.0 (+ or - 10%) at rated conditions.", cAlphaFields(AlfaFieldIncre)));
    2841            0 :                             ShowContinueError(state, format("...Curve output at rated conditions = {:.3T}", CurveVal));
    2842              :                         }
    2843              :                     }
    2844              :                 }
    2845              : 
    2846           70 :                 AlfaFieldIncre = 15 + (I - 1) * 6;
    2847           70 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(I) =
    2848           70 :                     Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
    2849           70 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(I) == 0) {
    2850            0 :                     if (lAlphaBlanks(AlfaFieldIncre)) {
    2851            0 :                         ShowSevereError(state,
    2852            0 :                                         format("{}{}=\"{}\", missing",
    2853              :                                                RoutineName,
    2854              :                                                CurrentModuleObject,
    2855            0 :                                                state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    2856            0 :                         ShowContinueError(state, format("...required {} is blank.", cAlphaFields(AlfaFieldIncre)));
    2857              :                     } else {
    2858            0 :                         ShowSevereError(state,
    2859            0 :                                         format("{}{}=\"{}\", invalid",
    2860              :                                                RoutineName,
    2861              :                                                CurrentModuleObject,
    2862            0 :                                                state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    2863            0 :                         ShowContinueError(state, format("...not found {}=\"{}\".", cAlphaFields(AlfaFieldIncre), AlphArray(AlfaFieldIncre)));
    2864              :                     }
    2865            0 :                     ErrorsFound = true;
    2866              :                 } else {
    2867              :                     // Verify Curve Object, only legal type is BiQuadratic
    2868          210 :                     ErrorsFound |= Curve::CheckCurveDims(state,
    2869           70 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(I), // Curve index
    2870              :                                                          {2},                                                                 // Valid dimensions
    2871              :                                                          RoutineName,                                                         // Routine name
    2872              :                                                          CurrentModuleObject,                                                 // Object Type
    2873           70 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,          // Object Name
    2874           70 :                                                          cAlphaFields(AlfaFieldIncre));                                       // Field Name
    2875              : 
    2876           70 :                     if (!ErrorsFound) {
    2877          140 :                         CurveVal = Curve::CurveValue(
    2878           70 :                             state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(I), WHInletAirTemp, WHInletWaterTemp);
    2879           70 :                         if (CurveVal > 1.10 || CurveVal < 0.90) {
    2880           40 :                             ShowWarningError(state,
    2881           40 :                                              format("{}{}=\"{}\", curve values",
    2882              :                                                     RoutineName,
    2883              :                                                     CurrentModuleObject,
    2884           20 :                                                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    2885           40 :                             ShowContinueError(
    2886           40 :                                 state, format("...{} output is not equal to 1.0 (+ or - 10%) at rated conditions.", cAlphaFields(AlfaFieldIncre)));
    2887           20 :                             ShowContinueError(state, format("...Curve output at rated conditions = {:.3T}", CurveVal));
    2888              :                         }
    2889              :                     }
    2890              :                 }
    2891              : 
    2892           70 :                 AlfaFieldIncre = 16 + (I - 1) * 6;
    2893           70 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(I) =
    2894           70 :                     Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
    2895           70 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(I) == 0) {
    2896            0 :                     if (lAlphaBlanks(AlfaFieldIncre)) {
    2897            0 :                         ShowSevereError(state,
    2898            0 :                                         format("{}{}=\"{}\", missing",
    2899              :                                                RoutineName,
    2900              :                                                CurrentModuleObject,
    2901            0 :                                                state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    2902            0 :                         ShowContinueError(state, format("...required {} is blank.", cAlphaFields(AlfaFieldIncre)));
    2903              :                     } else {
    2904            0 :                         ShowSevereError(state,
    2905            0 :                                         format("{}{}=\"{}\", invalid",
    2906              :                                                RoutineName,
    2907              :                                                CurrentModuleObject,
    2908            0 :                                                state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    2909            0 :                         ShowContinueError(state, format("...not found {}=\"{}\".", cAlphaFields(AlfaFieldIncre), AlphArray(AlfaFieldIncre)));
    2910              :                     }
    2911            0 :                     ErrorsFound = true;
    2912              :                 } else {
    2913              :                     // Verify Curve Object, only legal type is Quadratic
    2914          210 :                     ErrorsFound |= Curve::CheckCurveDims(state,
    2915           70 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(I), // Curve index
    2916              :                                                          {1},                                                                    // Valid dimensions
    2917              :                                                          RoutineName,                                                            // Routine name
    2918              :                                                          CurrentModuleObject,                                                    // Object Type
    2919           70 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,             // Object Name
    2920           70 :                                                          cAlphaFields(AlfaFieldIncre));                                          // Field Name
    2921              : 
    2922           70 :                     if (!ErrorsFound) {
    2923           70 :                         CurveVal = Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(I), 1.0);
    2924           70 :                         if (CurveVal > 1.10 || CurveVal < 0.90) {
    2925            0 :                             ShowWarningError(state,
    2926            0 :                                              format("{}{}=\"{}\", curve values",
    2927              :                                                     RoutineName,
    2928              :                                                     CurrentModuleObject,
    2929            0 :                                                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    2930            0 :                             ShowContinueError(
    2931            0 :                                 state, format("...{} output is not equal to 1.0 (+ or - 10%) at rated conditions.", cAlphaFields(AlfaFieldIncre)));
    2932            0 :                             ShowContinueError(state, format("...Curve output at rated conditions = {:.3T}", CurveVal));
    2933              :                         }
    2934              :                     }
    2935              :                 }
    2936              : 
    2937           70 :                 AlfaFieldIncre = 17 + (I - 1) * 6;
    2938           70 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRWaterFFlow(I) =
    2939           70 :                     Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
    2940           70 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRWaterFFlow(I) == 0) {
    2941            0 :                     if (lAlphaBlanks(AlfaFieldIncre)) {
    2942            0 :                         ShowSevereError(state,
    2943            0 :                                         format("{}{}=\"{}\", missing",
    2944              :                                                RoutineName,
    2945              :                                                CurrentModuleObject,
    2946            0 :                                                state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    2947            0 :                         ShowContinueError(state, format("...required {} is blank.", cAlphaFields(AlfaFieldIncre)));
    2948              :                     } else {
    2949            0 :                         ShowSevereError(state,
    2950            0 :                                         format("{}{}=\"{}\", invalid",
    2951              :                                                RoutineName,
    2952              :                                                CurrentModuleObject,
    2953            0 :                                                state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    2954            0 :                         ShowContinueError(state, format("...not found {}=\"{}\".", cAlphaFields(AlfaFieldIncre), AlphArray(AlfaFieldIncre)));
    2955              :                     }
    2956            0 :                     ErrorsFound = true;
    2957              :                 } else {
    2958              :                     // Verify Curve Object, only legal type is Quadratic
    2959          210 :                     ErrorsFound |= Curve::CheckCurveDims(state,
    2960           70 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRWaterFFlow(I), // Curve index
    2961              :                                                          {1},                                                                      // Valid dimensions
    2962              :                                                          RoutineName,                                                              // Routine name
    2963              :                                                          CurrentModuleObject,                                                      // Object Type
    2964           70 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,               // Object Name
    2965           70 :                                                          cAlphaFields(AlfaFieldIncre));                                            // Field Name
    2966              : 
    2967           70 :                     if (!ErrorsFound) {
    2968           70 :                         CurveVal = Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRWaterFFlow(I), 1.0);
    2969           70 :                         if (CurveVal > 1.10 || CurveVal < 0.90) {
    2970            0 :                             ShowWarningError(state,
    2971            0 :                                              format("{}{}=\"{}\", curve values",
    2972              :                                                     RoutineName,
    2973              :                                                     CurrentModuleObject,
    2974            0 :                                                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    2975            0 :                             ShowContinueError(
    2976            0 :                                 state, format("...{} output is not equal to 1.0 (+ or - 10%) at rated conditions.", cAlphaFields(AlfaFieldIncre)));
    2977            0 :                             ShowContinueError(state, format("...Curve output at rated conditions = {:.3T}", CurveVal));
    2978              :                         }
    2979              :                     }
    2980              :                 }
    2981              :             }
    2982              : 
    2983              :             // get scale values
    2984           77 :             for (int I = 1; I <= state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds; ++I) {
    2985           70 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedPercentTotCap(I) =
    2986           70 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(I) /
    2987          140 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(
    2988           70 :                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds);
    2989           70 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirVolFlowPerRatedTotCap(I) =
    2990           70 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirVolFlowRate(I) /
    2991           70 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(I);
    2992           70 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedWaterVolFlowPerRatedTotCap(I) =
    2993           70 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedWaterVolFlowRate(I) /
    2994           70 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(I);
    2995           70 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWHPumpPowerPerRatedTotCap(I) =
    2996           70 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWHPumpPower(I) /
    2997           70 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(I);
    2998              :             }
    2999              : 
    3000              :             // CurrentModuleObject = "Coil:Waterheating:Airtowaterheatpump:Variablespeed"
    3001           14 :             SetupOutputVariable(state,
    3002              :                                 "Cooling Coil Electricity Energy",
    3003              :                                 Constant::Units::J,
    3004            7 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Energy,
    3005              :                                 OutputProcessor::TimeStepType::System,
    3006              :                                 OutputProcessor::StoreType::Sum,
    3007            7 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
    3008              :                                 Constant::eResource::Electricity,
    3009              :                                 OutputProcessor::Group::HVAC,
    3010              :                                 OutputProcessor::EndUseCat::Heating);
    3011           14 :             SetupOutputVariable(state,
    3012              :                                 "Cooling Coil Sensible Cooling Energy",
    3013              :                                 Constant::Units::J,
    3014            7 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergySensible,
    3015              :                                 OutputProcessor::TimeStepType::System,
    3016              :                                 OutputProcessor::StoreType::Sum,
    3017            7 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3018           14 :             SetupOutputVariable(state,
    3019              :                                 "Cooling Coil Latent Cooling Energy",
    3020              :                                 Constant::Units::J,
    3021            7 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergyLatent,
    3022              :                                 OutputProcessor::TimeStepType::System,
    3023              :                                 OutputProcessor::StoreType::Sum,
    3024            7 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3025           14 :             SetupOutputVariable(state,
    3026              :                                 "Cooling Coil Water Side Heat Transfer Energy",
    3027              :                                 Constant::Units::J,
    3028            7 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergySource,
    3029              :                                 OutputProcessor::TimeStepType::System,
    3030              :                                 OutputProcessor::StoreType::Sum,
    3031            7 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
    3032              :                                 Constant::eResource::PlantLoopHeatingDemand,
    3033              :                                 OutputProcessor::Group::HVAC,
    3034              :                                 OutputProcessor::EndUseCat::HeatingCoils);
    3035              : 
    3036            7 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).IsDXCoilInZone) {
    3037           14 :                 SetupOutputVariable(state,
    3038              :                                     "Cooling Coil Cooling Energy",
    3039              :                                     Constant::Units::J,
    3040            7 :                                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergyLoadTotal,
    3041              :                                     OutputProcessor::TimeStepType::System,
    3042              :                                     OutputProcessor::StoreType::Sum,
    3043            7 :                                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
    3044              :                                     Constant::eResource::EnergyTransfer,
    3045              :                                     OutputProcessor::Group::HVAC,
    3046              :                                     OutputProcessor::EndUseCat::CoolingCoils);
    3047              :             } else {
    3048            0 :                 SetupOutputVariable(state,
    3049              :                                     "Cooling Coil Cooling Energy",
    3050              :                                     Constant::Units::J,
    3051            0 :                                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergyLoadTotal,
    3052              :                                     OutputProcessor::TimeStepType::System,
    3053              :                                     OutputProcessor::StoreType::Sum,
    3054            0 :                                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3055              :             }
    3056              : 
    3057            7 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedCapCoolSens =
    3058              :                 DataSizing::AutoSize; // always auto-sized, to be determined in the sizing calculation
    3059              :         }
    3060              :         //---------------------------VARIABLE-SPEED AIR SOURCE HPWH END --------------
    3061              : 
    3062           49 :         AlphArray.deallocate();
    3063           49 :         cAlphaFields.deallocate();
    3064           49 :         lAlphaBlanks.deallocate();
    3065           49 :         cNumericFields.deallocate();
    3066           49 :         lNumericBlanks.deallocate();
    3067           49 :         NumArray.deallocate();
    3068              : 
    3069           49 :         if (ErrorsFound) {
    3070            0 :             ShowFatalError(state, format("{}Errors found getting input. Program terminates.", RoutineName));
    3071              :         }
    3072              : 
    3073          116 :         for (DXCoilNum = 1; DXCoilNum <= state.dataVariableSpeedCoils->NumVarSpeedCoils; ++DXCoilNum) {
    3074           96 :             if ((state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed) ||
    3075           29 :                 (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_HeatingAirToAirVariableSpeed)) {
    3076              :                 // Setup Report variables for the Heat Pump
    3077              : 
    3078              :                 // cooling and heating coils separately
    3079           51 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed) {
    3080              :                     // air source cooling coils
    3081           76 :                     SetupOutputVariable(state,
    3082              :                                         "Cooling Coil Air Mass Flow Rate",
    3083              :                                         Constant::Units::kg_s,
    3084           38 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirMassFlowRate,
    3085              :                                         OutputProcessor::TimeStepType::System,
    3086              :                                         OutputProcessor::StoreType::Average,
    3087           38 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3088           76 :                     SetupOutputVariable(state,
    3089              :                                         "Cooling Coil Air Inlet Temperature",
    3090              :                                         Constant::Units::C,
    3091           38 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirDBTemp,
    3092              :                                         OutputProcessor::TimeStepType::System,
    3093              :                                         OutputProcessor::StoreType::Average,
    3094           38 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3095           76 :                     SetupOutputVariable(state,
    3096              :                                         "Cooling Coil Air Inlet Humidity Ratio",
    3097              :                                         Constant::Units::kgWater_kgDryAir,
    3098           38 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirHumRat,
    3099              :                                         OutputProcessor::TimeStepType::System,
    3100              :                                         OutputProcessor::StoreType::Average,
    3101           38 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3102           76 :                     SetupOutputVariable(state,
    3103              :                                         "Cooling Coil Latent Cooling Rate",
    3104              :                                         Constant::Units::W,
    3105           38 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QLatent,
    3106              :                                         OutputProcessor::TimeStepType::System,
    3107              :                                         OutputProcessor::StoreType::Average,
    3108           38 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3109           76 :                     SetupOutputVariable(state,
    3110              :                                         "Cooling Coil Air Outlet Temperature",
    3111              :                                         Constant::Units::C,
    3112           38 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirDBTemp,
    3113              :                                         OutputProcessor::TimeStepType::System,
    3114              :                                         OutputProcessor::StoreType::Average,
    3115           38 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3116           76 :                     SetupOutputVariable(state,
    3117              :                                         "Cooling Coil Air Outlet Humidity Ratio",
    3118              :                                         Constant::Units::kgWater_kgDryAir,
    3119           38 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirHumRat,
    3120              :                                         OutputProcessor::TimeStepType::System,
    3121              :                                         OutputProcessor::StoreType::Average,
    3122           38 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3123           76 :                     SetupOutputVariable(state,
    3124              :                                         "Cooling Coil Sensible Cooling Rate",
    3125              :                                         Constant::Units::W,
    3126           38 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QSensible,
    3127              :                                         OutputProcessor::TimeStepType::System,
    3128              :                                         OutputProcessor::StoreType::Average,
    3129           38 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3130           76 :                     SetupOutputVariable(state,
    3131              :                                         "Cooling Coil Total Cooling Rate",
    3132              :                                         Constant::Units::W,
    3133           38 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QLoadTotal,
    3134              :                                         OutputProcessor::TimeStepType::System,
    3135              :                                         OutputProcessor::StoreType::Average,
    3136           38 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3137           76 :                     SetupOutputVariable(state,
    3138              :                                         "Cooling Coil Part Load Ratio",
    3139              :                                         Constant::Units::None,
    3140           38 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PartLoadRatio,
    3141              :                                         OutputProcessor::TimeStepType::System,
    3142              :                                         OutputProcessor::StoreType::Average,
    3143           38 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3144           76 :                     SetupOutputVariable(state,
    3145              :                                         "Cooling Coil Electricity Rate",
    3146              :                                         Constant::Units::W,
    3147           38 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Power,
    3148              :                                         OutputProcessor::TimeStepType::System,
    3149              :                                         OutputProcessor::StoreType::Average,
    3150           38 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3151           76 :                     SetupOutputVariable(state,
    3152              :                                         "Cooling Coil Runtime Fraction",
    3153              :                                         Constant::Units::None,
    3154           38 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac,
    3155              :                                         OutputProcessor::TimeStepType::System,
    3156              :                                         OutputProcessor::StoreType::Average,
    3157           38 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3158           76 :                     SetupOutputVariable(state,
    3159              :                                         "Cooling Coil Source Side Heat Transfer Rate",
    3160              :                                         Constant::Units::W,
    3161           38 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QSource,
    3162              :                                         OutputProcessor::TimeStepType::System,
    3163              :                                         OutputProcessor::StoreType::Average,
    3164           38 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3165           76 :                     SetupOutputVariable(state,
    3166              :                                         "Cooling Coil Upper Speed Level",
    3167              :                                         Constant::Units::None,
    3168           38 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SpeedNumReport,
    3169              :                                         OutputProcessor::TimeStepType::System,
    3170              :                                         OutputProcessor::StoreType::Average,
    3171           38 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3172           76 :                     SetupOutputVariable(state,
    3173              :                                         "Cooling Coil Neighboring Speed Levels Ratio",
    3174              :                                         Constant::Units::None,
    3175           38 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SpeedRatioReport,
    3176              :                                         OutputProcessor::TimeStepType::System,
    3177              :                                         OutputProcessor::StoreType::Average,
    3178           38 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3179              : 
    3180           38 :                     if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondensateCollectMode == CondensateToTank) {
    3181            0 :                         SetupOutputVariable(state,
    3182              :                                             "Cooling Coil Condensate Volume Flow Rate",
    3183              :                                             Constant::Units::m3_s,
    3184            0 :                                             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondensateVdot,
    3185              :                                             OutputProcessor::TimeStepType::System,
    3186              :                                             OutputProcessor::StoreType::Average,
    3187            0 :                                             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3188            0 :                         SetupOutputVariable(state,
    3189              :                                             "Cooling Coil Condensate Volume",
    3190              :                                             Constant::Units::m3,
    3191            0 :                                             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondensateVol,
    3192              :                                             OutputProcessor::TimeStepType::System,
    3193              :                                             OutputProcessor::StoreType::Sum,
    3194            0 :                                             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
    3195              :                                             Constant::eResource::OnSiteWater,
    3196              :                                             OutputProcessor::Group::HVAC,
    3197              :                                             OutputProcessor::EndUseCat::Condensate);
    3198              :                     }
    3199              : 
    3200           38 :                     if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).ReportEvapCondVars) {
    3201            2 :                         SetupOutputVariable(state,
    3202              :                                             "Cooling Coil Condenser Inlet Temperature",
    3203              :                                             Constant::Units::C,
    3204            1 :                                             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondInletTemp,
    3205              :                                             OutputProcessor::TimeStepType::System,
    3206              :                                             OutputProcessor::StoreType::Average,
    3207            1 :                                             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3208            2 :                         SetupOutputVariable(state,
    3209              :                                             "Cooling Coil Evaporative Condenser Water Volume",
    3210              :                                             Constant::Units::m3,
    3211            1 :                                             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapWaterConsump,
    3212              :                                             OutputProcessor::TimeStepType::System,
    3213              :                                             OutputProcessor::StoreType::Sum,
    3214            1 :                                             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
    3215              :                                             Constant::eResource::Water,
    3216              :                                             OutputProcessor::Group::HVAC,
    3217              :                                             OutputProcessor::EndUseCat::Cooling);
    3218            2 :                         SetupOutputVariable(state,
    3219              :                                             "Cooling Coil Evaporative Condenser Mains Water Volume",
    3220              :                                             Constant::Units::m3,
    3221            1 :                                             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapWaterConsump,
    3222              :                                             OutputProcessor::TimeStepType::System,
    3223              :                                             OutputProcessor::StoreType::Sum,
    3224            1 :                                             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
    3225              :                                             Constant::eResource::MainsWater,
    3226              :                                             OutputProcessor::Group::HVAC,
    3227              :                                             OutputProcessor::EndUseCat::Cooling);
    3228            2 :                         SetupOutputVariable(state,
    3229              :                                             "Cooling Coil Evaporative Condenser Pump Electricity Rate",
    3230              :                                             Constant::Units::W,
    3231            1 :                                             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapCondPumpElecPower,
    3232              :                                             OutputProcessor::TimeStepType::System,
    3233              :                                             OutputProcessor::StoreType::Average,
    3234            1 :                                             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3235            2 :                         SetupOutputVariable(state,
    3236              :                                             "Cooling Coil Evaporative Condenser Pump Electricity Energy",
    3237              :                                             Constant::Units::J,
    3238            1 :                                             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapCondPumpElecConsumption,
    3239              :                                             OutputProcessor::TimeStepType::System,
    3240              :                                             OutputProcessor::StoreType::Sum,
    3241            1 :                                             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
    3242              :                                             Constant::eResource::Electricity,
    3243              :                                             OutputProcessor::Group::HVAC,
    3244              :                                             OutputProcessor::EndUseCat::Cooling);
    3245            1 :                         if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).BasinHeaterPowerFTempDiff > 0.0) {
    3246            0 :                             SetupOutputVariable(state,
    3247              :                                                 "Cooling Coil Basin Heater Electricity Rate",
    3248              :                                                 Constant::Units::W,
    3249            0 :                                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).BasinHeaterPower,
    3250              :                                                 OutputProcessor::TimeStepType::System,
    3251              :                                                 OutputProcessor::StoreType::Average,
    3252            0 :                                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3253            0 :                             SetupOutputVariable(state,
    3254              :                                                 "Cooling Coil Basin Heater Electricity Energy",
    3255              :                                                 Constant::Units::J,
    3256            0 :                                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).BasinHeaterConsumption,
    3257              :                                                 OutputProcessor::TimeStepType::System,
    3258              :                                                 OutputProcessor::StoreType::Sum,
    3259            0 :                                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
    3260              :                                                 Constant::eResource::Electricity,
    3261              :                                                 OutputProcessor::Group::HVAC,
    3262              :                                                 OutputProcessor::EndUseCat::Cooling);
    3263              :                         }
    3264              :                     }
    3265              : 
    3266           76 :                     SetupOutputVariable(state,
    3267              :                                         "Cooling Coil Crankcase Heater Electricity Rate",
    3268              :                                         Constant::Units::W,
    3269           38 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterPower,
    3270              :                                         OutputProcessor::TimeStepType::System,
    3271              :                                         OutputProcessor::StoreType::Average,
    3272           38 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3273           76 :                     SetupOutputVariable(state,
    3274              :                                         "Cooling Coil Crankcase Heater Electricity Energy",
    3275              :                                         Constant::Units::J,
    3276           38 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterConsumption,
    3277              :                                         OutputProcessor::TimeStepType::System,
    3278              :                                         OutputProcessor::StoreType::Sum,
    3279           38 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
    3280              :                                         Constant::eResource::Electricity,
    3281              :                                         OutputProcessor::Group::HVAC,
    3282              :                                         OutputProcessor::EndUseCat::Cooling);
    3283              :                 } else {
    3284              :                     // air source heating coils
    3285           26 :                     SetupOutputVariable(state,
    3286              :                                         "Heating Coil Air Mass Flow Rate",
    3287              :                                         Constant::Units::kg_s,
    3288           13 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirMassFlowRate,
    3289              :                                         OutputProcessor::TimeStepType::System,
    3290              :                                         OutputProcessor::StoreType::Average,
    3291           13 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3292           26 :                     SetupOutputVariable(state,
    3293              :                                         "Heating Coil Air Inlet Temperature",
    3294              :                                         Constant::Units::C,
    3295           13 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirDBTemp,
    3296              :                                         OutputProcessor::TimeStepType::System,
    3297              :                                         OutputProcessor::StoreType::Average,
    3298           13 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3299           26 :                     SetupOutputVariable(state,
    3300              :                                         "Heating Coil Air Inlet Humidity Ratio",
    3301              :                                         Constant::Units::kgWater_kgDryAir,
    3302           13 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirHumRat,
    3303              :                                         OutputProcessor::TimeStepType::System,
    3304              :                                         OutputProcessor::StoreType::Average,
    3305           13 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3306           26 :                     SetupOutputVariable(state,
    3307              :                                         "Heating Coil Air Outlet Temperature",
    3308              :                                         Constant::Units::C,
    3309           13 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirDBTemp,
    3310              :                                         OutputProcessor::TimeStepType::System,
    3311              :                                         OutputProcessor::StoreType::Average,
    3312           13 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3313           26 :                     SetupOutputVariable(state,
    3314              :                                         "Heating Coil Air Outlet Humidity Ratio",
    3315              :                                         Constant::Units::kgWater_kgDryAir,
    3316           13 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirHumRat,
    3317              :                                         OutputProcessor::TimeStepType::System,
    3318              :                                         OutputProcessor::StoreType::Average,
    3319           13 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3320           26 :                     SetupOutputVariable(state,
    3321              :                                         "Heating Coil Sensible Heating Rate",
    3322              :                                         Constant::Units::W,
    3323           13 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QSensible,
    3324              :                                         OutputProcessor::TimeStepType::System,
    3325              :                                         OutputProcessor::StoreType::Average,
    3326           13 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3327           26 :                     SetupOutputVariable(state,
    3328              :                                         "Heating Coil Heating Rate",
    3329              :                                         Constant::Units::W,
    3330           13 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QLoadTotal,
    3331              :                                         OutputProcessor::TimeStepType::System,
    3332              :                                         OutputProcessor::StoreType::Average,
    3333           13 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3334           26 :                     SetupOutputVariable(state,
    3335              :                                         "Heating Coil Part Load Ratio",
    3336              :                                         Constant::Units::None,
    3337           13 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PartLoadRatio,
    3338              :                                         OutputProcessor::TimeStepType::System,
    3339              :                                         OutputProcessor::StoreType::Average,
    3340           13 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3341           26 :                     SetupOutputVariable(state,
    3342              :                                         "Heating Coil Electricity Rate",
    3343              :                                         Constant::Units::W,
    3344           13 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Power,
    3345              :                                         OutputProcessor::TimeStepType::System,
    3346              :                                         OutputProcessor::StoreType::Average,
    3347           13 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3348           26 :                     SetupOutputVariable(state,
    3349              :                                         "Heating Coil Runtime Fraction",
    3350              :                                         Constant::Units::None,
    3351           13 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac,
    3352              :                                         OutputProcessor::TimeStepType::System,
    3353              :                                         OutputProcessor::StoreType::Average,
    3354           13 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3355              : 
    3356           26 :                     SetupOutputVariable(state,
    3357              :                                         "Heating Coil Source Side Heat Transfer Rate",
    3358              :                                         Constant::Units::W,
    3359           13 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QSource,
    3360              :                                         OutputProcessor::TimeStepType::System,
    3361              :                                         OutputProcessor::StoreType::Average,
    3362           13 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3363           26 :                     SetupOutputVariable(state,
    3364              :                                         "Heating Coil Upper Speed Level",
    3365              :                                         Constant::Units::None,
    3366           13 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SpeedNumReport,
    3367              :                                         OutputProcessor::TimeStepType::System,
    3368              :                                         OutputProcessor::StoreType::Average,
    3369           13 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3370           26 :                     SetupOutputVariable(state,
    3371              :                                         "Heating Coil Neighboring Speed Levels Ratio",
    3372              :                                         Constant::Units::None,
    3373           13 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SpeedRatioReport,
    3374              :                                         OutputProcessor::TimeStepType::System,
    3375              :                                         OutputProcessor::StoreType::Average,
    3376           13 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3377              : 
    3378           26 :                     SetupOutputVariable(state,
    3379              :                                         "Heating Coil Defrost Electricity Rate",
    3380              :                                         Constant::Units::W,
    3381           13 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostPower,
    3382              :                                         OutputProcessor::TimeStepType::System,
    3383              :                                         OutputProcessor::StoreType::Average,
    3384           13 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3385           26 :                     SetupOutputVariable(state,
    3386              :                                         "Heating Coil Defrost Electricity Energy",
    3387              :                                         Constant::Units::J,
    3388           13 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostConsumption,
    3389              :                                         OutputProcessor::TimeStepType::System,
    3390              :                                         OutputProcessor::StoreType::Sum,
    3391           13 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
    3392              :                                         Constant::eResource::Electricity,
    3393              :                                         OutputProcessor::Group::HVAC,
    3394              :                                         OutputProcessor::EndUseCat::Heating);
    3395           26 :                     SetupOutputVariable(state,
    3396              :                                         "Heating Coil Crankcase Heater Electricity Rate",
    3397              :                                         Constant::Units::W,
    3398           13 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterPower,
    3399              :                                         OutputProcessor::TimeStepType::System,
    3400              :                                         OutputProcessor::StoreType::Average,
    3401           13 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3402           26 :                     SetupOutputVariable(state,
    3403              :                                         "Heating Coil Crankcase Heater Electricity Energy",
    3404              :                                         Constant::Units::J,
    3405           13 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterConsumption,
    3406              :                                         OutputProcessor::TimeStepType::System,
    3407              :                                         OutputProcessor::StoreType::Sum,
    3408           13 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
    3409              :                                         Constant::eResource::Electricity,
    3410              :                                         OutputProcessor::Group::HVAC,
    3411              :                                         OutputProcessor::EndUseCat::Heating);
    3412              : 
    3413           13 :                     if (state.dataGlobal->AnyEnergyManagementSystemInModel) {
    3414            0 :                         SetupEMSActuator(state,
    3415            0 :                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VarSpeedCoilType,
    3416            0 :                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
    3417              :                                          "Frost Heating Capacity Multiplier",
    3418              :                                          "[]",
    3419            0 :                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).FrostHeatingCapacityMultiplierEMSOverrideOn,
    3420            0 :                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).FrostHeatingCapacityMultiplierEMSOverrideValue);
    3421              : 
    3422            0 :                         SetupEMSActuator(state,
    3423            0 :                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VarSpeedCoilType,
    3424            0 :                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
    3425              :                                          "Frost Heating Input Power Multiplier",
    3426              :                                          "[]",
    3427            0 :                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).FrostHeatingInputPowerMultiplierEMSOverrideOn,
    3428            0 :                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).FrostHeatingInputPowerMultiplierEMSOverrideValue);
    3429              :                     }
    3430              :                 }
    3431              :             } else {
    3432              : 
    3433           16 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType ==
    3434              :                     HVAC::Coil_CoolingWaterToAirHPVSEquationFit) { // fix coil type
    3435              :                     // cooling WAHP coil
    3436              :                     // Setup Report variables for water source Heat Pump
    3437           10 :                     SetupOutputVariable(state,
    3438              :                                         "Cooling Coil Electricity Rate",
    3439              :                                         Constant::Units::W,
    3440            5 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Power,
    3441              :                                         OutputProcessor::TimeStepType::System,
    3442              :                                         OutputProcessor::StoreType::Average,
    3443            5 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3444           10 :                     SetupOutputVariable(state,
    3445              :                                         "Cooling Coil Total Cooling Rate",
    3446              :                                         Constant::Units::W,
    3447            5 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QLoadTotal,
    3448              :                                         OutputProcessor::TimeStepType::System,
    3449              :                                         OutputProcessor::StoreType::Average,
    3450            5 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3451           10 :                     SetupOutputVariable(state,
    3452              :                                         "Cooling Coil Sensible Cooling Rate",
    3453              :                                         Constant::Units::W,
    3454            5 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QSensible,
    3455              :                                         OutputProcessor::TimeStepType::System,
    3456              :                                         OutputProcessor::StoreType::Average,
    3457            5 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3458           10 :                     SetupOutputVariable(state,
    3459              :                                         "Cooling Coil Latent Cooling Rate",
    3460              :                                         Constant::Units::W,
    3461            5 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QLatent,
    3462              :                                         OutputProcessor::TimeStepType::System,
    3463              :                                         OutputProcessor::StoreType::Average,
    3464            5 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3465           10 :                     SetupOutputVariable(state,
    3466              :                                         "Cooling Coil Source Side Heat Transfer Rate",
    3467              :                                         Constant::Units::W,
    3468            5 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QSource,
    3469              :                                         OutputProcessor::TimeStepType::System,
    3470              :                                         OutputProcessor::StoreType::Average,
    3471            5 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3472           10 :                     SetupOutputVariable(state,
    3473              :                                         "Cooling Coil Part Load Ratio",
    3474              :                                         Constant::Units::None,
    3475            5 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PartLoadRatio,
    3476              :                                         OutputProcessor::TimeStepType::System,
    3477              :                                         OutputProcessor::StoreType::Average,
    3478            5 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3479           10 :                     SetupOutputVariable(state,
    3480              :                                         "Cooling Coil Runtime Fraction",
    3481              :                                         Constant::Units::None,
    3482            5 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac,
    3483              :                                         OutputProcessor::TimeStepType::System,
    3484              :                                         OutputProcessor::StoreType::Average,
    3485            5 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3486              : 
    3487           10 :                     SetupOutputVariable(state,
    3488              :                                         "Cooling Coil Air Mass Flow Rate",
    3489              :                                         Constant::Units::kg_s,
    3490            5 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirMassFlowRate,
    3491              :                                         OutputProcessor::TimeStepType::System,
    3492              :                                         OutputProcessor::StoreType::Average,
    3493            5 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3494           10 :                     SetupOutputVariable(state,
    3495              :                                         "Cooling Coil Air Inlet Temperature",
    3496              :                                         Constant::Units::C,
    3497            5 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirDBTemp,
    3498              :                                         OutputProcessor::TimeStepType::System,
    3499              :                                         OutputProcessor::StoreType::Average,
    3500            5 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3501           10 :                     SetupOutputVariable(state,
    3502              :                                         "Cooling Coil Air Inlet Humidity Ratio",
    3503              :                                         Constant::Units::kgWater_kgDryAir,
    3504            5 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirHumRat,
    3505              :                                         OutputProcessor::TimeStepType::System,
    3506              :                                         OutputProcessor::StoreType::Average,
    3507            5 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3508           10 :                     SetupOutputVariable(state,
    3509              :                                         "Cooling Coil Air Outlet Temperature",
    3510              :                                         Constant::Units::C,
    3511            5 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirDBTemp,
    3512              :                                         OutputProcessor::TimeStepType::System,
    3513              :                                         OutputProcessor::StoreType::Average,
    3514            5 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3515           10 :                     SetupOutputVariable(state,
    3516              :                                         "Cooling Coil Air Outlet Humidity Ratio",
    3517              :                                         Constant::Units::kgWater_kgDryAir,
    3518            5 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirHumRat,
    3519              :                                         OutputProcessor::TimeStepType::System,
    3520              :                                         OutputProcessor::StoreType::Average,
    3521            5 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3522           10 :                     SetupOutputVariable(state,
    3523              :                                         "Cooling Coil Source Side Mass Flow Rate",
    3524              :                                         Constant::Units::kg_s,
    3525            5 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterMassFlowRate,
    3526              :                                         OutputProcessor::TimeStepType::System,
    3527              :                                         OutputProcessor::StoreType::Average,
    3528            5 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3529           10 :                     SetupOutputVariable(state,
    3530              :                                         "Cooling Coil Source Side Inlet Temperature",
    3531              :                                         Constant::Units::C,
    3532            5 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletWaterTemp,
    3533              :                                         OutputProcessor::TimeStepType::System,
    3534              :                                         OutputProcessor::StoreType::Average,
    3535            5 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3536           10 :                     SetupOutputVariable(state,
    3537              :                                         "Cooling Coil Source Side Outlet Temperature",
    3538              :                                         Constant::Units::C,
    3539            5 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletWaterTemp,
    3540              :                                         OutputProcessor::TimeStepType::System,
    3541              :                                         OutputProcessor::StoreType::Average,
    3542            5 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3543              : 
    3544           10 :                     SetupOutputVariable(state,
    3545              :                                         "Cooling Coil Upper Speed Level",
    3546              :                                         Constant::Units::None,
    3547            5 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SpeedNumReport,
    3548              :                                         OutputProcessor::TimeStepType::System,
    3549              :                                         OutputProcessor::StoreType::Average,
    3550            5 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3551           10 :                     SetupOutputVariable(state,
    3552              :                                         "Cooling Coil Neighboring Speed Levels Ratio",
    3553              :                                         Constant::Units::None,
    3554            5 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SpeedRatioReport,
    3555              :                                         OutputProcessor::TimeStepType::System,
    3556              :                                         OutputProcessor::StoreType::Average,
    3557            5 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3558           10 :                     SetupOutputVariable(state,
    3559              :                                         "Cooling Coil Recoverable Heat Transfer Rate",
    3560              :                                         Constant::Units::W,
    3561            5 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QWasteHeat,
    3562              :                                         OutputProcessor::TimeStepType::System,
    3563              :                                         OutputProcessor::StoreType::Average,
    3564            5 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3565           11 :                 } else if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType ==
    3566              :                            HVAC::Coil_HeatingWaterToAirHPVSEquationFit) { // fix coil type
    3567              :                     // heating WAHP coil
    3568              :                     // Setup Report variables for water source Heat Pump
    3569            8 :                     SetupOutputVariable(state,
    3570              :                                         "Heating Coil Electricity Rate",
    3571              :                                         Constant::Units::W,
    3572            4 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Power,
    3573              :                                         OutputProcessor::TimeStepType::System,
    3574              :                                         OutputProcessor::StoreType::Average,
    3575            4 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3576            8 :                     SetupOutputVariable(state,
    3577              :                                         "Heating Coil Heating Rate",
    3578              :                                         Constant::Units::W,
    3579            4 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QLoadTotal,
    3580              :                                         OutputProcessor::TimeStepType::System,
    3581              :                                         OutputProcessor::StoreType::Average,
    3582            4 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3583            8 :                     SetupOutputVariable(state,
    3584              :                                         "Heating Coil Sensible Heating Rate",
    3585              :                                         Constant::Units::W,
    3586            4 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QSensible,
    3587              :                                         OutputProcessor::TimeStepType::System,
    3588              :                                         OutputProcessor::StoreType::Average,
    3589            4 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3590              : 
    3591            8 :                     SetupOutputVariable(state,
    3592              :                                         "Heating Coil Source Side Heat Transfer Rate",
    3593              :                                         Constant::Units::W,
    3594            4 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QSource,
    3595              :                                         OutputProcessor::TimeStepType::System,
    3596              :                                         OutputProcessor::StoreType::Average,
    3597            4 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3598            8 :                     SetupOutputVariable(state,
    3599              :                                         "Heating Coil Part Load Ratio",
    3600              :                                         Constant::Units::None,
    3601            4 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PartLoadRatio,
    3602              :                                         OutputProcessor::TimeStepType::System,
    3603              :                                         OutputProcessor::StoreType::Average,
    3604            4 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3605            8 :                     SetupOutputVariable(state,
    3606              :                                         "Heating Coil Runtime Fraction",
    3607              :                                         Constant::Units::None,
    3608            4 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac,
    3609              :                                         OutputProcessor::TimeStepType::System,
    3610              :                                         OutputProcessor::StoreType::Average,
    3611            4 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3612              : 
    3613            8 :                     SetupOutputVariable(state,
    3614              :                                         "Heating Coil Air Mass Flow Rate",
    3615              :                                         Constant::Units::kg_s,
    3616            4 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirMassFlowRate,
    3617              :                                         OutputProcessor::TimeStepType::System,
    3618              :                                         OutputProcessor::StoreType::Average,
    3619            4 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3620            8 :                     SetupOutputVariable(state,
    3621              :                                         "Heating Coil Air Inlet Temperature",
    3622              :                                         Constant::Units::C,
    3623            4 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirDBTemp,
    3624              :                                         OutputProcessor::TimeStepType::System,
    3625              :                                         OutputProcessor::StoreType::Average,
    3626            4 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3627            8 :                     SetupOutputVariable(state,
    3628              :                                         "Heating Coil Air Inlet Humidity Ratio",
    3629              :                                         Constant::Units::kgWater_kgDryAir,
    3630            4 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirHumRat,
    3631              :                                         OutputProcessor::TimeStepType::System,
    3632              :                                         OutputProcessor::StoreType::Average,
    3633            4 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3634            8 :                     SetupOutputVariable(state,
    3635              :                                         "Heating Coil Air Outlet Temperature",
    3636              :                                         Constant::Units::C,
    3637            4 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirDBTemp,
    3638              :                                         OutputProcessor::TimeStepType::System,
    3639              :                                         OutputProcessor::StoreType::Average,
    3640            4 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3641            8 :                     SetupOutputVariable(state,
    3642              :                                         "Heating Coil Air Outlet Humidity Ratio",
    3643              :                                         Constant::Units::kgWater_kgDryAir,
    3644            4 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirHumRat,
    3645              :                                         OutputProcessor::TimeStepType::System,
    3646              :                                         OutputProcessor::StoreType::Average,
    3647            4 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3648            8 :                     SetupOutputVariable(state,
    3649              :                                         "Heating Coil Source Side Mass Flow Rate",
    3650              :                                         Constant::Units::kg_s,
    3651            4 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterMassFlowRate,
    3652              :                                         OutputProcessor::TimeStepType::System,
    3653              :                                         OutputProcessor::StoreType::Average,
    3654            4 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3655            8 :                     SetupOutputVariable(state,
    3656              :                                         "Heating Coil Source Side Inlet Temperature",
    3657              :                                         Constant::Units::C,
    3658            4 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletWaterTemp,
    3659              :                                         OutputProcessor::TimeStepType::System,
    3660              :                                         OutputProcessor::StoreType::Average,
    3661            4 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3662            8 :                     SetupOutputVariable(state,
    3663              :                                         "Heating Coil Source Side Outlet Temperature",
    3664              :                                         Constant::Units::C,
    3665            4 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletWaterTemp,
    3666              :                                         OutputProcessor::TimeStepType::System,
    3667              :                                         OutputProcessor::StoreType::Average,
    3668            4 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3669              : 
    3670            8 :                     SetupOutputVariable(state,
    3671              :                                         "Heating Coil Upper Speed Level",
    3672              :                                         Constant::Units::None,
    3673            4 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SpeedNumReport,
    3674              :                                         OutputProcessor::TimeStepType::System,
    3675              :                                         OutputProcessor::StoreType::Average,
    3676            4 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3677            8 :                     SetupOutputVariable(state,
    3678              :                                         "Heating Coil Neighboring Speed Levels Ratio",
    3679              :                                         Constant::Units::None,
    3680            4 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SpeedRatioReport,
    3681              :                                         OutputProcessor::TimeStepType::System,
    3682              :                                         OutputProcessor::StoreType::Average,
    3683            4 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3684            8 :                     SetupOutputVariable(state,
    3685              :                                         "Heating Coil Recoverable Heat Transfer Rate",
    3686              :                                         Constant::Units::W,
    3687            4 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QWasteHeat,
    3688              :                                         OutputProcessor::TimeStepType::System,
    3689              :                                         OutputProcessor::StoreType::Average,
    3690            4 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3691            7 :                 } else if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::CoilDX_HeatPumpWaterHeaterVariableSpeed) {
    3692              :                     // air source water heating coil
    3693           14 :                     SetupOutputVariable(state,
    3694              :                                         "Cooling Coil Water Heating Electricity Rate",
    3695              :                                         Constant::Units::W,
    3696            7 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Power,
    3697              :                                         OutputProcessor::TimeStepType::System,
    3698              :                                         OutputProcessor::StoreType::Average,
    3699            7 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3700           14 :                     SetupOutputVariable(state,
    3701              :                                         "Cooling Coil Total Cooling Rate",
    3702              :                                         Constant::Units::W,
    3703            7 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QLoadTotal,
    3704              :                                         OutputProcessor::TimeStepType::System,
    3705              :                                         OutputProcessor::StoreType::Average,
    3706            7 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3707           14 :                     SetupOutputVariable(state,
    3708              :                                         "Cooling Coil Sensible Cooling Rate",
    3709              :                                         Constant::Units::W,
    3710            7 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QSensible,
    3711              :                                         OutputProcessor::TimeStepType::System,
    3712              :                                         OutputProcessor::StoreType::Average,
    3713            7 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3714           14 :                     SetupOutputVariable(state,
    3715              :                                         "Cooling Coil Latent Cooling Rate",
    3716              :                                         Constant::Units::W,
    3717            7 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QLatent,
    3718              :                                         OutputProcessor::TimeStepType::System,
    3719              :                                         OutputProcessor::StoreType::Average,
    3720            7 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3721           14 :                     SetupOutputVariable(state,
    3722              :                                         "Cooling Coil Total Water Heating Rate",
    3723              :                                         Constant::Units::W,
    3724            7 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).TotalHeatingEnergyRate,
    3725              :                                         OutputProcessor::TimeStepType::System,
    3726              :                                         OutputProcessor::StoreType::Average,
    3727            7 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3728           14 :                     SetupOutputVariable(state,
    3729              :                                         "Cooling Coil Part Load Ratio",
    3730              :                                         Constant::Units::None,
    3731            7 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PartLoadRatio,
    3732              :                                         OutputProcessor::TimeStepType::System,
    3733              :                                         OutputProcessor::StoreType::Average,
    3734            7 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3735           14 :                     SetupOutputVariable(state,
    3736              :                                         "Cooling Coil Runtime Fraction",
    3737              :                                         Constant::Units::None,
    3738            7 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac,
    3739              :                                         OutputProcessor::TimeStepType::System,
    3740              :                                         OutputProcessor::StoreType::Average,
    3741            7 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3742              : 
    3743           14 :                     SetupOutputVariable(state,
    3744              :                                         "Cooling Coil Air Mass Flow Rate",
    3745              :                                         Constant::Units::kg_s,
    3746            7 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirMassFlowRate,
    3747              :                                         OutputProcessor::TimeStepType::System,
    3748              :                                         OutputProcessor::StoreType::Average,
    3749            7 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3750           14 :                     SetupOutputVariable(state,
    3751              :                                         "Cooling Coil Air Inlet Temperature",
    3752              :                                         Constant::Units::C,
    3753            7 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirDBTemp,
    3754              :                                         OutputProcessor::TimeStepType::System,
    3755              :                                         OutputProcessor::StoreType::Average,
    3756            7 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3757           14 :                     SetupOutputVariable(state,
    3758              :                                         "Cooling Coil Air Inlet Humidity Ratio",
    3759              :                                         Constant::Units::kgWater_kgDryAir,
    3760            7 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirHumRat,
    3761              :                                         OutputProcessor::TimeStepType::System,
    3762              :                                         OutputProcessor::StoreType::Average,
    3763            7 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3764           14 :                     SetupOutputVariable(state,
    3765              :                                         "Cooling Coil Air Outlet Temperature",
    3766              :                                         Constant::Units::C,
    3767            7 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirDBTemp,
    3768              :                                         OutputProcessor::TimeStepType::System,
    3769              :                                         OutputProcessor::StoreType::Average,
    3770            7 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3771           14 :                     SetupOutputVariable(state,
    3772              :                                         "Cooling Coil Air Outlet Humidity Ratio",
    3773              :                                         Constant::Units::kgWater_kgDryAir,
    3774            7 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirHumRat,
    3775              :                                         OutputProcessor::TimeStepType::System,
    3776              :                                         OutputProcessor::StoreType::Average,
    3777            7 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3778           14 :                     SetupOutputVariable(state,
    3779              :                                         "Cooling Coil Water Mass Flow Rate",
    3780              :                                         Constant::Units::kg_s,
    3781            7 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterMassFlowRate,
    3782              :                                         OutputProcessor::TimeStepType::System,
    3783              :                                         OutputProcessor::StoreType::Average,
    3784            7 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3785           14 :                     SetupOutputVariable(state,
    3786              :                                         "Cooling Coil Water Inlet Temperature",
    3787              :                                         Constant::Units::C,
    3788            7 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletWaterTemp,
    3789              :                                         OutputProcessor::TimeStepType::System,
    3790              :                                         OutputProcessor::StoreType::Average,
    3791            7 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3792           14 :                     SetupOutputVariable(state,
    3793              :                                         "Cooling Coil Water Outlet Temperature",
    3794              :                                         Constant::Units::C,
    3795            7 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletWaterTemp,
    3796              :                                         OutputProcessor::TimeStepType::System,
    3797              :                                         OutputProcessor::StoreType::Average,
    3798            7 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3799              : 
    3800           14 :                     SetupOutputVariable(state,
    3801              :                                         "Cooling Coil Crankcase Heater Electricity Rate",
    3802              :                                         Constant::Units::W,
    3803            7 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterPower,
    3804              :                                         OutputProcessor::TimeStepType::System,
    3805              :                                         OutputProcessor::StoreType::Average,
    3806            7 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3807           14 :                     SetupOutputVariable(state,
    3808              :                                         "Cooling Coil Crankcase Heater Electricity Energy",
    3809              :                                         Constant::Units::J,
    3810            7 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterConsumption,
    3811              :                                         OutputProcessor::TimeStepType::System,
    3812              :                                         OutputProcessor::StoreType::Sum,
    3813            7 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
    3814              :                                         Constant::eResource::Electricity,
    3815              :                                         OutputProcessor::Group::HVAC,
    3816              :                                         OutputProcessor::EndUseCat::Heating);
    3817              : 
    3818           14 :                     SetupOutputVariable(state,
    3819              :                                         "Cooling Coil Upper Speed Level",
    3820              :                                         Constant::Units::None,
    3821            7 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SpeedNumReport,
    3822              :                                         OutputProcessor::TimeStepType::System,
    3823              :                                         OutputProcessor::StoreType::Average,
    3824            7 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3825           14 :                     SetupOutputVariable(state,
    3826              :                                         "Cooling Coil Neighboring Speed Levels Ratio",
    3827              :                                         Constant::Units::None,
    3828            7 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SpeedRatioReport,
    3829              :                                         OutputProcessor::TimeStepType::System,
    3830              :                                         OutputProcessor::StoreType::Average,
    3831            7 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3832              : 
    3833           14 :                     SetupOutputVariable(state,
    3834              :                                         "Cooling Coil Water Heating Pump Electricity Rate",
    3835              :                                         Constant::Units::W,
    3836            7 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpElecNomPower,
    3837              :                                         OutputProcessor::TimeStepType::System,
    3838              :                                         OutputProcessor::StoreType::Average,
    3839            7 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3840           14 :                     SetupOutputVariable(state,
    3841              :                                         "Cooling Coil Water Heating Pump Electricity Energy",
    3842              :                                         Constant::Units::J,
    3843            7 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapCondPumpElecConsumption,
    3844              :                                         OutputProcessor::TimeStepType::System,
    3845              :                                         OutputProcessor::StoreType::Sum,
    3846            7 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
    3847              :                                         Constant::eResource::Electricity,
    3848              :                                         OutputProcessor::Group::HVAC,
    3849              :                                         OutputProcessor::EndUseCat::Heating);
    3850              :                 }
    3851              :             }
    3852              :         }
    3853              : 
    3854           49 :         if (ErrorsFound) {
    3855            0 :             ShowFatalError(
    3856            0 :                 state, format("{}Errors found in getting {} input.  Preceding condition(s) causes termination.", RoutineName, CurrentModuleObject));
    3857              :         }
    3858           49 :     }
    3859              : 
    3860              :     // Beginning Initialization Section of the Module
    3861              :     //******************************************************************************
    3862              : 
    3863        67679 :     void InitVarSpeedCoil(EnergyPlusData &state,
    3864              :                           int const DXCoilNum,                             // Current DXCoilNum under simulation
    3865              :                           Real64 const SensLoad,                           // Control zone sensible load[W]
    3866              :                           Real64 const LatentLoad,                         // Control zone latent load[W]
    3867              :                           HVAC::FanOp const fanOp,                         // fan operating mode
    3868              :                           [[maybe_unused]] Real64 const OnOffAirFlowRatio, // ratio of compressor on flow to average flow over time step
    3869              :                           Real64 const SpeedRatio,                         // compressor speed ratio
    3870              :                           int const SpeedNum                               // compressor speed number
    3871              :     )
    3872              :     {
    3873              : 
    3874              :         // SUBROUTINE INFORMATION:
    3875              :         //       AUTHOR         Bo Shen, based on  MODULE WaterToAirHeatPumpSimple:InitSimpleWatertoAirHP
    3876              :         //       DATE WRITTEN   March, 2012
    3877              :         //       MODIFIED       Bo Shen, 12/2014, add variable-speed HPWH
    3878              : 
    3879              :         // PURPOSE OF THIS SUBROUTINE:
    3880              :         // This subroutine is for initializations of the variable speed Water to Air HP Components.
    3881              : 
    3882              :         // METHODOLOGY EMPLOYED:
    3883              :         // Uses the status flags to trigger initializations.
    3884              : 
    3885              :         // SUBROUTINE PARAMETER DEFINITIONS:
    3886              :         static constexpr std::string_view RoutineNameSimpleWatertoAirHP("InitSimpleWatertoAirHP");
    3887              : 
    3888              :         // SUBROUTINE LOCAL VARIABLE DECLARATIONS:
    3889              :         int WaterInletNode;                // Node Number of the Water inlet
    3890              :         Real64 rho;                        // local fluid density
    3891              :         Real64 Cp;                         // local fluid specific heat
    3892              :         int SpeedCal;                      // calculated speed level
    3893              :         bool ErrorsFound;                  // TRUE when errors found, air loop initialization error
    3894              :         Real64 RatedVolFlowPerRatedTotCap; // Rated Air Volume Flow Rate divided by Rated Total Capacity [m3/s-W)
    3895              :         Real64 RatedHeatPumpIndoorAirTemp; // Indoor dry-bulb temperature to heat pump evaporator at rated conditions [C]
    3896              :         Real64 RatedHeatPumpIndoorHumRat;  // Inlet humidity ratio to heat pump evaporator at rated conditions [kg/kg]
    3897              :         Real64 WaterFlowScale;             // water flow scaling factor match rated flow rate
    3898              : 
    3899              :         // SUBROUTINE PARAMETER DEFINITIONS:
    3900              :         static constexpr std::string_view RoutineName = "InitVarSpeedCoil";
    3901        67679 :         int AirInletNode = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirInletNodeNum;
    3902              : 
    3903        67679 :         if (state.dataVariableSpeedCoils->MyOneTimeFlag) {
    3904              :             // initialize the environment and sizing flags
    3905           16 :             state.dataVariableSpeedCoils->MySizeFlag.allocate(state.dataVariableSpeedCoils->NumVarSpeedCoils);
    3906           16 :             state.dataVariableSpeedCoils->MyEnvrnFlag.allocate(state.dataVariableSpeedCoils->NumVarSpeedCoils);
    3907           16 :             state.dataVariableSpeedCoils->MyPlantScanFlag.allocate(state.dataVariableSpeedCoils->NumVarSpeedCoils);
    3908           16 :             state.dataVariableSpeedCoils->MySizeFlag = true;
    3909           16 :             state.dataVariableSpeedCoils->MyEnvrnFlag = true;
    3910           16 :             state.dataVariableSpeedCoils->MyPlantScanFlag = true;
    3911           16 :             state.dataVariableSpeedCoils->MyOneTimeFlag = false;
    3912              :         }
    3913              : 
    3914        67679 :         state.dataHVACGlobal->DXCT = HVAC::DXCoilType::Regular; // hard-code to non-DOAS sizing routine for cfm/ton until .ISHundredPercentDOASDXCoil
    3915              :                                                                 // member from DXcoils.cc is added to VarSpeedCoil object
    3916              : 
    3917              :         // variable-speed heat pump water heating, begin
    3918        67679 :         if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::CoilDX_HeatPumpWaterHeaterVariableSpeed &&
    3919            0 :             state.dataVariableSpeedCoils->MySizeFlag(DXCoilNum)) {
    3920              : 
    3921            0 :             ErrorsFound = false;
    3922            0 :             SizeVarSpeedCoil(state, DXCoilNum, ErrorsFound);
    3923            0 :             if (ErrorsFound) {
    3924            0 :                 ShowFatalError(state, format("{}: Failed to size variable speed coil.", RoutineName));
    3925              :             }
    3926              : 
    3927              :             //   get rated coil bypass factor excluding fan heat
    3928              : 
    3929            0 :             state.dataVariableSpeedCoils->MySizeFlag(DXCoilNum) = false;
    3930              :         }
    3931              :         // variable-speed heat pump water heating, end
    3932              : 
    3933              :         // water source
    3934       101721 :         if ((state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_CoolingWaterToAirHPVSEquationFit) ||
    3935        34042 :             (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_HeatingWaterToAirHPVSEquationFit)) { // fix coil type
    3936        67273 :             if (state.dataVariableSpeedCoils->MyPlantScanFlag(DXCoilNum) && allocated(state.dataPlnt->PlantLoop)) {
    3937              :                 // switch from coil type numbers in DataHVACGlobals, to coil type numbers in plant.
    3938            3 :                 DataPlant::PlantEquipmentType CoilVSWAHPType(DataPlant::PlantEquipmentType::Invalid);
    3939            3 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_CoolingWaterToAirHPVSEquationFit) {
    3940            2 :                     CoilVSWAHPType = DataPlant::PlantEquipmentType::CoilVSWAHPCoolingEquationFit;
    3941            1 :                 } else if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_HeatingWaterToAirHPVSEquationFit) {
    3942            1 :                     CoilVSWAHPType = DataPlant::PlantEquipmentType::CoilVSWAHPHeatingEquationFit;
    3943              :                 }
    3944            3 :                 ErrorsFound = false;
    3945            6 :                 PlantUtilities::ScanPlantLoopsForObject(state,
    3946            3 :                                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
    3947              :                                                         CoilVSWAHPType,
    3948            3 :                                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).plantLoc,
    3949              :                                                         ErrorsFound,
    3950              :                                                         _,
    3951              :                                                         _,
    3952              :                                                         _,
    3953              :                                                         _,
    3954              :                                                         _);
    3955            3 :                 if (ErrorsFound) {
    3956            0 :                     ShowFatalError(state, "InitVarSpeedCoil: Program terminated for previous conditions.");
    3957              :                 }
    3958            3 :                 state.dataVariableSpeedCoils->MyPlantScanFlag(DXCoilNum) = false;
    3959              :             }
    3960              :         } else {
    3961          406 :             state.dataVariableSpeedCoils->MyPlantScanFlag(DXCoilNum) = false;
    3962              :         }
    3963              : 
    3964        67697 :         if (!state.dataGlobal->SysSizingCalc && state.dataVariableSpeedCoils->MySizeFlag(DXCoilNum) &&
    3965           18 :             !state.dataVariableSpeedCoils->MyPlantScanFlag(DXCoilNum)) {
    3966              :             // for each furnace, do the sizing once.
    3967           18 :             ErrorsFound = false;
    3968           18 :             SizeVarSpeedCoil(state, DXCoilNum, ErrorsFound);
    3969           18 :             if (ErrorsFound) {
    3970            0 :                 ShowFatalError(state, format("{}: Failed to size variable speed coil.", RoutineName));
    3971              :             }
    3972              : 
    3973           18 :             state.dataVariableSpeedCoils->MySizeFlag(DXCoilNum) = false;
    3974              : 
    3975              :             // Multispeed Cooling
    3976           34 :             if ((state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_CoolingWaterToAirHPVSEquationFit) ||
    3977           16 :                 (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed)) {
    3978           86 :                 for (int Mode = 1; Mode <= state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds; ++Mode) {
    3979           74 :                     if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedCapCoolTotal <= 0.0) {
    3980            1 :                         break;
    3981              :                     }
    3982              :                     // Check for zero capacity or zero max flow rate
    3983           73 :                     if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(Mode) <= 0.0) {
    3984            0 :                         ShowSevereError(state,
    3985            0 :                                         format("Sizing: {} {} has zero rated total capacity at speed {}",
    3986            0 :                                                state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VarSpeedCoilType,
    3987            0 :                                                state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
    3988              :                                                Mode));
    3989            0 :                         ErrorsFound = true;
    3990              :                     }
    3991           73 :                     if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirVolFlowRate(Mode) <= 0.0) {
    3992            0 :                         ShowSevereError(state,
    3993            0 :                                         format("Sizing: {} {} has zero rated air flow rate at speed {}",
    3994            0 :                                                state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VarSpeedCoilType,
    3995            0 :                                                state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
    3996              :                                                Mode));
    3997            0 :                         ErrorsFound = true;
    3998              :                     }
    3999           73 :                     if (ErrorsFound) {
    4000            0 :                         ShowFatalError(state, "Preceding condition causes termination.");
    4001              :                     }
    4002              :                     // Check for valid range of (Rated Air Volume Flow Rate / Rated Total Capacity)
    4003           73 :                     RatedVolFlowPerRatedTotCap = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirVolFlowRate(Mode) /
    4004           73 :                                                  state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(Mode);
    4005              :                 }
    4006              :                 // call coil model with everything set at rating point
    4007           13 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirDBTemp = RatedInletAirTemp;
    4008           13 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirHumRat =
    4009           13 :                     Psychrometrics::PsyWFnTdbTwbPb(state, RatedInletAirTemp, RatedInletWetBulbTemp, DataEnvironment::StdPressureSeaLevel);
    4010           13 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirEnthalpy =
    4011           13 :                     Psychrometrics::PsyHFnTdbW(RatedInletAirTemp, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirHumRat);
    4012           13 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirPressure = DataEnvironment::StdPressureSeaLevel;
    4013              : 
    4014           13 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirMassFlowRate =
    4015           13 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedAirVolFlowRate *
    4016           26 :                     Psychrometrics::PsyRhoAirFnPbTdbW(state,
    4017              :                                                       DataEnvironment::StdPressureSeaLevel,
    4018              :                                                       RatedInletAirTemp,
    4019           13 :                                                       state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirHumRat);
    4020              :                 // store environment data fill back in after rating point calc is over
    4021           13 :                 Real64 holdOutDryBulbTemp = state.dataEnvrn->OutDryBulbTemp;
    4022           13 :                 Real64 holdOutHumRat = state.dataEnvrn->OutHumRat;
    4023           13 :                 Real64 holdOutWetBulb = state.dataEnvrn->OutWetBulbTemp;
    4024           13 :                 Real64 holdOutBaroPress = state.dataEnvrn->OutBaroPress;
    4025           13 :                 Real64 ratedOutdoorAirWetBulb = 23.9; // from I/O ref. more precise value?
    4026              : 
    4027           13 :                 state.dataEnvrn->OutDryBulbTemp = RatedAmbAirTemp;
    4028           13 :                 state.dataEnvrn->OutWetBulbTemp = ratedOutdoorAirWetBulb;
    4029           13 :                 state.dataEnvrn->OutBaroPress = DataEnvironment::StdPressureSeaLevel; // assume rating is for sea level.
    4030           26 :                 state.dataEnvrn->OutHumRat =
    4031           13 :                     Psychrometrics::PsyWFnTdbTwbPb(state, RatedAmbAirTemp, ratedOutdoorAirWetBulb, DataEnvironment::StdPressureSeaLevel, RoutineName);
    4032           13 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserInletNodeNum > 0) {
    4033            0 :                     state.dataLoopNodes->Node(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserInletNodeNum).Temp = RatedAmbAirTemp;
    4034            0 :                     state.dataLoopNodes->Node(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserInletNodeNum).HumRat =
    4035            0 :                         state.dataEnvrn->OutHumRat;
    4036            0 :                     state.dataLoopNodes->Node(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserInletNodeNum).Press =
    4037              :                         DataEnvironment::StdPressureSeaLevel;
    4038            0 :                     state.dataLoopNodes->Node(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserInletNodeNum).OutAirWetBulb =
    4039              :                         ratedOutdoorAirWetBulb;
    4040              :                 }
    4041           13 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType ==
    4042              :                     HVAC::Coil_CoolingWaterToAirHPVSEquationFit) { // need to set water info for WSHP
    4043            2 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterMassFlowRate =
    4044            4 :                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedWaterMassFlowRate(
    4045            2 :                             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds);
    4046            2 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletWaterTemp = RatedInletWaterTemp; // 85 F cooling mode
    4047            2 :                     Real64 CpSource = state.dataPlnt->PlantLoop(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).plantLoc.loopNum)
    4048            2 :                                           .glycol->getSpecificHeat(state, state.dataVariableSpeedCoils->SourceSideInletTemp, RoutineName);
    4049            2 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletWaterEnthalpy =
    4050            2 :                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletWaterTemp * CpSource;
    4051              :                 }
    4052              : 
    4053              :                 // calculate coil model at rating point
    4054           13 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac = 1.0;
    4055           13 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignAirMassFlowRate =
    4056           26 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirMassFlowRate(
    4057           13 :                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds);
    4058           13 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignAirVolFlowRate =
    4059           26 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirVolFlowRate(
    4060           13 :                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds);
    4061           13 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignWaterMassFlowRate =
    4062           26 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedWaterMassFlowRate(
    4063           13 :                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds);
    4064           13 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignWaterVolFlowRate =
    4065           26 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedWaterVolFlowRate(
    4066           13 :                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds);
    4067              : 
    4068           13 :                 CalcVarSpeedCoilCooling(state,
    4069              :                                         DXCoilNum,
    4070              :                                         HVAC::FanOp::Continuous,
    4071              :                                         SensLoad,
    4072              :                                         LatentLoad,
    4073              :                                         HVAC::CompressorOp::On,
    4074              :                                         1.0,
    4075              :                                         1.0,
    4076              :                                         1.0,
    4077           13 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds);
    4078              :                 // coil outlets
    4079           13 :                 Real64 RatedOutletWetBulb(0.0);
    4080           39 :                 RatedOutletWetBulb = Psychrometrics::PsyTwbFnTdbWPb(state,
    4081           13 :                                                                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirDBTemp,
    4082           13 :                                                                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirHumRat,
    4083              :                                                                     DataEnvironment::StdPressureSeaLevel,
    4084              :                                                                     RoutineName);
    4085           13 :                 state.dataRptCoilSelection->coilSelectionReportObj->setRatedCoilConditions(
    4086              :                     state,
    4087           13 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
    4088           13 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VarSpeedCoilType,
    4089           13 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QLoadTotal, // this is the report variable
    4090           13 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QSensible,  // this is the report variable
    4091           13 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirMassFlowRate,
    4092           13 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirDBTemp,
    4093           13 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirHumRat,
    4094              :                     RatedInletWetBulbTemp,
    4095           13 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirDBTemp,
    4096           13 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirHumRat,
    4097              :                     RatedOutletWetBulb,
    4098              :                     RatedAmbAirTemp,
    4099              :                     ratedOutdoorAirWetBulb,
    4100           26 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedCBF(
    4101           13 :                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds),
    4102              :                     -999.0); // coil effectiveness not define for DX
    4103              : 
    4104              :                 // now replace the outdoor air conditions set above for one time rating point calc
    4105           13 :                 state.dataEnvrn->OutDryBulbTemp = holdOutDryBulbTemp;
    4106           13 :                 state.dataEnvrn->OutHumRat = holdOutHumRat;
    4107           13 :                 state.dataEnvrn->OutWetBulbTemp = holdOutWetBulb;
    4108           13 :                 state.dataEnvrn->OutBaroPress = holdOutBaroPress;
    4109              :             }
    4110              : 
    4111              :             // Multispeed Heating
    4112           35 :             if ((state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_HeatingWaterToAirHPVSEquationFit) ||
    4113           17 :                 (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_HeatingAirToAirVariableSpeed)) {
    4114            5 :                 RatedHeatPumpIndoorAirTemp = 21.11;  // 21.11C or 70F
    4115            5 :                 RatedHeatPumpIndoorHumRat = 0.00881; // Humidity ratio corresponding to 70F dry bulb/60F wet bulb
    4116           50 :                 for (int Mode = 1; Mode <= state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds; ++Mode) {
    4117              : 
    4118           45 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirMassFlowRate(Mode) =
    4119           45 :                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirVolFlowRate(Mode) *
    4120           45 :                         Psychrometrics::PsyRhoAirFnPbTdbW(
    4121           45 :                             state, state.dataEnvrn->OutBaroPress, RatedHeatPumpIndoorAirTemp, RatedHeatPumpIndoorHumRat, RoutineName);
    4122              :                     // Check for valid range of (Rated Air Volume Flow Rate / Rated Total Capacity)
    4123           45 :                     RatedVolFlowPerRatedTotCap = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirVolFlowRate(Mode) /
    4124           45 :                                                  state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(Mode);
    4125              :                 }
    4126              :                 // call coil model with everthing set at rating point
    4127            5 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirDBTemp = RatedInletAirTempHeat;
    4128            5 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirHumRat =
    4129            5 :                     Psychrometrics::PsyWFnTdbTwbPb(state, RatedInletAirTempHeat, RatedInletWetBulbTemp, DataEnvironment::StdPressureSeaLevel);
    4130            5 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirEnthalpy =
    4131            5 :                     Psychrometrics::PsyHFnTdbW(RatedInletAirTempHeat, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirHumRat);
    4132            5 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirPressure = DataEnvironment::StdPressureSeaLevel;
    4133              : 
    4134            5 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirMassFlowRate =
    4135            5 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedAirVolFlowRate *
    4136           10 :                     Psychrometrics::PsyRhoAirFnPbTdbW(state,
    4137              :                                                       DataEnvironment::StdPressureSeaLevel,
    4138              :                                                       RatedInletAirTempHeat,
    4139            5 :                                                       state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirHumRat);
    4140              :                 // store environment data fill back in after rating point calc is over
    4141            5 :                 Real64 holdOutDryBulbTemp = state.dataEnvrn->OutDryBulbTemp;
    4142            5 :                 Real64 holdOutHumRat = state.dataEnvrn->OutHumRat;
    4143            5 :                 Real64 holdOutWetBulb = state.dataEnvrn->OutWetBulbTemp;
    4144            5 :                 Real64 holdOutBaroPress = state.dataEnvrn->OutBaroPress;
    4145              : 
    4146            5 :                 state.dataEnvrn->OutDryBulbTemp = RatedAmbAirTempHeat;
    4147            5 :                 state.dataEnvrn->OutWetBulbTemp = RatedAmbAirWBHeat;
    4148            5 :                 state.dataEnvrn->OutBaroPress = DataEnvironment::StdPressureSeaLevel; // assume rating is for sea level.
    4149           10 :                 state.dataEnvrn->OutHumRat =
    4150            5 :                     Psychrometrics::PsyWFnTdbTwbPb(state, RatedAmbAirTempHeat, RatedAmbAirWBHeat, DataEnvironment::StdPressureSeaLevel, RoutineName);
    4151            5 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserInletNodeNum > 0) {
    4152            0 :                     state.dataLoopNodes->Node(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserInletNodeNum).Temp = RatedAmbAirTempHeat;
    4153            0 :                     state.dataLoopNodes->Node(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserInletNodeNum).HumRat =
    4154            0 :                         state.dataEnvrn->OutHumRat;
    4155            0 :                     state.dataLoopNodes->Node(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserInletNodeNum).Press =
    4156              :                         DataEnvironment::StdPressureSeaLevel;
    4157            0 :                     state.dataLoopNodes->Node(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserInletNodeNum).OutAirWetBulb =
    4158              :                         RatedAmbAirWBHeat;
    4159              :                 }
    4160              : 
    4161            5 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType ==
    4162              :                     HVAC::Coil_HeatingWaterToAirHPVSEquationFit) { // need to set water info for WSHP
    4163            1 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterMassFlowRate =
    4164            2 :                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedWaterMassFlowRate(
    4165            1 :                             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds);
    4166            1 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletWaterTemp = RatedInletWaterTempHeat; // 21.11C or 70F, heating mode
    4167            1 :                     Real64 CpSource = state.dataPlnt->PlantLoop(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).plantLoc.loopNum)
    4168            1 :                                           .glycol->getSpecificHeat(state, state.dataVariableSpeedCoils->SourceSideInletTemp, RoutineName);
    4169            1 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletWaterEnthalpy =
    4170            1 :                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletWaterTemp * CpSource;
    4171              :                 }
    4172              : 
    4173              :                 // calculate coil model at rating point
    4174            5 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac = 1.0;
    4175            5 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignAirMassFlowRate =
    4176           10 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirMassFlowRate(
    4177            5 :                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds);
    4178            5 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignAirVolFlowRate =
    4179           10 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirVolFlowRate(
    4180            5 :                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds);
    4181            5 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignWaterMassFlowRate =
    4182           10 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedWaterMassFlowRate(
    4183            5 :                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds);
    4184            5 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignWaterVolFlowRate =
    4185           10 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedWaterVolFlowRate(
    4186            5 :                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds);
    4187            5 :                 CalcVarSpeedCoilHeating(state,
    4188              :                                         DXCoilNum,
    4189              :                                         HVAC::FanOp::Continuous,
    4190              :                                         SensLoad,
    4191              :                                         HVAC::CompressorOp::On,
    4192              :                                         1.0,
    4193              :                                         1.0,
    4194              :                                         1.0,
    4195            5 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds);
    4196              :                 // coil outlets
    4197            5 :                 Real64 RatedOutletWetBulb(0.0);
    4198           15 :                 RatedOutletWetBulb = Psychrometrics::PsyTwbFnTdbWPb(state,
    4199            5 :                                                                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirDBTemp,
    4200            5 :                                                                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirHumRat,
    4201              :                                                                     DataEnvironment::StdPressureSeaLevel,
    4202              :                                                                     RoutineName);
    4203            5 :                 state.dataRptCoilSelection->coilSelectionReportObj->setRatedCoilConditions(
    4204              :                     state,
    4205            5 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
    4206            5 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VarSpeedCoilType,
    4207            5 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QLoadTotal, // this is the report variable
    4208            5 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QSensible,  // this is the report variable
    4209            5 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirMassFlowRate,
    4210            5 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirDBTemp,
    4211            5 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirHumRat,
    4212              :                     RatedInletWetBulbTemp,
    4213            5 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirDBTemp,
    4214            5 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirHumRat,
    4215              :                     RatedOutletWetBulb,
    4216              :                     RatedAmbAirTempHeat,
    4217              :                     RatedAmbAirWBHeat,
    4218           10 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedCBF(
    4219            5 :                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds),
    4220              :                     -999.0); // coil effectiveness not define for DX
    4221              : 
    4222              :                 // now replace the outdoor air conditions set above for one time rating point calc
    4223            5 :                 state.dataEnvrn->OutDryBulbTemp = holdOutDryBulbTemp;
    4224            5 :                 state.dataEnvrn->OutHumRat = holdOutHumRat;
    4225            5 :                 state.dataEnvrn->OutWetBulbTemp = holdOutWetBulb;
    4226            5 :                 state.dataEnvrn->OutBaroPress = holdOutBaroPress;
    4227              :             }
    4228              : 
    4229              :             // store fan info for coil
    4230           18 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SupplyFanIndex > 0) {
    4231            5 :                 state.dataRptCoilSelection->coilSelectionReportObj->setCoilSupplyFanInfo(
    4232              :                     state,
    4233            5 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
    4234            5 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VarSpeedCoilType,
    4235            5 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SupplyFanName,
    4236            5 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).supplyFanType,
    4237            5 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SupplyFanIndex);
    4238              :             }
    4239              :         }
    4240              : 
    4241        67679 :         if (SpeedNum > state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds) {
    4242            0 :             SpeedCal = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds;
    4243        67679 :         } else if (SpeedNum < 1) {
    4244            0 :             SpeedCal = 1;
    4245              :         } else {
    4246        67679 :             SpeedCal = SpeedNum;
    4247              :         }
    4248        67679 :         if ((SpeedNum <= 1) || (SpeedNum > state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds)) {
    4249        42668 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignAirMassFlowRate =
    4250        42668 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirMassFlowRate(SpeedCal);
    4251        42668 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignAirVolFlowRate =
    4252        42668 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirVolFlowRate(SpeedCal);
    4253        42668 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignWaterMassFlowRate =
    4254        42668 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedWaterMassFlowRate(SpeedCal);
    4255        42668 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignWaterVolFlowRate =
    4256        42668 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedWaterVolFlowRate(SpeedCal);
    4257              :         } else {
    4258        25011 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignAirMassFlowRate =
    4259        25011 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirMassFlowRate(SpeedCal) * SpeedRatio +
    4260        25011 :                 (1.0 - SpeedRatio) * state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirMassFlowRate(SpeedCal - 1);
    4261        25011 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignAirVolFlowRate =
    4262        25011 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirVolFlowRate(SpeedCal) * SpeedRatio +
    4263        25011 :                 (1.0 - SpeedRatio) * state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirVolFlowRate(SpeedCal - 1);
    4264        25011 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignWaterMassFlowRate =
    4265        25011 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedWaterMassFlowRate(SpeedCal) * SpeedRatio +
    4266        25011 :                 (1.0 - SpeedRatio) * state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedWaterMassFlowRate(SpeedCal - 1);
    4267        25011 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignWaterVolFlowRate =
    4268        25011 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedWaterVolFlowRate(SpeedCal) * SpeedRatio +
    4269        25011 :                 (1.0 - SpeedRatio) * state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedWaterVolFlowRate(SpeedCal - 1);
    4270              :         }
    4271              : 
    4272              :         // Do the Begin Environment initializations
    4273        67696 :         if (state.dataGlobal->BeginEnvrnFlag && state.dataVariableSpeedCoils->MyEnvrnFlag(DXCoilNum) &&
    4274           17 :             !state.dataVariableSpeedCoils->MyPlantScanFlag(DXCoilNum)) {
    4275              :             // Do the initializations to start simulation
    4276              : 
    4277              :             // Initialize all report variables to a known state at beginning of simulation
    4278           17 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirVolFlowRate = 0.0;
    4279           17 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirDBTemp = 0.0;
    4280           17 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirHumRat = 0.0;
    4281           17 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirDBTemp = 0.0;
    4282           17 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirHumRat = 0.0;
    4283           17 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterVolFlowRate = 0.0;
    4284           17 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterMassFlowRate = 0.0;
    4285           17 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletWaterTemp = 0.0;
    4286           17 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletWaterEnthalpy = 0.0;
    4287           17 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletWaterEnthalpy = 0.0;
    4288           17 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletWaterTemp = 0.0;
    4289           17 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Power = 0.0;
    4290           17 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QLoadTotal = 0.0;
    4291           17 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QSensible = 0.0;
    4292           17 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QLatent = 0.0;
    4293           17 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QSource = 0.0;
    4294           17 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Energy = 0.0;
    4295           17 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergyLoadTotal = 0.0;
    4296           17 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergySensible = 0.0;
    4297           17 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergyLatent = 0.0;
    4298           17 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergySource = 0.0;
    4299           17 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).COP = 0.0;
    4300           17 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac = 0.0;
    4301           17 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PartLoadRatio = 0.0;
    4302              : 
    4303           30 :             if ((state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_HeatingWaterToAirHPVSEquationFit) ||
    4304           13 :                 (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_CoolingWaterToAirHPVSEquationFit)) {
    4305            8 :                 WaterInletNode = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterInletNodeNum;
    4306              : 
    4307            8 :                 rho = state.dataPlnt->PlantLoop(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).plantLoc.loopNum)
    4308            8 :                           .glycol->getDensity(state, Constant::CWInitConvTemp, RoutineNameSimpleWatertoAirHP);
    4309            8 :                 Cp = state.dataPlnt->PlantLoop(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).plantLoc.loopNum)
    4310            8 :                          .glycol->getSpecificHeat(state, Constant::CWInitConvTemp, RoutineNameSimpleWatertoAirHP);
    4311              : 
    4312              :                 //    VarSpeedCoil(DXCoilNum)%DesignWaterMassFlowRate= &
    4313              :                 //                             rho * VarSpeedCoil(DXCoilNum)%RatedWaterVolFlowRate
    4314              : 
    4315           24 :                 PlantUtilities::InitComponentNodes(state,
    4316              :                                                    0.0,
    4317           16 :                                                    state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedWaterMassFlowRate(
    4318            8 :                                                        state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds),
    4319            8 :                                                    state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterInletNodeNum,
    4320            8 :                                                    state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterOutletNodeNum);
    4321              : 
    4322            8 :                 state.dataLoopNodes->Node(WaterInletNode).Temp = 5.0;
    4323            8 :                 state.dataLoopNodes->Node(WaterInletNode).Enthalpy = Cp * state.dataLoopNodes->Node(WaterInletNode).Temp;
    4324            8 :                 state.dataLoopNodes->Node(WaterInletNode).Quality = 0.0;
    4325            8 :                 state.dataLoopNodes->Node(WaterInletNode).Press = 0.0;
    4326            8 :                 state.dataLoopNodes->Node(WaterInletNode).HumRat = 0.0;
    4327              : 
    4328            8 :                 state.dataLoopNodes->Node(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterOutletNodeNum).Temp = 5.0;
    4329            8 :                 state.dataLoopNodes->Node(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterOutletNodeNum).Enthalpy =
    4330            8 :                     Cp * state.dataLoopNodes->Node(WaterInletNode).Temp;
    4331            8 :                 state.dataLoopNodes->Node(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterOutletNodeNum).Quality = 0.0;
    4332            8 :                 state.dataLoopNodes->Node(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterOutletNodeNum).Press = 0.0;
    4333            8 :                 state.dataLoopNodes->Node(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterOutletNodeNum).HumRat = 0.0;
    4334              :             }
    4335              : 
    4336           17 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SimFlag = true;
    4337           17 :             state.dataHeatBal->HeatReclaimVS_Coil(DXCoilNum).AvailCapacity = 0.0;
    4338              : 
    4339           17 :             state.dataVariableSpeedCoils->MyEnvrnFlag(DXCoilNum) = false;
    4340              : 
    4341              :         } // End If for the Begin Environment initializations
    4342              : 
    4343        67679 :         if (!state.dataGlobal->BeginEnvrnFlag) {
    4344        66993 :             state.dataVariableSpeedCoils->MyEnvrnFlag(DXCoilNum) = true;
    4345              :         }
    4346              : 
    4347              :         // Do the following initializations (every time step): This should be the info from
    4348              :         // the previous components outlets or the node data in this section.
    4349              :         // First set the conditions for the air into the heat pump model
    4350              : 
    4351              :         // Set water and air inlet nodes
    4352              : 
    4353        67679 :         WaterInletNode = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterInletNodeNum;
    4354              : 
    4355        67679 :         if ((SensLoad != 0.0 || LatentLoad != 0.0) && (state.dataLoopNodes->Node(AirInletNode).MassFlowRate > 0.0)) {
    4356        28182 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedWaterMassFlowRate(
    4357        28182 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel) > 0.0) {
    4358        27877 :                 WaterFlowScale = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedWaterMassFlowRate /
    4359        27877 :                                  state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedWaterMassFlowRate(
    4360        27877 :                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel);
    4361        27877 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterMassFlowRate =
    4362        27877 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignWaterMassFlowRate * WaterFlowScale;
    4363              :             } else {
    4364          305 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterMassFlowRate = 0.0;
    4365              :             }
    4366              : 
    4367        28182 :             if (fanOp == HVAC::FanOp::Continuous) {
    4368              :                 // continuous fan, cycling compressor
    4369           92 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirMassFlowRate = state.dataLoopNodes->Node(AirInletNode).MassFlowRate;
    4370              :                 //    VarSpeedCoil(DXCoilNum)%AirMassFlowRate   = VarSpeedCoil(DXCoilNum)%DesignAirVolFlowRate*  &
    4371              :                 //             PsyRhoAirFnPbTdbW(state, OutBaroPress,Node(AirInletNode)%Temp,Node(AirInletNode)%HumRat)
    4372              :                 // If air flow is less than 25% rated flow. Then set air flow to the 25% of rated conditions
    4373           92 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirMassFlowRate <
    4374           92 :                     0.25 * state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignAirVolFlowRate *
    4375          184 :                         Psychrometrics::PsyRhoAirFnPbTdbW(state,
    4376           92 :                                                           state.dataEnvrn->OutBaroPress,
    4377           92 :                                                           state.dataLoopNodes->Node(AirInletNode).Temp,
    4378           92 :                                                           state.dataLoopNodes->Node(AirInletNode).HumRat)) {
    4379            0 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirMassFlowRate =
    4380            0 :                         0.25 * state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignAirVolFlowRate *
    4381            0 :                         Psychrometrics::PsyRhoAirFnPbTdbW(state,
    4382            0 :                                                           state.dataEnvrn->OutBaroPress,
    4383            0 :                                                           state.dataLoopNodes->Node(AirInletNode).Temp,
    4384            0 :                                                           state.dataLoopNodes->Node(AirInletNode).HumRat);
    4385              :                 }
    4386              :             } else { // CYCLIC FAN, NOT CORRECTION, WILL BE PROCESSED IN THE FOLLOWING SUBROUTINES
    4387        28090 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirMassFlowRate = state.dataLoopNodes->Node(AirInletNode).MassFlowRate;
    4388              :             }
    4389              : 
    4390              :         } else { // heat pump is off
    4391        39497 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterMassFlowRate = 0.0;
    4392        39497 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirMassFlowRate = 0.0;
    4393              :         }
    4394              : 
    4395       101722 :         if ((state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_HeatingWaterToAirHPVSEquationFit) ||
    4396        34043 :             (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_CoolingWaterToAirHPVSEquationFit)) {
    4397       201819 :             PlantUtilities::SetComponentFlowRate(state,
    4398        67273 :                                                  state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterMassFlowRate,
    4399        67273 :                                                  state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterInletNodeNum,
    4400        67273 :                                                  state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterOutletNodeNum,
    4401        67273 :                                                  state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).plantLoc);
    4402              : 
    4403        67273 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletWaterTemp = state.dataLoopNodes->Node(WaterInletNode).Temp;
    4404        67273 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletWaterEnthalpy = state.dataLoopNodes->Node(WaterInletNode).Enthalpy;
    4405              :         } else {
    4406          406 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletWaterTemp = 0.0;
    4407          406 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletWaterEnthalpy = 0.0;
    4408              :         }
    4409              : 
    4410        67679 :         if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::CoilDX_HeatPumpWaterHeaterVariableSpeed) {
    4411            0 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletWaterTemp = state.dataLoopNodes->Node(WaterInletNode).Temp;
    4412            0 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletWaterEnthalpy = state.dataLoopNodes->Node(WaterInletNode).Enthalpy;
    4413              :         };
    4414              : 
    4415        67679 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirDBTemp = state.dataLoopNodes->Node(AirInletNode).Temp;
    4416        67679 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirHumRat = state.dataLoopNodes->Node(AirInletNode).HumRat;
    4417        67679 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirEnthalpy = state.dataLoopNodes->Node(AirInletNode).Enthalpy;
    4418              : 
    4419        67679 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirPressure = state.dataEnvrn->OutBaroPress; // temporary
    4420              :         // Outlet variables
    4421        67679 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Power = 0.0;
    4422        67679 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QLoadTotal = 0.0;
    4423        67679 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QSensible = 0.0;
    4424        67679 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QLatent = 0.0;
    4425        67679 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QSource = 0.0;
    4426        67679 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QWasteHeat = 0.0;
    4427        67679 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Energy = 0.0;
    4428        67679 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergyLoadTotal = 0.0;
    4429        67679 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergySensible = 0.0;
    4430        67679 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergyLatent = 0.0;
    4431        67679 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergySource = 0.0;
    4432        67679 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).COP = 0.0;
    4433              : 
    4434        67679 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirDBTemp = 0.0;
    4435        67679 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletWaterTemp = 0.0;
    4436        67679 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirHumRat = 0.0;
    4437        67679 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirEnthalpy = 0.0;
    4438        67679 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletWaterEnthalpy = 0.0;
    4439              : 
    4440              :         // bug fix, must set zeros to the variables below, otherwise can't pass switch DD test
    4441        67679 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterConsumption = 0.0;
    4442        67679 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapWaterConsump = 0.0;
    4443        67679 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).BasinHeaterConsumption = 0.0;
    4444        67679 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapCondPumpElecConsumption = 0.0;
    4445        67679 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterPower = 0.0;
    4446        67679 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostPower = 0.0;
    4447        67679 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostConsumption = 0.0;
    4448        67679 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondensateVdot = 0.0;
    4449        67679 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondensateVol = 0.0;
    4450        67679 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QWasteHeat = 0.0;
    4451              : 
    4452              :         // clear zeros to HPWH variables
    4453        67679 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).ElecWaterHeatingPower =
    4454              :             0.0; // Total electric power consumed by compressor and condenser pump [W]
    4455        67679 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).ElecWaterHeatingConsumption =
    4456              :             0.0; // Total electric consumption by compressor and condenser pump [J]
    4457        67679 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).TotalHeatingEnergy = 0.0;       // total water heating energy
    4458        67679 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).TotalHeatingEnergyRate = 0.0;   // total WH energy rate
    4459        67679 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpElecNomPower = 0.0; // power power
    4460              : 
    4461        67679 :         state.dataVariableSpeedCoils->VSHPWHHeatingCapacity = 0.0; // Used by Heat Pump:Water Heater object as total water heating capacity [W]
    4462        67679 :         state.dataVariableSpeedCoils->VSHPWHHeatingCOP = 0.0;      // Used by Heat Pump:Water Heater object as water heating COP [W/W]
    4463        67679 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletWaterTemp = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletWaterTemp;
    4464        67679 :         state.dataHeatBal->HeatReclaimVS_Coil(DXCoilNum).AvailCapacity = 0.0;
    4465        67679 :     }
    4466              : 
    4467           18 :     void SizeVarSpeedCoil(EnergyPlusData &state, int const DXCoilNum, bool &ErrorsFound)
    4468              :     {
    4469              : 
    4470              :         // SUBROUTINE INFORMATION:
    4471              :         //       AUTHOR         Bo Shen, based on WaterToAirHeatPumpSimple:SizeHVACWaterToAir
    4472              :         //       DATE WRITTEN   March, 2012
    4473              :         //       MODIFIED       August 2013 Daeho Kang, add component sizing table entries
    4474              :         //       MODIFIED       Bo Shen, 12/2014, add variable-speed HPWH
    4475              : 
    4476              :         // PURPOSE OF THIS SUBROUTINE:
    4477              :         // This subroutine is for sizing WSHP Components for which nominal capacities
    4478              :         // and flow rates have not been specified in the input
    4479              : 
    4480              :         // METHODOLOGY EMPLOYED:
    4481              :         // Obtains heating capacities and flow rates from the zone or system sizing arrays.
    4482              :         // NOTE: For WSHP's we are sizing the heating capacity to be
    4483              :         // equal to the cooling capacity.  Thus the cooling and
    4484              :         // and heating capacities of a DX heat pump system will be identical. In real life the ARI
    4485              :         // heating and cooling capacities are close but not identical.
    4486              : 
    4487              :         // SUBROUTINE PARAMETER DEFINITIONS:
    4488              :         static constexpr std::string_view RoutineName("SizeVarSpeedCoil");
    4489              :         static constexpr std::string_view RoutineNameAlt("SizeHVACWaterToAir");
    4490              : 
    4491           18 :         auto &varSpeedCoil = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum);
    4492              : 
    4493              :         // SUBROUTINE LOCAL VARIABLE DECLARATIONS:
    4494           18 :         Real64 rhoair = state.dataEnvrn->StdRhoAir;
    4495           18 :         Real64 MixTemp = -999.0;
    4496           18 :         Real64 MixHumRat = -999.0;
    4497           18 :         Real64 MixEnth = -999.0;
    4498           18 :         Real64 MixWetBulb = -999.0;
    4499           18 :         Real64 SupTemp = -999.0;
    4500           18 :         Real64 SupHumRat = -999.0;
    4501           18 :         Real64 SupEnth = -999.0;
    4502           18 :         Real64 OutTemp = -999.0;
    4503           18 :         Real64 OutAirFrac = -999.0;
    4504           18 :         Real64 VolFlowRate = -999.0;
    4505           18 :         Real64 CoolCapAtPeak = -999.0;
    4506           18 :         Real64 TotCapTempModFac = -999.0;
    4507              :         int TimeStepNumAtMax;
    4508              :         int DDNum;
    4509              :         bool RatedCapCoolTotalAutoSized;
    4510              :         bool RatedCapCoolSensAutoSized;
    4511              :         Real64 SystemCapacity;
    4512              :         Real64 rho;
    4513              :         Real64 cp;
    4514              :         int Mode;                     // speed level
    4515              :         Real64 rhoW;                  // water density
    4516              :         Real64 SHR;                   // sensible heat transfer ratio
    4517              :         Real64 RatedAirMassFlowRate;  // rated air mass flow rate
    4518              :         Real64 CBFRated;              // bypass factor at the rated condition, considering difference in flow rates
    4519              :         Real64 RatedInletEnth;        // rated inlet air enthalpy
    4520              :         Real64 QLoadTotal1;           // placeholder for calculating SHR
    4521              :         Real64 QLoadTotal2;           // placeholder for calculating SHR
    4522              :         Real64 QLoadTotal;            // placeholder for calculating SHR
    4523              :         Real64 AirMassFlowRatio;      // air mass flow ratio
    4524              :         Real64 WaterMassFlowRatio;    // water mass flow rate
    4525              :         Real64 RatedSourceTempCool;   // rated source temperature, space cooling mode
    4526           18 :         std::string CurrentObjSubfix; // Object subfix type for printing
    4527              :         bool HardSizeNoDesRun;        // Indicator to hardsize withouth sizing runs
    4528              :         bool SizingDesRunThisAirSys;  // true if a particular air system had a Sizing:System object and system sizing done
    4529              :         bool SizingDesRunThisZone;    // true if a particular zone had a Sizing:Zone object and zone sizing was done
    4530              :         Real64 HPInletAirHumRat;      // Rated inlet air humidity ratio for heat pump water heater [kgWater/kgDryAir]
    4531              :         Real64 HPWHCoolCapacity;      // estimate cooling capacity in HPWH
    4532              : 
    4533           18 :         int UpperSpeed = varSpeedCoil.NumOfSpeeds;
    4534           18 :         int NormSpeed = varSpeedCoil.NormSpedLevel;
    4535           18 :         int PltSizNum = 0;
    4536           18 :         bool RatedAirFlowAutoSized = false;
    4537           18 :         bool RatedWaterFlowAutoSized = false;
    4538           18 :         bool RatedCapHeatAutoSized = false;
    4539           18 :         bool IsAutoSize = false;
    4540              : 
    4541           18 :         if (state.dataSize->SysSizingRunDone || state.dataSize->ZoneSizingRunDone) {
    4542           10 :             HardSizeNoDesRun = false;
    4543              :         } else {
    4544            8 :             HardSizeNoDesRun = true;
    4545              :         }
    4546           18 :         if (state.dataSize->CurSysNum > 0) {
    4547            1 :             CheckThisAirSystemForSizing(state, state.dataSize->CurSysNum, SizingDesRunThisAirSys);
    4548              :         } else {
    4549           17 :             SizingDesRunThisAirSys = false;
    4550              :         }
    4551           18 :         if (state.dataSize->CurZoneEqNum > 0) {
    4552           12 :             CheckThisZoneForSizing(state, state.dataSize->CurZoneEqNum, SizingDesRunThisZone);
    4553              :         } else {
    4554            6 :             SizingDesRunThisZone = false;
    4555              :         }
    4556           18 :         bool HardSizeNoDesRunAirFlow = false;
    4557           18 :         Real64 RatedAirVolFlowRateDes = 0.0;
    4558           18 :         Real64 RatedAirVolFlowRateUser = 0.0;
    4559           18 :         Real64 RatedCapCoolTotalDes = 0.0;
    4560           18 :         Real64 RatedCapCoolTotalUser = 0.0;
    4561           18 :         Real64 RatedCapHeatDes = 0.0;
    4562           18 :         Real64 RatedCapHeatUser = 0.0;
    4563           18 :         Real64 RatedWaterVolFlowRateDes = 0.0;
    4564           18 :         Real64 RatedWaterVolFlowRateUser = 0.0;
    4565           18 :         Real64 RatedCapCoolSensDes = 0.0;
    4566           18 :         Real64 EvapCondPumpElecNomPowerDes = 0.0;
    4567           18 :         Real64 EvapCondPumpElecNomPowerUser = 0.0;
    4568           18 :         Real64 DefrostCapacityDes = 0.0;
    4569           18 :         Real64 DefrostCapacityUser = 0.0;
    4570              : 
    4571           18 :         if (varSpeedCoil.VSCoilType == HVAC::Coil_CoolingWaterToAirHPVSEquationFit ||
    4572           16 :             varSpeedCoil.VSCoilType == HVAC::Coil_HeatingWaterToAirHPVSEquationFit) {
    4573            3 :             CurrentObjSubfix = ":WATERTOAIRHEATPUMP:VARIABLESPEEDEQUATIONFIT";
    4574           15 :         } else if (varSpeedCoil.VSCoilType == HVAC::CoilDX_HeatPumpWaterHeaterVariableSpeed) {
    4575            0 :             CurrentObjSubfix = ":WATERHEATING:AIRTOWATERHEATPUMP:VARIABLESPEED";
    4576              :         } else {
    4577           15 :             CurrentObjSubfix = ":DX:VARIABLESPEED";
    4578              :         }
    4579              : 
    4580           18 :         if (varSpeedCoil.VSCoilType == HVAC::CoilDX_HeatPumpWaterHeaterVariableSpeed) {
    4581            0 :             if (varSpeedCoil.RatedAirVolFlowRate == Constant::AutoCalculate) {
    4582            0 :                 varSpeedCoil.RatedAirVolFlowRate =
    4583            0 :                     varSpeedCoil.RatedCapWH * varSpeedCoil.MSRatedAirVolFlowRate(NormSpeed) / varSpeedCoil.MSRatedTotCap(NormSpeed); // 0.00005035;
    4584            0 :                 varSpeedCoil.AirVolFlowAutoSized = true;
    4585              :             }
    4586            0 :             state.dataRptCoilSelection->coilSelectionReportObj->setCoilAirFlow(
    4587            0 :                 state, varSpeedCoil.Name, varSpeedCoil.VarSpeedCoilType, varSpeedCoil.RatedAirVolFlowRate, varSpeedCoil.AirVolFlowAutoSized);
    4588              : 
    4589            0 :             if (varSpeedCoil.RatedWaterVolFlowRate == Constant::AutoCalculate) {
    4590            0 :                 varSpeedCoil.RatedHPWHCondWaterFlow = varSpeedCoil.RatedCapWH * varSpeedCoil.MSRatedWaterVolFlowRate(NormSpeed) /
    4591            0 :                                                       varSpeedCoil.MSRatedTotCap(NormSpeed); // 0.00000004487;
    4592            0 :                 varSpeedCoil.RatedWaterVolFlowRate = varSpeedCoil.RatedHPWHCondWaterFlow;
    4593            0 :                 varSpeedCoil.WaterVolFlowAutoSized = true;
    4594              :             }
    4595            0 :             state.dataRptCoilSelection->coilSelectionReportObj->setCoilWaterFlowPltSizNum(state,
    4596            0 :                                                                                           varSpeedCoil.Name,
    4597            0 :                                                                                           varSpeedCoil.VarSpeedCoilType,
    4598              :                                                                                           varSpeedCoil.RatedWaterVolFlowRate,
    4599            0 :                                                                                           varSpeedCoil.WaterVolFlowAutoSized,
    4600              :                                                                                           -999,
    4601              :                                                                                           varSpeedCoil.plantLoc.loopNum);
    4602              :         }
    4603              : 
    4604           18 :         if (varSpeedCoil.RatedAirVolFlowRate == DataSizing::AutoSize) {
    4605            8 :             RatedAirFlowAutoSized = true;
    4606              :         }
    4607              : 
    4608           18 :         if (state.dataSize->CurSysNum > 0) {
    4609            1 :             if (!RatedAirFlowAutoSized && !SizingDesRunThisAirSys) { // Simulation continue
    4610            0 :                 HardSizeNoDesRunAirFlow = true;
    4611            0 :                 if (varSpeedCoil.RatedAirVolFlowRate > 0.0) {
    4612            0 :                     BaseSizer::reportSizerOutput(state,
    4613            0 :                                                  format("COIL:{}{}", varSpeedCoil.CoolHeatType, CurrentObjSubfix),
    4614              :                                                  varSpeedCoil.Name,
    4615              :                                                  "User-Specified Rated Air Flow Rate [m3/s]",
    4616              :                                                  varSpeedCoil.RatedAirVolFlowRate);
    4617              :                 }
    4618              :             } else {
    4619            1 :                 CheckSysSizing(state, format("COIL:{}{}", varSpeedCoil.CoolHeatType, CurrentObjSubfix), varSpeedCoil.Name);
    4620            1 :                 if (state.dataSize->CurOASysNum > 0 && state.dataAirLoop->OutsideAirSys(state.dataSize->CurOASysNum).AirLoopDOASNum > -1) {
    4621              :                     auto const &thisAirloopDOAS =
    4622            0 :                         state.dataAirLoopHVACDOAS->airloopDOAS[state.dataAirLoop->OutsideAirSys(state.dataSize->CurOASysNum).AirLoopDOASNum];
    4623            0 :                     RatedAirVolFlowRateDes = thisAirloopDOAS.SizingMassFlow / state.dataEnvrn->StdRhoAir;
    4624              :                 } else {
    4625            1 :                     if (state.dataSize->FinalSysSizing(state.dataSize->CurSysNum).DesMainVolFlow >= HVAC::SmallAirVolFlow) {
    4626            1 :                         RatedAirVolFlowRateDes = state.dataSize->FinalSysSizing(state.dataSize->CurSysNum).DesMainVolFlow;
    4627              :                     } else {
    4628            0 :                         RatedAirVolFlowRateDes = 0.0;
    4629              :                     }
    4630              :                 }
    4631              :             }
    4632              :         }
    4633              : 
    4634           18 :         if (state.dataSize->CurZoneEqNum > 0) {
    4635           12 :             if (!RatedAirFlowAutoSized && !SizingDesRunThisZone) { // Simulation continue
    4636            5 :                 HardSizeNoDesRunAirFlow = true;
    4637            5 :                 if (varSpeedCoil.RatedAirVolFlowRate > 0.0) {
    4638           15 :                     BaseSizer::reportSizerOutput(state,
    4639           10 :                                                  format("COIL:{}{}", varSpeedCoil.CoolHeatType, CurrentObjSubfix),
    4640              :                                                  varSpeedCoil.Name,
    4641              :                                                  "User-Specified Rated Air Flow Rate [m3/s]",
    4642              :                                                  varSpeedCoil.RatedAirVolFlowRate);
    4643              :                 }
    4644              :             } else {
    4645            7 :                 CheckZoneSizing(state, format("COIL:{}{}", varSpeedCoil.CoolHeatType, CurrentObjSubfix), varSpeedCoil.Name);
    4646            7 :                 RatedAirVolFlowRateDes = max(state.dataSize->FinalZoneSizing(state.dataSize->CurZoneEqNum).DesCoolVolFlow,
    4647            7 :                                              state.dataSize->FinalZoneSizing(state.dataSize->CurZoneEqNum).DesHeatVolFlow);
    4648            7 :                 if (RatedAirVolFlowRateDes < HVAC::SmallAirVolFlow) {
    4649            0 :                     RatedAirVolFlowRateDes = 0.0;
    4650              :                 }
    4651              :             }
    4652              :         }
    4653              : 
    4654           18 :         if (RatedAirFlowAutoSized) {
    4655            8 :             varSpeedCoil.RatedAirVolFlowRate = RatedAirVolFlowRateDes;
    4656              :         }
    4657              : 
    4658           18 :         RatedCapCoolTotalAutoSized = false;
    4659           18 :         RatedCapCoolSensAutoSized = false;
    4660              : 
    4661              :         // size rated total cooling capacity
    4662           18 :         IsAutoSize = false;
    4663           18 :         if (varSpeedCoil.RatedCapCoolTotal == DataSizing::AutoSize && (varSpeedCoil.VSCoilType == HVAC::Coil_CoolingWaterToAirHPVSEquationFit ||
    4664            9 :                                                                        varSpeedCoil.VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed)) {
    4665            6 :             RatedCapCoolTotalAutoSized = true;
    4666              :         }
    4667           18 :         if (SizingDesRunThisZone || SizingDesRunThisAirSys) {
    4668            5 :             HardSizeNoDesRun = false;
    4669              :         }
    4670           18 :         if (state.dataSize->CurSysNum > 0) {
    4671            1 :             if (!RatedCapCoolTotalAutoSized && !SizingDesRunThisAirSys) { // Simulation continue
    4672            0 :                 HardSizeNoDesRun = true;
    4673            0 :                 if (varSpeedCoil.RatedCapCoolTotal > 0.0) {
    4674            0 :                     BaseSizer::reportSizerOutput(state,
    4675            0 :                                                  format("COIL:{}{}", varSpeedCoil.CoolHeatType, CurrentObjSubfix),
    4676              :                                                  varSpeedCoil.Name,
    4677              :                                                  "User-Specified Rated Total Cooling Capacity [W]",
    4678              :                                                  varSpeedCoil.RatedCapCoolTotal);
    4679              :                 }
    4680              :             } else {
    4681            1 :                 CheckSysSizing(state, format("COIL:{}{}", varSpeedCoil.CoolHeatType, CurrentObjSubfix), varSpeedCoil.Name);
    4682            1 :                 if (state.dataSize->CurOASysNum > 0 && state.dataAirLoop->OutsideAirSys(state.dataSize->CurOASysNum).AirLoopDOASNum > -1) {
    4683              :                     auto const &thisAirloopDOAS =
    4684            0 :                         state.dataAirLoopHVACDOAS->airloopDOAS[state.dataAirLoop->OutsideAirSys(state.dataSize->CurOASysNum).AirLoopDOASNum];
    4685            0 :                     VolFlowRate = varSpeedCoil.RatedAirVolFlowRate;
    4686            0 :                     MixTemp = thisAirloopDOAS.SizingCoolOATemp;
    4687            0 :                     SupTemp = thisAirloopDOAS.PrecoolTemp;
    4688            0 :                     MixHumRat = thisAirloopDOAS.SizingCoolOAHumRat;
    4689            0 :                     SupHumRat = thisAirloopDOAS.PrecoolHumRat;
    4690            0 :                     RatedCapCoolTotalDes = VolFlowRate * state.dataEnvrn->StdRhoAir *
    4691            0 :                                            (Psychrometrics::PsyHFnTdbW(MixTemp, MixHumRat) - Psychrometrics::PsyHFnTdbW(SupTemp, SupHumRat));
    4692            0 :                     if (varSpeedCoil.MSCCapFTemp(varSpeedCoil.NormSpedLevel) > 0) {
    4693            0 :                         MixWetBulb = Psychrometrics::PsyTwbFnTdbWPb(state, MixTemp, MixHumRat, state.dataEnvrn->StdBaroPress, RoutineName);
    4694            0 :                         if (varSpeedCoil.CondenserType == DataHeatBalance::RefrigCondenserType::Air) {
    4695            0 :                             RatedSourceTempCool = thisAirloopDOAS.SizingCoolOATemp;
    4696              :                         } else {
    4697            0 :                             RatedSourceTempCool = GetVSCoilRatedSourceTemp(state, DXCoilNum);
    4698              :                         }
    4699            0 :                         TotCapTempModFac =
    4700            0 :                             Curve::CurveValue(state, varSpeedCoil.MSCCapFTemp(varSpeedCoil.NormSpedLevel), MixWetBulb, RatedSourceTempCool);
    4701            0 :                         RatedCapCoolTotalDes /= TotCapTempModFac;
    4702              :                     }
    4703              :                 } else {
    4704            1 :                     auto const &finalSysSizing = state.dataSize->FinalSysSizing(state.dataSize->CurSysNum);
    4705            1 :                     VolFlowRate = varSpeedCoil.RatedAirVolFlowRate;
    4706            1 :                     if (VolFlowRate >= HVAC::SmallAirVolFlow) {
    4707            1 :                         if (state.dataSize->CurOASysNum > 0) { // coil is in the OA stream
    4708            0 :                             MixTemp = finalSysSizing.OutTempAtCoolPeak;
    4709            0 :                             MixHumRat = finalSysSizing.OutHumRatAtCoolPeak;
    4710            0 :                             SupTemp = finalSysSizing.PrecoolTemp;
    4711            0 :                             SupHumRat = finalSysSizing.PrecoolHumRat;
    4712              :                         } else { // coil is on the main air loop
    4713            1 :                             SupTemp = finalSysSizing.CoolSupTemp;
    4714            1 :                             SupHumRat = finalSysSizing.CoolSupHumRat;
    4715            1 :                             if (state.dataAirSystemsData->PrimaryAirSystems(state.dataSize->CurSysNum).NumOACoolCoils ==
    4716              :                                 0) { // there is no precooling of the OA stream
    4717            1 :                                 MixTemp = finalSysSizing.MixTempAtCoolPeak;
    4718            1 :                                 MixHumRat = finalSysSizing.MixHumRatAtCoolPeak;
    4719              :                             } else { // there is precooling of OA stream
    4720            0 :                                 if (VolFlowRate > 0.0) {
    4721            0 :                                     OutAirFrac = finalSysSizing.DesOutAirVolFlow / VolFlowRate;
    4722              :                                 } else {
    4723            0 :                                     OutAirFrac = 1.0;
    4724              :                                 }
    4725            0 :                                 OutAirFrac = min(1.0, max(0.0, OutAirFrac));
    4726            0 :                                 MixTemp = OutAirFrac * finalSysSizing.PrecoolTemp + (1.0 - OutAirFrac) * finalSysSizing.RetTempAtCoolPeak;
    4727            0 :                                 MixHumRat = OutAirFrac * finalSysSizing.PrecoolHumRat + (1.0 - OutAirFrac) * finalSysSizing.RetHumRatAtCoolPeak;
    4728              :                             }
    4729              :                         }
    4730            1 :                         OutTemp = finalSysSizing.OutTempAtCoolPeak;
    4731            1 :                         MixEnth = Psychrometrics::PsyHFnTdbW(MixTemp, MixHumRat);
    4732            1 :                         SupEnth = Psychrometrics::PsyHFnTdbW(SupTemp, SupHumRat);
    4733              : 
    4734              :                         // design fan heat will be added to coil load
    4735            1 :                         Real64 FanCoolLoad = DataAirSystems::calcFanDesignHeatGain(state, state.dataSize->DataFanIndex, VolFlowRate);
    4736              :                         // inlet/outlet temp is adjusted after enthalpy is calculcated so fan heat is not double counted
    4737            1 :                         Real64 CpAir = Psychrometrics::PsyCpAirFnW(MixHumRat);
    4738            1 :                         if (state.dataAirSystemsData->PrimaryAirSystems(state.dataSize->CurSysNum).supFanPlace == HVAC::FanPlace::BlowThru) {
    4739            0 :                             MixTemp += FanCoolLoad / (CpAir * rhoair * VolFlowRate);
    4740            1 :                         } else if (state.dataAirSystemsData->PrimaryAirSystems(state.dataSize->CurSysNum).supFanPlace == HVAC::FanPlace::DrawThru) {
    4741            0 :                             SupTemp -= FanCoolLoad / (CpAir * rhoair * VolFlowRate);
    4742              :                         }
    4743            1 :                         MixWetBulb = Psychrometrics::PsyTwbFnTdbWPb(state, MixTemp, MixHumRat, state.dataEnvrn->StdBaroPress, RoutineName);
    4744            1 :                         if (varSpeedCoil.CondenserType == DataHeatBalance::RefrigCondenserType::Air) {
    4745            0 :                             RatedSourceTempCool = OutTemp;
    4746              :                         } else {
    4747            1 :                             RatedSourceTempCool = GetVSCoilRatedSourceTemp(state, DXCoilNum);
    4748              :                         }
    4749            1 :                         TotCapTempModFac =
    4750            1 :                             Curve::CurveValue(state, varSpeedCoil.MSCCapFTemp(varSpeedCoil.NormSpedLevel), MixWetBulb, RatedSourceTempCool);
    4751              : 
    4752              :                         //       The mixed air temp for zone equipment without an OA mixer is 0.
    4753              :                         //       This test avoids a negative capacity until a solution can be found.
    4754            1 :                         if (MixEnth > SupEnth) {
    4755            1 :                             CoolCapAtPeak = (rhoair * VolFlowRate * (MixEnth - SupEnth)) + FanCoolLoad;
    4756              :                         } else {
    4757            0 :                             CoolCapAtPeak = (rhoair * VolFlowRate * (48000.0 - SupEnth)) + FanCoolLoad;
    4758              :                         }
    4759            1 :                         CoolCapAtPeak = max(0.0, CoolCapAtPeak);
    4760            1 :                         if (TotCapTempModFac > 0.0) {
    4761            1 :                             RatedCapCoolTotalDes = CoolCapAtPeak / TotCapTempModFac;
    4762              :                         } else {
    4763            0 :                             RatedCapCoolTotalDes = CoolCapAtPeak;
    4764              :                         }
    4765              :                     } else {
    4766            0 :                         RatedCapCoolTotalDes = 0.0;
    4767              :                     }
    4768              :                 }
    4769              :             }
    4770              : 
    4771           17 :         } else if (state.dataSize->CurZoneEqNum > 0) {
    4772           12 :             if (!RatedCapCoolTotalAutoSized && !SizingDesRunThisZone) { // Simulation continue
    4773            5 :                 HardSizeNoDesRun = true;
    4774            5 :                 if (varSpeedCoil.RatedCapCoolTotal > 0.0) {
    4775            9 :                     BaseSizer::reportSizerOutput(state,
    4776            6 :                                                  format("COIL:{}{}", varSpeedCoil.CoolHeatType, CurrentObjSubfix),
    4777              :                                                  varSpeedCoil.Name,
    4778              :                                                  "User-Specified Rated Total Cooling Capacity [W]",
    4779              :                                                  varSpeedCoil.RatedCapCoolTotal);
    4780              :                 }
    4781              :             } else {
    4782            7 :                 CheckZoneSizing(state, format("COIL:{}{}", varSpeedCoil.CoolHeatType, CurrentObjSubfix), varSpeedCoil.Name);
    4783            7 :                 auto const &finalZoneSizing = state.dataSize->FinalZoneSizing(state.dataSize->CurZoneEqNum);
    4784            7 :                 VolFlowRate = varSpeedCoil.RatedAirVolFlowRate;
    4785            7 :                 if (VolFlowRate >= HVAC::SmallAirVolFlow) {
    4786            7 :                     if (state.dataSize->ZoneEqDXCoil) {
    4787            4 :                         if (state.dataSize->ZoneEqSizing(state.dataSize->CurZoneEqNum).OAVolFlow > 0.0) {
    4788            0 :                             MixTemp = finalZoneSizing.DesCoolCoilInTemp;
    4789            0 :                             MixHumRat = finalZoneSizing.DesCoolCoilInHumRat;
    4790              :                         } else {
    4791            4 :                             MixTemp = finalZoneSizing.ZoneTempAtCoolPeak;
    4792            4 :                             MixHumRat = finalZoneSizing.ZoneHumRatAtCoolPeak;
    4793              :                         }
    4794              :                     } else {
    4795            3 :                         MixTemp = finalZoneSizing.DesCoolCoilInTemp;
    4796            3 :                         MixHumRat = finalZoneSizing.DesCoolCoilInHumRat;
    4797              :                     }
    4798            7 :                     SupTemp = finalZoneSizing.CoolDesTemp;
    4799            7 :                     SupHumRat = finalZoneSizing.CoolDesHumRat;
    4800            7 :                     TimeStepNumAtMax = finalZoneSizing.TimeStepNumAtCoolMax;
    4801            7 :                     DDNum = finalZoneSizing.CoolDDNum;
    4802            7 :                     if (DDNum > 0 && TimeStepNumAtMax > 0) {
    4803            7 :                         OutTemp = state.dataSize->DesDayWeath(DDNum).Temp(TimeStepNumAtMax);
    4804              :                     } else {
    4805            0 :                         OutTemp = 0.0;
    4806              :                     }
    4807            7 :                     MixEnth = Psychrometrics::PsyHFnTdbW(MixTemp, MixHumRat);
    4808            7 :                     SupEnth = Psychrometrics::PsyHFnTdbW(SupTemp, SupHumRat);
    4809              : 
    4810              :                     // design fan heat will be added to coil load
    4811            7 :                     Real64 FanCoolLoad = DataAirSystems::calcFanDesignHeatGain(state, state.dataSize->DataFanIndex, VolFlowRate);
    4812              :                     // inlet/outlet temp is adjusted after enthalpy is calculcated so fan heat is not double counted
    4813            7 :                     Real64 CpAir = Psychrometrics::PsyCpAirFnW(MixHumRat);
    4814              : 
    4815            7 :                     if (state.dataSize->DataFanPlacement == HVAC::FanPlace::BlowThru) {
    4816            7 :                         MixTemp += FanCoolLoad / (CpAir * rhoair * VolFlowRate);
    4817              :                     } else {
    4818            0 :                         SupTemp -= FanCoolLoad / (CpAir * rhoair * VolFlowRate);
    4819              :                     }
    4820              : 
    4821            7 :                     MixWetBulb = Psychrometrics::PsyTwbFnTdbWPb(state, MixTemp, MixHumRat, state.dataEnvrn->StdBaroPress, RoutineName);
    4822            7 :                     if (varSpeedCoil.CondenserType == DataHeatBalance::RefrigCondenserType::Air) {
    4823            5 :                         RatedSourceTempCool = OutTemp;
    4824              :                     } else {
    4825            2 :                         RatedSourceTempCool = GetVSCoilRatedSourceTemp(state, DXCoilNum);
    4826              :                     }
    4827            7 :                     TotCapTempModFac =
    4828            7 :                         Curve::CurveValue(state, varSpeedCoil.MSCCapFTemp(varSpeedCoil.NormSpedLevel), MixWetBulb, RatedSourceTempCool);
    4829              : 
    4830              :                     //       The mixed air temp for zone equipment without an OA mixer is 0.
    4831              :                     //       This test avoids a negative capacity until a solution can be found.
    4832            7 :                     if (MixEnth > SupEnth) {
    4833            7 :                         CoolCapAtPeak = (rhoair * VolFlowRate * (MixEnth - SupEnth)) + FanCoolLoad;
    4834              :                     } else {
    4835            0 :                         CoolCapAtPeak = (rhoair * VolFlowRate * (48000.0 - SupEnth)) + FanCoolLoad;
    4836              :                     }
    4837            7 :                     CoolCapAtPeak = max(0.0, CoolCapAtPeak);
    4838            7 :                     if (TotCapTempModFac > 0.0) {
    4839            7 :                         RatedCapCoolTotalDes = CoolCapAtPeak / TotCapTempModFac;
    4840              :                     } else {
    4841            0 :                         RatedCapCoolTotalDes = CoolCapAtPeak;
    4842              :                     }
    4843              :                 } else {
    4844            0 :                     RatedCapCoolTotalDes = 0.0;
    4845              :                 }
    4846              :             }
    4847              :         }
    4848           18 :         if (RatedCapCoolTotalDes < HVAC::SmallLoad) {
    4849           10 :             RatedCapCoolTotalDes = 0.0;
    4850              :         }
    4851           18 :         if (!HardSizeNoDesRun) {
    4852            8 :             if (RatedCapCoolTotalAutoSized) {
    4853            6 :                 varSpeedCoil.RatedCapCoolTotal = RatedCapCoolTotalDes;
    4854           18 :                 BaseSizer::reportSizerOutput(state,
    4855           12 :                                              format("COIL:{}{}", varSpeedCoil.CoolHeatType, CurrentObjSubfix),
    4856              :                                              varSpeedCoil.Name,
    4857              :                                              "Design Size Rated Total Cooling Capacity [W]",
    4858              :                                              varSpeedCoil.RatedCapCoolTotal);
    4859           12 :                 OutputReportPredefined::PreDefTableEntry(
    4860            6 :                     state, state.dataOutRptPredefined->pdchCoolCoilTotCap, varSpeedCoil.Name, varSpeedCoil.RatedCapCoolTotal);
    4861           12 :                 OutputReportPredefined::PreDefTableEntry(state,
    4862            6 :                                                          state.dataOutRptPredefined->pdchCoolCoilLatCap,
    4863              :                                                          varSpeedCoil.Name,
    4864            6 :                                                          varSpeedCoil.RatedCapCoolTotal - varSpeedCoil.RatedCapCoolSens);
    4865            6 :                 if (varSpeedCoil.RatedCapCoolTotal != 0.0) {
    4866           12 :                     OutputReportPredefined::PreDefTableEntry(state,
    4867            6 :                                                              state.dataOutRptPredefined->pdchCoolCoilSHR,
    4868              :                                                              varSpeedCoil.Name,
    4869            6 :                                                              varSpeedCoil.RatedCapCoolSens / varSpeedCoil.RatedCapCoolTotal);
    4870           12 :                     OutputReportPredefined::PreDefTableEntry(
    4871            6 :                         state, state.dataOutRptPredefined->pdchCoolCoilNomEff, varSpeedCoil.Name, varSpeedCoil.MSRatedCOP(NormSpeed));
    4872              :                 } else {
    4873            0 :                     OutputReportPredefined::PreDefTableEntry(state, state.dataOutRptPredefined->pdchCoolCoilSHR, varSpeedCoil.Name, 0.0);
    4874            0 :                     OutputReportPredefined::PreDefTableEntry(state, state.dataOutRptPredefined->pdchCoolCoilNomEff, varSpeedCoil.Name, 0.0);
    4875              :                 }
    4876           12 :                 OutputReportPredefined::addFootNoteSubTable(
    4877              :                     state,
    4878            6 :                     state.dataOutRptPredefined->pdstCoolCoil,
    4879              :                     "Nominal values are gross at rated conditions, i.e., the supply air fan heat and electric power NOT accounted for.");
    4880              :             } else {
    4881            2 :                 if (varSpeedCoil.RatedCapCoolTotal > 0.0 && RatedCapCoolTotalDes > 0.0) {
    4882            0 :                     RatedCapCoolTotalUser = varSpeedCoil.RatedCapCoolTotal;
    4883            0 :                     BaseSizer::reportSizerOutput(state,
    4884            0 :                                                  format("COIL:{}{}", varSpeedCoil.CoolHeatType, CurrentObjSubfix),
    4885              :                                                  varSpeedCoil.Name,
    4886              :                                                  "Design Size Rated Total Cooling Capacity [W]",
    4887              :                                                  RatedCapCoolTotalDes,
    4888              :                                                  "User-Specified Rated Total Cooling Capacity [W]",
    4889              :                                                  RatedCapCoolTotalUser);
    4890            0 :                     if (state.dataGlobal->DisplayExtraWarnings) {
    4891            0 :                         if ((std::abs(RatedCapCoolTotalDes - RatedCapCoolTotalUser) / RatedCapCoolTotalUser) >
    4892            0 :                             state.dataSize->AutoVsHardSizingThreshold) {
    4893            0 :                             ShowMessage(state,
    4894            0 :                                         format("SizeVarSpeedCoil: Potential issue with equipment sizing for {} {}",
    4895            0 :                                                varSpeedCoil.CoolHeatType,
    4896              :                                                CurrentObjSubfix));
    4897            0 :                             ShowContinueError(state, format("Coil Name = {}", varSpeedCoil.Name));
    4898            0 :                             ShowContinueError(state, format("User-Specified Rated Total Cooling Capacity of {:.2R} [W]", RatedCapCoolTotalUser));
    4899            0 :                             ShowContinueError(state,
    4900            0 :                                               format("differs from Design Size Rated Total Cooling Capacity of {:.2R} [W]", RatedCapCoolTotalDes));
    4901            0 :                             ShowContinueError(state, "This may, or may not, indicate mismatched component sizes.");
    4902            0 :                             ShowContinueError(state, "Verify that the value entered is intended and is consistent with other components.");
    4903              :                         }
    4904              :                     }
    4905              :                 }
    4906              :             }
    4907              : 
    4908            8 :             state.dataRptCoilSelection->coilSelectionReportObj->setCoilEntAirTemp(
    4909            8 :                 state, varSpeedCoil.Name, varSpeedCoil.VarSpeedCoilType, MixTemp, state.dataSize->CurSysNum, state.dataSize->CurZoneEqNum);
    4910            8 :             state.dataRptCoilSelection->coilSelectionReportObj->setCoilEntAirHumRat(
    4911            8 :                 state, varSpeedCoil.Name, varSpeedCoil.VarSpeedCoilType, MixHumRat);
    4912            8 :             state.dataRptCoilSelection->coilSelectionReportObj->setCoilLvgAirTemp(state, varSpeedCoil.Name, varSpeedCoil.VarSpeedCoilType, SupTemp);
    4913            8 :             state.dataRptCoilSelection->coilSelectionReportObj->setCoilLvgAirHumRat(
    4914            8 :                 state, varSpeedCoil.Name, varSpeedCoil.VarSpeedCoilType, SupHumRat);
    4915            8 :             state.dataRptCoilSelection->coilSelectionReportObj->setCoilAirFlow(
    4916            8 :                 state, varSpeedCoil.Name, varSpeedCoil.VarSpeedCoilType, varSpeedCoil.RatedAirVolFlowRate, RatedAirFlowAutoSized);
    4917            8 :             state.dataRptCoilSelection->coilSelectionReportObj->setCoilCoolingCapacity(state,
    4918            8 :                                                                                        varSpeedCoil.Name,
    4919            8 :                                                                                        varSpeedCoil.VarSpeedCoilType,
    4920              :                                                                                        RatedCapCoolTotalDes,
    4921              :                                                                                        RatedCapCoolTotalAutoSized,
    4922            8 :                                                                                        state.dataSize->CurSysNum,
    4923            8 :                                                                                        state.dataSize->CurZoneEqNum,
    4924            8 :                                                                                        state.dataSize->CurOASysNum,
    4925              :                                                                                        0.0, // no fan load included in sizing
    4926              :                                                                                        TotCapTempModFac,
    4927              :                                                                                        -999.0,
    4928              :                                                                                        -999.0); // VS model doesn't limit, double check
    4929              :         }
    4930              : 
    4931              :         // Set the global DX cooling coil capacity variable for use by other objects
    4932           18 :         if (varSpeedCoil.VSCoilType == HVAC::Coil_CoolingWaterToAirHPVSEquationFit ||
    4933           16 :             varSpeedCoil.VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed) {
    4934           13 :             state.dataSize->DXCoolCap = varSpeedCoil.RatedCapCoolTotal;
    4935              :         }
    4936              : 
    4937              :         // size rated heating capacity
    4938           18 :         if (varSpeedCoil.RatedCapHeat == DataSizing::AutoSize && (varSpeedCoil.VSCoilType == HVAC::Coil_HeatingWaterToAirHPVSEquationFit ||
    4939           16 :                                                                   varSpeedCoil.VSCoilType == HVAC::Coil_HeatingAirToAirVariableSpeed)) {
    4940            4 :             RatedCapHeatAutoSized = true;
    4941              :         }
    4942              :         //   simply set heating capacity equal to the cooling capacity
    4943              :         // VarSpeedCoil(DXCoilNum)%RatedCapHeat = DXCoolCap
    4944           18 :         if (varSpeedCoil.VSCoilType == HVAC::Coil_HeatingWaterToAirHPVSEquationFit ||
    4945           17 :             varSpeedCoil.VSCoilType == HVAC::Coil_HeatingAirToAirVariableSpeed) {
    4946            5 :             if (varSpeedCoil.CompanionCoolingCoilNum > 0) {
    4947            1 :                 RatedCapHeatDes = state.dataVariableSpeedCoils->VarSpeedCoil(varSpeedCoil.CompanionCoolingCoilNum).RatedCapCoolTotal;
    4948            1 :                 varSpeedCoil.RatedCapCoolTotal = RatedCapHeatDes; // AVOID BEING ZERO
    4949              :             } else {
    4950            4 :                 RatedCapHeatDes = state.dataSize->DXCoolCap; // previous code, can be risky
    4951              :             }
    4952              :             // END IF
    4953            5 :             if (RatedCapHeatAutoSized) {
    4954            4 :                 if (RatedCapHeatDes == DataSizing::AutoSize) {
    4955            0 :                     ShowWarningError(
    4956            0 :                         state, format("COIL:{}:WATERTOAIRHEATPUMP:VARIABLESPEEDEQUATIONFIT \"{}\"", varSpeedCoil.CoolHeatType, varSpeedCoil.Name));
    4957            0 :                     ShowContinueError(state,
    4958            0 :                                       format("{}: Heating coil could not be autosized since cooling coil was not previously sized.", RoutineName));
    4959            0 :                     ShowContinueError(state, "... Cooling coil must be upstream of heating coil.");
    4960            0 :                     ShowContinueError(state, "... Manually sizing this heating coil will be required.");
    4961              :                 }
    4962              :             }
    4963            5 :             if (RatedCapHeatDes < HVAC::SmallLoad) {
    4964            1 :                 RatedCapHeatDes = 0.0;
    4965              :             }
    4966            5 :             state.dataRptCoilSelection->coilSelectionReportObj->setCoilHeatingCapacity(state,
    4967            5 :                                                                                        varSpeedCoil.Name,
    4968            5 :                                                                                        varSpeedCoil.VarSpeedCoilType,
    4969              :                                                                                        RatedCapHeatDes,
    4970              :                                                                                        RatedCapHeatAutoSized,
    4971            5 :                                                                                        state.dataSize->CurSysNum,
    4972            5 :                                                                                        state.dataSize->CurZoneEqNum,
    4973            5 :                                                                                        state.dataSize->CurOASysNum,
    4974              :                                                                                        0.0,
    4975              :                                                                                        1.0,
    4976              :                                                                                        -999.0,
    4977              :                                                                                        -999.0);
    4978              :         }
    4979           18 :         if (RatedCapHeatAutoSized) {
    4980            4 :             varSpeedCoil.RatedCapHeat = RatedCapHeatDes;
    4981           12 :             BaseSizer::reportSizerOutput(state,
    4982            8 :                                          format("COIL:{}{}", varSpeedCoil.CoolHeatType, CurrentObjSubfix),
    4983              :                                          varSpeedCoil.Name,
    4984              :                                          "Design Size Nominal Heating Capacity [W]",
    4985              :                                          RatedCapHeatDes);
    4986            8 :             OutputReportPredefined::PreDefTableEntry(
    4987            4 :                 state, state.dataOutRptPredefined->pdchHeatCoilNomCap, varSpeedCoil.Name, varSpeedCoil.RatedCapHeat);
    4988            4 :             if (varSpeedCoil.RatedCapHeat != 0.0) {
    4989            8 :                 OutputReportPredefined::PreDefTableEntry(
    4990            4 :                     state, state.dataOutRptPredefined->pdchHeatCoilNomEff, varSpeedCoil.Name, varSpeedCoil.MSRatedCOP(NormSpeed));
    4991              :             } else {
    4992            0 :                 OutputReportPredefined::PreDefTableEntry(state, state.dataOutRptPredefined->pdchHeatCoilNomEff, varSpeedCoil.Name, 0.0);
    4993              :             }
    4994            8 :             OutputReportPredefined::addFootNoteSubTable(
    4995              :                 state,
    4996            4 :                 state.dataOutRptPredefined->pdstHeatCoil,
    4997              :                 "Nominal values are gross at rated conditions, i.e., the supply air fan heat and electric power NOT accounted for.");
    4998              :         } else {
    4999           14 :             if (varSpeedCoil.RatedCapHeat > 0.0 && RatedCapHeatDes > 0.0) {
    5000            0 :                 RatedCapHeatUser = varSpeedCoil.RatedCapHeat;
    5001            0 :                 BaseSizer::reportSizerOutput(state,
    5002            0 :                                              format("COIL:{}{}", varSpeedCoil.CoolHeatType, CurrentObjSubfix),
    5003              :                                              varSpeedCoil.Name,
    5004              :                                              "Design Size Nominal Heating Capacity [W]",
    5005              :                                              RatedCapHeatDes,
    5006              :                                              "User-Specified Nominal Heating Capacity [W]",
    5007              :                                              RatedCapHeatUser);
    5008            0 :                 if (state.dataGlobal->DisplayExtraWarnings) {
    5009            0 :                     if ((std::abs(RatedCapHeatDes - RatedCapHeatUser) / RatedCapHeatUser) > state.dataSize->AutoVsHardSizingThreshold) {
    5010            0 :                         ShowMessage(
    5011              :                             state,
    5012            0 :                             format("SizeVarSpeedCoil: Potential issue with equipment sizing for {} {}", varSpeedCoil.CoolHeatType, CurrentObjSubfix));
    5013            0 :                         ShowContinueError(state, format("Coil Name = {}", varSpeedCoil.Name));
    5014            0 :                         ShowContinueError(state, format("User-Specified Rated Total Heating Capacity of {:.2R} [W]", RatedCapHeatUser));
    5015            0 :                         ShowContinueError(state, format("differs from Design Size Rated Total Heating Capacity of {:.2R} [W]", RatedCapHeatDes));
    5016            0 :                         ShowContinueError(state, "This may, or may not, indicate mismatched component sizes.");
    5017            0 :                         ShowContinueError(state, "Verify that the value entered is intended and is consistent with other components.");
    5018              :                     }
    5019              :                 }
    5020              :             }
    5021              :         }
    5022              : 
    5023              :         // FORCE BACK TO THE RATED AIR FLOW RATE WITH THE SAME RATIO DEFINED BY THE CATALOG DATA
    5024           18 :         if (!HardSizeNoDesRunAirFlow) {
    5025           13 :             if ((RatedCapCoolTotalAutoSized) && (RatedAirFlowAutoSized)) {
    5026            6 :                 RatedAirVolFlowRateDes = varSpeedCoil.RatedCapCoolTotal * varSpeedCoil.MSRatedAirVolFlowPerRatedTotCap(NormSpeed);
    5027            7 :             } else if ((RatedCapHeatAutoSized) && (RatedAirFlowAutoSized)) {
    5028            2 :                 RatedAirVolFlowRateDes = varSpeedCoil.RatedCapHeat * varSpeedCoil.MSRatedAirVolFlowPerRatedTotCap(NormSpeed);
    5029              :             }
    5030              : 
    5031              :             // write the air flow sizing output
    5032           13 :             if (RatedAirFlowAutoSized) {
    5033            8 :                 varSpeedCoil.RatedAirVolFlowRate = RatedAirVolFlowRateDes;
    5034           24 :                 BaseSizer::reportSizerOutput(state,
    5035           16 :                                              format("COIL:{}{}", varSpeedCoil.CoolHeatType, CurrentObjSubfix),
    5036              :                                              varSpeedCoil.Name,
    5037              :                                              "Design Size Rated Air Flow Rate [m3/s]",
    5038              :                                              RatedAirVolFlowRateDes);
    5039              :             } else {
    5040            5 :                 if (varSpeedCoil.RatedAirVolFlowRate > 0.0 && RatedAirVolFlowRateDes > 0.0) {
    5041            0 :                     RatedAirVolFlowRateUser = varSpeedCoil.RatedAirVolFlowRate;
    5042            0 :                     BaseSizer::reportSizerOutput(state,
    5043            0 :                                                  format("COIL:{}{}", varSpeedCoil.CoolHeatType, CurrentObjSubfix),
    5044              :                                                  varSpeedCoil.Name,
    5045              :                                                  "Design Size Rated Air Flow Rate [m3/s]",
    5046              :                                                  RatedAirVolFlowRateDes,
    5047              :                                                  "User-Specified Rated Air Flow Rate [m3/s]",
    5048              :                                                  RatedAirVolFlowRateUser);
    5049            0 :                     if (state.dataGlobal->DisplayExtraWarnings) {
    5050            0 :                         if ((std::abs(RatedAirVolFlowRateDes - RatedAirVolFlowRateUser) / RatedAirVolFlowRateUser) >
    5051            0 :                             state.dataSize->AutoVsHardSizingThreshold) {
    5052            0 :                             ShowMessage(state,
    5053            0 :                                         format("SizeVarSpeedCoil: Potential issue with equipment sizing for {} {}",
    5054            0 :                                                varSpeedCoil.CoolHeatType,
    5055              :                                                CurrentObjSubfix));
    5056            0 :                             ShowContinueError(state, format("Coil Name = {}", varSpeedCoil.Name));
    5057            0 :                             ShowContinueError(state, format("User-Specified Rated Air Flow Rate of {:.5R} [m3/s]", RatedAirVolFlowRateUser));
    5058            0 :                             ShowContinueError(state, format("differs from Design Size Rated Air Flow Rate of {:.5R} [m3/s]", RatedAirVolFlowRateDes));
    5059            0 :                             ShowContinueError(state, "This may, or may not, indicate mismatched component sizes.");
    5060            0 :                             ShowContinueError(state, "Verify that the value entered is intended and is consistent with other components.");
    5061              :                         }
    5062              :                     }
    5063              :                 }
    5064              :             }
    5065           13 :             state.dataRptCoilSelection->coilSelectionReportObj->setCoilAirFlow(
    5066           13 :                 state, varSpeedCoil.Name, varSpeedCoil.VarSpeedCoilType, RatedAirVolFlowRateDes, RatedAirFlowAutoSized);
    5067              :         }
    5068              : 
    5069              :         // Check that heat pump heating capacity is within 20% of cooling capacity. Check only for heating coil and report both.
    5070           18 :         if ((varSpeedCoil.VSCoilType == HVAC::Coil_HeatingWaterToAirHPVSEquationFit ||
    5071           17 :              varSpeedCoil.VSCoilType == HVAC::Coil_HeatingAirToAirVariableSpeed) &&
    5072            5 :             varSpeedCoil.CompanionCoolingCoilNum > 0) {
    5073              : 
    5074            1 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(varSpeedCoil.CompanionCoolingCoilNum).RatedCapCoolTotal > 0.0) {
    5075              : 
    5076            1 :                 if (std::abs(state.dataVariableSpeedCoils->VarSpeedCoil(varSpeedCoil.CompanionCoolingCoilNum).RatedCapCoolTotal -
    5077            1 :                              varSpeedCoil.RatedCapHeat) /
    5078            1 :                         state.dataVariableSpeedCoils->VarSpeedCoil(varSpeedCoil.CompanionCoolingCoilNum).RatedCapCoolTotal >
    5079              :                     0.2) {
    5080              : 
    5081            0 :                     ShowWarningError(
    5082            0 :                         state, format("COIL:{}:WATERTOAIRHEATPUMP:VARIABLESPEEDEQUATIONFIT \"{}\"", varSpeedCoil.CoolHeatType, varSpeedCoil.Name));
    5083            0 :                     ShowContinueError(state,
    5084            0 :                                       format("...used with COIL:{}:WATERTOAIRHEATPUMP:VARIABLESPEEDEQUATIONFIT \"{}\"",
    5085            0 :                                              state.dataVariableSpeedCoils->VarSpeedCoil(varSpeedCoil.CompanionCoolingCoilNum).CoolHeatType,
    5086            0 :                                              state.dataVariableSpeedCoils->VarSpeedCoil(varSpeedCoil.CompanionCoolingCoilNum).Name));
    5087            0 :                     ShowContinueError(state, "...heating capacity is disproportionate (> 20% different) to total cooling capacity");
    5088            0 :                     ShowContinueError(state, format("...heating capacity = {:.3T} W", varSpeedCoil.RatedCapHeat));
    5089            0 :                     ShowContinueError(state,
    5090            0 :                                       format("...cooling capacity = {:.3T} W",
    5091            0 :                                              state.dataVariableSpeedCoils->VarSpeedCoil(varSpeedCoil.CompanionCoolingCoilNum).RatedCapCoolTotal));
    5092              :                 }
    5093              :             }
    5094              :         }
    5095              : 
    5096              :         // ASSIGN CAPACITY
    5097           18 :         switch (varSpeedCoil.VSCoilType) {
    5098           13 :         case HVAC::Coil_CoolingWaterToAirHPVSEquationFit:
    5099              :         case HVAC::Coil_CoolingAirToAirVariableSpeed: {
    5100           13 :             varSpeedCoil.MSRatedTotCap(UpperSpeed) = varSpeedCoil.RatedCapCoolTotal / varSpeedCoil.MSRatedPercentTotCap(NormSpeed);
    5101           13 :         } break;
    5102            5 :         case HVAC::Coil_HeatingWaterToAirHPVSEquationFit:
    5103              :         case HVAC::Coil_HeatingAirToAirVariableSpeed: {
    5104            5 :             varSpeedCoil.MSRatedTotCap(UpperSpeed) = varSpeedCoil.RatedCapHeat / varSpeedCoil.MSRatedPercentTotCap(NormSpeed);
    5105            5 :         } break;
    5106            0 :         case HVAC::CoilDX_HeatPumpWaterHeaterVariableSpeed: {
    5107            0 :             varSpeedCoil.MSRatedTotCap(UpperSpeed) = varSpeedCoil.RatedCapWH / varSpeedCoil.MSRatedPercentTotCap(NormSpeed);
    5108            0 :         } break;
    5109              :         }
    5110              : 
    5111           18 :         if (varSpeedCoil.VSCoilType == HVAC::CoilDX_HeatPumpWaterHeaterVariableSpeed) {
    5112            0 :             HPInletAirHumRat = Psychrometrics::PsyWFnTdbTwbPb(
    5113            0 :                 state, varSpeedCoil.WHRatedInletDBTemp, varSpeedCoil.WHRatedInletWBTemp, state.dataEnvrn->StdBaroPress, RoutineName);
    5114              : 
    5115            0 :             for (Mode = varSpeedCoil.NumOfSpeeds; Mode >= 1; --Mode) {
    5116            0 :                 varSpeedCoil.MSRatedTotCap(Mode) = varSpeedCoil.MSRatedTotCap(UpperSpeed) * varSpeedCoil.MSRatedPercentTotCap(Mode);
    5117            0 :                 varSpeedCoil.MSRatedAirVolFlowRate(Mode) = varSpeedCoil.MSRatedTotCap(Mode) * varSpeedCoil.MSRatedAirVolFlowPerRatedTotCap(Mode);
    5118            0 :                 varSpeedCoil.MSRatedAirMassFlowRate(Mode) = varSpeedCoil.MSRatedAirVolFlowRate(Mode) * rhoair;
    5119              :                 // EVAPORATIVE PRECOOLING CONDENSER AIR FLOW RATE
    5120            0 :                 varSpeedCoil.EvapCondAirFlow(Mode) = 0.0;
    5121              :             }
    5122              :         } else {
    5123              :             // HPWH, the mass flow rate will be updated by a revised entering air density
    5124              : 
    5125           18 :             if (varSpeedCoil.MSHPDesignSpecIndex > -1 && state.dataUnitarySystems->designSpecMSHP.size() > 0) {
    5126            3 :                 if (varSpeedCoil.VSCoilType == HVAC::Coil_CoolingWaterToAirHPVSEquationFit ||
    5127            3 :                     varSpeedCoil.VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed) {
    5128            2 :                     if (state.dataUnitarySystems->designSpecMSHP[varSpeedCoil.MSHPDesignSpecIndex].numOfSpeedCooling != varSpeedCoil.NumOfSpeeds) {
    5129            0 :                         ShowFatalError(state,
    5130            0 :                                        format("COIL:{} = {}{} number of speeds not equal to number of speed specified in "
    5131              :                                               "UnitarySystemPerformance:Multispeed object.",
    5132            0 :                                               varSpeedCoil.CoolHeatType,
    5133              :                                               CurrentObjSubfix,
    5134            0 :                                               varSpeedCoil.Name));
    5135              :                     } else {
    5136           11 :                         for (Mode = varSpeedCoil.NumOfSpeeds; Mode >= 1; --Mode) {
    5137           20 :                             varSpeedCoil.MSRatedAirVolFlowRate(Mode) =
    5138           10 :                                 varSpeedCoil.RatedAirVolFlowRate *
    5139           10 :                                 state.dataUnitarySystems->designSpecMSHP[varSpeedCoil.MSHPDesignSpecIndex].coolingVolFlowRatio[Mode - 1];
    5140           20 :                             varSpeedCoil.MSRatedTotCap(Mode) =
    5141           10 :                                 varSpeedCoil.MSRatedAirVolFlowRate(Mode) / varSpeedCoil.MSRatedAirVolFlowPerRatedTotCap(Mode);
    5142           10 :                             varSpeedCoil.MSRatedAirMassFlowRate(Mode) = varSpeedCoil.MSRatedAirVolFlowRate(Mode) * rhoair;
    5143              :                             // EVAPORATIVE PRECOOLING CONDENSER AIR FLOW RATE
    5144           10 :                             varSpeedCoil.EvapCondAirFlow(Mode) =
    5145           10 :                                 varSpeedCoil.MSRatedTotCap(Mode) * varSpeedCoil.MSRatedEvapCondVolFlowPerRatedTotCap(Mode);
    5146              :                         }
    5147              :                     }
    5148            2 :                 } else if (varSpeedCoil.VSCoilType == HVAC::Coil_HeatingWaterToAirHPVSEquationFit ||
    5149            2 :                            varSpeedCoil.VSCoilType == HVAC::Coil_HeatingAirToAirVariableSpeed) {
    5150            2 :                     if (state.dataUnitarySystems->designSpecMSHP[varSpeedCoil.MSHPDesignSpecIndex].numOfSpeedHeating != varSpeedCoil.NumOfSpeeds) {
    5151            0 :                         ShowFatalError(state,
    5152            0 :                                        format("COIL:{}{} = \"{}\" number of speeds not equal to number of speed specified in "
    5153              :                                               "UnitarySystemPerformance:Multispeed object.",
    5154            0 :                                               varSpeedCoil.CoolHeatType,
    5155              :                                               CurrentObjSubfix,
    5156            0 :                                               varSpeedCoil.Name));
    5157              :                     } else {
    5158           22 :                         for (Mode = varSpeedCoil.NumOfSpeeds; Mode >= 1; --Mode) {
    5159           40 :                             varSpeedCoil.MSRatedAirVolFlowRate(Mode) =
    5160           20 :                                 varSpeedCoil.RatedAirVolFlowRate *
    5161           20 :                                 state.dataUnitarySystems->designSpecMSHP[varSpeedCoil.MSHPDesignSpecIndex].heatingVolFlowRatio[Mode - 1];
    5162           40 :                             varSpeedCoil.MSRatedTotCap(Mode) =
    5163           20 :                                 varSpeedCoil.MSRatedAirVolFlowRate(Mode) / varSpeedCoil.MSRatedAirVolFlowPerRatedTotCap(Mode);
    5164           20 :                             varSpeedCoil.MSRatedAirMassFlowRate(Mode) = varSpeedCoil.MSRatedAirVolFlowRate(Mode) * rhoair;
    5165              :                             // EVAPORATIVE PRECOOLING CONDENSER AIR FLOW RATE
    5166           20 :                             varSpeedCoil.EvapCondAirFlow(Mode) =
    5167           20 :                                 varSpeedCoil.MSRatedTotCap(Mode) * varSpeedCoil.MSRatedEvapCondVolFlowPerRatedTotCap(Mode);
    5168              :                         }
    5169              :                     }
    5170              :                 }
    5171              :             } else {
    5172          108 :                 for (Mode = varSpeedCoil.NumOfSpeeds; Mode >= 1; --Mode) {
    5173           93 :                     varSpeedCoil.MSRatedTotCap(Mode) = varSpeedCoil.MSRatedTotCap(UpperSpeed) * varSpeedCoil.MSRatedPercentTotCap(Mode);
    5174           93 :                     varSpeedCoil.MSRatedAirVolFlowRate(Mode) = varSpeedCoil.MSRatedTotCap(Mode) * varSpeedCoil.MSRatedAirVolFlowPerRatedTotCap(Mode);
    5175           93 :                     varSpeedCoil.MSRatedAirMassFlowRate(Mode) = varSpeedCoil.MSRatedAirVolFlowRate(Mode) * rhoair;
    5176              :                     // EVAPORATIVE PRECOOLING CONDENSER AIR FLOW RATE
    5177           93 :                     varSpeedCoil.EvapCondAirFlow(Mode) = varSpeedCoil.MSRatedTotCap(Mode) * varSpeedCoil.MSRatedEvapCondVolFlowPerRatedTotCap(Mode);
    5178              :                 }
    5179              :             }
    5180              :         }
    5181              : 
    5182              :         // size rated power
    5183           18 :         switch (varSpeedCoil.VSCoilType) {
    5184           13 :         case HVAC::Coil_CoolingWaterToAirHPVSEquationFit:
    5185              :         case HVAC::Coil_CoolingAirToAirVariableSpeed: {
    5186           13 :             varSpeedCoil.RatedCOPCool = varSpeedCoil.MSRatedCOP(varSpeedCoil.NormSpedLevel);
    5187           13 :             varSpeedCoil.RatedPowerCool = varSpeedCoil.RatedCapCoolTotal / varSpeedCoil.RatedCOPCool;
    5188           13 :         } break;
    5189            5 :         case HVAC::Coil_HeatingWaterToAirHPVSEquationFit:
    5190              :         case HVAC::Coil_HeatingAirToAirVariableSpeed: {
    5191            5 :             varSpeedCoil.RatedCOPHeat = varSpeedCoil.MSRatedCOP(varSpeedCoil.NormSpedLevel);
    5192            5 :             varSpeedCoil.RatedPowerHeat = varSpeedCoil.RatedCapHeat / varSpeedCoil.RatedCOPHeat;
    5193            5 :             varSpeedCoil.RatedCapCoolTotal = varSpeedCoil.RatedCapHeat;
    5194            5 :         } break;
    5195            0 :         case HVAC::CoilDX_HeatPumpWaterHeaterVariableSpeed: {
    5196            0 :             varSpeedCoil.RatedCOPHeat = varSpeedCoil.MSRatedCOP(varSpeedCoil.NormSpedLevel);
    5197            0 :             varSpeedCoil.RatedPowerHeat = varSpeedCoil.RatedCapWH / varSpeedCoil.RatedCOPHeat;
    5198            0 :             varSpeedCoil.RatedCapCoolTotal = varSpeedCoil.RatedCapWH * (1.0 - 1.0 / varSpeedCoil.RatedCOPHeat);
    5199            0 :         } break;
    5200              :         }
    5201              : 
    5202              :         // Size water volumetric flow rate
    5203           18 :         if ((varSpeedCoil.RatedWaterVolFlowRate == DataSizing::AutoSize) &&
    5204           18 :             (varSpeedCoil.VSCoilType == HVAC::Coil_CoolingWaterToAirHPVSEquationFit ||
    5205           16 :              varSpeedCoil.VSCoilType == HVAC::Coil_HeatingWaterToAirHPVSEquationFit)) {
    5206            3 :             RatedWaterFlowAutoSized = true;
    5207              :         }
    5208              : 
    5209              :         //   WSHP condenser can be on either a plant loop or condenser loop. Test each to find plant sizing number.
    5210              :         //   first check to see if coil is connected to a plant loop, no warning on this CALL
    5211           18 :         if (RatedWaterFlowAutoSized) {
    5212            3 :             if (varSpeedCoil.CondenserType == DataHeatBalance::RefrigCondenserType::Water) {
    5213            6 :                 PltSizNum = PlantUtilities::MyPlantSizingIndex(state,
    5214            6 :                                                                format("COIL:{}{}", varSpeedCoil.CoolHeatType, CurrentObjSubfix),
    5215              :                                                                varSpeedCoil.Name,
    5216              :                                                                varSpeedCoil.WaterInletNodeNum,
    5217              :                                                                varSpeedCoil.WaterOutletNodeNum,
    5218              :                                                                ErrorsFound,
    5219              :                                                                false);
    5220              :             }
    5221              : 
    5222            3 :             if (PltSizNum > 0) {
    5223            3 :                 rho = state.dataPlnt->PlantLoop(varSpeedCoil.plantLoc.loopNum)
    5224            3 :                           .glycol->getDensity(state, state.dataSize->PlantSizData(PltSizNum).ExitTemp, RoutineNameAlt);
    5225            3 :                 cp = state.dataPlnt->PlantLoop(varSpeedCoil.plantLoc.loopNum)
    5226            3 :                          .glycol->getSpecificHeat(state, state.dataSize->PlantSizData(PltSizNum).ExitTemp, RoutineNameAlt);
    5227              : 
    5228            3 :                 if (varSpeedCoil.VSCoilType == HVAC::Coil_HeatingWaterToAirHPVSEquationFit ||
    5229            2 :                     varSpeedCoil.VSCoilType == HVAC::Coil_HeatingAirToAirVariableSpeed) {
    5230              : 
    5231            1 :                     RatedWaterVolFlowRateDes = varSpeedCoil.RatedCapHeat / (state.dataSize->PlantSizData(PltSizNum).DeltaT * cp * rho);
    5232              : 
    5233            1 :                     state.dataRptCoilSelection->coilSelectionReportObj->setCoilLvgWaterTemp(
    5234              :                         state,
    5235            1 :                         varSpeedCoil.Name,
    5236            1 :                         varSpeedCoil.VarSpeedCoilType,
    5237            1 :                         state.dataSize->PlantSizData(PltSizNum).ExitTemp +
    5238            1 :                             state.dataSize->PlantSizData(PltSizNum).DeltaT); // TRACE 3D Plus coil selection report
    5239              : 
    5240            2 :                 } else if (varSpeedCoil.VSCoilType == HVAC::Coil_CoolingWaterToAirHPVSEquationFit ||
    5241            0 :                            varSpeedCoil.VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed) {
    5242              : 
    5243              :                     //       use companion heating coil capacity to calculate volumetric flow rate
    5244            2 :                     if (varSpeedCoil.CompanionCoolingCoilNum > 0) {
    5245            0 :                         SystemCapacity = state.dataVariableSpeedCoils->VarSpeedCoil(varSpeedCoil.CompanionCoolingCoilNum).RatedCapHeat;
    5246              :                     } else {
    5247            2 :                         SystemCapacity = varSpeedCoil.RatedCapCoolTotal;
    5248              :                     }
    5249              : 
    5250            2 :                     RatedWaterVolFlowRateDes = SystemCapacity / (state.dataSize->PlantSizData(PltSizNum).DeltaT * cp * rho);
    5251              : 
    5252            2 :                     state.dataRptCoilSelection->coilSelectionReportObj->setCoilLvgWaterTemp(
    5253              :                         state,
    5254            2 :                         varSpeedCoil.Name,
    5255            2 :                         varSpeedCoil.VarSpeedCoilType,
    5256            2 :                         state.dataSize->PlantSizData(PltSizNum).ExitTemp -
    5257            2 :                             state.dataSize->PlantSizData(PltSizNum).DeltaT); // TRACE 3D Plus coil selection report
    5258              :                 }
    5259              : 
    5260            3 :                 state.dataRptCoilSelection->coilSelectionReportObj->setCoilEntWaterTemp(
    5261              :                     state,
    5262            3 :                     varSpeedCoil.Name,
    5263            3 :                     varSpeedCoil.VarSpeedCoilType,
    5264            3 :                     state.dataSize->PlantSizData(PltSizNum).ExitTemp); // TRACE 3D Plus coil selection report
    5265              : 
    5266            3 :                 state.dataRptCoilSelection->coilSelectionReportObj->setCoilWaterDeltaT(
    5267              :                     state,
    5268            3 :                     varSpeedCoil.Name,
    5269            3 :                     varSpeedCoil.VarSpeedCoilType,
    5270            3 :                     state.dataSize->PlantSizData(PltSizNum).DeltaT); // TRACE 3D Plus coil selection report
    5271              :             } else {
    5272            0 :                 ShowSevereError(state, "Autosizing of water flow requires a loop Sizing:Plant object");
    5273            0 :                 ShowContinueError(state, "Autosizing also requires physical connection to a plant or condenser loop.");
    5274            0 :                 ShowContinueError(state, format("Occurs in COIL:{}{}  Object = {}", varSpeedCoil.CoolHeatType, CurrentObjSubfix, varSpeedCoil.Name));
    5275            0 :                 ErrorsFound = true;
    5276              :             }
    5277              : 
    5278              :             // WRITE THE WATER SIZING OUTPUT
    5279              :             // FORCE BACK TO THE RATED WATER FLOW RATE WITH THE SAME RATIO DEFINED BY THE CATLOG DATA
    5280            3 :             if (RatedCapCoolTotalAutoSized) {
    5281            2 :                 RatedWaterVolFlowRateDes = varSpeedCoil.RatedCapCoolTotal * varSpeedCoil.MSRatedWaterVolFlowPerRatedTotCap(NormSpeed);
    5282            1 :             } else if (RatedCapHeatAutoSized) {
    5283            1 :                 RatedWaterVolFlowRateDes = varSpeedCoil.RatedCapHeat * varSpeedCoil.MSRatedWaterVolFlowPerRatedTotCap(NormSpeed);
    5284              :             }
    5285            3 :             state.dataRptCoilSelection->coilSelectionReportObj->setCoilWaterFlowNodeNums(state,
    5286            3 :                                                                                          varSpeedCoil.Name,
    5287            3 :                                                                                          varSpeedCoil.VarSpeedCoilType,
    5288              :                                                                                          RatedWaterVolFlowRateDes,
    5289              :                                                                                          RatedWaterFlowAutoSized,
    5290              :                                                                                          varSpeedCoil.WaterInletNodeNum,
    5291              :                                                                                          varSpeedCoil.WaterOutletNodeNum,
    5292              :                                                                                          varSpeedCoil.plantLoc.loopNum);
    5293            3 :             varSpeedCoil.RatedWaterVolFlowRate = RatedWaterVolFlowRateDes;
    5294            9 :             BaseSizer::reportSizerOutput(state,
    5295            6 :                                          format("COIL:{}{}", varSpeedCoil.CoolHeatType, CurrentObjSubfix),
    5296              :                                          varSpeedCoil.Name,
    5297              :                                          "Design Size Rated Water Flow Rate [m3/s]",
    5298              :                                          RatedWaterVolFlowRateDes);
    5299              :             // Ensure water flow rate at lower speed must be lower or
    5300              :             // equal to the flow rate at higher speed. Otherwise, a severe error is isssued.
    5301           30 :             for (Mode = 1; Mode <= varSpeedCoil.NumOfSpeeds - 1; ++Mode) {
    5302           27 :                 if (varSpeedCoil.MSRatedWaterVolFlowRate(Mode) > varSpeedCoil.MSRatedWaterVolFlowRate(Mode + 1) * 1.05) {
    5303            0 :                     ShowWarningError(
    5304              :                         state,
    5305            0 :                         format("SizeDXCoil: {} {}, Speed {} Rated Air Flow Rate must be less than or equal to Speed {} Rated Air Flow Rate.",
    5306            0 :                                varSpeedCoil.VarSpeedCoilType,
    5307            0 :                                varSpeedCoil.Name,
    5308              :                                Mode,
    5309            0 :                                Mode + 1));
    5310            0 :                     ShowContinueError(
    5311              :                         state,
    5312            0 :                         format("Instead, {:.2R} > {:.2R}", varSpeedCoil.MSRatedAirVolFlowRate(Mode), varSpeedCoil.MSRatedAirVolFlowRate(Mode + 1)));
    5313            0 :                     ShowFatalError(state, "Preceding conditions cause termination.");
    5314              :                 }
    5315              :             }
    5316              :         } else {
    5317           15 :             if (varSpeedCoil.RatedWaterVolFlowRate > 0.0 && RatedWaterVolFlowRateDes > 0.0) {
    5318            0 :                 RatedWaterVolFlowRateUser = varSpeedCoil.RatedWaterVolFlowRate;
    5319            0 :                 BaseSizer::reportSizerOutput(state,
    5320            0 :                                              format("COIL:{}{}", varSpeedCoil.CoolHeatType, CurrentObjSubfix),
    5321              :                                              varSpeedCoil.Name,
    5322              :                                              "Design Size Rated Water Flow Rate [m3/s]",
    5323              :                                              RatedWaterVolFlowRateDes,
    5324              :                                              "User-Specified Rated Water Flow Rate [m3/s]",
    5325              :                                              RatedWaterVolFlowRateUser);
    5326            0 :                 if (state.dataGlobal->DisplayExtraWarnings) {
    5327            0 :                     if ((std::abs(RatedWaterVolFlowRateDes - RatedWaterVolFlowRateUser) / RatedWaterVolFlowRateUser) >
    5328            0 :                         state.dataSize->AutoVsHardSizingThreshold) {
    5329            0 :                         ShowMessage(
    5330              :                             state,
    5331            0 :                             format("SizeVarSpeedCoil: Potential issue with equipment sizing for {} {}", varSpeedCoil.CoolHeatType, CurrentObjSubfix));
    5332            0 :                         ShowContinueError(state, format("Coil Name = {}", varSpeedCoil.Name));
    5333            0 :                         ShowContinueError(state, format("User-Specified Rated Water Flow Rate of {:.5R} [m3/s]", RatedWaterVolFlowRateUser));
    5334            0 :                         ShowContinueError(state, format("differs from Design Size Rated Water Flow Rate of {:.5R} [m3/s]", RatedWaterVolFlowRateDes));
    5335            0 :                         ShowContinueError(state, "This may, or may not, indicate mismatched component sizes.");
    5336            0 :                         ShowContinueError(state, "Verify that the value entered is intended and is consistent with other components.");
    5337              :                     }
    5338              :                 }
    5339              :             }
    5340              :         }
    5341              : 
    5342              :         // Save component design water volumetric flow rate.
    5343           18 :         if (varSpeedCoil.RatedWaterVolFlowRate > 0.0 && varSpeedCoil.VSCoilType == HVAC::CoilDX_HeatPumpWaterHeaterVariableSpeed) {
    5344            0 :             PlantUtilities::RegisterPlantCompDesignFlow(state, varSpeedCoil.WaterInletNodeNum, varSpeedCoil.RatedWaterVolFlowRate);
    5345              :         }
    5346              :         // Use 1/2 flow since both cooling and heating coil will save flow yet only 1 will operate at a time
    5347           18 :         else if (varSpeedCoil.RatedWaterVolFlowRate > 0.0) {
    5348            3 :             PlantUtilities::RegisterPlantCompDesignFlow(state, varSpeedCoil.WaterInletNodeNum, 0.5 * varSpeedCoil.RatedWaterVolFlowRate);
    5349              :         }
    5350              : 
    5351           18 :         RatedSourceTempCool = GetVSCoilRatedSourceTemp(state, DXCoilNum);
    5352           18 :         if (varSpeedCoil.VSCoilType == HVAC::Coil_CoolingWaterToAirHPVSEquationFit ||
    5353           16 :             varSpeedCoil.VSCoilType == HVAC::Coil_HeatingWaterToAirHPVSEquationFit) {
    5354              : 
    5355            3 :             if (PltSizNum > 0) {
    5356            3 :                 rhoW = rho;
    5357              :             } else {
    5358            0 :                 rhoW = state.dataPlnt->PlantLoop(varSpeedCoil.plantLoc.loopNum).glycol->getDensity(state, RatedSourceTempCool, RoutineName);
    5359              :             }
    5360              : 
    5361            3 :             varSpeedCoil.RatedWaterMassFlowRate = varSpeedCoil.RatedWaterVolFlowRate * rhoW;
    5362           33 :             for (Mode = varSpeedCoil.NumOfSpeeds; Mode >= 1; --Mode) {
    5363           30 :                 varSpeedCoil.MSRatedWaterVolFlowRate(Mode) = varSpeedCoil.MSRatedTotCap(Mode) * varSpeedCoil.MSRatedWaterVolFlowPerRatedTotCap(Mode);
    5364           30 :                 varSpeedCoil.MSRatedWaterMassFlowRate(Mode) = varSpeedCoil.MSRatedWaterVolFlowRate(Mode) * rhoW;
    5365              :             }
    5366           15 :         } else if (varSpeedCoil.VSCoilType == HVAC::CoilDX_HeatPumpWaterHeaterVariableSpeed) {
    5367            0 :             rhoW = Psychrometrics::RhoH2O(RatedSourceTempCool);
    5368            0 :             varSpeedCoil.RatedWaterMassFlowRate = varSpeedCoil.RatedWaterVolFlowRate * rhoW;
    5369            0 :             for (Mode = varSpeedCoil.NumOfSpeeds; Mode >= 1; --Mode) {
    5370            0 :                 varSpeedCoil.MSRatedWaterVolFlowRate(Mode) = varSpeedCoil.MSRatedTotCap(Mode) * varSpeedCoil.MSRatedWaterVolFlowPerRatedTotCap(Mode);
    5371            0 :                 varSpeedCoil.MSWHPumpPower(Mode) = varSpeedCoil.MSRatedTotCap(Mode) * varSpeedCoil.MSWHPumpPowerPerRatedTotCap(Mode);
    5372            0 :                 varSpeedCoil.MSRatedWaterMassFlowRate(Mode) = varSpeedCoil.MSRatedWaterVolFlowRate(Mode) * rhoW;
    5373              :             }
    5374              :         }
    5375              : 
    5376              :         // Ensure air flow rate at lower speed must be lower or
    5377              :         // equal to the flow rate at higher speed. Otherwise, a severe error is issued.
    5378          123 :         for (Mode = 1; Mode <= varSpeedCoil.NumOfSpeeds - 1; ++Mode) {
    5379          105 :             if (varSpeedCoil.MSRatedAirVolFlowRate(Mode) > varSpeedCoil.MSRatedAirVolFlowRate(Mode + 1)) {
    5380            0 :                 ShowWarningError(state,
    5381            0 :                                  format("SizeDXCoil: {} {}, Speed {} Rated Air Flow Rate must be less than or equal to Speed {} Rated Air Flow Rate.",
    5382            0 :                                         varSpeedCoil.VarSpeedCoilType,
    5383            0 :                                         varSpeedCoil.Name,
    5384              :                                         Mode,
    5385            0 :                                         Mode + 1));
    5386            0 :                 ShowContinueError(
    5387              :                     state,
    5388            0 :                     format("Instead, {:.2R} > {:.2R}", varSpeedCoil.MSRatedAirVolFlowRate(Mode), varSpeedCoil.MSRatedAirVolFlowRate(Mode + 1)));
    5389            0 :                 ShowFatalError(state, "Preceding conditions cause termination.");
    5390              :             }
    5391              :         }
    5392              : 
    5393              :         // Ensure capacity at lower speed must be lower or equal to the capacity at higher speed.
    5394          123 :         for (Mode = 1; Mode <= varSpeedCoil.NumOfSpeeds - 1; ++Mode) {
    5395          105 :             if (varSpeedCoil.MSRatedTotCap(Mode) > varSpeedCoil.MSRatedTotCap(Mode + 1)) {
    5396            0 :                 ShowWarningError(state,
    5397            0 :                                  format("SizeDXCoil: {} {}, Speed {} Rated Total Cooling Capacity must be less than or equal to Speed {} Rated Total "
    5398              :                                         "Cooling Capacity.",
    5399            0 :                                         varSpeedCoil.VarSpeedCoilType,
    5400            0 :                                         varSpeedCoil.Name,
    5401              :                                         Mode,
    5402            0 :                                         Mode + 1));
    5403            0 :                 ShowContinueError(state, format("Instead, {:.2R} > {:.2R}", varSpeedCoil.MSRatedTotCap(Mode), varSpeedCoil.MSRatedTotCap(Mode + 1)));
    5404            0 :                 ShowFatalError(state, "Preceding conditions cause termination.");
    5405              :             }
    5406              :         }
    5407              : 
    5408              :         // convert SHR to rated Bypass factor and effective air side surface area
    5409           18 :         if (varSpeedCoil.VSCoilType == HVAC::Coil_CoolingWaterToAirHPVSEquationFit ||
    5410           16 :             varSpeedCoil.VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed) {
    5411           91 :             for (Mode = 1; Mode <= varSpeedCoil.NumOfSpeeds; ++Mode) {
    5412           78 :                 varSpeedCoil.MSRatedCBF(Mode) = DXCoils::CalcCBF(state,
    5413           78 :                                                                  varSpeedCoil.VarSpeedCoilType,
    5414           78 :                                                                  varSpeedCoil.Name,
    5415              :                                                                  RatedInletAirTemp,
    5416              :                                                                  RatedInletAirHumRat,
    5417           78 :                                                                  varSpeedCoil.MSRatedTotCap(Mode),
    5418           78 :                                                                  varSpeedCoil.MSRatedAirVolFlowRate(Mode),
    5419           78 :                                                                  varSpeedCoil.MSRatedSHR(Mode),
    5420              :                                                                  true);
    5421           78 :                 if (varSpeedCoil.MSRatedCBF(Mode) > 0.0) {
    5422           73 :                     varSpeedCoil.MSEffectiveAo(Mode) = -std::log(varSpeedCoil.MSRatedCBF(Mode)) * varSpeedCoil.MSRatedAirMassFlowRate(Mode);
    5423              :                 } else {
    5424            5 :                     varSpeedCoil.MSEffectiveAo(Mode) = 0.0;
    5425              :                 }
    5426              :             }
    5427            5 :         } else if (varSpeedCoil.VSCoilType == HVAC::CoilDX_HeatPumpWaterHeaterVariableSpeed) {
    5428            0 :             state.dataHVACGlobal->HPWHInletDBTemp = varSpeedCoil.WHRatedInletDBTemp;
    5429            0 :             state.dataHVACGlobal->HPWHInletWBTemp = varSpeedCoil.WHRatedInletWBTemp;
    5430              : 
    5431            0 :             for (Mode = 1; Mode <= varSpeedCoil.NumOfSpeeds; ++Mode) {
    5432            0 :                 varSpeedCoil.MSRatedAirMassFlowRate(Mode) = varSpeedCoil.MSRatedAirVolFlowRate(Mode) * rhoair;
    5433              :             }
    5434              : 
    5435            0 :             for (Mode = 1; Mode <= varSpeedCoil.NumOfSpeeds; ++Mode) {
    5436              :                 // get cooling capacity, without fan power, i.e. total coil cooling
    5437            0 :                 if (varSpeedCoil.CondPumpPowerInCOP) {
    5438            0 :                     HPWHCoolCapacity = varSpeedCoil.MSRatedTotCap(Mode) * (1.0 - 1.0 / varSpeedCoil.MSRatedCOP(Mode)) +
    5439            0 :                                        varSpeedCoil.MSWHPumpPower(Mode) - varSpeedCoil.MSWHPumpPower(Mode) * varSpeedCoil.HPWHCondPumpFracToWater;
    5440              :                 } else {
    5441            0 :                     HPWHCoolCapacity = varSpeedCoil.MSRatedTotCap(Mode) * (1.0 - 1.0 / varSpeedCoil.MSRatedCOP(Mode)) -
    5442            0 :                                        varSpeedCoil.MSWHPumpPower(Mode) * varSpeedCoil.HPWHCondPumpFracToWater;
    5443              :                 }
    5444              : 
    5445            0 :                 varSpeedCoil.MSRatedCBF(Mode) = DXCoils::CalcCBF(state,
    5446            0 :                                                                  varSpeedCoil.VarSpeedCoilType,
    5447            0 :                                                                  varSpeedCoil.Name,
    5448            0 :                                                                  state.dataHVACGlobal->HPWHInletDBTemp,
    5449              :                                                                  HPInletAirHumRat,
    5450              :                                                                  HPWHCoolCapacity,
    5451            0 :                                                                  varSpeedCoil.MSRatedAirVolFlowRate(Mode),
    5452            0 :                                                                  varSpeedCoil.MSRatedSHR(Mode),
    5453              :                                                                  true);
    5454            0 :                 if (varSpeedCoil.MSRatedCBF(Mode) > 0.0) {
    5455            0 :                     varSpeedCoil.MSEffectiveAo(Mode) = -std::log(varSpeedCoil.MSRatedCBF(Mode)) * varSpeedCoil.MSRatedAirMassFlowRate(Mode);
    5456              :                 } else {
    5457            0 :                     varSpeedCoil.MSEffectiveAo(Mode) = 0.0;
    5458              :                 }
    5459              :             }
    5460              : 
    5461              :             // update VarSpeedCoil(DXCoilNum).RatedCapCoolTotal
    5462            0 :             Mode = varSpeedCoil.NormSpedLevel;
    5463            0 :             if (varSpeedCoil.CondPumpPowerInCOP) {
    5464            0 :                 varSpeedCoil.RatedCapCoolTotal = varSpeedCoil.MSRatedTotCap(Mode) * (1.0 - 1.0 / varSpeedCoil.MSRatedCOP(Mode)) +
    5465            0 :                                                  varSpeedCoil.MSWHPumpPower(Mode) -
    5466            0 :                                                  varSpeedCoil.MSWHPumpPower(Mode) * varSpeedCoil.HPWHCondPumpFracToWater;
    5467              :             } else {
    5468            0 :                 varSpeedCoil.RatedCapCoolTotal = varSpeedCoil.MSRatedTotCap(Mode) * (1.0 - 1.0 / varSpeedCoil.MSRatedCOP(Mode)) -
    5469            0 :                                                  varSpeedCoil.MSWHPumpPower(Mode) * varSpeedCoil.HPWHCondPumpFracToWater;
    5470              :             }
    5471              :         }
    5472              : 
    5473              :         // size rated sensible cooling capacity
    5474           18 :         RatedCapCoolSensAutoSized = true; // always do that
    5475              : 
    5476           18 :         if (varSpeedCoil.RatedAirVolFlowRate >= HVAC::SmallAirVolFlow && (varSpeedCoil.VSCoilType == HVAC::Coil_CoolingWaterToAirHPVSEquationFit ||
    5477           16 :                                                                           varSpeedCoil.VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed)) {
    5478           13 :             RatedAirMassFlowRate =
    5479           13 :                 varSpeedCoil.RatedAirVolFlowRate *
    5480           13 :                 Psychrometrics::PsyRhoAirFnPbTdbW(state, state.dataEnvrn->StdBaroPress, RatedInletAirTemp, RatedInletAirHumRat, RoutineName);
    5481           13 :             RatedInletEnth = Psychrometrics::PsyHFnTdbW(RatedInletAirTemp, RatedInletAirHumRat);
    5482           13 :             CBFRated = DXCoils::AdjustCBF(varSpeedCoil.MSRatedCBF(NormSpeed), varSpeedCoil.MSRatedAirMassFlowRate(NormSpeed), RatedAirMassFlowRate);
    5483           13 :             if (CBFRated > 0.999) {
    5484            1 :                 CBFRated = 0.999;
    5485              :             }
    5486           13 :             if (varSpeedCoil.MSRatedAirMassFlowRate(NormSpeed) > 1.0e-10) {
    5487           12 :                 AirMassFlowRatio = RatedAirMassFlowRate / varSpeedCoil.MSRatedAirMassFlowRate(NormSpeed);
    5488              :             } else {
    5489            1 :                 AirMassFlowRatio = 1.0;
    5490              :             }
    5491              : 
    5492           13 :             if (varSpeedCoil.MSRatedWaterVolFlowRate(NormSpeed) > 1.0e-10) {
    5493            2 :                 WaterMassFlowRatio = varSpeedCoil.RatedWaterVolFlowRate / varSpeedCoil.MSRatedWaterVolFlowRate(NormSpeed);
    5494              :             } else {
    5495           11 :                 WaterMassFlowRatio = 1.0;
    5496              :             }
    5497              : 
    5498           13 :             Real64 TempInletWetBulb = RatedInletWetBulbTemp;
    5499           65 :             CalcTotCapSHR_VSWSHP(state,
    5500              :                                  RatedInletAirTemp,
    5501              :                                  RatedInletAirHumRat,
    5502              :                                  RatedInletEnth,
    5503              :                                  TempInletWetBulb,
    5504              :                                  AirMassFlowRatio,
    5505              :                                  WaterMassFlowRatio,
    5506              :                                  RatedAirMassFlowRate,
    5507              :                                  CBFRated,
    5508           13 :                                  varSpeedCoil.MSRatedTotCap(NormSpeed),
    5509           13 :                                  varSpeedCoil.MSCCapFTemp(NormSpeed),
    5510           13 :                                  varSpeedCoil.MSCCapAirFFlow(NormSpeed),
    5511           13 :                                  varSpeedCoil.MSCCapWaterFFlow(NormSpeed),
    5512              :                                  0.0,
    5513              :                                  0,
    5514              :                                  0,
    5515              :                                  0,
    5516              :                                  QLoadTotal1,
    5517              :                                  QLoadTotal2,
    5518              :                                  QLoadTotal,
    5519              :                                  SHR,
    5520              :                                  RatedSourceTempCool,
    5521           13 :                                  state.dataEnvrn->StdBaroPress,
    5522              :                                  0.0,
    5523              :                                  1,
    5524           13 :                                  varSpeedCoil.capModFacTotal);
    5525              : 
    5526           13 :             RatedCapCoolSensDes = varSpeedCoil.RatedCapCoolTotal * SHR;
    5527           18 :         } else if (varSpeedCoil.RatedAirVolFlowRate >= HVAC::SmallAirVolFlow &&
    5528            5 :                    varSpeedCoil.VSCoilType == HVAC::CoilDX_HeatPumpWaterHeaterVariableSpeed) {
    5529            0 :             SHR = varSpeedCoil.MSRatedSHR(NormSpeed);
    5530            0 :             RatedCapCoolSensDes = varSpeedCoil.RatedCapCoolTotal * SHR;
    5531              :         } else {
    5532            5 :             RatedCapCoolSensDes = 0.0;
    5533              :         }
    5534              : 
    5535           18 :         if (RatedCapCoolSensDes < HVAC::SmallLoad) {
    5536            6 :             RatedCapCoolSensDes = 0.0;
    5537              :         }
    5538              : 
    5539           18 :         if (varSpeedCoil.VSCoilType == HVAC::Coil_CoolingWaterToAirHPVSEquationFit ||
    5540           16 :             varSpeedCoil.VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed) { // always report for cooling mode
    5541           13 :             if (RatedCapCoolTotalAutoSized) {
    5542            6 :                 varSpeedCoil.RatedCapCoolSens = RatedCapCoolSensDes;
    5543           18 :                 BaseSizer::reportSizerOutput(state,
    5544           12 :                                              format("COIL:{}{}", varSpeedCoil.CoolHeatType, CurrentObjSubfix),
    5545              :                                              varSpeedCoil.Name,
    5546              :                                              "Design Size Rated Sensible Cooling Capacity [W]",
    5547              :                                              varSpeedCoil.RatedCapCoolSens);
    5548              : 
    5549              :             } else {
    5550              :                 // sensible capacity does not have an input field
    5551            7 :                 if (RatedCapCoolSensDes > 0.0) {
    5552            6 :                     varSpeedCoil.RatedCapCoolSens = RatedCapCoolSensDes;
    5553           18 :                     BaseSizer::reportSizerOutput(state,
    5554           12 :                                                  format("COIL:{}{}", varSpeedCoil.CoolHeatType, CurrentObjSubfix),
    5555              :                                                  varSpeedCoil.Name,
    5556              :                                                  "Design Size Rated Sensible Cooling Capacity [W]",
    5557              :                                                  RatedCapCoolSensDes); //, &
    5558              :                 }
    5559              :             }
    5560           26 :             OutputReportPredefined::PreDefTableEntry(
    5561           13 :                 state, state.dataOutRptPredefined->pdchCoolCoilTotCap, varSpeedCoil.Name, varSpeedCoil.RatedCapCoolTotal);
    5562           26 :             OutputReportPredefined::PreDefTableEntry(
    5563           13 :                 state, state.dataOutRptPredefined->pdchCoolCoilSensCap, varSpeedCoil.Name, varSpeedCoil.RatedCapCoolSens);
    5564           26 :             OutputReportPredefined::PreDefTableEntry(state,
    5565           13 :                                                      state.dataOutRptPredefined->pdchCoolCoilLatCap,
    5566              :                                                      varSpeedCoil.Name,
    5567           13 :                                                      varSpeedCoil.RatedCapCoolTotal - varSpeedCoil.RatedCapCoolSens);
    5568           13 :             if (varSpeedCoil.RatedCapCoolTotal != 0.0) {
    5569           24 :                 OutputReportPredefined::PreDefTableEntry(state,
    5570           12 :                                                          state.dataOutRptPredefined->pdchCoolCoilSHR,
    5571              :                                                          varSpeedCoil.Name,
    5572           12 :                                                          varSpeedCoil.RatedCapCoolSens / varSpeedCoil.RatedCapCoolTotal);
    5573              :             } else {
    5574            1 :                 OutputReportPredefined::PreDefTableEntry(state, state.dataOutRptPredefined->pdchCoolCoilSHR, varSpeedCoil.Name, 0.0);
    5575              :             }
    5576           26 :             OutputReportPredefined::PreDefTableEntry(
    5577           13 :                 state, state.dataOutRptPredefined->pdchCoolCoilNomEff, varSpeedCoil.Name, varSpeedCoil.MSRatedCOP(varSpeedCoil.NormSpedLevel));
    5578           26 :             OutputReportPredefined::addFootNoteSubTable(
    5579              :                 state,
    5580           13 :                 state.dataOutRptPredefined->pdstCoolCoil,
    5581              :                 "Nominal values are gross at rated conditions, i.e., the supply air fan heat and electric power NOT accounted for.");
    5582              :         }
    5583              : 
    5584              :         // START SIZING EVAP PRECOOLING PUMP POWER
    5585           18 :         IsAutoSize = false;
    5586           18 :         if (varSpeedCoil.VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed) {
    5587           11 :             if (varSpeedCoil.EvapCondPumpElecNomPower == DataSizing::AutoSize) {
    5588            0 :                 IsAutoSize = true;
    5589              :             }
    5590              :             //     Auto size high speed evap condenser pump power to Total Capacity * 0.004266 w/w (15 w/ton)
    5591           11 :             EvapCondPumpElecNomPowerDes = varSpeedCoil.RatedCapCoolTotal * 0.004266;
    5592           11 :             if (IsAutoSize) {
    5593            0 :                 varSpeedCoil.EvapCondPumpElecNomPower = EvapCondPumpElecNomPowerDes;
    5594            0 :                 BaseSizer::reportSizerOutput(state,
    5595              :                                              "AS VS COOLING COIL",
    5596              :                                              varSpeedCoil.Name,
    5597              :                                              "Design Size Evaporative Condenser Pump Rated Power Consumption [W]",
    5598              :                                              EvapCondPumpElecNomPowerDes);
    5599              :             } else {
    5600           11 :                 if (varSpeedCoil.EvapCondPumpElecNomPower > 0.0 && EvapCondPumpElecNomPowerDes > 0.0) {
    5601            0 :                     EvapCondPumpElecNomPowerUser = varSpeedCoil.EvapCondPumpElecNomPower;
    5602            0 :                     BaseSizer::reportSizerOutput(state,
    5603              :                                                  "AS VS COOLING COIL",
    5604              :                                                  varSpeedCoil.Name,
    5605              :                                                  "Design Size Evaporative Condenser Pump Rated Power Consumption [W]",
    5606              :                                                  EvapCondPumpElecNomPowerDes,
    5607              :                                                  "User-Specified Evaporative Condenser Pump Rated Power Consumption [W]",
    5608              :                                                  EvapCondPumpElecNomPowerUser);
    5609            0 :                     if (state.dataGlobal->DisplayExtraWarnings) {
    5610            0 :                         if ((std::abs(EvapCondPumpElecNomPowerDes - EvapCondPumpElecNomPowerUser) / EvapCondPumpElecNomPowerUser) >
    5611            0 :                             state.dataSize->AutoVsHardSizingThreshold) {
    5612            0 :                             ShowMessage(state,
    5613            0 :                                         format("SizeVarSpeedCoil: Potential issue with equipment sizing for {} {}",
    5614            0 :                                                varSpeedCoil.CoolHeatType,
    5615              :                                                CurrentObjSubfix));
    5616            0 :                             ShowContinueError(state, format("Coil Name = {}", varSpeedCoil.Name));
    5617            0 :                             ShowContinueError(state,
    5618            0 :                                               format("User-Specified Evaporative Condenser Pump Rated Power Consumption of {:.2R} [W]",
    5619              :                                                      EvapCondPumpElecNomPowerUser));
    5620            0 :                             ShowContinueError(state,
    5621            0 :                                               format("differs from Design Size Evaporative Condenser Pump Rated Power Consumption of {:.2R} [W]",
    5622              :                                                      EvapCondPumpElecNomPowerDes));
    5623            0 :                             ShowContinueError(state, "This may, or may not, indicate mismatched component sizes.");
    5624            0 :                             ShowContinueError(state, "Verify that the value entered is intended and is consistent with other components.");
    5625              :                         }
    5626              :                     }
    5627              :                 }
    5628              :             }
    5629              :         }
    5630              :         // END SIZING EVAP PRE-COOLING PUMP POWER
    5631              : 
    5632              :         // SIZE DEFROST HEATER
    5633              : 
    5634              :         // Resistive Defrost Heater Capacity = capacity at the first stage
    5635           18 :         IsAutoSize = false;
    5636           18 :         if (varSpeedCoil.VSCoilType == HVAC::Coil_HeatingAirToAirVariableSpeed) {
    5637            4 :             if (varSpeedCoil.DefrostCapacity == DataSizing::AutoSize) {
    5638            0 :                 IsAutoSize = true;
    5639              :             }
    5640            4 :             if (varSpeedCoil.DefrostStrategy == Resistive) {
    5641            4 :                 DefrostCapacityDes = varSpeedCoil.RatedCapHeat;
    5642              :             } else {
    5643            0 :                 DefrostCapacityDes = 0.0;
    5644              :             }
    5645            4 :             if (IsAutoSize) {
    5646            0 :                 varSpeedCoil.DefrostCapacity = DefrostCapacityDes;
    5647            0 :                 BaseSizer::reportSizerOutput(
    5648              :                     state, "AS VS HEATING COIL", varSpeedCoil.Name, "Design Size Resistive Defrost Heater Capacity [W]", DefrostCapacityDes);
    5649              :             } else {
    5650            4 :                 if (varSpeedCoil.DefrostCapacity > 0.0 && DefrostCapacityDes > 0.0 && !HardSizeNoDesRun) {
    5651            1 :                     DefrostCapacityUser = varSpeedCoil.DefrostCapacity;
    5652            1 :                     BaseSizer::reportSizerOutput(state,
    5653              :                                                  "AS VS HEATING COIL",
    5654              :                                                  varSpeedCoil.Name,
    5655              :                                                  "Design Size Resistive Defrost Heater Capacity [W]",
    5656              :                                                  DefrostCapacityDes,
    5657              :                                                  "User-Specified Resistive Defrost Heater Capacity [W]",
    5658              :                                                  DefrostCapacityUser);
    5659            1 :                     if (state.dataGlobal->DisplayExtraWarnings) {
    5660            0 :                         if ((std::abs(DefrostCapacityDes - DefrostCapacityUser) / DefrostCapacityUser) > state.dataSize->AutoVsHardSizingThreshold) {
    5661            0 :                             ShowMessage(state,
    5662            0 :                                         format("SizeVarSpeedCoil: Potential issue with equipment sizing for {} {}",
    5663            0 :                                                varSpeedCoil.CoolHeatType,
    5664              :                                                CurrentObjSubfix));
    5665            0 :                             ShowContinueError(state, format("Coil Name = {}", varSpeedCoil.Name));
    5666            0 :                             ShowContinueError(state, format("User-Specified Resistive Defrost Heater Capacity of {:.2R} [W]", DefrostCapacityUser));
    5667            0 :                             ShowContinueError(state,
    5668            0 :                                               format("differs from Design Size Resistive Defrost Heater Capacity of {:.2R} [W]", DefrostCapacityDes));
    5669            0 :                             ShowContinueError(state, "This may, or may not, indicate mismatched component sizes.");
    5670            0 :                             ShowContinueError(state, "Verify that the value entered is intended and is consistent with other components.");
    5671              :                         }
    5672              :                     }
    5673              :                 }
    5674              :             }
    5675              :         }
    5676              :         // END SIZING DEFROST HEATER
    5677              : 
    5678              :         // test autosized sensible and total cooling capacity for total > sensible
    5679           18 :         if (RatedCapCoolSensAutoSized && RatedCapCoolTotalAutoSized) {
    5680            6 :             if (varSpeedCoil.RatedCapCoolSens > varSpeedCoil.RatedCapCoolTotal) {
    5681            0 :                 ShowWarningError(state,
    5682            0 :                                  format("COIL:{}:WATERTOAIRHEATPUMP:VARIABLESPEEDEQUATIONFIT \"{}\"", varSpeedCoil.CoolHeatType, varSpeedCoil.Name));
    5683            0 :                 ShowContinueError(state, format("{}: Rated Sensible Cooling Capacity > Rated Total Cooling Capacity", RoutineName));
    5684            0 :                 ShowContinueError(state, "Each of these capacity inputs have been autosized.");
    5685            0 :                 ShowContinueError(state, format("Rated Sensible Cooling Capacity = {:.2T} W", varSpeedCoil.RatedCapCoolSens));
    5686            0 :                 ShowContinueError(state, format("Rated Total Cooling Capacity    = {:.2T} W", varSpeedCoil.RatedCapCoolTotal));
    5687            0 :                 ShowContinueError(state, "See eio file for further details.");
    5688            0 :                 ShowContinueError(state, "Check Total and Sensible Cooling Capacity Coefficients to ensure they are accurate.");
    5689            0 :                 ShowContinueError(state, "Check Zone and System Sizing objects to verify sizing inputs.");
    5690            0 :                 ShowContinueError(state, "Sizing statistics:");
    5691            0 :                 ShowContinueError(state, format("Entering Air Dry-Bulb Temperature = {:.3T} C", MixTemp));
    5692            0 :                 ShowContinueError(state, format("Entering Air Wet-Bulb Temperature = {:.3T} C", MixWetBulb));
    5693            0 :                 ShowContinueError(state, "Entering Condenser Water Temperature used = 24.4444 C");
    5694            0 :                 ShowContinueError(state, "Used design air and water flow rates (i.e., used 1 for ratioVL and ratioVS)");
    5695            0 :                 ShowContinueError(state, format("ratioTDB = {:.3T}", ((MixTemp + 283.15) / 273.15)));
    5696            0 :                 ShowContinueError(state, format("ratioTWB = {:.3T}", ((MixWetBulb + 283.15) / 273.15)));
    5697            0 :                 ShowContinueError(state, format("ratioTS  = {:.3T}", ((85.0 + 283.15) / 273.15)));
    5698            0 :                 ShowContinueError(state, "Rated Sensible Cooling Capacity = Rated Total Cooling Capacity * Sensible Heat Ratio");
    5699            0 :                 ShowContinueError(state, format("Total Cooling Capacity Modifier = {:.5T}", TotCapTempModFac));
    5700            0 :                 ShowContinueError(state, "...Rated Total Cooling Capacity = Total Design Load / Total Cooling Capacity Modifier");
    5701            0 :                 ShowContinueError(state, "Carefully review the Load Side Total, Sensible, and Latent heat transfer rates");
    5702            0 :                 ShowContinueError(state, "... to ensure they meet the expected manufacturers performance specifications.");
    5703              :             }
    5704           12 :         } else if (RatedCapCoolTotalAutoSized) {
    5705            0 :             if (varSpeedCoil.RatedCapCoolSens > varSpeedCoil.RatedCapCoolTotal) {
    5706            0 :                 ShowWarningError(state,
    5707            0 :                                  format("COIL:{}:WATERTOAIRHEATPUMP:VARIABLESPEEDEQUATIONFIT \"{}\"", varSpeedCoil.CoolHeatType, varSpeedCoil.Name));
    5708            0 :                 ShowContinueError(state, format("{}: Rated Sensible Cooling Capacity > Rated Total Cooling Capacity", RoutineName));
    5709            0 :                 ShowContinueError(state, "Only the rated total capacity input is autosized, consider autosizing both inputs.");
    5710            0 :                 ShowContinueError(state, format("Rated Sensible Cooling Capacity = {:.2T} W", varSpeedCoil.RatedCapCoolSens));
    5711            0 :                 ShowContinueError(state, format("Rated Total Cooling Capacity    = {:.2T} W", varSpeedCoil.RatedCapCoolTotal));
    5712            0 :                 ShowContinueError(state, "See eio file for further details.");
    5713            0 :                 ShowContinueError(state, "Check Total and Sensible Cooling Capacity Coefficients to ensure they are accurate.");
    5714            0 :                 ShowContinueError(state, "Check Zone and System Sizing objects to verify sizing inputs.");
    5715            0 :                 ShowContinueError(state, "Sizing statistics for Total Cooling Capacity:");
    5716            0 :                 ShowContinueError(state, format("Entering Air Wet-Bulb Temperature = {:.3T} C", MixWetBulb));
    5717            0 :                 ShowContinueError(state, "Entering Condenser Water Temperature used = 24.4444 C");
    5718            0 :                 ShowContinueError(state, "Used design air and water flow rates (i.e., used 1 for ratioVL and ratioVS)");
    5719            0 :                 ShowContinueError(state, format("ratioTWB = {:.3T}", ((MixWetBulb + 283.15) / 273.15)));
    5720            0 :                 ShowContinueError(state, format("ratioTS  = {:.3T}", ((85.0 + 283.15) / 273.15)));
    5721            0 :                 ShowContinueError(state, "Rated Sensible Cooling Capacity = Rated Total Cooling Capacity * Sensible Heat Ratio");
    5722            0 :                 ShowContinueError(state, "Carefully review the Load Side Total, Sensible, and Latent heat transfer rates");
    5723            0 :                 ShowContinueError(state, "... to ensure they meet the expected manufacturers performance specifications.");
    5724              :             }
    5725              :         }
    5726              : 
    5727           36 :         Array1D<DataHeatBalance::RefrigCondenserType> CondenserType;
    5728              :         StandardRatings::HPdefrostControl DefrostControl;
    5729           18 :         switch (varSpeedCoil.VSCoilType) {
    5730           11 :         case HVAC::Coil_CoolingAirToAirVariableSpeed:
    5731           11 :             CondenserType.push_back(varSpeedCoil.CondenserType);
    5732           11 :             switch (varSpeedCoil.DefrostControl) // defrost control; 1=timed, 2=on-demand
    5733              :             {
    5734            0 :             case 2:
    5735            0 :                 DefrostControl = StandardRatings::HPdefrostControl::OnDemand;
    5736            0 :                 break;
    5737           11 :             case 1:
    5738              :             default:
    5739           11 :                 DefrostControl = StandardRatings::HPdefrostControl::Timed;
    5740           11 :                 break;
    5741              :             }
    5742           11 :             if (varSpeedCoil.RatedCapCoolTotal > 0.0) {
    5743           60 :                 StandardRatings::CalcDXCoilStandardRating(state,
    5744           10 :                                                           varSpeedCoil.Name,
    5745           10 :                                                           varSpeedCoil.VarSpeedCoilType,
    5746              :                                                           varSpeedCoil.VSCoilType,
    5747              :                                                           varSpeedCoil.NumOfSpeeds,
    5748              :                                                           varSpeedCoil.MSRatedTotCap,
    5749              :                                                           varSpeedCoil.MSRatedCOP,
    5750              :                                                           varSpeedCoil.MSCCapAirFFlow,
    5751              :                                                           varSpeedCoil.MSCCapFTemp,
    5752              :                                                           varSpeedCoil.MSEIRAirFFlow,
    5753              :                                                           varSpeedCoil.MSEIRFTemp,
    5754           10 :                                                           varSpeedCoil.PLFFPLR,
    5755              :                                                           varSpeedCoil.MSRatedAirVolFlowRate,
    5756              :                                                           varSpeedCoil.MSRatedEvaporatorFanPowerPerVolumeFlowRate2017,
    5757              :                                                           varSpeedCoil.MSRatedEvaporatorFanPowerPerVolumeFlowRate2023,
    5758              :                                                           CondenserType,
    5759           20 :                                                           0, // varSpeedCoil.RegionNum, // ??
    5760           10 :                                                           varSpeedCoil.MinOATCompressor,
    5761           10 :                                                           varSpeedCoil.OATempCompressorOn,
    5762           20 :                                                           false, // varSpeedCoil.OATempCompressorOnOffBlank, // ??
    5763              :                                                           DefrostControl,
    5764           20 :                                                           ObjexxFCL::Optional_bool_const(),
    5765           10 :                                                           varSpeedCoil.RatedCapCoolTotal,
    5766           10 :                                                           varSpeedCoil.RatedAirVolFlowRate);
    5767              :             }
    5768           11 :             break;
    5769            7 :         default:
    5770            7 :             break;
    5771              :         }
    5772           18 :     }
    5773              : 
    5774        34029 :     void CalcVarSpeedCoilCooling(EnergyPlusData &state,
    5775              :                                  int const DXCoilNum,                             // Heat Pump Number
    5776              :                                  HVAC::FanOp const fanOp,                         // Fan/Compressor cycling scheme indicator
    5777              :                                  [[maybe_unused]] Real64 const SensDemand,        // Cooling Sensible Demand [W] !unused1208
    5778              :                                  [[maybe_unused]] Real64 const LatentDemand,      // Cooling Latent Demand [W]
    5779              :                                  HVAC::CompressorOp const compressorOp,           // compressor operation flag
    5780              :                                  Real64 const PartLoadRatio,                      // compressor part load ratio
    5781              :                                  [[maybe_unused]] Real64 const OnOffAirFlowRatio, // ratio of compressor on flow to average flow over time step
    5782              :                                  Real64 const SpeedRatio, // SpeedRatio varies between 1.0 (higher speed) and 0.0 (lower speed)
    5783              :                                  int const SpeedNum       // Speed number, high bound
    5784              :     )
    5785              :     {
    5786              : 
    5787              :         //       AUTHOR         Bo Shen, based on WaterToAirHeatPumpSimple:CalcHPCoolingSimple
    5788              :         //       DATE WRITTEN   March 2012
    5789              : 
    5790              :         // PURPOSE OF THIS SUBROUTINE:
    5791              :         // This subroutine is for simulating the cooling mode of the Variable-Speed Water to Air HP Simple
    5792              : 
    5793              :         // METHODOLOGY EMPLOYED:
    5794              :         // Simulate the heat pump performance using the coefficients and rated conditions, interpolating between speed levels
    5795              :         // If the LatDegradModelSimFlag is enabled, the coil will be simulated twice:
    5796              :         // (1)first simulation at the rated conditions (2) second simulation at the
    5797              :         // actual operating conditions. Then call CalcEffectiveSHR and the effective SHR
    5798              :         // is adjusted.
    5799              :         // If the LatDegradModelSimFlag is disabled, the cooling coil is only simulated
    5800              :         // once at the actual operating conditions.
    5801              :         // Finally, adjust the heat pump outlet conditions based on the PartLoadRatio
    5802              :         // and RuntimeFrac.
    5803              : 
    5804              :         // SUBROUTINE PARAMETER DEFINITIONS:
    5805              :         static constexpr std::string_view RoutineName("CalcVarSpeedCoilCooling");
    5806              :         static constexpr std::string_view RoutineNameSourceSideInletTemp("CalcVarSpeedCoilCooling:SourceSideInletTemp");
    5807        34029 :         Real64 TimeStepSysSec = state.dataHVACGlobal->TimeStepSysSec;
    5808              : 
    5809              :         // SUBROUTINE LOCAL VARIABLE DECLARATIONS:
    5810              :         Real64 Twet_Rated;  // Twet at rated conditions (coil air flow rate and air temperatures), sec
    5811              :         Real64 Gamma_Rated; // Gamma at rated conditions (coil air flow rate and air temperatures)
    5812              : 
    5813              :         Real64 SHRss;    // Sensible heat ratio at steady state
    5814              :         Real64 SHReff;   // Effective sensible heat ratio at part-load condition
    5815              :         Real64 CpSource; // Specific heat of water [J/kg_C]
    5816              :         Real64 CpAir;    // Specific heat of air [J/kg_C]
    5817              : 
    5818              :         bool LatDegradModelSimFlag;      // Latent degradation model simulation flag
    5819              :         int NumIteration;                // Iteration Counter
    5820              :         Real64 LoadSideInletDBTemp_Unit; // calc conditions for unit
    5821              :         Real64 LoadSideInletWBTemp_Unit; // calc conditions for unit
    5822              :         Real64 LoadSideInletHumRat_Unit; // calc conditions for unit
    5823              :         Real64 LoadSideInletEnth_Unit;   // calc conditions for unit
    5824              :         Real64 CpAir_Unit;               // calc conditions for unit
    5825              :         Real64 AirMassFlowRatio;         // airflow ratio at low speed
    5826              :         Real64 WaterMassFlowRatio;       // airflow ratio at high speed
    5827              :         Real64 EIRAirFFModFac;           // air flow fraction modification
    5828              :         Real64 EIRWaterFFModFac;         // water flow fraction modification
    5829              :         Real64 EIRTempModFac;            // total capacity temperature correctio fraction
    5830              :         Real64 CBFSpeed;                 // total capacity temperature correctio fraction
    5831              :         Real64 SHR;                      // total capacity temperature correctio fraction
    5832              :         Real64 EIR;                      // total capacity temperature correctio fraction
    5833              :         int MaxSpeed;                    // maximum speed level
    5834              :         int SpeedCal;                    // calculated speed level
    5835              :         Real64 AoEff;                    // effective air side surface area
    5836              :         Real64 QLoadTotal1;              // total capacity at low speed
    5837              :         Real64 QLoadTotal2;              // total capacity at high speed
    5838              :         Real64 Winput1;                  // power consumption at low speed
    5839              :         Real64 Winput2;                  // power consumption at high speed
    5840              :         Real64 QWasteHeat;               // recoverable waste heat
    5841              :         Real64 QWasteHeat1;              // recoverable waste heat at low speed
    5842              :         Real64 QWasteHeat2;              // recoverable waste heat at high speed
    5843              :         Real64 PLF;                      // part-load function
    5844              :         Real64 MaxHumRat;                // max possible humidity
    5845              :         Real64 MaxOutletEnth;            // max possible outlet enthalpy
    5846              : 
    5847              :         // ADDED VARIABLES FOR air source coil
    5848              :         Real64 CondInletTemp; // Condenser inlet temperature (C). Outdoor dry-bulb temp for air-cooled condenser.
    5849              :         // Outdoor Wetbulb +(1 - effectiveness)*(outdoor drybulb - outdoor wetbulb) for evap condenser.
    5850              :         Real64 CondInletHumRat; // Condenser inlet humidity ratio (kg/kg). Zero for air-cooled condenser.
    5851              :         // For evap condenser, its the humidity ratio of the air leaving the evap cooling pads.
    5852              :         Real64 CondAirMassFlow;    // Condenser air mass flow rate [kg/s]
    5853              :         Real64 RhoSourceAir;       // Density of air [kg/m3]
    5854              :         Real64 RhoEvapCondWater;   // Density of water used for evaporative condenser [kg/m3]
    5855              :         Real64 EvapCondEffectSped; // condenser evaporative effectiveness at the speed level
    5856              :         Real64 RhoWater;           // condensed water density
    5857              :         Real64 SpecHumIn;          // inlet air specific humidity
    5858              :         Real64 SpecHumOut;         // outlet air specific humidity
    5859        34029 :         Real64 rhoair(0);          // entering air density
    5860              : 
    5861        34029 :         if (state.dataVariableSpeedCoils->firstTime) {
    5862              :             // Set indoor air conditions to the rated condition
    5863           16 :             state.dataVariableSpeedCoils->LoadSideInletDBTemp_Init = 26.7;
    5864           16 :             state.dataVariableSpeedCoils->LoadSideInletHumRat_Init = 0.0111;
    5865           16 :             state.dataVariableSpeedCoils->LoadSideInletEnth_Init = Psychrometrics::PsyHFnTdbW(state.dataVariableSpeedCoils->LoadSideInletDBTemp_Init,
    5866           16 :                                                                                               state.dataVariableSpeedCoils->LoadSideInletHumRat_Init);
    5867           16 :             state.dataVariableSpeedCoils->CpAir_Init = Psychrometrics::PsyCpAirFnW(state.dataVariableSpeedCoils->LoadSideInletHumRat_Init);
    5868           16 :             state.dataVariableSpeedCoils->firstTime = false;
    5869              :         }
    5870              : 
    5871        68058 :         state.dataVariableSpeedCoils->LoadSideInletWBTemp_Init =
    5872        34029 :             Psychrometrics::PsyTwbFnTdbWPb(state,
    5873        34029 :                                            state.dataVariableSpeedCoils->LoadSideInletDBTemp_Init,
    5874        34029 :                                            state.dataVariableSpeedCoils->LoadSideInletHumRat_Init,
    5875        34029 :                                            state.dataEnvrn->OutBaroPress,
    5876              :                                            RoutineName);
    5877              : 
    5878        34029 :         MaxSpeed = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds;
    5879              : 
    5880              :         // must be placed inside the loop, otherwise cause bug in release mode, need to be present at two places
    5881        34029 :         if (SpeedNum > MaxSpeed) {
    5882            0 :             SpeedCal = MaxSpeed;
    5883              :         } else {
    5884        34029 :             SpeedCal = SpeedNum;
    5885              :         }
    5886              : 
    5887              :         //  LOAD LOCAL VARIABLES FROM DATA STRUCTURE (for code readability)
    5888        34029 :         if (!(fanOp == HVAC::FanOp::Continuous) && PartLoadRatio > 0.0) {
    5889        10430 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirMassFlowRate =
    5890        10430 :                 state.dataLoopNodes->Node(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirInletNodeNum).MassFlowRate / PartLoadRatio;
    5891              :         }
    5892              : 
    5893        34029 :         Twet_Rated = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Twet_Rated;
    5894        34029 :         Gamma_Rated = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Gamma_Rated;
    5895              : 
    5896        34029 :         state.dataVariableSpeedCoils->LoadSideMassFlowRate = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirMassFlowRate;
    5897              : 
    5898        34029 :         if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed) {
    5899              :             // Get condenser outdoor node info from DX COOLING Coil
    5900          388 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserInletNodeNum != 0) {
    5901            0 :                 state.dataVariableSpeedCoils->OutdoorDryBulb_CalcVarSpeedCoilCooling =
    5902            0 :                     state.dataLoopNodes->Node(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserInletNodeNum).Temp;
    5903            0 :                 state.dataVariableSpeedCoils->OutdoorHumRat_CalcVarSpeedCoilCooling =
    5904            0 :                     state.dataLoopNodes->Node(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserInletNodeNum).HumRat;
    5905            0 :                 state.dataVariableSpeedCoils->OutdoorPressure_CalcVarSpeedCoilCooling =
    5906            0 :                     state.dataLoopNodes->Node(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserInletNodeNum).Press;
    5907            0 :                 state.dataVariableSpeedCoils->OutdoorWetBulb_CalcVarSpeedCoilCooling =
    5908            0 :                     state.dataLoopNodes->Node(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserInletNodeNum).OutAirWetBulb;
    5909              :             } else {
    5910          388 :                 state.dataVariableSpeedCoils->OutdoorDryBulb_CalcVarSpeedCoilCooling = state.dataEnvrn->OutDryBulbTemp;
    5911          388 :                 state.dataVariableSpeedCoils->OutdoorHumRat_CalcVarSpeedCoilCooling = state.dataEnvrn->OutHumRat;
    5912          388 :                 state.dataVariableSpeedCoils->OutdoorPressure_CalcVarSpeedCoilCooling = state.dataEnvrn->OutBaroPress;
    5913          388 :                 state.dataVariableSpeedCoils->OutdoorWetBulb_CalcVarSpeedCoilCooling = state.dataEnvrn->OutWetBulbTemp;
    5914              :             }
    5915              : 
    5916          776 :             RhoSourceAir = Psychrometrics::PsyRhoAirFnPbTdbW(state,
    5917          388 :                                                              state.dataVariableSpeedCoils->OutdoorPressure_CalcVarSpeedCoilCooling,
    5918          388 :                                                              state.dataVariableSpeedCoils->OutdoorDryBulb_CalcVarSpeedCoilCooling,
    5919          388 :                                                              state.dataVariableSpeedCoils->OutdoorHumRat_CalcVarSpeedCoilCooling);
    5920              : 
    5921          388 :             if ((SpeedNum == 1) || (SpeedNum > MaxSpeed) || (SpeedRatio == 1.0)) {
    5922          365 :                 CondAirMassFlow = RhoSourceAir * state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapCondAirFlow(SpeedCal);
    5923              :             } else {
    5924           23 :                 CondAirMassFlow =
    5925           23 :                     RhoSourceAir * (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapCondAirFlow(SpeedCal) * SpeedRatio +
    5926           23 :                                     (1.0 - SpeedRatio) * state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapCondAirFlow(SpeedCal - 1));
    5927              :             }
    5928              : 
    5929              :             // AIR COOL OR EVAP COOLED CONDENSER
    5930          388 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserType == DataHeatBalance::RefrigCondenserType::Evap) {
    5931            0 :                 if ((SpeedNum == 1) || (SpeedNum > MaxSpeed) || (SpeedRatio == 1.0)) {
    5932            0 :                     EvapCondEffectSped = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapCondEffect(SpeedCal);
    5933              :                 } else {
    5934            0 :                     EvapCondEffectSped = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapCondEffect(SpeedCal) * SpeedRatio +
    5935            0 :                                          (1.0 - SpeedRatio) * state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapCondEffect(SpeedCal - 1);
    5936              :                 }
    5937              :                 // (Outdoor wet-bulb temp from DataEnvironment) + (1.0-EvapCondEffectiveness) * (drybulb - wetbulb)
    5938            0 :                 CondInletTemp = state.dataVariableSpeedCoils->OutdoorWetBulb_CalcVarSpeedCoilCooling +
    5939            0 :                                 (state.dataVariableSpeedCoils->OutdoorDryBulb_CalcVarSpeedCoilCooling -
    5940            0 :                                  state.dataVariableSpeedCoils->OutdoorWetBulb_CalcVarSpeedCoilCooling) *
    5941            0 :                                     (1.0 - EvapCondEffectSped);
    5942            0 :                 CondInletHumRat = Psychrometrics::PsyWFnTdbTwbPb(state,
    5943              :                                                                  CondInletTemp,
    5944            0 :                                                                  state.dataVariableSpeedCoils->OutdoorWetBulb_CalcVarSpeedCoilCooling,
    5945            0 :                                                                  state.dataVariableSpeedCoils->OutdoorPressure_CalcVarSpeedCoilCooling);
    5946            0 :                 state.dataVariableSpeedCoils->CompAmbTemp_CalcVarSpeedCoilCooling = CondInletTemp;
    5947              :             } else {                                                                                  // AIR COOLED CONDENSER
    5948          388 :                 CondInletTemp = state.dataVariableSpeedCoils->OutdoorDryBulb_CalcVarSpeedCoilCooling; // Outdoor dry-bulb temp
    5949          776 :                 state.dataVariableSpeedCoils->CompAmbTemp_CalcVarSpeedCoilCooling =
    5950          388 :                     state.dataVariableSpeedCoils->OutdoorDryBulb_CalcVarSpeedCoilCooling;
    5951          388 :                 CondInletHumRat = state.dataEnvrn->OutHumRat;
    5952              :             }
    5953              : 
    5954          388 :             state.dataVariableSpeedCoils->SourceSideMassFlowRate = CondAirMassFlow;
    5955          388 :             state.dataVariableSpeedCoils->SourceSideInletTemp = CondInletTemp;
    5956          388 :             state.dataVariableSpeedCoils->SourceSideInletEnth = Psychrometrics::PsyHFnTdbW(CondInletTemp, CondInletHumRat);
    5957          388 :             CpSource = Psychrometrics::PsyCpAirFnW(CondInletHumRat);
    5958          388 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondInletTemp = CondInletTemp;
    5959              : 
    5960              :             // If used in a heat pump, the value of MaxOAT in the heating coil overrides that in the cooling coil (in GetInput)
    5961              :             // Initialize crankcase heater, operates below OAT defined in input deck for HP DX heating coil
    5962          388 :             if (state.dataVariableSpeedCoils->OutdoorDryBulb_CalcVarSpeedCoilCooling <
    5963          388 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MaxOATCrankcaseHeater) {
    5964           44 :                 state.dataVariableSpeedCoils->CrankcaseHeatingPower_CalcVarSpeedCoilCooling =
    5965           22 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterCapacity;
    5966           22 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterCapacityCurveIndex > 0) {
    5967            1 :                     state.dataVariableSpeedCoils->CrankcaseHeatingPower_CalcVarSpeedCoilCooling *=
    5968            1 :                         Curve::CurveValue(state,
    5969            1 :                                           state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterCapacityCurveIndex,
    5970            1 :                                           state.dataEnvrn->OutDryBulbTemp);
    5971              :                 }
    5972              :             } else {
    5973          366 :                 state.dataVariableSpeedCoils->CrankcaseHeatingPower_CalcVarSpeedCoilCooling = 0.0;
    5974              :             }
    5975              :         } else {
    5976        33641 :             state.dataVariableSpeedCoils->SourceSideMassFlowRate = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterMassFlowRate;
    5977        33641 :             state.dataVariableSpeedCoils->SourceSideInletTemp = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletWaterTemp;
    5978        33641 :             state.dataVariableSpeedCoils->SourceSideInletEnth = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletWaterEnthalpy;
    5979        33641 :             CpSource = state.dataPlnt->PlantLoop(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).plantLoc.loopNum)
    5980        33641 :                            .glycol->getSpecificHeat(state, state.dataVariableSpeedCoils->SourceSideInletTemp, RoutineNameSourceSideInletTemp);
    5981              :         }
    5982              : 
    5983              :         // Check for flows, do not perform simulation if no flow in load side or source side.
    5984        34029 :         if (state.dataVariableSpeedCoils->SourceSideMassFlowRate <= 0.0 || state.dataVariableSpeedCoils->LoadSideMassFlowRate <= 0.0) {
    5985              : 
    5986        23557 :             if ((state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed) &&
    5987        23702 :                 (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserType == DataHeatBalance::RefrigCondenserType::Air) &&
    5988          145 :                 (state.dataVariableSpeedCoils->LoadSideMassFlowRate > 0.0)) {
    5989              :                 // ALLOW SIMULATION IF AIR-COOLED CONDENSER COIL
    5990           57 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SimFlag = true;
    5991              :             } else {
    5992        23500 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SimFlag = false;
    5993        23516 :                 return;
    5994              :             }
    5995              :         } else {
    5996        10472 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SimFlag = true;
    5997              :         }
    5998              : 
    5999        10529 :         if (compressorOp == HVAC::CompressorOp::Off || state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedCapCoolTotal <= 0.0) {
    6000           16 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SimFlag = false;
    6001           16 :             return;
    6002              :         }
    6003              : 
    6004        10797 :         if ((state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed) &&
    6005          284 :             (CondInletTemp < state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MinOATCompressor)) {
    6006            0 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SimFlag = false;
    6007            0 :             return;
    6008              :         }
    6009              : 
    6010              :         // Loop the calculation at least once depending whether the latent degradation model
    6011              :         // is enabled. 1st iteration to calculate the QLatent(rated) at (TDB,TWB)indoorair=(26.7C,19.4C)
    6012              :         // and 2nd iteration to calculate the  QLatent(actual)
    6013        10513 :         if ((PartLoadRatio < 1e-10) || (Twet_Rated <= 0.0) || (Gamma_Rated <= 0.0) || (SpeedNum > 1.0)) {
    6014        10502 :             LatDegradModelSimFlag = false;
    6015              :             // Set NumIteration=1 so that latent model would quit after 1 simulation with the actual condition
    6016        10502 :             NumIteration = 1;
    6017              :         } else {
    6018           11 :             LatDegradModelSimFlag = true;
    6019              :             // Set NumIteration=0 so that latent model would simulate twice with rated and actual condition
    6020           11 :             NumIteration = 0;
    6021              :         }
    6022              : 
    6023              :         // Set indoor air conditions to the actual condition
    6024        10513 :         LoadSideInletDBTemp_Unit = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirDBTemp;
    6025        10513 :         LoadSideInletHumRat_Unit = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirHumRat;
    6026              :         LoadSideInletWBTemp_Unit =
    6027        10513 :             Psychrometrics::PsyTwbFnTdbWPb(state, LoadSideInletDBTemp_Unit, LoadSideInletHumRat_Unit, state.dataEnvrn->OutBaroPress, RoutineName);
    6028        10513 :         LoadSideInletEnth_Unit = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirEnthalpy;
    6029        10513 :         CpAir_Unit = Psychrometrics::PsyCpAirFnW(LoadSideInletHumRat_Unit);
    6030              : 
    6031        10513 :         state.dataHVACGlobal->OnOffFanPartLoadFraction = 1.0;
    6032        10513 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac = 1.0;
    6033        10513 :         if ((SpeedNum == 1) && (PartLoadRatio < 1.0)) {
    6034          671 :             PLF = Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PLFFPLR, PartLoadRatio);
    6035          671 :             if (PLF < 0.7) {
    6036            0 :                 PLF = 0.7;
    6037              :             }
    6038          671 :             if (fanOp == HVAC::FanOp::Cycling) {
    6039          650 :                 state.dataHVACGlobal->OnOffFanPartLoadFraction =
    6040              :                     PLF; // save PLF for fan model, don't change fan power for constant fan mode if coil is off
    6041              :             }
    6042              :             // calculate the run time fraction
    6043          671 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac = PartLoadRatio / PLF;
    6044          671 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PartLoadRatio = PartLoadRatio;
    6045              : 
    6046          671 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac > 1.0) {
    6047            0 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac = 1.0; // Reset coil runtime fraction to 1.0
    6048          671 :             } else if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac < 0.0) {
    6049            0 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac = 0.0;
    6050              :             }
    6051              :         }
    6052              : 
    6053              :         while (true) {
    6054        10524 :             ++NumIteration;
    6055        10524 :             if (NumIteration == 1) {
    6056              :                 // Set indoor air conditions to the rated conditions
    6057           11 :                 state.dataVariableSpeedCoils->LoadSideInletDBTemp = state.dataVariableSpeedCoils->LoadSideInletDBTemp_Init;
    6058           11 :                 state.dataVariableSpeedCoils->LoadSideInletHumRat = state.dataVariableSpeedCoils->LoadSideInletHumRat_Init;
    6059           11 :                 state.dataVariableSpeedCoils->LoadSideInletWBTemp = state.dataVariableSpeedCoils->LoadSideInletWBTemp_Init;
    6060           11 :                 state.dataVariableSpeedCoils->LoadSideInletEnth = state.dataVariableSpeedCoils->LoadSideInletEnth_Init;
    6061           11 :                 CpAir = state.dataVariableSpeedCoils->CpAir_Init;
    6062              :             } else {
    6063              :                 // Set indoor air conditions to the actual condition
    6064        10513 :                 state.dataVariableSpeedCoils->LoadSideInletDBTemp = LoadSideInletDBTemp_Unit;
    6065        10513 :                 state.dataVariableSpeedCoils->LoadSideInletHumRat = LoadSideInletHumRat_Unit;
    6066        10513 :                 state.dataVariableSpeedCoils->LoadSideInletWBTemp = LoadSideInletWBTemp_Unit;
    6067        10513 :                 state.dataVariableSpeedCoils->LoadSideInletEnth = LoadSideInletEnth_Unit;
    6068        10513 :                 CpAir = CpAir_Unit;
    6069              :             }
    6070              : 
    6071              :             // must be placed inside the loop, otherwise cause bug in release mode
    6072        10524 :             if (SpeedNum > MaxSpeed) {
    6073            0 :                 SpeedCal = MaxSpeed;
    6074              :             } else {
    6075        10524 :                 SpeedCal = SpeedNum;
    6076              :             }
    6077              : 
    6078        10524 :             if ((SpeedNum == 1) || (SpeedNum > MaxSpeed) || (SpeedRatio == 1.0)) {
    6079         7158 :                 AirMassFlowRatio =
    6080         7158 :                     state.dataVariableSpeedCoils->LoadSideMassFlowRate / state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignAirMassFlowRate;
    6081              : 
    6082         7158 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed) {
    6083          272 :                     WaterMassFlowRatio = 1.0;
    6084              :                 } else {
    6085         6886 :                     WaterMassFlowRatio = state.dataVariableSpeedCoils->SourceSideMassFlowRate /
    6086         6886 :                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignWaterMassFlowRate;
    6087              :                 }
    6088              : 
    6089         7158 :                 CBFSpeed = DXCoils::AdjustCBF(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedCBF(SpeedCal),
    6090         7158 :                                               state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirMassFlowRate(SpeedCal),
    6091         7158 :                                               state.dataVariableSpeedCoils->LoadSideMassFlowRate);
    6092              : 
    6093         7158 :                 if (CBFSpeed > 0.999) {
    6094            1 :                     CBFSpeed = 0.999;
    6095              :                 }
    6096              : 
    6097         7158 :                 CalcTotCapSHR_VSWSHP(state,
    6098         7158 :                                      state.dataVariableSpeedCoils->LoadSideInletDBTemp,
    6099         7158 :                                      state.dataVariableSpeedCoils->LoadSideInletHumRat,
    6100         7158 :                                      state.dataVariableSpeedCoils->LoadSideInletEnth,
    6101         7158 :                                      state.dataVariableSpeedCoils->LoadSideInletWBTemp,
    6102              :                                      AirMassFlowRatio,
    6103              :                                      WaterMassFlowRatio,
    6104         7158 :                                      state.dataVariableSpeedCoils->LoadSideMassFlowRate,
    6105              :                                      CBFSpeed,
    6106         7158 :                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(SpeedCal),
    6107         7158 :                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(SpeedCal),
    6108         7158 :                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(SpeedCal),
    6109         7158 :                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapWaterFFlow(SpeedCal),
    6110              :                                      0.0,
    6111              :                                      0,
    6112              :                                      0,
    6113              :                                      0,
    6114              :                                      QLoadTotal1,
    6115              :                                      QLoadTotal2,
    6116         7158 :                                      state.dataVariableSpeedCoils->QLoadTotal,
    6117              :                                      SHR,
    6118         7158 :                                      state.dataVariableSpeedCoils->SourceSideInletTemp,
    6119         7158 :                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirPressure,
    6120              :                                      0.0,
    6121              :                                      1,
    6122         7158 :                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).capModFacTotal);
    6123              : 
    6124        28632 :                 EIRTempModFac = Curve::CurveValue(state,
    6125         7158 :                                                   state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(SpeedCal),
    6126         7158 :                                                   state.dataVariableSpeedCoils->LoadSideInletWBTemp,
    6127         7158 :                                                   state.dataVariableSpeedCoils->SourceSideInletTemp);
    6128              :                 EIRAirFFModFac =
    6129         7158 :                     Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(SpeedCal), AirMassFlowRatio);
    6130              : 
    6131         7158 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed) {
    6132          272 :                     EIRWaterFFModFac = 1.0;
    6133              :                 } else {
    6134              :                     EIRWaterFFModFac =
    6135         6886 :                         Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRWaterFFlow(SpeedCal), WaterMassFlowRatio);
    6136              :                 }
    6137              : 
    6138         7158 :                 EIR = (1.0 / state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedCOP(SpeedCal)) * EIRTempModFac * EIRAirFFModFac *
    6139              :                       EIRWaterFFModFac;
    6140              : 
    6141         7158 :                 CBFSpeed = DXCoils::AdjustCBF(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedCBF(SpeedCal),
    6142         7158 :                                               state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirMassFlowRate(SpeedCal),
    6143         7158 :                                               state.dataVariableSpeedCoils->LoadSideMassFlowRate);
    6144              : 
    6145         7158 :                 if (CBFSpeed > 0.999) {
    6146            1 :                     CBFSpeed = 0.999;
    6147              :                 }
    6148              : 
    6149         7158 :                 CalcTotCapSHR_VSWSHP(state,
    6150         7158 :                                      state.dataVariableSpeedCoils->LoadSideInletDBTemp,
    6151         7158 :                                      state.dataVariableSpeedCoils->LoadSideInletHumRat,
    6152         7158 :                                      state.dataVariableSpeedCoils->LoadSideInletEnth,
    6153         7158 :                                      state.dataVariableSpeedCoils->LoadSideInletWBTemp,
    6154              :                                      AirMassFlowRatio,
    6155              :                                      WaterMassFlowRatio,
    6156         7158 :                                      state.dataVariableSpeedCoils->LoadSideMassFlowRate,
    6157              :                                      CBFSpeed,
    6158         7158 :                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(SpeedCal),
    6159         7158 :                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(SpeedCal),
    6160         7158 :                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(SpeedCal),
    6161         7158 :                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapWaterFFlow(SpeedCal),
    6162              :                                      0.0,
    6163              :                                      0,
    6164              :                                      0,
    6165              :                                      0,
    6166              :                                      QLoadTotal1,
    6167              :                                      QLoadTotal2,
    6168         7158 :                                      state.dataVariableSpeedCoils->QLoadTotal,
    6169              :                                      SHR,
    6170         7158 :                                      state.dataVariableSpeedCoils->SourceSideInletTemp,
    6171         7158 :                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirPressure,
    6172              :                                      0.0,
    6173              :                                      1,
    6174         7158 :                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).capModFacTotal);
    6175              : 
    6176         7158 :                 state.dataVariableSpeedCoils->Winput = state.dataVariableSpeedCoils->QLoadTotal * EIR;
    6177              : 
    6178        14316 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed) {
    6179          272 :                     QWasteHeat = 0.0;
    6180              :                 } else {
    6181         6886 :                     QWasteHeat =
    6182         6886 :                         state.dataVariableSpeedCoils->Winput * state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWasteHeatFrac(SpeedCal);
    6183         6886 :                     QWasteHeat *= Curve::CurveValue(state,
    6184         6886 :                                                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWasteHeat(SpeedCal),
    6185         6886 :                                                     state.dataVariableSpeedCoils->LoadSideInletWBTemp,
    6186         6886 :                                                     state.dataVariableSpeedCoils->SourceSideInletTemp);
    6187              :                 }
    6188              :             } else {
    6189         3366 :                 AirMassFlowRatio =
    6190         3366 :                     state.dataVariableSpeedCoils->LoadSideMassFlowRate / state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignAirMassFlowRate;
    6191              : 
    6192         3366 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed) {
    6193           23 :                     WaterMassFlowRatio = 1.0;
    6194              :                 } else {
    6195         3343 :                     WaterMassFlowRatio = state.dataVariableSpeedCoils->SourceSideMassFlowRate /
    6196         3343 :                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignWaterMassFlowRate;
    6197              :                 }
    6198              : 
    6199         3366 :                 AoEff = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEffectiveAo(SpeedCal) * SpeedRatio +
    6200         3366 :                         (1.0 - SpeedRatio) * state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEffectiveAo(SpeedCal - 1);
    6201              : 
    6202         3366 :                 CBFSpeed = std::exp(-AoEff / state.dataVariableSpeedCoils->LoadSideMassFlowRate);
    6203              : 
    6204         3366 :                 if (CBFSpeed > 0.999) {
    6205            0 :                     CBFSpeed = 0.999;
    6206              :                 }
    6207              : 
    6208         3366 :                 CalcTotCapSHR_VSWSHP(state,
    6209         3366 :                                      state.dataVariableSpeedCoils->LoadSideInletDBTemp,
    6210         3366 :                                      state.dataVariableSpeedCoils->LoadSideInletHumRat,
    6211         3366 :                                      state.dataVariableSpeedCoils->LoadSideInletEnth,
    6212         3366 :                                      state.dataVariableSpeedCoils->LoadSideInletWBTemp,
    6213              :                                      AirMassFlowRatio,
    6214              :                                      WaterMassFlowRatio,
    6215         3366 :                                      state.dataVariableSpeedCoils->LoadSideMassFlowRate,
    6216              :                                      CBFSpeed,
    6217         3366 :                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(SpeedCal - 1),
    6218         3366 :                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(SpeedCal - 1),
    6219         3366 :                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(SpeedCal - 1),
    6220         3366 :                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapWaterFFlow(SpeedCal - 1),
    6221         3366 :                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(SpeedCal),
    6222         3366 :                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(SpeedCal),
    6223         3366 :                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(SpeedCal),
    6224         3366 :                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapWaterFFlow(SpeedCal),
    6225              :                                      QLoadTotal1,
    6226              :                                      QLoadTotal2,
    6227         3366 :                                      state.dataVariableSpeedCoils->QLoadTotal,
    6228              :                                      SHR,
    6229         3366 :                                      state.dataVariableSpeedCoils->SourceSideInletTemp,
    6230         3366 :                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirPressure,
    6231              :                                      SpeedRatio,
    6232              :                                      2,
    6233         3366 :                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).capModFacTotal);
    6234              : 
    6235         3366 :                 SpeedCal = SpeedNum - 1;
    6236        13464 :                 EIRTempModFac = Curve::CurveValue(state,
    6237         3366 :                                                   state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(SpeedCal),
    6238         3366 :                                                   state.dataVariableSpeedCoils->LoadSideInletWBTemp,
    6239         3366 :                                                   state.dataVariableSpeedCoils->SourceSideInletTemp);
    6240              :                 EIRAirFFModFac =
    6241         3366 :                     Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(SpeedCal), AirMassFlowRatio);
    6242              : 
    6243         3366 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed) {
    6244           23 :                     EIRWaterFFModFac = 1.0;
    6245              :                 } else {
    6246              :                     EIRWaterFFModFac =
    6247         3343 :                         Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRWaterFFlow(SpeedCal), WaterMassFlowRatio);
    6248              :                 }
    6249              : 
    6250         3366 :                 EIR = (1.0 / state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedCOP(SpeedCal)) * EIRTempModFac * EIRAirFFModFac *
    6251              :                       EIRWaterFFModFac;
    6252         3366 :                 Winput1 = QLoadTotal1 * EIR;
    6253              : 
    6254         3366 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed) {
    6255           23 :                     QWasteHeat1 = 0.0;
    6256              :                 } else {
    6257         3343 :                     QWasteHeat1 = Winput1 * state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWasteHeatFrac(SpeedCal);
    6258         3343 :                     QWasteHeat1 *= Curve::CurveValue(state,
    6259         3343 :                                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWasteHeat(SpeedCal),
    6260         3343 :                                                      state.dataVariableSpeedCoils->LoadSideInletWBTemp,
    6261         3343 :                                                      state.dataVariableSpeedCoils->SourceSideInletTemp);
    6262              :                 }
    6263              : 
    6264         3366 :                 SpeedCal = SpeedNum;
    6265        13464 :                 EIRTempModFac = Curve::CurveValue(state,
    6266         3366 :                                                   state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(SpeedCal),
    6267         3366 :                                                   state.dataVariableSpeedCoils->LoadSideInletWBTemp,
    6268         3366 :                                                   state.dataVariableSpeedCoils->SourceSideInletTemp);
    6269              :                 EIRAirFFModFac =
    6270         3366 :                     Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(SpeedCal), AirMassFlowRatio);
    6271              : 
    6272         3366 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed) {
    6273           23 :                     EIRWaterFFModFac = 1.0;
    6274              :                 } else {
    6275              :                     EIRWaterFFModFac =
    6276         3343 :                         Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRWaterFFlow(SpeedCal), WaterMassFlowRatio);
    6277              :                 }
    6278              : 
    6279         3366 :                 EIR = (1.0 / state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedCOP(SpeedCal)) * EIRTempModFac * EIRAirFFModFac *
    6280              :                       EIRWaterFFModFac;
    6281         3366 :                 Winput2 = QLoadTotal2 * EIR;
    6282              : 
    6283         3366 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed) {
    6284           23 :                     QWasteHeat2 = 0.0;
    6285              :                 } else {
    6286         3343 :                     QWasteHeat2 = Winput2 * state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWasteHeatFrac(SpeedCal);
    6287         3343 :                     QWasteHeat2 *= Curve::CurveValue(state,
    6288         3343 :                                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWasteHeat(SpeedCal),
    6289         3343 :                                                      state.dataVariableSpeedCoils->LoadSideInletWBTemp,
    6290         3343 :                                                      state.dataVariableSpeedCoils->SourceSideInletTemp);
    6291              :                 }
    6292              : 
    6293         3366 :                 state.dataVariableSpeedCoils->Winput = Winput2 * SpeedRatio + (1.0 - SpeedRatio) * Winput1;
    6294         3366 :                 QWasteHeat = QWasteHeat2 * SpeedRatio + (1.0 - SpeedRatio) * QWasteHeat1;
    6295              :             }
    6296              : 
    6297        10524 :             state.dataVariableSpeedCoils->QSensible = state.dataVariableSpeedCoils->QLoadTotal * SHR;
    6298              : 
    6299        10524 :             state.dataVariableSpeedCoils->QSource = state.dataVariableSpeedCoils->QLoadTotal + state.dataVariableSpeedCoils->Winput - QWasteHeat;
    6300              : 
    6301        10524 :             if (state.dataVariableSpeedCoils->QSource < 0) {
    6302            0 :                 state.dataVariableSpeedCoils->QSource = 0.0;
    6303            0 :                 QWasteHeat = state.dataVariableSpeedCoils->QLoadTotal + state.dataVariableSpeedCoils->Winput;
    6304              :             }
    6305              : 
    6306              :             // Check if the Sensible Load is greater than the Total Cooling Load
    6307        10524 :             if (state.dataVariableSpeedCoils->QSensible > state.dataVariableSpeedCoils->QLoadTotal) {
    6308            0 :                 state.dataVariableSpeedCoils->QSensible = state.dataVariableSpeedCoils->QLoadTotal;
    6309              :             }
    6310              : 
    6311        10524 :             if (LatDegradModelSimFlag) {
    6312              :                 // Calculate for SHReff using the Latent Degradation Model
    6313           22 :                 if (NumIteration == 1) {
    6314           11 :                     state.dataVariableSpeedCoils->QLatRated = state.dataVariableSpeedCoils->QLoadTotal - state.dataVariableSpeedCoils->QSensible;
    6315           11 :                 } else if (NumIteration == 2) {
    6316           11 :                     state.dataVariableSpeedCoils->QLatActual = state.dataVariableSpeedCoils->QLoadTotal - state.dataVariableSpeedCoils->QSensible;
    6317           11 :                     SHRss = state.dataVariableSpeedCoils->QSensible / state.dataVariableSpeedCoils->QLoadTotal;
    6318           66 :                     SHReff = CalcEffectiveSHR(state,
    6319              :                                               DXCoilNum,
    6320              :                                               SHRss,
    6321              :                                               fanOp,
    6322           11 :                                               state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac,
    6323           11 :                                               state.dataVariableSpeedCoils->QLatRated,
    6324           11 :                                               state.dataVariableSpeedCoils->QLatActual,
    6325           11 :                                               state.dataVariableSpeedCoils->LoadSideInletDBTemp,
    6326           11 :                                               state.dataVariableSpeedCoils->LoadSideInletWBTemp);
    6327              :                     //       Update sensible capacity based on effective SHR
    6328           11 :                     state.dataVariableSpeedCoils->QSensible = state.dataVariableSpeedCoils->QLoadTotal * SHReff;
    6329           11 :                     goto LOOP_exit;
    6330              :                 }
    6331              :             } else {
    6332              :                 // Assume SHReff=SHRss
    6333        10502 :                 SHReff = state.dataVariableSpeedCoils->QSensible / state.dataVariableSpeedCoils->QLoadTotal;
    6334        10502 :                 goto LOOP_exit;
    6335              :             }
    6336              :         }
    6337        10513 :     LOOP_exit:;
    6338              : 
    6339              :         // considering hot gas reheat here
    6340        10513 :         if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HOTGASREHEATFLG > 0) {
    6341            0 :             state.dataVariableSpeedCoils->QLoadTotal -= QWasteHeat;
    6342            0 :             state.dataVariableSpeedCoils->QSensible -= QWasteHeat;
    6343            0 :             SHReff = state.dataVariableSpeedCoils->QSensible / state.dataVariableSpeedCoils->QLoadTotal;
    6344              :         }
    6345              : 
    6346        10513 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).BasinHeaterPower = 0.0;
    6347        10513 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterPower = 0.0;
    6348              : 
    6349        10513 :         if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed) {
    6350          284 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserType == DataHeatBalance::RefrigCondenserType::Evap) {
    6351              :                 //******************
    6352              :                 //             WATER CONSUMPTION IN m3 OF WATER FOR DIRECT
    6353              :                 //             H2O [m3/s] = Delta W[kgWater/kgDryAir]*Mass Flow Air[kgDryAir/s]
    6354              :                 //                                /RhoWater [kgWater/m3]
    6355              :                 //******************
    6356            0 :                 RhoEvapCondWater = Psychrometrics::RhoH2O(state.dataVariableSpeedCoils->OutdoorDryBulb_CalcVarSpeedCoilCooling);
    6357            0 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapWaterConsumpRate =
    6358            0 :                     (CondInletHumRat - state.dataVariableSpeedCoils->OutdoorHumRat_CalcVarSpeedCoilCooling) * CondAirMassFlow / RhoEvapCondWater *
    6359            0 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac;
    6360            0 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapCondPumpElecPower =
    6361            0 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapCondPumpElecNomPower *
    6362            0 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac;
    6363              :                 // Calculate basin heater power
    6364            0 :                 CalcBasinHeaterPower(state,
    6365            0 :                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).BasinHeaterPowerFTempDiff,
    6366            0 :                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).basinHeaterSched,
    6367            0 :                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).BasinHeaterSetPointTemp,
    6368            0 :                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).BasinHeaterPower);
    6369            0 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).BasinHeaterPower *=
    6370            0 :                     (1.0 - state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac);
    6371              :             }
    6372              : 
    6373          284 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterPower =
    6374          284 :                 state.dataVariableSpeedCoils->CrankcaseHeatingPower_CalcVarSpeedCoilCooling *
    6375          284 :                 (1.0 - state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac);
    6376              : 
    6377              :             // set water system demand request (if needed)
    6378          284 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapWaterSupplyMode == WaterSupplyFromTank) {
    6379            0 :                 state.dataWaterData->WaterStorage(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapWaterSupTankID)
    6380            0 :                     .VdotRequestDemand(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapWaterTankDemandARRID) =
    6381            0 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapWaterConsumpRate;
    6382              :             }
    6383              :         }
    6384              : 
    6385        10513 :         if ((PartLoadRatio > 0.0 && fanOp == HVAC::FanOp::Continuous) || (fanOp == HVAC::FanOp::Cycling)) {
    6386              :             // calculate coil outlet state variables
    6387        21022 :             state.dataVariableSpeedCoils->LoadSideOutletEnth =
    6388        10511 :                 state.dataVariableSpeedCoils->LoadSideInletEnth -
    6389        10511 :                 state.dataVariableSpeedCoils->QLoadTotal / state.dataVariableSpeedCoils->LoadSideMassFlowRate;
    6390        21022 :             state.dataVariableSpeedCoils->LoadSideOutletDBTemp =
    6391        10511 :                 state.dataVariableSpeedCoils->LoadSideInletDBTemp -
    6392        10511 :                 state.dataVariableSpeedCoils->QSensible / (state.dataVariableSpeedCoils->LoadSideMassFlowRate * CpAir);
    6393              : 
    6394        10511 :             MaxHumRat = Psychrometrics::PsyWFnTdbRhPb(state,
    6395        10511 :                                                       state.dataVariableSpeedCoils->LoadSideOutletDBTemp,
    6396              :                                                       0.9999,
    6397        10511 :                                                       state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirPressure,
    6398              :                                                       RoutineName);
    6399        10511 :             MaxOutletEnth = Psychrometrics::PsyHFnTdbW(state.dataVariableSpeedCoils->LoadSideOutletDBTemp, MaxHumRat);
    6400        10511 :             if (state.dataVariableSpeedCoils->LoadSideOutletEnth > MaxOutletEnth) {
    6401          142 :                 state.dataVariableSpeedCoils->LoadSideOutletEnth = MaxOutletEnth;
    6402              :                 // QLoadTotal = LoadSideMassFlowRate * (LoadSideInletEnth - LoadSideOutletEnth)
    6403              :             }
    6404        10511 :             state.dataVariableSpeedCoils->LoadSideOutletHumRat = Psychrometrics::PsyWFnTdbH(
    6405        10511 :                 state, state.dataVariableSpeedCoils->LoadSideOutletDBTemp, state.dataVariableSpeedCoils->LoadSideOutletEnth, RoutineName);
    6406        10511 :             if (state.dataVariableSpeedCoils->LoadSideOutletHumRat > MaxHumRat) {
    6407           16 :                 state.dataVariableSpeedCoils->LoadSideOutletHumRat = MaxHumRat;
    6408              :             }
    6409              :         }
    6410              : 
    6411              :         // Actual outlet conditions are "average" for time step
    6412        10513 :         if (fanOp == HVAC::FanOp::Continuous) {
    6413              :             // continuous fan, cycling compressor
    6414           83 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirEnthalpy =
    6415           83 :                 PartLoadRatio * state.dataVariableSpeedCoils->LoadSideOutletEnth +
    6416           83 :                 (1.0 - PartLoadRatio) * state.dataVariableSpeedCoils->LoadSideInletEnth;
    6417           83 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirHumRat =
    6418           83 :                 PartLoadRatio * state.dataVariableSpeedCoils->LoadSideOutletHumRat +
    6419           83 :                 (1.0 - PartLoadRatio) * state.dataVariableSpeedCoils->LoadSideInletHumRat;
    6420           83 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirDBTemp =
    6421           83 :                 Psychrometrics::PsyTdbFnHW(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirEnthalpy,
    6422           83 :                                            state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirHumRat);
    6423           83 :             state.dataVariableSpeedCoils->PLRCorrLoadSideMdot = state.dataVariableSpeedCoils->LoadSideMassFlowRate;
    6424              :         } else {
    6425              :             // default to cycling fan, cycling compressor
    6426        10430 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirEnthalpy = state.dataVariableSpeedCoils->LoadSideOutletEnth;
    6427        10430 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirHumRat = state.dataVariableSpeedCoils->LoadSideOutletHumRat;
    6428        10430 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirDBTemp = state.dataVariableSpeedCoils->LoadSideOutletDBTemp;
    6429        10430 :             state.dataVariableSpeedCoils->PLRCorrLoadSideMdot = state.dataVariableSpeedCoils->LoadSideMassFlowRate * PartLoadRatio;
    6430              :         }
    6431              : 
    6432              :         // scale heat transfer rates to PLR and power to RTF
    6433        10513 :         state.dataVariableSpeedCoils->QLoadTotal *= PartLoadRatio;
    6434        10513 :         state.dataVariableSpeedCoils->QSensible *= PartLoadRatio;
    6435              :         // count the powr separately
    6436        10513 :         state.dataVariableSpeedCoils->Winput *= state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac;
    6437        10513 :         state.dataVariableSpeedCoils->QSource *= PartLoadRatio;
    6438        10513 :         QWasteHeat *= PartLoadRatio;
    6439              : 
    6440              :         // Update heat pump data structure
    6441        10513 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Power = state.dataVariableSpeedCoils->Winput;
    6442        10513 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QLoadTotal = state.dataVariableSpeedCoils->QLoadTotal;
    6443        10513 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QSensible = state.dataVariableSpeedCoils->QSensible;
    6444        10513 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QLatent =
    6445        10513 :             state.dataVariableSpeedCoils->QLoadTotal - state.dataVariableSpeedCoils->QSensible;
    6446        10513 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Energy = state.dataVariableSpeedCoils->Winput * TimeStepSysSec;
    6447        10513 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergyLoadTotal = state.dataVariableSpeedCoils->QLoadTotal * TimeStepSysSec;
    6448        10513 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergySensible = state.dataVariableSpeedCoils->QSensible * TimeStepSysSec;
    6449        10513 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergyLatent =
    6450        10513 :             (state.dataVariableSpeedCoils->QLoadTotal - state.dataVariableSpeedCoils->QSensible) * TimeStepSysSec;
    6451        10513 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterConsumption =
    6452        10513 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterPower * TimeStepSysSec;
    6453        10513 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapWaterConsump =
    6454        10513 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapWaterConsumpRate * TimeStepSysSec;
    6455        10513 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).BasinHeaterConsumption =
    6456        10513 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).BasinHeaterPower * TimeStepSysSec;
    6457        10513 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapCondPumpElecConsumption =
    6458        10513 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapCondPumpElecPower * TimeStepSysSec;
    6459        10513 :         if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac == 0.0) {
    6460            2 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).COP = 0.0;
    6461              :         } else {
    6462        10511 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).COP =
    6463        10511 :                 state.dataVariableSpeedCoils->QLoadTotal / state.dataVariableSpeedCoils->Winput;
    6464              :         }
    6465        10513 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PartLoadRatio = PartLoadRatio;
    6466        10513 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirMassFlowRate = state.dataVariableSpeedCoils->PLRCorrLoadSideMdot;
    6467        10513 :         rhoair = Psychrometrics::PsyRhoAirFnPbTdbW(state,
    6468        10513 :                                                    state.dataEnvrn->OutBaroPress,
    6469        10513 :                                                    state.dataVariableSpeedCoils->LoadSideInletDBTemp,
    6470        10513 :                                                    state.dataVariableSpeedCoils->LoadSideInletHumRat,
    6471              :                                                    RoutineName);
    6472              :         // This seems wrong, initializing mass flow rate to StdRhoAir or actual air density,
    6473              :         // then using that mass flow rate, then back calculating volume using inlet conditions.
    6474              :         // Volume should be constant through a fan and air mass flow rate should vary based on inlet conditions.
    6475        10513 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirVolFlowRate =
    6476        10513 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirMassFlowRate / rhoair;
    6477              : 
    6478        10513 :         if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed) {
    6479          284 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterMassFlowRate = 0.0;
    6480          284 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletWaterTemp = 0.0;
    6481          284 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletWaterEnthalpy = 0.0;
    6482          284 :             state.dataHeatBal->HeatReclaimVS_Coil(DXCoilNum).AvailCapacity = state.dataVariableSpeedCoils->QSource;
    6483          284 :             if (state.dataHeatBal->HeatReclaimVS_Coil(DXCoilNum).WaterHeatingDesuperheaterReclaimedHeatTotal > 0.0) {
    6484            0 :                 state.dataVariableSpeedCoils->QSource -= state.dataHeatBal->HeatReclaimVS_Coil(DXCoilNum).WaterHeatingDesuperheaterReclaimedHeatTotal;
    6485              :             }
    6486              :         } else {
    6487        10229 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterMassFlowRate = state.dataVariableSpeedCoils->SourceSideMassFlowRate;
    6488        10229 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletWaterTemp =
    6489        10229 :                 state.dataVariableSpeedCoils->SourceSideInletTemp +
    6490        10229 :                 state.dataVariableSpeedCoils->QSource / (state.dataVariableSpeedCoils->SourceSideMassFlowRate * CpSource);
    6491        10229 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletWaterEnthalpy =
    6492        10229 :                 state.dataVariableSpeedCoils->SourceSideInletEnth +
    6493        10229 :                 state.dataVariableSpeedCoils->QSource / state.dataVariableSpeedCoils->SourceSideMassFlowRate;
    6494        10229 :             state.dataHeatBal->HeatReclaimVS_Coil(DXCoilNum).AvailCapacity = state.dataVariableSpeedCoils->QSource;
    6495        10229 :             if (state.dataHeatBal->HeatReclaimVS_Coil(DXCoilNum).WaterHeatingDesuperheaterReclaimedHeatTotal > 0.0) {
    6496            1 :                 state.dataVariableSpeedCoils->QSource -= state.dataHeatBal->HeatReclaimVS_Coil(DXCoilNum).WaterHeatingDesuperheaterReclaimedHeatTotal;
    6497              :             }
    6498              :         }
    6499        10513 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QSource = state.dataVariableSpeedCoils->QSource;
    6500        10513 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergySource = state.dataVariableSpeedCoils->QSource * TimeStepSysSec;
    6501              : 
    6502        10513 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QWasteHeat = QWasteHeat;
    6503              : 
    6504        10513 :         if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondensateCollectMode == CondensateToTank) {
    6505              :             // calculate and report condensation rates  (how much water extracted from the air stream)
    6506              :             // water flow of water in m3/s for water system interactions
    6507            0 :             RhoWater = Psychrometrics::RhoH2O((state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirDBTemp +
    6508            0 :                                                state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirDBTemp) /
    6509              :                                               2.0);
    6510              :             //     CR9155 Remove specific humidity calculations
    6511            0 :             SpecHumIn = state.dataVariableSpeedCoils->LoadSideInletHumRat;
    6512            0 :             SpecHumOut = state.dataVariableSpeedCoils->LoadSideOutletHumRat;
    6513              :             //  mdot * del HumRat / rho water
    6514            0 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondensateVdot =
    6515            0 :                 max(0.0, (state.dataVariableSpeedCoils->LoadSideMassFlowRate * (SpecHumIn - SpecHumOut) / RhoWater));
    6516            0 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondensateVol =
    6517            0 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondensateVdot * TimeStepSysSec;
    6518              :         }
    6519              :     }
    6520              : 
    6521            0 :     void CalcVarSpeedHPWH(EnergyPlusData &state,
    6522              :                           int const DXCoilNum,        // the number of the DX coil to be simulated
    6523              :                           Real64 const PartLoadRatio, // sensible water heating load / full load sensible water heating capacity
    6524              :                           Real64 const SpeedRatio,    // SpeedRatio varies between 1.0 (higher speed) and 0.0 (lower speed)
    6525              :                           int const SpeedNum,         // Speed number, high bound
    6526              :                           HVAC::FanOp const fanOp     // Continuous fan OR cycling compressor
    6527              :     )
    6528              :     {
    6529              : 
    6530              :         // SUBROUTINE INFORMATION:
    6531              :         //       AUTHOR         Bo Shen, ORNL
    6532              :         //       DATE WRITTEN   12/2014
    6533              : 
    6534              :         // PURPOSE OF THIS SUBROUTINE:
    6535              :         // Calculates the gross cooling capacity of a variable-speed heat pump water heater evaporator and
    6536              :         // heating capacity of the condenser coil given the rated heating capacity and COP.
    6537              : 
    6538              :         // METHODOLOGY EMPLOYED:
    6539              :         // The routine requires the user to enter the total heating capacity and COP for the
    6540              :         // heat pump water heater along with logicals defining if fan and condenser pump are included at numerous speed levels.
    6541              :         // Since manufacturer's can rate their HPWH equipment with or without including condenser
    6542              :         // pump heat, this information is required to accurately determine the condenser's leaving
    6543              :         // water temperature. In addition, knowledge of the fan heat is required to back into
    6544              :         // a compressor COP.
    6545              : 
    6546              :         // SUBROUTINE PARAMETER DEFINITIONS:
    6547              :         static constexpr std::string_view RoutineName("CalcVarSpeedHPWH");
    6548            0 :         Real64 TimeStepSysSec = state.dataHVACGlobal->TimeStepSysSec;
    6549              : 
    6550              :         // SUBROUTINE LOCAL VARIABLE DECLARATIONS:
    6551              :         Real64 OperatingHeatingCapacity; // Water heating operating capacity including the impact of capacity and COP curves (W)
    6552              :         Real64 OperatingHeatingCOP;      // Water heating operating COP including the impact of capacity and COP curves (W/W)
    6553              :         Real64 OperatingHeatingPower;    // Water heating operating Power (W)
    6554              :         Real64 CompressorPower;          // Power consumed by compressor only (W)
    6555              : 
    6556              :         Real64 TotalTankHeatingCapacity; // Water heating capacity corrected for condenser water pump heat (W)
    6557              :         Real64 TankHeatingCOP;           // Water heating COP corrected for fan and condenser water pump power (W/W)
    6558              :         // (these previous 2 variables also include the impact of capacity and COP curves)
    6559              :         Real64 EvapCoolingCapacity;   // Air cooling capacity corrected for evap fan and cond water pump heat (W)
    6560              :         Real64 InletWaterTemp;        // Condenser water inlet temperature (C)
    6561              :         Real64 OutletWaterTemp;       // Condenser water outlet temperature (C)
    6562              :         Real64 EvapInletMassFlowRate; // Evaporator air inlet mass flow rate (m3/s)
    6563              :         Real64 CondInletMassFlowRate; // Condenser water inlet mass flow rate (m3/s)
    6564              :         Real64 CpWater;               // Specific heat of condenser inlet water (J/Kg/k)
    6565              :         Real64 InletAirTemp;          // HPWH inlet air temperature (dry-bulb or wet-bulb) (C)
    6566              :         Real64 AirMassFlowRatio;      // Ratio of evaporator inlet air mass flow rate to rated mass flow rate
    6567              :         Real64 WaterMassFlowRatio;    // Ratio of evaporator inlet water mass flow rate to rated mass flow rate
    6568              :         Real64 PumpHeatToWater;       // Amount of pump heat attributed to heating water
    6569              :         Real64 PLF;                   // part-load function
    6570              :         Real64 CBFSpeed;              // bypass factor as individual speed level
    6571              :         Real64 COPAirFFModFac;        // air flow fraction modification
    6572              :         Real64 COPWaterFFModFac;      // water flow fraction modification
    6573              :         Real64 COPTempModFac;         // total capacity temperature correctio fraction
    6574              :         Real64 TOTCAPAirFFModFac;     // air flow fraction modification
    6575              :         Real64 TOTCAPWaterFFModFac;   // water flow fraction modification
    6576              :         Real64 TOTCAPTempModFac;      // total capacity temperature correctio fraction
    6577              :         Real64 SHR;                   // total capacity temperature correctio fraction
    6578              :         Real64 COP;                   // total capacity temperature correctio fraction
    6579              :         Real64 AoEff;                 // effective air side surface area
    6580              :         Real64 Winput1;               // power consumption at low speed
    6581              :         Real64 Winput2;               // power consumption at high speed
    6582              :         Real64 LoadPressure;          // evaporator inlet pressure
    6583              :         Real64 hDelta;                // Change in air enthalpy across the cooling coil [J/kg]
    6584              :         Real64 hADP;                  // Apparatus dew point enthalpy [J/kg]
    6585              :         Real64 tADP;                  // Apparatus dew point temperature [C]
    6586              :         Real64 wADP;                  // Apparatus dew point humidity ratio [kg/kg]
    6587              :         Real64 hTinwADP;              // Enthalpy at inlet dry-bulb and wADP [J/kg]
    6588              :         Real64 WHCAP1;                // total heating capacity at low speed [W]
    6589              :         Real64 WHCAP2;                // total heating capacity at high speed [W]
    6590              :         Real64 CpAir;                 // Specific heat of air [J/kg_C]
    6591              :         Real64 MaxHumRat;             // max possible humidity
    6592              :         Real64 MaxOutletEnth;         // max possible outlet enthalpy
    6593              :         int EvapInletNode;            // Evaporator air inlet node number
    6594              :         int SpeedCal;                 // calculated speed level
    6595            0 :         Real64 rhoair = 0.0;          // entering air density
    6596            0 :         Real64 RhoWater = 0.0;        // water density
    6597              : 
    6598              :         // note: load side is the evaporator side, and source side is the condenser side
    6599              : 
    6600            0 :         int CondInletNode = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterInletNodeNum;
    6601            0 :         int CondOutletNode = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterOutletNodeNum;
    6602              :         // If heat pump water heater is OFF, set outlet to inlet and RETURN
    6603            0 :         if (PartLoadRatio == 0.0) {
    6604            0 :             state.dataLoopNodes->Node(CondOutletNode) = state.dataLoopNodes->Node(CondInletNode);
    6605            0 :             return;
    6606              :         } else {
    6607            0 :             EvapInletNode = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirInletNodeNum;
    6608            0 :             InletWaterTemp = state.dataLoopNodes->Node(CondInletNode).Temp;
    6609            0 :             CondInletMassFlowRate = state.dataLoopNodes->Node(CondInletNode).MassFlowRate;
    6610            0 :             EvapInletMassFlowRate = state.dataLoopNodes->Node(EvapInletNode).MassFlowRate;
    6611            0 :             CpWater = Psychrometrics::CPHW(InletWaterTemp);
    6612            0 :             CompressorPower = 0.0;
    6613            0 :             OperatingHeatingPower = 0.0;
    6614            0 :             TankHeatingCOP = 0.0;
    6615              :         }
    6616              : 
    6617              :         //  LOAD LOCAL VARIABLES FROM DATA STRUCTURE (for code readability)
    6618            0 :         if (!(fanOp == HVAC::FanOp::Continuous) && PartLoadRatio > 0.0) {
    6619            0 :             CondInletMassFlowRate = CondInletMassFlowRate / PartLoadRatio;
    6620            0 :             EvapInletMassFlowRate = EvapInletMassFlowRate / PartLoadRatio;
    6621              :         }
    6622              : 
    6623            0 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirMassFlowRate = EvapInletMassFlowRate;
    6624            0 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterMassFlowRate = CondInletMassFlowRate;
    6625              : 
    6626              :         // determine inlet air temperature type for curve objects
    6627            0 :         if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirTemperatureType == HVAC::OATType::WetBulb) {
    6628            0 :             InletAirTemp = state.dataHVACGlobal->HPWHInletWBTemp;
    6629              :         } else {
    6630            0 :             InletAirTemp = state.dataHVACGlobal->HPWHInletDBTemp;
    6631              :         }
    6632              : 
    6633              :         // check if indoor evaporator or outdoor evaporator
    6634            0 :         Real64 CrankcaseHeatingPower = 0.0;
    6635            0 :         if (EvapInletNode != 0) {
    6636            0 :             state.dataVariableSpeedCoils->LoadSideInletDBTemp = state.dataLoopNodes->Node(EvapInletNode).Temp;
    6637            0 :             state.dataVariableSpeedCoils->LoadSideInletHumRat = state.dataLoopNodes->Node(EvapInletNode).HumRat;
    6638            0 :             LoadPressure = state.dataLoopNodes->Node(EvapInletNode).Press;
    6639              :             // prevent the air pressure not given
    6640            0 :             if (LoadPressure < 10.0) {
    6641            0 :                 LoadPressure = state.dataEnvrn->OutBaroPress;
    6642              :             }
    6643              : 
    6644            0 :             state.dataVariableSpeedCoils->LoadSideInletWBTemp = state.dataLoopNodes->Node(EvapInletNode).OutAirWetBulb;
    6645            0 :             state.dataVariableSpeedCoils->LoadSideInletEnth = state.dataLoopNodes->Node(EvapInletNode).Enthalpy;
    6646              :         } else {
    6647            0 :             state.dataVariableSpeedCoils->LoadSideInletDBTemp = state.dataEnvrn->OutDryBulbTemp;
    6648            0 :             state.dataVariableSpeedCoils->LoadSideInletHumRat = state.dataEnvrn->OutHumRat;
    6649            0 :             LoadPressure = state.dataEnvrn->OutBaroPress;
    6650            0 :             state.dataVariableSpeedCoils->LoadSideInletWBTemp = state.dataEnvrn->OutWetBulbTemp;
    6651            0 :             state.dataVariableSpeedCoils->LoadSideInletEnth = state.dataEnvrn->OutEnthalpy;
    6652              : 
    6653              :             // Initialize crankcase heater, operates below OAT defined in input deck for HP DX heating coil
    6654            0 :             if (state.dataEnvrn->OutDryBulbTemp < state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MaxOATCrankcaseHeater) {
    6655            0 :                 CrankcaseHeatingPower = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterCapacity;
    6656            0 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterCapacityCurveIndex > 0) {
    6657            0 :                     CrankcaseHeatingPower *=
    6658            0 :                         Curve::CurveValue(state,
    6659            0 :                                           state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterCapacityCurveIndex,
    6660            0 :                                           state.dataEnvrn->OutDryBulbTemp);
    6661              :                 }
    6662              :             };
    6663              :         }
    6664              : 
    6665            0 :         state.dataVariableSpeedCoils->LoadSideMassFlowRate = EvapInletMassFlowRate;
    6666            0 :         state.dataVariableSpeedCoils->SourceSideMassFlowRate = CondInletMassFlowRate;
    6667            0 :         state.dataVariableSpeedCoils->SourceSideInletTemp = InletWaterTemp;
    6668            0 :         state.dataVariableSpeedCoils->SourceSideInletEnth = state.dataLoopNodes->Node(CondInletNode).Enthalpy;
    6669            0 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletWaterEnthalpy = state.dataVariableSpeedCoils->SourceSideInletEnth;
    6670              : 
    6671              :         // Check for flows, do not perform simulation if no flow in load side or source side.
    6672            0 :         if ((state.dataVariableSpeedCoils->SourceSideMassFlowRate <= 0.0) || (state.dataVariableSpeedCoils->LoadSideMassFlowRate <= 0.0)) {
    6673            0 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SimFlag = false;
    6674            0 :             return;
    6675              :         } else {
    6676            0 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SimFlag = true;
    6677              :         }
    6678              : 
    6679              :         // part-load calculation
    6680            0 :         state.dataHVACGlobal->OnOffFanPartLoadFraction = 1.0;
    6681            0 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac = 1.0;
    6682            0 :         if ((SpeedNum == 1) && (PartLoadRatio < 1.0)) {
    6683            0 :             PLF = Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PLFFPLR, PartLoadRatio);
    6684            0 :             if (PLF < 0.7) {
    6685            0 :                 PLF = 0.7;
    6686              :             }
    6687            0 :             if (fanOp == HVAC::FanOp::Cycling) {
    6688            0 :                 state.dataHVACGlobal->OnOffFanPartLoadFraction =
    6689              :                     PLF; // save PLF for fan model, don't change fan power for constant fan mode if coil is off
    6690              :             }
    6691              :             // calculate the run time fraction
    6692            0 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac = PartLoadRatio / PLF;
    6693            0 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PartLoadRatio = PartLoadRatio;
    6694              : 
    6695            0 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac > 1.0) {
    6696            0 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac = 1.0; // Reset coil runtime fraction to 1.0
    6697            0 :             } else if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac < 0.0) {
    6698            0 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac = 0.0;
    6699              :             }
    6700              :         }
    6701              : 
    6702            0 :         int MaxSpeed = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds;
    6703              : 
    6704              :         // interpolate between speeds
    6705              :         // must be placed inside the loop, otherwise cause bug in release mode
    6706            0 :         if (SpeedNum > MaxSpeed) {
    6707            0 :             SpeedCal = MaxSpeed;
    6708              :         } else {
    6709            0 :             SpeedCal = SpeedNum;
    6710              :         }
    6711              : 
    6712            0 :         Real64 locFanElecPower = 0.0; // local for fan electric power
    6713            0 :         if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SupplyFanIndex > 0) {
    6714            0 :             locFanElecPower = state.dataFans->fans(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SupplyFanIndex)->totalPower;
    6715              :         }
    6716            0 :         if ((SpeedNum == 1) || (SpeedNum > MaxSpeed) || (SpeedRatio == 1.0)) {
    6717            0 :             AirMassFlowRatio =
    6718            0 :                 state.dataVariableSpeedCoils->LoadSideMassFlowRate / state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignAirMassFlowRate;
    6719            0 :             WaterMassFlowRatio =
    6720            0 :                 state.dataVariableSpeedCoils->SourceSideMassFlowRate / state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignWaterMassFlowRate;
    6721            0 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpElecNomPower =
    6722            0 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWHPumpPower(SpeedCal);
    6723              : 
    6724            0 :             COPTempModFac = Curve::CurveValue(state,
    6725            0 :                                               state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(SpeedCal),
    6726              :                                               InletAirTemp,
    6727            0 :                                               state.dataVariableSpeedCoils->SourceSideInletTemp);
    6728              :             COPAirFFModFac =
    6729            0 :                 Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(SpeedCal), AirMassFlowRatio);
    6730              :             COPWaterFFModFac =
    6731            0 :                 Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRWaterFFlow(SpeedCal), WaterMassFlowRatio);
    6732              : 
    6733            0 :             COP = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedCOP(SpeedCal) * COPTempModFac * COPAirFFModFac * COPWaterFFModFac;
    6734              : 
    6735            0 :             TOTCAPTempModFac = Curve::CurveValue(state,
    6736            0 :                                                  state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(SpeedCal),
    6737              :                                                  InletAirTemp,
    6738            0 :                                                  state.dataVariableSpeedCoils->SourceSideInletTemp);
    6739              :             //   Get capacity modifying factor (function of mass flow) for off-rated conditions
    6740              :             TOTCAPAirFFModFac =
    6741            0 :                 Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(SpeedCal), AirMassFlowRatio);
    6742              :             // Get capacity modifying factor (function of mass flow) for off-rated conditions
    6743              :             TOTCAPWaterFFModFac =
    6744            0 :                 Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapWaterFFlow(SpeedCal), WaterMassFlowRatio);
    6745              : 
    6746            0 :             OperatingHeatingCapacity = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(SpeedCal) * TOTCAPTempModFac *
    6747              :                                        TOTCAPAirFFModFac * TOTCAPWaterFFModFac;
    6748              : 
    6749            0 :             state.dataVariableSpeedCoils->Winput = OperatingHeatingCapacity / COP;
    6750            0 :             OperatingHeatingPower = state.dataVariableSpeedCoils->Winput;
    6751              : 
    6752            0 :             OperatingHeatingCOP = COP;
    6753            0 :             PumpHeatToWater = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpElecNomPower *
    6754            0 :                               state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpFracToWater;
    6755            0 :             TankHeatingCOP = OperatingHeatingCOP;
    6756              : 
    6757              :             // account for pump heat if not included in total water heating capacity
    6758            0 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondPumpHeatInCapacity) {
    6759            0 :                 TotalTankHeatingCapacity = OperatingHeatingCapacity;
    6760              :             } else {
    6761            0 :                 TotalTankHeatingCapacity = OperatingHeatingCapacity + PumpHeatToWater;
    6762              :             }
    6763              : 
    6764              :             // calculate evaporator total cooling capacity
    6765            0 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).FanPowerIncludedInCOP) {
    6766            0 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondPumpPowerInCOP) {
    6767              :                     //       make sure fan power is full load fan power, it isn't though,
    6768            0 :                     CompressorPower = OperatingHeatingPower - locFanElecPower / state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac -
    6769            0 :                                       state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpElecNomPower;
    6770            0 :                     if (OperatingHeatingPower > 0.0) {
    6771            0 :                         TankHeatingCOP = TotalTankHeatingCapacity / OperatingHeatingPower;
    6772              :                     }
    6773              :                 } else {
    6774            0 :                     CompressorPower = OperatingHeatingPower - locFanElecPower / state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac;
    6775            0 :                     if ((OperatingHeatingPower + state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpElecNomPower) > 0.0) {
    6776            0 :                         TankHeatingCOP = TotalTankHeatingCapacity /
    6777            0 :                                          (OperatingHeatingPower + state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpElecNomPower);
    6778              :                     }
    6779              :                 }
    6780              :             } else {
    6781            0 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondPumpPowerInCOP) {
    6782              :                     //       make sure fan power is full load fan power
    6783            0 :                     CompressorPower = OperatingHeatingPower - state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpElecNomPower;
    6784            0 :                     if ((OperatingHeatingPower + locFanElecPower / state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac) > 0.0) {
    6785            0 :                         TankHeatingCOP = TotalTankHeatingCapacity /
    6786            0 :                                          (OperatingHeatingPower + locFanElecPower / state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac);
    6787              :                     }
    6788              :                 } else {
    6789            0 :                     CompressorPower = OperatingHeatingPower;
    6790            0 :                     if ((OperatingHeatingPower + locFanElecPower / state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac +
    6791            0 :                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpElecNomPower) > 0.0) {
    6792            0 :                         TankHeatingCOP = TotalTankHeatingCapacity /
    6793            0 :                                          (OperatingHeatingPower + locFanElecPower / state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac +
    6794            0 :                                           state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpElecNomPower);
    6795              :                     }
    6796              :                 }
    6797              :             }
    6798              : 
    6799            0 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondPumpHeatInCapacity) {
    6800            0 :                 EvapCoolingCapacity = TotalTankHeatingCapacity - PumpHeatToWater - CompressorPower;
    6801              :             } else {
    6802            0 :                 EvapCoolingCapacity = TotalTankHeatingCapacity - CompressorPower;
    6803              :             }
    6804              : 
    6805            0 :             CBFSpeed = DXCoils::AdjustCBF(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedCBF(SpeedCal),
    6806            0 :                                           state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirMassFlowRate(SpeedCal),
    6807            0 :                                           state.dataVariableSpeedCoils->LoadSideMassFlowRate);
    6808              : 
    6809              :         } else {
    6810            0 :             AirMassFlowRatio =
    6811            0 :                 state.dataVariableSpeedCoils->LoadSideMassFlowRate / state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignAirMassFlowRate;
    6812            0 :             WaterMassFlowRatio =
    6813            0 :                 state.dataVariableSpeedCoils->SourceSideMassFlowRate / state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignWaterMassFlowRate;
    6814            0 :             AoEff = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEffectiveAo(SpeedCal) * SpeedRatio +
    6815            0 :                     (1.0 - SpeedRatio) * state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEffectiveAo(SpeedCal - 1);
    6816            0 :             CBFSpeed = std::exp(-AoEff / state.dataVariableSpeedCoils->LoadSideMassFlowRate);
    6817              : 
    6818              :             // calculate low speed
    6819            0 :             SpeedCal = SpeedNum - 1;
    6820              : 
    6821            0 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpElecNomPower =
    6822            0 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWHPumpPower(SpeedCal);
    6823            0 :             COPTempModFac = Curve::CurveValue(state,
    6824            0 :                                               state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(SpeedCal),
    6825              :                                               InletAirTemp,
    6826            0 :                                               state.dataVariableSpeedCoils->SourceSideInletTemp);
    6827              :             COPAirFFModFac =
    6828            0 :                 Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(SpeedCal), AirMassFlowRatio);
    6829              :             COPWaterFFModFac =
    6830            0 :                 Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRWaterFFlow(SpeedCal), WaterMassFlowRatio);
    6831              : 
    6832            0 :             COP = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedCOP(SpeedCal) * COPTempModFac * COPAirFFModFac * COPWaterFFModFac;
    6833              : 
    6834            0 :             TOTCAPTempModFac = Curve::CurveValue(state,
    6835            0 :                                                  state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(SpeedCal),
    6836              :                                                  InletAirTemp,
    6837            0 :                                                  state.dataVariableSpeedCoils->SourceSideInletTemp);
    6838              :             //   Get capacity modifying factor (function of mass flow) for off-rated conditions
    6839              :             TOTCAPAirFFModFac =
    6840            0 :                 Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(SpeedCal), AirMassFlowRatio);
    6841              :             // Get capacity modifying factor (function of mass flow) for off-rated conditions
    6842              :             TOTCAPWaterFFModFac =
    6843            0 :                 Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapWaterFFlow(SpeedCal), WaterMassFlowRatio);
    6844              : 
    6845            0 :             OperatingHeatingCapacity = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(SpeedCal) * TOTCAPTempModFac *
    6846              :                                        TOTCAPAirFFModFac * TOTCAPWaterFFModFac;
    6847              : 
    6848            0 :             state.dataVariableSpeedCoils->Winput = OperatingHeatingCapacity / COP;
    6849            0 :             Winput1 = state.dataVariableSpeedCoils->Winput;
    6850            0 :             WHCAP1 = OperatingHeatingCapacity;
    6851              : 
    6852              :             // calculate upper speed
    6853            0 :             SpeedCal = SpeedNum;
    6854              : 
    6855            0 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpElecNomPower =
    6856            0 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWHPumpPower(SpeedCal);
    6857            0 :             COPTempModFac = Curve::CurveValue(state,
    6858            0 :                                               state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(SpeedCal),
    6859              :                                               InletAirTemp,
    6860            0 :                                               state.dataVariableSpeedCoils->SourceSideInletTemp);
    6861              :             COPAirFFModFac =
    6862            0 :                 Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(SpeedCal), AirMassFlowRatio);
    6863              :             COPWaterFFModFac =
    6864            0 :                 Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRWaterFFlow(SpeedCal), WaterMassFlowRatio);
    6865              : 
    6866            0 :             COP = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedCOP(SpeedCal) * COPTempModFac * COPAirFFModFac * COPWaterFFModFac;
    6867              : 
    6868            0 :             TOTCAPTempModFac = Curve::CurveValue(state,
    6869            0 :                                                  state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(SpeedCal),
    6870              :                                                  InletAirTemp,
    6871            0 :                                                  state.dataVariableSpeedCoils->SourceSideInletTemp);
    6872              :             //   Get capacity modifying factor (function of mass flow) for off-rated conditions
    6873              :             TOTCAPAirFFModFac =
    6874            0 :                 Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(SpeedCal), AirMassFlowRatio);
    6875              :             // Get capacity modifying factor (function of mass flow) for off-rated conditions
    6876              :             TOTCAPWaterFFModFac =
    6877            0 :                 Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapWaterFFlow(SpeedCal), WaterMassFlowRatio);
    6878              : 
    6879            0 :             OperatingHeatingCapacity = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(SpeedCal) * TOTCAPTempModFac *
    6880              :                                        TOTCAPAirFFModFac * TOTCAPWaterFFModFac;
    6881              : 
    6882            0 :             Winput2 = OperatingHeatingCapacity / COP;
    6883            0 :             WHCAP2 = OperatingHeatingCapacity;
    6884              : 
    6885              :             // interpolation
    6886            0 :             state.dataVariableSpeedCoils->Winput = Winput2 * SpeedRatio + (1.0 - SpeedRatio) * Winput1;
    6887            0 :             OperatingHeatingPower = state.dataVariableSpeedCoils->Winput;
    6888            0 :             OperatingHeatingCapacity = WHCAP2 * SpeedRatio + (1.0 - SpeedRatio) * WHCAP1;
    6889            0 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpElecNomPower =
    6890            0 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWHPumpPower(SpeedNum) * SpeedRatio +
    6891            0 :                 (1.0 - SpeedRatio) * state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWHPumpPower(SpeedNum - 1);
    6892              : 
    6893            0 :             OperatingHeatingCOP = OperatingHeatingCapacity / OperatingHeatingPower;
    6894            0 :             TankHeatingCOP = OperatingHeatingCOP;
    6895              : 
    6896            0 :             PumpHeatToWater = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpElecNomPower *
    6897            0 :                               state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpFracToWater;
    6898              : 
    6899              :             // account for pump heat if not included in total water heating capacity
    6900            0 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondPumpHeatInCapacity) {
    6901            0 :                 TotalTankHeatingCapacity = OperatingHeatingCapacity;
    6902              :             } else {
    6903            0 :                 TotalTankHeatingCapacity = OperatingHeatingCapacity + PumpHeatToWater;
    6904              :             }
    6905              : 
    6906            0 :             Real64 HPRTF = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac;
    6907              :             // calculate evaporator total cooling capacity
    6908            0 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).FanPowerIncludedInCOP) {
    6909            0 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondPumpPowerInCOP) {
    6910              :                     //       make sure fan power is full load fan power
    6911            0 :                     CompressorPower = OperatingHeatingPower - locFanElecPower / HPRTF -
    6912            0 :                                       state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpElecNomPower;
    6913            0 :                     if (OperatingHeatingPower > 0.0) {
    6914            0 :                         TankHeatingCOP = TotalTankHeatingCapacity / OperatingHeatingPower;
    6915              :                     }
    6916              :                 } else {
    6917            0 :                     CompressorPower = OperatingHeatingPower - locFanElecPower / HPRTF;
    6918            0 :                     if ((OperatingHeatingPower + state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpElecNomPower) > 0.0) {
    6919            0 :                         TankHeatingCOP = TotalTankHeatingCapacity /
    6920            0 :                                          (OperatingHeatingPower + state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpElecNomPower);
    6921              :                     }
    6922              :                 }
    6923              :             } else {
    6924            0 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondPumpPowerInCOP) {
    6925              :                     //       make sure fan power is full load fan power
    6926            0 :                     CompressorPower = OperatingHeatingPower - state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpElecNomPower;
    6927            0 :                     if ((OperatingHeatingPower + locFanElecPower / HPRTF) > 0.0) {
    6928            0 :                         TankHeatingCOP = TotalTankHeatingCapacity / (OperatingHeatingPower + locFanElecPower / HPRTF);
    6929              :                     }
    6930              :                 } else {
    6931            0 :                     CompressorPower = OperatingHeatingPower;
    6932            0 :                     if ((OperatingHeatingPower + locFanElecPower / HPRTF +
    6933            0 :                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpElecNomPower) > 0.0) {
    6934            0 :                         TankHeatingCOP = TotalTankHeatingCapacity / (OperatingHeatingPower + locFanElecPower / HPRTF +
    6935            0 :                                                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpElecNomPower);
    6936              :                     }
    6937              :                 }
    6938              :             }
    6939              : 
    6940            0 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondPumpHeatInCapacity) {
    6941            0 :                 EvapCoolingCapacity = TotalTankHeatingCapacity - PumpHeatToWater - CompressorPower;
    6942              :             } else {
    6943            0 :                 EvapCoolingCapacity = TotalTankHeatingCapacity - CompressorPower;
    6944              :             }
    6945              :         }
    6946              : 
    6947            0 :         state.dataVariableSpeedCoils->QSource = TotalTankHeatingCapacity;
    6948            0 :         state.dataVariableSpeedCoils->QLoadTotal = EvapCoolingCapacity;
    6949            0 :         state.dataHVACGlobal->DXCoilTotalCapacity = EvapCoolingCapacity; // for standard rating calculation
    6950            0 :         SHR = 1.0;
    6951              :         // if indoor, calculate SHR
    6952            0 :         if (EvapInletNode != 0) {
    6953            0 :             if (CBFSpeed > 0.999) {
    6954            0 :                 CBFSpeed = 0.999;
    6955              :             }
    6956              : 
    6957            0 :             if (CBFSpeed < 0.001) {
    6958            0 :                 SHR = 1.0;
    6959              :             } else {
    6960            0 :                 hDelta = state.dataVariableSpeedCoils->QLoadTotal / state.dataVariableSpeedCoils->LoadSideMassFlowRate;
    6961            0 :                 hADP = state.dataVariableSpeedCoils->LoadSideInletEnth - hDelta / (1.0 - CBFSpeed);
    6962            0 :                 tADP = Psychrometrics::PsyTsatFnHPb(state, hADP, LoadPressure, RoutineName);
    6963            0 :                 wADP = Psychrometrics::PsyWFnTdbH(state, tADP, hADP, RoutineName);
    6964            0 :                 hTinwADP = Psychrometrics::PsyHFnTdbW(state.dataVariableSpeedCoils->LoadSideInletDBTemp, wADP);
    6965            0 :                 if ((state.dataVariableSpeedCoils->LoadSideInletEnth - hADP) > 1.e-10) {
    6966            0 :                     SHR = min((hTinwADP - hADP) / (state.dataVariableSpeedCoils->LoadSideInletEnth - hADP), 1.0);
    6967              :                 } else {
    6968            0 :                     SHR = 1.0;
    6969              :                 }
    6970              :             }
    6971              :         }
    6972              : 
    6973            0 :         state.dataVariableSpeedCoils->QSensible = state.dataVariableSpeedCoils->QLoadTotal * SHR;
    6974              : 
    6975              :         // determine condenser water inlet/outlet condition at full capacity
    6976            0 :         if (CondInletMassFlowRate == 0.0) {
    6977            0 :             OutletWaterTemp = InletWaterTemp;
    6978              :         } else {
    6979            0 :             OutletWaterTemp = InletWaterTemp + TotalTankHeatingCapacity / (CpWater * CondInletMassFlowRate);
    6980              :         }
    6981              : 
    6982            0 :         state.dataLoopNodes->Node(CondOutletNode).Temp = OutletWaterTemp;
    6983              : 
    6984            0 :         state.dataLoopNodes->Node(CondOutletNode).MassFlowRate = state.dataLoopNodes->Node(CondInletNode).MassFlowRate;
    6985              : 
    6986              :         // send heating capacity and COP to water heater module for standards rating calculation
    6987              :         // total heating capacity including condenser pump
    6988            0 :         state.dataVariableSpeedCoils->VSHPWHHeatingCapacity = TotalTankHeatingCapacity;
    6989              :         // total heating COP including compressor, fan, and condenser pump
    6990            0 :         state.dataVariableSpeedCoils->VSHPWHHeatingCOP = TankHeatingCOP;
    6991              : 
    6992            0 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).TotalHeatingEnergyRate = TotalTankHeatingCapacity * PartLoadRatio;
    6993              :         // calculate total compressor plus condenser pump power, fan power reported in fan module
    6994            0 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).ElecWaterHeatingPower =
    6995            0 :             (CompressorPower + state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpElecNomPower) *
    6996            0 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac;
    6997              : 
    6998              :         // pass the outputs for the cooling coil section
    6999            0 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).BasinHeaterPower = 0.0;
    7000            0 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterPower =
    7001            0 :             CrankcaseHeatingPower * (1.0 - state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac);
    7002              : 
    7003              :         // calculate coil outlet state variables
    7004            0 :         state.dataVariableSpeedCoils->LoadSideOutletEnth =
    7005            0 :             state.dataVariableSpeedCoils->LoadSideInletEnth -
    7006            0 :             state.dataVariableSpeedCoils->QLoadTotal / state.dataVariableSpeedCoils->LoadSideMassFlowRate;
    7007            0 :         CpAir = Psychrometrics::PsyCpAirFnW(state.dataVariableSpeedCoils->LoadSideInletHumRat);
    7008            0 :         state.dataVariableSpeedCoils->LoadSideOutletDBTemp =
    7009            0 :             state.dataVariableSpeedCoils->LoadSideInletDBTemp -
    7010            0 :             state.dataVariableSpeedCoils->QSensible / (state.dataVariableSpeedCoils->LoadSideMassFlowRate * CpAir);
    7011              : 
    7012            0 :         MaxHumRat = Psychrometrics::PsyWFnTdbRhPb(state,
    7013            0 :                                                   state.dataVariableSpeedCoils->LoadSideOutletDBTemp,
    7014              :                                                   0.9999,
    7015            0 :                                                   state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirPressure,
    7016              :                                                   RoutineName);
    7017            0 :         MaxOutletEnth = Psychrometrics::PsyHFnTdbW(state.dataVariableSpeedCoils->LoadSideOutletDBTemp, MaxHumRat);
    7018            0 :         if (state.dataVariableSpeedCoils->LoadSideOutletEnth > MaxOutletEnth) {
    7019            0 :             state.dataVariableSpeedCoils->LoadSideOutletEnth = MaxOutletEnth;
    7020              :         }
    7021            0 :         state.dataVariableSpeedCoils->LoadSideOutletHumRat = Psychrometrics::PsyWFnTdbH(
    7022            0 :             state, state.dataVariableSpeedCoils->LoadSideOutletDBTemp, state.dataVariableSpeedCoils->LoadSideOutletEnth, RoutineName);
    7023            0 :         if (state.dataVariableSpeedCoils->LoadSideOutletHumRat > MaxHumRat) {
    7024            0 :             state.dataVariableSpeedCoils->LoadSideOutletHumRat = MaxHumRat;
    7025              :         }
    7026              : 
    7027              :         // Actual outlet conditions are "average" for time step
    7028            0 :         if (fanOp == HVAC::FanOp::Continuous) {
    7029              :             // continuous fan, cycling compressor
    7030            0 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirEnthalpy =
    7031            0 :                 PartLoadRatio * state.dataVariableSpeedCoils->LoadSideOutletEnth +
    7032            0 :                 (1.0 - PartLoadRatio) * state.dataVariableSpeedCoils->LoadSideInletEnth;
    7033            0 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirHumRat =
    7034            0 :                 PartLoadRatio * state.dataVariableSpeedCoils->LoadSideOutletHumRat +
    7035            0 :                 (1.0 - PartLoadRatio) * state.dataVariableSpeedCoils->LoadSideInletHumRat;
    7036            0 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirDBTemp =
    7037            0 :                 Psychrometrics::PsyTdbFnHW(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirEnthalpy,
    7038            0 :                                            state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirHumRat);
    7039            0 :             state.dataVariableSpeedCoils->PLRCorrLoadSideMdot = state.dataVariableSpeedCoils->LoadSideMassFlowRate;
    7040              :         } else {
    7041            0 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirEnthalpy = state.dataVariableSpeedCoils->LoadSideOutletEnth;
    7042            0 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirHumRat = state.dataVariableSpeedCoils->LoadSideOutletHumRat;
    7043            0 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirDBTemp = state.dataVariableSpeedCoils->LoadSideOutletDBTemp;
    7044            0 :             state.dataVariableSpeedCoils->PLRCorrLoadSideMdot = state.dataVariableSpeedCoils->LoadSideMassFlowRate * PartLoadRatio;
    7045              :         }
    7046              : 
    7047              :         // scale heat transfer rates to PLR and power to RTF
    7048            0 :         state.dataVariableSpeedCoils->QLoadTotal *= PartLoadRatio;
    7049            0 :         state.dataVariableSpeedCoils->QSensible *= PartLoadRatio;
    7050              :         // count the powr separately
    7051            0 :         state.dataVariableSpeedCoils->Winput *=
    7052            0 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac; //+ VarSpeedCoil(DXCoilNum)%CrankcaseHeaterPower &
    7053              :         //+ VarSpeedCoil(DXCoilNum)%BasinHeaterPower + VarSpeedCoil(DXCoilNum)%EvapCondPumpElecPower
    7054            0 :         state.dataVariableSpeedCoils->QSource *= PartLoadRatio;
    7055              : 
    7056              :         // Update heat pump data structure
    7057            0 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpElecNomPower =
    7058            0 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpElecNomPower *
    7059            0 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac; // water heating pump power
    7060            0 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Power = state.dataVariableSpeedCoils->Winput;
    7061            0 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QLoadTotal = state.dataVariableSpeedCoils->QLoadTotal;
    7062            0 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QSensible = state.dataVariableSpeedCoils->QSensible;
    7063            0 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QLatent =
    7064            0 :             state.dataVariableSpeedCoils->QLoadTotal - state.dataVariableSpeedCoils->QSensible;
    7065            0 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QSource = state.dataVariableSpeedCoils->QSource;
    7066            0 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Energy = state.dataVariableSpeedCoils->Winput * TimeStepSysSec;
    7067            0 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergyLoadTotal = state.dataVariableSpeedCoils->QLoadTotal * TimeStepSysSec;
    7068            0 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergySensible = state.dataVariableSpeedCoils->QSensible * TimeStepSysSec;
    7069            0 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergyLatent =
    7070            0 :             (state.dataVariableSpeedCoils->QLoadTotal - state.dataVariableSpeedCoils->QSensible) * TimeStepSysSec;
    7071            0 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergySource = state.dataVariableSpeedCoils->QSource * TimeStepSysSec;
    7072            0 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterConsumption =
    7073            0 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterPower * TimeStepSysSec;
    7074            0 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapWaterConsump = 0.0;
    7075            0 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).BasinHeaterConsumption = 0.0;
    7076              :         // re-use EvapCondPumpElecConsumption to store WH pump energy consumption
    7077            0 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapCondPumpElecConsumption =
    7078            0 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpElecNomPower * TimeStepSysSec;
    7079            0 :         if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac == 0.0) {
    7080            0 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).COP = 0.0;
    7081              :         } else {
    7082            0 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).COP =
    7083            0 :                 state.dataVariableSpeedCoils->QLoadTotal / state.dataVariableSpeedCoils->Winput;
    7084              :         }
    7085            0 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PartLoadRatio = PartLoadRatio;
    7086            0 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirMassFlowRate = state.dataVariableSpeedCoils->PLRCorrLoadSideMdot;
    7087            0 :         rhoair = Psychrometrics::PsyRhoAirFnPbTdbW(state,
    7088            0 :                                                    state.dataEnvrn->OutBaroPress,
    7089            0 :                                                    state.dataVariableSpeedCoils->LoadSideInletDBTemp,
    7090            0 :                                                    state.dataVariableSpeedCoils->LoadSideInletHumRat,
    7091              :                                                    RoutineName);
    7092            0 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirVolFlowRate =
    7093            0 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirMassFlowRate / rhoair;
    7094            0 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterMassFlowRate = state.dataVariableSpeedCoils->SourceSideMassFlowRate;
    7095            0 :         RhoWater = Psychrometrics::RhoH2O(InletWaterTemp); // initialize
    7096            0 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterVolFlowRate =
    7097            0 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterMassFlowRate / RhoWater;
    7098              : 
    7099            0 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletWaterTemp =
    7100            0 :             state.dataVariableSpeedCoils->SourceSideInletTemp +
    7101            0 :             state.dataVariableSpeedCoils->QSource / (state.dataVariableSpeedCoils->SourceSideMassFlowRate * CpWater);
    7102            0 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletWaterEnthalpy =
    7103            0 :             state.dataVariableSpeedCoils->SourceSideInletEnth +
    7104            0 :             state.dataVariableSpeedCoils->QSource / state.dataVariableSpeedCoils->SourceSideMassFlowRate;
    7105            0 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QWasteHeat = 0.0;
    7106              : 
    7107            0 :         if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).bIsDesuperheater) // desuperheater doesn't save power and cooling energy variables
    7108              :         {
    7109              :             // source side is the water side; load side is the air side
    7110            0 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Power = 0.0;
    7111            0 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QLoadTotal = 0.0;
    7112            0 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QSensible = 0.0;
    7113            0 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QLatent = 0.0;
    7114            0 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Energy = 0.0;
    7115            0 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergyLoadTotal = 0.0;
    7116            0 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergySensible = 0.0;
    7117            0 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergyLatent = 0.0;
    7118            0 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterConsumption = 0.0;
    7119              :         }
    7120              :     }
    7121              : 
    7122            0 :     void setVarSpeedHPWHFanType(EnergyPlusData &state, int const dXCoilNum, HVAC::FanType fanType)
    7123              :     {
    7124            0 :         state.dataVariableSpeedCoils->VarSpeedCoil(dXCoilNum).supplyFanType = fanType;
    7125            0 :     }
    7126              : 
    7127            0 :     void setVarSpeedHPWHFanIndex(EnergyPlusData &state, int const dXCoilNum, int const fanIndex)
    7128              :     {
    7129            0 :         state.dataVariableSpeedCoils->VarSpeedCoil(dXCoilNum).SupplyFanIndex = fanIndex;
    7130            0 :     }
    7131              : 
    7132        33673 :     void CalcVarSpeedCoilHeating(EnergyPlusData &state,
    7133              :                                  int const DXCoilNum,                             // Heat Pump Number
    7134              :                                  HVAC::FanOp const fanOp,                         // Fan/Compressor cycling scheme indicator
    7135              :                                  [[maybe_unused]] Real64 const SensDemand,        // Cooling Sensible Demand [W] !unused1208
    7136              :                                  HVAC::CompressorOp const compressorOp,           // compressor operation flag
    7137              :                                  Real64 const PartLoadRatio,                      // compressor part load ratio
    7138              :                                  [[maybe_unused]] Real64 const OnOffAirFlowRatio, // ratio of compressor on flow to average flow over time step
    7139              :                                  Real64 const SpeedRatio, // SpeedRatio varies between 1.0 (higher speed) and 0.0 (lower speed)
    7140              :                                  int const SpeedNum       // Speed number, high bound, i.e. SpeedNum - 1 is the other side
    7141              :     )
    7142              :     {
    7143              : 
    7144              :         //       AUTHOR         Bo Shen, based on WaterToAirHeatPumpSimple:CalcHPHeatingSimple
    7145              :         //       DATE WRITTEN   March 2012
    7146              : 
    7147              :         // PURPOSE OF THIS SUBROUTINE:
    7148              :         // This subroutine is for simulating the heating mode of the Variable Speed Water to Air HP Simple
    7149              : 
    7150              :         // METHODOLOGY EMPLOYED:
    7151              :         // Simulate the heat pump performance using the coefficients and rated conditions
    7152              :         // Finally, adjust the heat pump outlet conditions based on the PartLoadRatio
    7153              :         // and RuntimeFrac.
    7154              : 
    7155              :         // SUBROUTINE PARAMETER DEFINITIONS:
    7156              :         static constexpr std::string_view RoutineName("CalcVarSpeedCoilHeating");
    7157              :         static constexpr std::string_view RoutineNameSourceSideInletTemp("CalcVarSpeedCoilHeating:SourceSideInletTemp");
    7158        33673 :         Real64 TimeStepSysSec = state.dataHVACGlobal->TimeStepSysSec;
    7159              : 
    7160              :         // SUBROUTINE LOCAL VARIABLE DECLARATIONS:
    7161              :         Real64 CpSource;            // Specific heat of water [J/kg_C]
    7162              :         Real64 AirMassFlowRatio;    // airflow ratio at low speed
    7163              :         Real64 WaterMassFlowRatio;  // airflow ratio at high speed
    7164              :         Real64 TotCapAirFFModFac;   // air flow fraction modification
    7165              :         Real64 TotCapWaterFFModFac; // water flow fraction modification
    7166              :         Real64 TotCapTempModFac;    // total capacity temperature correction fraction
    7167              :         Real64 EIRAirFFModFac;      // air flow fraction modification
    7168              :         Real64 EIRWaterFFModFac;    // water flow fraction modification
    7169              :         Real64 EIRTempModFac;       // total capacity temperature correction fraction
    7170              :         Real64 EIR;                 // total capacity temperature correction fraction
    7171              :         int SpeedCal;               // calculated speed level
    7172              :         Real64 QLoadTotal1;         // heating capacity at low speed
    7173              :         Real64 QLoadTotal2;         // heating capacity at high speed
    7174              :         Real64 Winput1;             // power consumption at low speed
    7175              :         Real64 Winput2;             // power consumption at high speed
    7176              :         Real64 QWasteHeat;          // recoverable waste heat
    7177              :         Real64 QWasteHeat1;         // recoverable waste heat at low speed
    7178              :         Real64 QWasteHeat2;         // recoverable waste heat at high speed
    7179              :         Real64 PLF;                 // part-load function
    7180        33673 :         Real64 rhoair(0.0);         // entering air density
    7181              : 
    7182              :         // ADDED VARIABLES FOR air source coil
    7183        33673 :         int MaxSpeed = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds;
    7184              : 
    7185              :         //  LOAD LOCAL VARIABLES FROM DATA STRUCTURE (for code readability)
    7186        33673 :         if (!(fanOp == HVAC::FanOp::Continuous) && PartLoadRatio > 0.0) {
    7187        17652 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirMassFlowRate =
    7188        17652 :                 state.dataLoopNodes->Node(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirInletNodeNum).MassFlowRate / PartLoadRatio;
    7189              :         }
    7190              : 
    7191        33673 :         state.dataVariableSpeedCoils->LoadSideMassFlowRate = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirMassFlowRate;
    7192        33673 :         state.dataVariableSpeedCoils->LoadSideInletDBTemp = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirDBTemp;
    7193        33673 :         state.dataVariableSpeedCoils->LoadSideInletHumRat = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirHumRat;
    7194              : 
    7195        33673 :         state.dataVariableSpeedCoils->LoadSideInletWBTemp = Psychrometrics::PsyTwbFnTdbWPb(state,
    7196        33673 :                                                                                            state.dataVariableSpeedCoils->LoadSideInletDBTemp,
    7197        33673 :                                                                                            state.dataVariableSpeedCoils->LoadSideInletHumRat,
    7198        33673 :                                                                                            state.dataEnvrn->OutBaroPress,
    7199              :                                                                                            RoutineName);
    7200        33673 :         state.dataVariableSpeedCoils->LoadSideInletEnth = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirEnthalpy;
    7201        33673 :         Real64 CpAir = Psychrometrics::PsyCpAirFnW(state.dataVariableSpeedCoils->LoadSideInletHumRat); // Specific heat of air [J/kg_C]
    7202              : 
    7203        33673 :         if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_HeatingAirToAirVariableSpeed) {
    7204              :             // Get condenser outdoor node info from DX Heating Coil
    7205           36 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserInletNodeNum != 0) {
    7206            0 :                 state.dataVariableSpeedCoils->OutdoorDryBulb =
    7207            0 :                     state.dataLoopNodes->Node(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserInletNodeNum).Temp;
    7208            0 :                 state.dataVariableSpeedCoils->OutdoorHumRat =
    7209            0 :                     state.dataLoopNodes->Node(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserInletNodeNum).HumRat;
    7210            0 :                 state.dataVariableSpeedCoils->OutdoorPressure =
    7211            0 :                     state.dataLoopNodes->Node(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserInletNodeNum).Press;
    7212            0 :                 state.dataVariableSpeedCoils->OutdoorWetBulb =
    7213            0 :                     state.dataLoopNodes->Node(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserInletNodeNum).OutAirWetBulb;
    7214              :             } else {
    7215           36 :                 state.dataVariableSpeedCoils->OutdoorDryBulb = state.dataEnvrn->OutDryBulbTemp;
    7216           36 :                 state.dataVariableSpeedCoils->OutdoorHumRat = state.dataEnvrn->OutHumRat;
    7217           36 :                 state.dataVariableSpeedCoils->OutdoorPressure = state.dataEnvrn->OutBaroPress;
    7218           36 :                 state.dataVariableSpeedCoils->OutdoorWetBulb = state.dataEnvrn->OutWetBulbTemp;
    7219              :             }
    7220           36 :             state.dataVariableSpeedCoils->SourceSideMassFlowRate = 1.0; // not used and avoid divided by zero
    7221           36 :             state.dataVariableSpeedCoils->SourceSideInletTemp = state.dataVariableSpeedCoils->OutdoorDryBulb;
    7222           36 :             state.dataVariableSpeedCoils->SourceSideInletEnth =
    7223           36 :                 Psychrometrics::PsyHFnTdbW(state.dataVariableSpeedCoils->OutdoorDryBulb, state.dataVariableSpeedCoils->OutdoorHumRat);
    7224           36 :             CpSource = Psychrometrics::PsyCpAirFnW(state.dataEnvrn->OutHumRat);
    7225              : 
    7226              :             // Initialize crankcase heater, operates below OAT defined in input deck for HP DX heating coil
    7227           36 :             if (state.dataVariableSpeedCoils->OutdoorDryBulb < state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MaxOATCrankcaseHeater) {
    7228           33 :                 state.dataVariableSpeedCoils->CrankcaseHeatingPower = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterCapacity;
    7229           33 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterCapacityCurveIndex > 0) {
    7230            1 :                     state.dataVariableSpeedCoils->CrankcaseHeatingPower *=
    7231            1 :                         Curve::CurveValue(state,
    7232            1 :                                           state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterCapacityCurveIndex,
    7233            1 :                                           state.dataEnvrn->OutDryBulbTemp);
    7234              :                 }
    7235              :             } else {
    7236            3 :                 state.dataVariableSpeedCoils->CrankcaseHeatingPower = 0.0;
    7237              :             }
    7238              :         } else {
    7239        33637 :             state.dataVariableSpeedCoils->SourceSideMassFlowRate = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterMassFlowRate;
    7240        33637 :             state.dataVariableSpeedCoils->SourceSideInletTemp = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletWaterTemp;
    7241        33637 :             state.dataVariableSpeedCoils->SourceSideInletEnth = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletWaterEnthalpy;
    7242        33637 :             CpSource = state.dataPlnt->PlantLoop(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).plantLoc.loopNum)
    7243        33637 :                            .glycol->getSpecificHeat(state, state.dataVariableSpeedCoils->SourceSideInletTemp, RoutineNameSourceSideInletTemp);
    7244              :         }
    7245              : 
    7246              :         // Check for flows, do not perform simulation if no flow in load side or source side.
    7247        33673 :         if ((state.dataVariableSpeedCoils->SourceSideMassFlowRate <= 0.0) || (state.dataVariableSpeedCoils->LoadSideMassFlowRate <= 0.0)) {
    7248        16038 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SimFlag = false;
    7249        16038 :             return;
    7250              :         } else {
    7251        17635 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SimFlag = true;
    7252              :         }
    7253              : 
    7254        17659 :         if ((state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_HeatingAirToAirVariableSpeed) &&
    7255           24 :             (state.dataVariableSpeedCoils->OutdoorDryBulb < state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MinOATCompressor)) {
    7256            0 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SimFlag = false;
    7257            0 :             return;
    7258              :         }
    7259              : 
    7260        17635 :         if (compressorOp == HVAC::CompressorOp::Off) {
    7261            1 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SimFlag = false;
    7262            1 :             return;
    7263              :         }
    7264              : 
    7265        17634 :         if (SpeedNum > MaxSpeed) {
    7266            0 :             SpeedCal = MaxSpeed;
    7267              :         } else {
    7268        17634 :             SpeedCal = SpeedNum;
    7269              :         }
    7270              : 
    7271        17634 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac = 1.0;
    7272        17634 :         state.dataHVACGlobal->OnOffFanPartLoadFraction = 1.0;
    7273        17634 :         if ((SpeedNum == 1) && (PartLoadRatio < 1.0)) {
    7274           39 :             PLF = Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PLFFPLR, PartLoadRatio);
    7275           39 :             if (PLF < 0.7) {
    7276            0 :                 PLF = 0.7;
    7277              :             }
    7278           39 :             if (fanOp == HVAC::FanOp::Cycling) {
    7279           32 :                 state.dataHVACGlobal->OnOffFanPartLoadFraction =
    7280              :                     PLF; // save PLF for fan model, don't change fan power for constant fan mode if coil is off
    7281              :             }
    7282              :             // calculate the run time fraction
    7283           39 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac = PartLoadRatio / PLF;
    7284           39 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PartLoadRatio = PartLoadRatio;
    7285              : 
    7286           39 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac > 1.0) {
    7287            0 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac = 1.0; // Reset coil runtime fraction to 1.0
    7288           39 :             } else if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac < 0.0) {
    7289            0 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac = 0.0;
    7290              :             }
    7291              :         }
    7292              : 
    7293        17634 :         if ((SpeedNum == 1) || (SpeedNum > MaxSpeed) || (SpeedRatio == 1.0)) {
    7294        12217 :             AirMassFlowRatio =
    7295        12217 :                 state.dataVariableSpeedCoils->LoadSideMassFlowRate / state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignAirMassFlowRate;
    7296              : 
    7297        12217 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_HeatingAirToAirVariableSpeed) {
    7298           18 :                 WaterMassFlowRatio = 1.0;
    7299              :             } else {
    7300        12199 :                 WaterMassFlowRatio = state.dataVariableSpeedCoils->SourceSideMassFlowRate /
    7301        12199 :                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignWaterMassFlowRate;
    7302              :             }
    7303              : 
    7304        48868 :             TotCapTempModFac = Curve::CurveValue(state,
    7305        12217 :                                                  state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(SpeedCal),
    7306        12217 :                                                  state.dataVariableSpeedCoils->LoadSideInletDBTemp,
    7307        12217 :                                                  state.dataVariableSpeedCoils->SourceSideInletTemp);
    7308              :             TotCapAirFFModFac =
    7309        12217 :                 Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(SpeedCal), AirMassFlowRatio);
    7310              : 
    7311        12217 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_HeatingAirToAirVariableSpeed) {
    7312           18 :                 TotCapWaterFFModFac = 1.0;
    7313              :             } else {
    7314              :                 TotCapWaterFFModFac =
    7315        12199 :                     Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapWaterFFlow(SpeedCal), WaterMassFlowRatio);
    7316              :             }
    7317              : 
    7318        12217 :             state.dataVariableSpeedCoils->QLoadTotal = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(SpeedCal) *
    7319        12217 :                                                        TotCapTempModFac * TotCapAirFFModFac * TotCapWaterFFModFac;
    7320        12217 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).capModFacTotal = TotCapTempModFac * TotCapAirFFModFac * TotCapWaterFFModFac;
    7321        24434 :             state.dataVariableSpeedCoils->TotRatedCapacity =
    7322        12217 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(SpeedCal); // for defrosting power cal
    7323              : 
    7324        48868 :             EIRTempModFac = Curve::CurveValue(state,
    7325        12217 :                                               state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(SpeedCal),
    7326        12217 :                                               state.dataVariableSpeedCoils->LoadSideInletDBTemp,
    7327        12217 :                                               state.dataVariableSpeedCoils->SourceSideInletTemp);
    7328              :             EIRAirFFModFac =
    7329        12217 :                 Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(SpeedCal), AirMassFlowRatio);
    7330              : 
    7331        12217 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_HeatingAirToAirVariableSpeed) {
    7332           18 :                 EIRWaterFFModFac = 1.0;
    7333              :             } else {
    7334              :                 EIRWaterFFModFac =
    7335        12199 :                     Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRWaterFFlow(SpeedCal), WaterMassFlowRatio);
    7336              :             }
    7337              : 
    7338        12217 :             EIR = (1.0 / state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedCOP(SpeedCal)) * EIRTempModFac * EIRAirFFModFac *
    7339              :                   EIRWaterFFModFac;
    7340        12217 :             state.dataVariableSpeedCoils->Winput = state.dataVariableSpeedCoils->QLoadTotal * EIR;
    7341              : 
    7342        24434 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_HeatingAirToAirVariableSpeed) {
    7343           18 :                 QWasteHeat = 0.0;
    7344              :             } else {
    7345        12199 :                 QWasteHeat = state.dataVariableSpeedCoils->Winput * state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWasteHeatFrac(SpeedCal);
    7346        12199 :                 QWasteHeat *= Curve::CurveValue(state,
    7347        12199 :                                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWasteHeat(SpeedCal),
    7348        12199 :                                                 state.dataVariableSpeedCoils->LoadSideInletDBTemp,
    7349        12199 :                                                 state.dataVariableSpeedCoils->SourceSideInletTemp);
    7350              :             }
    7351              : 
    7352              :         } else {
    7353         5417 :             AirMassFlowRatio =
    7354         5417 :                 state.dataVariableSpeedCoils->LoadSideMassFlowRate / state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignAirMassFlowRate;
    7355              : 
    7356         5417 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_HeatingAirToAirVariableSpeed) {
    7357            5 :                 WaterMassFlowRatio = 1.0;
    7358              :             } else {
    7359         5412 :                 WaterMassFlowRatio = state.dataVariableSpeedCoils->SourceSideMassFlowRate /
    7360         5412 :                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignWaterMassFlowRate;
    7361              :             }
    7362              : 
    7363         5417 :             SpeedCal = SpeedNum - 1;
    7364        21668 :             TotCapTempModFac = Curve::CurveValue(state,
    7365         5417 :                                                  state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(SpeedCal),
    7366         5417 :                                                  state.dataVariableSpeedCoils->LoadSideInletDBTemp,
    7367         5417 :                                                  state.dataVariableSpeedCoils->SourceSideInletTemp);
    7368              :             TotCapAirFFModFac =
    7369         5417 :                 Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(SpeedCal), AirMassFlowRatio);
    7370              : 
    7371         5417 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_HeatingAirToAirVariableSpeed) {
    7372            5 :                 TotCapWaterFFModFac = 1.0;
    7373              :             } else {
    7374              :                 TotCapWaterFFModFac =
    7375         5412 :                     Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapWaterFFlow(SpeedCal), WaterMassFlowRatio);
    7376              :             }
    7377              : 
    7378         5417 :             QLoadTotal1 = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(SpeedCal) * TotCapTempModFac * TotCapAirFFModFac *
    7379              :                           TotCapWaterFFModFac;
    7380              : 
    7381        21668 :             EIRTempModFac = Curve::CurveValue(state,
    7382         5417 :                                               state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(SpeedCal),
    7383         5417 :                                               state.dataVariableSpeedCoils->LoadSideInletDBTemp,
    7384         5417 :                                               state.dataVariableSpeedCoils->SourceSideInletTemp);
    7385              :             EIRAirFFModFac =
    7386         5417 :                 Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(SpeedCal), AirMassFlowRatio);
    7387              : 
    7388         5417 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_HeatingAirToAirVariableSpeed) {
    7389            5 :                 EIRWaterFFModFac = 1.0;
    7390              :             } else {
    7391              :                 EIRWaterFFModFac =
    7392         5412 :                     Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRWaterFFlow(SpeedCal), WaterMassFlowRatio);
    7393              :             }
    7394              : 
    7395         5417 :             EIR = (1.0 / state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedCOP(SpeedCal)) * EIRTempModFac * EIRAirFFModFac *
    7396              :                   EIRWaterFFModFac;
    7397         5417 :             Winput1 = QLoadTotal1 * EIR;
    7398              : 
    7399         5417 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_HeatingAirToAirVariableSpeed) {
    7400            5 :                 QWasteHeat1 = 0.0;
    7401              :             } else {
    7402         5412 :                 QWasteHeat1 = Winput1 * state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWasteHeatFrac(SpeedCal);
    7403         5412 :                 QWasteHeat1 *= Curve::CurveValue(state,
    7404         5412 :                                                  state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWasteHeat(SpeedCal),
    7405         5412 :                                                  state.dataVariableSpeedCoils->LoadSideInletDBTemp,
    7406         5412 :                                                  state.dataVariableSpeedCoils->SourceSideInletTemp);
    7407              :             }
    7408              : 
    7409         5417 :             SpeedCal = SpeedNum;
    7410        21668 :             TotCapTempModFac = Curve::CurveValue(state,
    7411         5417 :                                                  state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(SpeedCal),
    7412         5417 :                                                  state.dataVariableSpeedCoils->LoadSideInletDBTemp,
    7413         5417 :                                                  state.dataVariableSpeedCoils->SourceSideInletTemp);
    7414              :             TotCapAirFFModFac =
    7415         5417 :                 Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(SpeedCal), AirMassFlowRatio);
    7416              : 
    7417         5417 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_HeatingAirToAirVariableSpeed) {
    7418            5 :                 TotCapWaterFFModFac = 1.0;
    7419              :             } else {
    7420              :                 TotCapWaterFFModFac =
    7421         5412 :                     Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapWaterFFlow(SpeedCal), WaterMassFlowRatio);
    7422              :             }
    7423              : 
    7424         5417 :             QLoadTotal2 = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(SpeedCal) * TotCapTempModFac * TotCapAirFFModFac *
    7425              :                           TotCapWaterFFModFac;
    7426              : 
    7427        21668 :             EIRTempModFac = Curve::CurveValue(state,
    7428         5417 :                                               state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(SpeedCal),
    7429         5417 :                                               state.dataVariableSpeedCoils->LoadSideInletDBTemp,
    7430         5417 :                                               state.dataVariableSpeedCoils->SourceSideInletTemp);
    7431              :             EIRAirFFModFac =
    7432         5417 :                 Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(SpeedCal), AirMassFlowRatio);
    7433              : 
    7434         5417 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_HeatingAirToAirVariableSpeed) {
    7435            5 :                 EIRWaterFFModFac = 1.0;
    7436              :             } else {
    7437              :                 EIRWaterFFModFac =
    7438         5412 :                     Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRWaterFFlow(SpeedCal), WaterMassFlowRatio);
    7439              :             }
    7440              : 
    7441         5417 :             EIR = (1.0 / state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedCOP(SpeedCal)) * EIRTempModFac * EIRAirFFModFac *
    7442              :                   EIRWaterFFModFac;
    7443         5417 :             Winput2 = QLoadTotal2 * EIR;
    7444              : 
    7445         5417 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_HeatingAirToAirVariableSpeed) {
    7446            5 :                 QWasteHeat2 = 0.0;
    7447              :             } else {
    7448         5412 :                 QWasteHeat2 = Winput2 * state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWasteHeatFrac(SpeedCal);
    7449         5412 :                 QWasteHeat2 *= Curve::CurveValue(state,
    7450         5412 :                                                  state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWasteHeat(SpeedCal),
    7451         5412 :                                                  state.dataVariableSpeedCoils->LoadSideInletDBTemp,
    7452         5412 :                                                  state.dataVariableSpeedCoils->SourceSideInletTemp);
    7453              :             }
    7454              : 
    7455         5417 :             state.dataVariableSpeedCoils->QLoadTotal = QLoadTotal2 * SpeedRatio + (1.0 - SpeedRatio) * QLoadTotal1;
    7456         5417 :             state.dataVariableSpeedCoils->Winput = Winput2 * SpeedRatio + (1.0 - SpeedRatio) * Winput1;
    7457         5417 :             QWasteHeat = QWasteHeat2 * SpeedRatio + (1.0 - SpeedRatio) * QWasteHeat1;
    7458         5417 :             state.dataVariableSpeedCoils->TotRatedCapacity =
    7459         5417 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(SpeedCal) * SpeedRatio +
    7460         5417 :                 (1.0 - SpeedRatio) * state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(SpeedCal - 1);
    7461              :         }
    7462              : 
    7463        17634 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterPower = 0.0; // necessary to clear zero for water source coils
    7464        17634 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostPower = 0.0;         // clear the defrost power
    7465        17634 :         if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_HeatingAirToAirVariableSpeed) {
    7466              :             // Calculating adjustment factors for defrost
    7467              :             // Calculate delta w through outdoor coil by assuming a coil temp of 0.82*DBT-9.7(F) per DOE2.1E
    7468           23 :             state.dataVariableSpeedCoils->OutdoorCoilT = 0.82 * state.dataVariableSpeedCoils->OutdoorDryBulb - 8.589;
    7469           23 :             state.dataVariableSpeedCoils->OutdoorCoildw =
    7470           23 :                 max(1.0e-6,
    7471           23 :                     (state.dataVariableSpeedCoils->OutdoorHumRat -
    7472           23 :                      Psychrometrics::PsyWFnTdpPb(state, state.dataVariableSpeedCoils->OutdoorCoilT, state.dataVariableSpeedCoils->OutdoorPressure)));
    7473              : 
    7474              :             // Initializing defrost adjustment factors
    7475           23 :             state.dataVariableSpeedCoils->LoadDueToDefrost = 0.0;
    7476           23 :             state.dataVariableSpeedCoils->HeatingCapacityMultiplier = 1.0;
    7477           23 :             state.dataVariableSpeedCoils->FractionalDefrostTime = 0.0;
    7478           23 :             state.dataVariableSpeedCoils->InputPowerMultiplier = 1.0;
    7479              :             // Check outdoor temperature to determine of defrost is active
    7480           23 :             if (state.dataVariableSpeedCoils->OutdoorDryBulb <= state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MaxOATDefrost) {
    7481              :                 // Calculate defrost adjustment factors depending on defrost control type
    7482           19 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostControl == Timed) {
    7483           12 :                     state.dataVariableSpeedCoils->FractionalDefrostTime = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostTime;
    7484           12 :                     if (state.dataVariableSpeedCoils->FractionalDefrostTime > 0.0) {
    7485           11 :                         if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).FrostHeatingCapacityMultiplierEMSOverrideOn &&
    7486            1 :                             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).FrostHeatingInputPowerMultiplierEMSOverrideOn) {
    7487            2 :                             state.dataVariableSpeedCoils->HeatingCapacityMultiplier =
    7488            1 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).FrostHeatingCapacityMultiplierEMSOverrideValue;
    7489            1 :                             state.dataVariableSpeedCoils->InputPowerMultiplier =
    7490            1 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).FrostHeatingInputPowerMultiplierEMSOverrideValue;
    7491              :                         } else {
    7492            9 :                             state.dataVariableSpeedCoils->HeatingCapacityMultiplier = 0.909 - 107.33 * state.dataVariableSpeedCoils->OutdoorCoildw;
    7493            9 :                             state.dataVariableSpeedCoils->InputPowerMultiplier = 0.90 - 36.45 * state.dataVariableSpeedCoils->OutdoorCoildw;
    7494           18 :                             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).FrostHeatingCapacityMultiplierEMSOverrideOn ||
    7495            9 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).FrostHeatingInputPowerMultiplierEMSOverrideOn) {
    7496            0 :                                 ShowWarningMessage(
    7497              :                                     state,
    7498            0 :                                     format("The Frost Heating Capacity Multiplier actuator and the Frost Heating Input Power Multiplier "
    7499              :                                            "actuator must be both provided for DX heating coil {}",
    7500            0 :                                            state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    7501            0 :                                 ShowContinueError(state, "EMS actuators are ignored. Simulation is continuing.");
    7502              :                             }
    7503              :                         }
    7504              :                     }
    7505              :                 } else { // else defrost control is on-demand
    7506            7 :                     state.dataVariableSpeedCoils->FractionalDefrostTime = 1.0 / (1.0 + 0.01446 / state.dataVariableSpeedCoils->OutdoorCoildw);
    7507            7 :                     if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).FrostHeatingCapacityMultiplierEMSOverrideOn &&
    7508            0 :                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).FrostHeatingInputPowerMultiplierEMSOverrideOn) {
    7509            0 :                         state.dataVariableSpeedCoils->HeatingCapacityMultiplier =
    7510            0 :                             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).FrostHeatingCapacityMultiplierEMSOverrideValue;
    7511            0 :                         state.dataVariableSpeedCoils->InputPowerMultiplier =
    7512            0 :                             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).FrostHeatingInputPowerMultiplierEMSOverrideValue;
    7513              :                     } else {
    7514            7 :                         state.dataVariableSpeedCoils->HeatingCapacityMultiplier = 0.875 * (1.0 - state.dataVariableSpeedCoils->FractionalDefrostTime);
    7515            7 :                         state.dataVariableSpeedCoils->InputPowerMultiplier = 0.954 * (1.0 - state.dataVariableSpeedCoils->FractionalDefrostTime);
    7516           14 :                         if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).FrostHeatingCapacityMultiplierEMSOverrideOn ||
    7517            7 :                             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).FrostHeatingInputPowerMultiplierEMSOverrideOn) {
    7518            0 :                             ShowWarningMessage(state,
    7519            0 :                                                format("The Frost Heating Capacity Multiplier actuator and the Frost Heating Input Power Multiplier "
    7520              :                                                       "actuator must be both provided for DX heating coil {}",
    7521            0 :                                                       state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    7522            0 :                             ShowContinueError(state, "EMS actuators are ignored. Simulation is continuing.");
    7523              :                         }
    7524              :                     }
    7525              :                 }
    7526              :                 // correction fractional defrost time shorten by runtime fraction
    7527           19 :                 state.dataVariableSpeedCoils->FractionalDefrostTime *= state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac;
    7528              : 
    7529           19 :                 if (state.dataVariableSpeedCoils->FractionalDefrostTime > 0.0) {
    7530              :                     // Calculate defrost adjustment factors depending on defrost control strategy
    7531           17 :                     if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostStrategy == ReverseCycle) {
    7532            0 :                         state.dataVariableSpeedCoils->LoadDueToDefrost = (0.01 * state.dataVariableSpeedCoils->FractionalDefrostTime) *
    7533            0 :                                                                          (7.222 - state.dataVariableSpeedCoils->OutdoorDryBulb) *
    7534            0 :                                                                          (state.dataVariableSpeedCoils->TotRatedCapacity / 1.01667);
    7535            0 :                         state.dataVariableSpeedCoils->DefrostEIRTempModFac =
    7536            0 :                             Curve::CurveValue(state,
    7537            0 :                                               state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostEIRFT,
    7538            0 :                                               max(15.555, state.dataVariableSpeedCoils->LoadSideInletWBTemp),
    7539            0 :                                               max(15.555, state.dataVariableSpeedCoils->OutdoorDryBulb));
    7540            0 :                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostPower =
    7541            0 :                             state.dataVariableSpeedCoils->DefrostEIRTempModFac * (state.dataVariableSpeedCoils->TotRatedCapacity / 1.01667) *
    7542            0 :                             state.dataVariableSpeedCoils->FractionalDefrostTime;
    7543              :                     } else { // Defrost strategy is resistive
    7544           17 :                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostPower =
    7545           17 :                             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostCapacity *
    7546           17 :                             state.dataVariableSpeedCoils->FractionalDefrostTime;
    7547              :                     }
    7548              :                 } else { // Defrost is not active because (OutDryBulbTemp > VarSpeedCoil(DXCoilNum).MaxOATDefrost)
    7549            2 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostPower = 0.0;
    7550              :                 }
    7551              :             }
    7552              : 
    7553           23 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterPower =
    7554           23 :                 state.dataVariableSpeedCoils->CrankcaseHeatingPower * (1.0 - state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac);
    7555              :             //! Modify total heating capacity based on defrost heating capacity multiplier
    7556              :             //! MaxHeatCap passed from parent object VRF Condenser and is used to limit capacity of TU's to that available from condenser
    7557              :             //  IF(PRESENT(MaxHeatCap))THEN
    7558              :             //    TotCap = MIN(MaxHeatCap,TotCap * HeatingCapacityMultiplier)
    7559              :             //  ELSE
    7560              :             //    TotCap = TotCap * HeatingCapacityMultiplier
    7561              :             //  END IF
    7562           46 :             state.dataVariableSpeedCoils->QLoadTotal =
    7563           23 :                 state.dataVariableSpeedCoils->QLoadTotal * state.dataVariableSpeedCoils->HeatingCapacityMultiplier -
    7564           23 :                 state.dataVariableSpeedCoils->LoadDueToDefrost;
    7565              :             // count the powr separately
    7566           23 :             state.dataVariableSpeedCoils->Winput *= state.dataVariableSpeedCoils->InputPowerMultiplier; //+ VarSpeedCoil(DXCoilNum)%DefrostPower
    7567              :         }
    7568              : 
    7569        17634 :         state.dataVariableSpeedCoils->QSource = state.dataVariableSpeedCoils->QLoadTotal + QWasteHeat - state.dataVariableSpeedCoils->Winput;
    7570        17634 :         state.dataVariableSpeedCoils->QSensible = state.dataVariableSpeedCoils->QLoadTotal;
    7571              : 
    7572        17634 :         if (state.dataVariableSpeedCoils->QSource < 0) {
    7573            1 :             state.dataVariableSpeedCoils->QSource = 0.0;
    7574            1 :             QWasteHeat = state.dataVariableSpeedCoils->Winput - state.dataVariableSpeedCoils->QLoadTotal;
    7575              :         }
    7576              : 
    7577              :         // calculate coil outlet state variables
    7578        35268 :         state.dataVariableSpeedCoils->LoadSideOutletEnth =
    7579        17634 :             state.dataVariableSpeedCoils->LoadSideInletEnth +
    7580        17634 :             state.dataVariableSpeedCoils->QLoadTotal / state.dataVariableSpeedCoils->LoadSideMassFlowRate;
    7581        35268 :         state.dataVariableSpeedCoils->LoadSideOutletDBTemp =
    7582        17634 :             state.dataVariableSpeedCoils->LoadSideInletDBTemp +
    7583        17634 :             state.dataVariableSpeedCoils->QSensible / (state.dataVariableSpeedCoils->LoadSideMassFlowRate * CpAir);
    7584        17634 :         state.dataVariableSpeedCoils->LoadSideOutletHumRat = Psychrometrics::PsyWFnTdbH(
    7585        17634 :             state, state.dataVariableSpeedCoils->LoadSideOutletDBTemp, state.dataVariableSpeedCoils->LoadSideOutletEnth, RoutineName);
    7586              : 
    7587              :         // Actual outlet conditions are "average" for time step
    7588        17634 :         if (fanOp == HVAC::FanOp::Continuous) {
    7589              :             // continuous fan, cycling compressor
    7590           24 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirEnthalpy =
    7591           24 :                 PartLoadRatio * state.dataVariableSpeedCoils->LoadSideOutletEnth +
    7592           24 :                 (1.0 - PartLoadRatio) * state.dataVariableSpeedCoils->LoadSideInletEnth;
    7593           24 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirHumRat =
    7594           24 :                 PartLoadRatio * state.dataVariableSpeedCoils->LoadSideOutletHumRat +
    7595           24 :                 (1.0 - PartLoadRatio) * state.dataVariableSpeedCoils->LoadSideInletHumRat;
    7596           24 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirDBTemp =
    7597           24 :                 Psychrometrics::PsyTdbFnHW(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirEnthalpy,
    7598           24 :                                            state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirHumRat);
    7599           24 :             state.dataVariableSpeedCoils->PLRCorrLoadSideMdot = state.dataVariableSpeedCoils->LoadSideMassFlowRate;
    7600              :         } else {
    7601              :             // default to cycling fan, cycling compressor
    7602        17610 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirEnthalpy = state.dataVariableSpeedCoils->LoadSideOutletEnth;
    7603        17610 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirHumRat = state.dataVariableSpeedCoils->LoadSideOutletHumRat;
    7604        17610 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirDBTemp = state.dataVariableSpeedCoils->LoadSideOutletDBTemp;
    7605        17610 :             state.dataVariableSpeedCoils->PLRCorrLoadSideMdot = state.dataVariableSpeedCoils->LoadSideMassFlowRate * PartLoadRatio;
    7606              :         }
    7607              : 
    7608              :         // scale heat transfer rates to PLR and power to RTF
    7609        17634 :         state.dataVariableSpeedCoils->QLoadTotal *= PartLoadRatio;
    7610        17634 :         state.dataVariableSpeedCoils->QSensible *= PartLoadRatio;
    7611              :         // count the powr separately
    7612        35268 :         state.dataVariableSpeedCoils->Winput *=
    7613        17634 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac; //+ VarSpeedCoil(DXCoilNum)%CrankcaseHeaterPower
    7614        17634 :         state.dataVariableSpeedCoils->QSource *= PartLoadRatio;
    7615        17634 :         QWasteHeat *= PartLoadRatio;
    7616              : 
    7617              :         // Update heat pump data structure
    7618        17634 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Power = state.dataVariableSpeedCoils->Winput;
    7619        17634 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QLoadTotal = state.dataVariableSpeedCoils->QLoadTotal;
    7620        17634 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QSensible = state.dataVariableSpeedCoils->QSensible;
    7621        17634 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QSource = state.dataVariableSpeedCoils->QSource;
    7622        17634 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Energy = state.dataVariableSpeedCoils->Winput * TimeStepSysSec;
    7623        17634 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergyLoadTotal = state.dataVariableSpeedCoils->QLoadTotal * TimeStepSysSec;
    7624        17634 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergySensible = state.dataVariableSpeedCoils->QSensible * TimeStepSysSec;
    7625        17634 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergyLatent = 0.0;
    7626        17634 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergySource = state.dataVariableSpeedCoils->QSource * TimeStepSysSec;
    7627        17634 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterConsumption =
    7628        17634 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterPower * TimeStepSysSec;
    7629        17634 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostConsumption =
    7630        17634 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostPower * TimeStepSysSec;
    7631        17634 :         if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac == 0.0) {
    7632            0 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).COP = 0.0;
    7633              :         } else {
    7634        17634 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).COP =
    7635        17634 :                 state.dataVariableSpeedCoils->QLoadTotal / state.dataVariableSpeedCoils->Winput;
    7636              :         }
    7637        17634 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PartLoadRatio = PartLoadRatio;
    7638        17634 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirMassFlowRate = state.dataVariableSpeedCoils->PLRCorrLoadSideMdot;
    7639        17634 :         rhoair = Psychrometrics::PsyRhoAirFnPbTdbW(state,
    7640        17634 :                                                    state.dataEnvrn->OutBaroPress,
    7641        17634 :                                                    state.dataVariableSpeedCoils->LoadSideInletDBTemp,
    7642        17634 :                                                    state.dataVariableSpeedCoils->LoadSideInletHumRat,
    7643              :                                                    RoutineName);
    7644        17634 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirVolFlowRate =
    7645        17634 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirMassFlowRate / rhoair;
    7646              : 
    7647        17634 :         if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_HeatingAirToAirVariableSpeed) {
    7648           23 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterMassFlowRate = 0.0;
    7649           23 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletWaterTemp = 0.0;
    7650           23 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletWaterEnthalpy = 0.0;
    7651              :         } else {
    7652        17611 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterMassFlowRate = state.dataVariableSpeedCoils->SourceSideMassFlowRate;
    7653        17611 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletWaterTemp =
    7654        17611 :                 state.dataVariableSpeedCoils->SourceSideInletTemp -
    7655        17611 :                 state.dataVariableSpeedCoils->QSource / (state.dataVariableSpeedCoils->SourceSideMassFlowRate * CpSource);
    7656        17611 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletWaterEnthalpy =
    7657        17611 :                 state.dataVariableSpeedCoils->SourceSideInletEnth -
    7658        17611 :                 state.dataVariableSpeedCoils->QSource / state.dataVariableSpeedCoils->SourceSideMassFlowRate;
    7659              :         }
    7660              : 
    7661        17634 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QWasteHeat = QWasteHeat;
    7662              :     }
    7663              : 
    7664            8 :     Real64 GetCoilCapacityVariableSpeed(EnergyPlusData &state,
    7665              :                                         std::string const &CoilType, // must match coil types in this module
    7666              :                                         std::string const &CoilName, // must match coil names for the coil type
    7667              :                                         bool &ErrorsFound            // set to true if problem
    7668              :     )
    7669              :     {
    7670              : 
    7671              :         // FUNCTION INFORMATION:
    7672              :         //       AUTHOR         Bo Shen, based on WaterToAirHeatPumpSimple:GetCoilCapacity
    7673              :         //       DATE WRITTEN   March 2012
    7674              : 
    7675              :         // PURPOSE OF THIS FUNCTION:
    7676              :         // This function looks up the rated coil capacity at the nominal speed level for the given coil and returns it.  If
    7677              :         // incorrect coil type or name is given, ErrorsFound is returned as true and capacity is returned
    7678              :         // as negative.
    7679              : 
    7680              :         // Return value
    7681              :         Real64 CoilCapacity; // returned capacity of matched coil
    7682              : 
    7683              :         // FUNCTION LOCAL VARIABLE DECLARATIONS:
    7684              :         int WhichCoil;
    7685              : 
    7686              :         // Obtains and Allocates WatertoAirHP related parameters from input file
    7687            8 :         if (state.dataVariableSpeedCoils->GetCoilsInputFlag) { // First time subroutine has been entered
    7688            0 :             GetVarSpeedCoilInput(state);
    7689            0 :             state.dataVariableSpeedCoils->GetCoilsInputFlag = false;
    7690              :         }
    7691              : 
    7692           14 :         if (Util::SameString(CoilType, "COIL:COOLING:WATERTOAIRHEATPUMP:VARIABLESPEEDEQUATIONFIT") ||
    7693           12 :             Util::SameString(CoilType, "COIL:HEATING:WATERTOAIRHEATPUMP:VARIABLESPEEDEQUATIONFIT") ||
    7694           20 :             Util::SameString(CoilType, "COIL:COOLING:DX:VARIABLESPEED") || Util::SameString(CoilType, "COIL:HEATING:DX:VARIABLESPEED") ||
    7695            8 :             Util::SameString(CoilType, "COIL:WATERHEATING:AIRTOWATERHEATPUMP:VARIABLESPEED")) {
    7696            8 :             WhichCoil = Util::FindItemInList(CoilName, state.dataVariableSpeedCoils->VarSpeedCoil);
    7697            8 :             if (WhichCoil != 0) {
    7698           16 :                 if (Util::SameString(CoilType, "COIL:HEATING:WATERTOAIRHEATPUMP:VARIABLESPEEDEQUATIONFIT") ||
    7699           16 :                     Util::SameString(CoilType, "COIL:HEATING:DX:VARIABLESPEED")) {
    7700            0 :                     CoilCapacity = state.dataVariableSpeedCoils->VarSpeedCoil(WhichCoil).RatedCapHeat;
    7701            8 :                 } else if (Util::SameString(CoilType, "COIL:WATERHEATING:AIRTOWATERHEATPUMP:VARIABLESPEED")) {
    7702            0 :                     CoilCapacity = state.dataVariableSpeedCoils->VarSpeedCoil(WhichCoil).RatedCapWH;
    7703              :                 } else {
    7704            8 :                     CoilCapacity = state.dataVariableSpeedCoils->VarSpeedCoil(WhichCoil).RatedCapCoolTotal;
    7705              :                 }
    7706              :             }
    7707              :         } else {
    7708            0 :             WhichCoil = 0;
    7709              :         }
    7710              : 
    7711            8 :         if (WhichCoil == 0) {
    7712            0 :             ShowSevereError(state, format("GetCoilCapacityVariableSpeed: Could not find CoilType=\"{}\" with Name=\"{}\"", CoilType, CoilName));
    7713            0 :             ErrorsFound = true;
    7714            0 :             CoilCapacity = -1000.0;
    7715              :         }
    7716              : 
    7717            8 :         return CoilCapacity;
    7718              :     }
    7719              : 
    7720           27 :     int GetCoilIndexVariableSpeed(EnergyPlusData &state,
    7721              :                                   std::string const &CoilType, // must match coil types in this module
    7722              :                                   std::string const &CoilName, // must match coil names for the coil type
    7723              :                                   bool &ErrorsFound            // set to true if problem
    7724              :     )
    7725              :     {
    7726              : 
    7727              :         // FUNCTION INFORMATION:
    7728              :         //       AUTHOR         Bo Shen, based on WaterToAirHeatPumpSimple:GetCoilIndex
    7729              :         //       DATE WRITTEN   March 2012
    7730              : 
    7731              :         // PURPOSE OF THIS FUNCTION:
    7732              :         // This function looks up the coil index for the given coil and returns it.  If incorrect
    7733              :         // coil type or name is given, ErrorsFound is returned as true and index is returned as zero.
    7734              : 
    7735              :         // Return value
    7736              :         int IndexNum; // returned index of matched coil
    7737              : 
    7738              :         // Obtains and Allocates WatertoAirHP related parameters from input file
    7739           27 :         if (state.dataVariableSpeedCoils->GetCoilsInputFlag) { // First time subroutine has been entered
    7740           13 :             GetVarSpeedCoilInput(state);
    7741           13 :             state.dataVariableSpeedCoils->GetCoilsInputFlag = false;
    7742              :         }
    7743              : 
    7744           27 :         IndexNum = Util::FindItemInList(CoilName, state.dataVariableSpeedCoils->VarSpeedCoil);
    7745              : 
    7746           27 :         if (IndexNum == 0) {
    7747            0 :             ShowSevereError(state, format("GetCoilIndexVariableSpeed: Could not find CoilType=\"{}\" with Name=\"{}\"", CoilType, CoilName));
    7748            0 :             ErrorsFound = true;
    7749              :         }
    7750              : 
    7751           27 :         return IndexNum;
    7752              :     }
    7753              : 
    7754            1 :     Real64 GetCoilAirFlowRateVariableSpeed(EnergyPlusData &state,
    7755              :                                            std::string const &CoilType, // must match coil types in this module
    7756              :                                            std::string const &CoilName, // must match coil names for the coil type
    7757              :                                            bool &ErrorsFound            // set to true if problem
    7758              :     )
    7759              :     {
    7760              : 
    7761              :         // FUNCTION INFORMATION:
    7762              :         //       AUTHOR         Bo Shen, based on WaterToAirHeatPumpSimple:GetCoilAirFlowRate
    7763              :         //       DATE WRITTEN   March 2012
    7764              : 
    7765              :         // PURPOSE OF THIS FUNCTION:
    7766              :         // This function looks up the max coil air flow rate for the given coil and returns it.  If incorrect
    7767              :         // coil type or name is given, ErrorsFound is returned as true and capacity is returned as negative.
    7768              : 
    7769              :         // Return value
    7770              :         Real64 CoilAirFlowRate; // returned air volume flow rate of matched coil
    7771              : 
    7772              :         // FUNCTION LOCAL VARIABLE DECLARATIONS:
    7773              :         int WhichCoil;
    7774              : 
    7775              :         // Obtains and Allocates WatertoAirHP related parameters from input file
    7776            1 :         if (state.dataVariableSpeedCoils->GetCoilsInputFlag) { // First time subroutine has been entered
    7777            0 :             GetVarSpeedCoilInput(state);
    7778            0 :             state.dataVariableSpeedCoils->GetCoilsInputFlag = false;
    7779              :         }
    7780              : 
    7781            2 :         if (Util::SameString(CoilType, "COIL:COOLING:WATERTOAIRHEATPUMP:VARIABLESPEEDEQUATIONFIT") ||
    7782            2 :             Util::SameString(CoilType, "COIL:HEATING:WATERTOAIRHEATPUMP:VARIABLESPEEDEQUATIONFIT") ||
    7783            3 :             Util::SameString(CoilType, "COIL:COOLING:DX:VARIABLESPEED") || Util::SameString(CoilType, "COIL:HEATING:DX:VARIABLESPEED") ||
    7784            1 :             Util::SameString(CoilType, "COIL:WATERHEATING:AIRTOWATERHEATPUMP:VARIABLESPEED")) {
    7785            1 :             WhichCoil = Util::FindItemInList(CoilName, state.dataVariableSpeedCoils->VarSpeedCoil);
    7786            1 :             if (WhichCoil != 0) {
    7787            1 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(WhichCoil).RatedAirVolFlowRate == DataSizing::AutoSize) { // means autosize
    7788            0 :                     CoilAirFlowRate = state.dataVariableSpeedCoils->VarSpeedCoil(WhichCoil).RatedAirVolFlowRate;
    7789              :                 } else {
    7790            1 :                     CoilAirFlowRate = state.dataVariableSpeedCoils->VarSpeedCoil(WhichCoil).MSRatedAirVolFlowRate(
    7791            1 :                                           state.dataVariableSpeedCoils->VarSpeedCoil(WhichCoil).NumOfSpeeds) /
    7792            1 :                                       state.dataVariableSpeedCoils->VarSpeedCoil(WhichCoil).MSRatedAirVolFlowRate(
    7793            1 :                                           state.dataVariableSpeedCoils->VarSpeedCoil(WhichCoil).NormSpedLevel) *
    7794            1 :                                       state.dataVariableSpeedCoils->VarSpeedCoil(WhichCoil).RatedAirVolFlowRate;
    7795              :                 } // use largest air flow rate
    7796              :             }
    7797              :         } else {
    7798            0 :             WhichCoil = 0;
    7799              :         }
    7800              : 
    7801            1 :         if (WhichCoil == 0) {
    7802            0 :             ShowSevereError(state, format("GetCoilAirFlowRateVariableSpeed: Could not find CoilType=\"{}\" with Name=\"{}\"", CoilType, CoilName));
    7803            0 :             ErrorsFound = true;
    7804            0 :             CoilAirFlowRate = -1000.0;
    7805              :         }
    7806              : 
    7807            1 :         return CoilAirFlowRate;
    7808              :     }
    7809              : 
    7810            0 :     int GetVSCoilPLFFPLR(EnergyPlusData &state,
    7811              :                          std::string const &CoilType, // must match coil types in this module
    7812              :                          std::string const &CoilName, // must match coil names for the coil type
    7813              :                          bool &ErrorsFound            // set to true if problem
    7814              :     )
    7815              :     {
    7816              : 
    7817              :         // FUNCTION INFORMATION:
    7818              :         //       AUTHOR         Bo Shen
    7819              :         //       DATE WRITTEN   12/2014
    7820              : 
    7821              :         // PURPOSE OF THIS FUNCTION:
    7822              :         // This function looks up the given coil and returns PLR curve index.  If incorrect
    7823              :         // coil type or name is given, ErrorsFound is returned as true and value is returned as zero.
    7824              : 
    7825              :         // Return value
    7826              :         int PLRNumber; // returned outlet node of matched coil
    7827              : 
    7828              :         // FUNCTION LOCAL VARIABLE DECLARATIONS:
    7829              :         int WhichCoil;
    7830              : 
    7831              :         // Obtains and Allocates WatertoAirHP related parameters from input file
    7832            0 :         if (state.dataVariableSpeedCoils->GetCoilsInputFlag) { // First time subroutine has been entered
    7833            0 :             GetVarSpeedCoilInput(state);
    7834            0 :             state.dataVariableSpeedCoils->GetCoilsInputFlag = false;
    7835              :         }
    7836              : 
    7837            0 :         WhichCoil = Util::FindItemInList(CoilName, state.dataVariableSpeedCoils->VarSpeedCoil);
    7838            0 :         if (WhichCoil != 0) {
    7839            0 :             PLRNumber = state.dataVariableSpeedCoils->VarSpeedCoil(WhichCoil).PLFFPLR;
    7840              :         }
    7841              : 
    7842            0 :         if (WhichCoil == 0) {
    7843            0 :             ShowSevereError(state, format("GetVSCoilPLFFPLR: Could not find CoilType=\"{}\" with Name=\"{}\"", CoilType, CoilName));
    7844            0 :             ErrorsFound = true;
    7845            0 :             PLRNumber = 0;
    7846              :         }
    7847              : 
    7848            0 :         return PLRNumber;
    7849              :     }
    7850              : 
    7851            5 :     int GetVSCoilCapFTCurveIndex(EnergyPlusData &state,
    7852              :                                  int const CoilIndex, // must match coil names for the coil type
    7853              :                                  bool &ErrorsFound    // set to true if problem
    7854              :     )
    7855              :     {
    7856              : 
    7857              :         // FUNCTION INFORMATION:
    7858              :         //       AUTHOR         Richard Raustad
    7859              :         //       DATE WRITTEN   7/2017
    7860              : 
    7861              :         // PURPOSE OF THIS FUNCTION:
    7862              :         // This function looks up the given coil and returns CapFT curve index.  If incorrect
    7863              :         // coil index is given, ErrorsFound is returned as true and value is returned as zero.
    7864              : 
    7865              :         // Return value
    7866              :         int CapFTIndex; // returned CapFT curve index of matched coil
    7867              : 
    7868              :         // Obtains and Allocates WatertoAirHP related parameters from input file
    7869            5 :         if (state.dataVariableSpeedCoils->GetCoilsInputFlag) { // First time subroutine has been entered
    7870            0 :             GetVarSpeedCoilInput(state);
    7871            0 :             state.dataVariableSpeedCoils->GetCoilsInputFlag = false;
    7872              :         }
    7873              : 
    7874            5 :         if (CoilIndex == 0) {
    7875            0 :             ShowSevereError(state, "GetVSCoilCapFTCurveIndex: Could not find Coil");
    7876            0 :             ErrorsFound = true;
    7877            0 :             CapFTIndex = 0;
    7878              :         } else {
    7879            5 :             CapFTIndex =
    7880            5 :                 state.dataVariableSpeedCoils->VarSpeedCoil(CoilIndex).MSCCapFTemp(state.dataVariableSpeedCoils->VarSpeedCoil(CoilIndex).NumOfSpeeds);
    7881              :         }
    7882              : 
    7883            5 :         return CapFTIndex;
    7884              :     }
    7885              : 
    7886            1 :     int GetCoilInletNodeVariableSpeed(EnergyPlusData &state,
    7887              :                                       std::string const &CoilType, // must match coil types in this module
    7888              :                                       std::string const &CoilName, // must match coil names for the coil type
    7889              :                                       bool &ErrorsFound            // set to true if problem
    7890              :     )
    7891              :     {
    7892              : 
    7893              :         // FUNCTION INFORMATION:
    7894              :         //       AUTHOR         Bo Shen, based on WaterToAirHeatPumpSimple:GetCoilInletNode
    7895              :         //       DATE WRITTEN   March 2012
    7896              : 
    7897              :         // PURPOSE OF THIS FUNCTION:
    7898              :         // This function looks up the given coil and returns the inlet node.  If incorrect
    7899              :         // coil type or name is given, ErrorsFound is returned as true and value is returned as zero.
    7900              : 
    7901              :         // Return value
    7902              :         int NodeNumber; // returned outlet node of matched coil
    7903              : 
    7904              :         // FUNCTION LOCAL VARIABLE DECLARATIONS:
    7905              :         int WhichCoil;
    7906              : 
    7907              :         // Obtains and Allocates WatertoAirHP related parameters from input file
    7908            1 :         if (state.dataVariableSpeedCoils->GetCoilsInputFlag) { // First time subroutine has been entered
    7909            0 :             GetVarSpeedCoilInput(state);
    7910            0 :             state.dataVariableSpeedCoils->GetCoilsInputFlag = false;
    7911              :         }
    7912              : 
    7913            1 :         WhichCoil = Util::FindItemInList(CoilName, state.dataVariableSpeedCoils->VarSpeedCoil);
    7914            1 :         if (WhichCoil != 0) {
    7915            1 :             NodeNumber = state.dataVariableSpeedCoils->VarSpeedCoil(WhichCoil).AirInletNodeNum;
    7916              :         }
    7917              : 
    7918            1 :         if (WhichCoil == 0) {
    7919            0 :             ShowSevereError(state, format("GetCoilInletNodeVariableSpeed: Could not find CoilType=\"{}\" with Name=\"{}\"", CoilType, CoilName));
    7920            0 :             ErrorsFound = true;
    7921            0 :             NodeNumber = 0;
    7922              :         }
    7923              : 
    7924            1 :         return NodeNumber;
    7925              :     }
    7926              : 
    7927            4 :     int GetCoilOutletNodeVariableSpeed(EnergyPlusData &state,
    7928              :                                        std::string const &CoilType, // must match coil types in this module
    7929              :                                        std::string const &CoilName, // must match coil names for the coil type
    7930              :                                        bool &ErrorsFound            // set to true if problem
    7931              :     )
    7932              :     {
    7933              : 
    7934              :         // FUNCTION INFORMATION:
    7935              :         //       AUTHOR         Bo Shen, based on WaterToAirHeatPumpSimple:GetCoilOutletNode
    7936              :         //       DATE WRITTEN   March 2012
    7937              : 
    7938              :         // PURPOSE OF THIS FUNCTION:
    7939              :         // This function looks up the given coil and returns the outlet node.  If incorrect
    7940              :         // coil type or name is given, ErrorsFound is returned as true and value is returned as zero.
    7941              : 
    7942              :         // Return value
    7943              :         int NodeNumber; // returned outlet node of matched coil
    7944              : 
    7945              :         // FUNCTION LOCAL VARIABLE DECLARATIONS:
    7946              :         int WhichCoil;
    7947              : 
    7948              :         // Obtains and Allocates WatertoAirHP related parameters from input file
    7949            4 :         if (state.dataVariableSpeedCoils->GetCoilsInputFlag) { // First time subroutine has been entered
    7950            3 :             GetVarSpeedCoilInput(state);
    7951            3 :             state.dataVariableSpeedCoils->GetCoilsInputFlag = false;
    7952              :         }
    7953              : 
    7954            4 :         WhichCoil = Util::FindItemInList(CoilName, state.dataVariableSpeedCoils->VarSpeedCoil);
    7955            4 :         if (WhichCoil != 0) {
    7956            4 :             NodeNumber = state.dataVariableSpeedCoils->VarSpeedCoil(WhichCoil).AirOutletNodeNum;
    7957              :         }
    7958              : 
    7959            4 :         if (WhichCoil == 0) {
    7960            0 :             ShowSevereError(state, format("GetCoilOutletNodeVariableSpeed: Could not find CoilType=\"{}\" with Name=\"{}\"", CoilType, CoilName));
    7961            0 :             ErrorsFound = true;
    7962            0 :             NodeNumber = 0;
    7963              :         }
    7964              : 
    7965            4 :         return NodeNumber;
    7966              :     }
    7967              : 
    7968            8 :     int GetVSCoilCondenserInletNode(EnergyPlusData &state,
    7969              :                                     std::string const &CoilName, // must match coil names for the coil type
    7970              :                                     bool &ErrorsFound            // set to true if problem
    7971              :     )
    7972              :     {
    7973              : 
    7974              :         // FUNCTION INFORMATION:
    7975              :         //       AUTHOR         Bo Shen, based on DXCoil:GetCoilCondenserInletNode
    7976              :         //       DATE WRITTEN   July 2012
    7977              : 
    7978              :         // PURPOSE OF THIS FUNCTION:
    7979              :         // This function looks up the given coil and returns the condenser inlet node.  If
    7980              :         // incorrect coil  name is given, ErrorsFound is returned as true.
    7981              : 
    7982              :         // Return value
    7983              :         int CondNode; // returned condenser node number of matched coil
    7984              : 
    7985              :         // FUNCTION LOCAL VARIABLE DECLARATIONS:
    7986              :         int WhichCoil;
    7987              : 
    7988              :         // Obtains and Allocates WatertoAirHP related parameters from input file
    7989            8 :         if (state.dataVariableSpeedCoils->GetCoilsInputFlag) { // First time subroutine has been entered
    7990            0 :             GetVarSpeedCoilInput(state);
    7991            0 :             state.dataVariableSpeedCoils->GetCoilsInputFlag = false;
    7992              :         }
    7993              : 
    7994            8 :         WhichCoil = Util::FindItemInList(CoilName, state.dataVariableSpeedCoils->VarSpeedCoil);
    7995            8 :         if (WhichCoil != 0) {
    7996            8 :             CondNode = state.dataVariableSpeedCoils->VarSpeedCoil(WhichCoil).CondenserInletNodeNum;
    7997              :         } else {
    7998            0 :             ShowSevereError(state, format("GetCoilCondenserInletNode: Invalid VS DX Coil, Type= VS DX Cooling Name=\"{}\"", CoilName));
    7999            0 :             ErrorsFound = true;
    8000            0 :             CondNode = 0;
    8001              :         }
    8002              : 
    8003            8 :         return CondNode;
    8004              :     }
    8005              : 
    8006           13 :     Real64 GetVSCoilMinOATCompressor(EnergyPlusData &state,
    8007              :                                      int const CoilIndex, // index to cooling coil
    8008              :                                      bool &ErrorsFound    // set to true if problem
    8009              :     )
    8010              :     {
    8011              :         // Obtains and Allocates WatertoAirHP related parameters from input file
    8012           13 :         if (state.dataVariableSpeedCoils->GetCoilsInputFlag) { // First time subroutine has been entered
    8013            0 :             GetVarSpeedCoilInput(state);
    8014            0 :             state.dataVariableSpeedCoils->GetCoilsInputFlag = false;
    8015              :         }
    8016              : 
    8017           13 :         if (CoilIndex == 0) {
    8018            0 :             ShowSevereError(state, "GetVSCoilMinOATCompressor: Index passed = 0");
    8019            0 :             ShowContinueError(state, "... returning Min OAT as -1000.");
    8020            0 :             ErrorsFound = true;
    8021            0 :             return -1000.0;
    8022              :         } else {
    8023           13 :             return state.dataVariableSpeedCoils->VarSpeedCoil(CoilIndex).MinOATCompressor;
    8024              :         }
    8025              :     }
    8026              : 
    8027            7 :     int GetVSCoilNumOfSpeeds(EnergyPlusData &state,
    8028              :                              std::string const &CoilName, // must match coil names for the coil type
    8029              :                              bool &ErrorsFound            // set to true if problem
    8030              :     )
    8031              :     {
    8032              : 
    8033              :         // FUNCTION INFORMATION:
    8034              :         //       AUTHOR         Richard Raustad, FSEC
    8035              :         //       DATE WRITTEN   March 2013
    8036              : 
    8037              :         // PURPOSE OF THIS FUNCTION:
    8038              :         // This function looks up the given coil and returns number of speeds.  If
    8039              :         // incorrect coil name is given, ErrorsFound is returned as true.
    8040              : 
    8041              :         // Return value
    8042              :         int Speeds; // returned number of speeds
    8043              : 
    8044              :         // Obtains and Allocates WatertoAirHP related parameters from input file
    8045            7 :         if (state.dataVariableSpeedCoils->GetCoilsInputFlag) { // First time subroutine has been entered
    8046            0 :             GetVarSpeedCoilInput(state);
    8047            0 :             state.dataVariableSpeedCoils->GetCoilsInputFlag = false;
    8048              :         }
    8049              : 
    8050            7 :         int WhichCoil = Util::FindItemInList(CoilName, state.dataVariableSpeedCoils->VarSpeedCoil);
    8051            7 :         if (WhichCoil != 0) {
    8052            7 :             Speeds = state.dataVariableSpeedCoils->VarSpeedCoil(WhichCoil).NumOfSpeeds;
    8053              :         } else {
    8054            0 :             ShowSevereError(state, format("GetVSCoilNumOfSpeeds: Invalid VS DX Coil, Type= VS DX Coil Name=\"{}\"", CoilName));
    8055            0 :             ErrorsFound = true;
    8056            0 :             Speeds = 0;
    8057              :         }
    8058              : 
    8059            7 :         return Speeds;
    8060              :     }
    8061              : 
    8062           28 :     Real64 GetVSCoilRatedSourceTemp(EnergyPlusData &state, int const CoilIndex)
    8063              :     {
    8064           28 :         Real64 RatedSourceTemp = 0.0;
    8065           28 :         switch (state.dataVariableSpeedCoils->VarSpeedCoil(CoilIndex).VSCoilType) {
    8066            7 :         case HVAC::Coil_CoolingWaterToAirHPVSEquationFit: {
    8067            7 :             RatedSourceTemp = RatedInletWaterTemp;
    8068            7 :         } break;
    8069            3 :         case HVAC::Coil_HeatingWaterToAirHPVSEquationFit: {
    8070            3 :             RatedSourceTemp = RatedInletWaterTempHeat;
    8071            3 :         } break;
    8072            1 :         case HVAC::CoilDX_HeatPumpWaterHeaterVariableSpeed: {
    8073            1 :             RatedSourceTemp = state.dataVariableSpeedCoils->VarSpeedCoil(CoilIndex).WHRatedInletWaterTemp;
    8074            1 :         } break;
    8075           12 :         case HVAC::Coil_CoolingAirToAirVariableSpeed: {
    8076           12 :             RatedSourceTemp = RatedAmbAirTemp;
    8077           12 :         } break;
    8078            5 :         case HVAC::Coil_HeatingAirToAirVariableSpeed: {
    8079            5 :             RatedSourceTemp = RatedAmbAirTempHeat;
    8080            5 :         } break;
    8081            0 :         default: {
    8082            0 :             assert(false);
    8083              :         } break;
    8084              :         }
    8085           28 :         return RatedSourceTemp;
    8086              :     }
    8087              : 
    8088           12 :     void SetVarSpeedCoilData(EnergyPlusData &state,
    8089              :                              int const WSHPNum,                               // Number of OA Controller
    8090              :                              bool &ErrorsFound,                               // Set to true if certain errors found
    8091              :                              ObjexxFCL::Optional_int CompanionCoolingCoilNum, // Index to cooling coil for heating coil = SimpleWSHPNum
    8092              :                              ObjexxFCL::Optional_int CompanionHeatingCoilNum, // Index to heating coil for cooling coil = SimpleWSHPNum
    8093              :                              ObjexxFCL::Optional_int MSHPDesignSpecIndex      // index to UnitarySystemPerformance:Multispeed object
    8094              :     )
    8095              :     {
    8096              : 
    8097              :         // SUBROUTINE INFORMATION:
    8098              :         //       AUTHOR         Bo Shen, based on WaterToAirHeatPumpSimple:SetWSHPData
    8099              :         //       DATE WRITTEN   March 2012
    8100              : 
    8101              :         // PURPOSE OF THIS SUBROUTINE:
    8102              :         // This routine was designed to "push" information from a parent object to this WSHP coil object.
    8103              : 
    8104              :         // Obtains and Allocates WatertoAirHP related parameters from input file
    8105           12 :         if (state.dataVariableSpeedCoils->GetCoilsInputFlag) { // First time subroutine has been entered
    8106            0 :             GetVarSpeedCoilInput(state);
    8107            0 :             state.dataVariableSpeedCoils->GetCoilsInputFlag = false;
    8108              :         }
    8109              : 
    8110           12 :         if (WSHPNum <= 0 || WSHPNum > state.dataVariableSpeedCoils->NumVarSpeedCoils) {
    8111            0 :             ShowSevereError(state,
    8112            0 :                             format("SetVarSpeedCoilData: called with VS WSHP Coil Number out of range={} should be >0 and <{}",
    8113              :                                    WSHPNum,
    8114            0 :                                    state.dataVariableSpeedCoils->NumVarSpeedCoils));
    8115            0 :             ErrorsFound = true;
    8116            0 :             return;
    8117              :         }
    8118              : 
    8119           12 :         if (present(CompanionCoolingCoilNum)) {
    8120            0 :             state.dataVariableSpeedCoils->VarSpeedCoil(WSHPNum).CompanionCoolingCoilNum = CompanionCoolingCoilNum;
    8121            0 :             state.dataVariableSpeedCoils->VarSpeedCoil(WSHPNum).FindCompanionUpStreamCoil = true;
    8122            0 :             state.dataVariableSpeedCoils->VarSpeedCoil(CompanionCoolingCoilNum).CompanionHeatingCoilNum = WSHPNum;
    8123              :         }
    8124              : 
    8125           12 :         if (present(CompanionHeatingCoilNum)) {
    8126            1 :             state.dataVariableSpeedCoils->VarSpeedCoil(WSHPNum).CompanionHeatingCoilNum = CompanionHeatingCoilNum;
    8127            1 :             state.dataVariableSpeedCoils->VarSpeedCoil(CompanionHeatingCoilNum).CompanionCoolingCoilNum = WSHPNum;
    8128              :         }
    8129              : 
    8130           12 :         if (present(MSHPDesignSpecIndex)) {
    8131           11 :             state.dataVariableSpeedCoils->VarSpeedCoil(WSHPNum).MSHPDesignSpecIndex = MSHPDesignSpecIndex;
    8132              :         }
    8133              :     }
    8134              : 
    8135        67679 :     void UpdateVarSpeedCoil(EnergyPlusData &state, int const DXCoilNum)
    8136              :     {
    8137              :         // SUBROUTINE INFORMATION:
    8138              :         //       AUTHOR         Bo Shen, based on WaterToAirHeatPumpSimple:UpdateSimpleWSHP
    8139              :         //       DATE WRITTEN   March 2012
    8140              : 
    8141              :         // PURPOSE OF THIS SUBROUTINE:
    8142              :         // This subroutine updates the Water to Air Heat Pump outlet nodes.
    8143              : 
    8144              :         // METHODOLOGY EMPLOYED:
    8145              :         // Data is moved from the HP data structure to the HP outlet nodes.
    8146              : 
    8147              :         // Using/Aliasing
    8148        67679 :         Real64 TimeStepSysSec = state.dataHVACGlobal->TimeStepSysSec;
    8149              : 
    8150        67679 :         auto &varSpeedCoil = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum);
    8151              : 
    8152              :         // WatertoAirHP(DXCoilNum)%SimFlag=.FALSE.
    8153        67679 :         if (!varSpeedCoil.SimFlag) {
    8154              :             // Heatpump is off; just pass through conditions
    8155        39555 :             varSpeedCoil.Power = 0.0;
    8156        39555 :             varSpeedCoil.QLoadTotal = 0.0;
    8157        39555 :             varSpeedCoil.QSensible = 0.0;
    8158        39555 :             varSpeedCoil.QLatent = 0.0;
    8159        39555 :             varSpeedCoil.QSource = 0.0;
    8160        39555 :             varSpeedCoil.Energy = 0.0;
    8161        39555 :             varSpeedCoil.EnergyLoadTotal = 0.0;
    8162        39555 :             varSpeedCoil.EnergySensible = 0.0;
    8163        39555 :             varSpeedCoil.EnergyLatent = 0.0;
    8164        39555 :             varSpeedCoil.EnergySource = 0.0;
    8165        39555 :             varSpeedCoil.COP = 0.0;
    8166        39555 :             varSpeedCoil.RunFrac = 0.0;
    8167        39555 :             varSpeedCoil.PartLoadRatio = 0.0;
    8168              : 
    8169        39555 :             varSpeedCoil.OutletAirDBTemp = varSpeedCoil.InletAirDBTemp;
    8170        39555 :             varSpeedCoil.OutletAirHumRat = varSpeedCoil.InletAirHumRat;
    8171        39555 :             varSpeedCoil.OutletAirEnthalpy = varSpeedCoil.InletAirEnthalpy;
    8172        39555 :             varSpeedCoil.OutletWaterTemp = varSpeedCoil.InletWaterTemp;
    8173        39555 :             varSpeedCoil.OutletWaterEnthalpy = varSpeedCoil.InletWaterEnthalpy;
    8174              :         }
    8175              : 
    8176        67679 :         int AirInletNode = varSpeedCoil.AirInletNodeNum;
    8177        67679 :         int WaterInletNode = varSpeedCoil.WaterInletNodeNum;
    8178        67679 :         int AirOutletNode = varSpeedCoil.AirOutletNodeNum;
    8179        67679 :         int WaterOutletNode = varSpeedCoil.WaterOutletNodeNum;
    8180              : 
    8181              :         // Set the air outlet  nodes of the WatertoAirHPSimple
    8182        67679 :         state.dataLoopNodes->Node(AirOutletNode).MassFlowRate = state.dataLoopNodes->Node(AirInletNode).MassFlowRate; // LoadSideMassFlowRate
    8183        67679 :         state.dataLoopNodes->Node(AirOutletNode).Temp = varSpeedCoil.OutletAirDBTemp;
    8184        67679 :         state.dataLoopNodes->Node(AirOutletNode).HumRat = varSpeedCoil.OutletAirHumRat;
    8185        67679 :         state.dataLoopNodes->Node(AirOutletNode).Enthalpy = varSpeedCoil.OutletAirEnthalpy;
    8186              : 
    8187              :         // Set the air outlet nodes for properties that just pass through & not used
    8188        67679 :         state.dataLoopNodes->Node(AirOutletNode).Quality = state.dataLoopNodes->Node(AirInletNode).Quality;
    8189        67679 :         state.dataLoopNodes->Node(AirOutletNode).Press = state.dataLoopNodes->Node(AirInletNode).Press;
    8190        67679 :         state.dataLoopNodes->Node(AirOutletNode).MassFlowRateMin = state.dataLoopNodes->Node(AirInletNode).MassFlowRateMin;
    8191        67679 :         state.dataLoopNodes->Node(AirOutletNode).MassFlowRateMax = state.dataLoopNodes->Node(AirInletNode).MassFlowRateMax; // LoadSideMassFlowRate
    8192        67679 :         state.dataLoopNodes->Node(AirOutletNode).MassFlowRateMinAvail = state.dataLoopNodes->Node(AirInletNode).MassFlowRateMinAvail;
    8193        67679 :         state.dataLoopNodes->Node(AirOutletNode).MassFlowRateMaxAvail =
    8194        67679 :             state.dataLoopNodes->Node(AirInletNode).MassFlowRateMaxAvail; // LoadSideMassFlowRate
    8195              : 
    8196              :         // Set the water outlet node of the WatertoAirHPSimple
    8197              :         // Set the water outlet nodes for properties that just pass through & not used
    8198        67679 :         if (WaterInletNode != 0 && WaterOutletNode != 0) {
    8199        67273 :             PlantUtilities::SafeCopyPlantNode(state, WaterInletNode, WaterOutletNode);
    8200        67273 :             state.dataLoopNodes->Node(WaterOutletNode).Temp = varSpeedCoil.OutletWaterTemp;
    8201        67273 :             state.dataLoopNodes->Node(WaterOutletNode).Enthalpy = varSpeedCoil.OutletWaterEnthalpy;
    8202              :         }
    8203              : 
    8204        67679 :         varSpeedCoil.Energy = varSpeedCoil.Power * TimeStepSysSec;
    8205        67679 :         varSpeedCoil.EnergyLoadTotal = varSpeedCoil.QLoadTotal * TimeStepSysSec;
    8206        67679 :         varSpeedCoil.EnergySensible = varSpeedCoil.QSensible * TimeStepSysSec;
    8207        67679 :         varSpeedCoil.EnergyLatent = varSpeedCoil.QLatent * TimeStepSysSec;
    8208        67679 :         varSpeedCoil.EnergySource = varSpeedCoil.QSource * TimeStepSysSec;
    8209              : 
    8210        67679 :         if (state.dataContaminantBalance->Contaminant.CO2Simulation) {
    8211            1 :             state.dataLoopNodes->Node(AirOutletNode).CO2 = state.dataLoopNodes->Node(AirInletNode).CO2;
    8212              :         }
    8213              : 
    8214        67679 :         if (state.dataContaminantBalance->Contaminant.GenericContamSimulation) {
    8215            1 :             state.dataLoopNodes->Node(AirOutletNode).GenContam = state.dataLoopNodes->Node(AirInletNode).GenContam;
    8216              :         }
    8217              : 
    8218        67679 :         if (varSpeedCoil.reportCoilFinalSizes) {
    8219           23 :             if (!state.dataGlobal->WarmupFlag && !state.dataGlobal->DoingHVACSizingSimulations && !state.dataGlobal->DoingSizing) {
    8220           19 :                 if (varSpeedCoil.VSCoilType == HVAC::Coil_CoolingWaterToAirHPVSEquationFit ||
    8221           17 :                     varSpeedCoil.VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed) { // cooling coil
    8222           13 :                     state.dataRptCoilSelection->coilSelectionReportObj->setCoilFinalSizes(state,
    8223           13 :                                                                                           varSpeedCoil.Name,
    8224           13 :                                                                                           varSpeedCoil.VarSpeedCoilType,
    8225              :                                                                                           varSpeedCoil.RatedCapCoolTotal,
    8226              :                                                                                           varSpeedCoil.RatedCapCoolSens,
    8227              :                                                                                           varSpeedCoil.RatedAirVolFlowRate,
    8228              :                                                                                           varSpeedCoil.RatedWaterMassFlowRate);
    8229            6 :                 } else if (varSpeedCoil.VSCoilType == HVAC::Coil_HeatingWaterToAirHPVSEquationFit ||
    8230            5 :                            varSpeedCoil.VSCoilType == HVAC::Coil_HeatingAirToAirVariableSpeed) { // heating coil
    8231            6 :                     state.dataRptCoilSelection->coilSelectionReportObj->setCoilFinalSizes(state,
    8232            6 :                                                                                           varSpeedCoil.Name,
    8233            6 :                                                                                           varSpeedCoil.VarSpeedCoilType,
    8234              :                                                                                           varSpeedCoil.RatedCapHeat,
    8235              :                                                                                           varSpeedCoil.RatedCapHeat,
    8236              :                                                                                           varSpeedCoil.RatedAirVolFlowRate,
    8237              :                                                                                           varSpeedCoil.RatedWaterMassFlowRate);
    8238              :                 }
    8239           19 :                 varSpeedCoil.reportCoilFinalSizes = false;
    8240              :             }
    8241              :         }
    8242        67679 :         if (varSpeedCoil.VSCoilType == HVAC::Coil_CoolingWaterToAirHPVSEquationFit ||
    8243        34042 :             varSpeedCoil.VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed) {
    8244              :             //  Add power to global variable so power can be summed by parent object
    8245        34011 :             state.dataHVACGlobal->DXElecCoolingPower = varSpeedCoil.Power;
    8246        33668 :         } else if (varSpeedCoil.VSCoilType == HVAC::Coil_HeatingWaterToAirHPVSEquationFit) {
    8247              :             //  Add power to global variable so power can be summed by parent object
    8248        33636 :             state.dataHVACGlobal->DXElecHeatingPower = varSpeedCoil.Power;
    8249           32 :         } else if (varSpeedCoil.VSCoilType == HVAC::Coil_HeatingAirToAirVariableSpeed) {
    8250              :             //  Add power to global variable so power can be summed by parent object
    8251           31 :             state.dataHVACGlobal->DXElecHeatingPower = varSpeedCoil.Power + varSpeedCoil.CrankcaseHeaterPower;
    8252           31 :             state.dataHVACGlobal->DefrostElecPower = varSpeedCoil.DefrostPower;
    8253              :         }
    8254        67679 :     }
    8255              : 
    8256           11 :     Real64 CalcEffectiveSHR(EnergyPlusData &state,
    8257              :                             int const DXCoilNum,     // Index number for cooling coil
    8258              :                             Real64 const SHRss,      // Steady-state sensible heat ratio
    8259              :                             HVAC::FanOp const fanOp, // Fan/compressor cycling scheme indicator
    8260              :                             Real64 const RTF,        // Compressor run-time fraction
    8261              :                             Real64 const QLatRated,  // Rated latent capacity
    8262              :                             Real64 const QLatActual, // Actual latent capacity
    8263              :                             Real64 const EnteringDB, // Entering air dry-bulb temperature
    8264              :                             Real64 const EnteringWB  // Entering air wet-bulb temperature
    8265              :     )
    8266              :     {
    8267              : 
    8268              :         // FUNCTION INFORMATION:
    8269              :         //    AUTHOR         Bo Shen, based on WaterToAirHeatPumpSimple:CalcEffectiveSHR
    8270              :         //    DATE WRITTEN   March 2012
    8271              : 
    8272              :         // PURPOSE OF THIS FUNCTION:
    8273              :         //    Adjust sensible heat ratio to account for degradation of DX coil latent
    8274              :         //    capacity at part-load (cycling) conditions.
    8275              : 
    8276              :         // METHODOLOGY EMPLOYED:
    8277              :         //    With model parameters entered by the user, the part-load latent performance
    8278              :         //    of a DX cooling coil is determined for a constant air flow system with
    8279              :         //    a cooling coil that cycles on/off. The model calculates the time
    8280              :         //    required for condensate to begin falling from the cooling coil.
    8281              :         //    Runtimes greater than this are integrated to a "part-load" latent
    8282              :         //    capacity which is used to determine the "part-load" sensible heat ratio.
    8283              :         //    See reference below for additional details (linear decay model, Eq. 8b).
    8284              : 
    8285              :         //    For cycling fan operation, a modified version of Henderson and Rengarajan (1996)
    8286              :         //    model is used by ultilizing the fan delay time as the time-off (or time duration
    8287              :         //    for the re-evaporation of moisture from time coil). Refer to Tang, C.C. (2005)
    8288              : 
    8289              :         // Return value
    8290              :         Real64 SHReff; // Effective sensible heat ratio, includes degradation due to cycling effects
    8291              : 
    8292              :         // FUNCTION LOCAL VARIABLE DECLARATIONS:
    8293              :         Real64 Twet; // Nominal time for condensate to begin leaving the coil's condensate drain line
    8294              :         // at the current operating conditions (sec)
    8295              :         Real64 Gamma; // Initial moisture evaporation rate divided by steady-state AC latent capacity
    8296              :         // at the current operating conditions
    8297              :         Real64 Twet_max; // Maximum allowed value for Twet
    8298              :         Real64 Ton;      // Coil on time (sec)
    8299              :         Real64 Toff;     // Coil off time (sec)
    8300              :         Real64 Toffa;    // Actual coil off time (sec). Equations valid for Toff <= (2.0 * Twet/Gamma)
    8301              :         Real64 aa;       // Intermediate variable
    8302              :         Real64 To1;      // Intermediate variable (first guess at To). To = time to the start of moisture removal
    8303              :         Real64 To2;      // Intermediate variable (second guess at To). To = time to the start of moisture removal
    8304              :         Real64 Error;    // Error for iteration (DO) loop
    8305              :         Real64 LHRmult;  // Latent Heat Ratio (LHR) multiplier. The effective latent heat ratio LHR = (1-SHRss)*LHRmult
    8306              : 
    8307           11 :         Real64 Twet_Rated = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Twet_Rated; // [s]
    8308           11 :         Real64 Gamma_Rated = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Gamma_Rated;
    8309           11 :         Real64 MaxONOFFCyclesperHour = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MaxONOFFCyclesperHour;           // [cycles/hr]
    8310           11 :         Real64 LatentCapacityTimeConstant = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).LatentCapacityTimeConstant; // [s]
    8311           11 :         Real64 FanDelayTime = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).FanDelayTime;                             // [s]
    8312              : 
    8313              :         //  No moisture evaporation (latent degradation) occurs for runtime fraction of 1.0
    8314              :         //  All latent degradation model parameters cause divide by 0.0 if not greater than 0.0
    8315              :         //  Latent degradation model parameters initialize to 0.0 meaning no evaporation model used.
    8316           11 :         if ((RTF >= 1.0) || (QLatRated == 0.0) || (QLatActual == 0.0) || (Twet_Rated <= 0.0) || (Gamma_Rated <= 0.0) ||
    8317            7 :             (MaxONOFFCyclesperHour <= 0.0) || (LatentCapacityTimeConstant <= 0.0) || (RTF <= 0.0)) {
    8318            4 :             SHReff = SHRss;
    8319            4 :             return SHReff;
    8320              :         }
    8321              : 
    8322            7 :         Twet_max = 9999.0; // high limit for Twet
    8323              : 
    8324              :         //  Calculate the model parameters at the actual operating conditions
    8325            7 :         Twet = min(Twet_Rated * QLatRated / (QLatActual + 1.e-10), Twet_max);
    8326            7 :         Gamma = Gamma_Rated * QLatRated * (EnteringDB - EnteringWB) / ((26.7 - 19.4) * QLatActual + 1.e-10);
    8327              : 
    8328              :         //  Calculate the compressor on and off times using a converntional thermostat curve
    8329            7 :         Ton = 3600.0 / (4.0 * MaxONOFFCyclesperHour * (1.0 - RTF)); // duration of cooling coil on-cycle (sec)
    8330              : 
    8331            7 :         if ((fanOp == HVAC::FanOp::Cycling) && (FanDelayTime != 0.0)) {
    8332              :             // For FanOp::Cycling, moisture is evaporated from the cooling coil back to the air stream
    8333              :             // until the fan cycle off. Assume no evaporation from the coil after the fan shuts off.
    8334            0 :             Toff = FanDelayTime;
    8335              :         } else {
    8336              :             // For FanOp::Continuous, moisture is evaporated from the cooling coil back to the air stream
    8337              :             // for the entire heat pump off-cycle.
    8338            7 :             Toff = 3600.0 / (4.0 * MaxONOFFCyclesperHour * RTF); // duration of cooling coil off-cycle (sec)
    8339              :         }
    8340              : 
    8341              :         //  Cap Toff to meet the equation restriction
    8342            7 :         if (Gamma > 0.0) {
    8343            7 :             Toffa = min(Toff, 2.0 * Twet / Gamma);
    8344              :         } else {
    8345            0 :             Toffa = Toff;
    8346              :         }
    8347              : 
    8348              :         //  Use sucessive substitution to solve for To
    8349            7 :         aa = (Gamma * Toffa) - (0.25 / Twet) * pow_2(Gamma) * pow_2(Toffa);
    8350              : 
    8351            7 :         To1 = aa + LatentCapacityTimeConstant;
    8352            7 :         Error = 1.0;
    8353           14 :         while (Error > 0.001) {
    8354            7 :             To2 = aa - LatentCapacityTimeConstant * (std::exp(-To1 / LatentCapacityTimeConstant) - 1.0);
    8355            7 :             Error = std::abs((To2 - To1) / To1);
    8356            7 :             To1 = To2;
    8357              :         }
    8358              : 
    8359              :         //  Adjust Sensible Heat Ratio (SHR) using Latent Heat Ratio (LHR) multiplier
    8360              :         //  Floating underflow errors occur when -Ton/LatentCapacityTimeConstant is a large negative number.
    8361              :         //  Cap lower limit at -700 to avoid the underflow errors.
    8362            7 :         aa = std::exp(max(-700.0, -Ton / LatentCapacityTimeConstant));
    8363              :         //  Calculate latent heat ratio multiplier
    8364            7 :         LHRmult = max(((Ton - To2) / (Ton + LatentCapacityTimeConstant * (aa - 1.0))), 0.0);
    8365              : 
    8366              :         //  Calculate part-load or "effective" sensible heat ratio
    8367            7 :         SHReff = 1.0 - (1.0 - SHRss) * LHRmult;
    8368              : 
    8369            7 :         if (SHReff < SHRss) {
    8370            0 :             SHReff = SHRss; // Effective SHR can be less than the steady-state SHR
    8371              :         }
    8372            7 :         if (SHReff > 1.0) {
    8373            0 :             SHReff = 1.0; // Effective sensible heat ratio can't be greater than 1.0
    8374              :         }
    8375              : 
    8376            7 :         return SHReff;
    8377              :     }
    8378              : 
    8379        17696 :     void CalcTotCapSHR_VSWSHP(EnergyPlusData &state,
    8380              :                               Real64 const InletDryBulb,       // inlet air dry bulb temperature [C]
    8381              :                               Real64 const InletHumRat,        // inlet air humidity ratio [kg water / kg dry air]
    8382              :                               Real64 const InletEnthalpy,      // inlet air specific enthalpy [J/kg]
    8383              :                               Real64 &InletWetBulb,            // inlet air wet bulb temperature [C]
    8384              :                               Real64 const AirMassFlowRatio,   // Ratio of actual air mass flow to nominal air mass flow
    8385              :                               Real64 const WaterMassFlowRatio, // Ratio of actual water mass flow to nominal water mass flow
    8386              :                               Real64 const AirMassFlow,        // actual mass flow for capacity and SHR calculation
    8387              :                               Real64 const CBF,                // coil bypass factor
    8388              :                               Real64 const TotCapNom1,         // nominal total capacity at low speed [W]
    8389              :                               int const CCapFTemp1,            // capacity modifier curve index, function of entering wetbulb at low speed
    8390              :                               int const CCapAirFFlow1,         // capacity modifier curve, function of actual air flow vs rated flow at low speed
    8391              :                               int const CCapWaterFFlow1,       // capacity modifier curve, function of actual water flow vs rated flow at low speed
    8392              :                               Real64 const TotCapNom2,         // nominal total capacity at high speed [W]
    8393              :                               int const CCapFTemp2,            // capacity modifier curve index, function of entering wetbulb at high speed
    8394              :                               int const CCapAirFFlow2,         // capacity modifier curve, function of actual air flow vs rated flow at high speed
    8395              :                               int const CCapWaterFFlow2,       // capacity modifier curve, function of actual water flow vs rated flow at high speed
    8396              :                               Real64 &TotCap1,                 // total capacity at the given conditions [W] at low speed
    8397              :                               Real64 &TotCap2,                 // total capacity at the given conditions [W] at high speed
    8398              :                               Real64 &TotCapSpeed,             // integrated total capacity corresponding to the speed ratio
    8399              :                               Real64 &SHR,                     // sensible heat ratio at the given conditions
    8400              :                               Real64 const CondInletTemp,      // Condenser inlet temperature [C]
    8401              :                               Real64 const Pressure,           // air pressure [Pa]
    8402              :                               Real64 const SpeedRatio,         // from 0.0 to 1.0
    8403              :                               int const NumSpeeds,             // number of speeds for input
    8404              :                               Real64 &TotCapModFac             // capacity modification factor, func of temp and func of flow
    8405              :     )
    8406              :     {
    8407              : 
    8408              :         // SUBROUTINE INFORMATION:
    8409              :         //       AUTHOR         Bo Shen, , based on DX:CalcTotCapSHR, introducing two speed levels
    8410              :         //       DATE WRITTEN   March 2012
    8411              : 
    8412              :         // PURPOSE OF THIS SUBROUTINE:
    8413              :         // Calculates total capacity and sensible heat ratio of a DX coil at the specified conditions
    8414              : 
    8415              :         // METHODOLOGY EMPLOYED:
    8416              :         // With the rated performance data entered by the user, the model employs some of the
    8417              :         // DOE-2.1E curve fits to adjust the capacity and SHR of the unit as a function
    8418              :         // of entering air temperatures and supply air flow rate (actual vs rated flow). The model
    8419              :         // does NOT employ the exact same methodology to calculate performance as DOE-2, although
    8420              :         // some of the DOE-2 curve fits are employed by this model.
    8421              : 
    8422              :         // The model checks for coil dryout conditions, and adjusts the calculated performance appropriately.
    8423              : 
    8424              :         // REFERENCES:
    8425              :         // ASHRAE HVAC 2 Toolkit page 4-81.
    8426              :         // Henderson, H.I. Jr., K. Rengarajan and D.B. Shirey, III. 1992.The impact of comfort
    8427              :         // control on air conditioner energy use in humid climates. ASHRAE Transactions 98(2):
    8428              :         // 104-113.
    8429              :         // Henderson, H.I. Jr., Danny Parker and Y.J. Huang. 2000.Improving DOE-2's RESYS routine:
    8430              :         // User Defined Functions to Provide More Accurate Part Load Energy Use and Humidity
    8431              :         // Predictions. Proceedings of ACEEE Conference.
    8432              : 
    8433              :         // SUBROUTINE PARAMETER DEFINITIONS:
    8434              :         static constexpr std::string_view RoutineName("CalcTotCapSHR_VSWSHP");
    8435        17696 :         constexpr int MaxIter = 30;        // Maximum number of iterations for dry evaporator calculations
    8436        17696 :         constexpr Real64 Tolerance = 0.01; // Error tolerance for dry evaporator iterations
    8437              : 
    8438              :         // SUBROUTINE LOCAL VARIABLE DECLARATIONS:
    8439              :         Real64 TotCapWaterFlowModFac1; // Total capacity modifier (function of actual supply water flow vs nominal flow) at low speed
    8440              :         Real64 TotCapTempModFac2;      // Total capacity modifier (function of entering wetbulb, outside water inlet temp) at high speed
    8441              :         Real64 TotCapAirFlowModFac2;   // Total capacity modifier (function of actual supply air flow vs nominal flow) at high speed
    8442              :         Real64 TotCapWaterFlowModFac2; // Total capacity modifier (function of actual supply water flow vs nominal flow) at high speed
    8443              :         Real64 TotCapCalc;             // temporary calculated value of total capacity [W]
    8444              :         Real64 TotCapCalc1;            // temporary calculated value of total capacity [W] at low speed
    8445              :         Real64 TotCapCalc2;            // temporary calculated value of total capacity [W] at high speed
    8446              : 
    8447        17696 :         int Counter = 0;                        // Error tolerance for dry evaporator iterations
    8448        17696 :         Real64 RF = 0.4;                        // Relaxation factor for dry evaporator iterations
    8449        17696 :         Real64 werror = 0.0;                    // Deviation of humidity ratio in dry evaporator iteration loop
    8450        17696 :         Real64 SHRCalc = SHR;                   // initialize temporary calculated value of SHR
    8451        17696 :         Real64 InletWetBulbCalc = InletWetBulb; // calculated inlet wetbulb temperature used for finding dry coil point [C]
    8452        17696 :         Real64 InletHumRatCalc = InletHumRat;   // calculated inlet humidity ratio used for finding dry coil point [kg water / kg dry air]
    8453        17696 :         bool LoopOn = true;                     // flag to control the loop iteration
    8454              : 
    8455              :         //  LOOP WHILE (ABS(werror) .gt. Tolerance .OR. Counter == 0)
    8456        35402 :         while (LoopOn) {
    8457              :             //   Get capacity modifying factor (function of inlet wetbulb & condenser inlet temp) for off-rated conditions
    8458        17706 :             Real64 TotCapTempModFac1 = Curve::CurveValue(state, CCapFTemp1, InletWetBulbCalc, CondInletTemp);
    8459              :             //   Get capacity modifying factor (function of mass flow) for off-rated conditions
    8460        17706 :             Real64 TotCapAirFlowModFac1 = Curve::CurveValue(state, CCapAirFFlow1, AirMassFlowRatio);
    8461              :             // Get capacity modifying factor (function of mass flow) for off-rated conditions
    8462        17706 :             if (CCapWaterFFlow1 == 0) {
    8463          589 :                 TotCapWaterFlowModFac1 = 1.0;
    8464              :             } else {
    8465        17117 :                 TotCapWaterFlowModFac1 = Curve::CurveValue(state, CCapWaterFFlow1, WaterMassFlowRatio);
    8466              :             }
    8467              : 
    8468              :             //   Get total capacity
    8469        17706 :             if (NumSpeeds < 2) { // ONLY ONE SPEED
    8470        14340 :                 TotCapCalc = TotCapNom1 * TotCapAirFlowModFac1 * TotCapWaterFlowModFac1 * TotCapTempModFac1;
    8471        14340 :                 TotCapCalc1 = TotCapCalc;
    8472        14340 :                 TotCapCalc2 = 0.0;
    8473        14340 :                 TotCapModFac = TotCapAirFlowModFac1 * TotCapWaterFlowModFac1 * TotCapTempModFac1;
    8474              :             } else {
    8475         3366 :                 TotCapTempModFac2 = Curve::CurveValue(state, CCapFTemp2, InletWetBulbCalc, CondInletTemp);
    8476         3366 :                 TotCapAirFlowModFac2 = Curve::CurveValue(state, CCapAirFFlow2, AirMassFlowRatio);
    8477              : 
    8478         3366 :                 if (CCapWaterFFlow2 == 0) {
    8479           23 :                     TotCapWaterFlowModFac2 = 1.0;
    8480              :                 } else {
    8481         3343 :                     TotCapWaterFlowModFac2 = Curve::CurveValue(state, CCapWaterFFlow2, WaterMassFlowRatio);
    8482              :                 }
    8483              : 
    8484         3366 :                 TotCapCalc1 = TotCapNom1 * TotCapAirFlowModFac1 * TotCapWaterFlowModFac1 * TotCapTempModFac1;
    8485         3366 :                 TotCapCalc2 = TotCapNom2 * TotCapAirFlowModFac2 * TotCapWaterFlowModFac2 * TotCapTempModFac2;
    8486              : 
    8487         3366 :                 TotCapCalc = TotCapCalc2 * SpeedRatio + (1.0 - SpeedRatio) * TotCapCalc1;
    8488         3366 :                 TotCapModFac = (TotCapAirFlowModFac2 * TotCapWaterFlowModFac2 * TotCapTempModFac2) * SpeedRatio +
    8489         3366 :                                (1.0 - SpeedRatio) * (TotCapAirFlowModFac1 * TotCapWaterFlowModFac1 * TotCapTempModFac1);
    8490              :             }
    8491              : 
    8492        17706 :             Real64 localCBF = max(0.0, CBF); // negative coil bypass factor is physically impossible
    8493              : 
    8494              :             //   Calculate apparatus dew point conditions using TotCap and CBF
    8495        17706 :             Real64 hDelta = TotCapCalc / AirMassFlow;                                       // Change in air enthalpy across the cooling coil [J/kg]
    8496        17706 :             Real64 hADP = InletEnthalpy - hDelta / (1.0 - localCBF);                        // Apparatus dew point enthalpy [J/kg]
    8497        17706 :             Real64 tADP = Psychrometrics::PsyTsatFnHPb(state, hADP, Pressure, RoutineName); // Apparatus dew point temperature [C]
    8498        17706 :             Real64 wADP = Psychrometrics::PsyWFnTdbH(state, tADP, hADP, RoutineName);       // Apparatus dew point humidity ratio [kg/kg]
    8499        17706 :             Real64 hTinwADP = Psychrometrics::PsyHFnTdbW(InletDryBulb, wADP);               // Enthalpy at inlet dry-bulb and wADP [J/kg]
    8500        17706 :             if (TotCapCalc > 1.0e-10) {
    8501        17699 :                 SHRCalc = min((hTinwADP - hADP) / (InletEnthalpy - hADP), 1.0); // temporary calculated value of SHR
    8502              :             } else {
    8503            7 :                 SHRCalc = 1.0;
    8504              :             }
    8505              : 
    8506              :             //   Check for dry evaporator conditions (win < wadp)
    8507        17706 :             if (wADP > InletHumRatCalc || (Counter >= 1 && Counter < MaxIter)) {
    8508           17 :                 if (InletHumRatCalc == 0.0) {
    8509            2 :                     InletHumRatCalc = 0.00001;
    8510              :                 }
    8511           17 :                 werror = (InletHumRatCalc - wADP) / InletHumRatCalc;
    8512              :                 //     Increase InletHumRatCalc at constant inlet air temp to find coil dry-out point. Then use the
    8513              :                 //     capacity at the dry-out point to determine exiting conditions from coil. This is required
    8514              :                 //     since the TotCapTempModFac doesn't work properly with dry-coil conditions.
    8515           17 :                 InletHumRatCalc = RF * wADP + (1.0 - RF) * InletHumRatCalc;
    8516           17 :                 InletWetBulbCalc = Psychrometrics::PsyTwbFnTdbWPb(state, InletDryBulb, InletHumRatCalc, Pressure);
    8517           17 :                 ++Counter;
    8518           34 :                 if (std::abs(werror) > Tolerance) {
    8519           10 :                     LoopOn = true; // Recalculate with modified inlet conditions
    8520              :                 } else {
    8521            7 :                     LoopOn = false;
    8522              :                 }
    8523              :             } else {
    8524        17689 :                 LoopOn = false;
    8525              :             }
    8526              :         } // END LOOP
    8527              : 
    8528              :         //  Calculate full load output conditions
    8529        17696 :         if (SHRCalc > 1.0 || Counter > 0) {
    8530            7 :             SHRCalc = 1.0; // if Counter > 0 means a dry coil so SHR = 1
    8531              :         }
    8532              : 
    8533        17696 :         SHR = SHRCalc;
    8534        17696 :         TotCap1 = TotCapCalc1;
    8535        17696 :         TotCap2 = TotCapCalc2;
    8536        17696 :         TotCapSpeed = TotCapCalc;
    8537        17696 :         InletWetBulb = InletWetBulbCalc;
    8538        17696 :     }
    8539              : 
    8540            2 :     Real64 getVarSpeedPartLoadRatio(EnergyPlusData &state, int const DXCoilNum)
    8541              :     {
    8542            2 :         return state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PartLoadRatio;
    8543              :     }
    8544              : 
    8545              : } // namespace VariableSpeedCoils
    8546              : 
    8547              : } // namespace EnergyPlus
        

Generated by: LCOV version 2.0-1