LCOV - code coverage report
Current view: top level - EnergyPlus - VariableSpeedCoils.cc (source / functions) Coverage Total Hit
Test: lcov.output.filtered Lines: 71.7 % 4546 3259
Test Date: 2025-06-02 07:23:51 Functions: 100.0 % 25 25

            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     45014786 :     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     45014786 :         if (state.dataVariableSpeedCoils->GetCoilsInputFlag) { // First time subroutine has been entered
     139            0 :             GetVarSpeedCoilInput(state);
     140            0 :             state.dataVariableSpeedCoils->GetCoilsInputFlag = false;
     141              :         }
     142              : 
     143     45014786 :         if (CompIndex == 0) {
     144            4 :             DXCoilNum = Util::FindItemInList(CompName, state.dataVariableSpeedCoils->VarSpeedCoil);
     145            4 :             if (DXCoilNum == 0) {
     146            0 :                 ShowFatalError(state, format("WaterToAirHPVSWEquationFit not found={}", CompName));
     147              :             }
     148            4 :             CompIndex = DXCoilNum;
     149              :         } else {
     150     45014782 :             DXCoilNum = CompIndex;
     151     45014782 :             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     45014782 :             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     45014786 :         if (SpeedNum < 1) {
     170      1456498 :             SpeedCal = 1;
     171              :         } else {
     172     43558288 :             SpeedCal = SpeedNum;
     173              :         }
     174              : 
     175     85507779 :         if ((state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_CoolingWaterToAirHPVSEquationFit) ||
     176     40492993 :             (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed)) {
     177              :             // Cooling mode
     178     37952531 :             InitVarSpeedCoil(state, DXCoilNum, SensLoad, LatentLoad, fanOp, OnOffAirFlowRatio, SpeedRatio, SpeedCal);
     179     37952531 :             CalcVarSpeedCoilCooling(
     180              :                 state, DXCoilNum, fanOp, SensLoad, LatentLoad, compressorOp, PartLoadFrac, OnOffAirFlowRatio, SpeedRatio, SpeedCal);
     181     37952531 :             UpdateVarSpeedCoil(state, DXCoilNum);
     182      9602717 :         } else if ((state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_HeatingWaterToAirHPVSEquationFit) ||
     183      2540462 :                    (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_HeatingAirToAirVariableSpeed)) {
     184              :             // Heating mode
     185      5463079 :             InitVarSpeedCoil(state, DXCoilNum, SensLoad, LatentLoad, fanOp, OnOffAirFlowRatio, SpeedRatio, SpeedCal);
     186      5463079 :             CalcVarSpeedCoilHeating(state, DXCoilNum, fanOp, SensLoad, compressorOp, PartLoadFrac, OnOffAirFlowRatio, SpeedRatio, SpeedCal);
     187      5463079 :             UpdateVarSpeedCoil(state, DXCoilNum);
     188      1599176 :         } else if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::CoilDX_HeatPumpWaterHeaterVariableSpeed) {
     189              :             // Heating mode
     190      1599176 :             InitVarSpeedCoil(state, DXCoilNum, SensLoad, LatentLoad, fanOp, OnOffAirFlowRatio, SpeedRatio, SpeedCal);
     191      1599176 :             CalcVarSpeedHPWH(state, DXCoilNum, PartLoadFrac, SpeedRatio, SpeedNum, fanOp);
     192      1599176 :             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     45014786 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SpeedNumReport = SpeedCal;
     199     45014786 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SpeedRatioReport = SpeedRatio;
     200     45014786 :     }
     201              : 
     202           22 :     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           22 :         int MaxNums(0);   // Maximum number of numeric input fields
     225           22 :         int MaxAlphas(0); // Maximum number of alpha input fields
     226              :         int IOStat;
     227              :         int AlfaFieldIncre;              // increment number of Alfa field
     228           22 :         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           22 :         std::string CurrentModuleObject; // for ease in getting objects
     233           22 :         Array1D_string AlphArray;        // Alpha input items for object
     234           22 :         Array1D_string cAlphaFields;     // Alpha field names
     235           22 :         Array1D_string cNumericFields;   // Numeric field names
     236           22 :         Array1D<Real64> NumArray;        // Numeric input items for object
     237           22 :         Array1D_bool lAlphaBlanks;       // Logical array, alpha field input BLANK = .TRUE.
     238           22 :         Array1D_bool lNumericBlanks;     // Logical array, numeric field input BLANK = .TRUE.
     239              : 
     240              :         int NumCool =
     241           22 :             state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "COIL:COOLING:WATERTOAIRHEATPUMP:VARIABLESPEEDEQUATIONFIT");
     242              :         int NumHeat =
     243           22 :             state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "COIL:HEATING:WATERTOAIRHEATPUMP:VARIABLESPEEDEQUATIONFIT");
     244           22 :         int NumCoolAS = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "COIL:COOLING:DX:VARIABLESPEED");
     245           22 :         int NumHeatAS = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "COIL:HEATING:DX:VARIABLESPEED");
     246              :         int NumHPWHAirToWater =
     247           22 :             state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "COIL:WATERHEATING:AIRTOWATERHEATPUMP:VARIABLESPEED");
     248           22 :         state.dataVariableSpeedCoils->NumVarSpeedCoils = NumCool + NumHeat + NumCoolAS + NumHeatAS + NumHPWHAirToWater;
     249           22 :         int DXCoilNum = 0;
     250              : 
     251           22 :         if (state.dataVariableSpeedCoils->NumVarSpeedCoils <= 0) {
     252            0 :             ShowSevereError(state, "No Equipment found in GetVarSpeedCoilInput");
     253            0 :             ErrorsFound = true;
     254              :         }
     255              : 
     256              :         // Allocate Arrays
     257           22 :         if (state.dataVariableSpeedCoils->NumVarSpeedCoils > 0) {
     258           22 :             state.dataVariableSpeedCoils->VarSpeedCoil.allocate(state.dataVariableSpeedCoils->NumVarSpeedCoils);
     259           22 :             state.dataHeatBal->HeatReclaimVS_Coil.allocate(state.dataVariableSpeedCoils->NumVarSpeedCoils);
     260              :         }
     261              : 
     262           22 :         state.dataInputProcessing->inputProcessor->getObjectDefMaxArgs(
     263              :             state, "COIL:COOLING:WATERTOAIRHEATPUMP:VARIABLESPEEDEQUATIONFIT", NumParams, NumAlphas, NumNums);
     264           22 :         MaxNums = max(MaxNums, NumNums);
     265           22 :         MaxAlphas = max(MaxAlphas, NumAlphas);
     266           22 :         state.dataInputProcessing->inputProcessor->getObjectDefMaxArgs(
     267              :             state, "COIL:HEATING:WATERTOAIRHEATPUMP:VARIABLESPEEDEQUATIONFIT", NumParams, NumAlphas, NumNums);
     268           22 :         MaxNums = max(MaxNums, NumNums);
     269           22 :         MaxAlphas = max(MaxAlphas, NumAlphas);
     270              : 
     271           22 :         state.dataInputProcessing->inputProcessor->getObjectDefMaxArgs(state, "COIL:COOLING:DX:VARIABLESPEED", NumParams, NumAlphas, NumNums);
     272           22 :         MaxNums = max(MaxNums, NumNums);
     273           22 :         MaxAlphas = max(MaxAlphas, NumAlphas);
     274           22 :         state.dataInputProcessing->inputProcessor->getObjectDefMaxArgs(state, "COIL:HEATING:DX:VARIABLESPEED", NumParams, NumAlphas, NumNums);
     275           22 :         MaxNums = max(MaxNums, NumNums);
     276           22 :         MaxAlphas = max(MaxAlphas, NumAlphas);
     277              : 
     278              :         // variable speed air-source HPWH
     279           22 :         state.dataInputProcessing->inputProcessor->getObjectDefMaxArgs(
     280              :             state, "COIL:WATERHEATING:AIRTOWATERHEATPUMP:VARIABLESPEED", NumParams, NumAlphas, NumNums);
     281           22 :         MaxNums = max(MaxNums, NumNums);
     282           22 :         MaxAlphas = max(MaxAlphas, NumAlphas);
     283              : 
     284           22 :         AlphArray.allocate(MaxAlphas);
     285           22 :         cAlphaFields.allocate(MaxAlphas);
     286           22 :         lAlphaBlanks.dimension(MaxAlphas, true);
     287           22 :         cNumericFields.allocate(MaxNums);
     288           22 :         lNumericBlanks.dimension(MaxNums, true);
     289           22 :         NumArray.dimension(MaxNums, 0.0);
     290              : 
     291              :         // Get the data for cooling coil, WATER SOURCE
     292           22 :         CurrentModuleObject = "Coil:Cooling:WaterToAirHeatPump:VariableSpeedEquationFit"; // for reporting
     293              : 
     294           40 :         for (int CoilCounter = 1; CoilCounter <= NumCool; ++CoilCounter) {
     295              : 
     296           18 :             ++DXCoilNum;
     297           18 :             AlfaFieldIncre = 1;
     298              : 
     299           18 :             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           18 :             GlobalNames::VerifyUniqueCoilName(state, CurrentModuleObject, AlphArray(1), ErrorsFound, CurrentModuleObject + " Name");
     314              : 
     315           18 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).bIsDesuperheater = false;
     316           18 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name = AlphArray(1);
     317           18 :             state.dataHeatBal->HeatReclaimVS_Coil(DXCoilNum).Name = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name;
     318           18 :             state.dataHeatBal->HeatReclaimVS_Coil(DXCoilNum).SourceType = CurrentModuleObject;
     319           18 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CoolHeatType = "COOLING";
     320           18 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType = HVAC::Coil_CoolingWaterToAirHPVSEquationFit;
     321           18 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VarSpeedCoilType =
     322           36 :                 HVAC::cAllCoilTypes(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType);
     323           18 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds = int(NumArray(1));
     324           18 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel = int(NumArray(2));
     325           18 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedCapCoolTotal = NumArray(3);
     326           18 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedAirVolFlowRate = NumArray(4);
     327           18 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedWaterVolFlowRate = NumArray(5);
     328           18 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Twet_Rated = NumArray(6);
     329           18 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Gamma_Rated = NumArray(7);
     330           18 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MaxONOFFCyclesperHour = NumArray(8);
     331           18 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).LatentCapacityTimeConstant = NumArray(9);
     332           18 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).FanDelayTime = NumArray(10);
     333           18 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HOTGASREHEATFLG = int(NumArray(11));
     334           18 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserType = DataHeatBalance::RefrigCondenserType::Water;
     335              : 
     336           18 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterInletNodeNum =
     337           36 :                 GetOnlySingleNode(state,
     338           18 :                                   AlphArray(2),
     339              :                                   ErrorsFound,
     340              :                                   DataLoopNode::ConnectionObjectType::CoilCoolingWaterToAirHeatPumpVariableSpeedEquationFit,
     341           18 :                                   AlphArray(1),
     342              :                                   DataLoopNode::NodeFluidType::Water,
     343              :                                   DataLoopNode::ConnectionType::Inlet,
     344              :                                   NodeInputManager::CompFluidStream::Secondary,
     345              :                                   DataLoopNode::ObjectIsNotParent);
     346           18 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterOutletNodeNum =
     347           36 :                 GetOnlySingleNode(state,
     348           18 :                                   AlphArray(3),
     349              :                                   ErrorsFound,
     350              :                                   DataLoopNode::ConnectionObjectType::CoilCoolingWaterToAirHeatPumpVariableSpeedEquationFit,
     351           18 :                                   AlphArray(1),
     352              :                                   DataLoopNode::NodeFluidType::Water,
     353              :                                   DataLoopNode::ConnectionType::Outlet,
     354              :                                   NodeInputManager::CompFluidStream::Secondary,
     355              :                                   DataLoopNode::ObjectIsNotParent);
     356           18 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirInletNodeNum =
     357           36 :                 GetOnlySingleNode(state,
     358           18 :                                   AlphArray(4),
     359              :                                   ErrorsFound,
     360              :                                   DataLoopNode::ConnectionObjectType::CoilCoolingWaterToAirHeatPumpVariableSpeedEquationFit,
     361           18 :                                   AlphArray(1),
     362              :                                   DataLoopNode::NodeFluidType::Air,
     363              :                                   DataLoopNode::ConnectionType::Inlet,
     364              :                                   NodeInputManager::CompFluidStream::Primary,
     365              :                                   DataLoopNode::ObjectIsNotParent);
     366           18 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirOutletNodeNum =
     367           54 :                 GetOnlySingleNode(state,
     368           18 :                                   AlphArray(5),
     369              :                                   ErrorsFound,
     370              :                                   DataLoopNode::ConnectionObjectType::CoilCoolingWaterToAirHeatPumpVariableSpeedEquationFit,
     371           18 :                                   AlphArray(1),
     372              :                                   DataLoopNode::NodeFluidType::Air,
     373              :                                   DataLoopNode::ConnectionType::Outlet,
     374              :                                   NodeInputManager::CompFluidStream::Primary,
     375              :                                   DataLoopNode::ObjectIsNotParent);
     376              : 
     377           36 :             BranchNodeConnections::TestCompSet(state, CurrentModuleObject, AlphArray(1), AlphArray(2), AlphArray(3), "Water Nodes");
     378           18 :             BranchNodeConnections::TestCompSet(state, CurrentModuleObject, AlphArray(1), AlphArray(4), AlphArray(5), "Air Nodes");
     379              : 
     380              :             //   If (VarSpeedCoil(DXCoilNum)%NumOfSpeeds .LT. 2) Then
     381           18 :             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           18 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel >
     390           18 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds) {
     391            0 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel =
     392            0 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds;
     393              :             }
     394              : 
     395           18 :             if ((state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel >
     396           36 :                  state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds) ||
     397           18 :                 (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           18 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PLFFPLR = Curve::GetCurveIndex(state, AlphArray(6)); // convert curve name to number
     407           18 :             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           18 :                 CurveVal = Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PLFFPLR, 1.0);
     422           18 :                 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          198 :             for (int I = 1; I <= state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds; ++I) {
     434          180 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(I) = NumArray(12 + (I - 1) * 6);
     435          180 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedSHR(I) = NumArray(13 + (I - 1) * 6);
     436          180 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedCOP(I) = NumArray(14 + (I - 1) * 6);
     437          180 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirVolFlowRate(I) = NumArray(15 + (I - 1) * 6);
     438          180 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedWaterVolFlowRate(I) = NumArray(16 + (I - 1) * 6);
     439          180 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWasteHeatFrac(I) = NumArray(17 + (I - 1) * 6);
     440              : 
     441          180 :                 AlfaFieldIncre = 7 + (I - 1) * 7;
     442          180 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(I) =
     443          180 :                     Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
     444          180 :                 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          540 :                     ErrorsFound |= Curve::CheckCurveDims(state,
     464          180 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(I), // Curve index
     465              :                                                          {2},                                                                  // Valid dimensions
     466              :                                                          RoutineName,                                                          // Routine name
     467              :                                                          CurrentModuleObject,                                                  // Object Type
     468          180 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,           // Object Name
     469          180 :                                                          cAlphaFields(AlfaFieldIncre));                                        // Field Name
     470              : 
     471          180 :                     if (!ErrorsFound) {
     472          360 :                         CurveVal = Curve::CurveValue(
     473          180 :                             state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(I), RatedInletWetBulbTemp, RatedInletWaterTemp);
     474          180 :                         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          180 :                 AlfaFieldIncre = 8 + (I - 1) * 7;
     488          180 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(I) =
     489          180 :                     Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
     490          180 :                 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          540 :                     ErrorsFound |= Curve::CheckCurveDims(state,
     510          180 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(I), // Curve index
     511              :                                                          {1},                                                                     // Valid dimensions
     512              :                                                          RoutineName,                                                             // Routine name
     513              :                                                          CurrentModuleObject,                                                     // Object Type
     514          180 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,              // Object Name
     515          180 :                                                          cAlphaFields(AlfaFieldIncre));                                           // Field Name
     516              : 
     517          180 :                     if (!ErrorsFound) {
     518          180 :                         CurveVal = Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(I), 1.0);
     519          180 :                         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          180 :                 AlfaFieldIncre = 9 + (I - 1) * 7;
     533          180 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapWaterFFlow(I) =
     534          180 :                     Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
     535          180 :                 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          540 :                     ErrorsFound |= Curve::CheckCurveDims(state,
     555          180 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapWaterFFlow(I), // Curve index
     556              :                                                          {1},                                                        // Valid dimensions
     557              :                                                          RoutineName,                                                // Routine name
     558              :                                                          CurrentModuleObject,                                        // Object Type
     559          180 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name, // Object Name
     560          180 :                                                          cAlphaFields(AlfaFieldIncre));                              // Field Name
     561              : 
     562          180 :                     if (!ErrorsFound) {
     563          180 :                         CurveVal = Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapWaterFFlow(I), 1.0);
     564          180 :                         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          180 :                 AlfaFieldIncre = 10 + (I - 1) * 7;
     578          180 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(I) =
     579          180 :                     Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
     580          180 :                 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          540 :                     ErrorsFound |= Curve::CheckCurveDims(state,
     600          180 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(I), // Curve index
     601              :                                                          {2},                                                                 // Valid dimensions
     602              :                                                          RoutineName,                                                         // Routine name
     603              :                                                          CurrentModuleObject,                                                 // Object Type
     604          180 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,          // Object Name
     605          180 :                                                          cAlphaFields(AlfaFieldIncre));                                       // Field Name
     606              : 
     607          180 :                     if (!ErrorsFound) {
     608          360 :                         CurveVal = Curve::CurveValue(
     609          180 :                             state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(I), RatedInletWetBulbTemp, RatedInletWaterTemp);
     610          180 :                         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          180 :                 AlfaFieldIncre = 11 + (I - 1) * 7;
     624          180 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(I) =
     625          180 :                     Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
     626          180 :                 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          540 :                     ErrorsFound |= Curve::CheckCurveDims(state,
     646          180 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(I), // Curve index
     647              :                                                          {1},                                                                    // Valid dimensions
     648              :                                                          RoutineName,                                                            // Routine name
     649              :                                                          CurrentModuleObject,                                                    // Object Type
     650          180 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,             // Object Name
     651          180 :                                                          cAlphaFields(AlfaFieldIncre));                                          // Field Name
     652              : 
     653          180 :                     if (!ErrorsFound) {
     654          180 :                         CurveVal = Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(I), 1.0);
     655          180 :                         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          180 :                 AlfaFieldIncre = 12 + (I - 1) * 7;
     669          180 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRWaterFFlow(I) =
     670          180 :                     Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
     671          180 :                 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          540 :                     ErrorsFound |= Curve::CheckCurveDims(state,
     691          180 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRWaterFFlow(I), // Curve index
     692              :                                                          {1},                                                                      // Valid dimensions
     693              :                                                          RoutineName,                                                              // Routine name
     694              :                                                          CurrentModuleObject,                                                      // Object Type
     695          180 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,               // Object Name
     696          180 :                                                          cAlphaFields(AlfaFieldIncre));                                            // Field Name
     697              : 
     698          180 :                     if (!ErrorsFound) {
     699          180 :                         CurveVal = Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRWaterFFlow(I), 1.0);
     700          180 :                         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          180 :                 AlfaFieldIncre = 13 + (I - 1) * 7;
     714              :                 // Read waste heat modifier curve name
     715          180 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWasteHeat(I) =
     716          180 :                     Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
     717          180 :                 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          540 :                     ErrorsFound |= Curve::CheckCurveDims(state,
     737          180 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWasteHeat(I), // Curve index
     738              :                                                          {2},                                                                  // Valid dimensions
     739              :                                                          RoutineName,                                                          // Routine name
     740              :                                                          CurrentModuleObject,                                                  // Object Type
     741          180 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,           // Object Name
     742          180 :                                                          cAlphaFields(AlfaFieldIncre));                                        // Field Name
     743              : 
     744          180 :                     if (!ErrorsFound) {
     745          360 :                         CurveVal = Curve::CurveValue(
     746          180 :                             state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWasteHeat(I), RatedInletWaterTemp, RatedInletAirTemp);
     747          180 :                         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          198 :             for (int I = 1; I <= state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds; ++I) {
     762          180 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedPercentTotCap(I) =
     763          180 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(I) /
     764          360 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(
     765          180 :                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds);
     766          180 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirVolFlowPerRatedTotCap(I) =
     767          180 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirVolFlowRate(I) /
     768          180 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(I);
     769          180 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedWaterVolFlowPerRatedTotCap(I) =
     770          180 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedWaterVolFlowRate(I) /
     771          180 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(I);
     772              :             }
     773              : 
     774              :             // CurrentModuleObject = "Coil:Cooling:WaterToAirHeatPump:VariableSpeedEquationFit"
     775           36 :             SetupOutputVariable(state,
     776              :                                 "Cooling Coil Electricity Energy",
     777              :                                 Constant::Units::J,
     778           18 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Energy,
     779              :                                 OutputProcessor::TimeStepType::System,
     780              :                                 OutputProcessor::StoreType::Sum,
     781           18 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
     782              :                                 Constant::eResource::Electricity,
     783              :                                 OutputProcessor::Group::HVAC,
     784              :                                 OutputProcessor::EndUseCat::Cooling);
     785           36 :             SetupOutputVariable(state,
     786              :                                 "Cooling Coil Total Cooling Energy",
     787              :                                 Constant::Units::J,
     788           18 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergyLoadTotal,
     789              :                                 OutputProcessor::TimeStepType::System,
     790              :                                 OutputProcessor::StoreType::Sum,
     791           18 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
     792              :                                 Constant::eResource::EnergyTransfer,
     793              :                                 OutputProcessor::Group::HVAC,
     794              :                                 OutputProcessor::EndUseCat::CoolingCoils);
     795           36 :             SetupOutputVariable(state,
     796              :                                 "Cooling Coil Sensible Cooling Energy",
     797              :                                 Constant::Units::J,
     798           18 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergySensible,
     799              :                                 OutputProcessor::TimeStepType::System,
     800              :                                 OutputProcessor::StoreType::Sum,
     801           18 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
     802           36 :             SetupOutputVariable(state,
     803              :                                 "Cooling Coil Latent Cooling Energy",
     804              :                                 Constant::Units::J,
     805           18 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergyLatent,
     806              :                                 OutputProcessor::TimeStepType::System,
     807              :                                 OutputProcessor::StoreType::Sum,
     808           18 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
     809           36 :             SetupOutputVariable(state,
     810              :                                 "Cooling Coil Source Side Heat Transfer Energy",
     811              :                                 Constant::Units::J,
     812           18 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergySource,
     813              :                                 OutputProcessor::TimeStepType::System,
     814              :                                 OutputProcessor::StoreType::Sum,
     815           18 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
     816              :                                 Constant::eResource::PlantLoopCoolingDemand,
     817              :                                 OutputProcessor::Group::HVAC,
     818              :                                 OutputProcessor::EndUseCat::CoolingCoils);
     819              : 
     820           18 :             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           22 :         CurrentModuleObject = "Coil:Cooling:DX:VariableSpeed"; // for reporting
     827              : 
     828           44 :         for (int CoilCounter = 1; CoilCounter <= NumCoolAS; ++CoilCounter) {
     829              : 
     830           22 :             ++DXCoilNum;
     831           22 :             AlfaFieldIncre = 1;
     832              : 
     833           22 :             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           22 :             ErrorObjectHeader eoh{routineName, CurrentModuleObject, AlphArray(1)};
     847              : 
     848              :             // ErrorsFound will be set to True if problem was found, left untouched otherwise
     849           22 :             GlobalNames::VerifyUniqueCoilName(state, CurrentModuleObject, AlphArray(1), ErrorsFound, CurrentModuleObject + " Name");
     850              : 
     851           22 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).bIsDesuperheater = false;
     852           22 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name = AlphArray(1);
     853              :             // Initialize DataHeatBalance heat reclaim variable name for use by heat reclaim coils
     854           22 :             state.dataHeatBal->HeatReclaimVS_Coil(DXCoilNum).Name = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name;
     855           22 :             state.dataHeatBal->HeatReclaimVS_Coil(DXCoilNum).SourceType = CurrentModuleObject;
     856           22 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CoolHeatType = "COOLING";
     857           22 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType = HVAC::Coil_CoolingAirToAirVariableSpeed;
     858           22 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VarSpeedCoilType = HVAC::cAllCoilTypes(HVAC::Coil_CoolingAirToAirVariableSpeed);
     859           22 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds = int(NumArray(1));
     860           22 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel = int(NumArray(2));
     861           22 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedCapCoolTotal = NumArray(3);
     862           22 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedAirVolFlowRate = NumArray(4);
     863           22 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Twet_Rated = NumArray(5);
     864           22 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Gamma_Rated = NumArray(6);
     865           22 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MaxONOFFCyclesperHour = NumArray(7);
     866           22 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).LatentCapacityTimeConstant = NumArray(8);
     867           22 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).FanDelayTime = NumArray(9);
     868              : 
     869           22 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirInletNodeNum =
     870           44 :                 GetOnlySingleNode(state,
     871           22 :                                   AlphArray(2),
     872              :                                   ErrorsFound,
     873              :                                   DataLoopNode::ConnectionObjectType::CoilCoolingDXVariableSpeed,
     874           22 :                                   AlphArray(1),
     875              :                                   DataLoopNode::NodeFluidType::Air,
     876              :                                   DataLoopNode::ConnectionType::Inlet,
     877              :                                   NodeInputManager::CompFluidStream::Primary,
     878              :                                   DataLoopNode::ObjectIsNotParent);
     879           22 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirOutletNodeNum =
     880           66 :                 GetOnlySingleNode(state,
     881           22 :                                   AlphArray(3),
     882              :                                   ErrorsFound,
     883              :                                   DataLoopNode::ConnectionObjectType::CoilCoolingDXVariableSpeed,
     884           22 :                                   AlphArray(1),
     885              :                                   DataLoopNode::NodeFluidType::Air,
     886              :                                   DataLoopNode::ConnectionType::Outlet,
     887              :                                   NodeInputManager::CompFluidStream::Primary,
     888              :                                   DataLoopNode::ObjectIsNotParent);
     889              : 
     890           22 :             BranchNodeConnections::TestCompSet(state, CurrentModuleObject, AlphArray(1), AlphArray(2), AlphArray(3), "Air Nodes");
     891              : 
     892           22 :             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           22 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel >
     901           22 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds) {
     902            0 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel =
     903            0 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds;
     904              :             }
     905              : 
     906           22 :             if ((state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel >
     907           44 :                  state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds) ||
     908           22 :                 (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           22 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PLFFPLR = Curve::GetCurveIndex(state, AlphArray(4)); // convert curve name to number
     918           22 :             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           22 :                 CurveVal = Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PLFFPLR, 1.0);
     933           22 :                 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           22 :             if (lAlphaBlanks(5)) {
     946           21 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserInletNodeNum = 0;
     947              :             } else {
     948            1 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserInletNodeNum =
     949            2 :                     GetOnlySingleNode(state,
     950            1 :                                       AlphArray(5),
     951              :                                       ErrorsFound,
     952              :                                       DataLoopNode::ConnectionObjectType::CoilCoolingDXVariableSpeed,
     953            1 :                                       state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
     954              :                                       DataLoopNode::NodeFluidType::Air,
     955              :                                       DataLoopNode::ConnectionType::OutsideAirReference,
     956              :                                       NodeInputManager::CompFluidStream::Primary,
     957              :                                       DataLoopNode::ObjectIsNotParent);
     958              : 
     959            1 :                 if (!OutAirNodeManager::CheckOutAirNodeNumber(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserInletNodeNum)) {
     960            0 :                     ShowWarningError(state,
     961            0 :                                      format("{}{}=\"{}\", may be invalid",
     962              :                                             RoutineName,
     963              :                                             CurrentModuleObject,
     964            0 :                                             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
     965            0 :                     ShowContinueError(state,
     966            0 :                                       format("{}=\"{}\", node does not appear in an OutdoorAir:NodeList or as an OutdoorAir:Node.",
     967              :                                              cAlphaFields(10),
     968              :                                              AlphArray(5)));
     969            0 :                     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           22 :             if ((Util::SameString(AlphArray(6), "AirCooled")) || lAlphaBlanks(6)) {
     975           22 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserType = DataHeatBalance::RefrigCondenserType::Air;
     976            0 :             } else if (Util::SameString(AlphArray(6), "EvaporativelyCooled")) {
     977            0 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserType = DataHeatBalance::RefrigCondenserType::Evap;
     978            0 :                 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           22 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapCondPumpElecNomPower = NumArray(10);
     989              : 
     990           22 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapCondPumpElecNomPower != DataSizing::AutoSize) {
     991           22 :                 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           22 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterCapacity = NumArray(11);
    1003           22 :             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           22 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MaxOATCrankcaseHeater = NumArray(12);
    1014              : 
    1015              :             // Set crankcase heater cutout temperature
    1016           22 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MinOATCompressor = NumArray(13);
    1017              : 
    1018              :             // A7; \field Crankcase Heater Capacity Function of Outdoor Temperature Curve Name
    1019           22 :             if (!lAlphaBlanks(7)) {
    1020            1 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterCapacityCurveIndex = Curve::GetCurveIndex(state, AlphArray(7));
    1021            1 :                 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            1 :                     ErrorsFound |=
    1031            4 :                         Curve::CheckCurveDims(state,
    1032            1 :                                               state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterCapacityCurveIndex, // Curve index
    1033              :                                               {1},                                                        // Valid dimensions
    1034              :                                               RoutineName,                                                // Routine name
    1035              :                                               CurrentModuleObject,                                        // Object Type
    1036            1 :                                               state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name, // Object Name
    1037            1 :                                               cAlphaFields(7));                                           // Field Name
    1038              :                 }
    1039              :             }
    1040              : 
    1041              :             // Get Water System tank connections
    1042              :             //  A8, \field Name of Water Storage Tank for Supply
    1043           22 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapWaterSupplyName = AlphArray(8);
    1044           22 :             if (lAlphaBlanks(8)) {
    1045           22 :                 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           22 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondensateCollectName = AlphArray(9);
    1059           22 :             if (lAlphaBlanks(9)) {
    1060           22 :                 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           22 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).BasinHeaterPowerFTempDiff = NumArray(14);
    1074           22 :             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           22 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).BasinHeaterSetPointTemp = NumArray(15);
    1084           22 :             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           22 :             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          182 :             for (int I = 1; I <= state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds; ++I) {
    1105          160 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(I) = NumArray(16 + (I - 1) * 8);
    1106          160 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedSHR(I) = NumArray(17 + (I - 1) * 8);
    1107          160 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedCOP(I) = NumArray(18 + (I - 1) * 8);
    1108          160 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirVolFlowRate(I) = NumArray(19 + (I - 1) * 8);
    1109          160 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedEvaporatorFanPowerPerVolumeFlowRate2017(I) = NumArray(20 + (I - 1) * 8);
    1110          160 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedEvaporatorFanPowerPerVolumeFlowRate2023(I) = NumArray(21 + (I - 1) * 8);
    1111          160 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapCondAirFlow(I) = NumArray(22 + (I - 1) * 8);
    1112          160 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapCondEffect(I) = NumArray(23 + (I - 1) * 8);
    1113          320 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapCondEffect(I) < 0.0 ||
    1114          160 :                     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          160 :                 AlfaFieldIncre = 11 + (I - 1) * 4;
    1124          160 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(I) =
    1125          160 :                     Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
    1126          160 :                 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          480 :                     ErrorsFound |= Curve::CheckCurveDims(state,
    1146          160 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(I), // Curve index
    1147              :                                                          {2},                                                                  // Valid dimensions
    1148              :                                                          RoutineName,                                                          // Routine name
    1149              :                                                          CurrentModuleObject,                                                  // Object Type
    1150          160 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,           // Object Name
    1151          160 :                                                          cAlphaFields(AlfaFieldIncre));                                        // Field Name
    1152              : 
    1153          160 :                     if (!ErrorsFound) {
    1154          320 :                         CurveVal = Curve::CurveValue(
    1155          160 :                             state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(I), RatedInletWetBulbTemp, RatedAmbAirTemp);
    1156          160 :                         if (CurveVal > 1.10 || CurveVal < 0.90) {
    1157            0 :                             ShowWarningError(state,
    1158            0 :                                              format("{}{}=\"{}\", curve values",
    1159              :                                                     RoutineName,
    1160              :                                                     CurrentModuleObject,
    1161            0 :                                                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    1162            0 :                             ShowContinueError(
    1163            0 :                                 state, format("...{} output is not equal to 1.0 (+ or - 10%) at rated conditions.", cAlphaFields(AlfaFieldIncre)));
    1164            0 :                             ShowContinueError(state, format("...Curve output at rated conditions = {:.3T}", CurveVal));
    1165              :                         }
    1166              :                     }
    1167              :                 }
    1168              : 
    1169          160 :                 AlfaFieldIncre = 12 + (I - 1) * 4;
    1170          160 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(I) =
    1171          160 :                     Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
    1172          160 :                 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          480 :                     ErrorsFound |= Curve::CheckCurveDims(state,
    1192          160 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(I), // Curve index
    1193              :                                                          {1},                                                                     // Valid dimensions
    1194              :                                                          RoutineName,                                                             // Routine name
    1195              :                                                          CurrentModuleObject,                                                     // Object Type
    1196          160 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,              // Object Name
    1197          160 :                                                          cAlphaFields(AlfaFieldIncre));                                           // Field Name
    1198              : 
    1199          160 :                     if (!ErrorsFound) {
    1200          160 :                         CurveVal = Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(I), 1.0);
    1201          160 :                         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          160 :                 AlfaFieldIncre = 13 + (I - 1) * 4;
    1215          160 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(I) =
    1216          160 :                     Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
    1217          160 :                 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          480 :                     ErrorsFound |= Curve::CheckCurveDims(state,
    1237          160 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(I), // Curve index
    1238              :                                                          {2},                                                                 // Valid dimensions
    1239              :                                                          RoutineName,                                                         // Routine name
    1240              :                                                          CurrentModuleObject,                                                 // Object Type
    1241          160 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,          // Object Name
    1242          160 :                                                          cAlphaFields(AlfaFieldIncre));                                       // Field Name
    1243              : 
    1244          160 :                     if (!ErrorsFound) {
    1245          320 :                         CurveVal = Curve::CurveValue(
    1246          160 :                             state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(I), RatedInletWetBulbTemp, RatedAmbAirTemp);
    1247          160 :                         if (CurveVal > 1.10 || CurveVal < 0.90) {
    1248            0 :                             ShowWarningError(state,
    1249            0 :                                              format("{}{}=\"{}\", curve values",
    1250              :                                                     RoutineName,
    1251              :                                                     CurrentModuleObject,
    1252            0 :                                                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    1253            0 :                             ShowContinueError(
    1254            0 :                                 state, format("...{} output is not equal to 1.0 (+ or - 10%) at rated conditions.", cAlphaFields(AlfaFieldIncre)));
    1255            0 :                             ShowContinueError(state, format("...Curve output at rated conditions = {:.3T}", CurveVal));
    1256              :                         }
    1257              :                     }
    1258              :                 }
    1259              : 
    1260          160 :                 AlfaFieldIncre = 14 + (I - 1) * 4;
    1261          160 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(I) =
    1262          160 :                     Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
    1263          160 :                 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          480 :                     ErrorsFound |= Curve::CheckCurveDims(state,
    1283          160 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(I), // Curve index
    1284              :                                                          {1},                                                                    // Valid dimensions
    1285              :                                                          RoutineName,                                                            // Routine name
    1286              :                                                          CurrentModuleObject,                                                    // Object Type
    1287          160 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,             // Object Name
    1288          160 :                                                          cAlphaFields(AlfaFieldIncre));                                          // Field Name
    1289              : 
    1290          160 :                     if (!ErrorsFound) {
    1291          160 :                         CurveVal = Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(I), 1.0);
    1292          160 :                         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          182 :             for (int I = 1; I <= state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds; ++I) {
    1307          160 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedPercentTotCap(I) =
    1308          160 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(I) /
    1309          320 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(
    1310          160 :                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds);
    1311          160 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirVolFlowPerRatedTotCap(I) =
    1312          160 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirVolFlowRate(I) /
    1313          160 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(I);
    1314          160 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedEvapCondVolFlowPerRatedTotCap(I) =
    1315          160 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapCondAirFlow(I) /
    1316          160 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(I);
    1317              :             }
    1318              : 
    1319              :             // CurrentModuleObject = "Coil:Cooling:DX:VariableSpeed"
    1320           44 :             SetupOutputVariable(state,
    1321              :                                 "Cooling Coil Electricity Energy",
    1322              :                                 Constant::Units::J,
    1323           22 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Energy,
    1324              :                                 OutputProcessor::TimeStepType::System,
    1325              :                                 OutputProcessor::StoreType::Sum,
    1326           22 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
    1327              :                                 Constant::eResource::Electricity,
    1328              :                                 OutputProcessor::Group::HVAC,
    1329              :                                 OutputProcessor::EndUseCat::Cooling);
    1330           44 :             SetupOutputVariable(state,
    1331              :                                 "Cooling Coil Total Cooling Energy",
    1332              :                                 Constant::Units::J,
    1333           22 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergyLoadTotal,
    1334              :                                 OutputProcessor::TimeStepType::System,
    1335              :                                 OutputProcessor::StoreType::Sum,
    1336           22 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
    1337              :                                 Constant::eResource::EnergyTransfer,
    1338              :                                 OutputProcessor::Group::HVAC,
    1339              :                                 OutputProcessor::EndUseCat::CoolingCoils);
    1340           44 :             SetupOutputVariable(state,
    1341              :                                 "Cooling Coil Sensible Cooling Energy",
    1342              :                                 Constant::Units::J,
    1343           22 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergySensible,
    1344              :                                 OutputProcessor::TimeStepType::System,
    1345              :                                 OutputProcessor::StoreType::Sum,
    1346           22 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    1347           44 :             SetupOutputVariable(state,
    1348              :                                 "Cooling Coil Latent Cooling Energy",
    1349              :                                 Constant::Units::J,
    1350           22 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergyLatent,
    1351              :                                 OutputProcessor::TimeStepType::System,
    1352              :                                 OutputProcessor::StoreType::Sum,
    1353           22 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    1354           44 :             SetupOutputVariable(state,
    1355              :                                 "Cooling Coil Source Side Heat Transfer Energy",
    1356              :                                 Constant::Units::J,
    1357           22 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergySource,
    1358              :                                 OutputProcessor::TimeStepType::System,
    1359              :                                 OutputProcessor::StoreType::Sum,
    1360           22 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    1361              : 
    1362           22 :             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           22 :         CurrentModuleObject = "Coil:Heating:WaterToAirHeatPump:VariableSpeedEquationFit";
    1370              : 
    1371           40 :         for (int CoilCounter = 1; CoilCounter <= NumHeat; ++CoilCounter) {
    1372              : 
    1373           18 :             ++DXCoilNum;
    1374              : 
    1375           18 :             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           18 :             GlobalNames::VerifyUniqueCoilName(state, CurrentModuleObject, AlphArray(1), ErrorsFound, CurrentModuleObject + " Name");
    1389              : 
    1390           18 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).bIsDesuperheater = false;
    1391           18 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name = AlphArray(1);
    1392           18 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CoolHeatType = "HEATING";
    1393           18 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType = HVAC::Coil_HeatingWaterToAirHPVSEquationFit; // fix coil type
    1394              : 
    1395           18 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VarSpeedCoilType =
    1396           36 :                 HVAC::cAllCoilTypes(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType);
    1397           18 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds = int(NumArray(1));
    1398           18 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel = int(NumArray(2));
    1399           18 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedCapHeat = NumArray(3);
    1400           18 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedAirVolFlowRate = NumArray(4);
    1401           18 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedWaterVolFlowRate = NumArray(5);
    1402           18 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserType = DataHeatBalance::RefrigCondenserType::Water;
    1403              : 
    1404              :             // Previously set by parent objects, but not user-definable
    1405           18 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MaxONOFFCyclesperHour = 4;
    1406           18 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).LatentCapacityTimeConstant = 0.;
    1407           18 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).FanDelayTime = 0.;
    1408              : 
    1409           18 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterInletNodeNum =
    1410           36 :                 GetOnlySingleNode(state,
    1411           18 :                                   AlphArray(2),
    1412              :                                   ErrorsFound,
    1413              :                                   DataLoopNode::ConnectionObjectType::CoilHeatingWaterToAirHeatPumpVariableSpeedEquationFit,
    1414           18 :                                   AlphArray(1),
    1415              :                                   DataLoopNode::NodeFluidType::Water,
    1416              :                                   DataLoopNode::ConnectionType::Inlet,
    1417              :                                   NodeInputManager::CompFluidStream::Secondary,
    1418              :                                   DataLoopNode::ObjectIsNotParent);
    1419           18 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterOutletNodeNum =
    1420           36 :                 GetOnlySingleNode(state,
    1421           18 :                                   AlphArray(3),
    1422              :                                   ErrorsFound,
    1423              :                                   DataLoopNode::ConnectionObjectType::CoilHeatingWaterToAirHeatPumpVariableSpeedEquationFit,
    1424           18 :                                   AlphArray(1),
    1425              :                                   DataLoopNode::NodeFluidType::Water,
    1426              :                                   DataLoopNode::ConnectionType::Outlet,
    1427              :                                   NodeInputManager::CompFluidStream::Secondary,
    1428              :                                   DataLoopNode::ObjectIsNotParent);
    1429           18 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirInletNodeNum =
    1430           36 :                 GetOnlySingleNode(state,
    1431           18 :                                   AlphArray(4),
    1432              :                                   ErrorsFound,
    1433              :                                   DataLoopNode::ConnectionObjectType::CoilHeatingWaterToAirHeatPumpVariableSpeedEquationFit,
    1434           18 :                                   AlphArray(1),
    1435              :                                   DataLoopNode::NodeFluidType::Air,
    1436              :                                   DataLoopNode::ConnectionType::Inlet,
    1437              :                                   NodeInputManager::CompFluidStream::Primary,
    1438              :                                   DataLoopNode::ObjectIsNotParent);
    1439           18 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirOutletNodeNum =
    1440           54 :                 GetOnlySingleNode(state,
    1441           18 :                                   AlphArray(5),
    1442              :                                   ErrorsFound,
    1443              :                                   DataLoopNode::ConnectionObjectType::CoilHeatingWaterToAirHeatPumpVariableSpeedEquationFit,
    1444           18 :                                   AlphArray(1),
    1445              :                                   DataLoopNode::NodeFluidType::Air,
    1446              :                                   DataLoopNode::ConnectionType::Outlet,
    1447              :                                   NodeInputManager::CompFluidStream::Primary,
    1448              :                                   DataLoopNode::ObjectIsNotParent);
    1449              : 
    1450           36 :             BranchNodeConnections::TestCompSet(state, CurrentModuleObject, AlphArray(1), AlphArray(2), AlphArray(3), "Water Nodes");
    1451           18 :             BranchNodeConnections::TestCompSet(state, CurrentModuleObject, AlphArray(1), AlphArray(4), AlphArray(5), "Air Nodes");
    1452              : 
    1453              :             //       If (VarSpeedCoil(DXCoilNum)%NumOfSpeeds .LT. 2) Then
    1454           18 :             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           18 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel >
    1463           18 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds) {
    1464            0 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel =
    1465            0 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds;
    1466              :             }
    1467              : 
    1468           18 :             if ((state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel >
    1469           36 :                  state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds) ||
    1470           18 :                 (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           18 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PLFFPLR = Curve::GetCurveIndex(state, AlphArray(6)); // convert curve name to number
    1480           18 :             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           18 :                 CurveVal = Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PLFFPLR, 1.0);
    1495           18 :                 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          198 :             for (int I = 1; I <= state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds; ++I) {
    1507          180 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(I) = NumArray(6 + (I - 1) * 5);
    1508          180 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedCOP(I) = NumArray(7 + (I - 1) * 5);
    1509          180 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirVolFlowRate(I) = NumArray(8 + (I - 1) * 5);
    1510          180 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedWaterVolFlowRate(I) = NumArray(9 + (I - 1) * 5);
    1511          180 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWasteHeatFrac(I) = NumArray(10 + (I - 1) * 5);
    1512              : 
    1513          180 :                 AlfaFieldIncre = 7 + (I - 1) * 7;
    1514          180 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(I) =
    1515          180 :                     Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
    1516          180 :                 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          540 :                     ErrorsFound |= Curve::CheckCurveDims(state,
    1536          180 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(I), // Curve index
    1537              :                                                          {2},                                                                  // Valid dimensions
    1538              :                                                          RoutineName,                                                          // Routine name
    1539              :                                                          CurrentModuleObject,                                                  // Object Type
    1540          180 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,           // Object Name
    1541          180 :                                                          cAlphaFields(AlfaFieldIncre));                                        // Field Name
    1542              : 
    1543          180 :                     if (!ErrorsFound) {
    1544          360 :                         CurveVal = Curve::CurveValue(state,
    1545          180 :                                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(I),
    1546              :                                                      RatedInletAirTempHeat,
    1547              :                                                      RatedInletWaterTempHeat);
    1548          180 :                         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          180 :                 AlfaFieldIncre = 8 + (I - 1) * 7;
    1562          180 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(I) =
    1563          180 :                     Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
    1564          180 :                 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          540 :                     ErrorsFound |= Curve::CheckCurveDims(state,
    1584          180 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(I), // Curve index
    1585              :                                                          {1},                                                                     // Valid dimensions
    1586              :                                                          RoutineName,                                                             // Routine name
    1587              :                                                          CurrentModuleObject,                                                     // Object Type
    1588          180 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,              // Object Name
    1589          180 :                                                          cAlphaFields(AlfaFieldIncre));                                           // Field Name
    1590              : 
    1591          180 :                     if (!ErrorsFound) {
    1592          180 :                         CurveVal = Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(I), 1.0);
    1593          180 :                         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          180 :                 AlfaFieldIncre = 9 + (I - 1) * 7;
    1607          180 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapWaterFFlow(I) =
    1608          180 :                     Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
    1609          180 :                 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          540 :                     ErrorsFound |= Curve::CheckCurveDims(state,
    1629          180 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapWaterFFlow(I), // Curve index
    1630              :                                                          {1},                                                        // Valid dimensions
    1631              :                                                          RoutineName,                                                // Routine name
    1632              :                                                          CurrentModuleObject,                                        // Object Type
    1633          180 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name, // Object Name
    1634          180 :                                                          cAlphaFields(AlfaFieldIncre));                              // Field Name
    1635              : 
    1636          180 :                     if (!ErrorsFound) {
    1637          180 :                         CurveVal = Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapWaterFFlow(I), 1.0);
    1638          180 :                         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          180 :                 AlfaFieldIncre = 10 + (I - 1) * 7;
    1652          180 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(I) =
    1653          180 :                     Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
    1654          180 :                 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          540 :                     ErrorsFound |= Curve::CheckCurveDims(state,
    1674          180 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(I), // Curve index
    1675              :                                                          {2},                                                                 // Valid dimensions
    1676              :                                                          RoutineName,                                                         // Routine name
    1677              :                                                          CurrentModuleObject,                                                 // Object Type
    1678          180 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,          // Object Name
    1679          180 :                                                          cAlphaFields(AlfaFieldIncre));                                       // Field Name
    1680              : 
    1681          180 :                     if (!ErrorsFound) {
    1682          360 :                         CurveVal = Curve::CurveValue(state,
    1683          180 :                                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(I),
    1684              :                                                      RatedInletAirTempHeat,
    1685              :                                                      RatedInletWaterTempHeat);
    1686          180 :                         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          180 :                 AlfaFieldIncre = 11 + (I - 1) * 7;
    1700          180 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(I) =
    1701          180 :                     Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
    1702          180 :                 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          540 :                     ErrorsFound |= Curve::CheckCurveDims(state,
    1722          180 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(I), // Curve index
    1723              :                                                          {1},                                                                    // Valid dimensions
    1724              :                                                          RoutineName,                                                            // Routine name
    1725              :                                                          CurrentModuleObject,                                                    // Object Type
    1726          180 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,             // Object Name
    1727          180 :                                                          cAlphaFields(AlfaFieldIncre));                                          // Field Name
    1728              : 
    1729          180 :                     if (!ErrorsFound) {
    1730          180 :                         CurveVal = Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(I), 1.0);
    1731          180 :                         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          180 :                 AlfaFieldIncre = 12 + (I - 1) * 7;
    1745          180 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRWaterFFlow(I) =
    1746          180 :                     Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
    1747          180 :                 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          540 :                     ErrorsFound |= Curve::CheckCurveDims(state,
    1767          180 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRWaterFFlow(I), // Curve index
    1768              :                                                          {1},                                                                      // Valid dimensions
    1769              :                                                          RoutineName,                                                              // Routine name
    1770              :                                                          CurrentModuleObject,                                                      // Object Type
    1771          180 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,               // Object Name
    1772          180 :                                                          cAlphaFields(AlfaFieldIncre));                                            // Field Name
    1773              : 
    1774          180 :                     if (!ErrorsFound) {
    1775          180 :                         CurveVal = Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRWaterFFlow(I), 1.0);
    1776          180 :                         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          180 :                 AlfaFieldIncre = 13 + (I - 1) * 7;
    1790              :                 // Read waste heat modifier curve name
    1791          180 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWasteHeat(I) =
    1792          180 :                     Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
    1793          180 :                 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          540 :                     ErrorsFound |= Curve::CheckCurveDims(state,
    1813          180 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWasteHeat(I), // Curve index
    1814              :                                                          {2},                                                                  // Valid dimensions
    1815              :                                                          RoutineName,                                                          // Routine name
    1816              :                                                          CurrentModuleObject,                                                  // Object Type
    1817          180 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,           // Object Name
    1818          180 :                                                          cAlphaFields(AlfaFieldIncre));                                        // Field Name
    1819              : 
    1820          180 :                     if (!ErrorsFound) {
    1821          360 :                         CurveVal = Curve::CurveValue(state,
    1822          180 :                                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWasteHeat(I),
    1823              :                                                      RatedInletAirTempHeat,
    1824              :                                                      RatedInletWaterTempHeat);
    1825          180 :                         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          198 :             for (int I = 1; I <= state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds; ++I) {
    1840          180 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedPercentTotCap(I) =
    1841          180 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(I) /
    1842          360 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(
    1843          180 :                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds);
    1844          180 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirVolFlowPerRatedTotCap(I) =
    1845          180 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirVolFlowRate(I) /
    1846          180 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(I);
    1847          180 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedWaterVolFlowPerRatedTotCap(I) =
    1848          180 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedWaterVolFlowRate(I) /
    1849          180 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(I);
    1850              :             }
    1851              : 
    1852              :             // CurrentModuleObject = "Coil:Heating:WaterToAirHeatPump:VariableSpeedEquationFit"
    1853           36 :             SetupOutputVariable(state,
    1854              :                                 "Heating Coil Electricity Energy",
    1855              :                                 Constant::Units::J,
    1856           18 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Energy,
    1857              :                                 OutputProcessor::TimeStepType::System,
    1858              :                                 OutputProcessor::StoreType::Sum,
    1859           18 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
    1860              :                                 Constant::eResource::Electricity,
    1861              :                                 OutputProcessor::Group::HVAC,
    1862              :                                 OutputProcessor::EndUseCat::Heating);
    1863           36 :             SetupOutputVariable(state,
    1864              :                                 "Heating Coil Heating Energy",
    1865              :                                 Constant::Units::J,
    1866           18 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergyLoadTotal,
    1867              :                                 OutputProcessor::TimeStepType::System,
    1868              :                                 OutputProcessor::StoreType::Sum,
    1869           18 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
    1870              :                                 Constant::eResource::EnergyTransfer,
    1871              :                                 OutputProcessor::Group::HVAC,
    1872              :                                 OutputProcessor::EndUseCat::HeatingCoils);
    1873           36 :             SetupOutputVariable(state,
    1874              :                                 "Heating Coil Source Side Heat Transfer Energy",
    1875              :                                 Constant::Units::J,
    1876           18 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergySource,
    1877              :                                 OutputProcessor::TimeStepType::System,
    1878              :                                 OutputProcessor::StoreType::Sum,
    1879           18 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
    1880              :                                 Constant::eResource::PlantLoopHeatingDemand,
    1881              :                                 OutputProcessor::Group::HVAC,
    1882              :                                 OutputProcessor::EndUseCat::HeatingCoils);
    1883              : 
    1884              :             // create predefined report entries
    1885           36 :             OutputReportPredefined::PreDefTableEntry(
    1886           18 :                 state, state.dataOutRptPredefined->pdchHeatCoilType, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name, CurrentModuleObject);
    1887           36 :             OutputReportPredefined::PreDefTableEntry(state,
    1888           18 :                                                      state.dataOutRptPredefined->pdchHeatCoilNomCap,
    1889           18 :                                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
    1890           18 :                                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedCapHeat);
    1891           36 :             OutputReportPredefined::PreDefTableEntry(state,
    1892           18 :                                                      state.dataOutRptPredefined->pdchHeatCoilNomEff,
    1893           18 :                                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
    1894           36 :                                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedCOP(
    1895           18 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel));
    1896              :         }
    1897              : 
    1898              :         //-------------------------AIR SOURCE, HEATING---BEGIN
    1899              :         // Get the data for heating coil, AIR SOURCE
    1900           22 :         CurrentModuleObject = "COIL:HEATING:DX:VARIABLESPEED";
    1901              : 
    1902           31 :         for (int CoilCounter = 1; CoilCounter <= NumHeatAS; ++CoilCounter) {
    1903              : 
    1904            9 :             ++DXCoilNum;
    1905              : 
    1906            9 :             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            9 :             GlobalNames::VerifyUniqueCoilName(state, CurrentModuleObject, AlphArray(1), ErrorsFound, CurrentModuleObject + " Name");
    1920              : 
    1921            9 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).bIsDesuperheater = false;
    1922            9 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name = AlphArray(1);
    1923            9 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CoolHeatType = "HEATING";
    1924            9 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType = HVAC::Coil_HeatingAirToAirVariableSpeed;
    1925            9 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VarSpeedCoilType = HVAC::cAllCoilTypes(HVAC::Coil_HeatingAirToAirVariableSpeed);
    1926            9 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds = int(NumArray(1));
    1927            9 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel = int(NumArray(2));
    1928            9 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedCapHeat = NumArray(3);
    1929            9 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedAirVolFlowRate = NumArray(4);
    1930              : 
    1931              :             // Previously set by parent objects, but not user-definable
    1932            9 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MaxONOFFCyclesperHour = 4;
    1933            9 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).LatentCapacityTimeConstant = 0.;
    1934            9 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).FanDelayTime = 0.;
    1935              : 
    1936            9 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirInletNodeNum =
    1937           18 :                 GetOnlySingleNode(state,
    1938            9 :                                   AlphArray(2),
    1939              :                                   ErrorsFound,
    1940              :                                   DataLoopNode::ConnectionObjectType::CoilHeatingDXVariableSpeed,
    1941            9 :                                   AlphArray(1),
    1942              :                                   DataLoopNode::NodeFluidType::Air,
    1943              :                                   DataLoopNode::ConnectionType::Inlet,
    1944              :                                   NodeInputManager::CompFluidStream::Primary,
    1945              :                                   DataLoopNode::ObjectIsNotParent);
    1946            9 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirOutletNodeNum =
    1947           27 :                 GetOnlySingleNode(state,
    1948            9 :                                   AlphArray(3),
    1949              :                                   ErrorsFound,
    1950              :                                   DataLoopNode::ConnectionObjectType::CoilHeatingDXVariableSpeed,
    1951            9 :                                   AlphArray(1),
    1952              :                                   DataLoopNode::NodeFluidType::Air,
    1953              :                                   DataLoopNode::ConnectionType::Outlet,
    1954              :                                   NodeInputManager::CompFluidStream::Primary,
    1955              :                                   DataLoopNode::ObjectIsNotParent);
    1956              : 
    1957            9 :             BranchNodeConnections::TestCompSet(state, CurrentModuleObject, AlphArray(1), AlphArray(2), AlphArray(3), "Air Nodes");
    1958              : 
    1959            9 :             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            9 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel >
    1968            9 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds) {
    1969            0 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel =
    1970            0 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds;
    1971              :             }
    1972              : 
    1973            9 :             if ((state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel >
    1974           18 :                  state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds) ||
    1975            9 :                 (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            9 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PLFFPLR = Curve::GetCurveIndex(state, AlphArray(4)); // convert curve name to number
    1985            9 :             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            9 :                 CurveVal = Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PLFFPLR, 1.0);
    2000            9 :                 if (CurveVal > 1.10 || CurveVal < 0.90) {
    2001            0 :                     ShowWarningError(state,
    2002            0 :                                      format("{}{}=\"{}\", curve values",
    2003              :                                             RoutineName,
    2004              :                                             CurrentModuleObject,
    2005            0 :                                             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    2006            0 :                     ShowContinueError(state, format("...{} output is not equal to 1.0 (+ or - 10%) at rated conditions.", cAlphaFields(4)));
    2007            0 :                     ShowContinueError(state, format("...Curve output at rated conditions = {:.3T}", CurveVal));
    2008              :                 }
    2009              :             }
    2010              : 
    2011            9 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostEIRFT =
    2012            9 :                 Curve::GetCurveIndex(state, AlphArray(5)); // convert curve name to number
    2013              : 
    2014            9 :             if (!lAlphaBlanks(6)) {
    2015            1 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterCapacityCurveIndex = Curve::GetCurveIndex(state, AlphArray(6));
    2016              : 
    2017            1 :                 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            1 :                     ErrorsFound |=
    2027            4 :                         Curve::CheckCurveDims(state,
    2028            1 :                                               state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterCapacityCurveIndex, // Curve index
    2029              :                                               {1},                                                        // Valid dimensions
    2030              :                                               RoutineName,                                                // Routine name
    2031              :                                               CurrentModuleObject,                                        // Object Type
    2032            1 :                                               state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name, // Object Name
    2033            1 :                                               cAlphaFields(6));                                           // Field Name
    2034              :                 }
    2035              :             }
    2036              : 
    2037            9 :             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            9 :             if (Util::SameString(AlphArray(7), "ReverseCycle")) {
    2069            0 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostStrategy = ReverseCycle;
    2070              :             }
    2071            9 :             if (Util::SameString(AlphArray(7), "Resistive")) {
    2072            9 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostStrategy = Resistive;
    2073              :             }
    2074            9 :             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            9 :             if (Util::SameString(AlphArray(8), "Timed")) {
    2084            7 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostControl = Timed;
    2085              :             }
    2086            9 :             if (Util::SameString(AlphArray(8), "OnDemand")) {
    2087            2 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostControl = OnDemand;
    2088              :             }
    2089            9 :             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            9 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MinOATCompressor = NumArray(5);
    2100              : 
    2101              :             // reserved for HSPF calculation
    2102            9 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OATempCompressorOn = NumArray(6);
    2103              : 
    2104              :             // Set maximum outdoor temp for defrost to occur
    2105            9 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MaxOATDefrost = NumArray(7);
    2106              : 
    2107              :             // Set crankcase heater capacity
    2108            9 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterCapacity = NumArray(8);
    2109            9 :             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            9 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MaxOATCrankcaseHeater = NumArray(9);
    2120              : 
    2121              :             // Set defrost time period
    2122            9 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostTime = NumArray(10);
    2123            9 :             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            9 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostCapacity = NumArray(11);
    2132            9 :             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           89 :             for (int I = 1; I <= state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds; ++I) {
    2140           80 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(I) = NumArray(12 + (I - 1) * 5);
    2141           80 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedCOP(I) = NumArray(13 + (I - 1) * 5);
    2142           80 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirVolFlowRate(I) = NumArray(14 + (I - 1) * 5);
    2143           80 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedEvaporatorFanPowerPerVolumeFlowRate2017(I) = NumArray(15 + (I - 1) * 5);
    2144           80 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedEvaporatorFanPowerPerVolumeFlowRate2023(I) = NumArray(16 + (I - 1) * 5);
    2145              : 
    2146           80 :                 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           80 :                 AlfaFieldIncre = 9 + (I - 1) * 4;
    2160           80 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(I) =
    2161           80 :                     Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
    2162           80 :                 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          240 :                     ErrorsFound |= Curve::CheckCurveDims(state,
    2182           80 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(I), // Curve index
    2183              :                                                          {2},                                                                  // Valid dimensions
    2184              :                                                          RoutineName,                                                          // Routine name
    2185              :                                                          CurrentModuleObject,                                                  // Object Type
    2186           80 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,           // Object Name
    2187           80 :                                                          cAlphaFields(AlfaFieldIncre));                                        // Field Name
    2188              : 
    2189           80 :                     if (!ErrorsFound) {
    2190          160 :                         CurveVal = Curve::CurveValue(
    2191           80 :                             state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(I), RatedInletAirTempHeat, RatedAmbAirTempHeat);
    2192           80 :                         if (CurveVal > 1.10 || CurveVal < 0.90) {
    2193            0 :                             ShowWarningError(state,
    2194            0 :                                              format("{}{}=\"{}\", curve values",
    2195              :                                                     RoutineName,
    2196              :                                                     CurrentModuleObject,
    2197            0 :                                                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    2198            0 :                             ShowContinueError(
    2199            0 :                                 state, format("...{} output is not equal to 1.0 (+ or - 10%) at rated conditions.", cAlphaFields(AlfaFieldIncre)));
    2200            0 :                             ShowContinueError(state, format("...Curve output at rated conditions = {:.3T}", CurveVal));
    2201              :                         }
    2202              :                     }
    2203              :                 }
    2204              : 
    2205           80 :                 AlfaFieldIncre = 10 + (I - 1) * 4;
    2206           80 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(I) =
    2207           80 :                     Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
    2208           80 :                 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          240 :                     ErrorsFound |= Curve::CheckCurveDims(state,
    2228           80 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(I), // Curve index
    2229              :                                                          {1},                                                                     // Valid dimensions
    2230              :                                                          RoutineName,                                                             // Routine name
    2231              :                                                          CurrentModuleObject,                                                     // Object Type
    2232           80 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,              // Object Name
    2233           80 :                                                          cAlphaFields(AlfaFieldIncre));                                           // Field Name
    2234              : 
    2235           80 :                     if (!ErrorsFound) {
    2236           80 :                         CurveVal = Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(I), 1.0);
    2237           80 :                         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           80 :                 AlfaFieldIncre = 11 + (I - 1) * 4;
    2251           80 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(I) =
    2252           80 :                     Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
    2253           80 :                 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          240 :                     ErrorsFound |= Curve::CheckCurveDims(state,
    2273           80 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(I), // Curve index
    2274              :                                                          {2},                                                                 // Valid dimensions
    2275              :                                                          RoutineName,                                                         // Routine name
    2276              :                                                          CurrentModuleObject,                                                 // Object Type
    2277           80 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,          // Object Name
    2278           80 :                                                          cAlphaFields(AlfaFieldIncre));                                       // Field Name
    2279              : 
    2280           80 :                     if (!ErrorsFound) {
    2281          160 :                         CurveVal = Curve::CurveValue(
    2282           80 :                             state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(I), RatedInletAirTempHeat, RatedAmbAirTempHeat);
    2283           80 :                         if (CurveVal > 1.10 || CurveVal < 0.90) {
    2284            0 :                             ShowWarningError(state,
    2285            0 :                                              format("{}{}=\"{}\", curve values",
    2286              :                                                     RoutineName,
    2287              :                                                     CurrentModuleObject,
    2288            0 :                                                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    2289            0 :                             ShowContinueError(
    2290            0 :                                 state, format("...{} output is not equal to 1.0 (+ or - 10%) at rated conditions.", cAlphaFields(AlfaFieldIncre)));
    2291            0 :                             ShowContinueError(state, format("...Curve output at rated conditions = {:.3T}", CurveVal));
    2292              :                         }
    2293              :                     }
    2294              :                 }
    2295              : 
    2296           80 :                 AlfaFieldIncre = 12 + (I - 1) * 4;
    2297           80 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(I) =
    2298           80 :                     Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
    2299           80 :                 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          240 :                     ErrorsFound |= Curve::CheckCurveDims(state,
    2319           80 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(I), // Curve index
    2320              :                                                          {1},                                                                    // Valid dimensions
    2321              :                                                          RoutineName,                                                            // Routine name
    2322              :                                                          CurrentModuleObject,                                                    // Object Type
    2323           80 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,             // Object Name
    2324           80 :                                                          cAlphaFields(AlfaFieldIncre));                                          // Field Name
    2325              : 
    2326           80 :                     if (!ErrorsFound) {
    2327           80 :                         CurveVal = Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(I), 1.0);
    2328           80 :                         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            9 :             if (ErrorsFound) {
    2343            0 :                 continue;
    2344              :             }
    2345              : 
    2346           89 :             for (int I = 1; I <= state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds; ++I) {
    2347           80 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedPercentTotCap(I) =
    2348           80 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(I) /
    2349          160 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(
    2350           80 :                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds);
    2351           80 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirVolFlowPerRatedTotCap(I) =
    2352           80 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirVolFlowRate(I) /
    2353           80 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(I);
    2354              :             }
    2355              : 
    2356              :             // CurrentModuleObject = "Coil:Heating:DX:Variablespeed "
    2357           18 :             SetupOutputVariable(state,
    2358              :                                 "Heating Coil Electricity Energy",
    2359              :                                 Constant::Units::J,
    2360            9 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Energy,
    2361              :                                 OutputProcessor::TimeStepType::System,
    2362              :                                 OutputProcessor::StoreType::Sum,
    2363            9 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
    2364              :                                 Constant::eResource::Electricity,
    2365              :                                 OutputProcessor::Group::HVAC,
    2366              :                                 OutputProcessor::EndUseCat::Heating);
    2367           18 :             SetupOutputVariable(state,
    2368              :                                 "Heating Coil Heating Energy",
    2369              :                                 Constant::Units::J,
    2370            9 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergyLoadTotal,
    2371              :                                 OutputProcessor::TimeStepType::System,
    2372              :                                 OutputProcessor::StoreType::Sum,
    2373            9 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
    2374              :                                 Constant::eResource::EnergyTransfer,
    2375              :                                 OutputProcessor::Group::HVAC,
    2376              :                                 OutputProcessor::EndUseCat::HeatingCoils);
    2377           18 :             SetupOutputVariable(state,
    2378              :                                 "Heating Coil Source Side Heat Transfer Energy",
    2379              :                                 Constant::Units::J,
    2380            9 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergySource,
    2381              :                                 OutputProcessor::TimeStepType::System,
    2382              :                                 OutputProcessor::StoreType::Sum,
    2383            9 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    2384              : 
    2385              :             // create predefined report entries
    2386           18 :             OutputReportPredefined::PreDefTableEntry(
    2387            9 :                 state, state.dataOutRptPredefined->pdchHeatCoilType, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name, CurrentModuleObject);
    2388           18 :             OutputReportPredefined::PreDefTableEntry(state,
    2389            9 :                                                      state.dataOutRptPredefined->pdchHeatCoilNomCap,
    2390            9 :                                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
    2391            9 :                                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedCapHeat);
    2392           18 :             OutputReportPredefined::PreDefTableEntry(state,
    2393            9 :                                                      state.dataOutRptPredefined->pdchHeatCoilNomEff,
    2394            9 :                                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
    2395           18 :                                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedCOP(
    2396            9 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel));
    2397              :         }
    2398              : 
    2399              :         //-------------------------AIR SOURCE HEATING---END
    2400              : 
    2401              :         //------------------------VARIABLE-SPEED AIR SOURCE HPWH---BEGIN
    2402           22 :         CurrentModuleObject = "COIL:WATERHEATING:AIRTOWATERHEATPUMP:VARIABLESPEED"; // for reporting
    2403              : 
    2404           32 :         for (int CoilCounter = 1; CoilCounter <= NumHPWHAirToWater; ++CoilCounter) {
    2405              : 
    2406           10 :             ++DXCoilNum;
    2407              : 
    2408           10 :             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           10 :             GlobalNames::VerifyUniqueCoilName(state, CurrentModuleObject, AlphArray(1), ErrorsFound, CurrentModuleObject + " Name");
    2422              : 
    2423           10 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).bIsDesuperheater = false;
    2424           10 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserType = DataHeatBalance::RefrigCondenserType::WaterHeater;
    2425           10 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CoolHeatType = "WATERHEATING";
    2426           10 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType = HVAC::CoilDX_HeatPumpWaterHeaterVariableSpeed;
    2427           10 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VarSpeedCoilType =
    2428           20 :                 HVAC::cAllCoilTypes(HVAC::CoilDX_HeatPumpWaterHeaterVariableSpeed);
    2429              : 
    2430           10 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name = AlphArray(1);
    2431           10 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds = int(NumArray(1));
    2432           10 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel = int(NumArray(2));
    2433              : 
    2434           10 :             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           10 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel >
    2443           10 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds) {
    2444            0 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel =
    2445            0 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds;
    2446              :             }
    2447              : 
    2448           10 :             if ((state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel >
    2449           20 :                  state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds) ||
    2450           10 :                 (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           10 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedCapWH = NumArray(3);
    2459           10 :             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           10 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WHRatedInletDBTemp = NumArray(4);
    2468           10 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WHRatedInletWBTemp = NumArray(5);
    2469           10 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WHRatedInletWaterTemp = NumArray(6);
    2470              : 
    2471           10 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedAirVolFlowRate = NumArray(7);
    2472           10 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedWaterVolFlowRate = NumArray(8);
    2473              : 
    2474           10 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedAirVolFlowRate != Constant::AutoCalculate) {
    2475            6 :                 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           10 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedWaterVolFlowRate != Constant::AutoCalculate) {
    2485            6 :                 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           10 :             if (Util::SameString(AlphArray(2), "Yes") || Util::SameString(AlphArray(2), "No")) {
    2495              :                 //  initialized to TRUE on allocate
    2496           10 :                 if (Util::SameString(AlphArray(2), "No")) {
    2497            9 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).FanPowerIncludedInCOP = false;
    2498              :                 } else {
    2499            1 :                     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           10 :             if (Util::SameString(AlphArray(3), "Yes") || Util::SameString(AlphArray(3), "No")) {
    2511              :                 //  initialized to FALSE on allocate
    2512           10 :                 if (Util::SameString(AlphArray(3), "Yes")) {
    2513            0 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondPumpPowerInCOP = true;
    2514              :                 } else {
    2515           10 :                     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           10 :             if (Util::SameString(AlphArray(4), "Yes") || Util::SameString(AlphArray(4), "No")) {
    2527              :                 //  initialized to FALSE on allocate
    2528           10 :                 if (Util::SameString(AlphArray(4), "Yes")) {
    2529            0 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondPumpHeatInCapacity = true;
    2530              :                 } else {
    2531           10 :                     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           10 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpFracToWater = NumArray(9);
    2543           20 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpFracToWater <= 0.0 ||
    2544           10 :                 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           10 :             if (!state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondPumpHeatInCapacity) {
    2553           10 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpFracToWater = 0.0;
    2554              :             }
    2555              : 
    2556              :             // Air nodes
    2557           10 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirInletNodeNum =
    2558           20 :                 GetOnlySingleNode(state,
    2559           10 :                                   AlphArray(5),
    2560              :                                   ErrorsFound,
    2561              :                                   DataLoopNode::ConnectionObjectType::CoilWaterHeatingAirToWaterHeatPumpVariableSpeed,
    2562           10 :                                   AlphArray(1),
    2563              :                                   DataLoopNode::NodeFluidType::Air,
    2564              :                                   DataLoopNode::ConnectionType::Inlet,
    2565              :                                   NodeInputManager::CompFluidStream::Primary,
    2566              :                                   DataLoopNode::ObjectIsNotParent);
    2567              : 
    2568           10 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirOutletNodeNum =
    2569           30 :                 GetOnlySingleNode(state,
    2570           10 :                                   AlphArray(6),
    2571              :                                   ErrorsFound,
    2572              :                                   DataLoopNode::ConnectionObjectType::CoilWaterHeatingAirToWaterHeatPumpVariableSpeed,
    2573           10 :                                   AlphArray(1),
    2574              :                                   DataLoopNode::NodeFluidType::Air,
    2575              :                                   DataLoopNode::ConnectionType::Outlet,
    2576              :                                   NodeInputManager::CompFluidStream::Primary,
    2577              :                                   DataLoopNode::ObjectIsNotParent);
    2578              : 
    2579           10 :             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           10 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).IsDXCoilInZone =
    2583           10 :                 !OutAirNodeManager::CheckOutAirNodeNumber(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirInletNodeNum);
    2584              : 
    2585              :             // Water nodes
    2586           10 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterInletNodeNum =
    2587           20 :                 GetOnlySingleNode(state,
    2588           10 :                                   AlphArray(7),
    2589              :                                   ErrorsFound,
    2590              :                                   DataLoopNode::ConnectionObjectType::CoilWaterHeatingAirToWaterHeatPumpVariableSpeed,
    2591           10 :                                   AlphArray(1),
    2592              :                                   DataLoopNode::NodeFluidType::Water,
    2593              :                                   DataLoopNode::ConnectionType::Inlet,
    2594              :                                   NodeInputManager::CompFluidStream::Secondary,
    2595              :                                   DataLoopNode::ObjectIsNotParent);
    2596              : 
    2597           10 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterOutletNodeNum =
    2598           30 :                 GetOnlySingleNode(state,
    2599           10 :                                   AlphArray(8),
    2600              :                                   ErrorsFound,
    2601              :                                   DataLoopNode::ConnectionObjectType::CoilWaterHeatingAirToWaterHeatPumpVariableSpeed,
    2602           10 :                                   AlphArray(1),
    2603              :                                   DataLoopNode::NodeFluidType::Water,
    2604              :                                   DataLoopNode::ConnectionType::Outlet,
    2605              :                                   NodeInputManager::CompFluidStream::Secondary,
    2606              :                                   DataLoopNode::ObjectIsNotParent);
    2607              : 
    2608           10 :             BranchNodeConnections::TestCompSet(state, CurrentModuleObject, AlphArray(1), AlphArray(7), AlphArray(8), "Water Nodes");
    2609              : 
    2610           10 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterCapacity = NumArray(10);
    2611           10 :             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           10 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MaxOATCrankcaseHeater = NumArray(11);
    2620           10 :             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           10 :             if (!lAlphaBlanks(9)) {
    2629            0 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterCapacityCurveIndex = Curve::GetCurveIndex(state, AlphArray(9));
    2630            0 :                 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            0 :                     ErrorsFound |=
    2640            0 :                         Curve::CheckCurveDims(state,
    2641            0 :                                               state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterCapacityCurveIndex, // Curve index
    2642              :                                               {1},                                                        // Valid dimensions
    2643              :                                               RoutineName,                                                // Routine name
    2644              :                                               CurrentModuleObject,                                        // Object Type
    2645            0 :                                               state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name, // Object Name
    2646            0 :                                               cAlphaFields(9));                                           // Field Name
    2647              :                 }
    2648              :             }
    2649              : 
    2650           10 :             if (Util::SameString(AlphArray(10), "DryBulbTemperature")) {
    2651            0 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirTemperatureType = HVAC::OATType::DryBulb;
    2652           10 :             } else if (Util::SameString(AlphArray(10), "WetBulbTemperature")) {
    2653           10 :                 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           10 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirTemperatureType == HVAC::OATType::WetBulb) {
    2666           10 :                 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           10 :             WHInletWaterTemp = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WHRatedInletWaterTemp;
    2672              : 
    2673              :             // part load curve
    2674           10 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PLFFPLR =
    2675           10 :                 Curve::GetCurveIndex(state, AlphArray(11)); // convert curve name to number
    2676           10 :             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           10 :                 CurveVal = Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PLFFPLR, 1.0);
    2691           10 :                 if (CurveVal > 1.10 || CurveVal < 0.90) {
    2692            0 :                     ShowWarningError(state,
    2693            0 :                                      format("{}{}=\"{}\", curve values",
    2694              :                                             RoutineName,
    2695              :                                             CurrentModuleObject,
    2696            0 :                                             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    2697            0 :                     ShowContinueError(state, format("...{} output is not equal to 1.0 (+ or - 10%) at rated conditions.", cAlphaFields(11)));
    2698            0 :                     ShowContinueError(state, format("...Curve output at rated conditions = {:.3T}", CurveVal));
    2699              :                 }
    2700              :             }
    2701              : 
    2702          110 :             for (int I = 1; I <= state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds; ++I) {
    2703          100 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(I) = NumArray(12 + (I - 1) * 6);
    2704          100 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedCOP(I) = NumArray(13 + (I - 1) * 6);
    2705          100 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedSHR(I) = NumArray(14 + (I - 1) * 6);
    2706          100 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirVolFlowRate(I) = NumArray(15 + (I - 1) * 6);
    2707          100 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedWaterVolFlowRate(I) = NumArray(16 + (I - 1) * 6);
    2708          100 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWHPumpPower(I) = NumArray(17 + (I - 1) * 6);
    2709              : 
    2710          100 :                 AlfaFieldIncre = 12 + (I - 1) * 6;
    2711          100 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(I) =
    2712          100 :                     Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
    2713          100 :                 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          300 :                     ErrorsFound |= Curve::CheckCurveDims(state,
    2733          100 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(I), // Curve index
    2734              :                                                          {2},                                                                  // Valid dimensions
    2735              :                                                          RoutineName,                                                          // Routine name
    2736              :                                                          CurrentModuleObject,                                                  // Object Type
    2737          100 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,           // Object Name
    2738          100 :                                                          cAlphaFields(AlfaFieldIncre));                                        // Field Name
    2739              : 
    2740          100 :                     if (!ErrorsFound) {
    2741          200 :                         CurveVal = Curve::CurveValue(
    2742          100 :                             state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(I), WHInletAirTemp, WHInletWaterTemp);
    2743          100 :                         if (CurveVal > 1.10 || CurveVal < 0.90) {
    2744            0 :                             ShowWarningError(state,
    2745            0 :                                              format("{}{}=\"{}\", curve values",
    2746              :                                                     RoutineName,
    2747              :                                                     CurrentModuleObject,
    2748            0 :                                                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    2749            0 :                             ShowContinueError(
    2750            0 :                                 state, format("...{} output is not equal to 1.0 (+ or - 10%) at rated conditions.", cAlphaFields(AlfaFieldIncre)));
    2751            0 :                             ShowContinueError(state, format("...Curve output at rated conditions = {:.3T}", CurveVal));
    2752              :                         }
    2753              :                     }
    2754              :                 }
    2755              : 
    2756          100 :                 AlfaFieldIncre = 13 + (I - 1) * 6;
    2757          100 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(I) =
    2758          100 :                     Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
    2759          100 :                 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          300 :                     ErrorsFound |= Curve::CheckCurveDims(state,
    2779          100 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(I), // Curve index
    2780              :                                                          {1},                                                                     // Valid dimensions
    2781              :                                                          RoutineName,                                                             // Routine name
    2782              :                                                          CurrentModuleObject,                                                     // Object Type
    2783          100 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,              // Object Name
    2784          100 :                                                          cAlphaFields(AlfaFieldIncre));                                           // Field Name
    2785              : 
    2786          100 :                     if (!ErrorsFound) {
    2787          100 :                         CurveVal = Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(I), 1.0);
    2788          100 :                         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          100 :                 AlfaFieldIncre = 14 + (I - 1) * 6;
    2802          100 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapWaterFFlow(I) =
    2803          100 :                     Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
    2804          100 :                 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          300 :                     ErrorsFound |= Curve::CheckCurveDims(state,
    2824          100 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapWaterFFlow(I), // Curve index
    2825              :                                                          {1},                                                        // Valid dimensions
    2826              :                                                          RoutineName,                                                // Routine name
    2827              :                                                          CurrentModuleObject,                                        // Object Type
    2828          100 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name, // Object Name
    2829          100 :                                                          cAlphaFields(AlfaFieldIncre));                              // Field Name
    2830              : 
    2831          100 :                     if (!ErrorsFound) {
    2832          100 :                         CurveVal = Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapWaterFFlow(I), 1.0);
    2833          100 :                         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          100 :                 AlfaFieldIncre = 15 + (I - 1) * 6;
    2847          100 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(I) =
    2848          100 :                     Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
    2849          100 :                 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          300 :                     ErrorsFound |= Curve::CheckCurveDims(state,
    2869          100 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(I), // Curve index
    2870              :                                                          {2},                                                                 // Valid dimensions
    2871              :                                                          RoutineName,                                                         // Routine name
    2872              :                                                          CurrentModuleObject,                                                 // Object Type
    2873          100 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,          // Object Name
    2874          100 :                                                          cAlphaFields(AlfaFieldIncre));                                       // Field Name
    2875              : 
    2876          100 :                     if (!ErrorsFound) {
    2877          200 :                         CurveVal = Curve::CurveValue(
    2878          100 :                             state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(I), WHInletAirTemp, WHInletWaterTemp);
    2879          100 :                         if (CurveVal > 1.10 || CurveVal < 0.90) {
    2880            0 :                             ShowWarningError(state,
    2881            0 :                                              format("{}{}=\"{}\", curve values",
    2882              :                                                     RoutineName,
    2883              :                                                     CurrentModuleObject,
    2884            0 :                                                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name));
    2885            0 :                             ShowContinueError(
    2886            0 :                                 state, format("...{} output is not equal to 1.0 (+ or - 10%) at rated conditions.", cAlphaFields(AlfaFieldIncre)));
    2887            0 :                             ShowContinueError(state, format("...Curve output at rated conditions = {:.3T}", CurveVal));
    2888              :                         }
    2889              :                     }
    2890              :                 }
    2891              : 
    2892          100 :                 AlfaFieldIncre = 16 + (I - 1) * 6;
    2893          100 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(I) =
    2894          100 :                     Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
    2895          100 :                 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          300 :                     ErrorsFound |= Curve::CheckCurveDims(state,
    2915          100 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(I), // Curve index
    2916              :                                                          {1},                                                                    // Valid dimensions
    2917              :                                                          RoutineName,                                                            // Routine name
    2918              :                                                          CurrentModuleObject,                                                    // Object Type
    2919          100 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,             // Object Name
    2920          100 :                                                          cAlphaFields(AlfaFieldIncre));                                          // Field Name
    2921              : 
    2922          100 :                     if (!ErrorsFound) {
    2923          100 :                         CurveVal = Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(I), 1.0);
    2924          100 :                         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          100 :                 AlfaFieldIncre = 17 + (I - 1) * 6;
    2938          100 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRWaterFFlow(I) =
    2939          100 :                     Curve::GetCurveIndex(state, AlphArray(AlfaFieldIncre)); // convert curve name to number
    2940          100 :                 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          300 :                     ErrorsFound |= Curve::CheckCurveDims(state,
    2960          100 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRWaterFFlow(I), // Curve index
    2961              :                                                          {1},                                                                      // Valid dimensions
    2962              :                                                          RoutineName,                                                              // Routine name
    2963              :                                                          CurrentModuleObject,                                                      // Object Type
    2964          100 :                                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,               // Object Name
    2965          100 :                                                          cAlphaFields(AlfaFieldIncre));                                            // Field Name
    2966              : 
    2967          100 :                     if (!ErrorsFound) {
    2968          100 :                         CurveVal = Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRWaterFFlow(I), 1.0);
    2969          100 :                         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          110 :             for (int I = 1; I <= state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds; ++I) {
    2985          100 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedPercentTotCap(I) =
    2986          100 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(I) /
    2987          200 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(
    2988          100 :                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds);
    2989          100 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirVolFlowPerRatedTotCap(I) =
    2990          100 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirVolFlowRate(I) /
    2991          100 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(I);
    2992          100 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedWaterVolFlowPerRatedTotCap(I) =
    2993          100 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedWaterVolFlowRate(I) /
    2994          100 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(I);
    2995          100 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWHPumpPowerPerRatedTotCap(I) =
    2996          100 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWHPumpPower(I) /
    2997          100 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(I);
    2998              :             }
    2999              : 
    3000              :             // CurrentModuleObject = "Coil:Waterheating:Airtowaterheatpump:Variablespeed"
    3001           20 :             SetupOutputVariable(state,
    3002              :                                 "Cooling Coil Electricity Energy",
    3003              :                                 Constant::Units::J,
    3004           10 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Energy,
    3005              :                                 OutputProcessor::TimeStepType::System,
    3006              :                                 OutputProcessor::StoreType::Sum,
    3007           10 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
    3008              :                                 Constant::eResource::Electricity,
    3009              :                                 OutputProcessor::Group::HVAC,
    3010              :                                 OutputProcessor::EndUseCat::Heating);
    3011           20 :             SetupOutputVariable(state,
    3012              :                                 "Cooling Coil Sensible Cooling Energy",
    3013              :                                 Constant::Units::J,
    3014           10 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergySensible,
    3015              :                                 OutputProcessor::TimeStepType::System,
    3016              :                                 OutputProcessor::StoreType::Sum,
    3017           10 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3018           20 :             SetupOutputVariable(state,
    3019              :                                 "Cooling Coil Latent Cooling Energy",
    3020              :                                 Constant::Units::J,
    3021           10 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergyLatent,
    3022              :                                 OutputProcessor::TimeStepType::System,
    3023              :                                 OutputProcessor::StoreType::Sum,
    3024           10 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3025           20 :             SetupOutputVariable(state,
    3026              :                                 "Cooling Coil Water Side Heat Transfer Energy",
    3027              :                                 Constant::Units::J,
    3028           10 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergySource,
    3029              :                                 OutputProcessor::TimeStepType::System,
    3030              :                                 OutputProcessor::StoreType::Sum,
    3031           10 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
    3032              :                                 Constant::eResource::PlantLoopHeatingDemand,
    3033              :                                 OutputProcessor::Group::HVAC,
    3034              :                                 OutputProcessor::EndUseCat::HeatingCoils);
    3035              : 
    3036           10 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).IsDXCoilInZone) {
    3037           20 :                 SetupOutputVariable(state,
    3038              :                                     "Cooling Coil Cooling Energy",
    3039              :                                     Constant::Units::J,
    3040           10 :                                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergyLoadTotal,
    3041              :                                     OutputProcessor::TimeStepType::System,
    3042              :                                     OutputProcessor::StoreType::Sum,
    3043           10 :                                     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           10 :             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           22 :         AlphArray.deallocate();
    3063           22 :         cAlphaFields.deallocate();
    3064           22 :         lAlphaBlanks.deallocate();
    3065           22 :         cNumericFields.deallocate();
    3066           22 :         lNumericBlanks.deallocate();
    3067           22 :         NumArray.deallocate();
    3068              : 
    3069           22 :         if (ErrorsFound) {
    3070            0 :             ShowFatalError(state, format("{}Errors found getting input. Program terminates.", RoutineName));
    3071              :         }
    3072              : 
    3073           99 :         for (DXCoilNum = 1; DXCoilNum <= state.dataVariableSpeedCoils->NumVarSpeedCoils; ++DXCoilNum) {
    3074          132 :             if ((state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed) ||
    3075           55 :                 (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_HeatingAirToAirVariableSpeed)) {
    3076              :                 // Setup Report variables for the Heat Pump
    3077              : 
    3078              :                 // cooling and heating coils separately
    3079           31 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed) {
    3080              :                     // air source cooling coils
    3081           44 :                     SetupOutputVariable(state,
    3082              :                                         "Cooling Coil Air Mass Flow Rate",
    3083              :                                         Constant::Units::kg_s,
    3084           22 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirMassFlowRate,
    3085              :                                         OutputProcessor::TimeStepType::System,
    3086              :                                         OutputProcessor::StoreType::Average,
    3087           22 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3088           44 :                     SetupOutputVariable(state,
    3089              :                                         "Cooling Coil Air Inlet Temperature",
    3090              :                                         Constant::Units::C,
    3091           22 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirDBTemp,
    3092              :                                         OutputProcessor::TimeStepType::System,
    3093              :                                         OutputProcessor::StoreType::Average,
    3094           22 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3095           44 :                     SetupOutputVariable(state,
    3096              :                                         "Cooling Coil Air Inlet Humidity Ratio",
    3097              :                                         Constant::Units::kgWater_kgDryAir,
    3098           22 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirHumRat,
    3099              :                                         OutputProcessor::TimeStepType::System,
    3100              :                                         OutputProcessor::StoreType::Average,
    3101           22 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3102           44 :                     SetupOutputVariable(state,
    3103              :                                         "Cooling Coil Latent Cooling Rate",
    3104              :                                         Constant::Units::W,
    3105           22 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QLatent,
    3106              :                                         OutputProcessor::TimeStepType::System,
    3107              :                                         OutputProcessor::StoreType::Average,
    3108           22 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3109           44 :                     SetupOutputVariable(state,
    3110              :                                         "Cooling Coil Air Outlet Temperature",
    3111              :                                         Constant::Units::C,
    3112           22 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirDBTemp,
    3113              :                                         OutputProcessor::TimeStepType::System,
    3114              :                                         OutputProcessor::StoreType::Average,
    3115           22 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3116           44 :                     SetupOutputVariable(state,
    3117              :                                         "Cooling Coil Air Outlet Humidity Ratio",
    3118              :                                         Constant::Units::kgWater_kgDryAir,
    3119           22 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirHumRat,
    3120              :                                         OutputProcessor::TimeStepType::System,
    3121              :                                         OutputProcessor::StoreType::Average,
    3122           22 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3123           44 :                     SetupOutputVariable(state,
    3124              :                                         "Cooling Coil Sensible Cooling Rate",
    3125              :                                         Constant::Units::W,
    3126           22 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QSensible,
    3127              :                                         OutputProcessor::TimeStepType::System,
    3128              :                                         OutputProcessor::StoreType::Average,
    3129           22 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3130           44 :                     SetupOutputVariable(state,
    3131              :                                         "Cooling Coil Total Cooling Rate",
    3132              :                                         Constant::Units::W,
    3133           22 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QLoadTotal,
    3134              :                                         OutputProcessor::TimeStepType::System,
    3135              :                                         OutputProcessor::StoreType::Average,
    3136           22 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3137           44 :                     SetupOutputVariable(state,
    3138              :                                         "Cooling Coil Part Load Ratio",
    3139              :                                         Constant::Units::None,
    3140           22 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PartLoadRatio,
    3141              :                                         OutputProcessor::TimeStepType::System,
    3142              :                                         OutputProcessor::StoreType::Average,
    3143           22 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3144           44 :                     SetupOutputVariable(state,
    3145              :                                         "Cooling Coil Electricity Rate",
    3146              :                                         Constant::Units::W,
    3147           22 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Power,
    3148              :                                         OutputProcessor::TimeStepType::System,
    3149              :                                         OutputProcessor::StoreType::Average,
    3150           22 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3151           44 :                     SetupOutputVariable(state,
    3152              :                                         "Cooling Coil Runtime Fraction",
    3153              :                                         Constant::Units::None,
    3154           22 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac,
    3155              :                                         OutputProcessor::TimeStepType::System,
    3156              :                                         OutputProcessor::StoreType::Average,
    3157           22 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3158           44 :                     SetupOutputVariable(state,
    3159              :                                         "Cooling Coil Source Side Heat Transfer Rate",
    3160              :                                         Constant::Units::W,
    3161           22 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QSource,
    3162              :                                         OutputProcessor::TimeStepType::System,
    3163              :                                         OutputProcessor::StoreType::Average,
    3164           22 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3165           44 :                     SetupOutputVariable(state,
    3166              :                                         "Cooling Coil Upper Speed Level",
    3167              :                                         Constant::Units::None,
    3168           22 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SpeedNumReport,
    3169              :                                         OutputProcessor::TimeStepType::System,
    3170              :                                         OutputProcessor::StoreType::Average,
    3171           22 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3172           44 :                     SetupOutputVariable(state,
    3173              :                                         "Cooling Coil Neighboring Speed Levels Ratio",
    3174              :                                         Constant::Units::None,
    3175           22 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SpeedRatioReport,
    3176              :                                         OutputProcessor::TimeStepType::System,
    3177              :                                         OutputProcessor::StoreType::Average,
    3178           22 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3179              : 
    3180           22 :                     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           22 :                     if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).ReportEvapCondVars) {
    3201            0 :                         SetupOutputVariable(state,
    3202              :                                             "Cooling Coil Condenser Inlet Temperature",
    3203              :                                             Constant::Units::C,
    3204            0 :                                             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondInletTemp,
    3205              :                                             OutputProcessor::TimeStepType::System,
    3206              :                                             OutputProcessor::StoreType::Average,
    3207            0 :                                             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3208            0 :                         SetupOutputVariable(state,
    3209              :                                             "Cooling Coil Evaporative Condenser Water Volume",
    3210              :                                             Constant::Units::m3,
    3211            0 :                                             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapWaterConsump,
    3212              :                                             OutputProcessor::TimeStepType::System,
    3213              :                                             OutputProcessor::StoreType::Sum,
    3214            0 :                                             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
    3215              :                                             Constant::eResource::Water,
    3216              :                                             OutputProcessor::Group::HVAC,
    3217              :                                             OutputProcessor::EndUseCat::Cooling);
    3218            0 :                         SetupOutputVariable(state,
    3219              :                                             "Cooling Coil Evaporative Condenser Mains Water Volume",
    3220              :                                             Constant::Units::m3,
    3221            0 :                                             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapWaterConsump,
    3222              :                                             OutputProcessor::TimeStepType::System,
    3223              :                                             OutputProcessor::StoreType::Sum,
    3224            0 :                                             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
    3225              :                                             Constant::eResource::MainsWater,
    3226              :                                             OutputProcessor::Group::HVAC,
    3227              :                                             OutputProcessor::EndUseCat::Cooling);
    3228            0 :                         SetupOutputVariable(state,
    3229              :                                             "Cooling Coil Evaporative Condenser Pump Electricity Rate",
    3230              :                                             Constant::Units::W,
    3231            0 :                                             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapCondPumpElecPower,
    3232              :                                             OutputProcessor::TimeStepType::System,
    3233              :                                             OutputProcessor::StoreType::Average,
    3234            0 :                                             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3235            0 :                         SetupOutputVariable(state,
    3236              :                                             "Cooling Coil Evaporative Condenser Pump Electricity Energy",
    3237              :                                             Constant::Units::J,
    3238            0 :                                             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapCondPumpElecConsumption,
    3239              :                                             OutputProcessor::TimeStepType::System,
    3240              :                                             OutputProcessor::StoreType::Sum,
    3241            0 :                                             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
    3242              :                                             Constant::eResource::Electricity,
    3243              :                                             OutputProcessor::Group::HVAC,
    3244              :                                             OutputProcessor::EndUseCat::Cooling);
    3245            0 :                         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           44 :                     SetupOutputVariable(state,
    3267              :                                         "Cooling Coil Crankcase Heater Electricity Rate",
    3268              :                                         Constant::Units::W,
    3269           22 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterPower,
    3270              :                                         OutputProcessor::TimeStepType::System,
    3271              :                                         OutputProcessor::StoreType::Average,
    3272           22 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3273           44 :                     SetupOutputVariable(state,
    3274              :                                         "Cooling Coil Crankcase Heater Electricity Energy",
    3275              :                                         Constant::Units::J,
    3276           22 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterConsumption,
    3277              :                                         OutputProcessor::TimeStepType::System,
    3278              :                                         OutputProcessor::StoreType::Sum,
    3279           22 :                                         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           18 :                     SetupOutputVariable(state,
    3286              :                                         "Heating Coil Air Mass Flow Rate",
    3287              :                                         Constant::Units::kg_s,
    3288            9 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirMassFlowRate,
    3289              :                                         OutputProcessor::TimeStepType::System,
    3290              :                                         OutputProcessor::StoreType::Average,
    3291            9 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3292           18 :                     SetupOutputVariable(state,
    3293              :                                         "Heating Coil Air Inlet Temperature",
    3294              :                                         Constant::Units::C,
    3295            9 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirDBTemp,
    3296              :                                         OutputProcessor::TimeStepType::System,
    3297              :                                         OutputProcessor::StoreType::Average,
    3298            9 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3299           18 :                     SetupOutputVariable(state,
    3300              :                                         "Heating Coil Air Inlet Humidity Ratio",
    3301              :                                         Constant::Units::kgWater_kgDryAir,
    3302            9 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirHumRat,
    3303              :                                         OutputProcessor::TimeStepType::System,
    3304              :                                         OutputProcessor::StoreType::Average,
    3305            9 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3306           18 :                     SetupOutputVariable(state,
    3307              :                                         "Heating Coil Air Outlet Temperature",
    3308              :                                         Constant::Units::C,
    3309            9 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirDBTemp,
    3310              :                                         OutputProcessor::TimeStepType::System,
    3311              :                                         OutputProcessor::StoreType::Average,
    3312            9 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3313           18 :                     SetupOutputVariable(state,
    3314              :                                         "Heating Coil Air Outlet Humidity Ratio",
    3315              :                                         Constant::Units::kgWater_kgDryAir,
    3316            9 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirHumRat,
    3317              :                                         OutputProcessor::TimeStepType::System,
    3318              :                                         OutputProcessor::StoreType::Average,
    3319            9 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3320           18 :                     SetupOutputVariable(state,
    3321              :                                         "Heating Coil Sensible Heating Rate",
    3322              :                                         Constant::Units::W,
    3323            9 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QSensible,
    3324              :                                         OutputProcessor::TimeStepType::System,
    3325              :                                         OutputProcessor::StoreType::Average,
    3326            9 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3327           18 :                     SetupOutputVariable(state,
    3328              :                                         "Heating Coil Heating Rate",
    3329              :                                         Constant::Units::W,
    3330            9 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QLoadTotal,
    3331              :                                         OutputProcessor::TimeStepType::System,
    3332              :                                         OutputProcessor::StoreType::Average,
    3333            9 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3334           18 :                     SetupOutputVariable(state,
    3335              :                                         "Heating Coil Part Load Ratio",
    3336              :                                         Constant::Units::None,
    3337            9 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PartLoadRatio,
    3338              :                                         OutputProcessor::TimeStepType::System,
    3339              :                                         OutputProcessor::StoreType::Average,
    3340            9 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3341           18 :                     SetupOutputVariable(state,
    3342              :                                         "Heating Coil Electricity Rate",
    3343              :                                         Constant::Units::W,
    3344            9 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Power,
    3345              :                                         OutputProcessor::TimeStepType::System,
    3346              :                                         OutputProcessor::StoreType::Average,
    3347            9 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3348           18 :                     SetupOutputVariable(state,
    3349              :                                         "Heating Coil Runtime Fraction",
    3350              :                                         Constant::Units::None,
    3351            9 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac,
    3352              :                                         OutputProcessor::TimeStepType::System,
    3353              :                                         OutputProcessor::StoreType::Average,
    3354            9 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3355              : 
    3356           18 :                     SetupOutputVariable(state,
    3357              :                                         "Heating Coil Source Side Heat Transfer Rate",
    3358              :                                         Constant::Units::W,
    3359            9 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QSource,
    3360              :                                         OutputProcessor::TimeStepType::System,
    3361              :                                         OutputProcessor::StoreType::Average,
    3362            9 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3363           18 :                     SetupOutputVariable(state,
    3364              :                                         "Heating Coil Upper Speed Level",
    3365              :                                         Constant::Units::None,
    3366            9 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SpeedNumReport,
    3367              :                                         OutputProcessor::TimeStepType::System,
    3368              :                                         OutputProcessor::StoreType::Average,
    3369            9 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3370           18 :                     SetupOutputVariable(state,
    3371              :                                         "Heating Coil Neighboring Speed Levels Ratio",
    3372              :                                         Constant::Units::None,
    3373            9 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SpeedRatioReport,
    3374              :                                         OutputProcessor::TimeStepType::System,
    3375              :                                         OutputProcessor::StoreType::Average,
    3376            9 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3377              : 
    3378           18 :                     SetupOutputVariable(state,
    3379              :                                         "Heating Coil Defrost Electricity Rate",
    3380              :                                         Constant::Units::W,
    3381            9 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostPower,
    3382              :                                         OutputProcessor::TimeStepType::System,
    3383              :                                         OutputProcessor::StoreType::Average,
    3384            9 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3385           18 :                     SetupOutputVariable(state,
    3386              :                                         "Heating Coil Defrost Electricity Energy",
    3387              :                                         Constant::Units::J,
    3388            9 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostConsumption,
    3389              :                                         OutputProcessor::TimeStepType::System,
    3390              :                                         OutputProcessor::StoreType::Sum,
    3391            9 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
    3392              :                                         Constant::eResource::Electricity,
    3393              :                                         OutputProcessor::Group::HVAC,
    3394              :                                         OutputProcessor::EndUseCat::Heating);
    3395           18 :                     SetupOutputVariable(state,
    3396              :                                         "Heating Coil Crankcase Heater Electricity Rate",
    3397              :                                         Constant::Units::W,
    3398            9 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterPower,
    3399              :                                         OutputProcessor::TimeStepType::System,
    3400              :                                         OutputProcessor::StoreType::Average,
    3401            9 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3402           18 :                     SetupOutputVariable(state,
    3403              :                                         "Heating Coil Crankcase Heater Electricity Energy",
    3404              :                                         Constant::Units::J,
    3405            9 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterConsumption,
    3406              :                                         OutputProcessor::TimeStepType::System,
    3407              :                                         OutputProcessor::StoreType::Sum,
    3408            9 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
    3409              :                                         Constant::eResource::Electricity,
    3410              :                                         OutputProcessor::Group::HVAC,
    3411              :                                         OutputProcessor::EndUseCat::Heating);
    3412              : 
    3413            9 :                     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           46 :                 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           36 :                     SetupOutputVariable(state,
    3438              :                                         "Cooling Coil Electricity Rate",
    3439              :                                         Constant::Units::W,
    3440           18 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Power,
    3441              :                                         OutputProcessor::TimeStepType::System,
    3442              :                                         OutputProcessor::StoreType::Average,
    3443           18 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3444           36 :                     SetupOutputVariable(state,
    3445              :                                         "Cooling Coil Total Cooling Rate",
    3446              :                                         Constant::Units::W,
    3447           18 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QLoadTotal,
    3448              :                                         OutputProcessor::TimeStepType::System,
    3449              :                                         OutputProcessor::StoreType::Average,
    3450           18 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3451           36 :                     SetupOutputVariable(state,
    3452              :                                         "Cooling Coil Sensible Cooling Rate",
    3453              :                                         Constant::Units::W,
    3454           18 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QSensible,
    3455              :                                         OutputProcessor::TimeStepType::System,
    3456              :                                         OutputProcessor::StoreType::Average,
    3457           18 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3458           36 :                     SetupOutputVariable(state,
    3459              :                                         "Cooling Coil Latent Cooling Rate",
    3460              :                                         Constant::Units::W,
    3461           18 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QLatent,
    3462              :                                         OutputProcessor::TimeStepType::System,
    3463              :                                         OutputProcessor::StoreType::Average,
    3464           18 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3465           36 :                     SetupOutputVariable(state,
    3466              :                                         "Cooling Coil Source Side Heat Transfer Rate",
    3467              :                                         Constant::Units::W,
    3468           18 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QSource,
    3469              :                                         OutputProcessor::TimeStepType::System,
    3470              :                                         OutputProcessor::StoreType::Average,
    3471           18 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3472           36 :                     SetupOutputVariable(state,
    3473              :                                         "Cooling Coil Part Load Ratio",
    3474              :                                         Constant::Units::None,
    3475           18 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PartLoadRatio,
    3476              :                                         OutputProcessor::TimeStepType::System,
    3477              :                                         OutputProcessor::StoreType::Average,
    3478           18 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3479           36 :                     SetupOutputVariable(state,
    3480              :                                         "Cooling Coil Runtime Fraction",
    3481              :                                         Constant::Units::None,
    3482           18 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac,
    3483              :                                         OutputProcessor::TimeStepType::System,
    3484              :                                         OutputProcessor::StoreType::Average,
    3485           18 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3486              : 
    3487           36 :                     SetupOutputVariable(state,
    3488              :                                         "Cooling Coil Air Mass Flow Rate",
    3489              :                                         Constant::Units::kg_s,
    3490           18 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirMassFlowRate,
    3491              :                                         OutputProcessor::TimeStepType::System,
    3492              :                                         OutputProcessor::StoreType::Average,
    3493           18 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3494           36 :                     SetupOutputVariable(state,
    3495              :                                         "Cooling Coil Air Inlet Temperature",
    3496              :                                         Constant::Units::C,
    3497           18 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirDBTemp,
    3498              :                                         OutputProcessor::TimeStepType::System,
    3499              :                                         OutputProcessor::StoreType::Average,
    3500           18 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3501           36 :                     SetupOutputVariable(state,
    3502              :                                         "Cooling Coil Air Inlet Humidity Ratio",
    3503              :                                         Constant::Units::kgWater_kgDryAir,
    3504           18 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirHumRat,
    3505              :                                         OutputProcessor::TimeStepType::System,
    3506              :                                         OutputProcessor::StoreType::Average,
    3507           18 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3508           36 :                     SetupOutputVariable(state,
    3509              :                                         "Cooling Coil Air Outlet Temperature",
    3510              :                                         Constant::Units::C,
    3511           18 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirDBTemp,
    3512              :                                         OutputProcessor::TimeStepType::System,
    3513              :                                         OutputProcessor::StoreType::Average,
    3514           18 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3515           36 :                     SetupOutputVariable(state,
    3516              :                                         "Cooling Coil Air Outlet Humidity Ratio",
    3517              :                                         Constant::Units::kgWater_kgDryAir,
    3518           18 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirHumRat,
    3519              :                                         OutputProcessor::TimeStepType::System,
    3520              :                                         OutputProcessor::StoreType::Average,
    3521           18 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3522           36 :                     SetupOutputVariable(state,
    3523              :                                         "Cooling Coil Source Side Mass Flow Rate",
    3524              :                                         Constant::Units::kg_s,
    3525           18 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterMassFlowRate,
    3526              :                                         OutputProcessor::TimeStepType::System,
    3527              :                                         OutputProcessor::StoreType::Average,
    3528           18 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3529           36 :                     SetupOutputVariable(state,
    3530              :                                         "Cooling Coil Source Side Inlet Temperature",
    3531              :                                         Constant::Units::C,
    3532           18 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletWaterTemp,
    3533              :                                         OutputProcessor::TimeStepType::System,
    3534              :                                         OutputProcessor::StoreType::Average,
    3535           18 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3536           36 :                     SetupOutputVariable(state,
    3537              :                                         "Cooling Coil Source Side Outlet Temperature",
    3538              :                                         Constant::Units::C,
    3539           18 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletWaterTemp,
    3540              :                                         OutputProcessor::TimeStepType::System,
    3541              :                                         OutputProcessor::StoreType::Average,
    3542           18 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3543              : 
    3544           36 :                     SetupOutputVariable(state,
    3545              :                                         "Cooling Coil Upper Speed Level",
    3546              :                                         Constant::Units::None,
    3547           18 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SpeedNumReport,
    3548              :                                         OutputProcessor::TimeStepType::System,
    3549              :                                         OutputProcessor::StoreType::Average,
    3550           18 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3551           36 :                     SetupOutputVariable(state,
    3552              :                                         "Cooling Coil Neighboring Speed Levels Ratio",
    3553              :                                         Constant::Units::None,
    3554           18 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SpeedRatioReport,
    3555              :                                         OutputProcessor::TimeStepType::System,
    3556              :                                         OutputProcessor::StoreType::Average,
    3557           18 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3558           36 :                     SetupOutputVariable(state,
    3559              :                                         "Cooling Coil Recoverable Heat Transfer Rate",
    3560              :                                         Constant::Units::W,
    3561           18 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QWasteHeat,
    3562              :                                         OutputProcessor::TimeStepType::System,
    3563              :                                         OutputProcessor::StoreType::Average,
    3564           18 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3565           28 :                 } 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           36 :                     SetupOutputVariable(state,
    3570              :                                         "Heating Coil Electricity Rate",
    3571              :                                         Constant::Units::W,
    3572           18 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Power,
    3573              :                                         OutputProcessor::TimeStepType::System,
    3574              :                                         OutputProcessor::StoreType::Average,
    3575           18 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3576           36 :                     SetupOutputVariable(state,
    3577              :                                         "Heating Coil Heating Rate",
    3578              :                                         Constant::Units::W,
    3579           18 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QLoadTotal,
    3580              :                                         OutputProcessor::TimeStepType::System,
    3581              :                                         OutputProcessor::StoreType::Average,
    3582           18 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3583           36 :                     SetupOutputVariable(state,
    3584              :                                         "Heating Coil Sensible Heating Rate",
    3585              :                                         Constant::Units::W,
    3586           18 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QSensible,
    3587              :                                         OutputProcessor::TimeStepType::System,
    3588              :                                         OutputProcessor::StoreType::Average,
    3589           18 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3590              : 
    3591           36 :                     SetupOutputVariable(state,
    3592              :                                         "Heating Coil Source Side Heat Transfer Rate",
    3593              :                                         Constant::Units::W,
    3594           18 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QSource,
    3595              :                                         OutputProcessor::TimeStepType::System,
    3596              :                                         OutputProcessor::StoreType::Average,
    3597           18 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3598           36 :                     SetupOutputVariable(state,
    3599              :                                         "Heating Coil Part Load Ratio",
    3600              :                                         Constant::Units::None,
    3601           18 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PartLoadRatio,
    3602              :                                         OutputProcessor::TimeStepType::System,
    3603              :                                         OutputProcessor::StoreType::Average,
    3604           18 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3605           36 :                     SetupOutputVariable(state,
    3606              :                                         "Heating Coil Runtime Fraction",
    3607              :                                         Constant::Units::None,
    3608           18 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac,
    3609              :                                         OutputProcessor::TimeStepType::System,
    3610              :                                         OutputProcessor::StoreType::Average,
    3611           18 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3612              : 
    3613           36 :                     SetupOutputVariable(state,
    3614              :                                         "Heating Coil Air Mass Flow Rate",
    3615              :                                         Constant::Units::kg_s,
    3616           18 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirMassFlowRate,
    3617              :                                         OutputProcessor::TimeStepType::System,
    3618              :                                         OutputProcessor::StoreType::Average,
    3619           18 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3620           36 :                     SetupOutputVariable(state,
    3621              :                                         "Heating Coil Air Inlet Temperature",
    3622              :                                         Constant::Units::C,
    3623           18 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirDBTemp,
    3624              :                                         OutputProcessor::TimeStepType::System,
    3625              :                                         OutputProcessor::StoreType::Average,
    3626           18 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3627           36 :                     SetupOutputVariable(state,
    3628              :                                         "Heating Coil Air Inlet Humidity Ratio",
    3629              :                                         Constant::Units::kgWater_kgDryAir,
    3630           18 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirHumRat,
    3631              :                                         OutputProcessor::TimeStepType::System,
    3632              :                                         OutputProcessor::StoreType::Average,
    3633           18 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3634           36 :                     SetupOutputVariable(state,
    3635              :                                         "Heating Coil Air Outlet Temperature",
    3636              :                                         Constant::Units::C,
    3637           18 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirDBTemp,
    3638              :                                         OutputProcessor::TimeStepType::System,
    3639              :                                         OutputProcessor::StoreType::Average,
    3640           18 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3641           36 :                     SetupOutputVariable(state,
    3642              :                                         "Heating Coil Air Outlet Humidity Ratio",
    3643              :                                         Constant::Units::kgWater_kgDryAir,
    3644           18 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirHumRat,
    3645              :                                         OutputProcessor::TimeStepType::System,
    3646              :                                         OutputProcessor::StoreType::Average,
    3647           18 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3648           36 :                     SetupOutputVariable(state,
    3649              :                                         "Heating Coil Source Side Mass Flow Rate",
    3650              :                                         Constant::Units::kg_s,
    3651           18 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterMassFlowRate,
    3652              :                                         OutputProcessor::TimeStepType::System,
    3653              :                                         OutputProcessor::StoreType::Average,
    3654           18 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3655           36 :                     SetupOutputVariable(state,
    3656              :                                         "Heating Coil Source Side Inlet Temperature",
    3657              :                                         Constant::Units::C,
    3658           18 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletWaterTemp,
    3659              :                                         OutputProcessor::TimeStepType::System,
    3660              :                                         OutputProcessor::StoreType::Average,
    3661           18 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3662           36 :                     SetupOutputVariable(state,
    3663              :                                         "Heating Coil Source Side Outlet Temperature",
    3664              :                                         Constant::Units::C,
    3665           18 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletWaterTemp,
    3666              :                                         OutputProcessor::TimeStepType::System,
    3667              :                                         OutputProcessor::StoreType::Average,
    3668           18 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3669              : 
    3670           36 :                     SetupOutputVariable(state,
    3671              :                                         "Heating Coil Upper Speed Level",
    3672              :                                         Constant::Units::None,
    3673           18 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SpeedNumReport,
    3674              :                                         OutputProcessor::TimeStepType::System,
    3675              :                                         OutputProcessor::StoreType::Average,
    3676           18 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3677           36 :                     SetupOutputVariable(state,
    3678              :                                         "Heating Coil Neighboring Speed Levels Ratio",
    3679              :                                         Constant::Units::None,
    3680           18 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SpeedRatioReport,
    3681              :                                         OutputProcessor::TimeStepType::System,
    3682              :                                         OutputProcessor::StoreType::Average,
    3683           18 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3684           36 :                     SetupOutputVariable(state,
    3685              :                                         "Heating Coil Recoverable Heat Transfer Rate",
    3686              :                                         Constant::Units::W,
    3687           18 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QWasteHeat,
    3688              :                                         OutputProcessor::TimeStepType::System,
    3689              :                                         OutputProcessor::StoreType::Average,
    3690           18 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3691           10 :                 } else if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::CoilDX_HeatPumpWaterHeaterVariableSpeed) {
    3692              :                     // air source water heating coil
    3693           20 :                     SetupOutputVariable(state,
    3694              :                                         "Cooling Coil Water Heating Electricity Rate",
    3695              :                                         Constant::Units::W,
    3696           10 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Power,
    3697              :                                         OutputProcessor::TimeStepType::System,
    3698              :                                         OutputProcessor::StoreType::Average,
    3699           10 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3700           20 :                     SetupOutputVariable(state,
    3701              :                                         "Cooling Coil Total Cooling Rate",
    3702              :                                         Constant::Units::W,
    3703           10 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QLoadTotal,
    3704              :                                         OutputProcessor::TimeStepType::System,
    3705              :                                         OutputProcessor::StoreType::Average,
    3706           10 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3707           20 :                     SetupOutputVariable(state,
    3708              :                                         "Cooling Coil Sensible Cooling Rate",
    3709              :                                         Constant::Units::W,
    3710           10 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QSensible,
    3711              :                                         OutputProcessor::TimeStepType::System,
    3712              :                                         OutputProcessor::StoreType::Average,
    3713           10 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3714           20 :                     SetupOutputVariable(state,
    3715              :                                         "Cooling Coil Latent Cooling Rate",
    3716              :                                         Constant::Units::W,
    3717           10 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QLatent,
    3718              :                                         OutputProcessor::TimeStepType::System,
    3719              :                                         OutputProcessor::StoreType::Average,
    3720           10 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3721           20 :                     SetupOutputVariable(state,
    3722              :                                         "Cooling Coil Total Water Heating Rate",
    3723              :                                         Constant::Units::W,
    3724           10 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).TotalHeatingEnergyRate,
    3725              :                                         OutputProcessor::TimeStepType::System,
    3726              :                                         OutputProcessor::StoreType::Average,
    3727           10 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3728           20 :                     SetupOutputVariable(state,
    3729              :                                         "Cooling Coil Part Load Ratio",
    3730              :                                         Constant::Units::None,
    3731           10 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PartLoadRatio,
    3732              :                                         OutputProcessor::TimeStepType::System,
    3733              :                                         OutputProcessor::StoreType::Average,
    3734           10 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3735           20 :                     SetupOutputVariable(state,
    3736              :                                         "Cooling Coil Runtime Fraction",
    3737              :                                         Constant::Units::None,
    3738           10 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac,
    3739              :                                         OutputProcessor::TimeStepType::System,
    3740              :                                         OutputProcessor::StoreType::Average,
    3741           10 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3742              : 
    3743           20 :                     SetupOutputVariable(state,
    3744              :                                         "Cooling Coil Air Mass Flow Rate",
    3745              :                                         Constant::Units::kg_s,
    3746           10 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirMassFlowRate,
    3747              :                                         OutputProcessor::TimeStepType::System,
    3748              :                                         OutputProcessor::StoreType::Average,
    3749           10 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3750           20 :                     SetupOutputVariable(state,
    3751              :                                         "Cooling Coil Air Inlet Temperature",
    3752              :                                         Constant::Units::C,
    3753           10 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirDBTemp,
    3754              :                                         OutputProcessor::TimeStepType::System,
    3755              :                                         OutputProcessor::StoreType::Average,
    3756           10 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3757           20 :                     SetupOutputVariable(state,
    3758              :                                         "Cooling Coil Air Inlet Humidity Ratio",
    3759              :                                         Constant::Units::kgWater_kgDryAir,
    3760           10 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirHumRat,
    3761              :                                         OutputProcessor::TimeStepType::System,
    3762              :                                         OutputProcessor::StoreType::Average,
    3763           10 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3764           20 :                     SetupOutputVariable(state,
    3765              :                                         "Cooling Coil Air Outlet Temperature",
    3766              :                                         Constant::Units::C,
    3767           10 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirDBTemp,
    3768              :                                         OutputProcessor::TimeStepType::System,
    3769              :                                         OutputProcessor::StoreType::Average,
    3770           10 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3771           20 :                     SetupOutputVariable(state,
    3772              :                                         "Cooling Coil Air Outlet Humidity Ratio",
    3773              :                                         Constant::Units::kgWater_kgDryAir,
    3774           10 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirHumRat,
    3775              :                                         OutputProcessor::TimeStepType::System,
    3776              :                                         OutputProcessor::StoreType::Average,
    3777           10 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3778           20 :                     SetupOutputVariable(state,
    3779              :                                         "Cooling Coil Water Mass Flow Rate",
    3780              :                                         Constant::Units::kg_s,
    3781           10 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterMassFlowRate,
    3782              :                                         OutputProcessor::TimeStepType::System,
    3783              :                                         OutputProcessor::StoreType::Average,
    3784           10 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3785           20 :                     SetupOutputVariable(state,
    3786              :                                         "Cooling Coil Water Inlet Temperature",
    3787              :                                         Constant::Units::C,
    3788           10 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletWaterTemp,
    3789              :                                         OutputProcessor::TimeStepType::System,
    3790              :                                         OutputProcessor::StoreType::Average,
    3791           10 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3792           20 :                     SetupOutputVariable(state,
    3793              :                                         "Cooling Coil Water Outlet Temperature",
    3794              :                                         Constant::Units::C,
    3795           10 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletWaterTemp,
    3796              :                                         OutputProcessor::TimeStepType::System,
    3797              :                                         OutputProcessor::StoreType::Average,
    3798           10 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3799              : 
    3800           20 :                     SetupOutputVariable(state,
    3801              :                                         "Cooling Coil Crankcase Heater Electricity Rate",
    3802              :                                         Constant::Units::W,
    3803           10 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterPower,
    3804              :                                         OutputProcessor::TimeStepType::System,
    3805              :                                         OutputProcessor::StoreType::Average,
    3806           10 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3807           20 :                     SetupOutputVariable(state,
    3808              :                                         "Cooling Coil Crankcase Heater Electricity Energy",
    3809              :                                         Constant::Units::J,
    3810           10 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterConsumption,
    3811              :                                         OutputProcessor::TimeStepType::System,
    3812              :                                         OutputProcessor::StoreType::Sum,
    3813           10 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
    3814              :                                         Constant::eResource::Electricity,
    3815              :                                         OutputProcessor::Group::HVAC,
    3816              :                                         OutputProcessor::EndUseCat::Heating);
    3817              : 
    3818           20 :                     SetupOutputVariable(state,
    3819              :                                         "Cooling Coil Upper Speed Level",
    3820              :                                         Constant::Units::None,
    3821           10 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SpeedNumReport,
    3822              :                                         OutputProcessor::TimeStepType::System,
    3823              :                                         OutputProcessor::StoreType::Average,
    3824           10 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3825           20 :                     SetupOutputVariable(state,
    3826              :                                         "Cooling Coil Neighboring Speed Levels Ratio",
    3827              :                                         Constant::Units::None,
    3828           10 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SpeedRatioReport,
    3829              :                                         OutputProcessor::TimeStepType::System,
    3830              :                                         OutputProcessor::StoreType::Average,
    3831           10 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3832              : 
    3833           20 :                     SetupOutputVariable(state,
    3834              :                                         "Cooling Coil Water Heating Pump Electricity Rate",
    3835              :                                         Constant::Units::W,
    3836           10 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpElecNomPower,
    3837              :                                         OutputProcessor::TimeStepType::System,
    3838              :                                         OutputProcessor::StoreType::Average,
    3839           10 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name);
    3840           20 :                     SetupOutputVariable(state,
    3841              :                                         "Cooling Coil Water Heating Pump Electricity Energy",
    3842              :                                         Constant::Units::J,
    3843           10 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapCondPumpElecConsumption,
    3844              :                                         OutputProcessor::TimeStepType::System,
    3845              :                                         OutputProcessor::StoreType::Sum,
    3846           10 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
    3847              :                                         Constant::eResource::Electricity,
    3848              :                                         OutputProcessor::Group::HVAC,
    3849              :                                         OutputProcessor::EndUseCat::Heating);
    3850              :                 }
    3851              :             }
    3852              :         }
    3853              : 
    3854           22 :         if (ErrorsFound) {
    3855            0 :             ShowFatalError(
    3856            0 :                 state, format("{}Errors found in getting {} input.  Preceding condition(s) causes termination.", RoutineName, CurrentModuleObject));
    3857              :         }
    3858           22 :     }
    3859              : 
    3860              :     // Beginning Initialization Section of the Module
    3861              :     //******************************************************************************
    3862              : 
    3863     45014786 :     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     45014786 :         int AirInletNode = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirInletNodeNum;
    3902              : 
    3903     45014786 :         if (state.dataVariableSpeedCoils->MyOneTimeFlag) {
    3904              :             // initialize the environment and sizing flags
    3905           22 :             state.dataVariableSpeedCoils->MySizeFlag.allocate(state.dataVariableSpeedCoils->NumVarSpeedCoils);
    3906           22 :             state.dataVariableSpeedCoils->MyEnvrnFlag.allocate(state.dataVariableSpeedCoils->NumVarSpeedCoils);
    3907           22 :             state.dataVariableSpeedCoils->MyPlantScanFlag.allocate(state.dataVariableSpeedCoils->NumVarSpeedCoils);
    3908           22 :             state.dataVariableSpeedCoils->MySizeFlag = true;
    3909           22 :             state.dataVariableSpeedCoils->MyEnvrnFlag = true;
    3910           22 :             state.dataVariableSpeedCoils->MyPlantScanFlag = true;
    3911           22 :             state.dataVariableSpeedCoils->MyOneTimeFlag = false;
    3912              :         }
    3913              : 
    3914     45014786 :         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     46613962 :         if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::CoilDX_HeatPumpWaterHeaterVariableSpeed &&
    3919      1599176 :             state.dataVariableSpeedCoils->MySizeFlag(DXCoilNum)) {
    3920              : 
    3921           10 :             ErrorsFound = false;
    3922           10 :             SizeVarSpeedCoil(state, DXCoilNum, ErrorsFound);
    3923           10 :             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           10 :             state.dataVariableSpeedCoils->MySizeFlag(DXCoilNum) = false;
    3930              :         }
    3931              :         // variable-speed heat pump water heating, end
    3932              : 
    3933              :         // water source
    3934     85507779 :         if ((state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_CoolingWaterToAirHPVSEquationFit) ||
    3935     40492993 :             (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_HeatingWaterToAirHPVSEquationFit)) { // fix coil type
    3936      9043586 :             if (state.dataVariableSpeedCoils->MyPlantScanFlag(DXCoilNum) && allocated(state.dataPlnt->PlantLoop)) {
    3937              :                 // switch from coil type numbers in DataHVACGlobals, to coil type numbers in plant.
    3938           36 :                 DataPlant::PlantEquipmentType CoilVSWAHPType(DataPlant::PlantEquipmentType::Invalid);
    3939           36 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_CoolingWaterToAirHPVSEquationFit) {
    3940           18 :                     CoilVSWAHPType = DataPlant::PlantEquipmentType::CoilVSWAHPCoolingEquationFit;
    3941           18 :                 } else if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_HeatingWaterToAirHPVSEquationFit) {
    3942           18 :                     CoilVSWAHPType = DataPlant::PlantEquipmentType::CoilVSWAHPHeatingEquationFit;
    3943              :                 }
    3944           36 :                 ErrorsFound = false;
    3945           72 :                 PlantUtilities::ScanPlantLoopsForObject(state,
    3946           36 :                                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
    3947              :                                                         CoilVSWAHPType,
    3948           36 :                                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).plantLoc,
    3949              :                                                         ErrorsFound,
    3950              :                                                         _,
    3951              :                                                         _,
    3952              :                                                         _,
    3953              :                                                         _,
    3954              :                                                         _);
    3955           36 :                 if (ErrorsFound) {
    3956            0 :                     ShowFatalError(state, "InitVarSpeedCoil: Program terminated for previous conditions.");
    3957              :                 }
    3958           36 :                 state.dataVariableSpeedCoils->MyPlantScanFlag(DXCoilNum) = false;
    3959              :             }
    3960              :         } else {
    3961     35971200 :             state.dataVariableSpeedCoils->MyPlantScanFlag(DXCoilNum) = false;
    3962              :         }
    3963              : 
    3964     45014853 :         if (!state.dataGlobal->SysSizingCalc && state.dataVariableSpeedCoils->MySizeFlag(DXCoilNum) &&
    3965           67 :             !state.dataVariableSpeedCoils->MyPlantScanFlag(DXCoilNum)) {
    3966              :             // for each furnace, do the sizing once.
    3967           67 :             ErrorsFound = false;
    3968           67 :             SizeVarSpeedCoil(state, DXCoilNum, ErrorsFound);
    3969           67 :             if (ErrorsFound) {
    3970            0 :                 ShowFatalError(state, format("{}: Failed to size variable speed coil.", RoutineName));
    3971              :             }
    3972              : 
    3973           67 :             state.dataVariableSpeedCoils->MySizeFlag(DXCoilNum) = false;
    3974              : 
    3975              :             // Multispeed Cooling
    3976          116 :             if ((state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_CoolingWaterToAirHPVSEquationFit) ||
    3977           49 :                 (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed)) {
    3978          380 :                 for (int Mode = 1; Mode <= state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds; ++Mode) {
    3979          340 :                     if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedCapCoolTotal <= 0.0) {
    3980            0 :                         break;
    3981              :                     }
    3982              :                     // Check for zero capacity or zero max flow rate
    3983          340 :                     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          340 :                     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          340 :                     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          340 :                     RatedVolFlowPerRatedTotCap = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirVolFlowRate(Mode) /
    4004          340 :                                                  state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(Mode);
    4005              :                 }
    4006              :                 // call coil model with everything set at rating point
    4007           40 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirDBTemp = RatedInletAirTemp;
    4008           40 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirHumRat =
    4009           40 :                     Psychrometrics::PsyWFnTdbTwbPb(state, RatedInletAirTemp, RatedInletWetBulbTemp, DataEnvironment::StdPressureSeaLevel);
    4010           40 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirEnthalpy =
    4011           40 :                     Psychrometrics::PsyHFnTdbW(RatedInletAirTemp, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirHumRat);
    4012           40 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirPressure = DataEnvironment::StdPressureSeaLevel;
    4013              : 
    4014           40 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirMassFlowRate =
    4015           40 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedAirVolFlowRate *
    4016           80 :                     Psychrometrics::PsyRhoAirFnPbTdbW(state,
    4017              :                                                       DataEnvironment::StdPressureSeaLevel,
    4018              :                                                       RatedInletAirTemp,
    4019           40 :                                                       state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirHumRat);
    4020              :                 // store environment data fill back in after rating point calc is over
    4021           40 :                 Real64 holdOutDryBulbTemp = state.dataEnvrn->OutDryBulbTemp;
    4022           40 :                 Real64 holdOutHumRat = state.dataEnvrn->OutHumRat;
    4023           40 :                 Real64 holdOutWetBulb = state.dataEnvrn->OutWetBulbTemp;
    4024           40 :                 Real64 holdOutBaroPress = state.dataEnvrn->OutBaroPress;
    4025           40 :                 Real64 ratedOutdoorAirWetBulb = 23.9; // from I/O ref. more precise value?
    4026              : 
    4027           40 :                 state.dataEnvrn->OutDryBulbTemp = RatedAmbAirTemp;
    4028           40 :                 state.dataEnvrn->OutWetBulbTemp = ratedOutdoorAirWetBulb;
    4029           40 :                 state.dataEnvrn->OutBaroPress = DataEnvironment::StdPressureSeaLevel; // assume rating is for sea level.
    4030           80 :                 state.dataEnvrn->OutHumRat =
    4031           40 :                     Psychrometrics::PsyWFnTdbTwbPb(state, RatedAmbAirTemp, ratedOutdoorAirWetBulb, DataEnvironment::StdPressureSeaLevel, RoutineName);
    4032           40 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserInletNodeNum > 0) {
    4033            1 :                     state.dataLoopNodes->Node(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserInletNodeNum).Temp = RatedAmbAirTemp;
    4034            1 :                     state.dataLoopNodes->Node(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserInletNodeNum).HumRat =
    4035            1 :                         state.dataEnvrn->OutHumRat;
    4036            1 :                     state.dataLoopNodes->Node(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserInletNodeNum).Press =
    4037              :                         DataEnvironment::StdPressureSeaLevel;
    4038            1 :                     state.dataLoopNodes->Node(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserInletNodeNum).OutAirWetBulb =
    4039              :                         ratedOutdoorAirWetBulb;
    4040              :                 }
    4041           40 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType ==
    4042              :                     HVAC::Coil_CoolingWaterToAirHPVSEquationFit) { // need to set water info for WSHP
    4043           18 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterMassFlowRate =
    4044           36 :                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedWaterMassFlowRate(
    4045           18 :                             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds);
    4046           18 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletWaterTemp = RatedInletWaterTemp; // 85 F cooling mode
    4047           18 :                     Real64 CpSource = state.dataPlnt->PlantLoop(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).plantLoc.loopNum)
    4048           18 :                                           .glycol->getSpecificHeat(state, state.dataVariableSpeedCoils->SourceSideInletTemp, RoutineName);
    4049           18 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletWaterEnthalpy =
    4050           18 :                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletWaterTemp * CpSource;
    4051              :                 }
    4052              : 
    4053              :                 // calculate coil model at rating point
    4054           40 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac = 1.0;
    4055           40 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignAirMassFlowRate =
    4056           80 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirMassFlowRate(
    4057           40 :                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds);
    4058           40 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignAirVolFlowRate =
    4059           80 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirVolFlowRate(
    4060           40 :                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds);
    4061           40 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignWaterMassFlowRate =
    4062           80 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedWaterMassFlowRate(
    4063           40 :                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds);
    4064           40 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignWaterVolFlowRate =
    4065           80 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedWaterVolFlowRate(
    4066           40 :                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds);
    4067              : 
    4068           40 :                 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           40 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds);
    4078              :                 // coil outlets
    4079           40 :                 Real64 RatedOutletWetBulb(0.0);
    4080          120 :                 RatedOutletWetBulb = Psychrometrics::PsyTwbFnTdbWPb(state,
    4081           40 :                                                                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirDBTemp,
    4082           40 :                                                                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirHumRat,
    4083              :                                                                     DataEnvironment::StdPressureSeaLevel,
    4084              :                                                                     RoutineName);
    4085           40 :                 state.dataRptCoilSelection->coilSelectionReportObj->setRatedCoilConditions(
    4086              :                     state,
    4087           40 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
    4088           40 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VarSpeedCoilType,
    4089           40 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QLoadTotal, // this is the report variable
    4090           40 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QSensible,  // this is the report variable
    4091           40 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirMassFlowRate,
    4092           40 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirDBTemp,
    4093           40 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirHumRat,
    4094              :                     RatedInletWetBulbTemp,
    4095           40 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirDBTemp,
    4096           40 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirHumRat,
    4097              :                     RatedOutletWetBulb,
    4098              :                     RatedAmbAirTemp,
    4099              :                     ratedOutdoorAirWetBulb,
    4100           80 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedCBF(
    4101           40 :                         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           40 :                 state.dataEnvrn->OutDryBulbTemp = holdOutDryBulbTemp;
    4106           40 :                 state.dataEnvrn->OutHumRat = holdOutHumRat;
    4107           40 :                 state.dataEnvrn->OutWetBulbTemp = holdOutWetBulb;
    4108           40 :                 state.dataEnvrn->OutBaroPress = holdOutBaroPress;
    4109              :             }
    4110              : 
    4111              :             // Multispeed Heating
    4112          116 :             if ((state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_HeatingWaterToAirHPVSEquationFit) ||
    4113           49 :                 (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_HeatingAirToAirVariableSpeed)) {
    4114           27 :                 RatedHeatPumpIndoorAirTemp = 21.11;  // 21.11C or 70F
    4115           27 :                 RatedHeatPumpIndoorHumRat = 0.00881; // Humidity ratio corresponding to 70F dry bulb/60F wet bulb
    4116          287 :                 for (int Mode = 1; Mode <= state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds; ++Mode) {
    4117              : 
    4118          260 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirMassFlowRate(Mode) =
    4119          260 :                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirVolFlowRate(Mode) *
    4120          260 :                         Psychrometrics::PsyRhoAirFnPbTdbW(
    4121          260 :                             state, state.dataEnvrn->OutBaroPress, RatedHeatPumpIndoorAirTemp, RatedHeatPumpIndoorHumRat, RoutineName);
    4122              :                     // Check for valid range of (Rated Air Volume Flow Rate / Rated Total Capacity)
    4123          260 :                     RatedVolFlowPerRatedTotCap = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirVolFlowRate(Mode) /
    4124          260 :                                                  state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(Mode);
    4125              :                 }
    4126              :                 // call coil model with everthing set at rating point
    4127           27 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirDBTemp = RatedInletAirTempHeat;
    4128           27 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirHumRat =
    4129           27 :                     Psychrometrics::PsyWFnTdbTwbPb(state, RatedInletAirTempHeat, RatedInletWetBulbTemp, DataEnvironment::StdPressureSeaLevel);
    4130           27 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirEnthalpy =
    4131           27 :                     Psychrometrics::PsyHFnTdbW(RatedInletAirTempHeat, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirHumRat);
    4132           27 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirPressure = DataEnvironment::StdPressureSeaLevel;
    4133              : 
    4134           27 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirMassFlowRate =
    4135           27 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedAirVolFlowRate *
    4136           54 :                     Psychrometrics::PsyRhoAirFnPbTdbW(state,
    4137              :                                                       DataEnvironment::StdPressureSeaLevel,
    4138              :                                                       RatedInletAirTempHeat,
    4139           27 :                                                       state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirHumRat);
    4140              :                 // store environment data fill back in after rating point calc is over
    4141           27 :                 Real64 holdOutDryBulbTemp = state.dataEnvrn->OutDryBulbTemp;
    4142           27 :                 Real64 holdOutHumRat = state.dataEnvrn->OutHumRat;
    4143           27 :                 Real64 holdOutWetBulb = state.dataEnvrn->OutWetBulbTemp;
    4144           27 :                 Real64 holdOutBaroPress = state.dataEnvrn->OutBaroPress;
    4145              : 
    4146           27 :                 state.dataEnvrn->OutDryBulbTemp = RatedAmbAirTempHeat;
    4147           27 :                 state.dataEnvrn->OutWetBulbTemp = RatedAmbAirWBHeat;
    4148           27 :                 state.dataEnvrn->OutBaroPress = DataEnvironment::StdPressureSeaLevel; // assume rating is for sea level.
    4149           54 :                 state.dataEnvrn->OutHumRat =
    4150           27 :                     Psychrometrics::PsyWFnTdbTwbPb(state, RatedAmbAirTempHeat, RatedAmbAirWBHeat, DataEnvironment::StdPressureSeaLevel, RoutineName);
    4151           27 :                 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           27 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType ==
    4162              :                     HVAC::Coil_HeatingWaterToAirHPVSEquationFit) { // need to set water info for WSHP
    4163           18 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterMassFlowRate =
    4164           36 :                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedWaterMassFlowRate(
    4165           18 :                             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds);
    4166           18 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletWaterTemp = RatedInletWaterTempHeat; // 21.11C or 70F, heating mode
    4167           18 :                     Real64 CpSource = state.dataPlnt->PlantLoop(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).plantLoc.loopNum)
    4168           18 :                                           .glycol->getSpecificHeat(state, state.dataVariableSpeedCoils->SourceSideInletTemp, RoutineName);
    4169           18 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletWaterEnthalpy =
    4170           18 :                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletWaterTemp * CpSource;
    4171              :                 }
    4172              : 
    4173              :                 // calculate coil model at rating point
    4174           27 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac = 1.0;
    4175           27 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignAirMassFlowRate =
    4176           54 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirMassFlowRate(
    4177           27 :                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds);
    4178           27 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignAirVolFlowRate =
    4179           54 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirVolFlowRate(
    4180           27 :                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds);
    4181           27 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignWaterMassFlowRate =
    4182           54 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedWaterMassFlowRate(
    4183           27 :                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds);
    4184           27 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignWaterVolFlowRate =
    4185           54 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedWaterVolFlowRate(
    4186           27 :                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds);
    4187           27 :                 CalcVarSpeedCoilHeating(state,
    4188              :                                         DXCoilNum,
    4189              :                                         HVAC::FanOp::Continuous,
    4190              :                                         SensLoad,
    4191              :                                         HVAC::CompressorOp::On,
    4192              :                                         1.0,
    4193              :                                         1.0,
    4194              :                                         1.0,
    4195           27 :                                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds);
    4196              :                 // coil outlets
    4197           27 :                 Real64 RatedOutletWetBulb(0.0);
    4198           81 :                 RatedOutletWetBulb = Psychrometrics::PsyTwbFnTdbWPb(state,
    4199           27 :                                                                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirDBTemp,
    4200           27 :                                                                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirHumRat,
    4201              :                                                                     DataEnvironment::StdPressureSeaLevel,
    4202              :                                                                     RoutineName);
    4203           27 :                 state.dataRptCoilSelection->coilSelectionReportObj->setRatedCoilConditions(
    4204              :                     state,
    4205           27 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
    4206           27 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VarSpeedCoilType,
    4207           27 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QLoadTotal, // this is the report variable
    4208           27 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QSensible,  // this is the report variable
    4209           27 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirMassFlowRate,
    4210           27 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirDBTemp,
    4211           27 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirHumRat,
    4212              :                     RatedInletWetBulbTemp,
    4213           27 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirDBTemp,
    4214           27 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirHumRat,
    4215              :                     RatedOutletWetBulb,
    4216              :                     RatedAmbAirTempHeat,
    4217              :                     RatedAmbAirWBHeat,
    4218           54 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedCBF(
    4219           27 :                         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           27 :                 state.dataEnvrn->OutDryBulbTemp = holdOutDryBulbTemp;
    4224           27 :                 state.dataEnvrn->OutHumRat = holdOutHumRat;
    4225           27 :                 state.dataEnvrn->OutWetBulbTemp = holdOutWetBulb;
    4226           27 :                 state.dataEnvrn->OutBaroPress = holdOutBaroPress;
    4227              :             }
    4228              : 
    4229              :             // store fan info for coil
    4230           67 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SupplyFanIndex > 0) {
    4231           12 :                 state.dataRptCoilSelection->coilSelectionReportObj->setCoilSupplyFanInfo(
    4232              :                     state,
    4233           12 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Name,
    4234           12 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VarSpeedCoilType,
    4235           12 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SupplyFanName,
    4236           12 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).supplyFanType,
    4237           12 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SupplyFanIndex);
    4238              :             }
    4239              :         }
    4240              : 
    4241     45014786 :         if (SpeedNum > state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds) {
    4242            0 :             SpeedCal = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds;
    4243     45014786 :         } else if (SpeedNum < 1) {
    4244            0 :             SpeedCal = 1;
    4245              :         } else {
    4246     45014786 :             SpeedCal = SpeedNum;
    4247              :         }
    4248     45014786 :         if ((SpeedNum <= 1) || (SpeedNum > state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds)) {
    4249     22442790 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignAirMassFlowRate =
    4250     22442790 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirMassFlowRate(SpeedCal);
    4251     22442790 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignAirVolFlowRate =
    4252     22442790 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirVolFlowRate(SpeedCal);
    4253     22442790 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignWaterMassFlowRate =
    4254     22442790 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedWaterMassFlowRate(SpeedCal);
    4255     22442790 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignWaterVolFlowRate =
    4256     22442790 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedWaterVolFlowRate(SpeedCal);
    4257              :         } else {
    4258     22571996 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignAirMassFlowRate =
    4259     22571996 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirMassFlowRate(SpeedCal) * SpeedRatio +
    4260     22571996 :                 (1.0 - SpeedRatio) * state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirMassFlowRate(SpeedCal - 1);
    4261     22571996 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignAirVolFlowRate =
    4262     22571996 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirVolFlowRate(SpeedCal) * SpeedRatio +
    4263     22571996 :                 (1.0 - SpeedRatio) * state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirVolFlowRate(SpeedCal - 1);
    4264     22571996 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignWaterMassFlowRate =
    4265     22571996 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedWaterMassFlowRate(SpeedCal) * SpeedRatio +
    4266     22571996 :                 (1.0 - SpeedRatio) * state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedWaterMassFlowRate(SpeedCal - 1);
    4267     22571996 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignWaterVolFlowRate =
    4268     22571996 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedWaterVolFlowRate(SpeedCal) * SpeedRatio +
    4269     22571996 :                 (1.0 - SpeedRatio) * state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedWaterVolFlowRate(SpeedCal - 1);
    4270              :         }
    4271              : 
    4272              :         // Do the Begin Environment initializations
    4273     45015235 :         if (state.dataGlobal->BeginEnvrnFlag && state.dataVariableSpeedCoils->MyEnvrnFlag(DXCoilNum) &&
    4274          449 :             !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          449 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirVolFlowRate = 0.0;
    4279          449 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirDBTemp = 0.0;
    4280          449 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirHumRat = 0.0;
    4281          449 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirDBTemp = 0.0;
    4282          449 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirHumRat = 0.0;
    4283          449 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterVolFlowRate = 0.0;
    4284          449 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterMassFlowRate = 0.0;
    4285          449 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletWaterTemp = 0.0;
    4286          449 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletWaterEnthalpy = 0.0;
    4287          449 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletWaterEnthalpy = 0.0;
    4288          449 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletWaterTemp = 0.0;
    4289          449 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Power = 0.0;
    4290          449 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QLoadTotal = 0.0;
    4291          449 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QSensible = 0.0;
    4292          449 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QLatent = 0.0;
    4293          449 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QSource = 0.0;
    4294          449 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Energy = 0.0;
    4295          449 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergyLoadTotal = 0.0;
    4296          449 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergySensible = 0.0;
    4297          449 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergyLatent = 0.0;
    4298          449 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergySource = 0.0;
    4299          449 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).COP = 0.0;
    4300          449 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac = 0.0;
    4301          449 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PartLoadRatio = 0.0;
    4302              : 
    4303          792 :             if ((state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_HeatingWaterToAirHPVSEquationFit) ||
    4304          343 :                 (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_CoolingWaterToAirHPVSEquationFit)) {
    4305          212 :                 WaterInletNode = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterInletNodeNum;
    4306              : 
    4307          212 :                 rho = state.dataPlnt->PlantLoop(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).plantLoc.loopNum)
    4308          212 :                           .glycol->getDensity(state, Constant::CWInitConvTemp, RoutineNameSimpleWatertoAirHP);
    4309          212 :                 Cp = state.dataPlnt->PlantLoop(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).plantLoc.loopNum)
    4310          212 :                          .glycol->getSpecificHeat(state, Constant::CWInitConvTemp, RoutineNameSimpleWatertoAirHP);
    4311              : 
    4312              :                 //    VarSpeedCoil(DXCoilNum)%DesignWaterMassFlowRate= &
    4313              :                 //                             rho * VarSpeedCoil(DXCoilNum)%RatedWaterVolFlowRate
    4314              : 
    4315          636 :                 PlantUtilities::InitComponentNodes(state,
    4316              :                                                    0.0,
    4317          424 :                                                    state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedWaterMassFlowRate(
    4318          212 :                                                        state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds),
    4319          212 :                                                    state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterInletNodeNum,
    4320          212 :                                                    state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterOutletNodeNum);
    4321              : 
    4322          212 :                 state.dataLoopNodes->Node(WaterInletNode).Temp = 5.0;
    4323          212 :                 state.dataLoopNodes->Node(WaterInletNode).Enthalpy = Cp * state.dataLoopNodes->Node(WaterInletNode).Temp;
    4324          212 :                 state.dataLoopNodes->Node(WaterInletNode).Quality = 0.0;
    4325          212 :                 state.dataLoopNodes->Node(WaterInletNode).Press = 0.0;
    4326          212 :                 state.dataLoopNodes->Node(WaterInletNode).HumRat = 0.0;
    4327              : 
    4328          212 :                 state.dataLoopNodes->Node(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterOutletNodeNum).Temp = 5.0;
    4329          212 :                 state.dataLoopNodes->Node(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterOutletNodeNum).Enthalpy =
    4330          212 :                     Cp * state.dataLoopNodes->Node(WaterInletNode).Temp;
    4331          212 :                 state.dataLoopNodes->Node(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterOutletNodeNum).Quality = 0.0;
    4332          212 :                 state.dataLoopNodes->Node(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterOutletNodeNum).Press = 0.0;
    4333          212 :                 state.dataLoopNodes->Node(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterOutletNodeNum).HumRat = 0.0;
    4334              :             }
    4335              : 
    4336          449 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SimFlag = true;
    4337          449 :             state.dataHeatBal->HeatReclaimVS_Coil(DXCoilNum).AvailCapacity = 0.0;
    4338              : 
    4339          449 :             state.dataVariableSpeedCoils->MyEnvrnFlag(DXCoilNum) = false;
    4340              : 
    4341              :         } // End If for the Begin Environment initializations
    4342              : 
    4343     45014786 :         if (!state.dataGlobal->BeginEnvrnFlag) {
    4344     44970546 :             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     45014786 :         WaterInletNode = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterInletNodeNum;
    4354              : 
    4355     45014786 :         if ((SensLoad != 0.0 || LatentLoad != 0.0) && (state.dataLoopNodes->Node(AirInletNode).MassFlowRate > 0.0)) {
    4356     30240509 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedWaterMassFlowRate(
    4357     30240509 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel) > 0.0) {
    4358      3439666 :                 WaterFlowScale = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedWaterMassFlowRate /
    4359      3439666 :                                  state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedWaterMassFlowRate(
    4360      3439666 :                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NormSpedLevel);
    4361      3439666 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterMassFlowRate =
    4362      3439666 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignWaterMassFlowRate * WaterFlowScale;
    4363              :             } else {
    4364     26800843 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterMassFlowRate = 0.0;
    4365              :             }
    4366              : 
    4367     30240509 :             if (fanOp == HVAC::FanOp::Continuous) {
    4368              :                 // continuous fan, cycling compressor
    4369     29590555 :                 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     29590555 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirMassFlowRate <
    4374     29590555 :                     0.25 * state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignAirVolFlowRate *
    4375     59181110 :                         Psychrometrics::PsyRhoAirFnPbTdbW(state,
    4376     29590555 :                                                           state.dataEnvrn->OutBaroPress,
    4377     29590555 :                                                           state.dataLoopNodes->Node(AirInletNode).Temp,
    4378     29590555 :                                                           state.dataLoopNodes->Node(AirInletNode).HumRat)) {
    4379       102927 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirMassFlowRate =
    4380       102927 :                         0.25 * state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignAirVolFlowRate *
    4381       308781 :                         Psychrometrics::PsyRhoAirFnPbTdbW(state,
    4382       102927 :                                                           state.dataEnvrn->OutBaroPress,
    4383       102927 :                                                           state.dataLoopNodes->Node(AirInletNode).Temp,
    4384       102927 :                                                           state.dataLoopNodes->Node(AirInletNode).HumRat);
    4385              :                 }
    4386              :             } else { // CYCLIC FAN, NOT CORRECTION, WILL BE PROCESSED IN THE FOLLOWING SUBROUTINES
    4387       649954 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirMassFlowRate = state.dataLoopNodes->Node(AirInletNode).MassFlowRate;
    4388              :             }
    4389              : 
    4390              :         } else { // heat pump is off
    4391     14774277 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterMassFlowRate = 0.0;
    4392     14774277 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirMassFlowRate = 0.0;
    4393              :         }
    4394              : 
    4395     85507779 :         if ((state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_HeatingWaterToAirHPVSEquationFit) ||
    4396     40492993 :             (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_CoolingWaterToAirHPVSEquationFit)) {
    4397     27130758 :             PlantUtilities::SetComponentFlowRate(state,
    4398      9043586 :                                                  state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterMassFlowRate,
    4399      9043586 :                                                  state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterInletNodeNum,
    4400      9043586 :                                                  state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterOutletNodeNum,
    4401      9043586 :                                                  state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).plantLoc);
    4402              : 
    4403      9043586 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletWaterTemp = state.dataLoopNodes->Node(WaterInletNode).Temp;
    4404      9043586 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletWaterEnthalpy = state.dataLoopNodes->Node(WaterInletNode).Enthalpy;
    4405              :         } else {
    4406     35971200 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletWaterTemp = 0.0;
    4407     35971200 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletWaterEnthalpy = 0.0;
    4408              :         }
    4409              : 
    4410     45014786 :         if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::CoilDX_HeatPumpWaterHeaterVariableSpeed) {
    4411      1599176 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletWaterTemp = state.dataLoopNodes->Node(WaterInletNode).Temp;
    4412      1599176 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletWaterEnthalpy = state.dataLoopNodes->Node(WaterInletNode).Enthalpy;
    4413              :         };
    4414              : 
    4415     45014786 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirDBTemp = state.dataLoopNodes->Node(AirInletNode).Temp;
    4416     45014786 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirHumRat = state.dataLoopNodes->Node(AirInletNode).HumRat;
    4417     45014786 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirEnthalpy = state.dataLoopNodes->Node(AirInletNode).Enthalpy;
    4418              : 
    4419     45014786 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirPressure = state.dataEnvrn->OutBaroPress; // temporary
    4420              :         // Outlet variables
    4421     45014786 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Power = 0.0;
    4422     45014786 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QLoadTotal = 0.0;
    4423     45014786 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QSensible = 0.0;
    4424     45014786 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QLatent = 0.0;
    4425     45014786 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QSource = 0.0;
    4426     45014786 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QWasteHeat = 0.0;
    4427     45014786 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Energy = 0.0;
    4428     45014786 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergyLoadTotal = 0.0;
    4429     45014786 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergySensible = 0.0;
    4430     45014786 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergyLatent = 0.0;
    4431     45014786 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergySource = 0.0;
    4432     45014786 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).COP = 0.0;
    4433              : 
    4434     45014786 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirDBTemp = 0.0;
    4435     45014786 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletWaterTemp = 0.0;
    4436     45014786 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirHumRat = 0.0;
    4437     45014786 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirEnthalpy = 0.0;
    4438     45014786 :         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     45014786 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterConsumption = 0.0;
    4442     45014786 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapWaterConsump = 0.0;
    4443     45014786 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).BasinHeaterConsumption = 0.0;
    4444     45014786 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapCondPumpElecConsumption = 0.0;
    4445     45014786 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterPower = 0.0;
    4446     45014786 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostPower = 0.0;
    4447     45014786 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostConsumption = 0.0;
    4448     45014786 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondensateVdot = 0.0;
    4449     45014786 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondensateVol = 0.0;
    4450     45014786 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QWasteHeat = 0.0;
    4451              : 
    4452              :         // clear zeros to HPWH variables
    4453     45014786 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).ElecWaterHeatingPower =
    4454              :             0.0; // Total electric power consumed by compressor and condenser pump [W]
    4455     45014786 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).ElecWaterHeatingConsumption =
    4456              :             0.0; // Total electric consumption by compressor and condenser pump [J]
    4457     45014786 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).TotalHeatingEnergy = 0.0;       // total water heating energy
    4458     45014786 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).TotalHeatingEnergyRate = 0.0;   // total WH energy rate
    4459     45014786 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpElecNomPower = 0.0; // power power
    4460              : 
    4461     45014786 :         state.dataVariableSpeedCoils->VSHPWHHeatingCapacity = 0.0; // Used by Heat Pump:Water Heater object as total water heating capacity [W]
    4462     45014786 :         state.dataVariableSpeedCoils->VSHPWHHeatingCOP = 0.0;      // Used by Heat Pump:Water Heater object as water heating COP [W/W]
    4463     45014786 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletWaterTemp = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletWaterTemp;
    4464     45014786 :         state.dataHeatBal->HeatReclaimVS_Coil(DXCoilNum).AvailCapacity = 0.0;
    4465     45014786 :     }
    4466              : 
    4467           85 :     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           85 :         auto &varSpeedCoil = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum);
    4492              : 
    4493              :         // SUBROUTINE LOCAL VARIABLE DECLARATIONS:
    4494           85 :         Real64 rhoair = state.dataEnvrn->StdRhoAir;
    4495           85 :         Real64 MixTemp = -999.0;
    4496           85 :         Real64 MixHumRat = -999.0;
    4497           85 :         Real64 MixEnth = -999.0;
    4498           85 :         Real64 MixWetBulb = -999.0;
    4499           85 :         Real64 SupTemp = -999.0;
    4500           85 :         Real64 SupHumRat = -999.0;
    4501           85 :         Real64 SupEnth = -999.0;
    4502           85 :         Real64 OutTemp = -999.0;
    4503           85 :         Real64 OutAirFrac = -999.0;
    4504           85 :         Real64 VolFlowRate = -999.0;
    4505           85 :         Real64 CoolCapAtPeak = -999.0;
    4506           85 :         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           85 :         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           85 :         int UpperSpeed = varSpeedCoil.NumOfSpeeds;
    4534           85 :         int NormSpeed = varSpeedCoil.NormSpedLevel;
    4535           85 :         int PltSizNum = 0;
    4536           85 :         bool RatedAirFlowAutoSized = false;
    4537           85 :         bool RatedWaterFlowAutoSized = false;
    4538           85 :         bool RatedCapHeatAutoSized = false;
    4539           85 :         bool IsAutoSize = false;
    4540              : 
    4541           85 :         if (state.dataSize->SysSizingRunDone || state.dataSize->ZoneSizingRunDone) {
    4542           53 :             HardSizeNoDesRun = false;
    4543              :         } else {
    4544           32 :             HardSizeNoDesRun = true;
    4545              :         }
    4546           85 :         if (state.dataSize->CurSysNum > 0) {
    4547           63 :             CheckThisAirSystemForSizing(state, state.dataSize->CurSysNum, SizingDesRunThisAirSys);
    4548              :         } else {
    4549           22 :             SizingDesRunThisAirSys = false;
    4550              :         }
    4551           85 :         if (state.dataSize->CurZoneEqNum > 0) {
    4552           18 :             CheckThisZoneForSizing(state, state.dataSize->CurZoneEqNum, SizingDesRunThisZone);
    4553              :         } else {
    4554           67 :             SizingDesRunThisZone = false;
    4555              :         }
    4556           85 :         bool HardSizeNoDesRunAirFlow = false;
    4557           85 :         Real64 RatedAirVolFlowRateDes = 0.0;
    4558           85 :         Real64 RatedAirVolFlowRateUser = 0.0;
    4559           85 :         Real64 RatedCapCoolTotalDes = 0.0;
    4560           85 :         Real64 RatedCapCoolTotalUser = 0.0;
    4561           85 :         Real64 RatedCapHeatDes = 0.0;
    4562           85 :         Real64 RatedCapHeatUser = 0.0;
    4563           85 :         Real64 RatedWaterVolFlowRateDes = 0.0;
    4564           85 :         Real64 RatedWaterVolFlowRateUser = 0.0;
    4565           85 :         Real64 RatedCapCoolSensDes = 0.0;
    4566           85 :         Real64 EvapCondPumpElecNomPowerDes = 0.0;
    4567           85 :         Real64 EvapCondPumpElecNomPowerUser = 0.0;
    4568           85 :         Real64 DefrostCapacityDes = 0.0;
    4569           85 :         Real64 DefrostCapacityUser = 0.0;
    4570              : 
    4571           85 :         if (varSpeedCoil.VSCoilType == HVAC::Coil_CoolingWaterToAirHPVSEquationFit ||
    4572           67 :             varSpeedCoil.VSCoilType == HVAC::Coil_HeatingWaterToAirHPVSEquationFit) {
    4573           36 :             CurrentObjSubfix = ":WATERTOAIRHEATPUMP:VARIABLESPEEDEQUATIONFIT";
    4574           49 :         } else if (varSpeedCoil.VSCoilType == HVAC::CoilDX_HeatPumpWaterHeaterVariableSpeed) {
    4575           14 :             CurrentObjSubfix = ":WATERHEATING:AIRTOWATERHEATPUMP:VARIABLESPEED";
    4576              :         } else {
    4577           35 :             CurrentObjSubfix = ":DX:VARIABLESPEED";
    4578              :         }
    4579              : 
    4580           85 :         if (varSpeedCoil.VSCoilType == HVAC::CoilDX_HeatPumpWaterHeaterVariableSpeed) {
    4581           14 :             if (varSpeedCoil.RatedAirVolFlowRate == Constant::AutoCalculate) {
    4582            4 :                 varSpeedCoil.RatedAirVolFlowRate =
    4583            4 :                     varSpeedCoil.RatedCapWH * varSpeedCoil.MSRatedAirVolFlowRate(NormSpeed) / varSpeedCoil.MSRatedTotCap(NormSpeed); // 0.00005035;
    4584            4 :                 varSpeedCoil.AirVolFlowAutoSized = true;
    4585              :             }
    4586           14 :             state.dataRptCoilSelection->coilSelectionReportObj->setCoilAirFlow(
    4587           14 :                 state, varSpeedCoil.Name, varSpeedCoil.VarSpeedCoilType, varSpeedCoil.RatedAirVolFlowRate, varSpeedCoil.AirVolFlowAutoSized);
    4588              : 
    4589           14 :             if (varSpeedCoil.RatedWaterVolFlowRate == Constant::AutoCalculate) {
    4590            4 :                 varSpeedCoil.RatedHPWHCondWaterFlow = varSpeedCoil.RatedCapWH * varSpeedCoil.MSRatedWaterVolFlowRate(NormSpeed) /
    4591            4 :                                                       varSpeedCoil.MSRatedTotCap(NormSpeed); // 0.00000004487;
    4592            4 :                 varSpeedCoil.RatedWaterVolFlowRate = varSpeedCoil.RatedHPWHCondWaterFlow;
    4593            4 :                 varSpeedCoil.WaterVolFlowAutoSized = true;
    4594              :             }
    4595           14 :             state.dataRptCoilSelection->coilSelectionReportObj->setCoilWaterFlowPltSizNum(state,
    4596           14 :                                                                                           varSpeedCoil.Name,
    4597           14 :                                                                                           varSpeedCoil.VarSpeedCoilType,
    4598              :                                                                                           varSpeedCoil.RatedWaterVolFlowRate,
    4599           14 :                                                                                           varSpeedCoil.WaterVolFlowAutoSized,
    4600              :                                                                                           -999,
    4601              :                                                                                           varSpeedCoil.plantLoc.loopNum);
    4602              :         }
    4603              : 
    4604           85 :         if (varSpeedCoil.RatedAirVolFlowRate == DataSizing::AutoSize) {
    4605           25 :             RatedAirFlowAutoSized = true;
    4606              :         }
    4607              : 
    4608           85 :         if (state.dataSize->CurSysNum > 0) {
    4609           63 :             if (!RatedAirFlowAutoSized && !SizingDesRunThisAirSys) { // Simulation continue
    4610           51 :                 HardSizeNoDesRunAirFlow = true;
    4611           51 :                 if (varSpeedCoil.RatedAirVolFlowRate > 0.0) {
    4612          153 :                     BaseSizer::reportSizerOutput(state,
    4613          102 :                                                  format("COIL:{}{}", varSpeedCoil.CoolHeatType, CurrentObjSubfix),
    4614              :                                                  varSpeedCoil.Name,
    4615              :                                                  "User-Specified Rated Air Flow Rate [m3/s]",
    4616              :                                                  varSpeedCoil.RatedAirVolFlowRate);
    4617              :                 }
    4618              :             } else {
    4619           12 :                 CheckSysSizing(state, format("COIL:{}{}", varSpeedCoil.CoolHeatType, CurrentObjSubfix), varSpeedCoil.Name);
    4620           12 :                 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           12 :                     if (state.dataSize->FinalSysSizing(state.dataSize->CurSysNum).DesMainVolFlow >= HVAC::SmallAirVolFlow) {
    4626           12 :                         RatedAirVolFlowRateDes = state.dataSize->FinalSysSizing(state.dataSize->CurSysNum).DesMainVolFlow;
    4627              :                     } else {
    4628            0 :                         RatedAirVolFlowRateDes = 0.0;
    4629              :                     }
    4630              :                 }
    4631              :             }
    4632              :         }
    4633              : 
    4634           85 :         if (state.dataSize->CurZoneEqNum > 0) {
    4635           18 :             if (!RatedAirFlowAutoSized && !SizingDesRunThisZone) { // Simulation continue
    4636            0 :                 HardSizeNoDesRunAirFlow = true;
    4637            0 :                 if (varSpeedCoil.RatedAirVolFlowRate > 0.0) {
    4638            0 :                     BaseSizer::reportSizerOutput(state,
    4639            0 :                                                  format("COIL:{}{}", varSpeedCoil.CoolHeatType, CurrentObjSubfix),
    4640              :                                                  varSpeedCoil.Name,
    4641              :                                                  "User-Specified Rated Air Flow Rate [m3/s]",
    4642              :                                                  varSpeedCoil.RatedAirVolFlowRate);
    4643              :                 }
    4644              :             } else {
    4645           18 :                 CheckZoneSizing(state, format("COIL:{}{}", varSpeedCoil.CoolHeatType, CurrentObjSubfix), varSpeedCoil.Name);
    4646           18 :                 RatedAirVolFlowRateDes = max(state.dataSize->FinalZoneSizing(state.dataSize->CurZoneEqNum).DesCoolVolFlow,
    4647           18 :                                              state.dataSize->FinalZoneSizing(state.dataSize->CurZoneEqNum).DesHeatVolFlow);
    4648           18 :                 if (RatedAirVolFlowRateDes < HVAC::SmallAirVolFlow) {
    4649            0 :                     RatedAirVolFlowRateDes = 0.0;
    4650              :                 }
    4651              :             }
    4652              :         }
    4653              : 
    4654           85 :         if (RatedAirFlowAutoSized) {
    4655           25 :             varSpeedCoil.RatedAirVolFlowRate = RatedAirVolFlowRateDes;
    4656              :         }
    4657              : 
    4658           85 :         RatedCapCoolTotalAutoSized = false;
    4659           85 :         RatedCapCoolSensAutoSized = false;
    4660              : 
    4661              :         // size rated total cooling capacity
    4662           85 :         IsAutoSize = false;
    4663           85 :         if (varSpeedCoil.RatedCapCoolTotal == DataSizing::AutoSize && (varSpeedCoil.VSCoilType == HVAC::Coil_CoolingWaterToAirHPVSEquationFit ||
    4664           52 :                                                                        varSpeedCoil.VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed)) {
    4665           18 :             RatedCapCoolTotalAutoSized = true;
    4666              :         }
    4667           85 :         if (SizingDesRunThisZone || SizingDesRunThisAirSys) {
    4668           30 :             HardSizeNoDesRun = false;
    4669              :         }
    4670           85 :         if (state.dataSize->CurSysNum > 0) {
    4671           63 :             if (!RatedCapCoolTotalAutoSized && !SizingDesRunThisAirSys) { // Simulation continue
    4672           51 :                 HardSizeNoDesRun = true;
    4673           51 :                 if (varSpeedCoil.RatedCapCoolTotal > 0.0) {
    4674           84 :                     BaseSizer::reportSizerOutput(state,
    4675           56 :                                                  format("COIL:{}{}", varSpeedCoil.CoolHeatType, CurrentObjSubfix),
    4676              :                                                  varSpeedCoil.Name,
    4677              :                                                  "User-Specified Rated Total Cooling Capacity [W]",
    4678              :                                                  varSpeedCoil.RatedCapCoolTotal);
    4679              :                 }
    4680              :             } else {
    4681           12 :                 CheckSysSizing(state, format("COIL:{}{}", varSpeedCoil.CoolHeatType, CurrentObjSubfix), varSpeedCoil.Name);
    4682           12 :                 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           12 :                     auto const &finalSysSizing = state.dataSize->FinalSysSizing(state.dataSize->CurSysNum);
    4705           12 :                     VolFlowRate = varSpeedCoil.RatedAirVolFlowRate;
    4706           12 :                     if (VolFlowRate >= HVAC::SmallAirVolFlow) {
    4707           12 :                         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           12 :                             SupTemp = finalSysSizing.CoolSupTemp;
    4714           12 :                             SupHumRat = finalSysSizing.CoolSupHumRat;
    4715           12 :                             if (state.dataAirSystemsData->PrimaryAirSystems(state.dataSize->CurSysNum).NumOACoolCoils ==
    4716              :                                 0) { // there is no precooling of the OA stream
    4717           12 :                                 MixTemp = finalSysSizing.MixTempAtCoolPeak;
    4718           12 :                                 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           12 :                         OutTemp = finalSysSizing.OutTempAtCoolPeak;
    4731           12 :                         MixEnth = Psychrometrics::PsyHFnTdbW(MixTemp, MixHumRat);
    4732           12 :                         SupEnth = Psychrometrics::PsyHFnTdbW(SupTemp, SupHumRat);
    4733              : 
    4734              :                         // design fan heat will be added to coil load
    4735           12 :                         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           12 :                         Real64 CpAir = Psychrometrics::PsyCpAirFnW(MixHumRat);
    4738           12 :                         if (state.dataAirSystemsData->PrimaryAirSystems(state.dataSize->CurSysNum).supFanPlace == HVAC::FanPlace::BlowThru) {
    4739           12 :                             MixTemp += FanCoolLoad / (CpAir * rhoair * VolFlowRate);
    4740            0 :                         } else if (state.dataAirSystemsData->PrimaryAirSystems(state.dataSize->CurSysNum).supFanPlace == HVAC::FanPlace::DrawThru) {
    4741            0 :                             SupTemp -= FanCoolLoad / (CpAir * rhoair * VolFlowRate);
    4742              :                         }
    4743           12 :                         MixWetBulb = Psychrometrics::PsyTwbFnTdbWPb(state, MixTemp, MixHumRat, state.dataEnvrn->StdBaroPress, RoutineName);
    4744           12 :                         if (varSpeedCoil.CondenserType == DataHeatBalance::RefrigCondenserType::Air) {
    4745           12 :                             RatedSourceTempCool = OutTemp;
    4746              :                         } else {
    4747            0 :                             RatedSourceTempCool = GetVSCoilRatedSourceTemp(state, DXCoilNum);
    4748              :                         }
    4749           12 :                         TotCapTempModFac =
    4750           12 :                             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           12 :                         if (MixEnth > SupEnth) {
    4755           12 :                             CoolCapAtPeak = (rhoair * VolFlowRate * (MixEnth - SupEnth)) + FanCoolLoad;
    4756              :                         } else {
    4757            0 :                             CoolCapAtPeak = (rhoair * VolFlowRate * (48000.0 - SupEnth)) + FanCoolLoad;
    4758              :                         }
    4759           12 :                         CoolCapAtPeak = max(0.0, CoolCapAtPeak);
    4760           12 :                         if (TotCapTempModFac > 0.0) {
    4761           12 :                             RatedCapCoolTotalDes = CoolCapAtPeak / TotCapTempModFac;
    4762              :                         } else {
    4763            0 :                             RatedCapCoolTotalDes = CoolCapAtPeak;
    4764              :                         }
    4765              :                     } else {
    4766            0 :                         RatedCapCoolTotalDes = 0.0;
    4767              :                     }
    4768              :                 }
    4769              :             }
    4770              : 
    4771           22 :         } else if (state.dataSize->CurZoneEqNum > 0) {
    4772           18 :             if (!RatedCapCoolTotalAutoSized && !SizingDesRunThisZone) { // Simulation continue
    4773            0 :                 HardSizeNoDesRun = true;
    4774            0 :                 if (varSpeedCoil.RatedCapCoolTotal > 0.0) {
    4775            0 :                     BaseSizer::reportSizerOutput(state,
    4776            0 :                                                  format("COIL:{}{}", varSpeedCoil.CoolHeatType, CurrentObjSubfix),
    4777              :                                                  varSpeedCoil.Name,
    4778              :                                                  "User-Specified Rated Total Cooling Capacity [W]",
    4779              :                                                  varSpeedCoil.RatedCapCoolTotal);
    4780              :                 }
    4781              :             } else {
    4782           18 :                 CheckZoneSizing(state, format("COIL:{}{}", varSpeedCoil.CoolHeatType, CurrentObjSubfix), varSpeedCoil.Name);
    4783           18 :                 auto const &finalZoneSizing = state.dataSize->FinalZoneSizing(state.dataSize->CurZoneEqNum);
    4784           18 :                 VolFlowRate = varSpeedCoil.RatedAirVolFlowRate;
    4785           18 :                 if (VolFlowRate >= HVAC::SmallAirVolFlow) {
    4786           18 :                     if (state.dataSize->ZoneEqDXCoil) {
    4787           14 :                         if (state.dataSize->ZoneEqSizing(state.dataSize->CurZoneEqNum).OAVolFlow > 0.0) {
    4788           10 :                             MixTemp = finalZoneSizing.DesCoolCoilInTemp;
    4789           10 :                             MixHumRat = finalZoneSizing.DesCoolCoilInHumRat;
    4790              :                         } else {
    4791            4 :                             MixTemp = finalZoneSizing.ZoneTempAtCoolPeak;
    4792            4 :                             MixHumRat = finalZoneSizing.ZoneHumRatAtCoolPeak;
    4793              :                         }
    4794              :                     } else {
    4795            4 :                         MixTemp = finalZoneSizing.DesCoolCoilInTemp;
    4796            4 :                         MixHumRat = finalZoneSizing.DesCoolCoilInHumRat;
    4797              :                     }
    4798           18 :                     SupTemp = finalZoneSizing.CoolDesTemp;
    4799           18 :                     SupHumRat = finalZoneSizing.CoolDesHumRat;
    4800           18 :                     TimeStepNumAtMax = finalZoneSizing.TimeStepNumAtCoolMax;
    4801           18 :                     DDNum = finalZoneSizing.CoolDDNum;
    4802           18 :                     if (DDNum > 0 && TimeStepNumAtMax > 0) {
    4803           18 :                         OutTemp = state.dataSize->DesDayWeath(DDNum).Temp(TimeStepNumAtMax);
    4804              :                     } else {
    4805            0 :                         OutTemp = 0.0;
    4806              :                     }
    4807           18 :                     MixEnth = Psychrometrics::PsyHFnTdbW(MixTemp, MixHumRat);
    4808           18 :                     SupEnth = Psychrometrics::PsyHFnTdbW(SupTemp, SupHumRat);
    4809              : 
    4810              :                     // design fan heat will be added to coil load
    4811           18 :                     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           18 :                     Real64 CpAir = Psychrometrics::PsyCpAirFnW(MixHumRat);
    4814              : 
    4815           18 :                     if (state.dataSize->DataFanPlacement == HVAC::FanPlace::BlowThru) {
    4816           13 :                         MixTemp += FanCoolLoad / (CpAir * rhoair * VolFlowRate);
    4817              :                     } else {
    4818            5 :                         SupTemp -= FanCoolLoad / (CpAir * rhoair * VolFlowRate);
    4819              :                     }
    4820              : 
    4821           18 :                     MixWetBulb = Psychrometrics::PsyTwbFnTdbWPb(state, MixTemp, MixHumRat, state.dataEnvrn->StdBaroPress, RoutineName);
    4822           18 :                     if (varSpeedCoil.CondenserType == DataHeatBalance::RefrigCondenserType::Air) {
    4823           10 :                         RatedSourceTempCool = OutTemp;
    4824              :                     } else {
    4825            8 :                         RatedSourceTempCool = GetVSCoilRatedSourceTemp(state, DXCoilNum);
    4826              :                     }
    4827           18 :                     TotCapTempModFac =
    4828           18 :                         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           18 :                     if (MixEnth > SupEnth) {
    4833           18 :                         CoolCapAtPeak = (rhoair * VolFlowRate * (MixEnth - SupEnth)) + FanCoolLoad;
    4834              :                     } else {
    4835            0 :                         CoolCapAtPeak = (rhoair * VolFlowRate * (48000.0 - SupEnth)) + FanCoolLoad;
    4836              :                     }
    4837           18 :                     CoolCapAtPeak = max(0.0, CoolCapAtPeak);
    4838           18 :                     if (TotCapTempModFac > 0.0) {
    4839           18 :                         RatedCapCoolTotalDes = CoolCapAtPeak / TotCapTempModFac;
    4840              :                     } else {
    4841            0 :                         RatedCapCoolTotalDes = CoolCapAtPeak;
    4842              :                     }
    4843              :                 } else {
    4844            0 :                     RatedCapCoolTotalDes = 0.0;
    4845              :                 }
    4846              :             }
    4847              :         }
    4848           85 :         if (RatedCapCoolTotalDes < HVAC::SmallLoad) {
    4849           55 :             RatedCapCoolTotalDes = 0.0;
    4850              :         }
    4851           85 :         if (!HardSizeNoDesRun) {
    4852           33 :             if (RatedCapCoolTotalAutoSized) {
    4853           18 :                 varSpeedCoil.RatedCapCoolTotal = RatedCapCoolTotalDes;
    4854           54 :                 BaseSizer::reportSizerOutput(state,
    4855           36 :                                              format("COIL:{}{}", varSpeedCoil.CoolHeatType, CurrentObjSubfix),
    4856              :                                              varSpeedCoil.Name,
    4857              :                                              "Design Size Rated Total Cooling Capacity [W]",
    4858              :                                              varSpeedCoil.RatedCapCoolTotal);
    4859           36 :                 OutputReportPredefined::PreDefTableEntry(
    4860           18 :                     state, state.dataOutRptPredefined->pdchCoolCoilTotCap, varSpeedCoil.Name, varSpeedCoil.RatedCapCoolTotal);
    4861           36 :                 OutputReportPredefined::PreDefTableEntry(state,
    4862           18 :                                                          state.dataOutRptPredefined->pdchCoolCoilLatCap,
    4863              :                                                          varSpeedCoil.Name,
    4864           18 :                                                          varSpeedCoil.RatedCapCoolTotal - varSpeedCoil.RatedCapCoolSens);
    4865           18 :                 if (varSpeedCoil.RatedCapCoolTotal != 0.0) {
    4866           36 :                     OutputReportPredefined::PreDefTableEntry(state,
    4867           18 :                                                              state.dataOutRptPredefined->pdchCoolCoilSHR,
    4868              :                                                              varSpeedCoil.Name,
    4869           18 :                                                              varSpeedCoil.RatedCapCoolSens / varSpeedCoil.RatedCapCoolTotal);
    4870           36 :                     OutputReportPredefined::PreDefTableEntry(
    4871           18 :                         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           36 :                 OutputReportPredefined::addFootNoteSubTable(
    4877              :                     state,
    4878           18 :                     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           15 :                 if (varSpeedCoil.RatedCapCoolTotal > 0.0 && RatedCapCoolTotalDes > 0.0) {
    4882            2 :                     RatedCapCoolTotalUser = varSpeedCoil.RatedCapCoolTotal;
    4883            6 :                     BaseSizer::reportSizerOutput(state,
    4884            4 :                                                  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            2 :                     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           33 :             state.dataRptCoilSelection->coilSelectionReportObj->setCoilEntAirTemp(
    4909           33 :                 state, varSpeedCoil.Name, varSpeedCoil.VarSpeedCoilType, MixTemp, state.dataSize->CurSysNum, state.dataSize->CurZoneEqNum);
    4910           33 :             state.dataRptCoilSelection->coilSelectionReportObj->setCoilEntAirHumRat(
    4911           33 :                 state, varSpeedCoil.Name, varSpeedCoil.VarSpeedCoilType, MixHumRat);
    4912           33 :             state.dataRptCoilSelection->coilSelectionReportObj->setCoilLvgAirTemp(state, varSpeedCoil.Name, varSpeedCoil.VarSpeedCoilType, SupTemp);
    4913           33 :             state.dataRptCoilSelection->coilSelectionReportObj->setCoilLvgAirHumRat(
    4914           33 :                 state, varSpeedCoil.Name, varSpeedCoil.VarSpeedCoilType, SupHumRat);
    4915           33 :             state.dataRptCoilSelection->coilSelectionReportObj->setCoilAirFlow(
    4916           33 :                 state, varSpeedCoil.Name, varSpeedCoil.VarSpeedCoilType, varSpeedCoil.RatedAirVolFlowRate, RatedAirFlowAutoSized);
    4917           33 :             state.dataRptCoilSelection->coilSelectionReportObj->setCoilCoolingCapacity(state,
    4918           33 :                                                                                        varSpeedCoil.Name,
    4919           33 :                                                                                        varSpeedCoil.VarSpeedCoilType,
    4920              :                                                                                        RatedCapCoolTotalDes,
    4921              :                                                                                        RatedCapCoolTotalAutoSized,
    4922           33 :                                                                                        state.dataSize->CurSysNum,
    4923           33 :                                                                                        state.dataSize->CurZoneEqNum,
    4924           33 :                                                                                        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           85 :         if (varSpeedCoil.VSCoilType == HVAC::Coil_CoolingWaterToAirHPVSEquationFit ||
    4933           67 :             varSpeedCoil.VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed) {
    4934           42 :             state.dataSize->DXCoolCap = varSpeedCoil.RatedCapCoolTotal;
    4935              :         }
    4936              : 
    4937              :         // size rated heating capacity
    4938           85 :         if (varSpeedCoil.RatedCapHeat == DataSizing::AutoSize && (varSpeedCoil.VSCoilType == HVAC::Coil_HeatingWaterToAirHPVSEquationFit ||
    4939           60 :                                                                   varSpeedCoil.VSCoilType == HVAC::Coil_HeatingAirToAirVariableSpeed)) {
    4940            7 :             RatedCapHeatAutoSized = true;
    4941              :         }
    4942              :         //   simply set heating capacity equal to the cooling capacity
    4943              :         // VarSpeedCoil(DXCoilNum)%RatedCapHeat = DXCoolCap
    4944           85 :         if (varSpeedCoil.VSCoilType == HVAC::Coil_HeatingWaterToAirHPVSEquationFit ||
    4945           67 :             varSpeedCoil.VSCoilType == HVAC::Coil_HeatingAirToAirVariableSpeed) {
    4946           29 :             if (varSpeedCoil.CompanionCoolingCoilNum > 0) {
    4947           24 :                 RatedCapHeatDes = state.dataVariableSpeedCoils->VarSpeedCoil(varSpeedCoil.CompanionCoolingCoilNum).RatedCapCoolTotal;
    4948           24 :                 varSpeedCoil.RatedCapCoolTotal = RatedCapHeatDes; // AVOID BEING ZERO
    4949              :             } else {
    4950            5 :                 RatedCapHeatDes = state.dataSize->DXCoolCap; // previous code, can be risky
    4951              :             }
    4952              :             // END IF
    4953           29 :             if (RatedCapHeatAutoSized) {
    4954            7 :                 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           29 :             if (RatedCapHeatDes < HVAC::SmallLoad) {
    4964            0 :                 RatedCapHeatDes = 0.0;
    4965              :             }
    4966           29 :             state.dataRptCoilSelection->coilSelectionReportObj->setCoilHeatingCapacity(state,
    4967           29 :                                                                                        varSpeedCoil.Name,
    4968           29 :                                                                                        varSpeedCoil.VarSpeedCoilType,
    4969              :                                                                                        RatedCapHeatDes,
    4970              :                                                                                        RatedCapHeatAutoSized,
    4971           29 :                                                                                        state.dataSize->CurSysNum,
    4972           29 :                                                                                        state.dataSize->CurZoneEqNum,
    4973           29 :                                                                                        state.dataSize->CurOASysNum,
    4974              :                                                                                        0.0,
    4975              :                                                                                        1.0,
    4976              :                                                                                        -999.0,
    4977              :                                                                                        -999.0);
    4978              :         }
    4979           85 :         if (RatedCapHeatAutoSized) {
    4980            7 :             varSpeedCoil.RatedCapHeat = RatedCapHeatDes;
    4981           21 :             BaseSizer::reportSizerOutput(state,
    4982           14 :                                          format("COIL:{}{}", varSpeedCoil.CoolHeatType, CurrentObjSubfix),
    4983              :                                          varSpeedCoil.Name,
    4984              :                                          "Design Size Nominal Heating Capacity [W]",
    4985              :                                          RatedCapHeatDes);
    4986           14 :             OutputReportPredefined::PreDefTableEntry(
    4987            7 :                 state, state.dataOutRptPredefined->pdchHeatCoilNomCap, varSpeedCoil.Name, varSpeedCoil.RatedCapHeat);
    4988            7 :             if (varSpeedCoil.RatedCapHeat != 0.0) {
    4989           14 :                 OutputReportPredefined::PreDefTableEntry(
    4990            7 :                     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           14 :             OutputReportPredefined::addFootNoteSubTable(
    4995              :                 state,
    4996            7 :                 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           78 :             if (varSpeedCoil.RatedCapHeat > 0.0 && RatedCapHeatDes > 0.0) {
    5000           22 :                 RatedCapHeatUser = varSpeedCoil.RatedCapHeat;
    5001           66 :                 BaseSizer::reportSizerOutput(state,
    5002           44 :                                              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           22 :                 if (state.dataGlobal->DisplayExtraWarnings) {
    5009            4 :                     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           85 :         if (!HardSizeNoDesRunAirFlow) {
    5025           34 :             if ((RatedCapCoolTotalAutoSized) && (RatedAirFlowAutoSized)) {
    5026           18 :                 RatedAirVolFlowRateDes = varSpeedCoil.RatedCapCoolTotal * varSpeedCoil.MSRatedAirVolFlowPerRatedTotCap(NormSpeed);
    5027           16 :             } else if ((RatedCapHeatAutoSized) && (RatedAirFlowAutoSized)) {
    5028            7 :                 RatedAirVolFlowRateDes = varSpeedCoil.RatedCapHeat * varSpeedCoil.MSRatedAirVolFlowPerRatedTotCap(NormSpeed);
    5029              :             }
    5030              : 
    5031              :             // write the air flow sizing output
    5032           34 :             if (RatedAirFlowAutoSized) {
    5033           25 :                 varSpeedCoil.RatedAirVolFlowRate = RatedAirVolFlowRateDes;
    5034           75 :                 BaseSizer::reportSizerOutput(state,
    5035           50 :                                              format("COIL:{}{}", varSpeedCoil.CoolHeatType, CurrentObjSubfix),
    5036              :                                              varSpeedCoil.Name,
    5037              :                                              "Design Size Rated Air Flow Rate [m3/s]",
    5038              :                                              RatedAirVolFlowRateDes);
    5039              :             } else {
    5040            9 :                 if (varSpeedCoil.RatedAirVolFlowRate > 0.0 && RatedAirVolFlowRateDes > 0.0) {
    5041            5 :                     RatedAirVolFlowRateUser = varSpeedCoil.RatedAirVolFlowRate;
    5042           15 :                     BaseSizer::reportSizerOutput(state,
    5043           10 :                                                  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            5 :                     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           34 :             state.dataRptCoilSelection->coilSelectionReportObj->setCoilAirFlow(
    5066           34 :                 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           85 :         if ((varSpeedCoil.VSCoilType == HVAC::Coil_HeatingWaterToAirHPVSEquationFit ||
    5071           67 :              varSpeedCoil.VSCoilType == HVAC::Coil_HeatingAirToAirVariableSpeed) &&
    5072           29 :             varSpeedCoil.CompanionCoolingCoilNum > 0) {
    5073              : 
    5074           24 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(varSpeedCoil.CompanionCoolingCoilNum).RatedCapCoolTotal > 0.0) {
    5075              : 
    5076           24 :                 if (std::abs(state.dataVariableSpeedCoils->VarSpeedCoil(varSpeedCoil.CompanionCoolingCoilNum).RatedCapCoolTotal -
    5077           24 :                              varSpeedCoil.RatedCapHeat) /
    5078           24 :                         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           85 :         switch (varSpeedCoil.VSCoilType) {
    5098           42 :         case HVAC::Coil_CoolingWaterToAirHPVSEquationFit:
    5099              :         case HVAC::Coil_CoolingAirToAirVariableSpeed: {
    5100           42 :             varSpeedCoil.MSRatedTotCap(UpperSpeed) = varSpeedCoil.RatedCapCoolTotal / varSpeedCoil.MSRatedPercentTotCap(NormSpeed);
    5101           42 :         } break;
    5102           29 :         case HVAC::Coil_HeatingWaterToAirHPVSEquationFit:
    5103              :         case HVAC::Coil_HeatingAirToAirVariableSpeed: {
    5104           29 :             varSpeedCoil.MSRatedTotCap(UpperSpeed) = varSpeedCoil.RatedCapHeat / varSpeedCoil.MSRatedPercentTotCap(NormSpeed);
    5105           29 :         } break;
    5106           14 :         case HVAC::CoilDX_HeatPumpWaterHeaterVariableSpeed: {
    5107           14 :             varSpeedCoil.MSRatedTotCap(UpperSpeed) = varSpeedCoil.RatedCapWH / varSpeedCoil.MSRatedPercentTotCap(NormSpeed);
    5108           14 :         } break;
    5109              :         }
    5110              : 
    5111           85 :         if (varSpeedCoil.VSCoilType == HVAC::CoilDX_HeatPumpWaterHeaterVariableSpeed) {
    5112           14 :             HPInletAirHumRat = Psychrometrics::PsyWFnTdbTwbPb(
    5113           14 :                 state, varSpeedCoil.WHRatedInletDBTemp, varSpeedCoil.WHRatedInletWBTemp, state.dataEnvrn->StdBaroPress, RoutineName);
    5114              : 
    5115          154 :             for (Mode = varSpeedCoil.NumOfSpeeds; Mode >= 1; --Mode) {
    5116          140 :                 varSpeedCoil.MSRatedTotCap(Mode) = varSpeedCoil.MSRatedTotCap(UpperSpeed) * varSpeedCoil.MSRatedPercentTotCap(Mode);
    5117          140 :                 varSpeedCoil.MSRatedAirVolFlowRate(Mode) = varSpeedCoil.MSRatedTotCap(Mode) * varSpeedCoil.MSRatedAirVolFlowPerRatedTotCap(Mode);
    5118          140 :                 varSpeedCoil.MSRatedAirMassFlowRate(Mode) = varSpeedCoil.MSRatedAirVolFlowRate(Mode) * rhoair;
    5119              :                 // EVAPORATIVE PRECOOLING CONDENSER AIR FLOW RATE
    5120          140 :                 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           71 :             if (varSpeedCoil.MSHPDesignSpecIndex > -1 && state.dataUnitarySystems->designSpecMSHP.size() > 0) {
    5126            1 :                 if (varSpeedCoil.VSCoilType == HVAC::Coil_CoolingWaterToAirHPVSEquationFit ||
    5127            1 :                     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            5 :                         for (Mode = varSpeedCoil.NumOfSpeeds; Mode >= 1; --Mode) {
    5137            8 :                             varSpeedCoil.MSRatedAirVolFlowRate(Mode) =
    5138            4 :                                 varSpeedCoil.RatedAirVolFlowRate *
    5139            4 :                                 state.dataUnitarySystems->designSpecMSHP[varSpeedCoil.MSHPDesignSpecIndex].coolingVolFlowRatio[Mode - 1];
    5140            8 :                             varSpeedCoil.MSRatedTotCap(Mode) =
    5141            4 :                                 varSpeedCoil.MSRatedAirVolFlowRate(Mode) / varSpeedCoil.MSRatedAirVolFlowPerRatedTotCap(Mode);
    5142            4 :                             varSpeedCoil.MSRatedAirMassFlowRate(Mode) = varSpeedCoil.MSRatedAirVolFlowRate(Mode) * rhoair;
    5143              :                             // EVAPORATIVE PRECOOLING CONDENSER AIR FLOW RATE
    5144            4 :                             varSpeedCoil.EvapCondAirFlow(Mode) =
    5145            4 :                                 varSpeedCoil.MSRatedTotCap(Mode) * varSpeedCoil.MSRatedEvapCondVolFlowPerRatedTotCap(Mode);
    5146              :                         }
    5147              :                     }
    5148            0 :                 } else if (varSpeedCoil.VSCoilType == HVAC::Coil_HeatingWaterToAirHPVSEquationFit ||
    5149            0 :                            varSpeedCoil.VSCoilType == HVAC::Coil_HeatingAirToAirVariableSpeed) {
    5150            0 :                     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            0 :                         for (Mode = varSpeedCoil.NumOfSpeeds; Mode >= 1; --Mode) {
    5159            0 :                             varSpeedCoil.MSRatedAirVolFlowRate(Mode) =
    5160            0 :                                 varSpeedCoil.RatedAirVolFlowRate *
    5161            0 :                                 state.dataUnitarySystems->designSpecMSHP[varSpeedCoil.MSHPDesignSpecIndex].heatingVolFlowRatio[Mode - 1];
    5162            0 :                             varSpeedCoil.MSRatedTotCap(Mode) =
    5163            0 :                                 varSpeedCoil.MSRatedAirVolFlowRate(Mode) / varSpeedCoil.MSRatedAirVolFlowPerRatedTotCap(Mode);
    5164            0 :                             varSpeedCoil.MSRatedAirMassFlowRate(Mode) = varSpeedCoil.MSRatedAirVolFlowRate(Mode) * rhoair;
    5165              :                             // EVAPORATIVE PRECOOLING CONDENSER AIR FLOW RATE
    5166            0 :                             varSpeedCoil.EvapCondAirFlow(Mode) =
    5167            0 :                                 varSpeedCoil.MSRatedTotCap(Mode) * varSpeedCoil.MSRatedEvapCondVolFlowPerRatedTotCap(Mode);
    5168              :                         }
    5169              :                     }
    5170              :                 }
    5171              :             } else {
    5172          706 :                 for (Mode = varSpeedCoil.NumOfSpeeds; Mode >= 1; --Mode) {
    5173          636 :                     varSpeedCoil.MSRatedTotCap(Mode) = varSpeedCoil.MSRatedTotCap(UpperSpeed) * varSpeedCoil.MSRatedPercentTotCap(Mode);
    5174          636 :                     varSpeedCoil.MSRatedAirVolFlowRate(Mode) = varSpeedCoil.MSRatedTotCap(Mode) * varSpeedCoil.MSRatedAirVolFlowPerRatedTotCap(Mode);
    5175          636 :                     varSpeedCoil.MSRatedAirMassFlowRate(Mode) = varSpeedCoil.MSRatedAirVolFlowRate(Mode) * rhoair;
    5176              :                     // EVAPORATIVE PRECOOLING CONDENSER AIR FLOW RATE
    5177          636 :                     varSpeedCoil.EvapCondAirFlow(Mode) = varSpeedCoil.MSRatedTotCap(Mode) * varSpeedCoil.MSRatedEvapCondVolFlowPerRatedTotCap(Mode);
    5178              :                 }
    5179              :             }
    5180              :         }
    5181              : 
    5182              :         // size rated power
    5183           85 :         switch (varSpeedCoil.VSCoilType) {
    5184           42 :         case HVAC::Coil_CoolingWaterToAirHPVSEquationFit:
    5185              :         case HVAC::Coil_CoolingAirToAirVariableSpeed: {
    5186           42 :             varSpeedCoil.RatedCOPCool = varSpeedCoil.MSRatedCOP(varSpeedCoil.NormSpedLevel);
    5187           42 :             varSpeedCoil.RatedPowerCool = varSpeedCoil.RatedCapCoolTotal / varSpeedCoil.RatedCOPCool;
    5188           42 :         } break;
    5189           29 :         case HVAC::Coil_HeatingWaterToAirHPVSEquationFit:
    5190              :         case HVAC::Coil_HeatingAirToAirVariableSpeed: {
    5191           29 :             varSpeedCoil.RatedCOPHeat = varSpeedCoil.MSRatedCOP(varSpeedCoil.NormSpedLevel);
    5192           29 :             varSpeedCoil.RatedPowerHeat = varSpeedCoil.RatedCapHeat / varSpeedCoil.RatedCOPHeat;
    5193           29 :             varSpeedCoil.RatedCapCoolTotal = varSpeedCoil.RatedCapHeat;
    5194           29 :         } break;
    5195           14 :         case HVAC::CoilDX_HeatPumpWaterHeaterVariableSpeed: {
    5196           14 :             varSpeedCoil.RatedCOPHeat = varSpeedCoil.MSRatedCOP(varSpeedCoil.NormSpedLevel);
    5197           14 :             varSpeedCoil.RatedPowerHeat = varSpeedCoil.RatedCapWH / varSpeedCoil.RatedCOPHeat;
    5198           14 :             varSpeedCoil.RatedCapCoolTotal = varSpeedCoil.RatedCapWH * (1.0 - 1.0 / varSpeedCoil.RatedCOPHeat);
    5199           14 :         } break;
    5200              :         }
    5201              : 
    5202              :         // Size water volumetric flow rate
    5203           85 :         if ((varSpeedCoil.RatedWaterVolFlowRate == DataSizing::AutoSize) &&
    5204           41 :             (varSpeedCoil.VSCoilType == HVAC::Coil_CoolingWaterToAirHPVSEquationFit ||
    5205           38 :              varSpeedCoil.VSCoilType == HVAC::Coil_HeatingWaterToAirHPVSEquationFit)) {
    5206            6 :             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           85 :         if (RatedWaterFlowAutoSized) {
    5212            6 :             if (varSpeedCoil.CondenserType == DataHeatBalance::RefrigCondenserType::Water) {
    5213           12 :                 PltSizNum = PlantUtilities::MyPlantSizingIndex(state,
    5214           12 :                                                                format("COIL:{}{}", varSpeedCoil.CoolHeatType, CurrentObjSubfix),
    5215              :                                                                varSpeedCoil.Name,
    5216              :                                                                varSpeedCoil.WaterInletNodeNum,
    5217              :                                                                varSpeedCoil.WaterOutletNodeNum,
    5218              :                                                                ErrorsFound,
    5219              :                                                                false);
    5220              :             }
    5221              : 
    5222            6 :             if (PltSizNum > 0) {
    5223            6 :                 rho = state.dataPlnt->PlantLoop(varSpeedCoil.plantLoc.loopNum)
    5224            6 :                           .glycol->getDensity(state, state.dataSize->PlantSizData(PltSizNum).ExitTemp, RoutineNameAlt);
    5225            6 :                 cp = state.dataPlnt->PlantLoop(varSpeedCoil.plantLoc.loopNum)
    5226            6 :                          .glycol->getSpecificHeat(state, state.dataSize->PlantSizData(PltSizNum).ExitTemp, RoutineNameAlt);
    5227              : 
    5228            6 :                 if (varSpeedCoil.VSCoilType == HVAC::Coil_HeatingWaterToAirHPVSEquationFit ||
    5229            3 :                     varSpeedCoil.VSCoilType == HVAC::Coil_HeatingAirToAirVariableSpeed) {
    5230              : 
    5231            3 :                     RatedWaterVolFlowRateDes = varSpeedCoil.RatedCapHeat / (state.dataSize->PlantSizData(PltSizNum).DeltaT * cp * rho);
    5232              : 
    5233            3 :                     state.dataRptCoilSelection->coilSelectionReportObj->setCoilLvgWaterTemp(
    5234              :                         state,
    5235            3 :                         varSpeedCoil.Name,
    5236            3 :                         varSpeedCoil.VarSpeedCoilType,
    5237            3 :                         state.dataSize->PlantSizData(PltSizNum).ExitTemp +
    5238            3 :                             state.dataSize->PlantSizData(PltSizNum).DeltaT); // TRACE 3D Plus coil selection report
    5239              : 
    5240            3 :                 } 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            3 :                     if (varSpeedCoil.CompanionCoolingCoilNum > 0) {
    5245            0 :                         SystemCapacity = state.dataVariableSpeedCoils->VarSpeedCoil(varSpeedCoil.CompanionCoolingCoilNum).RatedCapHeat;
    5246              :                     } else {
    5247            3 :                         SystemCapacity = varSpeedCoil.RatedCapCoolTotal;
    5248              :                     }
    5249              : 
    5250            3 :                     RatedWaterVolFlowRateDes = SystemCapacity / (state.dataSize->PlantSizData(PltSizNum).DeltaT * cp * rho);
    5251              : 
    5252            3 :                     state.dataRptCoilSelection->coilSelectionReportObj->setCoilLvgWaterTemp(
    5253              :                         state,
    5254            3 :                         varSpeedCoil.Name,
    5255            3 :                         varSpeedCoil.VarSpeedCoilType,
    5256            3 :                         state.dataSize->PlantSizData(PltSizNum).ExitTemp -
    5257            3 :                             state.dataSize->PlantSizData(PltSizNum).DeltaT); // TRACE 3D Plus coil selection report
    5258              :                 }
    5259              : 
    5260            6 :                 state.dataRptCoilSelection->coilSelectionReportObj->setCoilEntWaterTemp(
    5261              :                     state,
    5262            6 :                     varSpeedCoil.Name,
    5263            6 :                     varSpeedCoil.VarSpeedCoilType,
    5264            6 :                     state.dataSize->PlantSizData(PltSizNum).ExitTemp); // TRACE 3D Plus coil selection report
    5265              : 
    5266            6 :                 state.dataRptCoilSelection->coilSelectionReportObj->setCoilWaterDeltaT(
    5267              :                     state,
    5268            6 :                     varSpeedCoil.Name,
    5269            6 :                     varSpeedCoil.VarSpeedCoilType,
    5270            6 :                     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            6 :             if (RatedCapCoolTotalAutoSized) {
    5281            3 :                 RatedWaterVolFlowRateDes = varSpeedCoil.RatedCapCoolTotal * varSpeedCoil.MSRatedWaterVolFlowPerRatedTotCap(NormSpeed);
    5282            3 :             } else if (RatedCapHeatAutoSized) {
    5283            3 :                 RatedWaterVolFlowRateDes = varSpeedCoil.RatedCapHeat * varSpeedCoil.MSRatedWaterVolFlowPerRatedTotCap(NormSpeed);
    5284              :             }
    5285            6 :             state.dataRptCoilSelection->coilSelectionReportObj->setCoilWaterFlowNodeNums(state,
    5286            6 :                                                                                          varSpeedCoil.Name,
    5287            6 :                                                                                          varSpeedCoil.VarSpeedCoilType,
    5288              :                                                                                          RatedWaterVolFlowRateDes,
    5289              :                                                                                          RatedWaterFlowAutoSized,
    5290              :                                                                                          varSpeedCoil.WaterInletNodeNum,
    5291              :                                                                                          varSpeedCoil.WaterOutletNodeNum,
    5292              :                                                                                          varSpeedCoil.plantLoc.loopNum);
    5293            6 :             varSpeedCoil.RatedWaterVolFlowRate = RatedWaterVolFlowRateDes;
    5294           18 :             BaseSizer::reportSizerOutput(state,
    5295           12 :                                          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           60 :             for (Mode = 1; Mode <= varSpeedCoil.NumOfSpeeds - 1; ++Mode) {
    5302           54 :                 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           79 :             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           85 :         if (varSpeedCoil.RatedWaterVolFlowRate > 0.0 && varSpeedCoil.VSCoilType == HVAC::CoilDX_HeatPumpWaterHeaterVariableSpeed) {
    5344           14 :             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           71 :         else if (varSpeedCoil.RatedWaterVolFlowRate > 0.0) {
    5348           36 :             PlantUtilities::RegisterPlantCompDesignFlow(state, varSpeedCoil.WaterInletNodeNum, 0.5 * varSpeedCoil.RatedWaterVolFlowRate);
    5349              :         }
    5350              : 
    5351           85 :         RatedSourceTempCool = GetVSCoilRatedSourceTemp(state, DXCoilNum);
    5352           85 :         if (varSpeedCoil.VSCoilType == HVAC::Coil_CoolingWaterToAirHPVSEquationFit ||
    5353           67 :             varSpeedCoil.VSCoilType == HVAC::Coil_HeatingWaterToAirHPVSEquationFit) {
    5354              : 
    5355           36 :             if (PltSizNum > 0) {
    5356            6 :                 rhoW = rho;
    5357              :             } else {
    5358           30 :                 rhoW = state.dataPlnt->PlantLoop(varSpeedCoil.plantLoc.loopNum).glycol->getDensity(state, RatedSourceTempCool, RoutineName);
    5359              :             }
    5360              : 
    5361           36 :             varSpeedCoil.RatedWaterMassFlowRate = varSpeedCoil.RatedWaterVolFlowRate * rhoW;
    5362          396 :             for (Mode = varSpeedCoil.NumOfSpeeds; Mode >= 1; --Mode) {
    5363          360 :                 varSpeedCoil.MSRatedWaterVolFlowRate(Mode) = varSpeedCoil.MSRatedTotCap(Mode) * varSpeedCoil.MSRatedWaterVolFlowPerRatedTotCap(Mode);
    5364          360 :                 varSpeedCoil.MSRatedWaterMassFlowRate(Mode) = varSpeedCoil.MSRatedWaterVolFlowRate(Mode) * rhoW;
    5365              :             }
    5366           49 :         } else if (varSpeedCoil.VSCoilType == HVAC::CoilDX_HeatPumpWaterHeaterVariableSpeed) {
    5367           14 :             rhoW = Psychrometrics::RhoH2O(RatedSourceTempCool);
    5368           14 :             varSpeedCoil.RatedWaterMassFlowRate = varSpeedCoil.RatedWaterVolFlowRate * rhoW;
    5369          154 :             for (Mode = varSpeedCoil.NumOfSpeeds; Mode >= 1; --Mode) {
    5370          140 :                 varSpeedCoil.MSRatedWaterVolFlowRate(Mode) = varSpeedCoil.MSRatedTotCap(Mode) * varSpeedCoil.MSRatedWaterVolFlowPerRatedTotCap(Mode);
    5371          140 :                 varSpeedCoil.MSWHPumpPower(Mode) = varSpeedCoil.MSRatedTotCap(Mode) * varSpeedCoil.MSWHPumpPowerPerRatedTotCap(Mode);
    5372          140 :                 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          780 :         for (Mode = 1; Mode <= varSpeedCoil.NumOfSpeeds - 1; ++Mode) {
    5379          695 :             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          780 :         for (Mode = 1; Mode <= varSpeedCoil.NumOfSpeeds - 1; ++Mode) {
    5395          695 :             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           85 :         if (varSpeedCoil.VSCoilType == HVAC::Coil_CoolingWaterToAirHPVSEquationFit ||
    5410           67 :             varSpeedCoil.VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed) {
    5411          402 :             for (Mode = 1; Mode <= varSpeedCoil.NumOfSpeeds; ++Mode) {
    5412          360 :                 varSpeedCoil.MSRatedCBF(Mode) = DXCoils::CalcCBF(state,
    5413          360 :                                                                  varSpeedCoil.VarSpeedCoilType,
    5414          360 :                                                                  varSpeedCoil.Name,
    5415              :                                                                  RatedInletAirTemp,
    5416              :                                                                  RatedInletAirHumRat,
    5417          360 :                                                                  varSpeedCoil.MSRatedTotCap(Mode),
    5418          360 :                                                                  varSpeedCoil.MSRatedAirVolFlowRate(Mode),
    5419          360 :                                                                  varSpeedCoil.MSRatedSHR(Mode),
    5420              :                                                                  true);
    5421          360 :                 if (varSpeedCoil.MSRatedCBF(Mode) > 0.0) {
    5422          360 :                     varSpeedCoil.MSEffectiveAo(Mode) = -std::log(varSpeedCoil.MSRatedCBF(Mode)) * varSpeedCoil.MSRatedAirMassFlowRate(Mode);
    5423              :                 } else {
    5424            0 :                     varSpeedCoil.MSEffectiveAo(Mode) = 0.0;
    5425              :                 }
    5426              :             }
    5427           43 :         } else if (varSpeedCoil.VSCoilType == HVAC::CoilDX_HeatPumpWaterHeaterVariableSpeed) {
    5428           14 :             state.dataHVACGlobal->HPWHInletDBTemp = varSpeedCoil.WHRatedInletDBTemp;
    5429           14 :             state.dataHVACGlobal->HPWHInletWBTemp = varSpeedCoil.WHRatedInletWBTemp;
    5430              : 
    5431          154 :             for (Mode = 1; Mode <= varSpeedCoil.NumOfSpeeds; ++Mode) {
    5432          140 :                 varSpeedCoil.MSRatedAirMassFlowRate(Mode) = varSpeedCoil.MSRatedAirVolFlowRate(Mode) * rhoair;
    5433              :             }
    5434              : 
    5435          154 :             for (Mode = 1; Mode <= varSpeedCoil.NumOfSpeeds; ++Mode) {
    5436              :                 // get cooling capacity, without fan power, i.e. total coil cooling
    5437          140 :                 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          140 :                     HPWHCoolCapacity = varSpeedCoil.MSRatedTotCap(Mode) * (1.0 - 1.0 / varSpeedCoil.MSRatedCOP(Mode)) -
    5442          140 :                                        varSpeedCoil.MSWHPumpPower(Mode) * varSpeedCoil.HPWHCondPumpFracToWater;
    5443              :                 }
    5444              : 
    5445          140 :                 varSpeedCoil.MSRatedCBF(Mode) = DXCoils::CalcCBF(state,
    5446          140 :                                                                  varSpeedCoil.VarSpeedCoilType,
    5447          140 :                                                                  varSpeedCoil.Name,
    5448          140 :                                                                  state.dataHVACGlobal->HPWHInletDBTemp,
    5449              :                                                                  HPInletAirHumRat,
    5450              :                                                                  HPWHCoolCapacity,
    5451          140 :                                                                  varSpeedCoil.MSRatedAirVolFlowRate(Mode),
    5452          140 :                                                                  varSpeedCoil.MSRatedSHR(Mode),
    5453              :                                                                  true);
    5454          140 :                 if (varSpeedCoil.MSRatedCBF(Mode) > 0.0) {
    5455          140 :                     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           14 :             Mode = varSpeedCoil.NormSpedLevel;
    5463           14 :             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           14 :                 varSpeedCoil.RatedCapCoolTotal = varSpeedCoil.MSRatedTotCap(Mode) * (1.0 - 1.0 / varSpeedCoil.MSRatedCOP(Mode)) -
    5469           14 :                                                  varSpeedCoil.MSWHPumpPower(Mode) * varSpeedCoil.HPWHCondPumpFracToWater;
    5470              :             }
    5471              :         }
    5472              : 
    5473              :         // size rated sensible cooling capacity
    5474           85 :         RatedCapCoolSensAutoSized = true; // always do that
    5475              : 
    5476           85 :         if (varSpeedCoil.RatedAirVolFlowRate >= HVAC::SmallAirVolFlow && (varSpeedCoil.VSCoilType == HVAC::Coil_CoolingWaterToAirHPVSEquationFit ||
    5477           67 :                                                                           varSpeedCoil.VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed)) {
    5478           42 :             RatedAirMassFlowRate =
    5479           42 :                 varSpeedCoil.RatedAirVolFlowRate *
    5480           42 :                 Psychrometrics::PsyRhoAirFnPbTdbW(state, state.dataEnvrn->StdBaroPress, RatedInletAirTemp, RatedInletAirHumRat, RoutineName);
    5481           42 :             RatedInletEnth = Psychrometrics::PsyHFnTdbW(RatedInletAirTemp, RatedInletAirHumRat);
    5482           42 :             CBFRated = DXCoils::AdjustCBF(varSpeedCoil.MSRatedCBF(NormSpeed), varSpeedCoil.MSRatedAirMassFlowRate(NormSpeed), RatedAirMassFlowRate);
    5483           42 :             if (CBFRated > 0.999) {
    5484            0 :                 CBFRated = 0.999;
    5485              :             }
    5486           42 :             if (varSpeedCoil.MSRatedAirMassFlowRate(NormSpeed) > 1.0e-10) {
    5487           42 :                 AirMassFlowRatio = RatedAirMassFlowRate / varSpeedCoil.MSRatedAirMassFlowRate(NormSpeed);
    5488              :             } else {
    5489            0 :                 AirMassFlowRatio = 1.0;
    5490              :             }
    5491              : 
    5492           42 :             if (varSpeedCoil.MSRatedWaterVolFlowRate(NormSpeed) > 1.0e-10) {
    5493           18 :                 WaterMassFlowRatio = varSpeedCoil.RatedWaterVolFlowRate / varSpeedCoil.MSRatedWaterVolFlowRate(NormSpeed);
    5494              :             } else {
    5495           24 :                 WaterMassFlowRatio = 1.0;
    5496              :             }
    5497              : 
    5498           42 :             Real64 TempInletWetBulb = RatedInletWetBulbTemp;
    5499          210 :             CalcTotCapSHR_VSWSHP(state,
    5500              :                                  RatedInletAirTemp,
    5501              :                                  RatedInletAirHumRat,
    5502              :                                  RatedInletEnth,
    5503              :                                  TempInletWetBulb,
    5504              :                                  AirMassFlowRatio,
    5505              :                                  WaterMassFlowRatio,
    5506              :                                  RatedAirMassFlowRate,
    5507              :                                  CBFRated,
    5508           42 :                                  varSpeedCoil.MSRatedTotCap(NormSpeed),
    5509           42 :                                  varSpeedCoil.MSCCapFTemp(NormSpeed),
    5510           42 :                                  varSpeedCoil.MSCCapAirFFlow(NormSpeed),
    5511           42 :                                  varSpeedCoil.MSCCapWaterFFlow(NormSpeed),
    5512              :                                  0.0,
    5513              :                                  0,
    5514              :                                  0,
    5515              :                                  0,
    5516              :                                  QLoadTotal1,
    5517              :                                  QLoadTotal2,
    5518              :                                  QLoadTotal,
    5519              :                                  SHR,
    5520              :                                  RatedSourceTempCool,
    5521           42 :                                  state.dataEnvrn->StdBaroPress,
    5522              :                                  0.0,
    5523              :                                  1,
    5524           42 :                                  varSpeedCoil.capModFacTotal);
    5525              : 
    5526           42 :             RatedCapCoolSensDes = varSpeedCoil.RatedCapCoolTotal * SHR;
    5527           85 :         } else if (varSpeedCoil.RatedAirVolFlowRate >= HVAC::SmallAirVolFlow &&
    5528           43 :                    varSpeedCoil.VSCoilType == HVAC::CoilDX_HeatPumpWaterHeaterVariableSpeed) {
    5529           14 :             SHR = varSpeedCoil.MSRatedSHR(NormSpeed);
    5530           14 :             RatedCapCoolSensDes = varSpeedCoil.RatedCapCoolTotal * SHR;
    5531              :         } else {
    5532           29 :             RatedCapCoolSensDes = 0.0;
    5533              :         }
    5534              : 
    5535           85 :         if (RatedCapCoolSensDes < HVAC::SmallLoad) {
    5536           29 :             RatedCapCoolSensDes = 0.0;
    5537              :         }
    5538              : 
    5539           85 :         if (varSpeedCoil.VSCoilType == HVAC::Coil_CoolingWaterToAirHPVSEquationFit ||
    5540           67 :             varSpeedCoil.VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed) { // always report for cooling mode
    5541           42 :             if (RatedCapCoolTotalAutoSized) {
    5542           18 :                 varSpeedCoil.RatedCapCoolSens = RatedCapCoolSensDes;
    5543           54 :                 BaseSizer::reportSizerOutput(state,
    5544           36 :                                              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           24 :                 if (RatedCapCoolSensDes > 0.0) {
    5552           24 :                     varSpeedCoil.RatedCapCoolSens = RatedCapCoolSensDes;
    5553           72 :                     BaseSizer::reportSizerOutput(state,
    5554           48 :                                                  format("COIL:{}{}", varSpeedCoil.CoolHeatType, CurrentObjSubfix),
    5555              :                                                  varSpeedCoil.Name,
    5556              :                                                  "Design Size Rated Sensible Cooling Capacity [W]",
    5557              :                                                  RatedCapCoolSensDes); //, &
    5558              :                 }
    5559              :             }
    5560           84 :             OutputReportPredefined::PreDefTableEntry(
    5561           42 :                 state, state.dataOutRptPredefined->pdchCoolCoilTotCap, varSpeedCoil.Name, varSpeedCoil.RatedCapCoolTotal);
    5562           84 :             OutputReportPredefined::PreDefTableEntry(
    5563           42 :                 state, state.dataOutRptPredefined->pdchCoolCoilSensCap, varSpeedCoil.Name, varSpeedCoil.RatedCapCoolSens);
    5564           84 :             OutputReportPredefined::PreDefTableEntry(state,
    5565           42 :                                                      state.dataOutRptPredefined->pdchCoolCoilLatCap,
    5566              :                                                      varSpeedCoil.Name,
    5567           42 :                                                      varSpeedCoil.RatedCapCoolTotal - varSpeedCoil.RatedCapCoolSens);
    5568           42 :             if (varSpeedCoil.RatedCapCoolTotal != 0.0) {
    5569           84 :                 OutputReportPredefined::PreDefTableEntry(state,
    5570           42 :                                                          state.dataOutRptPredefined->pdchCoolCoilSHR,
    5571              :                                                          varSpeedCoil.Name,
    5572           42 :                                                          varSpeedCoil.RatedCapCoolSens / varSpeedCoil.RatedCapCoolTotal);
    5573              :             } else {
    5574            0 :                 OutputReportPredefined::PreDefTableEntry(state, state.dataOutRptPredefined->pdchCoolCoilSHR, varSpeedCoil.Name, 0.0);
    5575              :             }
    5576           84 :             OutputReportPredefined::PreDefTableEntry(
    5577           42 :                 state, state.dataOutRptPredefined->pdchCoolCoilNomEff, varSpeedCoil.Name, varSpeedCoil.MSRatedCOP(varSpeedCoil.NormSpedLevel));
    5578           84 :             OutputReportPredefined::addFootNoteSubTable(
    5579              :                 state,
    5580           42 :                 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           85 :         IsAutoSize = false;
    5586           85 :         if (varSpeedCoil.VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed) {
    5587           24 :             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           24 :             EvapCondPumpElecNomPowerDes = varSpeedCoil.RatedCapCoolTotal * 0.004266;
    5592           24 :             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           24 :                 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           85 :         IsAutoSize = false;
    5636           85 :         if (varSpeedCoil.VSCoilType == HVAC::Coil_HeatingAirToAirVariableSpeed) {
    5637           11 :             if (varSpeedCoil.DefrostCapacity == DataSizing::AutoSize) {
    5638            2 :                 IsAutoSize = true;
    5639              :             }
    5640           11 :             if (varSpeedCoil.DefrostStrategy == Resistive) {
    5641           11 :                 DefrostCapacityDes = varSpeedCoil.RatedCapHeat;
    5642              :             } else {
    5643            0 :                 DefrostCapacityDes = 0.0;
    5644              :             }
    5645           11 :             if (IsAutoSize) {
    5646            2 :                 varSpeedCoil.DefrostCapacity = DefrostCapacityDes;
    5647            2 :                 BaseSizer::reportSizerOutput(
    5648              :                     state, "AS VS HEATING COIL", varSpeedCoil.Name, "Design Size Resistive Defrost Heater Capacity [W]", DefrostCapacityDes);
    5649              :             } else {
    5650            9 :                 if (varSpeedCoil.DefrostCapacity > 0.0 && DefrostCapacityDes > 0.0 && !HardSizeNoDesRun) {
    5651            3 :                     DefrostCapacityUser = varSpeedCoil.DefrostCapacity;
    5652            3 :                     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            3 :                     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           85 :         if (RatedCapCoolSensAutoSized && RatedCapCoolTotalAutoSized) {
    5680           18 :             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           67 :         } 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          170 :         Array1D<DataHeatBalance::RefrigCondenserType> CondenserType;
    5728              :         StandardRatings::HPdefrostControl DefrostControl;
    5729           85 :         switch (varSpeedCoil.VSCoilType) {
    5730           24 :         case HVAC::Coil_CoolingAirToAirVariableSpeed:
    5731           24 :             CondenserType.push_back(varSpeedCoil.CondenserType);
    5732           24 :             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           24 :             case 1:
    5738              :             default:
    5739           24 :                 DefrostControl = StandardRatings::HPdefrostControl::Timed;
    5740           24 :                 break;
    5741              :             }
    5742           24 :             if (varSpeedCoil.RatedCapCoolTotal > 0.0) {
    5743          144 :                 StandardRatings::CalcDXCoilStandardRating(state,
    5744           24 :                                                           varSpeedCoil.Name,
    5745           24 :                                                           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           24 :                                                           varSpeedCoil.PLFFPLR,
    5755              :                                                           varSpeedCoil.MSRatedAirVolFlowRate,
    5756              :                                                           varSpeedCoil.MSRatedEvaporatorFanPowerPerVolumeFlowRate2017,
    5757              :                                                           varSpeedCoil.MSRatedEvaporatorFanPowerPerVolumeFlowRate2023,
    5758              :                                                           CondenserType,
    5759           48 :                                                           0, // varSpeedCoil.RegionNum, // ??
    5760           24 :                                                           varSpeedCoil.MinOATCompressor,
    5761           24 :                                                           varSpeedCoil.OATempCompressorOn,
    5762           48 :                                                           false, // varSpeedCoil.OATempCompressorOnOffBlank, // ??
    5763              :                                                           DefrostControl,
    5764           48 :                                                           ObjexxFCL::Optional_bool_const(),
    5765           24 :                                                           varSpeedCoil.RatedCapCoolTotal,
    5766           24 :                                                           varSpeedCoil.RatedAirVolFlowRate);
    5767              :             }
    5768           24 :             break;
    5769           61 :         default:
    5770           61 :             break;
    5771              :         }
    5772           85 :     }
    5773              : 
    5774     37952571 :     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     37952571 :         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     37952571 :         Real64 rhoair(0);          // entering air density
    5860              : 
    5861     37952571 :         if (state.dataVariableSpeedCoils->firstTime) {
    5862              :             // Set indoor air conditions to the rated condition
    5863           20 :             state.dataVariableSpeedCoils->LoadSideInletDBTemp_Init = 26.7;
    5864           20 :             state.dataVariableSpeedCoils->LoadSideInletHumRat_Init = 0.0111;
    5865           20 :             state.dataVariableSpeedCoils->LoadSideInletEnth_Init = Psychrometrics::PsyHFnTdbW(state.dataVariableSpeedCoils->LoadSideInletDBTemp_Init,
    5866           20 :                                                                                               state.dataVariableSpeedCoils->LoadSideInletHumRat_Init);
    5867           20 :             state.dataVariableSpeedCoils->CpAir_Init = Psychrometrics::PsyCpAirFnW(state.dataVariableSpeedCoils->LoadSideInletHumRat_Init);
    5868           20 :             state.dataVariableSpeedCoils->firstTime = false;
    5869              :         }
    5870              : 
    5871     75905142 :         state.dataVariableSpeedCoils->LoadSideInletWBTemp_Init =
    5872     37952571 :             Psychrometrics::PsyTwbFnTdbWPb(state,
    5873     37952571 :                                            state.dataVariableSpeedCoils->LoadSideInletDBTemp_Init,
    5874     37952571 :                                            state.dataVariableSpeedCoils->LoadSideInletHumRat_Init,
    5875     37952571 :                                            state.dataEnvrn->OutBaroPress,
    5876              :                                            RoutineName);
    5877              : 
    5878     37952571 :         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     37952571 :         if (SpeedNum > MaxSpeed) {
    5882            0 :             SpeedCal = MaxSpeed;
    5883              :         } else {
    5884     37952571 :             SpeedCal = SpeedNum;
    5885              :         }
    5886              : 
    5887              :         //  LOAD LOCAL VARIABLES FROM DATA STRUCTURE (for code readability)
    5888     37952571 :         if (!(fanOp == HVAC::FanOp::Continuous) && PartLoadRatio > 0.0) {
    5889       372475 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirMassFlowRate =
    5890       372475 :                 state.dataLoopNodes->Node(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirInletNodeNum).MassFlowRate / PartLoadRatio;
    5891              :         }
    5892              : 
    5893     37952571 :         Twet_Rated = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Twet_Rated;
    5894     37952571 :         Gamma_Rated = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Gamma_Rated;
    5895              : 
    5896     37952571 :         state.dataVariableSpeedCoils->LoadSideMassFlowRate = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirMassFlowRate;
    5897              : 
    5898     37952571 :         if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed) {
    5899              :             // Get condenser outdoor node info from DX COOLING Coil
    5900     33430760 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserInletNodeNum != 0) {
    5901        52990 :                 state.dataVariableSpeedCoils->OutdoorDryBulb_CalcVarSpeedCoilCooling =
    5902        26495 :                     state.dataLoopNodes->Node(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserInletNodeNum).Temp;
    5903        52990 :                 state.dataVariableSpeedCoils->OutdoorHumRat_CalcVarSpeedCoilCooling =
    5904        26495 :                     state.dataLoopNodes->Node(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserInletNodeNum).HumRat;
    5905        52990 :                 state.dataVariableSpeedCoils->OutdoorPressure_CalcVarSpeedCoilCooling =
    5906        26495 :                     state.dataLoopNodes->Node(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserInletNodeNum).Press;
    5907        26495 :                 state.dataVariableSpeedCoils->OutdoorWetBulb_CalcVarSpeedCoilCooling =
    5908        26495 :                     state.dataLoopNodes->Node(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserInletNodeNum).OutAirWetBulb;
    5909              :             } else {
    5910     33404265 :                 state.dataVariableSpeedCoils->OutdoorDryBulb_CalcVarSpeedCoilCooling = state.dataEnvrn->OutDryBulbTemp;
    5911     33404265 :                 state.dataVariableSpeedCoils->OutdoorHumRat_CalcVarSpeedCoilCooling = state.dataEnvrn->OutHumRat;
    5912     33404265 :                 state.dataVariableSpeedCoils->OutdoorPressure_CalcVarSpeedCoilCooling = state.dataEnvrn->OutBaroPress;
    5913     33404265 :                 state.dataVariableSpeedCoils->OutdoorWetBulb_CalcVarSpeedCoilCooling = state.dataEnvrn->OutWetBulbTemp;
    5914              :             }
    5915              : 
    5916     66861520 :             RhoSourceAir = Psychrometrics::PsyRhoAirFnPbTdbW(state,
    5917     33430760 :                                                              state.dataVariableSpeedCoils->OutdoorPressure_CalcVarSpeedCoilCooling,
    5918     33430760 :                                                              state.dataVariableSpeedCoils->OutdoorDryBulb_CalcVarSpeedCoilCooling,
    5919     33430760 :                                                              state.dataVariableSpeedCoils->OutdoorHumRat_CalcVarSpeedCoilCooling);
    5920              : 
    5921     33430760 :             if ((SpeedNum == 1) || (SpeedNum > MaxSpeed) || (SpeedRatio == 1.0)) {
    5922     26715771 :                 CondAirMassFlow = RhoSourceAir * state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapCondAirFlow(SpeedCal);
    5923              :             } else {
    5924      6714989 :                 CondAirMassFlow =
    5925      6714989 :                     RhoSourceAir * (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapCondAirFlow(SpeedCal) * SpeedRatio +
    5926      6714989 :                                     (1.0 - SpeedRatio) * state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapCondAirFlow(SpeedCal - 1));
    5927              :             }
    5928              : 
    5929              :             // AIR COOL OR EVAP COOLED CONDENSER
    5930     33430760 :             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     33430760 :                 CondInletTemp = state.dataVariableSpeedCoils->OutdoorDryBulb_CalcVarSpeedCoilCooling; // Outdoor dry-bulb temp
    5949     66861520 :                 state.dataVariableSpeedCoils->CompAmbTemp_CalcVarSpeedCoilCooling =
    5950     33430760 :                     state.dataVariableSpeedCoils->OutdoorDryBulb_CalcVarSpeedCoilCooling;
    5951     33430760 :                 CondInletHumRat = state.dataEnvrn->OutHumRat;
    5952              :             }
    5953              : 
    5954     33430760 :             state.dataVariableSpeedCoils->SourceSideMassFlowRate = CondAirMassFlow;
    5955     33430760 :             state.dataVariableSpeedCoils->SourceSideInletTemp = CondInletTemp;
    5956     33430760 :             state.dataVariableSpeedCoils->SourceSideInletEnth = Psychrometrics::PsyHFnTdbW(CondInletTemp, CondInletHumRat);
    5957     33430760 :             CpSource = Psychrometrics::PsyCpAirFnW(CondInletHumRat);
    5958     33430760 :             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     33430760 :             if (state.dataVariableSpeedCoils->OutdoorDryBulb_CalcVarSpeedCoilCooling <
    5963     33430760 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MaxOATCrankcaseHeater) {
    5964      2741460 :                 state.dataVariableSpeedCoils->CrankcaseHeatingPower_CalcVarSpeedCoilCooling =
    5965      1370730 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterCapacity;
    5966      1370730 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterCapacityCurveIndex > 0) {
    5967       125599 :                     state.dataVariableSpeedCoils->CrankcaseHeatingPower_CalcVarSpeedCoilCooling *=
    5968       125599 :                         Curve::CurveValue(state,
    5969       125599 :                                           state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterCapacityCurveIndex,
    5970       125599 :                                           state.dataEnvrn->OutDryBulbTemp);
    5971              :                 }
    5972              :             } else {
    5973     32060030 :                 state.dataVariableSpeedCoils->CrankcaseHeatingPower_CalcVarSpeedCoilCooling = 0.0;
    5974              :             }
    5975              :         } else {
    5976      4521811 :             state.dataVariableSpeedCoils->SourceSideMassFlowRate = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterMassFlowRate;
    5977      4521811 :             state.dataVariableSpeedCoils->SourceSideInletTemp = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletWaterTemp;
    5978      4521811 :             state.dataVariableSpeedCoils->SourceSideInletEnth = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletWaterEnthalpy;
    5979      4521811 :             CpSource = state.dataPlnt->PlantLoop(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).plantLoc.loopNum)
    5980      4521811 :                            .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     37952571 :         if (state.dataVariableSpeedCoils->SourceSideMassFlowRate <= 0.0 || state.dataVariableSpeedCoils->LoadSideMassFlowRate <= 0.0) {
    5985              : 
    5986      9528426 :             if ((state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed) &&
    5987     16650790 :                 (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondenserType == DataHeatBalance::RefrigCondenserType::Air) &&
    5988      7122364 :                 (state.dataVariableSpeedCoils->LoadSideMassFlowRate > 0.0)) {
    5989              :                 // ALLOW SIMULATION IF AIR-COOLED CONDENSER COIL
    5990       308249 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SimFlag = true;
    5991              :             } else {
    5992      9220177 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SimFlag = false;
    5993      9279042 :                 return;
    5994              :             }
    5995              :         } else {
    5996     28424145 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SimFlag = true;
    5997              :         }
    5998              : 
    5999     28732394 :         if (compressorOp == HVAC::CompressorOp::Off || state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RatedCapCoolTotal <= 0.0) {
    6000        58865 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SimFlag = false;
    6001        58865 :             return;
    6002              :         }
    6003              : 
    6004     55232843 :         if ((state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed) &&
    6005     26559314 :             (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     28673529 :         if ((PartLoadRatio < 1e-10) || (Twet_Rated <= 0.0) || (Gamma_Rated <= 0.0) || (SpeedNum > 1.0)) {
    6014     28656447 :             LatDegradModelSimFlag = false;
    6015              :             // Set NumIteration=1 so that latent model would quit after 1 simulation with the actual condition
    6016     28656447 :             NumIteration = 1;
    6017              :         } else {
    6018        17082 :             LatDegradModelSimFlag = true;
    6019              :             // Set NumIteration=0 so that latent model would simulate twice with rated and actual condition
    6020        17082 :             NumIteration = 0;
    6021              :         }
    6022              : 
    6023              :         // Set indoor air conditions to the actual condition
    6024     28673529 :         LoadSideInletDBTemp_Unit = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirDBTemp;
    6025     28673529 :         LoadSideInletHumRat_Unit = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirHumRat;
    6026              :         LoadSideInletWBTemp_Unit =
    6027     28673529 :             Psychrometrics::PsyTwbFnTdbWPb(state, LoadSideInletDBTemp_Unit, LoadSideInletHumRat_Unit, state.dataEnvrn->OutBaroPress, RoutineName);
    6028     28673529 :         LoadSideInletEnth_Unit = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirEnthalpy;
    6029     28673529 :         CpAir_Unit = Psychrometrics::PsyCpAirFnW(LoadSideInletHumRat_Unit);
    6030              : 
    6031     28673529 :         state.dataHVACGlobal->OnOffFanPartLoadFraction = 1.0;
    6032     28673529 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac = 1.0;
    6033     28673529 :         if ((SpeedNum == 1) && (PartLoadRatio < 1.0)) {
    6034      4074674 :             PLF = Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PLFFPLR, PartLoadRatio);
    6035      4074674 :             if (PLF < 0.7) {
    6036            0 :                 PLF = 0.7;
    6037              :             }
    6038      4074674 :             if (fanOp == HVAC::FanOp::Cycling) {
    6039        59408 :                 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      4074674 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac = PartLoadRatio / PLF;
    6044      4074674 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PartLoadRatio = PartLoadRatio;
    6045              : 
    6046      4074674 :             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      4074674 :             } 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     28690611 :             ++NumIteration;
    6055     28690611 :             if (NumIteration == 1) {
    6056              :                 // Set indoor air conditions to the rated conditions
    6057        17082 :                 state.dataVariableSpeedCoils->LoadSideInletDBTemp = state.dataVariableSpeedCoils->LoadSideInletDBTemp_Init;
    6058        17082 :                 state.dataVariableSpeedCoils->LoadSideInletHumRat = state.dataVariableSpeedCoils->LoadSideInletHumRat_Init;
    6059        17082 :                 state.dataVariableSpeedCoils->LoadSideInletWBTemp = state.dataVariableSpeedCoils->LoadSideInletWBTemp_Init;
    6060        17082 :                 state.dataVariableSpeedCoils->LoadSideInletEnth = state.dataVariableSpeedCoils->LoadSideInletEnth_Init;
    6061        17082 :                 CpAir = state.dataVariableSpeedCoils->CpAir_Init;
    6062              :             } else {
    6063              :                 // Set indoor air conditions to the actual condition
    6064     28673529 :                 state.dataVariableSpeedCoils->LoadSideInletDBTemp = LoadSideInletDBTemp_Unit;
    6065     28673529 :                 state.dataVariableSpeedCoils->LoadSideInletHumRat = LoadSideInletHumRat_Unit;
    6066     28673529 :                 state.dataVariableSpeedCoils->LoadSideInletWBTemp = LoadSideInletWBTemp_Unit;
    6067     28673529 :                 state.dataVariableSpeedCoils->LoadSideInletEnth = LoadSideInletEnth_Unit;
    6068     28673529 :                 CpAir = CpAir_Unit;
    6069              :             }
    6070              : 
    6071              :             // must be placed inside the loop, otherwise cause bug in release mode
    6072     28690611 :             if (SpeedNum > MaxSpeed) {
    6073            0 :                 SpeedCal = MaxSpeed;
    6074              :             } else {
    6075     28690611 :                 SpeedCal = SpeedNum;
    6076              :             }
    6077              : 
    6078     28690611 :             if ((SpeedNum == 1) || (SpeedNum > MaxSpeed) || (SpeedRatio == 1.0)) {
    6079     21633676 :                 AirMassFlowRatio =
    6080     21633676 :                     state.dataVariableSpeedCoils->LoadSideMassFlowRate / state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignAirMassFlowRate;
    6081              : 
    6082     21633676 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed) {
    6083     19861419 :                     WaterMassFlowRatio = 1.0;
    6084              :                 } else {
    6085      1772257 :                     WaterMassFlowRatio = state.dataVariableSpeedCoils->SourceSideMassFlowRate /
    6086      1772257 :                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignWaterMassFlowRate;
    6087              :                 }
    6088              : 
    6089     21633676 :                 CBFSpeed = DXCoils::AdjustCBF(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedCBF(SpeedCal),
    6090     21633676 :                                               state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirMassFlowRate(SpeedCal),
    6091     21633676 :                                               state.dataVariableSpeedCoils->LoadSideMassFlowRate);
    6092              : 
    6093     21633676 :                 if (CBFSpeed > 0.999) {
    6094            0 :                     CBFSpeed = 0.999;
    6095              :                 }
    6096              : 
    6097     21633676 :                 CalcTotCapSHR_VSWSHP(state,
    6098     21633676 :                                      state.dataVariableSpeedCoils->LoadSideInletDBTemp,
    6099     21633676 :                                      state.dataVariableSpeedCoils->LoadSideInletHumRat,
    6100     21633676 :                                      state.dataVariableSpeedCoils->LoadSideInletEnth,
    6101     21633676 :                                      state.dataVariableSpeedCoils->LoadSideInletWBTemp,
    6102              :                                      AirMassFlowRatio,
    6103              :                                      WaterMassFlowRatio,
    6104     21633676 :                                      state.dataVariableSpeedCoils->LoadSideMassFlowRate,
    6105              :                                      CBFSpeed,
    6106     21633676 :                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(SpeedCal),
    6107     21633676 :                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(SpeedCal),
    6108     21633676 :                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(SpeedCal),
    6109     21633676 :                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapWaterFFlow(SpeedCal),
    6110              :                                      0.0,
    6111              :                                      0,
    6112              :                                      0,
    6113              :                                      0,
    6114              :                                      QLoadTotal1,
    6115              :                                      QLoadTotal2,
    6116     21633676 :                                      state.dataVariableSpeedCoils->QLoadTotal,
    6117              :                                      SHR,
    6118     21633676 :                                      state.dataVariableSpeedCoils->SourceSideInletTemp,
    6119     21633676 :                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirPressure,
    6120              :                                      0.0,
    6121              :                                      1,
    6122     21633676 :                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).capModFacTotal);
    6123              : 
    6124     86534704 :                 EIRTempModFac = Curve::CurveValue(state,
    6125     21633676 :                                                   state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(SpeedCal),
    6126     21633676 :                                                   state.dataVariableSpeedCoils->LoadSideInletWBTemp,
    6127     21633676 :                                                   state.dataVariableSpeedCoils->SourceSideInletTemp);
    6128              :                 EIRAirFFModFac =
    6129     21633676 :                     Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(SpeedCal), AirMassFlowRatio);
    6130              : 
    6131     21633676 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed) {
    6132     19861419 :                     EIRWaterFFModFac = 1.0;
    6133              :                 } else {
    6134              :                     EIRWaterFFModFac =
    6135      1772257 :                         Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRWaterFFlow(SpeedCal), WaterMassFlowRatio);
    6136              :                 }
    6137              : 
    6138     21633676 :                 EIR = (1.0 / state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedCOP(SpeedCal)) * EIRTempModFac * EIRAirFFModFac *
    6139              :                       EIRWaterFFModFac;
    6140              : 
    6141     21633676 :                 CBFSpeed = DXCoils::AdjustCBF(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedCBF(SpeedCal),
    6142     21633676 :                                               state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirMassFlowRate(SpeedCal),
    6143     21633676 :                                               state.dataVariableSpeedCoils->LoadSideMassFlowRate);
    6144              : 
    6145     21633676 :                 if (CBFSpeed > 0.999) {
    6146            0 :                     CBFSpeed = 0.999;
    6147              :                 }
    6148              : 
    6149     21633676 :                 CalcTotCapSHR_VSWSHP(state,
    6150     21633676 :                                      state.dataVariableSpeedCoils->LoadSideInletDBTemp,
    6151     21633676 :                                      state.dataVariableSpeedCoils->LoadSideInletHumRat,
    6152     21633676 :                                      state.dataVariableSpeedCoils->LoadSideInletEnth,
    6153     21633676 :                                      state.dataVariableSpeedCoils->LoadSideInletWBTemp,
    6154              :                                      AirMassFlowRatio,
    6155              :                                      WaterMassFlowRatio,
    6156     21633676 :                                      state.dataVariableSpeedCoils->LoadSideMassFlowRate,
    6157              :                                      CBFSpeed,
    6158     21633676 :                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(SpeedCal),
    6159     21633676 :                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(SpeedCal),
    6160     21633676 :                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(SpeedCal),
    6161     21633676 :                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapWaterFFlow(SpeedCal),
    6162              :                                      0.0,
    6163              :                                      0,
    6164              :                                      0,
    6165              :                                      0,
    6166              :                                      QLoadTotal1,
    6167              :                                      QLoadTotal2,
    6168     21633676 :                                      state.dataVariableSpeedCoils->QLoadTotal,
    6169              :                                      SHR,
    6170     21633676 :                                      state.dataVariableSpeedCoils->SourceSideInletTemp,
    6171     21633676 :                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirPressure,
    6172              :                                      0.0,
    6173              :                                      1,
    6174     21633676 :                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).capModFacTotal);
    6175              : 
    6176     21633676 :                 state.dataVariableSpeedCoils->Winput = state.dataVariableSpeedCoils->QLoadTotal * EIR;
    6177              : 
    6178     43267352 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed) {
    6179     19861419 :                     QWasteHeat = 0.0;
    6180              :                 } else {
    6181      1772257 :                     QWasteHeat =
    6182      1772257 :                         state.dataVariableSpeedCoils->Winput * state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWasteHeatFrac(SpeedCal);
    6183      1772257 :                     QWasteHeat *= Curve::CurveValue(state,
    6184      1772257 :                                                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWasteHeat(SpeedCal),
    6185      1772257 :                                                     state.dataVariableSpeedCoils->LoadSideInletWBTemp,
    6186      1772257 :                                                     state.dataVariableSpeedCoils->SourceSideInletTemp);
    6187              :                 }
    6188              :             } else {
    6189      7056935 :                 AirMassFlowRatio =
    6190      7056935 :                     state.dataVariableSpeedCoils->LoadSideMassFlowRate / state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignAirMassFlowRate;
    6191              : 
    6192      7056935 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed) {
    6193      6714977 :                     WaterMassFlowRatio = 1.0;
    6194              :                 } else {
    6195       341958 :                     WaterMassFlowRatio = state.dataVariableSpeedCoils->SourceSideMassFlowRate /
    6196       341958 :                                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignWaterMassFlowRate;
    6197              :                 }
    6198              : 
    6199      7056935 :                 AoEff = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEffectiveAo(SpeedCal) * SpeedRatio +
    6200      7056935 :                         (1.0 - SpeedRatio) * state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEffectiveAo(SpeedCal - 1);
    6201              : 
    6202      7056935 :                 CBFSpeed = std::exp(-AoEff / state.dataVariableSpeedCoils->LoadSideMassFlowRate);
    6203              : 
    6204      7056935 :                 if (CBFSpeed > 0.999) {
    6205            0 :                     CBFSpeed = 0.999;
    6206              :                 }
    6207              : 
    6208      7056935 :                 CalcTotCapSHR_VSWSHP(state,
    6209      7056935 :                                      state.dataVariableSpeedCoils->LoadSideInletDBTemp,
    6210      7056935 :                                      state.dataVariableSpeedCoils->LoadSideInletHumRat,
    6211      7056935 :                                      state.dataVariableSpeedCoils->LoadSideInletEnth,
    6212      7056935 :                                      state.dataVariableSpeedCoils->LoadSideInletWBTemp,
    6213              :                                      AirMassFlowRatio,
    6214              :                                      WaterMassFlowRatio,
    6215      7056935 :                                      state.dataVariableSpeedCoils->LoadSideMassFlowRate,
    6216              :                                      CBFSpeed,
    6217      7056935 :                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(SpeedCal - 1),
    6218      7056935 :                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(SpeedCal - 1),
    6219      7056935 :                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(SpeedCal - 1),
    6220      7056935 :                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapWaterFFlow(SpeedCal - 1),
    6221      7056935 :                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(SpeedCal),
    6222      7056935 :                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(SpeedCal),
    6223      7056935 :                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(SpeedCal),
    6224      7056935 :                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapWaterFFlow(SpeedCal),
    6225              :                                      QLoadTotal1,
    6226              :                                      QLoadTotal2,
    6227      7056935 :                                      state.dataVariableSpeedCoils->QLoadTotal,
    6228              :                                      SHR,
    6229      7056935 :                                      state.dataVariableSpeedCoils->SourceSideInletTemp,
    6230      7056935 :                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirPressure,
    6231              :                                      SpeedRatio,
    6232              :                                      2,
    6233      7056935 :                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).capModFacTotal);
    6234              : 
    6235      7056935 :                 SpeedCal = SpeedNum - 1;
    6236     28227740 :                 EIRTempModFac = Curve::CurveValue(state,
    6237      7056935 :                                                   state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(SpeedCal),
    6238      7056935 :                                                   state.dataVariableSpeedCoils->LoadSideInletWBTemp,
    6239      7056935 :                                                   state.dataVariableSpeedCoils->SourceSideInletTemp);
    6240              :                 EIRAirFFModFac =
    6241      7056935 :                     Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(SpeedCal), AirMassFlowRatio);
    6242              : 
    6243      7056935 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed) {
    6244      6714977 :                     EIRWaterFFModFac = 1.0;
    6245              :                 } else {
    6246              :                     EIRWaterFFModFac =
    6247       341958 :                         Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRWaterFFlow(SpeedCal), WaterMassFlowRatio);
    6248              :                 }
    6249              : 
    6250      7056935 :                 EIR = (1.0 / state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedCOP(SpeedCal)) * EIRTempModFac * EIRAirFFModFac *
    6251              :                       EIRWaterFFModFac;
    6252      7056935 :                 Winput1 = QLoadTotal1 * EIR;
    6253              : 
    6254      7056935 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed) {
    6255      6714977 :                     QWasteHeat1 = 0.0;
    6256              :                 } else {
    6257       341958 :                     QWasteHeat1 = Winput1 * state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWasteHeatFrac(SpeedCal);
    6258       341958 :                     QWasteHeat1 *= Curve::CurveValue(state,
    6259       341958 :                                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWasteHeat(SpeedCal),
    6260       341958 :                                                      state.dataVariableSpeedCoils->LoadSideInletWBTemp,
    6261       341958 :                                                      state.dataVariableSpeedCoils->SourceSideInletTemp);
    6262              :                 }
    6263              : 
    6264      7056935 :                 SpeedCal = SpeedNum;
    6265     28227740 :                 EIRTempModFac = Curve::CurveValue(state,
    6266      7056935 :                                                   state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(SpeedCal),
    6267      7056935 :                                                   state.dataVariableSpeedCoils->LoadSideInletWBTemp,
    6268      7056935 :                                                   state.dataVariableSpeedCoils->SourceSideInletTemp);
    6269              :                 EIRAirFFModFac =
    6270      7056935 :                     Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(SpeedCal), AirMassFlowRatio);
    6271              : 
    6272      7056935 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed) {
    6273      6714977 :                     EIRWaterFFModFac = 1.0;
    6274              :                 } else {
    6275              :                     EIRWaterFFModFac =
    6276       341958 :                         Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRWaterFFlow(SpeedCal), WaterMassFlowRatio);
    6277              :                 }
    6278              : 
    6279      7056935 :                 EIR = (1.0 / state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedCOP(SpeedCal)) * EIRTempModFac * EIRAirFFModFac *
    6280              :                       EIRWaterFFModFac;
    6281      7056935 :                 Winput2 = QLoadTotal2 * EIR;
    6282              : 
    6283      7056935 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed) {
    6284      6714977 :                     QWasteHeat2 = 0.0;
    6285              :                 } else {
    6286       341958 :                     QWasteHeat2 = Winput2 * state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWasteHeatFrac(SpeedCal);
    6287       341958 :                     QWasteHeat2 *= Curve::CurveValue(state,
    6288       341958 :                                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWasteHeat(SpeedCal),
    6289       341958 :                                                      state.dataVariableSpeedCoils->LoadSideInletWBTemp,
    6290       341958 :                                                      state.dataVariableSpeedCoils->SourceSideInletTemp);
    6291              :                 }
    6292              : 
    6293      7056935 :                 state.dataVariableSpeedCoils->Winput = Winput2 * SpeedRatio + (1.0 - SpeedRatio) * Winput1;
    6294      7056935 :                 QWasteHeat = QWasteHeat2 * SpeedRatio + (1.0 - SpeedRatio) * QWasteHeat1;
    6295              :             }
    6296              : 
    6297     28690611 :             state.dataVariableSpeedCoils->QSensible = state.dataVariableSpeedCoils->QLoadTotal * SHR;
    6298              : 
    6299     28690611 :             state.dataVariableSpeedCoils->QSource = state.dataVariableSpeedCoils->QLoadTotal + state.dataVariableSpeedCoils->Winput - QWasteHeat;
    6300              : 
    6301     28690611 :             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     28690611 :             if (state.dataVariableSpeedCoils->QSensible > state.dataVariableSpeedCoils->QLoadTotal) {
    6308            0 :                 state.dataVariableSpeedCoils->QSensible = state.dataVariableSpeedCoils->QLoadTotal;
    6309              :             }
    6310              : 
    6311     28690611 :             if (LatDegradModelSimFlag) {
    6312              :                 // Calculate for SHReff using the Latent Degradation Model
    6313        34164 :                 if (NumIteration == 1) {
    6314        17082 :                     state.dataVariableSpeedCoils->QLatRated = state.dataVariableSpeedCoils->QLoadTotal - state.dataVariableSpeedCoils->QSensible;
    6315        17082 :                 } else if (NumIteration == 2) {
    6316        17082 :                     state.dataVariableSpeedCoils->QLatActual = state.dataVariableSpeedCoils->QLoadTotal - state.dataVariableSpeedCoils->QSensible;
    6317        17082 :                     SHRss = state.dataVariableSpeedCoils->QSensible / state.dataVariableSpeedCoils->QLoadTotal;
    6318       102492 :                     SHReff = CalcEffectiveSHR(state,
    6319              :                                               DXCoilNum,
    6320              :                                               SHRss,
    6321              :                                               fanOp,
    6322        17082 :                                               state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac,
    6323        17082 :                                               state.dataVariableSpeedCoils->QLatRated,
    6324        17082 :                                               state.dataVariableSpeedCoils->QLatActual,
    6325        17082 :                                               state.dataVariableSpeedCoils->LoadSideInletDBTemp,
    6326        17082 :                                               state.dataVariableSpeedCoils->LoadSideInletWBTemp);
    6327              :                     //       Update sensible capacity based on effective SHR
    6328        17082 :                     state.dataVariableSpeedCoils->QSensible = state.dataVariableSpeedCoils->QLoadTotal * SHReff;
    6329        17082 :                     goto LOOP_exit;
    6330              :                 }
    6331              :             } else {
    6332              :                 // Assume SHReff=SHRss
    6333     28656447 :                 SHReff = state.dataVariableSpeedCoils->QSensible / state.dataVariableSpeedCoils->QLoadTotal;
    6334     28656447 :                 goto LOOP_exit;
    6335              :             }
    6336              :         }
    6337     28673529 :     LOOP_exit:;
    6338              : 
    6339              :         // considering hot gas reheat here
    6340     28673529 :         if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HOTGASREHEATFLG > 0) {
    6341      1619941 :             state.dataVariableSpeedCoils->QLoadTotal -= QWasteHeat;
    6342      1619941 :             state.dataVariableSpeedCoils->QSensible -= QWasteHeat;
    6343      1619941 :             SHReff = state.dataVariableSpeedCoils->QSensible / state.dataVariableSpeedCoils->QLoadTotal;
    6344              :         }
    6345              : 
    6346     28673529 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).BasinHeaterPower = 0.0;
    6347     28673529 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterPower = 0.0;
    6348              : 
    6349     28673529 :         if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed) {
    6350     26559314 :             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     26559314 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterPower =
    6374     26559314 :                 state.dataVariableSpeedCoils->CrankcaseHeatingPower_CalcVarSpeedCoilCooling *
    6375     26559314 :                 (1.0 - state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac);
    6376              : 
    6377              :             // set water system demand request (if needed)
    6378     26559314 :             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     28673529 :         if ((PartLoadRatio > 0.0 && fanOp == HVAC::FanOp::Continuous) || (fanOp == HVAC::FanOp::Cycling)) {
    6386              :             // calculate coil outlet state variables
    6387     55903534 :             state.dataVariableSpeedCoils->LoadSideOutletEnth =
    6388     27951767 :                 state.dataVariableSpeedCoils->LoadSideInletEnth -
    6389     27951767 :                 state.dataVariableSpeedCoils->QLoadTotal / state.dataVariableSpeedCoils->LoadSideMassFlowRate;
    6390     55903534 :             state.dataVariableSpeedCoils->LoadSideOutletDBTemp =
    6391     27951767 :                 state.dataVariableSpeedCoils->LoadSideInletDBTemp -
    6392     27951767 :                 state.dataVariableSpeedCoils->QSensible / (state.dataVariableSpeedCoils->LoadSideMassFlowRate * CpAir);
    6393              : 
    6394     27951767 :             MaxHumRat = Psychrometrics::PsyWFnTdbRhPb(state,
    6395     27951767 :                                                       state.dataVariableSpeedCoils->LoadSideOutletDBTemp,
    6396              :                                                       0.9999,
    6397     27951767 :                                                       state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirPressure,
    6398              :                                                       RoutineName);
    6399     27951767 :             MaxOutletEnth = Psychrometrics::PsyHFnTdbW(state.dataVariableSpeedCoils->LoadSideOutletDBTemp, MaxHumRat);
    6400     27951767 :             if (state.dataVariableSpeedCoils->LoadSideOutletEnth > MaxOutletEnth) {
    6401       153073 :                 state.dataVariableSpeedCoils->LoadSideOutletEnth = MaxOutletEnth;
    6402              :                 // QLoadTotal = LoadSideMassFlowRate * (LoadSideInletEnth - LoadSideOutletEnth)
    6403              :             }
    6404     27951767 :             state.dataVariableSpeedCoils->LoadSideOutletHumRat = Psychrometrics::PsyWFnTdbH(
    6405     27951767 :                 state, state.dataVariableSpeedCoils->LoadSideOutletDBTemp, state.dataVariableSpeedCoils->LoadSideOutletEnth, RoutineName);
    6406     27951767 :             if (state.dataVariableSpeedCoils->LoadSideOutletHumRat > MaxHumRat) {
    6407        16939 :                 state.dataVariableSpeedCoils->LoadSideOutletHumRat = MaxHumRat;
    6408              :             }
    6409              :         }
    6410              : 
    6411              :         // Actual outlet conditions are "average" for time step
    6412     28673529 :         if (fanOp == HVAC::FanOp::Continuous) {
    6413              :             // continuous fan, cycling compressor
    6414     28301060 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirEnthalpy =
    6415     28301060 :                 PartLoadRatio * state.dataVariableSpeedCoils->LoadSideOutletEnth +
    6416     28301060 :                 (1.0 - PartLoadRatio) * state.dataVariableSpeedCoils->LoadSideInletEnth;
    6417     28301060 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirHumRat =
    6418     28301060 :                 PartLoadRatio * state.dataVariableSpeedCoils->LoadSideOutletHumRat +
    6419     28301060 :                 (1.0 - PartLoadRatio) * state.dataVariableSpeedCoils->LoadSideInletHumRat;
    6420     28301060 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirDBTemp =
    6421     28301060 :                 Psychrometrics::PsyTdbFnHW(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirEnthalpy,
    6422     28301060 :                                            state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirHumRat);
    6423     28301060 :             state.dataVariableSpeedCoils->PLRCorrLoadSideMdot = state.dataVariableSpeedCoils->LoadSideMassFlowRate;
    6424              :         } else {
    6425              :             // default to cycling fan, cycling compressor
    6426       372469 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirEnthalpy = state.dataVariableSpeedCoils->LoadSideOutletEnth;
    6427       372469 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirHumRat = state.dataVariableSpeedCoils->LoadSideOutletHumRat;
    6428       372469 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirDBTemp = state.dataVariableSpeedCoils->LoadSideOutletDBTemp;
    6429       372469 :             state.dataVariableSpeedCoils->PLRCorrLoadSideMdot = state.dataVariableSpeedCoils->LoadSideMassFlowRate * PartLoadRatio;
    6430              :         }
    6431              : 
    6432              :         // scale heat transfer rates to PLR and power to RTF
    6433     28673529 :         state.dataVariableSpeedCoils->QLoadTotal *= PartLoadRatio;
    6434     28673529 :         state.dataVariableSpeedCoils->QSensible *= PartLoadRatio;
    6435              :         // count the powr separately
    6436     28673529 :         state.dataVariableSpeedCoils->Winput *= state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac;
    6437     28673529 :         state.dataVariableSpeedCoils->QSource *= PartLoadRatio;
    6438     28673529 :         QWasteHeat *= PartLoadRatio;
    6439              : 
    6440              :         // Update heat pump data structure
    6441     28673529 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Power = state.dataVariableSpeedCoils->Winput;
    6442     28673529 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QLoadTotal = state.dataVariableSpeedCoils->QLoadTotal;
    6443     28673529 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QSensible = state.dataVariableSpeedCoils->QSensible;
    6444     28673529 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QLatent =
    6445     28673529 :             state.dataVariableSpeedCoils->QLoadTotal - state.dataVariableSpeedCoils->QSensible;
    6446     28673529 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Energy = state.dataVariableSpeedCoils->Winput * TimeStepSysSec;
    6447     28673529 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergyLoadTotal = state.dataVariableSpeedCoils->QLoadTotal * TimeStepSysSec;
    6448     28673529 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergySensible = state.dataVariableSpeedCoils->QSensible * TimeStepSysSec;
    6449     28673529 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergyLatent =
    6450     28673529 :             (state.dataVariableSpeedCoils->QLoadTotal - state.dataVariableSpeedCoils->QSensible) * TimeStepSysSec;
    6451     28673529 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterConsumption =
    6452     28673529 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterPower * TimeStepSysSec;
    6453     28673529 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapWaterConsump =
    6454     28673529 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapWaterConsumpRate * TimeStepSysSec;
    6455     28673529 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).BasinHeaterConsumption =
    6456     28673529 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).BasinHeaterPower * TimeStepSysSec;
    6457     28673529 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapCondPumpElecConsumption =
    6458     28673529 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapCondPumpElecPower * TimeStepSysSec;
    6459     28673529 :         if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac == 0.0) {
    6460       721762 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).COP = 0.0;
    6461              :         } else {
    6462     27951767 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).COP =
    6463     27951767 :                 state.dataVariableSpeedCoils->QLoadTotal / state.dataVariableSpeedCoils->Winput;
    6464              :         }
    6465     28673529 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PartLoadRatio = PartLoadRatio;
    6466     28673529 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirMassFlowRate = state.dataVariableSpeedCoils->PLRCorrLoadSideMdot;
    6467     28673529 :         rhoair = Psychrometrics::PsyRhoAirFnPbTdbW(state,
    6468     28673529 :                                                    state.dataEnvrn->OutBaroPress,
    6469     28673529 :                                                    state.dataVariableSpeedCoils->LoadSideInletDBTemp,
    6470     28673529 :                                                    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     28673529 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirVolFlowRate =
    6476     28673529 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirMassFlowRate / rhoair;
    6477              : 
    6478     28673529 :         if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed) {
    6479     26559314 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterMassFlowRate = 0.0;
    6480     26559314 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletWaterTemp = 0.0;
    6481     26559314 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletWaterEnthalpy = 0.0;
    6482     26559314 :             state.dataHeatBal->HeatReclaimVS_Coil(DXCoilNum).AvailCapacity = state.dataVariableSpeedCoils->QSource;
    6483     26559314 :             if (state.dataHeatBal->HeatReclaimVS_Coil(DXCoilNum).WaterHeatingDesuperheaterReclaimedHeatTotal > 0.0) {
    6484        42678 :                 state.dataVariableSpeedCoils->QSource -= state.dataHeatBal->HeatReclaimVS_Coil(DXCoilNum).WaterHeatingDesuperheaterReclaimedHeatTotal;
    6485              :             }
    6486              :         } else {
    6487      2114215 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterMassFlowRate = state.dataVariableSpeedCoils->SourceSideMassFlowRate;
    6488      2114215 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletWaterTemp =
    6489      2114215 :                 state.dataVariableSpeedCoils->SourceSideInletTemp +
    6490      2114215 :                 state.dataVariableSpeedCoils->QSource / (state.dataVariableSpeedCoils->SourceSideMassFlowRate * CpSource);
    6491      2114215 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletWaterEnthalpy =
    6492      2114215 :                 state.dataVariableSpeedCoils->SourceSideInletEnth +
    6493      2114215 :                 state.dataVariableSpeedCoils->QSource / state.dataVariableSpeedCoils->SourceSideMassFlowRate;
    6494      2114215 :             state.dataHeatBal->HeatReclaimVS_Coil(DXCoilNum).AvailCapacity = state.dataVariableSpeedCoils->QSource;
    6495      2114215 :             if (state.dataHeatBal->HeatReclaimVS_Coil(DXCoilNum).WaterHeatingDesuperheaterReclaimedHeatTotal > 0.0) {
    6496            0 :                 state.dataVariableSpeedCoils->QSource -= state.dataHeatBal->HeatReclaimVS_Coil(DXCoilNum).WaterHeatingDesuperheaterReclaimedHeatTotal;
    6497              :             }
    6498              :         }
    6499     28673529 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QSource = state.dataVariableSpeedCoils->QSource;
    6500     28673529 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergySource = state.dataVariableSpeedCoils->QSource * TimeStepSysSec;
    6501              : 
    6502     28673529 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QWasteHeat = QWasteHeat;
    6503              : 
    6504     28673529 :         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      1599176 :     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      1599176 :         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      1599176 :         Real64 rhoair = 0.0;          // entering air density
    6596      1599176 :         Real64 RhoWater = 0.0;        // water density
    6597              : 
    6598              :         // note: load side is the evaporator side, and source side is the condenser side
    6599              : 
    6600      1599176 :         int CondInletNode = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterInletNodeNum;
    6601      1599176 :         int CondOutletNode = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterOutletNodeNum;
    6602              :         // If heat pump water heater is OFF, set outlet to inlet and RETURN
    6603      1599176 :         if (PartLoadRatio == 0.0) {
    6604      1019091 :             state.dataLoopNodes->Node(CondOutletNode) = state.dataLoopNodes->Node(CondInletNode);
    6605      1019091 :             return;
    6606              :         } else {
    6607       580085 :             EvapInletNode = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirInletNodeNum;
    6608       580085 :             InletWaterTemp = state.dataLoopNodes->Node(CondInletNode).Temp;
    6609       580085 :             CondInletMassFlowRate = state.dataLoopNodes->Node(CondInletNode).MassFlowRate;
    6610       580085 :             EvapInletMassFlowRate = state.dataLoopNodes->Node(EvapInletNode).MassFlowRate;
    6611       580085 :             CpWater = Psychrometrics::CPHW(InletWaterTemp);
    6612       580085 :             CompressorPower = 0.0;
    6613       580085 :             OperatingHeatingPower = 0.0;
    6614       580085 :             TankHeatingCOP = 0.0;
    6615              :         }
    6616              : 
    6617              :         //  LOAD LOCAL VARIABLES FROM DATA STRUCTURE (for code readability)
    6618       580085 :         if (!(fanOp == HVAC::FanOp::Continuous) && PartLoadRatio > 0.0) {
    6619       580085 :             CondInletMassFlowRate = CondInletMassFlowRate / PartLoadRatio;
    6620       580085 :             EvapInletMassFlowRate = EvapInletMassFlowRate / PartLoadRatio;
    6621              :         }
    6622              : 
    6623       580085 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirMassFlowRate = EvapInletMassFlowRate;
    6624       580085 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterMassFlowRate = CondInletMassFlowRate;
    6625              : 
    6626              :         // determine inlet air temperature type for curve objects
    6627       580085 :         if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirTemperatureType == HVAC::OATType::WetBulb) {
    6628       580085 :             InletAirTemp = state.dataHVACGlobal->HPWHInletWBTemp;
    6629              :         } else {
    6630            0 :             InletAirTemp = state.dataHVACGlobal->HPWHInletDBTemp;
    6631              :         }
    6632              : 
    6633              :         // check if indoor evaporator or outdoor evaporator
    6634       580085 :         Real64 CrankcaseHeatingPower = 0.0;
    6635       580085 :         if (EvapInletNode != 0) {
    6636       580085 :             state.dataVariableSpeedCoils->LoadSideInletDBTemp = state.dataLoopNodes->Node(EvapInletNode).Temp;
    6637       580085 :             state.dataVariableSpeedCoils->LoadSideInletHumRat = state.dataLoopNodes->Node(EvapInletNode).HumRat;
    6638       580085 :             LoadPressure = state.dataLoopNodes->Node(EvapInletNode).Press;
    6639              :             // prevent the air pressure not given
    6640       580085 :             if (LoadPressure < 10.0) {
    6641            0 :                 LoadPressure = state.dataEnvrn->OutBaroPress;
    6642              :             }
    6643              : 
    6644       580085 :             state.dataVariableSpeedCoils->LoadSideInletWBTemp = state.dataLoopNodes->Node(EvapInletNode).OutAirWetBulb;
    6645       580085 :             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       580085 :         state.dataVariableSpeedCoils->LoadSideMassFlowRate = EvapInletMassFlowRate;
    6666       580085 :         state.dataVariableSpeedCoils->SourceSideMassFlowRate = CondInletMassFlowRate;
    6667       580085 :         state.dataVariableSpeedCoils->SourceSideInletTemp = InletWaterTemp;
    6668       580085 :         state.dataVariableSpeedCoils->SourceSideInletEnth = state.dataLoopNodes->Node(CondInletNode).Enthalpy;
    6669       580085 :         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       580085 :         if ((state.dataVariableSpeedCoils->SourceSideMassFlowRate <= 0.0) || (state.dataVariableSpeedCoils->LoadSideMassFlowRate <= 0.0)) {
    6673          548 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SimFlag = false;
    6674          548 :             return;
    6675              :         } else {
    6676       579537 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SimFlag = true;
    6677              :         }
    6678              : 
    6679              :         // part-load calculation
    6680       579537 :         state.dataHVACGlobal->OnOffFanPartLoadFraction = 1.0;
    6681       579537 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac = 1.0;
    6682       579537 :         if ((SpeedNum == 1) && (PartLoadRatio < 1.0)) {
    6683        14830 :             PLF = Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PLFFPLR, PartLoadRatio);
    6684        14830 :             if (PLF < 0.7) {
    6685            0 :                 PLF = 0.7;
    6686              :             }
    6687        14830 :             if (fanOp == HVAC::FanOp::Cycling) {
    6688        14830 :                 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        14830 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac = PartLoadRatio / PLF;
    6693        14830 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PartLoadRatio = PartLoadRatio;
    6694              : 
    6695        14830 :             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        14830 :             } else if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac < 0.0) {
    6698            0 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac = 0.0;
    6699              :             }
    6700              :         }
    6701              : 
    6702       579537 :         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       579537 :         if (SpeedNum > MaxSpeed) {
    6707            0 :             SpeedCal = MaxSpeed;
    6708              :         } else {
    6709       579537 :             SpeedCal = SpeedNum;
    6710              :         }
    6711              : 
    6712       579537 :         Real64 locFanElecPower = 0.0; // local for fan electric power
    6713       579537 :         if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SupplyFanIndex > 0) {
    6714       492163 :             locFanElecPower = state.dataFans->fans(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SupplyFanIndex)->totalPower;
    6715              :         }
    6716       579537 :         if ((SpeedNum == 1) || (SpeedNum > MaxSpeed) || (SpeedRatio == 1.0)) {
    6717       472348 :             AirMassFlowRatio =
    6718       472348 :                 state.dataVariableSpeedCoils->LoadSideMassFlowRate / state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignAirMassFlowRate;
    6719       472348 :             WaterMassFlowRatio =
    6720       472348 :                 state.dataVariableSpeedCoils->SourceSideMassFlowRate / state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignWaterMassFlowRate;
    6721       472348 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpElecNomPower =
    6722       472348 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWHPumpPower(SpeedCal);
    6723              : 
    6724      1417044 :             COPTempModFac = Curve::CurveValue(state,
    6725       472348 :                                               state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(SpeedCal),
    6726              :                                               InletAirTemp,
    6727       472348 :                                               state.dataVariableSpeedCoils->SourceSideInletTemp);
    6728              :             COPAirFFModFac =
    6729       472348 :                 Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(SpeedCal), AirMassFlowRatio);
    6730              :             COPWaterFFModFac =
    6731       472348 :                 Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRWaterFFlow(SpeedCal), WaterMassFlowRatio);
    6732              : 
    6733       472348 :             COP = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedCOP(SpeedCal) * COPTempModFac * COPAirFFModFac * COPWaterFFModFac;
    6734              : 
    6735      1417044 :             TOTCAPTempModFac = Curve::CurveValue(state,
    6736       472348 :                                                  state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(SpeedCal),
    6737              :                                                  InletAirTemp,
    6738       472348 :                                                  state.dataVariableSpeedCoils->SourceSideInletTemp);
    6739              :             //   Get capacity modifying factor (function of mass flow) for off-rated conditions
    6740              :             TOTCAPAirFFModFac =
    6741       472348 :                 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       472348 :                 Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapWaterFFlow(SpeedCal), WaterMassFlowRatio);
    6745              : 
    6746       472348 :             OperatingHeatingCapacity = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(SpeedCal) * TOTCAPTempModFac *
    6747              :                                        TOTCAPAirFFModFac * TOTCAPWaterFFModFac;
    6748              : 
    6749       472348 :             state.dataVariableSpeedCoils->Winput = OperatingHeatingCapacity / COP;
    6750       472348 :             OperatingHeatingPower = state.dataVariableSpeedCoils->Winput;
    6751              : 
    6752       472348 :             OperatingHeatingCOP = COP;
    6753       472348 :             PumpHeatToWater = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpElecNomPower *
    6754       472348 :                               state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpFracToWater;
    6755       472348 :             TankHeatingCOP = OperatingHeatingCOP;
    6756              : 
    6757              :             // account for pump heat if not included in total water heating capacity
    6758       472348 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondPumpHeatInCapacity) {
    6759            0 :                 TotalTankHeatingCapacity = OperatingHeatingCapacity;
    6760              :             } else {
    6761       472348 :                 TotalTankHeatingCapacity = OperatingHeatingCapacity + PumpHeatToWater;
    6762              :             }
    6763              : 
    6764              :             // calculate evaporator total cooling capacity
    6765       472348 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).FanPowerIncludedInCOP) {
    6766         8473 :                 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         8473 :                     CompressorPower = OperatingHeatingPower - locFanElecPower / state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac;
    6775         8473 :                     if ((OperatingHeatingPower + state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpElecNomPower) > 0.0) {
    6776         8473 :                         TankHeatingCOP = TotalTankHeatingCapacity /
    6777         8473 :                                          (OperatingHeatingPower + state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpElecNomPower);
    6778              :                     }
    6779              :                 }
    6780              :             } else {
    6781       463875 :                 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       463875 :                     CompressorPower = OperatingHeatingPower;
    6790       463875 :                     if ((OperatingHeatingPower + locFanElecPower / state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac +
    6791       463875 :                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpElecNomPower) > 0.0) {
    6792       463875 :                         TankHeatingCOP = TotalTankHeatingCapacity /
    6793       463875 :                                          (OperatingHeatingPower + locFanElecPower / state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac +
    6794       463875 :                                           state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpElecNomPower);
    6795              :                     }
    6796              :                 }
    6797              :             }
    6798              : 
    6799       472348 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondPumpHeatInCapacity) {
    6800            0 :                 EvapCoolingCapacity = TotalTankHeatingCapacity - PumpHeatToWater - CompressorPower;
    6801              :             } else {
    6802       472348 :                 EvapCoolingCapacity = TotalTankHeatingCapacity - CompressorPower;
    6803              :             }
    6804              : 
    6805       472348 :             CBFSpeed = DXCoils::AdjustCBF(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedCBF(SpeedCal),
    6806       472348 :                                           state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedAirMassFlowRate(SpeedCal),
    6807       472348 :                                           state.dataVariableSpeedCoils->LoadSideMassFlowRate);
    6808              : 
    6809              :         } else {
    6810       107189 :             AirMassFlowRatio =
    6811       107189 :                 state.dataVariableSpeedCoils->LoadSideMassFlowRate / state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignAirMassFlowRate;
    6812       107189 :             WaterMassFlowRatio =
    6813       107189 :                 state.dataVariableSpeedCoils->SourceSideMassFlowRate / state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignWaterMassFlowRate;
    6814       107189 :             AoEff = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEffectiveAo(SpeedCal) * SpeedRatio +
    6815       107189 :                     (1.0 - SpeedRatio) * state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEffectiveAo(SpeedCal - 1);
    6816       107189 :             CBFSpeed = std::exp(-AoEff / state.dataVariableSpeedCoils->LoadSideMassFlowRate);
    6817              : 
    6818              :             // calculate low speed
    6819       107189 :             SpeedCal = SpeedNum - 1;
    6820              : 
    6821       107189 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpElecNomPower =
    6822       107189 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWHPumpPower(SpeedCal);
    6823       321567 :             COPTempModFac = Curve::CurveValue(state,
    6824       107189 :                                               state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(SpeedCal),
    6825              :                                               InletAirTemp,
    6826       107189 :                                               state.dataVariableSpeedCoils->SourceSideInletTemp);
    6827              :             COPAirFFModFac =
    6828       107189 :                 Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(SpeedCal), AirMassFlowRatio);
    6829              :             COPWaterFFModFac =
    6830       107189 :                 Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRWaterFFlow(SpeedCal), WaterMassFlowRatio);
    6831              : 
    6832       107189 :             COP = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedCOP(SpeedCal) * COPTempModFac * COPAirFFModFac * COPWaterFFModFac;
    6833              : 
    6834       321567 :             TOTCAPTempModFac = Curve::CurveValue(state,
    6835       107189 :                                                  state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(SpeedCal),
    6836              :                                                  InletAirTemp,
    6837       107189 :                                                  state.dataVariableSpeedCoils->SourceSideInletTemp);
    6838              :             //   Get capacity modifying factor (function of mass flow) for off-rated conditions
    6839              :             TOTCAPAirFFModFac =
    6840       107189 :                 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       107189 :                 Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapWaterFFlow(SpeedCal), WaterMassFlowRatio);
    6844              : 
    6845       107189 :             OperatingHeatingCapacity = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(SpeedCal) * TOTCAPTempModFac *
    6846              :                                        TOTCAPAirFFModFac * TOTCAPWaterFFModFac;
    6847              : 
    6848       107189 :             state.dataVariableSpeedCoils->Winput = OperatingHeatingCapacity / COP;
    6849       107189 :             Winput1 = state.dataVariableSpeedCoils->Winput;
    6850       107189 :             WHCAP1 = OperatingHeatingCapacity;
    6851              : 
    6852              :             // calculate upper speed
    6853       107189 :             SpeedCal = SpeedNum;
    6854              : 
    6855       107189 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpElecNomPower =
    6856       107189 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWHPumpPower(SpeedCal);
    6857       321567 :             COPTempModFac = Curve::CurveValue(state,
    6858       107189 :                                               state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(SpeedCal),
    6859              :                                               InletAirTemp,
    6860       107189 :                                               state.dataVariableSpeedCoils->SourceSideInletTemp);
    6861              :             COPAirFFModFac =
    6862       107189 :                 Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(SpeedCal), AirMassFlowRatio);
    6863              :             COPWaterFFModFac =
    6864       107189 :                 Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRWaterFFlow(SpeedCal), WaterMassFlowRatio);
    6865              : 
    6866       107189 :             COP = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedCOP(SpeedCal) * COPTempModFac * COPAirFFModFac * COPWaterFFModFac;
    6867              : 
    6868       321567 :             TOTCAPTempModFac = Curve::CurveValue(state,
    6869       107189 :                                                  state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(SpeedCal),
    6870              :                                                  InletAirTemp,
    6871       107189 :                                                  state.dataVariableSpeedCoils->SourceSideInletTemp);
    6872              :             //   Get capacity modifying factor (function of mass flow) for off-rated conditions
    6873              :             TOTCAPAirFFModFac =
    6874       107189 :                 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       107189 :                 Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapWaterFFlow(SpeedCal), WaterMassFlowRatio);
    6878              : 
    6879       107189 :             OperatingHeatingCapacity = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(SpeedCal) * TOTCAPTempModFac *
    6880              :                                        TOTCAPAirFFModFac * TOTCAPWaterFFModFac;
    6881              : 
    6882       107189 :             Winput2 = OperatingHeatingCapacity / COP;
    6883       107189 :             WHCAP2 = OperatingHeatingCapacity;
    6884              : 
    6885              :             // interpolation
    6886       107189 :             state.dataVariableSpeedCoils->Winput = Winput2 * SpeedRatio + (1.0 - SpeedRatio) * Winput1;
    6887       107189 :             OperatingHeatingPower = state.dataVariableSpeedCoils->Winput;
    6888       107189 :             OperatingHeatingCapacity = WHCAP2 * SpeedRatio + (1.0 - SpeedRatio) * WHCAP1;
    6889       107189 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpElecNomPower =
    6890       107189 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWHPumpPower(SpeedNum) * SpeedRatio +
    6891       107189 :                 (1.0 - SpeedRatio) * state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWHPumpPower(SpeedNum - 1);
    6892              : 
    6893       107189 :             OperatingHeatingCOP = OperatingHeatingCapacity / OperatingHeatingPower;
    6894       107189 :             TankHeatingCOP = OperatingHeatingCOP;
    6895              : 
    6896       107189 :             PumpHeatToWater = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpElecNomPower *
    6897       107189 :                               state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpFracToWater;
    6898              : 
    6899              :             // account for pump heat if not included in total water heating capacity
    6900       107189 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondPumpHeatInCapacity) {
    6901            0 :                 TotalTankHeatingCapacity = OperatingHeatingCapacity;
    6902              :             } else {
    6903       107189 :                 TotalTankHeatingCapacity = OperatingHeatingCapacity + PumpHeatToWater;
    6904              :             }
    6905              : 
    6906       107189 :             Real64 HPRTF = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac;
    6907              :             // calculate evaporator total cooling capacity
    6908       107189 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).FanPowerIncludedInCOP) {
    6909         1266 :                 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         1266 :                     CompressorPower = OperatingHeatingPower - locFanElecPower / HPRTF;
    6918         1266 :                     if ((OperatingHeatingPower + state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpElecNomPower) > 0.0) {
    6919         1266 :                         TankHeatingCOP = TotalTankHeatingCapacity /
    6920         1266 :                                          (OperatingHeatingPower + state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpElecNomPower);
    6921              :                     }
    6922              :                 }
    6923              :             } else {
    6924       105923 :                 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       105923 :                     CompressorPower = OperatingHeatingPower;
    6932       211846 :                     if ((OperatingHeatingPower + locFanElecPower / HPRTF +
    6933       105923 :                          state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpElecNomPower) > 0.0) {
    6934       211846 :                         TankHeatingCOP = TotalTankHeatingCapacity / (OperatingHeatingPower + locFanElecPower / HPRTF +
    6935       105923 :                                                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpElecNomPower);
    6936              :                     }
    6937              :                 }
    6938              :             }
    6939              : 
    6940       107189 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CondPumpHeatInCapacity) {
    6941            0 :                 EvapCoolingCapacity = TotalTankHeatingCapacity - PumpHeatToWater - CompressorPower;
    6942              :             } else {
    6943       107189 :                 EvapCoolingCapacity = TotalTankHeatingCapacity - CompressorPower;
    6944              :             }
    6945              :         }
    6946              : 
    6947       579537 :         state.dataVariableSpeedCoils->QSource = TotalTankHeatingCapacity;
    6948       579537 :         state.dataVariableSpeedCoils->QLoadTotal = EvapCoolingCapacity;
    6949       579537 :         state.dataHVACGlobal->DXCoilTotalCapacity = EvapCoolingCapacity; // for standard rating calculation
    6950       579537 :         SHR = 1.0;
    6951              :         // if indoor, calculate SHR
    6952       579537 :         if (EvapInletNode != 0) {
    6953       579537 :             if (CBFSpeed > 0.999) {
    6954            0 :                 CBFSpeed = 0.999;
    6955              :             }
    6956              : 
    6957       579537 :             if (CBFSpeed < 0.001) {
    6958          682 :                 SHR = 1.0;
    6959              :             } else {
    6960       578855 :                 hDelta = state.dataVariableSpeedCoils->QLoadTotal / state.dataVariableSpeedCoils->LoadSideMassFlowRate;
    6961       578855 :                 hADP = state.dataVariableSpeedCoils->LoadSideInletEnth - hDelta / (1.0 - CBFSpeed);
    6962       578855 :                 tADP = Psychrometrics::PsyTsatFnHPb(state, hADP, LoadPressure, RoutineName);
    6963       578855 :                 wADP = Psychrometrics::PsyWFnTdbH(state, tADP, hADP, RoutineName);
    6964       578855 :                 hTinwADP = Psychrometrics::PsyHFnTdbW(state.dataVariableSpeedCoils->LoadSideInletDBTemp, wADP);
    6965       578855 :                 if ((state.dataVariableSpeedCoils->LoadSideInletEnth - hADP) > 1.e-10) {
    6966       578855 :                     SHR = min((hTinwADP - hADP) / (state.dataVariableSpeedCoils->LoadSideInletEnth - hADP), 1.0);
    6967              :                 } else {
    6968            0 :                     SHR = 1.0;
    6969              :                 }
    6970              :             }
    6971              :         }
    6972              : 
    6973       579537 :         state.dataVariableSpeedCoils->QSensible = state.dataVariableSpeedCoils->QLoadTotal * SHR;
    6974              : 
    6975              :         // determine condenser water inlet/outlet condition at full capacity
    6976       579537 :         if (CondInletMassFlowRate == 0.0) {
    6977            0 :             OutletWaterTemp = InletWaterTemp;
    6978              :         } else {
    6979       579537 :             OutletWaterTemp = InletWaterTemp + TotalTankHeatingCapacity / (CpWater * CondInletMassFlowRate);
    6980              :         }
    6981              : 
    6982       579537 :         state.dataLoopNodes->Node(CondOutletNode).Temp = OutletWaterTemp;
    6983              : 
    6984       579537 :         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       579537 :         state.dataVariableSpeedCoils->VSHPWHHeatingCapacity = TotalTankHeatingCapacity;
    6989              :         // total heating COP including compressor, fan, and condenser pump
    6990       579537 :         state.dataVariableSpeedCoils->VSHPWHHeatingCOP = TankHeatingCOP;
    6991              : 
    6992       579537 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).TotalHeatingEnergyRate = TotalTankHeatingCapacity * PartLoadRatio;
    6993              :         // calculate total compressor plus condenser pump power, fan power reported in fan module
    6994       579537 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).ElecWaterHeatingPower =
    6995       579537 :             (CompressorPower + state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpElecNomPower) *
    6996       579537 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac;
    6997              : 
    6998              :         // pass the outputs for the cooling coil section
    6999       579537 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).BasinHeaterPower = 0.0;
    7000       579537 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterPower =
    7001       579537 :             CrankcaseHeatingPower * (1.0 - state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac);
    7002              : 
    7003              :         // calculate coil outlet state variables
    7004      1159074 :         state.dataVariableSpeedCoils->LoadSideOutletEnth =
    7005       579537 :             state.dataVariableSpeedCoils->LoadSideInletEnth -
    7006       579537 :             state.dataVariableSpeedCoils->QLoadTotal / state.dataVariableSpeedCoils->LoadSideMassFlowRate;
    7007       579537 :         CpAir = Psychrometrics::PsyCpAirFnW(state.dataVariableSpeedCoils->LoadSideInletHumRat);
    7008      1159074 :         state.dataVariableSpeedCoils->LoadSideOutletDBTemp =
    7009       579537 :             state.dataVariableSpeedCoils->LoadSideInletDBTemp -
    7010       579537 :             state.dataVariableSpeedCoils->QSensible / (state.dataVariableSpeedCoils->LoadSideMassFlowRate * CpAir);
    7011              : 
    7012       579537 :         MaxHumRat = Psychrometrics::PsyWFnTdbRhPb(state,
    7013       579537 :                                                   state.dataVariableSpeedCoils->LoadSideOutletDBTemp,
    7014              :                                                   0.9999,
    7015       579537 :                                                   state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirPressure,
    7016              :                                                   RoutineName);
    7017       579537 :         MaxOutletEnth = Psychrometrics::PsyHFnTdbW(state.dataVariableSpeedCoils->LoadSideOutletDBTemp, MaxHumRat);
    7018       579537 :         if (state.dataVariableSpeedCoils->LoadSideOutletEnth > MaxOutletEnth) {
    7019          682 :             state.dataVariableSpeedCoils->LoadSideOutletEnth = MaxOutletEnth;
    7020              :         }
    7021       579537 :         state.dataVariableSpeedCoils->LoadSideOutletHumRat = Psychrometrics::PsyWFnTdbH(
    7022       579537 :             state, state.dataVariableSpeedCoils->LoadSideOutletDBTemp, state.dataVariableSpeedCoils->LoadSideOutletEnth, RoutineName);
    7023       579537 :         if (state.dataVariableSpeedCoils->LoadSideOutletHumRat > MaxHumRat) {
    7024          283 :             state.dataVariableSpeedCoils->LoadSideOutletHumRat = MaxHumRat;
    7025              :         }
    7026              : 
    7027              :         // Actual outlet conditions are "average" for time step
    7028       579537 :         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       579537 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirEnthalpy = state.dataVariableSpeedCoils->LoadSideOutletEnth;
    7042       579537 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirHumRat = state.dataVariableSpeedCoils->LoadSideOutletHumRat;
    7043       579537 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirDBTemp = state.dataVariableSpeedCoils->LoadSideOutletDBTemp;
    7044       579537 :             state.dataVariableSpeedCoils->PLRCorrLoadSideMdot = state.dataVariableSpeedCoils->LoadSideMassFlowRate * PartLoadRatio;
    7045              :         }
    7046              : 
    7047              :         // scale heat transfer rates to PLR and power to RTF
    7048       579537 :         state.dataVariableSpeedCoils->QLoadTotal *= PartLoadRatio;
    7049       579537 :         state.dataVariableSpeedCoils->QSensible *= PartLoadRatio;
    7050              :         // count the powr separately
    7051      1159074 :         state.dataVariableSpeedCoils->Winput *=
    7052       579537 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac; //+ VarSpeedCoil(DXCoilNum)%CrankcaseHeaterPower &
    7053              :         //+ VarSpeedCoil(DXCoilNum)%BasinHeaterPower + VarSpeedCoil(DXCoilNum)%EvapCondPumpElecPower
    7054       579537 :         state.dataVariableSpeedCoils->QSource *= PartLoadRatio;
    7055              : 
    7056              :         // Update heat pump data structure
    7057       579537 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpElecNomPower =
    7058       579537 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpElecNomPower *
    7059       579537 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac; // water heating pump power
    7060       579537 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Power = state.dataVariableSpeedCoils->Winput;
    7061       579537 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QLoadTotal = state.dataVariableSpeedCoils->QLoadTotal;
    7062       579537 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QSensible = state.dataVariableSpeedCoils->QSensible;
    7063       579537 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QLatent =
    7064       579537 :             state.dataVariableSpeedCoils->QLoadTotal - state.dataVariableSpeedCoils->QSensible;
    7065       579537 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QSource = state.dataVariableSpeedCoils->QSource;
    7066       579537 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Energy = state.dataVariableSpeedCoils->Winput * TimeStepSysSec;
    7067       579537 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergyLoadTotal = state.dataVariableSpeedCoils->QLoadTotal * TimeStepSysSec;
    7068       579537 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergySensible = state.dataVariableSpeedCoils->QSensible * TimeStepSysSec;
    7069       579537 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergyLatent =
    7070       579537 :             (state.dataVariableSpeedCoils->QLoadTotal - state.dataVariableSpeedCoils->QSensible) * TimeStepSysSec;
    7071       579537 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergySource = state.dataVariableSpeedCoils->QSource * TimeStepSysSec;
    7072       579537 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterConsumption =
    7073       579537 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterPower * TimeStepSysSec;
    7074       579537 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapWaterConsump = 0.0;
    7075       579537 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).BasinHeaterConsumption = 0.0;
    7076              :         // re-use EvapCondPumpElecConsumption to store WH pump energy consumption
    7077       579537 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EvapCondPumpElecConsumption =
    7078       579537 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).HPWHCondPumpElecNomPower * TimeStepSysSec;
    7079       579537 :         if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac == 0.0) {
    7080            0 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).COP = 0.0;
    7081              :         } else {
    7082       579537 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).COP =
    7083       579537 :                 state.dataVariableSpeedCoils->QLoadTotal / state.dataVariableSpeedCoils->Winput;
    7084              :         }
    7085       579537 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PartLoadRatio = PartLoadRatio;
    7086       579537 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirMassFlowRate = state.dataVariableSpeedCoils->PLRCorrLoadSideMdot;
    7087       579537 :         rhoair = Psychrometrics::PsyRhoAirFnPbTdbW(state,
    7088       579537 :                                                    state.dataEnvrn->OutBaroPress,
    7089       579537 :                                                    state.dataVariableSpeedCoils->LoadSideInletDBTemp,
    7090       579537 :                                                    state.dataVariableSpeedCoils->LoadSideInletHumRat,
    7091              :                                                    RoutineName);
    7092       579537 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirVolFlowRate =
    7093       579537 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirMassFlowRate / rhoair;
    7094       579537 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterMassFlowRate = state.dataVariableSpeedCoils->SourceSideMassFlowRate;
    7095       579537 :         RhoWater = Psychrometrics::RhoH2O(InletWaterTemp); // initialize
    7096       579537 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterVolFlowRate =
    7097       579537 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterMassFlowRate / RhoWater;
    7098              : 
    7099       579537 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletWaterTemp =
    7100       579537 :             state.dataVariableSpeedCoils->SourceSideInletTemp +
    7101       579537 :             state.dataVariableSpeedCoils->QSource / (state.dataVariableSpeedCoils->SourceSideMassFlowRate * CpWater);
    7102       579537 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletWaterEnthalpy =
    7103       579537 :             state.dataVariableSpeedCoils->SourceSideInletEnth +
    7104       579537 :             state.dataVariableSpeedCoils->QSource / state.dataVariableSpeedCoils->SourceSideMassFlowRate;
    7105       579537 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QWasteHeat = 0.0;
    7106              : 
    7107       579537 :         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        82596 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Power = 0.0;
    7111        82596 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QLoadTotal = 0.0;
    7112        82596 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QSensible = 0.0;
    7113        82596 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QLatent = 0.0;
    7114        82596 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Energy = 0.0;
    7115        82596 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergyLoadTotal = 0.0;
    7116        82596 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergySensible = 0.0;
    7117        82596 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergyLatent = 0.0;
    7118        82596 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterConsumption = 0.0;
    7119              :         }
    7120              :     }
    7121              : 
    7122            7 :     void setVarSpeedHPWHFanType(EnergyPlusData &state, int const dXCoilNum, HVAC::FanType fanType)
    7123              :     {
    7124            7 :         state.dataVariableSpeedCoils->VarSpeedCoil(dXCoilNum).supplyFanType = fanType;
    7125            7 :     }
    7126              : 
    7127            7 :     void setVarSpeedHPWHFanIndex(EnergyPlusData &state, int const dXCoilNum, int const fanIndex)
    7128              :     {
    7129            7 :         state.dataVariableSpeedCoils->VarSpeedCoil(dXCoilNum).SupplyFanIndex = fanIndex;
    7130            7 :     }
    7131              : 
    7132      5463106 :     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      5463106 :         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      5463106 :         Real64 rhoair(0.0);         // entering air density
    7181              : 
    7182              :         // ADDED VARIABLES FOR air source coil
    7183      5463106 :         int MaxSpeed = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).NumOfSpeeds;
    7184              : 
    7185              :         //  LOAD LOCAL VARIABLES FROM DATA STRUCTURE (for code readability)
    7186      5463106 :         if (!(fanOp == HVAC::FanOp::Continuous) && PartLoadRatio > 0.0) {
    7187       190375 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirMassFlowRate =
    7188       190375 :                 state.dataLoopNodes->Node(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirInletNodeNum).MassFlowRate / PartLoadRatio;
    7189              :         }
    7190              : 
    7191      5463106 :         state.dataVariableSpeedCoils->LoadSideMassFlowRate = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirMassFlowRate;
    7192      5463106 :         state.dataVariableSpeedCoils->LoadSideInletDBTemp = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirDBTemp;
    7193      5463106 :         state.dataVariableSpeedCoils->LoadSideInletHumRat = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirHumRat;
    7194              : 
    7195      5463106 :         state.dataVariableSpeedCoils->LoadSideInletWBTemp = Psychrometrics::PsyTwbFnTdbWPb(state,
    7196      5463106 :                                                                                            state.dataVariableSpeedCoils->LoadSideInletDBTemp,
    7197      5463106 :                                                                                            state.dataVariableSpeedCoils->LoadSideInletHumRat,
    7198      5463106 :                                                                                            state.dataEnvrn->OutBaroPress,
    7199              :                                                                                            RoutineName);
    7200      5463106 :         state.dataVariableSpeedCoils->LoadSideInletEnth = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletAirEnthalpy;
    7201      5463106 :         Real64 CpAir = Psychrometrics::PsyCpAirFnW(state.dataVariableSpeedCoils->LoadSideInletHumRat); // Specific heat of air [J/kg_C]
    7202              : 
    7203      5463106 :         if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_HeatingAirToAirVariableSpeed) {
    7204              :             // Get condenser outdoor node info from DX Heating Coil
    7205       941295 :             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       941295 :                 state.dataVariableSpeedCoils->OutdoorDryBulb = state.dataEnvrn->OutDryBulbTemp;
    7216       941295 :                 state.dataVariableSpeedCoils->OutdoorHumRat = state.dataEnvrn->OutHumRat;
    7217       941295 :                 state.dataVariableSpeedCoils->OutdoorPressure = state.dataEnvrn->OutBaroPress;
    7218       941295 :                 state.dataVariableSpeedCoils->OutdoorWetBulb = state.dataEnvrn->OutWetBulbTemp;
    7219              :             }
    7220       941295 :             state.dataVariableSpeedCoils->SourceSideMassFlowRate = 1.0; // not used and avoid divided by zero
    7221       941295 :             state.dataVariableSpeedCoils->SourceSideInletTemp = state.dataVariableSpeedCoils->OutdoorDryBulb;
    7222       941295 :             state.dataVariableSpeedCoils->SourceSideInletEnth =
    7223       941295 :                 Psychrometrics::PsyHFnTdbW(state.dataVariableSpeedCoils->OutdoorDryBulb, state.dataVariableSpeedCoils->OutdoorHumRat);
    7224       941295 :             CpSource = Psychrometrics::PsyCpAirFnW(state.dataEnvrn->OutHumRat);
    7225              : 
    7226              :             // Initialize crankcase heater, operates below OAT defined in input deck for HP DX heating coil
    7227       941295 :             if (state.dataVariableSpeedCoils->OutdoorDryBulb < state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MaxOATCrankcaseHeater) {
    7228       408681 :                 state.dataVariableSpeedCoils->CrankcaseHeatingPower = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterCapacity;
    7229       408681 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterCapacityCurveIndex > 0) {
    7230       125600 :                     state.dataVariableSpeedCoils->CrankcaseHeatingPower *=
    7231       125600 :                         Curve::CurveValue(state,
    7232       125600 :                                           state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterCapacityCurveIndex,
    7233       125600 :                                           state.dataEnvrn->OutDryBulbTemp);
    7234              :                 }
    7235              :             } else {
    7236       532614 :                 state.dataVariableSpeedCoils->CrankcaseHeatingPower = 0.0;
    7237              :             }
    7238              :         } else {
    7239      4521811 :             state.dataVariableSpeedCoils->SourceSideMassFlowRate = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterMassFlowRate;
    7240      4521811 :             state.dataVariableSpeedCoils->SourceSideInletTemp = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletWaterTemp;
    7241      4521811 :             state.dataVariableSpeedCoils->SourceSideInletEnth = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).InletWaterEnthalpy;
    7242      4521811 :             CpSource = state.dataPlnt->PlantLoop(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).plantLoc.loopNum)
    7243      4521811 :                            .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      5463106 :         if ((state.dataVariableSpeedCoils->SourceSideMassFlowRate <= 0.0) || (state.dataVariableSpeedCoils->LoadSideMassFlowRate <= 0.0)) {
    7248      4042268 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SimFlag = false;
    7249      4042268 :             return;
    7250              :         } else {
    7251      1420838 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SimFlag = true;
    7252              :         }
    7253              : 
    7254      1605067 :         if ((state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_HeatingAirToAirVariableSpeed) &&
    7255       184229 :             (state.dataVariableSpeedCoils->OutdoorDryBulb < state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MinOATCompressor)) {
    7256       116357 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SimFlag = false;
    7257       116357 :             return;
    7258              :         }
    7259              : 
    7260      1304481 :         if (compressorOp == HVAC::CompressorOp::Off) {
    7261         2071 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).SimFlag = false;
    7262         2071 :             return;
    7263              :         }
    7264              : 
    7265      1302410 :         if (SpeedNum > MaxSpeed) {
    7266            0 :             SpeedCal = MaxSpeed;
    7267              :         } else {
    7268      1302410 :             SpeedCal = SpeedNum;
    7269              :         }
    7270              : 
    7271      1302410 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac = 1.0;
    7272      1302410 :         state.dataHVACGlobal->OnOffFanPartLoadFraction = 1.0;
    7273      1302410 :         if ((SpeedNum == 1) && (PartLoadRatio < 1.0)) {
    7274       135369 :             PLF = Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PLFFPLR, PartLoadRatio);
    7275       135369 :             if (PLF < 0.7) {
    7276            0 :                 PLF = 0.7;
    7277              :             }
    7278       135369 :             if (fanOp == HVAC::FanOp::Cycling) {
    7279        20142 :                 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       135369 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac = PartLoadRatio / PLF;
    7284       135369 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PartLoadRatio = PartLoadRatio;
    7285              : 
    7286       135369 :             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       135369 :             } else if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac < 0.0) {
    7289            0 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac = 0.0;
    7290              :             }
    7291              :         }
    7292              : 
    7293      1302410 :         if ((SpeedNum == 1) || (SpeedNum > MaxSpeed) || (SpeedRatio == 1.0)) {
    7294      1024211 :             AirMassFlowRatio =
    7295      1024211 :                 state.dataVariableSpeedCoils->LoadSideMassFlowRate / state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignAirMassFlowRate;
    7296              : 
    7297      1024211 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_HeatingAirToAirVariableSpeed) {
    7298        58819 :                 WaterMassFlowRatio = 1.0;
    7299              :             } else {
    7300       965392 :                 WaterMassFlowRatio = state.dataVariableSpeedCoils->SourceSideMassFlowRate /
    7301       965392 :                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignWaterMassFlowRate;
    7302              :             }
    7303              : 
    7304      4096844 :             TotCapTempModFac = Curve::CurveValue(state,
    7305      1024211 :                                                  state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(SpeedCal),
    7306      1024211 :                                                  state.dataVariableSpeedCoils->LoadSideInletDBTemp,
    7307      1024211 :                                                  state.dataVariableSpeedCoils->SourceSideInletTemp);
    7308              :             TotCapAirFFModFac =
    7309      1024211 :                 Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(SpeedCal), AirMassFlowRatio);
    7310              : 
    7311      1024211 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_HeatingAirToAirVariableSpeed) {
    7312        58819 :                 TotCapWaterFFModFac = 1.0;
    7313              :             } else {
    7314              :                 TotCapWaterFFModFac =
    7315       965392 :                     Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapWaterFFlow(SpeedCal), WaterMassFlowRatio);
    7316              :             }
    7317              : 
    7318      1024211 :             state.dataVariableSpeedCoils->QLoadTotal = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(SpeedCal) *
    7319      1024211 :                                                        TotCapTempModFac * TotCapAirFFModFac * TotCapWaterFFModFac;
    7320      1024211 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).capModFacTotal = TotCapTempModFac * TotCapAirFFModFac * TotCapWaterFFModFac;
    7321      2048422 :             state.dataVariableSpeedCoils->TotRatedCapacity =
    7322      1024211 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(SpeedCal); // for defrosting power cal
    7323              : 
    7324      4096844 :             EIRTempModFac = Curve::CurveValue(state,
    7325      1024211 :                                               state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(SpeedCal),
    7326      1024211 :                                               state.dataVariableSpeedCoils->LoadSideInletDBTemp,
    7327      1024211 :                                               state.dataVariableSpeedCoils->SourceSideInletTemp);
    7328              :             EIRAirFFModFac =
    7329      1024211 :                 Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(SpeedCal), AirMassFlowRatio);
    7330              : 
    7331      1024211 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_HeatingAirToAirVariableSpeed) {
    7332        58819 :                 EIRWaterFFModFac = 1.0;
    7333              :             } else {
    7334              :                 EIRWaterFFModFac =
    7335       965392 :                     Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRWaterFFlow(SpeedCal), WaterMassFlowRatio);
    7336              :             }
    7337              : 
    7338      1024211 :             EIR = (1.0 / state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedCOP(SpeedCal)) * EIRTempModFac * EIRAirFFModFac *
    7339              :                   EIRWaterFFModFac;
    7340      1024211 :             state.dataVariableSpeedCoils->Winput = state.dataVariableSpeedCoils->QLoadTotal * EIR;
    7341              : 
    7342      2048422 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_HeatingAirToAirVariableSpeed) {
    7343        58819 :                 QWasteHeat = 0.0;
    7344              :             } else {
    7345       965392 :                 QWasteHeat = state.dataVariableSpeedCoils->Winput * state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWasteHeatFrac(SpeedCal);
    7346       965392 :                 QWasteHeat *= Curve::CurveValue(state,
    7347       965392 :                                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWasteHeat(SpeedCal),
    7348       965392 :                                                 state.dataVariableSpeedCoils->LoadSideInletDBTemp,
    7349       965392 :                                                 state.dataVariableSpeedCoils->SourceSideInletTemp);
    7350              :             }
    7351              : 
    7352              :         } else {
    7353       278199 :             AirMassFlowRatio =
    7354       278199 :                 state.dataVariableSpeedCoils->LoadSideMassFlowRate / state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignAirMassFlowRate;
    7355              : 
    7356       278199 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_HeatingAirToAirVariableSpeed) {
    7357         8139 :                 WaterMassFlowRatio = 1.0;
    7358              :             } else {
    7359       270060 :                 WaterMassFlowRatio = state.dataVariableSpeedCoils->SourceSideMassFlowRate /
    7360       270060 :                                      state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DesignWaterMassFlowRate;
    7361              :             }
    7362              : 
    7363       278199 :             SpeedCal = SpeedNum - 1;
    7364      1112796 :             TotCapTempModFac = Curve::CurveValue(state,
    7365       278199 :                                                  state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(SpeedCal),
    7366       278199 :                                                  state.dataVariableSpeedCoils->LoadSideInletDBTemp,
    7367       278199 :                                                  state.dataVariableSpeedCoils->SourceSideInletTemp);
    7368              :             TotCapAirFFModFac =
    7369       278199 :                 Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(SpeedCal), AirMassFlowRatio);
    7370              : 
    7371       278199 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_HeatingAirToAirVariableSpeed) {
    7372         8139 :                 TotCapWaterFFModFac = 1.0;
    7373              :             } else {
    7374              :                 TotCapWaterFFModFac =
    7375       270060 :                     Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapWaterFFlow(SpeedCal), WaterMassFlowRatio);
    7376              :             }
    7377              : 
    7378       278199 :             QLoadTotal1 = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(SpeedCal) * TotCapTempModFac * TotCapAirFFModFac *
    7379              :                           TotCapWaterFFModFac;
    7380              : 
    7381      1112796 :             EIRTempModFac = Curve::CurveValue(state,
    7382       278199 :                                               state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(SpeedCal),
    7383       278199 :                                               state.dataVariableSpeedCoils->LoadSideInletDBTemp,
    7384       278199 :                                               state.dataVariableSpeedCoils->SourceSideInletTemp);
    7385              :             EIRAirFFModFac =
    7386       278199 :                 Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(SpeedCal), AirMassFlowRatio);
    7387              : 
    7388       278199 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_HeatingAirToAirVariableSpeed) {
    7389         8139 :                 EIRWaterFFModFac = 1.0;
    7390              :             } else {
    7391              :                 EIRWaterFFModFac =
    7392       270060 :                     Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRWaterFFlow(SpeedCal), WaterMassFlowRatio);
    7393              :             }
    7394              : 
    7395       278199 :             EIR = (1.0 / state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedCOP(SpeedCal)) * EIRTempModFac * EIRAirFFModFac *
    7396              :                   EIRWaterFFModFac;
    7397       278199 :             Winput1 = QLoadTotal1 * EIR;
    7398              : 
    7399       278199 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_HeatingAirToAirVariableSpeed) {
    7400         8139 :                 QWasteHeat1 = 0.0;
    7401              :             } else {
    7402       270060 :                 QWasteHeat1 = Winput1 * state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWasteHeatFrac(SpeedCal);
    7403       270060 :                 QWasteHeat1 *= Curve::CurveValue(state,
    7404       270060 :                                                  state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWasteHeat(SpeedCal),
    7405       270060 :                                                  state.dataVariableSpeedCoils->LoadSideInletDBTemp,
    7406       270060 :                                                  state.dataVariableSpeedCoils->SourceSideInletTemp);
    7407              :             }
    7408              : 
    7409       278199 :             SpeedCal = SpeedNum;
    7410      1112796 :             TotCapTempModFac = Curve::CurveValue(state,
    7411       278199 :                                                  state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapFTemp(SpeedCal),
    7412       278199 :                                                  state.dataVariableSpeedCoils->LoadSideInletDBTemp,
    7413       278199 :                                                  state.dataVariableSpeedCoils->SourceSideInletTemp);
    7414              :             TotCapAirFFModFac =
    7415       278199 :                 Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapAirFFlow(SpeedCal), AirMassFlowRatio);
    7416              : 
    7417       278199 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_HeatingAirToAirVariableSpeed) {
    7418         8139 :                 TotCapWaterFFModFac = 1.0;
    7419              :             } else {
    7420              :                 TotCapWaterFFModFac =
    7421       270060 :                     Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSCCapWaterFFlow(SpeedCal), WaterMassFlowRatio);
    7422              :             }
    7423              : 
    7424       278199 :             QLoadTotal2 = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(SpeedCal) * TotCapTempModFac * TotCapAirFFModFac *
    7425              :                           TotCapWaterFFModFac;
    7426              : 
    7427      1112796 :             EIRTempModFac = Curve::CurveValue(state,
    7428       278199 :                                               state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRFTemp(SpeedCal),
    7429       278199 :                                               state.dataVariableSpeedCoils->LoadSideInletDBTemp,
    7430       278199 :                                               state.dataVariableSpeedCoils->SourceSideInletTemp);
    7431              :             EIRAirFFModFac =
    7432       278199 :                 Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRAirFFlow(SpeedCal), AirMassFlowRatio);
    7433              : 
    7434       278199 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_HeatingAirToAirVariableSpeed) {
    7435         8139 :                 EIRWaterFFModFac = 1.0;
    7436              :             } else {
    7437              :                 EIRWaterFFModFac =
    7438       270060 :                     Curve::CurveValue(state, state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSEIRWaterFFlow(SpeedCal), WaterMassFlowRatio);
    7439              :             }
    7440              : 
    7441       278199 :             EIR = (1.0 / state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedCOP(SpeedCal)) * EIRTempModFac * EIRAirFFModFac *
    7442              :                   EIRWaterFFModFac;
    7443       278199 :             Winput2 = QLoadTotal2 * EIR;
    7444              : 
    7445       278199 :             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_HeatingAirToAirVariableSpeed) {
    7446         8139 :                 QWasteHeat2 = 0.0;
    7447              :             } else {
    7448       270060 :                 QWasteHeat2 = Winput2 * state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWasteHeatFrac(SpeedCal);
    7449       270060 :                 QWasteHeat2 *= Curve::CurveValue(state,
    7450       270060 :                                                  state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSWasteHeat(SpeedCal),
    7451       270060 :                                                  state.dataVariableSpeedCoils->LoadSideInletDBTemp,
    7452       270060 :                                                  state.dataVariableSpeedCoils->SourceSideInletTemp);
    7453              :             }
    7454              : 
    7455       278199 :             state.dataVariableSpeedCoils->QLoadTotal = QLoadTotal2 * SpeedRatio + (1.0 - SpeedRatio) * QLoadTotal1;
    7456       278199 :             state.dataVariableSpeedCoils->Winput = Winput2 * SpeedRatio + (1.0 - SpeedRatio) * Winput1;
    7457       278199 :             QWasteHeat = QWasteHeat2 * SpeedRatio + (1.0 - SpeedRatio) * QWasteHeat1;
    7458       278199 :             state.dataVariableSpeedCoils->TotRatedCapacity =
    7459       278199 :                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(SpeedCal) * SpeedRatio +
    7460       278199 :                 (1.0 - SpeedRatio) * state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MSRatedTotCap(SpeedCal - 1);
    7461              :         }
    7462              : 
    7463      1302410 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterPower = 0.0; // necessary to clear zero for water source coils
    7464      1302410 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostPower = 0.0;         // clear the defrost power
    7465      1302410 :         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        66958 :             state.dataVariableSpeedCoils->OutdoorCoilT = 0.82 * state.dataVariableSpeedCoils->OutdoorDryBulb - 8.589;
    7469        66958 :             state.dataVariableSpeedCoils->OutdoorCoildw =
    7470        66958 :                 max(1.0e-6,
    7471        66958 :                     (state.dataVariableSpeedCoils->OutdoorHumRat -
    7472        66958 :                      Psychrometrics::PsyWFnTdpPb(state, state.dataVariableSpeedCoils->OutdoorCoilT, state.dataVariableSpeedCoils->OutdoorPressure)));
    7473              : 
    7474              :             // Initializing defrost adjustment factors
    7475        66958 :             state.dataVariableSpeedCoils->LoadDueToDefrost = 0.0;
    7476        66958 :             state.dataVariableSpeedCoils->HeatingCapacityMultiplier = 1.0;
    7477        66958 :             state.dataVariableSpeedCoils->FractionalDefrostTime = 0.0;
    7478        66958 :             state.dataVariableSpeedCoils->InputPowerMultiplier = 1.0;
    7479              :             // Check outdoor temperature to determine of defrost is active
    7480        66958 :             if (state.dataVariableSpeedCoils->OutdoorDryBulb <= state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MaxOATDefrost) {
    7481              :                 // Calculate defrost adjustment factors depending on defrost control type
    7482            0 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostControl == Timed) {
    7483            0 :                     state.dataVariableSpeedCoils->FractionalDefrostTime = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostTime;
    7484            0 :                     if (state.dataVariableSpeedCoils->FractionalDefrostTime > 0.0) {
    7485            0 :                         if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).FrostHeatingCapacityMultiplierEMSOverrideOn &&
    7486            0 :                             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).FrostHeatingInputPowerMultiplierEMSOverrideOn) {
    7487            0 :                             state.dataVariableSpeedCoils->HeatingCapacityMultiplier =
    7488            0 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).FrostHeatingCapacityMultiplierEMSOverrideValue;
    7489            0 :                             state.dataVariableSpeedCoils->InputPowerMultiplier =
    7490            0 :                                 state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).FrostHeatingInputPowerMultiplierEMSOverrideValue;
    7491              :                         } else {
    7492            0 :                             state.dataVariableSpeedCoils->HeatingCapacityMultiplier = 0.909 - 107.33 * state.dataVariableSpeedCoils->OutdoorCoildw;
    7493            0 :                             state.dataVariableSpeedCoils->InputPowerMultiplier = 0.90 - 36.45 * state.dataVariableSpeedCoils->OutdoorCoildw;
    7494            0 :                             if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).FrostHeatingCapacityMultiplierEMSOverrideOn ||
    7495            0 :                                 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            0 :                     state.dataVariableSpeedCoils->FractionalDefrostTime = 1.0 / (1.0 + 0.01446 / state.dataVariableSpeedCoils->OutdoorCoildw);
    7507            0 :                     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            0 :                         state.dataVariableSpeedCoils->HeatingCapacityMultiplier = 0.875 * (1.0 - state.dataVariableSpeedCoils->FractionalDefrostTime);
    7515            0 :                         state.dataVariableSpeedCoils->InputPowerMultiplier = 0.954 * (1.0 - state.dataVariableSpeedCoils->FractionalDefrostTime);
    7516            0 :                         if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).FrostHeatingCapacityMultiplierEMSOverrideOn ||
    7517            0 :                             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            0 :                 state.dataVariableSpeedCoils->FractionalDefrostTime *= state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac;
    7528              : 
    7529            0 :                 if (state.dataVariableSpeedCoils->FractionalDefrostTime > 0.0) {
    7530              :                     // Calculate defrost adjustment factors depending on defrost control strategy
    7531            0 :                     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            0 :                         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostPower =
    7545            0 :                             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostCapacity *
    7546            0 :                             state.dataVariableSpeedCoils->FractionalDefrostTime;
    7547              :                     }
    7548              :                 } else { // Defrost is not active because (OutDryBulbTemp > VarSpeedCoil(DXCoilNum).MaxOATDefrost)
    7549            0 :                     state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostPower = 0.0;
    7550              :                 }
    7551              :             }
    7552              : 
    7553        66958 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterPower =
    7554        66958 :                 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       133916 :             state.dataVariableSpeedCoils->QLoadTotal =
    7563        66958 :                 state.dataVariableSpeedCoils->QLoadTotal * state.dataVariableSpeedCoils->HeatingCapacityMultiplier -
    7564        66958 :                 state.dataVariableSpeedCoils->LoadDueToDefrost;
    7565              :             // count the powr separately
    7566        66958 :             state.dataVariableSpeedCoils->Winput *= state.dataVariableSpeedCoils->InputPowerMultiplier; //+ VarSpeedCoil(DXCoilNum)%DefrostPower
    7567              :         }
    7568              : 
    7569      1302410 :         state.dataVariableSpeedCoils->QSource = state.dataVariableSpeedCoils->QLoadTotal + QWasteHeat - state.dataVariableSpeedCoils->Winput;
    7570      1302410 :         state.dataVariableSpeedCoils->QSensible = state.dataVariableSpeedCoils->QLoadTotal;
    7571              : 
    7572      1302410 :         if (state.dataVariableSpeedCoils->QSource < 0) {
    7573            0 :             state.dataVariableSpeedCoils->QSource = 0.0;
    7574            0 :             QWasteHeat = state.dataVariableSpeedCoils->Winput - state.dataVariableSpeedCoils->QLoadTotal;
    7575              :         }
    7576              : 
    7577              :         // calculate coil outlet state variables
    7578      2604820 :         state.dataVariableSpeedCoils->LoadSideOutletEnth =
    7579      1302410 :             state.dataVariableSpeedCoils->LoadSideInletEnth +
    7580      1302410 :             state.dataVariableSpeedCoils->QLoadTotal / state.dataVariableSpeedCoils->LoadSideMassFlowRate;
    7581      2604820 :         state.dataVariableSpeedCoils->LoadSideOutletDBTemp =
    7582      1302410 :             state.dataVariableSpeedCoils->LoadSideInletDBTemp +
    7583      1302410 :             state.dataVariableSpeedCoils->QSensible / (state.dataVariableSpeedCoils->LoadSideMassFlowRate * CpAir);
    7584      1302410 :         state.dataVariableSpeedCoils->LoadSideOutletHumRat = Psychrometrics::PsyWFnTdbH(
    7585      1302410 :             state, state.dataVariableSpeedCoils->LoadSideOutletDBTemp, state.dataVariableSpeedCoils->LoadSideOutletEnth, RoutineName);
    7586              : 
    7587              :         // Actual outlet conditions are "average" for time step
    7588      1302410 :         if (fanOp == HVAC::FanOp::Continuous) {
    7589              :             // continuous fan, cycling compressor
    7590      1224367 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirEnthalpy =
    7591      1224367 :                 PartLoadRatio * state.dataVariableSpeedCoils->LoadSideOutletEnth +
    7592      1224367 :                 (1.0 - PartLoadRatio) * state.dataVariableSpeedCoils->LoadSideInletEnth;
    7593      1224367 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirHumRat =
    7594      1224367 :                 PartLoadRatio * state.dataVariableSpeedCoils->LoadSideOutletHumRat +
    7595      1224367 :                 (1.0 - PartLoadRatio) * state.dataVariableSpeedCoils->LoadSideInletHumRat;
    7596      1224367 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirDBTemp =
    7597      1224367 :                 Psychrometrics::PsyTdbFnHW(state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirEnthalpy,
    7598      1224367 :                                            state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirHumRat);
    7599      1224367 :             state.dataVariableSpeedCoils->PLRCorrLoadSideMdot = state.dataVariableSpeedCoils->LoadSideMassFlowRate;
    7600              :         } else {
    7601              :             // default to cycling fan, cycling compressor
    7602        78043 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirEnthalpy = state.dataVariableSpeedCoils->LoadSideOutletEnth;
    7603        78043 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirHumRat = state.dataVariableSpeedCoils->LoadSideOutletHumRat;
    7604        78043 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletAirDBTemp = state.dataVariableSpeedCoils->LoadSideOutletDBTemp;
    7605        78043 :             state.dataVariableSpeedCoils->PLRCorrLoadSideMdot = state.dataVariableSpeedCoils->LoadSideMassFlowRate * PartLoadRatio;
    7606              :         }
    7607              : 
    7608              :         // scale heat transfer rates to PLR and power to RTF
    7609      1302410 :         state.dataVariableSpeedCoils->QLoadTotal *= PartLoadRatio;
    7610      1302410 :         state.dataVariableSpeedCoils->QSensible *= PartLoadRatio;
    7611              :         // count the powr separately
    7612      2604820 :         state.dataVariableSpeedCoils->Winput *=
    7613      1302410 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac; //+ VarSpeedCoil(DXCoilNum)%CrankcaseHeaterPower
    7614      1302410 :         state.dataVariableSpeedCoils->QSource *= PartLoadRatio;
    7615      1302410 :         QWasteHeat *= PartLoadRatio;
    7616              : 
    7617              :         // Update heat pump data structure
    7618      1302410 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Power = state.dataVariableSpeedCoils->Winput;
    7619      1302410 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QLoadTotal = state.dataVariableSpeedCoils->QLoadTotal;
    7620      1302410 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QSensible = state.dataVariableSpeedCoils->QSensible;
    7621      1302410 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QSource = state.dataVariableSpeedCoils->QSource;
    7622      1302410 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Energy = state.dataVariableSpeedCoils->Winput * TimeStepSysSec;
    7623      1302410 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergyLoadTotal = state.dataVariableSpeedCoils->QLoadTotal * TimeStepSysSec;
    7624      1302410 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergySensible = state.dataVariableSpeedCoils->QSensible * TimeStepSysSec;
    7625      1302410 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergyLatent = 0.0;
    7626      1302410 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).EnergySource = state.dataVariableSpeedCoils->QSource * TimeStepSysSec;
    7627      1302410 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterConsumption =
    7628      1302410 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).CrankcaseHeaterPower * TimeStepSysSec;
    7629      1302410 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostConsumption =
    7630      1302410 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).DefrostPower * TimeStepSysSec;
    7631      1302410 :         if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).RunFrac == 0.0) {
    7632        32032 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).COP = 0.0;
    7633              :         } else {
    7634      1270378 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).COP =
    7635      1270378 :                 state.dataVariableSpeedCoils->QLoadTotal / state.dataVariableSpeedCoils->Winput;
    7636              :         }
    7637      1302410 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PartLoadRatio = PartLoadRatio;
    7638      1302410 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirMassFlowRate = state.dataVariableSpeedCoils->PLRCorrLoadSideMdot;
    7639      1302410 :         rhoair = Psychrometrics::PsyRhoAirFnPbTdbW(state,
    7640      1302410 :                                                    state.dataEnvrn->OutBaroPress,
    7641      1302410 :                                                    state.dataVariableSpeedCoils->LoadSideInletDBTemp,
    7642      1302410 :                                                    state.dataVariableSpeedCoils->LoadSideInletHumRat,
    7643              :                                                    RoutineName);
    7644      1302410 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirVolFlowRate =
    7645      1302410 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).AirMassFlowRate / rhoair;
    7646              : 
    7647      1302410 :         if (state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).VSCoilType == HVAC::Coil_HeatingAirToAirVariableSpeed) {
    7648        66958 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterMassFlowRate = 0.0;
    7649        66958 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletWaterTemp = 0.0;
    7650        66958 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletWaterEnthalpy = 0.0;
    7651              :         } else {
    7652      1235452 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).WaterMassFlowRate = state.dataVariableSpeedCoils->SourceSideMassFlowRate;
    7653      1235452 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletWaterTemp =
    7654      1235452 :                 state.dataVariableSpeedCoils->SourceSideInletTemp -
    7655      1235452 :                 state.dataVariableSpeedCoils->QSource / (state.dataVariableSpeedCoils->SourceSideMassFlowRate * CpSource);
    7656      1235452 :             state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).OutletWaterEnthalpy =
    7657      1235452 :                 state.dataVariableSpeedCoils->SourceSideInletEnth -
    7658      1235452 :                 state.dataVariableSpeedCoils->QSource / state.dataVariableSpeedCoils->SourceSideMassFlowRate;
    7659              :         }
    7660              : 
    7661      1302410 :         state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).QWasteHeat = QWasteHeat;
    7662              :     }
    7663              : 
    7664           61 :     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           61 :         if (state.dataVariableSpeedCoils->GetCoilsInputFlag) { // First time subroutine has been entered
    7688            0 :             GetVarSpeedCoilInput(state);
    7689            0 :             state.dataVariableSpeedCoils->GetCoilsInputFlag = false;
    7690              :         }
    7691              : 
    7692          104 :         if (Util::SameString(CoilType, "COIL:COOLING:WATERTOAIRHEATPUMP:VARIABLESPEEDEQUATIONFIT") ||
    7693           72 :             Util::SameString(CoilType, "COIL:HEATING:WATERTOAIRHEATPUMP:VARIABLESPEEDEQUATIONFIT") ||
    7694          140 :             Util::SameString(CoilType, "COIL:COOLING:DX:VARIABLESPEED") || Util::SameString(CoilType, "COIL:HEATING:DX:VARIABLESPEED") ||
    7695           68 :             Util::SameString(CoilType, "COIL:WATERHEATING:AIRTOWATERHEATPUMP:VARIABLESPEED")) {
    7696           61 :             WhichCoil = Util::FindItemInList(CoilName, state.dataVariableSpeedCoils->VarSpeedCoil);
    7697           61 :             if (WhichCoil != 0) {
    7698          108 :                 if (Util::SameString(CoilType, "COIL:HEATING:WATERTOAIRHEATPUMP:VARIABLESPEEDEQUATIONFIT") ||
    7699          108 :                     Util::SameString(CoilType, "COIL:HEATING:DX:VARIABLESPEED")) {
    7700           17 :                     CoilCapacity = state.dataVariableSpeedCoils->VarSpeedCoil(WhichCoil).RatedCapHeat;
    7701           44 :                 } else if (Util::SameString(CoilType, "COIL:WATERHEATING:AIRTOWATERHEATPUMP:VARIABLESPEED")) {
    7702            7 :                     CoilCapacity = state.dataVariableSpeedCoils->VarSpeedCoil(WhichCoil).RatedCapWH;
    7703              :                 } else {
    7704           37 :                     CoilCapacity = state.dataVariableSpeedCoils->VarSpeedCoil(WhichCoil).RatedCapCoolTotal;
    7705              :                 }
    7706              :             }
    7707              :         } else {
    7708            0 :             WhichCoil = 0;
    7709              :         }
    7710              : 
    7711           61 :         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           61 :         return CoilCapacity;
    7718              :     }
    7719              : 
    7720           78 :     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           78 :         if (state.dataVariableSpeedCoils->GetCoilsInputFlag) { // First time subroutine has been entered
    7740           20 :             GetVarSpeedCoilInput(state);
    7741           20 :             state.dataVariableSpeedCoils->GetCoilsInputFlag = false;
    7742              :         }
    7743              : 
    7744           78 :         IndexNum = Util::FindItemInList(CoilName, state.dataVariableSpeedCoils->VarSpeedCoil);
    7745              : 
    7746           78 :         if (IndexNum == 0) {
    7747            0 :             ShowSevereError(state, format("GetCoilIndexVariableSpeed: Could not find CoilType=\"{}\" with Name=\"{}\"", CoilType, CoilName));
    7748            0 :             ErrorsFound = true;
    7749              :         }
    7750              : 
    7751           78 :         return IndexNum;
    7752              :     }
    7753              : 
    7754           39 :     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           39 :         if (state.dataVariableSpeedCoils->GetCoilsInputFlag) { // First time subroutine has been entered
    7777            0 :             GetVarSpeedCoilInput(state);
    7778            0 :             state.dataVariableSpeedCoils->GetCoilsInputFlag = false;
    7779              :         }
    7780              : 
    7781           64 :         if (Util::SameString(CoilType, "COIL:COOLING:WATERTOAIRHEATPUMP:VARIABLESPEEDEQUATIONFIT") ||
    7782           36 :             Util::SameString(CoilType, "COIL:HEATING:WATERTOAIRHEATPUMP:VARIABLESPEEDEQUATIONFIT") ||
    7783           75 :             Util::SameString(CoilType, "COIL:COOLING:DX:VARIABLESPEED") || Util::SameString(CoilType, "COIL:HEATING:DX:VARIABLESPEED") ||
    7784           39 :             Util::SameString(CoilType, "COIL:WATERHEATING:AIRTOWATERHEATPUMP:VARIABLESPEED")) {
    7785           39 :             WhichCoil = Util::FindItemInList(CoilName, state.dataVariableSpeedCoils->VarSpeedCoil);
    7786           39 :             if (WhichCoil != 0) {
    7787           39 :                 if (state.dataVariableSpeedCoils->VarSpeedCoil(WhichCoil).RatedAirVolFlowRate == DataSizing::AutoSize) { // means autosize
    7788            5 :                     CoilAirFlowRate = state.dataVariableSpeedCoils->VarSpeedCoil(WhichCoil).RatedAirVolFlowRate;
    7789              :                 } else {
    7790           34 :                     CoilAirFlowRate = state.dataVariableSpeedCoils->VarSpeedCoil(WhichCoil).MSRatedAirVolFlowRate(
    7791           34 :                                           state.dataVariableSpeedCoils->VarSpeedCoil(WhichCoil).NumOfSpeeds) /
    7792           34 :                                       state.dataVariableSpeedCoils->VarSpeedCoil(WhichCoil).MSRatedAirVolFlowRate(
    7793           34 :                                           state.dataVariableSpeedCoils->VarSpeedCoil(WhichCoil).NormSpedLevel) *
    7794           34 :                                       state.dataVariableSpeedCoils->VarSpeedCoil(WhichCoil).RatedAirVolFlowRate;
    7795              :                 } // use largest air flow rate
    7796              :             }
    7797              :         } else {
    7798            0 :             WhichCoil = 0;
    7799              :         }
    7800              : 
    7801           39 :         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           39 :         return CoilAirFlowRate;
    7808              :     }
    7809              : 
    7810            7 :     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            7 :         if (state.dataVariableSpeedCoils->GetCoilsInputFlag) { // First time subroutine has been entered
    7833            0 :             GetVarSpeedCoilInput(state);
    7834            0 :             state.dataVariableSpeedCoils->GetCoilsInputFlag = false;
    7835              :         }
    7836              : 
    7837            7 :         WhichCoil = Util::FindItemInList(CoilName, state.dataVariableSpeedCoils->VarSpeedCoil);
    7838            7 :         if (WhichCoil != 0) {
    7839            7 :             PLRNumber = state.dataVariableSpeedCoils->VarSpeedCoil(WhichCoil).PLFFPLR;
    7840              :         }
    7841              : 
    7842            7 :         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            7 :         return PLRNumber;
    7849              :     }
    7850              : 
    7851           14 :     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           14 :         if (state.dataVariableSpeedCoils->GetCoilsInputFlag) { // First time subroutine has been entered
    7870            0 :             GetVarSpeedCoilInput(state);
    7871            0 :             state.dataVariableSpeedCoils->GetCoilsInputFlag = false;
    7872              :         }
    7873              : 
    7874           14 :         if (CoilIndex == 0) {
    7875            0 :             ShowSevereError(state, "GetVSCoilCapFTCurveIndex: Could not find Coil");
    7876            0 :             ErrorsFound = true;
    7877            0 :             CapFTIndex = 0;
    7878              :         } else {
    7879           14 :             CapFTIndex =
    7880           14 :                 state.dataVariableSpeedCoils->VarSpeedCoil(CoilIndex).MSCCapFTemp(state.dataVariableSpeedCoils->VarSpeedCoil(CoilIndex).NumOfSpeeds);
    7881              :         }
    7882              : 
    7883           14 :         return CapFTIndex;
    7884              :     }
    7885              : 
    7886         2453 :     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         2453 :         if (state.dataVariableSpeedCoils->GetCoilsInputFlag) { // First time subroutine has been entered
    7909            0 :             GetVarSpeedCoilInput(state);
    7910            0 :             state.dataVariableSpeedCoils->GetCoilsInputFlag = false;
    7911              :         }
    7912              : 
    7913         2453 :         WhichCoil = Util::FindItemInList(CoilName, state.dataVariableSpeedCoils->VarSpeedCoil);
    7914         2453 :         if (WhichCoil != 0) {
    7915         2453 :             NodeNumber = state.dataVariableSpeedCoils->VarSpeedCoil(WhichCoil).AirInletNodeNum;
    7916              :         }
    7917              : 
    7918         2453 :         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         2453 :         return NodeNumber;
    7925              :     }
    7926              : 
    7927         2451 :     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         2451 :         if (state.dataVariableSpeedCoils->GetCoilsInputFlag) { // First time subroutine has been entered
    7950            2 :             GetVarSpeedCoilInput(state);
    7951            2 :             state.dataVariableSpeedCoils->GetCoilsInputFlag = false;
    7952              :         }
    7953              : 
    7954         2451 :         WhichCoil = Util::FindItemInList(CoilName, state.dataVariableSpeedCoils->VarSpeedCoil);
    7955         2451 :         if (WhichCoil != 0) {
    7956         2451 :             NodeNumber = state.dataVariableSpeedCoils->VarSpeedCoil(WhichCoil).AirOutletNodeNum;
    7957              :         }
    7958              : 
    7959         2451 :         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         2451 :         return NodeNumber;
    7966              :     }
    7967              : 
    7968           22 :     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           22 :         if (state.dataVariableSpeedCoils->GetCoilsInputFlag) { // First time subroutine has been entered
    7990            0 :             GetVarSpeedCoilInput(state);
    7991            0 :             state.dataVariableSpeedCoils->GetCoilsInputFlag = false;
    7992              :         }
    7993              : 
    7994           22 :         WhichCoil = Util::FindItemInList(CoilName, state.dataVariableSpeedCoils->VarSpeedCoil);
    7995           22 :         if (WhichCoil != 0) {
    7996           22 :             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           22 :         return CondNode;
    8004              :     }
    8005              : 
    8006           23 :     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           23 :         if (state.dataVariableSpeedCoils->GetCoilsInputFlag) { // First time subroutine has been entered
    8013            0 :             GetVarSpeedCoilInput(state);
    8014            0 :             state.dataVariableSpeedCoils->GetCoilsInputFlag = false;
    8015              :         }
    8016              : 
    8017           23 :         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           23 :             return state.dataVariableSpeedCoils->VarSpeedCoil(CoilIndex).MinOATCompressor;
    8024              :         }
    8025              :     }
    8026              : 
    8027        20930 :     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        20930 :         if (state.dataVariableSpeedCoils->GetCoilsInputFlag) { // First time subroutine has been entered
    8046            0 :             GetVarSpeedCoilInput(state);
    8047            0 :             state.dataVariableSpeedCoils->GetCoilsInputFlag = false;
    8048              :         }
    8049              : 
    8050        20930 :         int WhichCoil = Util::FindItemInList(CoilName, state.dataVariableSpeedCoils->VarSpeedCoil);
    8051        20930 :         if (WhichCoil != 0) {
    8052        20930 :             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        20930 :         return Speeds;
    8060              :     }
    8061              : 
    8062           96 :     Real64 GetVSCoilRatedSourceTemp(EnergyPlusData &state, int const CoilIndex)
    8063              :     {
    8064           96 :         Real64 RatedSourceTemp = 0.0;
    8065           96 :         switch (state.dataVariableSpeedCoils->VarSpeedCoil(CoilIndex).VSCoilType) {
    8066           24 :         case HVAC::Coil_CoolingWaterToAirHPVSEquationFit: {
    8067           24 :             RatedSourceTemp = RatedInletWaterTemp;
    8068           24 :         } break;
    8069           21 :         case HVAC::Coil_HeatingWaterToAirHPVSEquationFit: {
    8070           21 :             RatedSourceTemp = RatedInletWaterTempHeat;
    8071           21 :         } break;
    8072           16 :         case HVAC::CoilDX_HeatPumpWaterHeaterVariableSpeed: {
    8073           16 :             RatedSourceTemp = state.dataVariableSpeedCoils->VarSpeedCoil(CoilIndex).WHRatedInletWaterTemp;
    8074           16 :         } break;
    8075           24 :         case HVAC::Coil_CoolingAirToAirVariableSpeed: {
    8076           24 :             RatedSourceTemp = RatedAmbAirTemp;
    8077           24 :         } break;
    8078           11 :         case HVAC::Coil_HeatingAirToAirVariableSpeed: {
    8079           11 :             RatedSourceTemp = RatedAmbAirTempHeat;
    8080           11 :         } break;
    8081            0 :         default: {
    8082            0 :             assert(false);
    8083              :         } break;
    8084              :         }
    8085           96 :         return RatedSourceTemp;
    8086              :     }
    8087              : 
    8088           36 :     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           36 :         if (state.dataVariableSpeedCoils->GetCoilsInputFlag) { // First time subroutine has been entered
    8106            0 :             GetVarSpeedCoilInput(state);
    8107            0 :             state.dataVariableSpeedCoils->GetCoilsInputFlag = false;
    8108              :         }
    8109              : 
    8110           36 :         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           36 :         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           36 :         if (present(CompanionHeatingCoilNum)) {
    8126           23 :             state.dataVariableSpeedCoils->VarSpeedCoil(WSHPNum).CompanionHeatingCoilNum = CompanionHeatingCoilNum;
    8127           23 :             state.dataVariableSpeedCoils->VarSpeedCoil(CompanionHeatingCoilNum).CompanionCoolingCoilNum = WSHPNum;
    8128              :         }
    8129              : 
    8130           36 :         if (present(MSHPDesignSpecIndex)) {
    8131           13 :             state.dataVariableSpeedCoils->VarSpeedCoil(WSHPNum).MSHPDesignSpecIndex = MSHPDesignSpecIndex;
    8132              :         }
    8133              :     }
    8134              : 
    8135     45014786 :     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     45014786 :         Real64 TimeStepSysSec = state.dataHVACGlobal->TimeStepSysSec;
    8149              : 
    8150     45014786 :         auto &varSpeedCoil = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum);
    8151              : 
    8152              :         // WatertoAirHP(DXCoilNum)%SimFlag=.FALSE.
    8153     45014786 :         if (!varSpeedCoil.SimFlag) {
    8154              :             // Heatpump is off; just pass through conditions
    8155     13440447 :             varSpeedCoil.Power = 0.0;
    8156     13440447 :             varSpeedCoil.QLoadTotal = 0.0;
    8157     13440447 :             varSpeedCoil.QSensible = 0.0;
    8158     13440447 :             varSpeedCoil.QLatent = 0.0;
    8159     13440447 :             varSpeedCoil.QSource = 0.0;
    8160     13440447 :             varSpeedCoil.Energy = 0.0;
    8161     13440447 :             varSpeedCoil.EnergyLoadTotal = 0.0;
    8162     13440447 :             varSpeedCoil.EnergySensible = 0.0;
    8163     13440447 :             varSpeedCoil.EnergyLatent = 0.0;
    8164     13440447 :             varSpeedCoil.EnergySource = 0.0;
    8165     13440447 :             varSpeedCoil.COP = 0.0;
    8166     13440447 :             varSpeedCoil.RunFrac = 0.0;
    8167     13440447 :             varSpeedCoil.PartLoadRatio = 0.0;
    8168              : 
    8169     13440447 :             varSpeedCoil.OutletAirDBTemp = varSpeedCoil.InletAirDBTemp;
    8170     13440447 :             varSpeedCoil.OutletAirHumRat = varSpeedCoil.InletAirHumRat;
    8171     13440447 :             varSpeedCoil.OutletAirEnthalpy = varSpeedCoil.InletAirEnthalpy;
    8172     13440447 :             varSpeedCoil.OutletWaterTemp = varSpeedCoil.InletWaterTemp;
    8173     13440447 :             varSpeedCoil.OutletWaterEnthalpy = varSpeedCoil.InletWaterEnthalpy;
    8174              :         }
    8175              : 
    8176     45014786 :         int AirInletNode = varSpeedCoil.AirInletNodeNum;
    8177     45014786 :         int WaterInletNode = varSpeedCoil.WaterInletNodeNum;
    8178     45014786 :         int AirOutletNode = varSpeedCoil.AirOutletNodeNum;
    8179     45014786 :         int WaterOutletNode = varSpeedCoil.WaterOutletNodeNum;
    8180              : 
    8181              :         // Set the air outlet  nodes of the WatertoAirHPSimple
    8182     45014786 :         state.dataLoopNodes->Node(AirOutletNode).MassFlowRate = state.dataLoopNodes->Node(AirInletNode).MassFlowRate; // LoadSideMassFlowRate
    8183     45014786 :         state.dataLoopNodes->Node(AirOutletNode).Temp = varSpeedCoil.OutletAirDBTemp;
    8184     45014786 :         state.dataLoopNodes->Node(AirOutletNode).HumRat = varSpeedCoil.OutletAirHumRat;
    8185     45014786 :         state.dataLoopNodes->Node(AirOutletNode).Enthalpy = varSpeedCoil.OutletAirEnthalpy;
    8186              : 
    8187              :         // Set the air outlet nodes for properties that just pass through & not used
    8188     45014786 :         state.dataLoopNodes->Node(AirOutletNode).Quality = state.dataLoopNodes->Node(AirInletNode).Quality;
    8189     45014786 :         state.dataLoopNodes->Node(AirOutletNode).Press = state.dataLoopNodes->Node(AirInletNode).Press;
    8190     45014786 :         state.dataLoopNodes->Node(AirOutletNode).MassFlowRateMin = state.dataLoopNodes->Node(AirInletNode).MassFlowRateMin;
    8191     45014786 :         state.dataLoopNodes->Node(AirOutletNode).MassFlowRateMax = state.dataLoopNodes->Node(AirInletNode).MassFlowRateMax; // LoadSideMassFlowRate
    8192     45014786 :         state.dataLoopNodes->Node(AirOutletNode).MassFlowRateMinAvail = state.dataLoopNodes->Node(AirInletNode).MassFlowRateMinAvail;
    8193     45014786 :         state.dataLoopNodes->Node(AirOutletNode).MassFlowRateMaxAvail =
    8194     45014786 :             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     45014786 :         if (WaterInletNode != 0 && WaterOutletNode != 0) {
    8199     10642762 :             PlantUtilities::SafeCopyPlantNode(state, WaterInletNode, WaterOutletNode);
    8200     10642762 :             state.dataLoopNodes->Node(WaterOutletNode).Temp = varSpeedCoil.OutletWaterTemp;
    8201     10642762 :             state.dataLoopNodes->Node(WaterOutletNode).Enthalpy = varSpeedCoil.OutletWaterEnthalpy;
    8202              :         }
    8203              : 
    8204     45014786 :         varSpeedCoil.Energy = varSpeedCoil.Power * TimeStepSysSec;
    8205     45014786 :         varSpeedCoil.EnergyLoadTotal = varSpeedCoil.QLoadTotal * TimeStepSysSec;
    8206     45014786 :         varSpeedCoil.EnergySensible = varSpeedCoil.QSensible * TimeStepSysSec;
    8207     45014786 :         varSpeedCoil.EnergyLatent = varSpeedCoil.QLatent * TimeStepSysSec;
    8208     45014786 :         varSpeedCoil.EnergySource = varSpeedCoil.QSource * TimeStepSysSec;
    8209              : 
    8210     45014786 :         if (state.dataContaminantBalance->Contaminant.CO2Simulation) {
    8211            0 :             state.dataLoopNodes->Node(AirOutletNode).CO2 = state.dataLoopNodes->Node(AirInletNode).CO2;
    8212              :         }
    8213              : 
    8214     45014786 :         if (state.dataContaminantBalance->Contaminant.GenericContamSimulation) {
    8215            0 :             state.dataLoopNodes->Node(AirOutletNode).GenContam = state.dataLoopNodes->Node(AirInletNode).GenContam;
    8216              :         }
    8217              : 
    8218     45014786 :         if (varSpeedCoil.reportCoilFinalSizes) {
    8219      4711037 :             if (!state.dataGlobal->WarmupFlag && !state.dataGlobal->DoingHVACSizingSimulations && !state.dataGlobal->DoingSizing) {
    8220           77 :                 if (varSpeedCoil.VSCoilType == HVAC::Coil_CoolingWaterToAirHPVSEquationFit ||
    8221           59 :                     varSpeedCoil.VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed) { // cooling coil
    8222           40 :                     state.dataRptCoilSelection->coilSelectionReportObj->setCoilFinalSizes(state,
    8223           40 :                                                                                           varSpeedCoil.Name,
    8224           40 :                                                                                           varSpeedCoil.VarSpeedCoilType,
    8225              :                                                                                           varSpeedCoil.RatedCapCoolTotal,
    8226              :                                                                                           varSpeedCoil.RatedCapCoolSens,
    8227              :                                                                                           varSpeedCoil.RatedAirVolFlowRate,
    8228              :                                                                                           varSpeedCoil.RatedWaterMassFlowRate);
    8229           37 :                 } else if (varSpeedCoil.VSCoilType == HVAC::Coil_HeatingWaterToAirHPVSEquationFit ||
    8230           19 :                            varSpeedCoil.VSCoilType == HVAC::Coil_HeatingAirToAirVariableSpeed) { // heating coil
    8231           27 :                     state.dataRptCoilSelection->coilSelectionReportObj->setCoilFinalSizes(state,
    8232           27 :                                                                                           varSpeedCoil.Name,
    8233           27 :                                                                                           varSpeedCoil.VarSpeedCoilType,
    8234              :                                                                                           varSpeedCoil.RatedCapHeat,
    8235              :                                                                                           varSpeedCoil.RatedCapHeat,
    8236              :                                                                                           varSpeedCoil.RatedAirVolFlowRate,
    8237              :                                                                                           varSpeedCoil.RatedWaterMassFlowRate);
    8238              :                 }
    8239           77 :                 varSpeedCoil.reportCoilFinalSizes = false;
    8240              :             }
    8241              :         }
    8242     45014786 :         if (varSpeedCoil.VSCoilType == HVAC::Coil_CoolingWaterToAirHPVSEquationFit ||
    8243     40492993 :             varSpeedCoil.VSCoilType == HVAC::Coil_CoolingAirToAirVariableSpeed) {
    8244              :             //  Add power to global variable so power can be summed by parent object
    8245     37952531 :             state.dataHVACGlobal->DXElecCoolingPower = varSpeedCoil.Power;
    8246      7062255 :         } else if (varSpeedCoil.VSCoilType == HVAC::Coil_HeatingWaterToAirHPVSEquationFit) {
    8247              :             //  Add power to global variable so power can be summed by parent object
    8248      4521793 :             state.dataHVACGlobal->DXElecHeatingPower = varSpeedCoil.Power;
    8249      2540462 :         } else if (varSpeedCoil.VSCoilType == HVAC::Coil_HeatingAirToAirVariableSpeed) {
    8250              :             //  Add power to global variable so power can be summed by parent object
    8251       941286 :             state.dataHVACGlobal->DXElecHeatingPower = varSpeedCoil.Power + varSpeedCoil.CrankcaseHeaterPower;
    8252       941286 :             state.dataHVACGlobal->DefrostElecPower = varSpeedCoil.DefrostPower;
    8253              :         }
    8254     45014786 :     }
    8255              : 
    8256        17082 :     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        17082 :         Real64 Twet_Rated = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Twet_Rated; // [s]
    8308        17082 :         Real64 Gamma_Rated = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).Gamma_Rated;
    8309        17082 :         Real64 MaxONOFFCyclesperHour = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).MaxONOFFCyclesperHour;           // [cycles/hr]
    8310        17082 :         Real64 LatentCapacityTimeConstant = state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).LatentCapacityTimeConstant; // [s]
    8311        17082 :         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        17082 :         if ((RTF >= 1.0) || (QLatRated == 0.0) || (QLatActual == 0.0) || (Twet_Rated <= 0.0) || (Gamma_Rated <= 0.0) ||
    8317        11521 :             (MaxONOFFCyclesperHour <= 0.0) || (LatentCapacityTimeConstant <= 0.0) || (RTF <= 0.0)) {
    8318         5561 :             SHReff = SHRss;
    8319         5561 :             return SHReff;
    8320              :         }
    8321              : 
    8322        11521 :         Twet_max = 9999.0; // high limit for Twet
    8323              : 
    8324              :         //  Calculate the model parameters at the actual operating conditions
    8325        11521 :         Twet = min(Twet_Rated * QLatRated / (QLatActual + 1.e-10), Twet_max);
    8326        11521 :         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        11521 :         Ton = 3600.0 / (4.0 * MaxONOFFCyclesperHour * (1.0 - RTF)); // duration of cooling coil on-cycle (sec)
    8330              : 
    8331        11521 :         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        11521 :             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        11521 :         if (Gamma > 0.0) {
    8343        11521 :             Toffa = min(Toff, 2.0 * Twet / Gamma);
    8344              :         } else {
    8345            0 :             Toffa = Toff;
    8346              :         }
    8347              : 
    8348              :         //  Use sucessive substitution to solve for To
    8349        11521 :         aa = (Gamma * Toffa) - (0.25 / Twet) * pow_2(Gamma) * pow_2(Toffa);
    8350              : 
    8351        11521 :         To1 = aa + LatentCapacityTimeConstant;
    8352        11521 :         Error = 1.0;
    8353        23624 :         while (Error > 0.001) {
    8354        12103 :             To2 = aa - LatentCapacityTimeConstant * (std::exp(-To1 / LatentCapacityTimeConstant) - 1.0);
    8355        12103 :             Error = std::abs((To2 - To1) / To1);
    8356        12103 :             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        11521 :         aa = std::exp(max(-700.0, -Ton / LatentCapacityTimeConstant));
    8363              :         //  Calculate latent heat ratio multiplier
    8364        11521 :         LHRmult = max(((Ton - To2) / (Ton + LatentCapacityTimeConstant * (aa - 1.0))), 0.0);
    8365              : 
    8366              :         //  Calculate part-load or "effective" sensible heat ratio
    8367        11521 :         SHReff = 1.0 - (1.0 - SHRss) * LHRmult;
    8368              : 
    8369        11521 :         if (SHReff < SHRss) {
    8370           16 :             SHReff = SHRss; // Effective SHR can be less than the steady-state SHR
    8371              :         }
    8372        11521 :         if (SHReff > 1.0) {
    8373            0 :             SHReff = 1.0; // Effective sensible heat ratio can't be greater than 1.0
    8374              :         }
    8375              : 
    8376        11521 :         return SHReff;
    8377              :     }
    8378              : 
    8379     50324329 :     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     50324329 :         constexpr int MaxIter = 30;        // Maximum number of iterations for dry evaporator calculations
    8436     50324329 :         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     50324329 :         int Counter = 0;                        // Error tolerance for dry evaporator iterations
    8448     50324329 :         Real64 RF = 0.4;                        // Relaxation factor for dry evaporator iterations
    8449     50324329 :         Real64 werror = 0.0;                    // Deviation of humidity ratio in dry evaporator iteration loop
    8450     50324329 :         Real64 SHRCalc = SHR;                   // initialize temporary calculated value of SHR
    8451     50324329 :         Real64 InletWetBulbCalc = InletWetBulb; // calculated inlet wetbulb temperature used for finding dry coil point [C]
    8452     50324329 :         Real64 InletHumRatCalc = InletHumRat;   // calculated inlet humidity ratio used for finding dry coil point [kg water / kg dry air]
    8453     50324329 :         bool LoopOn = true;                     // flag to control the loop iteration
    8454              : 
    8455              :         //  LOOP WHILE (ABS(werror) .gt. Tolerance .OR. Counter == 0)
    8456    100743469 :         while (LoopOn) {
    8457              :             //   Get capacity modifying factor (function of inlet wetbulb & condenser inlet temp) for off-rated conditions
    8458     50419140 :             Real64 TotCapTempModFac1 = Curve::CurveValue(state, CCapFTemp1, InletWetBulbCalc, CondInletTemp);
    8459              :             //   Get capacity modifying factor (function of mass flow) for off-rated conditions
    8460     50419140 :             Real64 TotCapAirFlowModFac1 = Curve::CurveValue(state, CCapAirFFlow1, AirMassFlowRatio);
    8461              :             // Get capacity modifying factor (function of mass flow) for off-rated conditions
    8462     50419140 :             if (CCapWaterFFlow1 == 0) {
    8463     46525390 :                 TotCapWaterFlowModFac1 = 1.0;
    8464              :             } else {
    8465      3893750 :                 TotCapWaterFlowModFac1 = Curve::CurveValue(state, CCapWaterFFlow1, WaterMassFlowRatio);
    8466              :             }
    8467              : 
    8468              :             //   Get total capacity
    8469     50419140 :             if (NumSpeeds < 2) { // ONLY ONE SPEED
    8470     43355849 :                 TotCapCalc = TotCapNom1 * TotCapAirFlowModFac1 * TotCapWaterFlowModFac1 * TotCapTempModFac1;
    8471     43355849 :                 TotCapCalc1 = TotCapCalc;
    8472     43355849 :                 TotCapCalc2 = 0.0;
    8473     43355849 :                 TotCapModFac = TotCapAirFlowModFac1 * TotCapWaterFlowModFac1 * TotCapTempModFac1;
    8474              :             } else {
    8475      7063291 :                 TotCapTempModFac2 = Curve::CurveValue(state, CCapFTemp2, InletWetBulbCalc, CondInletTemp);
    8476      7063291 :                 TotCapAirFlowModFac2 = Curve::CurveValue(state, CCapAirFFlow2, AirMassFlowRatio);
    8477              : 
    8478      7063291 :                 if (CCapWaterFFlow2 == 0) {
    8479      6721333 :                     TotCapWaterFlowModFac2 = 1.0;
    8480              :                 } else {
    8481       341958 :                     TotCapWaterFlowModFac2 = Curve::CurveValue(state, CCapWaterFFlow2, WaterMassFlowRatio);
    8482              :                 }
    8483              : 
    8484      7063291 :                 TotCapCalc1 = TotCapNom1 * TotCapAirFlowModFac1 * TotCapWaterFlowModFac1 * TotCapTempModFac1;
    8485      7063291 :                 TotCapCalc2 = TotCapNom2 * TotCapAirFlowModFac2 * TotCapWaterFlowModFac2 * TotCapTempModFac2;
    8486              : 
    8487      7063291 :                 TotCapCalc = TotCapCalc2 * SpeedRatio + (1.0 - SpeedRatio) * TotCapCalc1;
    8488      7063291 :                 TotCapModFac = (TotCapAirFlowModFac2 * TotCapWaterFlowModFac2 * TotCapTempModFac2) * SpeedRatio +
    8489      7063291 :                                (1.0 - SpeedRatio) * (TotCapAirFlowModFac1 * TotCapWaterFlowModFac1 * TotCapTempModFac1);
    8490              :             }
    8491              : 
    8492     50419140 :             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     50419140 :             Real64 hDelta = TotCapCalc / AirMassFlow;                                       // Change in air enthalpy across the cooling coil [J/kg]
    8496     50419140 :             Real64 hADP = InletEnthalpy - hDelta / (1.0 - localCBF);                        // Apparatus dew point enthalpy [J/kg]
    8497     50419140 :             Real64 tADP = Psychrometrics::PsyTsatFnHPb(state, hADP, Pressure, RoutineName); // Apparatus dew point temperature [C]
    8498     50419140 :             Real64 wADP = Psychrometrics::PsyWFnTdbH(state, tADP, hADP, RoutineName);       // Apparatus dew point humidity ratio [kg/kg]
    8499     50419140 :             Real64 hTinwADP = Psychrometrics::PsyHFnTdbW(InletDryBulb, wADP);               // Enthalpy at inlet dry-bulb and wADP [J/kg]
    8500     50419140 :             if (TotCapCalc > 1.0e-10) {
    8501     50419140 :                 SHRCalc = min((hTinwADP - hADP) / (InletEnthalpy - hADP), 1.0); // temporary calculated value of SHR
    8502              :             } else {
    8503            0 :                 SHRCalc = 1.0;
    8504              :             }
    8505              : 
    8506              :             //   Check for dry evaporator conditions (win < wadp)
    8507     50419140 :             if (wADP > InletHumRatCalc || (Counter >= 1 && Counter < MaxIter)) {
    8508       121166 :                 if (InletHumRatCalc == 0.0) {
    8509            0 :                     InletHumRatCalc = 0.00001;
    8510              :                 }
    8511       121166 :                 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       121166 :                 InletHumRatCalc = RF * wADP + (1.0 - RF) * InletHumRatCalc;
    8516       121166 :                 InletWetBulbCalc = Psychrometrics::PsyTwbFnTdbWPb(state, InletDryBulb, InletHumRatCalc, Pressure);
    8517       121166 :                 ++Counter;
    8518       242332 :                 if (std::abs(werror) > Tolerance) {
    8519        94811 :                     LoopOn = true; // Recalculate with modified inlet conditions
    8520              :                 } else {
    8521        26355 :                     LoopOn = false;
    8522              :                 }
    8523              :             } else {
    8524     50297974 :                 LoopOn = false;
    8525              :             }
    8526              :         } // END LOOP
    8527              : 
    8528              :         //  Calculate full load output conditions
    8529     50324329 :         if (SHRCalc > 1.0 || Counter > 0) {
    8530        26355 :             SHRCalc = 1.0; // if Counter > 0 means a dry coil so SHR = 1
    8531              :         }
    8532              : 
    8533     50324329 :         SHR = SHRCalc;
    8534     50324329 :         TotCap1 = TotCapCalc1;
    8535     50324329 :         TotCap2 = TotCapCalc2;
    8536     50324329 :         TotCapSpeed = TotCapCalc;
    8537     50324329 :         InletWetBulb = InletWetBulbCalc;
    8538     50324329 :     }
    8539              : 
    8540        20926 :     Real64 getVarSpeedPartLoadRatio(EnergyPlusData &state, int const DXCoilNum)
    8541              :     {
    8542        20926 :         return state.dataVariableSpeedCoils->VarSpeedCoil(DXCoilNum).PartLoadRatio;
    8543              :     }
    8544              : 
    8545              : } // namespace VariableSpeedCoils
    8546              : 
    8547              : } // namespace EnergyPlus
        

Generated by: LCOV version 2.0-1